18 #include "larevt/CalibrationDBI/Interface/ChannelStatusProvider.h" 19 #include "larevt/CalibrationDBI/Interface/ChannelStatusService.h" 29 #include "Api/PandoraApi.h" 30 #include "Managers/PluginManager.h" 31 #include "Plugins/LArTransformationPlugin.h" 52 mf::LogDebug(
"LArPandora") <<
" *** LArPandoraInput::CreatePandoraHits2D(...) *** " 57 <<
"CreatePandoraHits2D - primary Pandora instance does not exist ";
70 for (
auto const&
hit : hitVector) {
75 const double hit_Charge(
hit->Integral());
76 const double hit_Time(
hit->PeakTime());
77 const double hit_TimeStart(
hit->PeakTimeMinusRMS());
78 const double hit_TimeEnd(
hit->PeakTimePlusRMS());
81 const double xpos_cm(detProp.ConvertTicksToX(hit_Time, hit_WireID.parentID()));
82 const double dxpos_cm(
83 std::fabs(detProp.ConvertTicksToX(hit_TimeEnd, hit_WireID.parentID()) -
84 detProp.ConvertTicksToX(hit_TimeStart, hit_WireID.parentID())));
87 auto const xyz = wireReadoutGeom.Wire(hit_WireID).GetCenter();
88 const double y0_cm(xyz.Y());
89 const double z0_cm(xyz.Z());
92 const double wire_pitch_cm(wireReadoutGeom.Plane({0, 0}, hit_View).WirePitch());
99 caloHitParameters.m_expectedDirection = pandora::CartesianVector(0., 0., 1.);
100 caloHitParameters.m_cellNormalVector = pandora::CartesianVector(0., 0., 1.);
101 caloHitParameters.m_cellSize0 = settings.
m_dx_cm;
103 caloHitParameters.m_cellThickness = wire_pitch_cm;
104 caloHitParameters.m_cellGeometry = pandora::RECTANGULAR;
105 caloHitParameters.m_time = 0.;
106 caloHitParameters.m_nCellRadiationLengths = settings.
m_dx_cm / settings.
m_rad_cm;
107 caloHitParameters.m_nCellInteractionLengths = settings.
m_dx_cm / settings.
m_int_cm;
108 caloHitParameters.m_isDigital =
false;
109 caloHitParameters.m_hitRegion = pandora::SINGLE_REGION;
110 caloHitParameters.m_layer = 0;
111 caloHitParameters.m_isInOuterSamplingLayer =
false;
112 caloHitParameters.m_inputEnergy = hit_Charge;
113 caloHitParameters.m_mipEquivalentEnergy = mips;
114 caloHitParameters.m_electromagneticEnergy = mips * settings.
m_mips_to_gev;
115 caloHitParameters.m_hadronicEnergy = mips * settings.
m_mips_to_gev;
116 caloHitParameters.m_pParentAddress = (
void*)((intptr_t)(++hitCounter));
120 driftVolumeMap, hit_WireID.Cryostat, hit_WireID.TPC);
122 if (hit_View == detType->
TargetViewW(hit_WireID.TPC, hit_WireID.Cryostat)) {
123 caloHitParameters.m_hitType = pandora::TPC_VIEW_W;
124 const double wpos_cm(
125 pPandora->GetPlugins()->GetLArTransformationPlugin()->YZtoW(y0_cm, z0_cm));
126 caloHitParameters.m_positionVector = pandora::CartesianVector(xpos_cm, 0., wpos_cm);
128 else if (hit_View == detType->
TargetViewU(hit_WireID.TPC, hit_WireID.Cryostat)) {
129 caloHitParameters.m_hitType = pandora::TPC_VIEW_U;
130 const double upos_cm(
131 pPandora->GetPlugins()->GetLArTransformationPlugin()->YZtoU(y0_cm, z0_cm));
132 caloHitParameters.m_positionVector = pandora::CartesianVector(xpos_cm, 0., upos_cm);
134 else if (hit_View == detType->
TargetViewV(hit_WireID.TPC, hit_WireID.Cryostat)) {
135 caloHitParameters.m_hitType = pandora::TPC_VIEW_V;
136 const double vpos_cm(
137 pPandora->GetPlugins()->GetLArTransformationPlugin()->YZtoV(y0_cm, z0_cm));
138 caloHitParameters.m_positionVector = pandora::CartesianVector(xpos_cm, 0., vpos_cm);
142 <<
"CreatePandoraHits2D - this wire view not recognised (View=" << hit_View <<
") ";
145 catch (
const pandora::StatusCodeException&) {
147 <<
"CreatePandoraHits2D - invalid calo hit parameter provided, all assigned values must " 148 "be finite, calo hit omitted " 156 <<
"CreatePandoraHits2D - detected an excessive number of hits (" << hitCounter <<
") ";
158 idToHitMap[hitCounter] =
hit;
162 PANDORA_THROW_RESULT_IF(
163 pandora::STATUS_CODE_SUCCESS,
165 PandoraApi::CaloHit::Create(*pPandora, caloHitParameters, caloHitFactory));
167 catch (
const pandora::StatusCodeException&) {
168 mf::LogWarning(
"LArPandora") <<
"CreatePandoraHits2D - unable to create calo hit, " 169 "insufficient or invalid information supplied " 181 mf::LogDebug(
"LArPandora") <<
" *** LArPandoraInput::CreatePandoraLArTPCs(...) *** " 186 <<
"CreatePandoraDetectorGaps - primary Pandora instance does not exist ";
191 PandoraApi::Geometry::LArTPC::Parameters parameters;
194 parameters.m_larTPCVolumeId = driftVolume.GetVolumeID();
195 parameters.m_centerX = driftVolume.GetCenterX();
196 parameters.m_centerY = driftVolume.GetCenterY();
197 parameters.m_centerZ = driftVolume.GetCenterZ();
198 parameters.m_widthX = driftVolume.GetWidthX();
199 parameters.m_widthY = driftVolume.GetWidthY();
200 parameters.m_widthZ = driftVolume.GetWidthZ();
201 parameters.m_wirePitchU = driftVolume.GetWirePitchU();
202 parameters.m_wirePitchV = driftVolume.GetWirePitchV();
203 parameters.m_wirePitchW = driftVolume.GetWirePitchW();
204 parameters.m_wireAngleU = driftVolume.GetWireAngleU();
205 parameters.m_wireAngleV = driftVolume.GetWireAngleV();
206 parameters.m_wireAngleW = driftVolume.GetWireAngleW();
207 parameters.m_sigmaUVW = driftVolume.GetSigmaUVZ();
208 parameters.m_isDriftInPositiveX = driftVolume.IsPositiveDrift();
210 catch (
const pandora::StatusCodeException&) {
211 mf::LogWarning(
"LArPandora") <<
"CreatePandoraLArTPCs - invalid tpc parameter provided, " 212 "all assigned values must be finite, tpc omitted " 218 PANDORA_THROW_RESULT_IF(pandora::STATUS_CODE_SUCCESS,
220 PandoraApi::Geometry::LArTPC::Create(*pPandora, parameters));
222 catch (
const pandora::StatusCodeException&) {
223 mf::LogWarning(
"LArPandora") <<
"CreatePandoraLArTPCs - unable to create tpc, insufficient " 224 "or invalid information supplied " 241 mf::LogDebug(
"LArPandora") <<
" *** LArPandoraInput::CreatePandoraDetectorGaps(...) *** " 246 <<
"CreatePandoraDetectorGaps - primary Pandora instance does not exist ";
251 PandoraApi::Geometry::LineGap::Parameters parameters;
256 catch (
const pandora::StatusCodeException&) {
258 <<
"CreatePandoraDetectorGaps - invalid line gap parameter provided, all assigned values " 259 "must be finite, line gap omitted " 264 PANDORA_THROW_RESULT_IF(pandora::STATUS_CODE_SUCCESS,
266 PandoraApi::Geometry::LineGap::Create(*pPandora, parameters));
268 catch (
const pandora::StatusCodeException&) {
269 mf::LogWarning(
"LArPandora") <<
"CreatePandoraDetectorGaps - unable to create line gap, " 270 "insufficient or invalid information supplied " 282 mf::LogDebug(
"LArPandora") <<
" *** LArPandoraInput::CreatePandoraReadoutGaps(...) *** " 287 <<
"CreatePandoraReadoutGaps - primary Pandora instance does not exist ";
291 const lariov::ChannelStatusProvider& channelStatus(
297 for (
auto const& plane : wireReadoutGeom.Iterate<
geo::PlaneGeo>()) {
298 const float halfWirePitch(0.5
f * plane.WirePitch());
299 const unsigned int nWires(wireReadoutGeom.Nwires(plane.ID()));
301 int firstBadWire(-1), lastBadWire(-1);
303 for (
unsigned int iwire = 0; iwire < nWires; ++iwire) {
305 wireReadoutGeom.PlaneWireToChannel(
geo::WireID{plane.ID(), iwire}));
306 const bool isBadChannel(channelStatus.IsBad(channel));
307 const bool isLastWire(nWires == (iwire + 1));
309 if (isBadChannel && (firstBadWire < 0)) firstBadWire = iwire;
311 if (isBadChannel || isLastWire) lastBadWire = iwire;
313 if (isBadChannel && !isLastWire)
continue;
315 if ((firstBadWire < 0) || (lastBadWire < 0))
continue;
317 auto const firstXYZ = plane.Wire(firstBadWire).GetCenter();
318 auto const lastXYZ = plane.Wire(lastBadWire).GetCenter();
323 PandoraApi::Geometry::LineGap::Parameters parameters;
326 float xFirst(-std::numeric_limits<float>::max());
327 float xLast(std::numeric_limits<float>::max());
329 auto const [icstat, itpc] = std::make_pair(plane.ID().Cryostat, plane.ID().TPC);
330 const unsigned int volumeId(
334 if (driftVolumeMap.end() != volumeIter) {
335 xFirst = volumeIter->second.GetCenterX() - 0.5f * volumeIter->second.GetWidthX();
336 xLast = volumeIter->second.GetCenterX() + 0.5f * volumeIter->second.GetWidthX();
341 iview, itpc, icstat, firstXYZ, lastXYZ, halfWirePitch, xFirst, xLast, pPandora);
343 catch (
const pandora::StatusCodeException&) {
345 <<
"CreatePandoraReadoutGaps - invalid line gap parameter provided, all assigned " 346 "values must be finite, line gap omitted " 352 PANDORA_THROW_RESULT_IF(pandora::STATUS_CODE_SUCCESS,
354 PandoraApi::Geometry::LineGap::Create(*pPandora, parameters));
356 catch (
const pandora::StatusCodeException&) {
357 mf::LogWarning(
"LArPandora") <<
"CreatePandoraReadoutGaps - unable to create line " 358 "gap, insufficient or invalid information supplied " 374 mf::LogDebug(
"LArPandora") <<
" *** LArPandoraInput::CreatePandoraMCParticles(...) *** " 380 <<
"CreatePandoraMCParticles - primary Pandora instance does not exist ";
388 iterEnd = particleToTruthMap.end();
392 particleMap[particle->
TrackId()] = particle;
396 int neutrinoCounter(0);
401 iterEnd1 = truthToParticleMap.end();
412 <<
"CreatePandoraMCParticles - detected an excessive number of mc neutrinos (" 413 << neutrinoCounter <<
")";
415 const int neutrinoID(neutrinoCounter + 9 * settings.
m_uidOffset);
424 mcParticleParameters.
m_nuanceCode = neutrino.InteractionType();
426 mcParticleParameters.m_energy = neutrino.Nu().E();
427 mcParticleParameters.m_momentum =
428 pandora::CartesianVector(neutrino.Nu().Px(), neutrino.Nu().Py(), neutrino.Nu().Pz());
429 mcParticleParameters.m_vertex =
430 pandora::CartesianVector(neutrino.Nu().Vx(), neutrino.Nu().Vy(), neutrino.Nu().Vz());
431 mcParticleParameters.m_endpoint =
432 pandora::CartesianVector(neutrino.Nu().Vx(), neutrino.Nu().Vy(), neutrino.Nu().Vz());
433 mcParticleParameters.m_particleId = neutrino.Nu().PdgCode();
434 mcParticleParameters.m_mcParticleType = pandora::MC_3D;
435 mcParticleParameters.m_pParentAddress = (
void*)((intptr_t)neutrinoID);
437 catch (
const pandora::StatusCodeException&) {
439 <<
"CreatePandoraMCParticles - invalid mc neutrino parameter provided, all assigned " 440 "values must be finite, mc neutrino omitted " 446 PANDORA_THROW_RESULT_IF(
447 pandora::STATUS_CODE_SUCCESS,
449 PandoraApi::MCParticle::Create(*pPandora, mcParticleParameters, mcParticleFactory));
451 catch (
const pandora::StatusCodeException&) {
452 mf::LogWarning(
"LArPandora") <<
"CreatePandoraMCParticles - unable to create mc " 453 "neutrino, insufficient or invalid information supplied " 462 iterEnd2 = particleVector.end();
466 const int trackID(particle->
TrackId());
469 if (particle->
Mother() == 0) {
471 PANDORA_THROW_RESULT_IF(
472 pandora::STATUS_CODE_SUCCESS,
474 PandoraApi::SetMCParentDaughterRelationship(
475 *pPandora, (
void*)((intptr_t)neutrinoID), (
void*)((intptr_t)trackID)));
477 catch (
const pandora::StatusCodeException&) {
478 mf::LogWarning(
"LArPandora") <<
"CreatePandoraMCParticles - unable to create mc " 479 "particle relationship, invalid information supplied " 488 mf::LogDebug(
"LArPandora") <<
" Number of Pandora neutrinos: " << neutrinoCounter
492 int particleCounter(0);
495 std::map<const simb::MCParticle, bool> primaryGeneratorMCParticleMap;
503 if (particle->
TrackId() != iterI->first)
504 throw cet::exception(
"LArPandora") <<
"CreatePandoraMCParticles - mc truth information " 505 "appears to be scrambled in this event";
509 <<
"CreatePandoraMCParticles - detected an excessive number of MC particles (" 515 int firstT(-1), lastT(-1);
518 if (firstT < 0 && lastT < 0) {
524 const float vtxX(particle->
Vx(firstT));
525 const float vtxY(particle->
Vy(firstT));
526 const float vtxZ(particle->
Vz(firstT));
528 const float endX(particle->
Vx(lastT));
529 const float endY(particle->
Vy(lastT));
530 const float endZ(particle->
Vz(lastT));
532 const float pX(particle->
Px(firstT));
533 const float pY(particle->
Py(firstT));
534 const float pZ(particle->
Pz(firstT));
535 const float E(particle->
E(firstT));
539 const int trackID(particle->
TrackId());
562 if (processMap.find(particle->
Process()) != processMap.end()) {
568 <<
"CreatePandoraMCParticles - found an unknown process" << std::endl;
570 mcParticleParameters.m_energy =
E;
571 mcParticleParameters.m_particleId = particle->
PdgCode();
572 mcParticleParameters.m_momentum = pandora::CartesianVector(pX, pY, pZ);
573 mcParticleParameters.m_vertex = pandora::CartesianVector(vtxX, vtxY, vtxZ);
574 mcParticleParameters.m_endpoint = pandora::CartesianVector(endX, endY, endZ);
575 mcParticleParameters.m_mcParticleType = pandora::MC_3D;
576 mcParticleParameters.m_pParentAddress = (
void*)((intptr_t)particle->
TrackId());
578 catch (
const pandora::StatusCodeException&) {
580 <<
"CreatePandoraMCParticles - invalid mc particle parameter provided, all assigned " 581 "values must be finite, mc particle omitted " 587 PANDORA_THROW_RESULT_IF(
588 pandora::STATUS_CODE_SUCCESS,
590 PandoraApi::MCParticle::Create(*pPandora, mcParticleParameters, mcParticleFactory));
592 catch (
const pandora::StatusCodeException&) {
593 mf::LogWarning(
"LArPandora") <<
"CreatePandoraMCParticles - unable to create mc particle, " 594 "insufficient or invalid information supplied " 600 const int id_mother(particle->
Mother());
603 if (iterJ != particleMap.end()) {
605 PANDORA_THROW_RESULT_IF(
606 pandora::STATUS_CODE_SUCCESS,
608 PandoraApi::SetMCParentDaughterRelationship(
609 *pPandora, (
void*)((intptr_t)id_mother), (
void*)((intptr_t)particle->
TrackId())));
611 catch (
const pandora::StatusCodeException&) {
612 mf::LogWarning(
"LArPandora") <<
"CreatePandoraMCParticles - Unable to create mc particle " 613 "relationship, invalid information supplied " 620 mf::LogDebug(
"LArPandora") <<
"Number of mc particles: " << particleCounter << std::endl;
627 std::map<const simb::MCParticle, bool>& primaryMCParticleMap)
630 if (
"primary" == mcParticle.Process()) {
631 primaryMCParticleMap.emplace(std::make_pair(mcParticle,
false));
640 std::map<const simb::MCParticle, bool>& primaryMCParticleMap)
642 for (
auto& mcParticleIter : primaryMCParticleMap) {
643 if (!mcParticleIter.second) {
646 if (std::fabs(primaryMCParticle.
Px() - mcParticle->
Px()) <
647 std::numeric_limits<double>::epsilon() &&
648 std::fabs(primaryMCParticle.
Py() - mcParticle->
Py()) <
649 std::numeric_limits<double>::epsilon() &&
650 std::fabs(primaryMCParticle.
Pz() - mcParticle->
Pz()) <
651 std::numeric_limits<double>::epsilon()) {
652 mcParticleIter.second =
true;
666 mf::LogDebug(
"LArPandora") <<
" *** LArPandoraInput::CreatePandoraMCLinks(...) *** " 671 <<
"CreatePandoraMCLinks2D - primary Pandora instance does not exist ";
678 const int hitID(iterI->first);
685 if (hitToParticleMap.end() == iterJ)
continue;
689 if (trackCollection.size() == 0)
691 <<
"CreatePandoraMCLinks2D - found a hit without any associated MC truth information ";
694 for (
unsigned int k = 0; k < trackCollection.size(); ++k) {
696 const int trackID(
std::abs(trackIDE.trackID));
697 const float energyFrac(trackIDE.energyFrac);
700 PANDORA_THROW_RESULT_IF(
701 pandora::STATUS_CODE_SUCCESS,
703 PandoraApi::SetCaloHitToMCParticleRelationship(
704 *pPandora, (
void*)((intptr_t)hitID), (
void*)((intptr_t)trackID), energyFrac));
706 catch (
const pandora::StatusCodeException&) {
707 mf::LogWarning(
"LArPandora") <<
"CreatePandoraMCLinks2D - unable to create calo hit to " 708 "mc particle relationship, invalid information supplied " 727 for (
auto const& tpcid : theGeometry->Iterate<
geo::TPCID>()) {
728 int thisfirstT(-1), thislastT(-1);
731 if (thisfirstT < 0)
continue;
733 if (firstT < 0 || thisfirstT < firstT) firstT = thisfirstT;
735 if (lastT < 0 || thislastT > lastT) lastT = thislastT;
748 bool foundStartPosition(
false);
751 for (
int nt = 0; nt < numTrajectoryPoints; ++nt) {
757 if (tpcID != ref_tpcid)
continue;
761 if (!foundStartPosition) {
763 foundStartPosition =
true;
776 auto const det_prop =
782 const float vtxT(particle->
T(nt));
783 const float vtxTDC(clock_data.TPCG4Time2Tick(vtxT));
788 return (driftDir * (vtxTDC - vtxTDC0) * det_prop.GetXTicksCoefficient());
795 const double hit_Charge,
801 const double dQdX(hit_Charge / (wireReadoutGeom.Plane({0, 0}, hit_View).WirePitch()));
802 const double dQdX_e(dQdX /
876 : m_pPrimaryPandora(nullptr)
877 , m_useHitWidths(true)
878 , m_useBirksCorrection(false)
879 , m_useActiveBoundingBox(false)
880 , m_uidOffset(100000000)
881 , m_hitCounterOffset(0)
887 , m_mips_if_negative(0.)
888 , m_mips_to_gev(3.5
e-4)
889 , m_recombination_factor(0.63)
double E(const int i=0) const
simb::MCTruth TrackIdToMCTruth(int const id) const
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...
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.
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.
cout<< "Opened file "<< fin<< " ixs= "<< ixs<< endl;if(ixs==0) hhh=(TH1F *) fff-> Get("h1")
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::string Process() const
DriftAxis DriftAxisWithSign() const
Returns the expected drift direction based on geometry.
pandora::InputInt m_process
The process creating the particle.
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
Drift towards negative values.
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.
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.
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
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
unsigned int ChannelID_t
Type representing the ID of a readout channel.
TPCGeo const & TPC(TPCID const &tpcid=details::tpc_zero) const
Returns the specified TPC.
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.
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.