17 #include "larevt/CalibrationDBI/Interface/ChannelStatusProvider.h" 18 #include "larevt/CalibrationDBI/Interface/ChannelStatusService.h" 28 #include "Api/PandoraApi.h" 29 #include "Managers/PluginManager.h" 30 #include "Plugins/LArTransformationPlugin.h" 51 mf::LogDebug(
"LArPandora") <<
" *** LArPandoraInput::CreatePandoraHits2D(...) *** " 56 <<
"CreatePandoraHits2D - primary Pandora instance does not exist ";
77 const double hit_Charge(hit->
Integral());
78 const double hit_Time(hit->
PeakTime());
84 detProp.ConvertTicksToX(hit_Time, hit_WireID.Plane, hit_WireID.TPC, hit_WireID.Cryostat));
85 const double dxpos_cm(
86 std::fabs(detProp.ConvertTicksToX(
87 hit_TimeEnd, hit_WireID.Plane, hit_WireID.TPC, hit_WireID.Cryostat) -
88 detProp.ConvertTicksToX(
89 hit_TimeStart, hit_WireID.Plane, hit_WireID.TPC, hit_WireID.Cryostat)));
93 const double y0_cm(xyz.Y());
94 const double z0_cm(xyz.Z());
97 const double wire_pitch_cm(theGeometry->
WirePitch(hit_View));
104 caloHitParameters.m_expectedDirection = pandora::CartesianVector(0., 0., 1.);
105 caloHitParameters.m_cellNormalVector = pandora::CartesianVector(0., 0., 1.);
106 caloHitParameters.m_cellSize0 = settings.
m_dx_cm;
108 caloHitParameters.m_cellThickness = wire_pitch_cm;
109 caloHitParameters.m_cellGeometry = pandora::RECTANGULAR;
110 caloHitParameters.m_time = 0.;
111 caloHitParameters.m_nCellRadiationLengths = settings.
m_dx_cm / settings.
m_rad_cm;
112 caloHitParameters.m_nCellInteractionLengths = settings.
m_dx_cm / settings.
m_int_cm;
113 caloHitParameters.m_isDigital =
false;
114 caloHitParameters.m_hitRegion = pandora::SINGLE_REGION;
115 caloHitParameters.m_layer = 0;
116 caloHitParameters.m_isInOuterSamplingLayer =
false;
117 caloHitParameters.m_inputEnergy = hit_Charge;
118 caloHitParameters.m_mipEquivalentEnergy = mips;
119 caloHitParameters.m_electromagneticEnergy = mips * settings.
m_mips_to_gev;
120 caloHitParameters.m_hadronicEnergy = mips * settings.
m_mips_to_gev;
121 caloHitParameters.m_pParentAddress = (
void*)((intptr_t)(++hitCounter));
125 driftVolumeMap, hit_WireID.Cryostat, hit_WireID.TPC);
127 if (hit_View == detType->
TargetViewW(hit_WireID.TPC, hit_WireID.Cryostat)) {
128 caloHitParameters.m_hitType = pandora::TPC_VIEW_W;
129 const double wpos_cm(
130 pPandora->GetPlugins()->GetLArTransformationPlugin()->YZtoW(y0_cm, z0_cm));
131 caloHitParameters.m_positionVector = pandora::CartesianVector(xpos_cm, 0., wpos_cm);
133 else if (hit_View == detType->
TargetViewU(hit_WireID.TPC, hit_WireID.Cryostat)) {
134 caloHitParameters.m_hitType = pandora::TPC_VIEW_U;
135 const double upos_cm(
136 pPandora->GetPlugins()->GetLArTransformationPlugin()->YZtoU(y0_cm, z0_cm));
137 caloHitParameters.m_positionVector = pandora::CartesianVector(xpos_cm, 0., upos_cm);
139 else if (hit_View == detType->
TargetViewV(hit_WireID.TPC, hit_WireID.Cryostat)) {
140 caloHitParameters.m_hitType = pandora::TPC_VIEW_V;
141 const double vpos_cm(
142 pPandora->GetPlugins()->GetLArTransformationPlugin()->YZtoV(y0_cm, z0_cm));
143 caloHitParameters.m_positionVector = pandora::CartesianVector(xpos_cm, 0., vpos_cm);
147 <<
"CreatePandoraHits2D - this wire view not recognised (View=" << hit_View <<
") ";
150 catch (
const pandora::StatusCodeException&) {
152 <<
"CreatePandoraHits2D - invalid calo hit parameter provided, all assigned values must " 153 "be finite, calo hit omitted " 161 <<
"CreatePandoraHits2D - detected an excessive number of hits (" << hitCounter <<
") ";
163 idToHitMap[hitCounter] = hit;
167 PANDORA_THROW_RESULT_IF(
168 pandora::STATUS_CODE_SUCCESS,
170 PandoraApi::CaloHit::Create(*pPandora, caloHitParameters, caloHitFactory));
172 catch (
const pandora::StatusCodeException&) {
173 mf::LogWarning(
"LArPandora") <<
"CreatePandoraHits2D - unable to create calo hit, " 174 "insufficient or invalid information supplied " 186 mf::LogDebug(
"LArPandora") <<
" *** LArPandoraInput::CreatePandoraLArTPCs(...) *** " 191 <<
"CreatePandoraDetectorGaps - primary Pandora instance does not exist ";
196 PandoraApi::Geometry::LArTPC::Parameters parameters;
199 parameters.m_larTPCVolumeId = driftVolume.GetVolumeID();
200 parameters.m_centerX = driftVolume.GetCenterX();
201 parameters.m_centerY = driftVolume.GetCenterY();
202 parameters.m_centerZ = driftVolume.GetCenterZ();
203 parameters.m_widthX = driftVolume.GetWidthX();
204 parameters.m_widthY = driftVolume.GetWidthY();
205 parameters.m_widthZ = driftVolume.GetWidthZ();
206 parameters.m_wirePitchU = driftVolume.GetWirePitchU();
207 parameters.m_wirePitchV = driftVolume.GetWirePitchV();
208 parameters.m_wirePitchW = driftVolume.GetWirePitchW();
209 parameters.m_wireAngleU = driftVolume.GetWireAngleU();
210 parameters.m_wireAngleV = driftVolume.GetWireAngleV();
211 parameters.m_wireAngleW = driftVolume.GetWireAngleW();
212 parameters.m_sigmaUVW = driftVolume.GetSigmaUVZ();
213 parameters.m_isDriftInPositiveX = driftVolume.IsPositiveDrift();
215 catch (
const pandora::StatusCodeException&) {
216 mf::LogWarning(
"LArPandora") <<
"CreatePandoraLArTPCs - invalid tpc parameter provided, " 217 "all assigned values must be finite, tpc omitted " 223 PANDORA_THROW_RESULT_IF(pandora::STATUS_CODE_SUCCESS,
225 PandoraApi::Geometry::LArTPC::Create(*pPandora, parameters));
227 catch (
const pandora::StatusCodeException&) {
228 mf::LogWarning(
"LArPandora") <<
"CreatePandoraLArTPCs - unable to create tpc, insufficient " 229 "or invalid information supplied " 246 mf::LogDebug(
"LArPandora") <<
" *** LArPandoraInput::CreatePandoraDetectorGaps(...) *** " 251 <<
"CreatePandoraDetectorGaps - primary Pandora instance does not exist ";
256 PandoraApi::Geometry::LineGap::Parameters parameters;
261 catch (
const pandora::StatusCodeException&) {
263 <<
"CreatePandoraDetectorGaps - invalid line gap parameter provided, all assigned values " 264 "must be finite, line gap omitted " 269 PANDORA_THROW_RESULT_IF(pandora::STATUS_CODE_SUCCESS,
271 PandoraApi::Geometry::LineGap::Create(*pPandora, parameters));
273 catch (
const pandora::StatusCodeException&) {
274 mf::LogWarning(
"LArPandora") <<
"CreatePandoraDetectorGaps - unable to create line gap, " 275 "insufficient or invalid information supplied " 287 mf::LogDebug(
"LArPandora") <<
" *** LArPandoraInput::CreatePandoraReadoutGaps(...) *** " 292 <<
"CreatePandoraReadoutGaps - primary Pandora instance does not exist ";
297 const lariov::ChannelStatusProvider& channelStatus(
303 const float halfWirePitch(0.5
f * theGeometry->
WirePitch(plane.View()));
304 const unsigned int nWires(theGeometry->
Nwires(plane.ID()));
306 int firstBadWire(-1), lastBadWire(-1);
308 for (
unsigned int iwire = 0; iwire < nWires; ++iwire) {
311 const bool isBadChannel(channelStatus.IsBad(channel));
312 const bool isLastWire(nWires == (iwire + 1));
314 if (isBadChannel && (firstBadWire < 0)) firstBadWire = iwire;
316 if (isBadChannel || isLastWire) lastBadWire = iwire;
318 if (isBadChannel && !isLastWire)
continue;
320 if ((firstBadWire < 0) || (lastBadWire < 0))
continue;
322 auto const firstXYZ = plane.Wire(firstBadWire).GetCenter();
323 auto const lastXYZ = plane.Wire(lastBadWire).GetCenter();
328 PandoraApi::Geometry::LineGap::Parameters parameters;
331 float xFirst(-std::numeric_limits<float>::max());
332 float xLast(std::numeric_limits<float>::max());
334 auto const [icstat, itpc] = std::make_pair(plane.ID().Cryostat, plane.ID().TPC);
335 const unsigned int volumeId(
339 if (driftVolumeMap.end() != volumeIter) {
340 xFirst = volumeIter->second.GetCenterX() - 0.5f * volumeIter->second.GetWidthX();
341 xLast = volumeIter->second.GetCenterX() + 0.5f * volumeIter->second.GetWidthX();
346 iview, itpc, icstat, firstXYZ, lastXYZ, halfWirePitch, xFirst, xLast, pPandora);
348 catch (
const pandora::StatusCodeException&) {
350 <<
"CreatePandoraReadoutGaps - invalid line gap parameter provided, all assigned " 351 "values must be finite, line gap omitted " 357 PANDORA_THROW_RESULT_IF(pandora::STATUS_CODE_SUCCESS,
359 PandoraApi::Geometry::LineGap::Create(*pPandora, parameters));
361 catch (
const pandora::StatusCodeException&) {
362 mf::LogWarning(
"LArPandora") <<
"CreatePandoraReadoutGaps - unable to create line " 363 "gap, insufficient or invalid information supplied " 379 mf::LogDebug(
"LArPandora") <<
" *** LArPandoraInput::CreatePandoraMCParticles(...) *** " 385 <<
"CreatePandoraMCParticles - primary Pandora instance does not exist ";
393 iterEnd = particleToTruthMap.end();
397 particleMap[particle->
TrackId()] = particle;
401 int neutrinoCounter(0);
406 iterEnd1 = truthToParticleMap.end();
417 <<
"CreatePandoraMCParticles - detected an excessive number of mc neutrinos (" 418 << neutrinoCounter <<
")";
420 const int neutrinoID(neutrinoCounter + 9 * settings.
m_uidOffset);
426 mcParticleParameters.
m_nuanceCode = neutrino.InteractionType();
428 mcParticleParameters.m_energy = neutrino.Nu().E();
429 mcParticleParameters.m_momentum =
430 pandora::CartesianVector(neutrino.Nu().Px(), neutrino.Nu().Py(), neutrino.Nu().Pz());
431 mcParticleParameters.m_vertex =
432 pandora::CartesianVector(neutrino.Nu().Vx(), neutrino.Nu().Vy(), neutrino.Nu().Vz());
433 mcParticleParameters.m_endpoint =
434 pandora::CartesianVector(neutrino.Nu().Vx(), neutrino.Nu().Vy(), neutrino.Nu().Vz());
435 mcParticleParameters.m_particleId = neutrino.Nu().PdgCode();
436 mcParticleParameters.m_mcParticleType = pandora::MC_3D;
437 mcParticleParameters.m_pParentAddress = (
void*)((intptr_t)neutrinoID);
439 catch (
const pandora::StatusCodeException&) {
441 <<
"CreatePandoraMCParticles - invalid mc neutrino parameter provided, all assigned " 442 "values must be finite, mc neutrino omitted " 448 PANDORA_THROW_RESULT_IF(
449 pandora::STATUS_CODE_SUCCESS,
451 PandoraApi::MCParticle::Create(*pPandora, mcParticleParameters, mcParticleFactory));
453 catch (
const pandora::StatusCodeException&) {
454 mf::LogWarning(
"LArPandora") <<
"CreatePandoraMCParticles - unable to create mc " 455 "neutrino, insufficient or invalid information supplied " 464 iterEnd2 = particleVector.end();
468 const int trackID(particle->
TrackId());
471 if (particle->
Mother() == 0) {
473 PANDORA_THROW_RESULT_IF(
474 pandora::STATUS_CODE_SUCCESS,
476 PandoraApi::SetMCParentDaughterRelationship(
477 *pPandora, (
void*)((intptr_t)neutrinoID), (
void*)((intptr_t)trackID)));
479 catch (
const pandora::StatusCodeException&) {
480 mf::LogWarning(
"LArPandora") <<
"CreatePandoraMCParticles - unable to create mc " 481 "particle relationship, invalid information supplied " 490 mf::LogDebug(
"LArPandora") <<
" Number of Pandora neutrinos: " << neutrinoCounter
494 int particleCounter(0);
497 std::map<const simb::MCParticle, bool> primaryGeneratorMCParticleMap;
505 if (particle->
TrackId() != iterI->first)
506 throw cet::exception(
"LArPandora") <<
"CreatePandoraMCParticles - mc truth information " 507 "appears to be scrambled in this event";
511 <<
"CreatePandoraMCParticles - detected an excessive number of MC particles (" 517 int firstT(-1), lastT(-1);
520 if (firstT < 0 && lastT < 0) {
526 const float vtxX(particle->
Vx(firstT));
527 const float vtxY(particle->
Vy(firstT));
528 const float vtxZ(particle->
Vz(firstT));
530 const float endX(particle->
Vx(lastT));
531 const float endY(particle->
Vy(lastT));
532 const float endZ(particle->
Vz(lastT));
534 const float pX(particle->
Px(firstT));
535 const float pY(particle->
Py(firstT));
536 const float pZ(particle->
Pz(firstT));
537 const float E(particle->
E(firstT));
541 const int trackID(particle->
TrackId());
561 if (processMap.find(particle->
Process()) != processMap.end()) {
567 <<
"CreatePandoraMCParticles - found an unknown process" << std::endl;
569 mcParticleParameters.m_energy =
E;
570 mcParticleParameters.m_particleId = particle->
PdgCode();
571 mcParticleParameters.m_momentum = pandora::CartesianVector(pX, pY, pZ);
572 mcParticleParameters.m_vertex = pandora::CartesianVector(vtxX, vtxY, vtxZ);
573 mcParticleParameters.m_endpoint = pandora::CartesianVector(endX, endY, endZ);
574 mcParticleParameters.m_mcParticleType = pandora::MC_3D;
575 mcParticleParameters.m_pParentAddress = (
void*)((intptr_t)particle->
TrackId());
577 catch (
const pandora::StatusCodeException&) {
579 <<
"CreatePandoraMCParticles - invalid mc particle parameter provided, all assigned " 580 "values must be finite, mc particle omitted " 586 PANDORA_THROW_RESULT_IF(
587 pandora::STATUS_CODE_SUCCESS,
589 PandoraApi::MCParticle::Create(*pPandora, mcParticleParameters, mcParticleFactory));
591 catch (
const pandora::StatusCodeException&) {
592 mf::LogWarning(
"LArPandora") <<
"CreatePandoraMCParticles - unable to create mc particle, " 593 "insufficient or invalid information supplied " 599 const int id_mother(particle->
Mother());
602 if (iterJ != particleMap.end()) {
604 PANDORA_THROW_RESULT_IF(
605 pandora::STATUS_CODE_SUCCESS,
607 PandoraApi::SetMCParentDaughterRelationship(
608 *pPandora, (
void*)((intptr_t)id_mother), (
void*)((intptr_t)particle->
TrackId())));
610 catch (
const pandora::StatusCodeException&) {
611 mf::LogWarning(
"LArPandora") <<
"CreatePandoraMCParticles - Unable to create mc particle " 612 "relationship, invalid information supplied " 619 mf::LogDebug(
"LArPandora") <<
"Number of mc particles: " << particleCounter << std::endl;
626 std::map<const simb::MCParticle, bool>& primaryMCParticleMap)
629 if (
"primary" == mcParticle.Process()) {
630 primaryMCParticleMap.emplace(std::make_pair(mcParticle,
false));
639 std::map<const simb::MCParticle, bool>& primaryMCParticleMap)
641 for (
auto& mcParticleIter : primaryMCParticleMap) {
642 if (!mcParticleIter.second) {
645 if (std::fabs(primaryMCParticle.
Px() - mcParticle->
Px()) <
646 std::numeric_limits<double>::epsilon() &&
647 std::fabs(primaryMCParticle.
Py() - mcParticle->
Py()) <
648 std::numeric_limits<double>::epsilon() &&
649 std::fabs(primaryMCParticle.
Pz() - mcParticle->
Pz()) <
650 std::numeric_limits<double>::epsilon()) {
651 mcParticleIter.second =
true;
665 mf::LogDebug(
"LArPandora") <<
" *** LArPandoraInput::CreatePandoraMCLinks(...) *** " 670 <<
"CreatePandoraMCLinks2D - primary Pandora instance does not exist ";
677 const int hitID(iterI->first);
684 if (hitToParticleMap.end() == iterJ)
continue;
688 if (trackCollection.size() == 0)
690 <<
"CreatePandoraMCLinks2D - found a hit without any associated MC truth information ";
693 for (
unsigned int k = 0; k < trackCollection.size(); ++k) {
695 const int trackID(
std::abs(trackIDE.trackID));
696 const float energyFrac(trackIDE.energyFrac);
699 PANDORA_THROW_RESULT_IF(
700 pandora::STATUS_CODE_SUCCESS,
702 PandoraApi::SetCaloHitToMCParticleRelationship(
703 *pPandora, (
void*)((intptr_t)hitID), (
void*)((intptr_t)trackID), energyFrac));
705 catch (
const pandora::StatusCodeException&) {
706 mf::LogWarning(
"LArPandora") <<
"CreatePandoraMCLinks2D - unable to create calo hit to " 707 "mc particle relationship, invalid information supplied " 727 int thisfirstT(-1), thislastT(-1);
730 if (thisfirstT < 0)
continue;
732 if (firstT < 0 || thisfirstT < firstT) firstT = thisfirstT;
734 if (lastT < 0 || thislastT > lastT) lastT = thislastT;
747 bool foundStartPosition(
false);
750 for (
int nt = 0; nt < numTrajectoryPoints; ++nt) {
756 if (tpcID != ref_tpcid)
continue;
760 if (!foundStartPosition) {
762 foundStartPosition =
true;
775 auto const det_prop =
781 const float vtxT(particle->
T(nt));
782 const float vtxTDC(clock_data.TPCG4Time2Tick(vtxT));
787 return (driftDir * (vtxTDC - vtxTDC0) * det_prop.GetXTicksCoefficient());
794 const double hit_Charge,
800 const double dQdX(hit_Charge / (theGeometry->
WirePitch(hit_View)));
801 const double dQdX_e(dQdX /
875 : m_pPrimaryPandora(nullptr)
876 , m_useHitWidths(true)
877 , m_useBirksCorrection(false)
878 , m_useActiveBoundingBox(false)
879 , m_uidOffset(100000000)
880 , m_hitCounterOffset(0)
886 , m_mips_if_negative(0.)
887 , m_mips_to_gev(3.5
e-4)
888 , m_recombination_factor(0.63)
double E(const int i=0) const
simb::MCTruth TrackIdToMCTruth(int const id) const
details::range_type< T > Iterate() const
Initializes the specified ID with the ID of the first cryostat.
std::map< int, art::Ptr< recob::Hit > > IdToHitMap
unsigned int NumberTrajectoryPoints() const
Interface class for LArPandora producer modules, which reconstruct recob::PFParticles from recob::Hit...
Point_t const & GetCenter() const
Returns the world coordinate of the center of the wire [cm].
const simb::MCNeutrino & GetNeutrino() const
double Py(const int i=0) const
enum geo::_plane_proj View_t
Enumerate the possible plane projections.
std::map< unsigned int, LArDriftVolume > LArDriftVolumeMap
Header file for the lar calo hit class.
virtual geo::View_t TargetViewW(const geo::TPCID::TPCID_t tpc, const geo::CryostatID::CryostatID_t cstat) const =0
Map a LArSoft view to Pandora's W view.
Declaration of signal hit object.
std::map< art::Ptr< simb::MCParticle >, art::Ptr< simb::MCTruth > > MCParticlesToMCTruth
simb::Origin_t Origin() const
Empty interface to map pandora to specifics in the LArSoft geometry.
bool isValid
Whether this ID points to a valid element.
Geometry information for a single TPC.
enum simb::_ev_origin Origin_t
event origin types
double Px(const int i=0) const
constexpr auto abs(T v)
Returns the absolute value of the argument.
std::vector< LArDriftVolume > LArDriftVolumeList
static unsigned int GetVolumeID(const LArDriftVolumeMap &driftVolumeMap, const unsigned int cstat, const unsigned int tpc)
Get drift volume ID from a specified cryostat/tpc pair.
float Integral() const
Integral under the calibrated signal waveform of the hit, in tick x ADC units.
geo::View_t View() const
View for the plane of the hit.
pandora::InputUInt m_larTPCVolumeId
The lar tpc volume id.
geo::WireID const & WireID() const
Initial tdc tick for hit.
virtual geo::View_t TargetViewV(const geo::TPCID::TPCID_t tpc, const geo::CryostatID::CryostatID_t cstat) const =0
Map a LArSoft view to Pandora's V view.
Drift towards negative X values.
WireGeo const & Wire(WireID const &wireid) const
Returns the specified wire.
std::string Process() const
pandora::InputInt m_process
The process creating the particle.
TPCGeo const & TPC(TPCID const &tpcid=tpc_zero) const
Returns the specified TPC.
std::map< int, art::Ptr< simb::MCParticle > > MCParticleMap
std::map< art::Ptr< recob::Hit >, TrackIDEVector > HitsToTrackIDEs
virtual geo::View_t TargetViewU(const geo::TPCID::TPCID_t tpc, const geo::CryostatID::CryostatID_t cstat) const =0
Map a LArSoft view to Pandora's U view.
static unsigned int GetDaughterVolumeID(const LArDriftVolumeMap &driftVolumeMap, const unsigned int cstat, const unsigned int tpc)
Get daughter volume ID from a specified cryostat/tpc pair.
constexpr double kGeVToElectrons
23.6eV per ion pair, 1e9 eV/GeV
TPCID FindTPCAtPosition(Point_t const &point) const
Returns the ID of the TPC at specified location.
std::vector< simb::MCParticle > RawMCParticleVector
pandora::InputUInt m_daughterVolumeId
The daughter volume id.
virtual PandoraApi::Geometry::LineGap::Parameters CreateLineGapParametersFromDetectorGaps(const LArDetectorGap &gap) const =0
Create the line gap parameters to give to the pandora API.
std::map< art::Ptr< simb::MCTruth >, MCParticleVector > MCTruthToMCParticles
single particles thrown at the detector
Geometry information for a single wire plane.The plane is represented in the geometry by a solid whic...
double T(const int i=0) const
std::vector< art::Ptr< simb::MCParticle > > MCParticleVector
std::vector< sim::TrackIDE > TrackIDEVector
double ElectronsToADC() const
The data type to uniquely identify a TPC.
DriftDirection_t DriftDirection() const
Returns an enumerator value describing the drift direction.
float PeakTimeMinusRMS(float sigmas=+1.) const
Returns a time sigmas RMS away from the peak time.
LArMCParticleFactory responsible for object creation.
Detector simulation of raw signals on wires.
LAr mc particle parameters.
double Vx(const int i=0) const
ROOT::Math::PositionVector3D< ROOT::Math::Cartesian3D< double >, ROOT::Math::GlobalCoordinateSystemTag > Point_t
Type for representation of position in physical 3D space.
raw::ChannelID_t PlaneWireToChannel(WireID const &wireid) const
Returns the ID of the TPC channel connected to the specified wire.
float PeakTime() const
Time of the signal peak, in tick units.
std::vector< art::Ptr< recob::Hit > > HitVector
LArPandoraDetectorType * GetDetectorType()
Factory class that returns the correct detector type interface.
Encapsulate the construction of a single detector plane.
std::vector< LArDetectorGap > LArDetectorGapList
MaybeLogger_< ELseverityLevel::ELsev_success, false > LogDebug
double BirksCorrection(double dQdX) const
dQ/dX in electrons/cm, returns dE/dX in MeV/cm.
pandora::InputInt m_nuanceCode
The nuance code.
MaybeLogger_< ELseverityLevel::ELsev_warning, false > LogWarning
double Pz(const int i=0) const
unsigned int Nwires(PlaneID const &planeid) const
Returns the total number of wires in the specified plane.
double Vz(const int i=0) const
int trigger_offset(DetectorClocksData const &data)
LArCaloHitFactory responsible for object creation.
drift volume class to hold properties of drift volume
float PeakTimePlusRMS(float sigmas=+1.) const
Returns a time sigmas RMS away from the peak time.
unsigned int ChannelID_t
Type representing the ID of a readout channel.
Collection of Physical constants used in LArSoft.
Event generator information.
Helper functions for extracting detector geometry for use in reconsruction.
Ionization energy from a Geant4 track.
Length_t WirePitch(PlaneID const &planeid=plane_zero) const
Returns the distance between two consecutive wires.
TPCID PositionToTPCID(Point_t const &point) const
Returns the ID of the TPC at specified location.
double Vy(const int i=0) const
art framework interface to geometry description
constexpr Point origin()
Returns a origin position with a point of the specified type.
cet::coded_exception< error, detail::translate > exception
drift volume class to hold properties of drift volume
Encapsulate the construction of a single detector plane.
virtual PandoraApi::Geometry::LineGap::Parameters CreateLineGapParametersFromReadoutGaps(const geo::View_t view, const geo::TPCID::TPCID_t tpc, const geo::CryostatID::CryostatID_t cstat, const geo::Point_t &firstXYZ, const geo::Point_t &lastXYZ, const float halfWirePitch, const float xFirst, const float xLast, const pandora::Pandora *pPandora) const =0
Create the line gap parameters to give to the pandora API.