26 #include "Api/PandoraApi.h" 27 #include "Managers/PluginManager.h" 28 #include "Plugins/LArTransformationPlugin.h" 49 mf::LogDebug(
"LArPandora") <<
" *** LArPandoraInput::CreatePandoraHits2D(...) *** " 54 <<
"CreatePandoraHits2D - primary Pandora instance does not exist ";
75 const double hit_Charge(hit->
Integral());
76 const double hit_Time(hit->
PeakTime());
82 detProp.ConvertTicksToX(hit_Time, hit_WireID.Plane, hit_WireID.TPC, hit_WireID.Cryostat));
83 const double dxpos_cm(
84 std::fabs(detProp.ConvertTicksToX(
85 hit_TimeEnd, hit_WireID.Plane, hit_WireID.TPC, hit_WireID.Cryostat) -
86 detProp.ConvertTicksToX(
87 hit_TimeStart, hit_WireID.Plane, hit_WireID.TPC, hit_WireID.Cryostat)));
91 theGeometry->
Cryostat(hit_WireID.Cryostat)
93 .
Plane(hit_WireID.Plane)
94 .
Wire(hit_WireID.Wire)
96 const double y0_cm(xyz[1]);
97 const double z0_cm(xyz[2]);
100 const double wire_pitch_cm(theGeometry->
WirePitch(hit_View));
107 caloHitParameters.m_expectedDirection = pandora::CartesianVector(0., 0., 1.);
108 caloHitParameters.m_cellNormalVector = pandora::CartesianVector(0., 0., 1.);
109 caloHitParameters.m_cellSize0 = settings.
m_dx_cm;
111 caloHitParameters.m_cellThickness = wire_pitch_cm;
112 caloHitParameters.m_cellGeometry = pandora::RECTANGULAR;
113 caloHitParameters.m_time = 0.;
114 caloHitParameters.m_nCellRadiationLengths = settings.
m_dx_cm / settings.
m_rad_cm;
115 caloHitParameters.m_nCellInteractionLengths = settings.
m_dx_cm / settings.
m_int_cm;
116 caloHitParameters.m_isDigital =
false;
117 caloHitParameters.m_hitRegion = pandora::SINGLE_REGION;
118 caloHitParameters.m_layer = 0;
119 caloHitParameters.m_isInOuterSamplingLayer =
false;
120 caloHitParameters.m_inputEnergy = hit_Charge;
121 caloHitParameters.m_mipEquivalentEnergy = mips;
122 caloHitParameters.m_electromagneticEnergy = mips * settings.
m_mips_to_gev;
123 caloHitParameters.m_hadronicEnergy = mips * settings.
m_mips_to_gev;
124 caloHitParameters.m_pParentAddress = (
void*)((intptr_t)(++hitCounter));
128 driftVolumeMap, hit_WireID.Cryostat, hit_WireID.TPC);
130 if (hit_View == detType->
TargetViewW(hit_WireID.TPC, hit_WireID.Cryostat)) {
131 caloHitParameters.m_hitType = pandora::TPC_VIEW_W;
132 const double wpos_cm(
133 pPandora->GetPlugins()->GetLArTransformationPlugin()->YZtoW(y0_cm, z0_cm));
134 caloHitParameters.m_positionVector = pandora::CartesianVector(xpos_cm, 0., wpos_cm);
136 else if (hit_View == detType->
TargetViewU(hit_WireID.TPC, hit_WireID.Cryostat)) {
137 caloHitParameters.m_hitType = pandora::TPC_VIEW_U;
138 const double upos_cm(
139 pPandora->GetPlugins()->GetLArTransformationPlugin()->YZtoU(y0_cm, z0_cm));
140 caloHitParameters.m_positionVector = pandora::CartesianVector(xpos_cm, 0., upos_cm);
142 else if (hit_View == detType->
TargetViewV(hit_WireID.TPC, hit_WireID.Cryostat)) {
143 caloHitParameters.m_hitType = pandora::TPC_VIEW_V;
144 const double vpos_cm(
145 pPandora->GetPlugins()->GetLArTransformationPlugin()->YZtoV(y0_cm, z0_cm));
146 caloHitParameters.m_positionVector = pandora::CartesianVector(xpos_cm, 0., vpos_cm);
150 <<
"CreatePandoraHits2D - this wire view not recognised (View=" << hit_View <<
") ";
153 catch (
const pandora::StatusCodeException&) {
155 <<
"CreatePandoraHits2D - invalid calo hit parameter provided, all assigned values must " 156 "be finite, calo hit omitted " 164 <<
"CreatePandoraHits2D - detected an excessive number of hits (" << hitCounter <<
") ";
166 idToHitMap[hitCounter] =
hit;
170 PANDORA_THROW_RESULT_IF(
171 pandora::STATUS_CODE_SUCCESS,
173 PandoraApi::CaloHit::Create(*pPandora, caloHitParameters, caloHitFactory));
175 catch (
const pandora::StatusCodeException&) {
176 mf::LogWarning(
"LArPandora") <<
"CreatePandoraHits2D - unable to create calo hit, " 177 "insufficient or invalid information supplied " 190 mf::LogDebug(
"LArPandora") <<
" *** LArPandoraInput::CreatePandoraLArTPCs(...) *** " 195 <<
"CreatePandoraDetectorGaps - primary Pandora instance does not exist ";
200 PandoraApi::Geometry::LArTPC::Parameters parameters;
203 parameters.m_larTPCVolumeId = driftVolume.GetVolumeID();
204 parameters.m_centerX = driftVolume.GetCenterX();
205 parameters.m_centerY = driftVolume.GetCenterY();
206 parameters.m_centerZ = driftVolume.GetCenterZ();
207 parameters.m_widthX = driftVolume.GetWidthX();
208 parameters.m_widthY = driftVolume.GetWidthY();
209 parameters.m_widthZ = driftVolume.GetWidthZ();
210 parameters.m_wirePitchU = driftVolume.GetWirePitchU();
211 parameters.m_wirePitchV = driftVolume.GetWirePitchV();
212 parameters.m_wirePitchW = driftVolume.GetWirePitchW();
213 parameters.m_wireAngleU = driftVolume.GetWireAngleU();
214 parameters.m_wireAngleV = driftVolume.GetWireAngleV();
215 parameters.m_wireAngleW = driftVolume.GetWireAngleW();
216 parameters.m_sigmaUVW = driftVolume.GetSigmaUVZ();
217 parameters.m_isDriftInPositiveX = driftVolume.IsPositiveDrift();
219 catch (
const pandora::StatusCodeException&) {
220 mf::LogWarning(
"LArPandora") <<
"CreatePandoraLArTPCs - invalid tpc parameter provided, " 221 "all assigned values must be finite, tpc omitted " 227 PANDORA_THROW_RESULT_IF(pandora::STATUS_CODE_SUCCESS,
229 PandoraApi::Geometry::LArTPC::Create(*pPandora, parameters));
231 catch (
const pandora::StatusCodeException&) {
232 mf::LogWarning(
"LArPandora") <<
"CreatePandoraLArTPCs - unable to create tpc, insufficient " 233 "or invalid information supplied " 251 mf::LogDebug(
"LArPandora") <<
" *** LArPandoraInput::CreatePandoraDetectorGaps(...) *** " 256 <<
"CreatePandoraDetectorGaps - primary Pandora instance does not exist ";
261 PandoraApi::Geometry::LineGap::Parameters parameters;
266 catch (
const pandora::StatusCodeException&) {
268 <<
"CreatePandoraDetectorGaps - invalid line gap parameter provided, all assigned values " 269 "must be finite, line gap omitted " 274 PANDORA_THROW_RESULT_IF(pandora::STATUS_CODE_SUCCESS,
276 PandoraApi::Geometry::LineGap::Create(*pPandora, parameters));
278 catch (
const pandora::StatusCodeException&) {
279 mf::LogWarning(
"LArPandora") <<
"CreatePandoraDetectorGaps - unable to create line gap, " 280 "insufficient or invalid information supplied " 293 mf::LogDebug(
"LArPandora") <<
" *** LArPandoraInput::CreatePandoraReadoutGaps(...) *** " 298 <<
"CreatePandoraReadoutGaps - primary Pandora instance does not exist ";
308 for (
unsigned int icstat = 0; icstat < theGeometry->
Ncryostats(); ++icstat) {
309 for (
unsigned int itpc = 0; itpc < theGeometry->
NTPC(icstat); ++itpc) {
312 for (
unsigned int iplane = 0; iplane <
TPC.Nplanes(); ++iplane) {
314 const float halfWirePitch(0.5
f * theGeometry->
WirePitch(plane.View()));
315 const unsigned int nWires(theGeometry->
Nwires(plane.ID()));
317 int firstBadWire(-1), lastBadWire(-1);
319 for (
unsigned int iwire = 0; iwire < nWires; ++iwire) {
323 const bool isLastWire(nWires == (iwire + 1));
325 if (isBadChannel && (firstBadWire < 0)) firstBadWire = iwire;
327 if (isBadChannel || isLastWire) lastBadWire = iwire;
329 if (isBadChannel && !isLastWire)
continue;
331 if ((firstBadWire < 0) || (lastBadWire < 0))
continue;
333 double firstXYZ[3], lastXYZ[3];
348 PandoraApi::Geometry::LineGap::Parameters parameters;
354 const unsigned int volumeId(
358 if (driftVolumeMap.end() != volumeIter) {
359 xFirst = volumeIter->second.GetCenterX() - 0.5f * volumeIter->second.GetWidthX();
360 xLast = volumeIter->second.GetCenterX() + 0.5f * volumeIter->second.GetWidthX();
365 iview, itpc, icstat, firstXYZ, lastXYZ, halfWirePitch, xFirst, xLast, pPandora);
367 catch (
const pandora::StatusCodeException&) {
369 <<
"CreatePandoraReadoutGaps - invalid line gap parameter provided, all assigned " 370 "values must be finite, line gap omitted " 376 PANDORA_THROW_RESULT_IF(pandora::STATUS_CODE_SUCCESS,
378 PandoraApi::Geometry::LineGap::Create(*pPandora, parameters));
380 catch (
const pandora::StatusCodeException&) {
381 mf::LogWarning(
"LArPandora") <<
"CreatePandoraReadoutGaps - unable to create line " 382 "gap, insufficient or invalid information supplied " 400 mf::LogDebug(
"LArPandora") <<
" *** LArPandoraInput::CreatePandoraMCParticles(...) *** " 406 <<
"CreatePandoraMCParticles - primary Pandora instance does not exist ";
414 iterEnd = particleToTruthMap.end();
418 particleMap[particle->
TrackId()] = particle;
422 int neutrinoCounter(0);
427 iterEnd1 = truthToParticleMap.end();
438 <<
"CreatePandoraMCParticles - detected an excessive number of mc neutrinos (" 439 << neutrinoCounter <<
")";
441 const int neutrinoID(neutrinoCounter + 9 * settings.
m_uidOffset);
447 mcParticleParameters.
m_nuanceCode = neutrino.InteractionType();
449 mcParticleParameters.m_energy = neutrino.Nu().E();
450 mcParticleParameters.m_momentum =
451 pandora::CartesianVector(neutrino.Nu().Px(), neutrino.Nu().Py(), neutrino.Nu().Pz());
452 mcParticleParameters.m_vertex =
453 pandora::CartesianVector(neutrino.Nu().Vx(), neutrino.Nu().Vy(), neutrino.Nu().Vz());
454 mcParticleParameters.m_endpoint =
455 pandora::CartesianVector(neutrino.Nu().Vx(), neutrino.Nu().Vy(), neutrino.Nu().Vz());
456 mcParticleParameters.m_particleId = neutrino.Nu().PdgCode();
457 mcParticleParameters.m_mcParticleType = pandora::MC_3D;
458 mcParticleParameters.m_pParentAddress = (
void*)((intptr_t)neutrinoID);
460 catch (
const pandora::StatusCodeException&) {
462 <<
"CreatePandoraMCParticles - invalid mc neutrino parameter provided, all assigned " 463 "values must be finite, mc neutrino omitted " 469 PANDORA_THROW_RESULT_IF(
470 pandora::STATUS_CODE_SUCCESS,
472 PandoraApi::MCParticle::Create(*pPandora, mcParticleParameters, mcParticleFactory));
474 catch (
const pandora::StatusCodeException&) {
475 mf::LogWarning(
"LArPandora") <<
"CreatePandoraMCParticles - unable to create mc " 476 "neutrino, insufficient or invalid information supplied " 485 iterEnd2 = particleVector.end();
489 const int trackID(particle->
TrackId());
492 if (particle->
Mother() == 0) {
494 PANDORA_THROW_RESULT_IF(
495 pandora::STATUS_CODE_SUCCESS,
497 PandoraApi::SetMCParentDaughterRelationship(
498 *pPandora, (
void*)((intptr_t)neutrinoID), (
void*)((intptr_t)trackID)));
500 catch (
const pandora::StatusCodeException&) {
501 mf::LogWarning(
"LArPandora") <<
"CreatePandoraMCParticles - unable to create mc " 502 "particle relationship, invalid information supplied " 511 mf::LogDebug(
"LArPandora") <<
" Number of Pandora neutrinos: " << neutrinoCounter
515 int particleCounter(0);
518 std::map<const simb::MCParticle, bool> primaryGeneratorMCParticleMap;
526 if (particle->
TrackId() != iterI->first)
527 throw cet::exception(
"LArPandora") <<
"CreatePandoraMCParticles - mc truth information " 528 "appears to be scrambled in this event";
532 <<
"CreatePandoraMCParticles - detected an excessive number of MC particles (" 538 int firstT(-1), lastT(-1);
541 if (firstT < 0 && lastT < 0) {
547 const float vtxX(particle->
Vx(firstT));
548 const float vtxY(particle->
Vy(firstT));
549 const float vtxZ(particle->
Vz(firstT));
551 const float endX(particle->
Vx(lastT));
552 const float endY(particle->
Vy(lastT));
553 const float endZ(particle->
Vz(lastT));
555 const float pX(particle->
Px(firstT));
556 const float pY(particle->
Py(firstT));
557 const float pZ(particle->
Pz(firstT));
558 const float E(particle->
E(firstT));
562 const int trackID(particle->
TrackId());
582 if (processMap.find(particle->
Process()) != processMap.end()) {
588 <<
"CreatePandoraMCParticles - found an unknown process" <<
std::endl;
590 mcParticleParameters.m_energy =
E;
591 mcParticleParameters.m_particleId = particle->
PdgCode();
592 mcParticleParameters.m_momentum = pandora::CartesianVector(pX, pY, pZ);
593 mcParticleParameters.m_vertex = pandora::CartesianVector(vtxX, vtxY, vtxZ);
594 mcParticleParameters.m_endpoint = pandora::CartesianVector(endX, endY, endZ);
595 mcParticleParameters.m_mcParticleType = pandora::MC_3D;
596 mcParticleParameters.m_pParentAddress = (
void*)((intptr_t)particle->
TrackId());
598 catch (
const pandora::StatusCodeException&) {
600 <<
"CreatePandoraMCParticles - invalid mc particle parameter provided, all assigned " 601 "values must be finite, mc particle omitted " 607 PANDORA_THROW_RESULT_IF(
608 pandora::STATUS_CODE_SUCCESS,
610 PandoraApi::MCParticle::Create(*pPandora, mcParticleParameters, mcParticleFactory));
612 catch (
const pandora::StatusCodeException&) {
613 mf::LogWarning(
"LArPandora") <<
"CreatePandoraMCParticles - unable to create mc particle, " 614 "insufficient or invalid information supplied " 620 const int id_mother(particle->
Mother());
623 if (iterJ != particleMap.end()) {
625 PANDORA_THROW_RESULT_IF(
626 pandora::STATUS_CODE_SUCCESS,
628 PandoraApi::SetMCParentDaughterRelationship(
629 *pPandora, (
void*)((intptr_t)id_mother), (
void*)((intptr_t)particle->
TrackId())));
631 catch (
const pandora::StatusCodeException&) {
632 mf::LogWarning(
"LArPandora") <<
"CreatePandoraMCParticles - Unable to create mc particle " 633 "relationship, invalid information supplied " 648 std::map<const simb::MCParticle, bool>& primaryMCParticleMap)
651 if (
"primary" == mcParticle.Process()) {
652 primaryMCParticleMap.emplace(std::make_pair(mcParticle,
false));
661 std::map<const simb::MCParticle, bool>& primaryMCParticleMap)
663 for (
auto& mcParticleIter : primaryMCParticleMap) {
664 if (!mcParticleIter.second) {
667 if (std::fabs(primaryMCParticle.
Px() - mcParticle->
Px()) <
668 std::numeric_limits<double>::epsilon() &&
669 std::fabs(primaryMCParticle.
Py() - mcParticle->
Py()) <
670 std::numeric_limits<double>::epsilon() &&
671 std::fabs(primaryMCParticle.
Pz() - mcParticle->
Pz()) <
672 std::numeric_limits<double>::epsilon()) {
673 mcParticleIter.second =
true;
688 mf::LogDebug(
"LArPandora") <<
" *** LArPandoraInput::CreatePandoraMCLinks(...) *** " 693 <<
"CreatePandoraMCLinks2D - primary Pandora instance does not exist ";
700 const int hitID(iterI->first);
707 if (hitToParticleMap.end() == iterJ)
continue;
711 if (trackCollection.size() == 0)
713 <<
"CreatePandoraMCLinks2D - found a hit without any associated MC truth information ";
716 for (
unsigned int k = 0;
k < trackCollection.size(); ++
k) {
718 const int trackID(
std::abs(trackIDE.trackID));
719 const float energyFrac(trackIDE.energyFrac);
722 PANDORA_THROW_RESULT_IF(
723 pandora::STATUS_CODE_SUCCESS,
725 PandoraApi::SetCaloHitToMCParticleRelationship(
726 *pPandora, (
void*)((intptr_t)hitID), (
void*)((intptr_t)trackID), energyFrac));
728 catch (
const pandora::StatusCodeException&) {
729 mf::LogWarning(
"LArPandora") <<
"CreatePandoraMCLinks2D - unable to create calo hit to " 730 "mc particle relationship, invalid information supplied " 750 for (
unsigned int icstat = 0; icstat < theGeometry->
Ncryostats(); ++icstat) {
751 for (
unsigned int itpc = 0; itpc < theGeometry->
NTPC(icstat); ++itpc) {
752 int thisfirstT(-1), thislastT(-1);
755 if (thisfirstT < 0)
continue;
757 if (firstT < 0 || thisfirstT < firstT) firstT = thisfirstT;
759 if (lastT < 0 || thislastT > lastT) lastT = thislastT;
768 const unsigned int tpc,
775 bool foundStartPosition(
false);
778 for (
int nt = 0; nt < numTrajectoryPoints; ++nt) {
779 const double pos[3] = {particle->
Vx(nt), particle->
Vy(nt), particle->
Vz(nt)};
784 if (!(cstat == tpcID.
Cryostat && tpc == tpcID.
TPC))
continue;
788 if (!foundStartPosition) {
790 foundStartPosition =
true;
804 auto const det_prop =
807 unsigned int which_tpc(0);
808 unsigned int which_cstat(0);
809 double pos[3] = {particle->
Vx(nt), particle->
Vy(nt), particle->
Vz(nt)};
812 const float vtxT(particle->
T(nt));
813 const float vtxTDC(clock_data.TPCG4Time2Tick(vtxT));
818 return (driftDir * (vtxTDC - vtxTDC0) * det_prop.GetXTicksCoefficient());
826 const double hit_Charge,
832 const double dQdX(hit_Charge / (theGeometry->
WirePitch(hit_View)));
833 const double dQdX_e(dQdX /
908 : m_pPrimaryPandora(nullptr)
909 , m_useHitWidths(true)
910 , m_useBirksCorrection(false)
911 , m_useActiveBoundingBox(false)
912 , m_uidOffset(100000000)
913 , m_hitCounterOffset(0)
919 , m_mips_if_negative(0.)
920 , m_mips_to_gev(3.5
e-4)
921 , m_recombination_factor(0.63)
double E(const int i=0) const
virtual bool IsBad(raw::ChannelID_t channel) const =0
Returns whether the specified channel is bad in the current run.
simb::MCTruth TrackIdToMCTruth(int const id) const
unsigned int NumberTrajectoryPoints() const
Interface class for LArPandora producer modules, which reconstruct recob::PFParticles from recob::Hit...
const simb::MCNeutrino & GetNeutrino() const
double Py(const int i=0) const
WireGeo const & Wire(unsigned int iwire) 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.
geo::WireID WireID() const
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.
std::map< art::Ptr< simb::MCParticle >, art::Ptr< simb::MCTruth > > MCParticlesToMCTruth
virtual PandoraApi::Geometry::LineGap::Parameters CreateLineGapParametersFromReadoutGaps(const geo::View_t view, const geo::TPCID::TPCID_t tpc, const geo::CryostatID::CryostatID_t cstat, const double firstXYZ[3], const double lastXYZ[3], 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.
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
std::vector< LArDriftVolume > LArDriftVolumeList
CryostatID_t Cryostat
Index of cryostat.
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.
std::map< int, art::Ptr< recob::Hit > > IdToHitMap
pandora::InputUInt m_larTPCVolumeId
The lar tpc volume id.
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.
std::unordered_map< std::string, int > processMap
Drift towards negative X values.
unsigned int Ncryostats() const
Returns the number of cryostats in the detector.
std::string Process() const
pandora::InputInt m_process
The process creating the particle.
geo::Length_t WirePitch(geo::PlaneID const &planeid) const
Returns the distance between two consecutive wires.
unsigned int Nwires(unsigned int p, unsigned int tpc=0, unsigned int cstat=0) const
Returns the total number of wires in the specified plane.
double dEdX(double KE, const simb::MCParticle *part)
art framework interface to geometry description
geo::TPCGeo const & PositionToTPC(geo::Point_t const &point) const
Returns the TPC at specified location.
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.
geo::TPCID FindTPCAtPosition(double const worldLoc[3]) const
Returns the ID of the TPC at specified location.
constexpr double kGeVToElectrons
23.6eV per ion pair, 1e9 eV/GeV
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
CryostatGeo const & Cryostat(geo::CryostatID const &cryoid) const
Returns the specified cryostat.
double ElectronsToADC() const
Class providing information about the quality of channels.
static int max(int a, int b)
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
LArMCParticleFactory responsible for object creation.
Detector simulation of raw signals on wires.
unsigned int NTPC(unsigned int cstat=0) const
Returns the total number of TPCs in the specified cryostat.
LAr mc particle parameters.
double Vx(const int i=0) const
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
Declaration of signal hit object.
LArPandoraDetectorType * GetDetectorType()
Factory class that returns the correct detector type interface.
Encapsulate the construction of a single detector plane.
const TPCGeo & TPC(unsigned int itpc) const
Return the itpc'th TPC in the cryostat.
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
Interface for experiment-specific channel quality info provider.
double Vz(const int i=0) const
int trigger_offset(DetectorClocksData const &data)
LArCaloHitFactory responsible for object creation.
TPCGeo const & TPC(unsigned int const tpc=0, unsigned int const cstat=0) const
Returns the specified TPC.
drift volume class to hold properties of drift volume
PlaneGeo const & Plane(geo::View_t view) const
Return the plane in the tpc with View_t view.
void GetCenter(double *xyz, double localz=0.0) const
Fills the world coordinate of a point on the wire.
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.
TPCID_t TPC
Index of the TPC within its cryostat.
Interface for experiment-specific service for channel quality info.
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.
double Vy(const int i=0) const
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
QTextStream & endl(QTextStream &s)
Encapsulate the construction of a single detector plane.