15 #include "larevt/CalibrationDBI/Interface/ChannelStatusService.h" 16 #include "larevt/CalibrationDBI/Interface/ChannelStatusProvider.h" 26 #include "Api/PandoraApi.h" 27 #include "Managers/PluginManager.h" 28 #include "Plugins/LArTransformationPlugin.h" 43 mf::LogDebug(
"LArPandora") <<
" *** LArPandoraInput::CreatePandoraHits2D(...) *** " << std::endl;
46 throw cet::exception(
"LArPandora") <<
"CreatePandoraHits2D - primary Pandora instance does not exist ";
51 auto const* theDetector = lar::providerFrom<detinfo::DetectorPropertiesService>();
65 const double hit_Charge(hit->
Integral());
66 const double hit_Time(hit->
PeakTime());
71 const double xpos_cm(theDetector->ConvertTicksToX(hit_Time, hit_WireID.Plane, hit_WireID.TPC, hit_WireID.Cryostat));
72 const double dxpos_cm(std::fabs(theDetector->ConvertTicksToX(hit_TimeEnd, hit_WireID.Plane, hit_WireID.TPC, hit_WireID.Cryostat) -
73 theDetector->ConvertTicksToX(hit_TimeStart, hit_WireID.Plane, hit_WireID.TPC, hit_WireID.Cryostat)));
78 const double y0_cm(xyz[1]);
79 const double z0_cm(xyz[2]);
82 const double wire_pitch_cm(theGeometry->
WirePitch(hit_View));
90 caloHitParameters.m_expectedDirection = pandora::CartesianVector(0., 0., 1.);
91 caloHitParameters.m_cellNormalVector = pandora::CartesianVector(0., 0., 1.);
92 caloHitParameters.m_cellSize0 = settings.
m_dx_cm;
94 caloHitParameters.m_cellThickness = wire_pitch_cm;
95 caloHitParameters.m_cellGeometry = pandora::RECTANGULAR;
96 caloHitParameters.m_time = 0.;
97 caloHitParameters.m_nCellRadiationLengths = settings.
m_dx_cm / settings.
m_rad_cm;
98 caloHitParameters.m_nCellInteractionLengths = settings.
m_dx_cm / settings.
m_int_cm;
99 caloHitParameters.m_isDigital =
false;
100 caloHitParameters.m_hitRegion = pandora::SINGLE_REGION;
101 caloHitParameters.m_layer = 0;
102 caloHitParameters.m_isInOuterSamplingLayer =
false;
103 caloHitParameters.m_inputEnergy = hit_Charge;
104 caloHitParameters.m_mipEquivalentEnergy = mips;
105 caloHitParameters.m_electromagneticEnergy = mips * settings.
m_mips_to_gev;
106 caloHitParameters.m_hadronicEnergy = mips * settings.
m_mips_to_gev;
107 caloHitParameters.m_pParentAddress = (
void*)((intptr_t)(++hitCounter));
114 caloHitParameters.m_hitType = pandora::TPC_VIEW_W;
115 const double wpos_cm(pPandora->GetPlugins()->GetLArTransformationPlugin()->YZtoW(y0_cm, z0_cm));
116 caloHitParameters.m_positionVector = pandora::CartesianVector(xpos_cm, 0., wpos_cm);
118 else if(pandora_View ==
geo::kU)
120 caloHitParameters.m_hitType = pandora::TPC_VIEW_U;
121 const double upos_cm(pPandora->GetPlugins()->GetLArTransformationPlugin()->YZtoU(y0_cm, z0_cm));
122 caloHitParameters.m_positionVector = pandora::CartesianVector(xpos_cm, 0., upos_cm);
124 else if(pandora_View ==
geo::kV)
126 caloHitParameters.m_hitType = pandora::TPC_VIEW_V;
127 const double vpos_cm(pPandora->GetPlugins()->GetLArTransformationPlugin()->YZtoV(y0_cm, z0_cm));
128 caloHitParameters.m_positionVector = pandora::CartesianVector(xpos_cm, 0., vpos_cm);
132 throw cet::exception(
"LArPandora") <<
"CreatePandoraHits2D - this wire view not recognised (View=" << hit_View <<
") ";
135 catch (
const pandora::StatusCodeException &)
137 mf::LogWarning(
"LArPandora") <<
"CreatePandoraHits2D - invalid calo hit parameter provided, all assigned values must be finite, calo hit omitted " << std::endl;
143 throw cet::exception(
"LArPandora") <<
"CreatePandoraHits2D - detected an excessive number of hits (" << hitCounter <<
") ";
145 idToHitMap[hitCounter] = hit;
150 PANDORA_THROW_RESULT_IF(pandora::STATUS_CODE_SUCCESS, !=, PandoraApi::CaloHit::Create(*pPandora, caloHitParameters, caloHitFactory));
152 catch (
const pandora::StatusCodeException &)
154 mf::LogWarning(
"LArPandora") <<
"CreatePandoraHits2D - unable to create calo hit, insufficient or invalid information supplied " << std::endl;
164 mf::LogDebug(
"LArPandora") <<
" *** LArPandoraInput::CreatePandoraLArTPCs(...) *** " << std::endl;
167 throw cet::exception(
"LArPandora") <<
"CreatePandoraDetectorGaps - primary Pandora instance does not exist ";
173 PandoraApi::Geometry::LArTPC::Parameters parameters;
177 parameters.m_larTPCVolumeId = driftVolume.GetVolumeID();
178 parameters.m_centerX = driftVolume.GetCenterX();
179 parameters.m_centerY = driftVolume.GetCenterY();
180 parameters.m_centerZ = driftVolume.GetCenterZ();
181 parameters.m_widthX = driftVolume.GetWidthX();
182 parameters.m_widthY = driftVolume.GetWidthY();
183 parameters.m_widthZ = driftVolume.GetWidthZ();
184 parameters.m_wirePitchU = driftVolume.GetWirePitchU();
185 parameters.m_wirePitchV = driftVolume.GetWirePitchV();
186 parameters.m_wirePitchW = driftVolume.GetWirePitchW();
187 parameters.m_wireAngleU = driftVolume.GetWireAngleU();
188 parameters.m_wireAngleV = driftVolume.GetWireAngleV();
189 parameters.m_wireAngleW = driftVolume.GetWireAngleW();
190 parameters.m_sigmaUVW = driftVolume.GetSigmaUVZ();
191 parameters.m_isDriftInPositiveX = driftVolume.IsPositiveDrift();
193 catch (
const pandora::StatusCodeException &)
195 mf::LogWarning(
"LArPandora") <<
"CreatePandoraLArTPCs - invalid tpc parameter provided, all assigned values must be finite, tpc omitted " << std::endl;
201 PANDORA_THROW_RESULT_IF(pandora::STATUS_CODE_SUCCESS, !=, PandoraApi::Geometry::LArTPC::Create(*pPandora, parameters));
203 catch (
const pandora::StatusCodeException &)
205 mf::LogWarning(
"LArPandora") <<
"CreatePandoraLArTPCs - unable to create tpc, insufficient or invalid information supplied " << std::endl;
215 mf::LogDebug(
"LArPandora") <<
" *** LArPandoraInput::CreatePandoraDetectorGaps(...) *** " << std::endl;
218 throw cet::exception(
"LArPandora") <<
"CreatePandoraDetectorGaps - primary Pandora instance does not exist ";
224 PandoraApi::Geometry::LineGap::Parameters parameters;
228 parameters.m_lineGapType = pandora::TPC_DRIFT_GAP;
229 parameters.m_lineStartX = gap.GetX1();
230 parameters.m_lineEndX = gap.GetX2();
234 catch (
const pandora::StatusCodeException &)
236 mf::LogWarning(
"LArPandora") <<
"CreatePandoraDetectorGaps - invalid line gap parameter provided, all assigned values must be finite, line gap omitted " << std::endl;
242 PANDORA_THROW_RESULT_IF(pandora::STATUS_CODE_SUCCESS, !=, PandoraApi::Geometry::LineGap::Create(*pPandora, parameters));
244 catch (
const pandora::StatusCodeException &)
246 mf::LogWarning(
"LArPandora") <<
"CreatePandoraDetectorGaps - unable to create line gap, insufficient or invalid information supplied " << std::endl;
256 mf::LogDebug(
"LArPandora") <<
" *** LArPandoraInput::CreatePandoraReadoutGaps(...) *** " << std::endl;
259 throw cet::exception(
"LArPandora") <<
"CreatePandoraReadoutGaps - primary Pandora instance does not exist ";
266 for (
unsigned int icstat = 0; icstat < theGeometry->
Ncryostats(); ++icstat)
268 for (
unsigned int itpc = 0; itpc < theGeometry->
NTPC(icstat); ++itpc)
272 for (
unsigned int iplane = 0; iplane < TPC.Nplanes(); ++iplane)
275 const float halfWirePitch(0.5
f * theGeometry->
WirePitch(plane.View()));
276 const unsigned int nWires(theGeometry->
Nwires(
geo::PlaneID(icstat, itpc, plane.View())));
278 int firstBadWire(-1), lastBadWire(-1);
280 for (
unsigned int iwire = 0; iwire < nWires; ++iwire)
283 const bool isBadChannel(channelStatus.IsBad(channel));
284 const bool isLastWire(nWires == (iwire + 1));
286 if (isBadChannel && (firstBadWire < 0))
287 firstBadWire = iwire;
289 if (isBadChannel || isLastWire)
292 if (isBadChannel && !isLastWire)
295 if ((firstBadWire < 0) || (lastBadWire < 0))
298 double firstXYZ[3], lastXYZ[3];
302 firstBadWire = -1; lastBadWire = -1;
304 PandoraApi::Geometry::LineGap::Parameters parameters;
314 if (driftVolumeMap.end() != volumeIter)
316 parameters.m_lineStartX = volumeIter->second.GetCenterX() - 0.5f * volumeIter->second.GetWidthX();
317 parameters.m_lineEndX = volumeIter->second.GetCenterX() + 0.5f * volumeIter->second.GetWidthX();
325 const float firstW(firstXYZ[2]);
326 const float lastW(lastXYZ[2]);
328 parameters.m_lineGapType = pandora::TPC_WIRE_GAP_VIEW_W;
329 parameters.m_lineStartZ =
std::min(firstW, lastW) - halfWirePitch;
330 parameters.m_lineEndZ =
std::max(firstW, lastW) + halfWirePitch;
332 else if (pandoraView ==
geo::kU)
334 const float firstU(pPandora->GetPlugins()->GetLArTransformationPlugin()->YZtoU(firstXYZ[1], firstXYZ[2]));
335 const float lastU(pPandora->GetPlugins()->GetLArTransformationPlugin()->YZtoU(lastXYZ[1], lastXYZ[2]));
337 parameters.m_lineGapType = pandora::TPC_WIRE_GAP_VIEW_U;
338 parameters.m_lineStartZ =
std::min(firstU, lastU) - halfWirePitch;
339 parameters.m_lineEndZ =
std::max(firstU, lastU) + halfWirePitch;
341 else if (pandoraView ==
geo::kV)
343 const float firstV(pPandora->GetPlugins()->GetLArTransformationPlugin()->YZtoV(firstXYZ[1], firstXYZ[2]));
344 const float lastV(pPandora->GetPlugins()->GetLArTransformationPlugin()->YZtoV(lastXYZ[1], lastXYZ[2]));
346 parameters.m_lineGapType = pandora::TPC_WIRE_GAP_VIEW_V;
347 parameters.m_lineStartZ =
std::min(firstV, lastV) - halfWirePitch;
348 parameters.m_lineEndZ =
std::max(firstV, lastV) + halfWirePitch;
351 catch (
const pandora::StatusCodeException &)
353 mf::LogWarning(
"LArPandora") <<
"CreatePandoraReadoutGaps - invalid line gap parameter provided, all assigned values must be finite, line gap omitted " << std::endl;
359 PANDORA_THROW_RESULT_IF(pandora::STATUS_CODE_SUCCESS, !=, PandoraApi::Geometry::LineGap::Create(*pPandora, parameters));
361 catch (
const pandora::StatusCodeException &)
363 mf::LogWarning(
"LArPandora") <<
"CreatePandoraReadoutGaps - unable to create line gap, insufficient or invalid information supplied " << std::endl;
377 mf::LogDebug(
"LArPandora") <<
" *** LArPandoraInput::CreatePandoraMCParticles(...) *** " << std::endl;
381 throw cet::exception(
"LArPandora") <<
"CreatePandoraMCParticles - primary Pandora instance does not exist ";
391 particleMap[particle->
TrackId()] = particle;
395 int neutrinoCounter(0);
409 throw cet::exception(
"LArPandora") <<
"CreatePandoraMCParticles - detected an excessive number of mc neutrinos (" << neutrinoCounter <<
")";
411 const int neutrinoID(neutrinoCounter + 9 * settings.
m_uidOffset);
418 mcParticleParameters.
m_nuanceCode = neutrino.InteractionType();
419 mcParticleParameters.m_energy = neutrino.Nu().E();
420 mcParticleParameters.m_momentum = pandora::CartesianVector(neutrino.Nu().Px(), neutrino.Nu().Py(), neutrino.Nu().Pz());
421 mcParticleParameters.m_vertex = pandora::CartesianVector(neutrino.Nu().Vx(), neutrino.Nu().Vy(), neutrino.Nu().Vz());
422 mcParticleParameters.m_endpoint = pandora::CartesianVector(neutrino.Nu().Vx(), neutrino.Nu().Vy(), neutrino.Nu().Vz());
423 mcParticleParameters.m_particleId = neutrino.Nu().PdgCode();
424 mcParticleParameters.m_mcParticleType = pandora::MC_3D;
425 mcParticleParameters.m_pParentAddress = (
void*)((intptr_t)neutrinoID);
427 catch (
const pandora::StatusCodeException &)
429 mf::LogWarning(
"LArPandora") <<
"CreatePandoraMCParticles - invalid mc neutrino parameter provided, all assigned values must be finite, mc neutrino omitted " << std::endl;
435 PANDORA_THROW_RESULT_IF(pandora::STATUS_CODE_SUCCESS, !=, PandoraApi::MCParticle::Create(*pPandora, mcParticleParameters, mcParticleFactory));
437 catch (
const pandora::StatusCodeException &)
439 mf::LogWarning(
"LArPandora") <<
"CreatePandoraMCParticles - unable to create mc neutrino, insufficient or invalid information supplied " << std::endl;
449 const int trackID(particle->
TrackId());
452 if (particle->
Mother() == 0)
456 PANDORA_THROW_RESULT_IF(pandora::STATUS_CODE_SUCCESS, !=, PandoraApi::SetMCParentDaughterRelationship(*pPandora,
457 (
void*)((intptr_t)neutrinoID), (
void*)((intptr_t)trackID)));
459 catch (
const pandora::StatusCodeException &)
461 mf::LogWarning(
"LArPandora") <<
"CreatePandoraMCParticles - unable to create mc particle relationship, invalid information supplied " << std::endl;
469 mf::LogDebug(
"LArPandora") <<
" Number of Pandora neutrinos: " << neutrinoCounter << std::endl;
472 int particleCounter(0);
475 std::map<const simb::MCParticle, bool> primaryGeneratorMCParticleMap;
482 if (particle->
TrackId() != iterI->first)
483 throw cet::exception(
"LArPandora") <<
"CreatePandoraMCParticles - mc truth information appears to be scrambled in this event";
486 throw cet::exception(
"LArPandora") <<
"CreatePandoraMCParticles - detected an excessive number of MC particles (" << particle->
TrackId() <<
")";
491 int firstT(-1), lastT(-1);
494 if (firstT < 0 && lastT < 0)
496 firstT = 0; lastT = 0;
500 const float vtxX(particle->
Vx(firstT));
501 const float vtxY(particle->
Vy(firstT));
502 const float vtxZ(particle->
Vz(firstT));
504 const float endX(particle->
Vx(lastT));
505 const float endY(particle->
Vy(lastT));
506 const float endZ(particle->
Vz(lastT));
508 const float pX(particle->
Px(firstT));
509 const float pY(particle->
Py(firstT));
510 const float pZ(particle->
Pz(firstT));
511 const float E(particle->
E(firstT));
515 const int trackID(particle->
TrackId());
537 mcParticleParameters.m_energy =
E;
538 mcParticleParameters.m_particleId = particle->
PdgCode();
539 mcParticleParameters.m_momentum = pandora::CartesianVector(pX, pY, pZ);
540 mcParticleParameters.m_vertex = pandora::CartesianVector(vtxX, vtxY, vtxZ);
541 mcParticleParameters.m_endpoint = pandora::CartesianVector(endX, endY, endZ);
542 mcParticleParameters.m_mcParticleType = pandora::MC_3D;
543 mcParticleParameters.m_pParentAddress = (
void*)((intptr_t)particle->
TrackId());
545 catch (
const pandora::StatusCodeException &)
547 mf::LogWarning(
"LArPandora") <<
"CreatePandoraMCParticles - invalid mc particle parameter provided, all assigned values must be finite, mc particle omitted " << std::endl;
553 PANDORA_THROW_RESULT_IF(pandora::STATUS_CODE_SUCCESS, !=, PandoraApi::MCParticle::Create(*pPandora, mcParticleParameters, mcParticleFactory));
555 catch (
const pandora::StatusCodeException &)
557 mf::LogWarning(
"LArPandora") <<
"CreatePandoraMCParticles - unable to create mc particle, insufficient or invalid information supplied " << std::endl;
562 const int id_mother(particle->
Mother());
565 if (iterJ != particleMap.end())
569 PANDORA_THROW_RESULT_IF(pandora::STATUS_CODE_SUCCESS, !=, PandoraApi::SetMCParentDaughterRelationship(*pPandora,
570 (
void*)((intptr_t)id_mother), (
void*)((intptr_t)particle->
TrackId())));
572 catch (
const pandora::StatusCodeException &)
574 mf::LogWarning(
"LArPandora") <<
"CreatePandoraMCParticles - Unable to create mc particle relationship, invalid information supplied " << std::endl;
580 mf::LogDebug(
"LArPandora") <<
"Number of mc particles: " << particleCounter << std::endl;
589 if (
"primary" == mcParticle.Process())
591 primaryMCParticleMap.emplace(std::make_pair(mcParticle,
false));
600 for (
auto &mcParticleIter : primaryMCParticleMap)
602 if (!mcParticleIter.second)
606 if (std::fabs(primaryMCParticle.
Px() - mcParticle->
Px()) < std::numeric_limits<double>::epsilon() &&
607 std::fabs(primaryMCParticle.
Py() - mcParticle->
Py()) < std::numeric_limits<double>::epsilon() &&
608 std::fabs(primaryMCParticle.
Pz() - mcParticle->
Pz()) < std::numeric_limits<double>::epsilon())
610 mcParticleIter.second =
true;
622 mf::LogDebug(
"LArPandora") <<
" *** LArPandoraInput::CreatePandoraMCLinks(...) *** " << std::endl;
625 throw cet::exception(
"LArPandora") <<
"CreatePandoraMCLinks2D - primary Pandora instance does not exist ";
631 const int hitID(iterI->first);
638 if (hitToParticleMap.end() == iterJ)
643 if (trackCollection.size() == 0)
644 throw cet::exception(
"LArPandora") <<
"CreatePandoraMCLinks2D - found a hit without any associated MC truth information ";
647 for (
unsigned int k = 0; k < trackCollection.size(); ++k)
650 const int trackID(std::abs(trackIDE.trackID));
651 const float energyFrac(trackIDE.energyFrac);
655 PANDORA_THROW_RESULT_IF(pandora::STATUS_CODE_SUCCESS, !=, PandoraApi::SetCaloHitToMCParticleRelationship(*pPandora,
656 (
void*)((intptr_t)hitID), (
void*)((intptr_t)trackID), energyFrac));
658 catch (
const pandora::StatusCodeException &)
660 mf::LogWarning(
"LArPandora") <<
"CreatePandoraMCLinks2D - unable to create calo hit to mc particle relationship, invalid information supplied " << std::endl;
672 firstT = -1; lastT = -1;
674 for (
unsigned int icstat = 0; icstat < theGeometry->
Ncryostats(); ++icstat)
676 for (
unsigned int itpc = 0; itpc < theGeometry->
NTPC(icstat); ++itpc)
678 int thisfirstT(-1), thislastT(-1);
684 if (firstT < 0 || thisfirstT < firstT)
687 if (lastT < 0 || thislastT > lastT)
696 int &startT,
int &endT)
700 bool foundStartPosition(
false);
703 for (
int nt = 0; nt < numTrajectoryPoints; ++nt)
705 const double pos[3] = {particle->
Vx(nt), particle->
Vy(nt), particle->
Vz(nt)};
711 if (!(cstat == tpcID.
Cryostat && tpc == tpcID.
TPC))
716 if (!foundStartPosition)
719 foundStartPosition =
true;
729 auto const* theTime = lar::providerFrom<detinfo::DetectorClocksService>();
730 auto const* theDetector = lar::providerFrom<detinfo::DetectorPropertiesService>();
732 unsigned int which_tpc(0);
733 unsigned int which_cstat(0);
734 double pos[3] = {particle->
Vx(nt), particle->
Vy(nt), particle->
Vz(nt)};
737 const float vtxT(particle->
T(nt));
738 const float vtxTDC(theTime->TPCG4Time2Tick(vtxT));
739 const float vtxTDC0(theDetector->TriggerOffset());
742 const float driftDir((theTpc.DriftDirection() ==
geo::kNegX) ? +1.0 :-1.0);
743 return (driftDir * (vtxTDC - vtxTDC0) * theDetector->GetXTicksCoefficient());
751 auto const* theDetector = lar::providerFrom<detinfo::DetectorPropertiesService>();
754 const double dQdX(hit_Charge / (theGeometry->
WirePitch(hit_View)));
772 m_pPrimaryPandora(nullptr),
773 m_useHitWidths(true),
774 m_useBirksCorrection(false),
775 m_uidOffset(100000000),
781 m_mips_if_negative(0.),
782 m_mips_to_gev(3.5
e-4),
783 m_recombination_factor(0.63)
double E(const int i=0) const
unsigned int NumberTrajectoryPoints() const
std::vector< sim::TrackIDE > TrackIDEVector
static geo::View_t GetGlobalView(const unsigned int cstat, const unsigned int tpc, const geo::View_t hit_View)
Convert to global coordinate system.
Interface class for LArPandora producer modules, which reconstruct recob::PFParticles from recob::Hit...
std::map< art::Ptr< recob::Hit >, TrackIDEVector > HitsToTrackIDEs
const simb::MCNeutrino & GetNeutrino() const
double Py(const int i=0) const
std::vector< LArDetectorGap > LArDetectorGapList
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
Initial tdc tick for hit.
std::map< art::Ptr< simb::MCTruth >, MCParticleVector > MCTruthToMCParticles
Declaration of signal hit object.
simb::Origin_t Origin() const
The data type to uniquely identify a Plane.
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.
std::map< int, art::Ptr< simb::MCParticle > > MCParticleMap
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.
Drift towards negative X values.
unsigned int Ncryostats() const
Returns the number of cryostats in the detector.
std::vector< art::Ptr< simb::MCParticle > > MCParticleVector
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.
std::map< art::Ptr< simb::MCParticle >, art::Ptr< simb::MCTruth > > MCParticlesToMCTruth
geo::TPCGeo const & PositionToTPC(geo::Point_t const &point) const
Returns the TPC at specified location.
geo::TPCID FindTPCAtPosition(double const worldLoc[3]) const
Returns the ID of the TPC at specified location.
simb::MCTruth TrackIdToMCTruth(int const &id)
constexpr double kGeVToElectrons
23.6eV per ion pair, 1e9 eV/GeV
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
CryostatGeo const & Cryostat(geo::CryostatID const &cryoid) const
Returns the specified cryostat.
The data type to uniquely identify a TPC.
Header file for the lar mc particle class.
float PeakTimeMinusRMS(float sigmas=+1.) const
Returns a time sigmas RMS away from the peak time.
std::vector< art::Ptr< recob::Hit > > HitVector
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.
std::vector< simb::MCParticle > RawMCParticleVector
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.
Encapsulate the construction of a single detector plane.
const TPCGeo & TPC(unsigned int itpc) const
Return the itpc'th TPC in the cryostat.
MaybeLogger_< ELseverityLevel::ELsev_success, false > LogDebug
pandora::InputInt m_nuanceCode
The nuance code.
MaybeLogger_< ELseverityLevel::ELsev_warning, false > LogWarning
double Pz(const int i=0) const
double Vz(const int i=0) const
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
Planes which measure W (third view for Bo, MicroBooNE, etc).
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.
Event generator information.
Ionization energy from a Geant4 track.
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.