10 #include "TDatabasePDG.h" 13 #include "TPolyLine.h" 14 #include "TPolyLine3D.h" 15 #include "TPolyMarker.h" 16 #include "TPolyMarker3D.h" 48 mf::LogWarning(
"SimulationDrawer") <<
"SimulationDrawer::" << fcn <<
" failed with message:\n" 69 auto const tpc_center = tpc.Center();
70 auto const active_volume_center = tpc.GetActiveVolumeCenter();
71 mf::LogDebug(
"SimulationDrawer") << tpc.ID() <<
", TPC center: " << tpc_center.X() <<
", " 72 << tpc_center.Y() <<
", " << tpc_center.Z() << std::endl;
74 <<
" TPC Active center: " << active_volume_center.X() <<
", " 75 << active_volume_center.Y() <<
", " << active_volume_center.Z()
76 <<
", H/W/L: " << tpc.ActiveHalfHeight() <<
"/" << tpc.ActiveHalfWidth() <<
"/" 77 << tpc.ActiveLength() << std::endl;
79 if (
minx > tpc_center.X() - tpc.HalfWidth())
minx = tpc_center.X() - tpc.HalfWidth();
80 if (
maxx < tpc_center.X() + tpc.HalfWidth())
maxx = tpc_center.X() + tpc.HalfWidth();
81 if (
miny > tpc_center.Y() - tpc.HalfHeight())
miny = tpc_center.Y() - tpc.HalfHeight();
82 if (
maxy < tpc_center.Y() + tpc.HalfHeight())
maxy = tpc_center.Y() + tpc.HalfHeight();
83 if (
minz > tpc_center.Z() - tpc.Length() / 2.)
minz = tpc_center.Z() - tpc.Length() / 2.;
84 if (
maxz < tpc_center.Z() + tpc.Length() / 2.)
maxz = tpc_center.Z() + tpc.Length() / 2.;
87 <<
" minx/maxx: " <<
minx <<
"/" <<
maxx <<
", miny/maxy: " <<
miny <<
"/" <<
maxy 88 <<
", minz/miny: " <<
minz <<
"/" <<
maxz << std::endl;
107 std::vector<const simb::MCTruth*> mctruth;
110 for (
unsigned int i = 0; i < mctruth.size(); ++i) {
113 bool firstout =
true;
115 std::string incoming;
116 std::string outgoing;
119 int jmax = TMath::Min(20, mctruth[i]->NParticles());
120 for (
int j = 0; j < jmax; ++j) {
125 "#color[%d]{%s #scale[0.75]{[%.1f GeV/c]}}",
137 if (firstin ==
false) incoming +=
" + ";
142 if (firstout ==
false) outgoing +=
" + ";
147 if (origin ==
"" && incoming ==
"") { mctext = outgoing; }
149 mctext = origin + incoming +
" #rightarrow " + outgoing;
151 TLatex& latex = view->
AddLatex(0.03, 0.2, mctext.c_str());
152 latex.SetTextSize(0.6);
167 std::vector<const simb::MCTruth*> mctruth;
169 std::cout <<
"\nMCTruth Ptcl trackID PDG P T Moth Process\n";
170 for (
unsigned int i = 0; i < mctruth.size(); ++i) {
171 for (
int j = 0; j < mctruth[i]->NParticles(); ++j) {
174 int KE = 1000 * (p.
E() - p.
Mass());
175 std::cout <<
std::right << std::setw(7) << i << std::setw(5) << j << std::setw(8)
177 << std::setw(7) << int(1000 * p.
P()) << std::setw(7) << KE << std::setw(7)
182 std::cout <<
"Note: Momentum, P, and kinetic energy, T, in MeV/c\n";
197 if (drawopt->fShowMCTruthVectors > 3) {
198 std::cout <<
"Unsupported ShowMCTruthVectors option (> 2)\n";
207 double const xShift = -2;
209 static bool first =
true;
212 <<
"******** Show MCTruth (Genie) particles when ShowMCTruthVectors = 1 or 3 ******** \n";
213 std::cout <<
" MCTruth vectors corrected for space charge? " << sce->
EnableCorrSCE()
214 <<
" and shifted by " << xShift <<
" cm in X\n";
215 std::cout <<
" Neutrons and photons drawn with dotted lines. \n";
216 std::cout <<
" Red = e+/-, nue, nuebar. Blue = mu+/-, numu, numubar. Green = tau+/-, nutau, " 218 std::cout <<
" Yellow = photons. Magenta = pions, protons and nuetrons.\n";
219 std::cout <<
"******** Show MCParticle (Geant) decay photons (e.g. from pizeros) when " 220 "ShowMCTruthVectors = 2 or 3 ******** \n";
221 std::cout <<
" Photons > 50 MeV are drawn as dotted lines corrected for space charge and " 222 "are not shifted.\n";
223 std::cout <<
" Decay photon end points are drawn at 2 interaction lengths (44 cm) from the " 225 std::cout <<
" Color: Green = (50 < E_photon < 100 MeV), Blue = (100 MeV < E_photon < 200 " 226 "MeV), Red = (E_photon > 300 MeV).\n";
229 bool showTruth = (drawopt->fShowMCTruthVectors == 1 || drawopt->fShowMCTruthVectors == 3);
230 bool showPhotons = (drawopt->fShowMCTruthVectors > 1);
237 std::vector<const simb::MCTruth*> mctruth;
240 for (
size_t i = 0; i < mctruth.size(); ++i) {
242 for (
int j = 0; j < mctruth[i]->NParticles(); ++j) {
248 double r = p.
P() * 10.0;
256 p.
Vx() - sceOffset.X(), p.
Vy() + sceOffset.Y(), p.
Vz() + sceOffset.Z()};
258 xyz1.Y() + r * p.
Py() / p.
P(),
259 xyz1.Z() + r * p.
Pz() / p.
P()};
263 double time = detProp.ConvertXToTicks(xyz1.X() + xShift, planeID);
264 double time2 = detProp.ConvertXToTicks(xyz2.X() + xShift, planeID);
267 TLine& l = view->
AddLine(w1, time, w2, time2);
271 TLine& l = view->
AddLine(time, w1, time2, w2);
284 if (plist.
empty())
return;
292 if (p->
PdgCode() != 22)
continue;
293 if (p->
Process() !=
"Decay")
continue;
294 int TMeV = 1000 * (p->
E() - p->
Mass());
295 if (TMeV < 30)
continue;
300 p->
Vx() - sceOffset.X(), p->
Vy() + sceOffset.Y(), p->
Vz() + sceOffset.Z()};
302 xyz1.Y() + r * p->
Py() / p->
P(),
303 xyz1.Z() + r * p->
Pz() / p->
P()};
305 double t1 = detProp.ConvertXToTicks(xyz1.X(), planeID);
307 double t2 = detProp.ConvertXToTicks(xyz2.X(), planeID);
308 TLine& l = view->
AddLine(w1, t1, w2, t2);
310 l.SetLineStyle(kDotted);
311 if (TMeV < 100) { l.SetLineColor(kGreen); }
312 else if (TMeV < 200) {
313 l.SetLineColor(kBlue);
316 l.SetLineColor(kRed);
341 std::vector<const simb::MCParticle*> plist;
345 int neutralColor(12);
347 int neutrinoColor(38);
354 <<
"Starting loop over " << plist.size() <<
" McParticles, voxel list size is " 355 << voxels.
size() << std::endl;
367 std::map<int, const simb::MCParticle*> trackToMcParticleMap;
370 double minPartEnergy(0.01);
372 for (
size_t p = 0; p < plist.size(); ++p) {
373 trackToMcParticleMap[plist[p]->TrackId()] = plist[p];
381 int pdgCode(mcPart->
PdgCode());
383 TParticlePDG* partPDG(TDatabasePDG::Instance()->
GetParticle(pdgCode));
384 double partCharge = partPDG ? partPDG->Charge() : 0.;
385 double partEnergy = mcPart->
E();
389 if (!mcTraj.
empty() && partEnergy > minPartEnergy && mcPart->
TrackId() < 100000000) {
390 double g4Ticks(clockData.TPCG4Time2Tick(mcPart->
T()) -
trigger_offset(clockData));
392 double xPosMinTick = 0.;
393 double xPosMaxTick = std::numeric_limits<double>::max();
396 int numTrajPoints = mcTraj.
size();
398 std::unique_ptr<double[]> hitPositions(
new double[3 * numTrajPoints]);
401 for (
int hitIdx = 0; hitIdx < numTrajPoints; hitIdx++) {
402 double xPos = mcTraj.
X(hitIdx);
403 double yPos = mcTraj.
Y(hitIdx);
404 double zPos = mcTraj.
Z(hitIdx);
415 xPosMinTick = detProp.ConvertTicksToX(0, planeID);
416 xPosMaxTick = detProp.ConvertTicksToX(detProp.NumberTimeSamples(), planeID);
417 xOffset = detProp.ConvertTicksToX(g4Ticks, planeID) - xPosMinTick;
419 if (xPosMaxTick < xPosMinTick) std::swap(xPosMinTick, xPosMaxTick);
429 if (xPos > xPosMinTick && xPos < xPosMaxTick) {
439 hitPositions[3 * hitCount] = xPos;
440 hitPositions[3 * hitCount + 1] = yPos;
441 hitPositions[3 * hitCount + 2] = zPos;
449 if (partCharge == 0.) {
450 pl.SetLineColor(neutralColor);
454 pl.SetPolyLine(hitCount, hitPositions.get(),
"");
460 std::map<const simb::MCParticle*, std::vector<std::vector<double>>> partToPosMap;
463 for (vxitr = voxels.
begin(); vxitr != voxels.
end(); vxitr++) {
468 int trackId = vxd.
TrackID(partIdx);
473 partToPosMap[mcPart].push_back(std::vector<double>(3));
475 partToPosMap[mcPart].back()[0] = vxd.
VoxelID().
X();
476 partToPosMap[mcPart].back()[1] = vxd.
VoxelID().
Y();
477 partToPosMap[mcPart].back()[2] = vxd.
VoxelID().
Z();
484 std::map<const simb::MCParticle*, std::vector<std::vector<double>>>
::iterator partToPosMapItr;
486 for (partToPosMapItr = partToPosMap.begin(); partToPosMapItr != partToPosMap.end();
492 if (!mcPart || partToPosMapItr->second.empty())
continue;
494 double g4Ticks(clockData.TPCG4Time2Tick(mcPart->
T()) -
trigger_offset(clockData));
496 double xPosMinTick = 0.;
497 double xPosMaxTick = std::numeric_limits<double>::max();
500 int markerIdx(kFullDotSmall);
504 colorIdx = grayedColor;
509 std::unique_ptr<double[]> hitPositions(
new double[3 * partToPosMapItr->second.size()]);
513 for (
size_t posIdx = 0; posIdx < partToPosMapItr->second.size(); posIdx++) {
514 const std::vector<double>& posVec = partToPosMapItr->second[posIdx];
517 geo::Point_t hitLocation(posVec[0], posVec[1], posVec[2]);
523 xPosMinTick = detProp.ConvertTicksToX(0, planeID);
524 xPosMaxTick = detProp.ConvertTicksToX(detProp.NumberTimeSamples(), planeID);
525 xOffset = detProp.ConvertTicksToX(g4Ticks, planeID) - xPosMinTick;
527 if (xPosMaxTick < xPosMinTick) std::swap(xPosMinTick, xPosMaxTick);
533 double xCoord = posVec[0] + xOffset;
537 if (xCoord > xPosMinTick && xCoord < xPosMaxTick) {
538 hitPositions[3 * hitCount] = xCoord;
539 hitPositions[3 * hitCount + 1] = posVec[1];
540 hitPositions[3 * hitCount + 2] = posVec[2];
545 TPolyMarker3D& pm = view->
AddPolyMarker3D(1, colorIdx, markerIdx, markerSize);
546 pm.SetPolyMarker(hitCount, hitPositions.get(), markerIdx);
550 std::vector<const simb::MCTruth*> mctruth;
554 for (
unsigned int idx = 0; idx < mctruth.size(); idx++) {
556 for (
int particleIdx = 0; particleIdx < mctruth[idx]->NParticles(); particleIdx++) {
561 mf::LogDebug(
"SimulationDrawer") << mcPart << std::endl;
564 TVector3 particlePosition(mcPart.
Vx(), mcPart.
Vy(), mcPart.
Vz());
567 TVector3 oppPartDir(-mcPart.
Px(), -mcPart.
Py(), -mcPart.
Pz());
569 if (oppPartDir.Mag2() > 0.) oppPartDir.SetMag(1.);
571 double arcLenToDraw = -particlePosition.Z() / oppPartDir.CosTheta();
574 if (arcLenToDraw > 0.) {
576 TPolyLine3D& pl(view->
AddPolyLine3D(2, neutrinoColor, 1, 2));
578 pl.SetPoint(0, particlePosition.X(), particlePosition.Y(), particlePosition.Z());
580 particlePosition += std::min(arcLenToDraw + 10., 1000.) * oppPartDir;
582 pl.SetPoint(1, particlePosition.X(), particlePosition.Y(), particlePosition.Z());
614 std::vector<const simb::MCParticle*> plist;
619 double xMinimum(-1. * (
maxx -
minx));
620 double xMaximum(2. * (
maxx -
minx));
629 <<
"Starting loop over " << plist.size() <<
" McParticles, voxel list size is " 630 << voxels.
size() << std::endl;
642 std::map<int, const simb::MCParticle*> trackToMcParticleMap;
645 bool displayMcTrajectories(
true);
646 double minPartEnergy(0.025);
648 double tpcminx = 1.0;
649 double tpcmaxx = -1.0;
650 double xOffset = 0.0;
651 double g4Ticks = 0.0;
653 double readoutwindowsize = 0.0;
654 for (
size_t p = 0; p < plist.size(); ++p) {
655 trackToMcParticleMap[plist[p]->TrackId()] = plist[p];
658 if (displayMcTrajectories) {
663 int pdgCode(mcPart->
PdgCode());
664 TParticlePDG* partPDG(TDatabasePDG::Instance()->
GetParticle(pdgCode));
665 double partCharge = partPDG ? partPDG->Charge() : 0.;
666 double partEnergy = mcPart->
E();
668 if (!mcTraj.
empty() && partEnergy > minPartEnergy && mcPart->
TrackId() < 100000000) {
670 int numTrajPoints = mcTraj.
size();
672 std::unique_ptr<double[]> hitPosX(
new double[numTrajPoints]);
673 std::unique_ptr<double[]> hitPosY(
new double[numTrajPoints]);
674 std::unique_ptr<double[]> hitPosZ(
new double[numTrajPoints]);
677 double xPos = mcTraj.
X(0);
678 double yPos = mcTraj.
Y(0);
679 double zPos = mcTraj.
Z(0);
686 readoutwindowsize = 0.0;
687 for (
int hitIdx = 0; hitIdx < numTrajPoints; hitIdx++) {
688 xPos = mcTraj.
X(hitIdx);
689 yPos = mcTraj.
Y(hitIdx);
690 zPos = mcTraj.
Z(hitIdx);
693 if (xPos < minx || xPos >
maxx || yPos < miny || yPos >
maxy || zPos <
minz ||
697 if ((xPos < tpcminx) || (xPos > tpcmaxx)) {
703 unsigned int tpc = tpcid.
TPC;
705 tpcminx = tpcgeo.
MinX();
706 tpcmaxx = tpcgeo.
MaxX();
708 coeff = detProp.GetXTicksCoefficient(tpc, cryo);
710 detProp.ConvertTicksToX(detProp.ReadOutWindowSize(), 0, tpc, cryo);
715 g4Ticks = clockData.TPCG4Time2Tick(mcPart->
T()) +
716 detProp.GetXTicksOffset(0, tpc, cryo) -
trigger_offset(clockData);
718 xOffset = detProp.ConvertTicksToX(g4Ticks, 0, tpc, cryo);
725 readoutwindowsize = 0.0;
732 bool inreadoutwindow =
false;
734 if ((xPos > readoutwindowsize) && (xPos < tpcmaxx)) inreadoutwindow =
true;
736 else if (coeff > 0) {
737 if ((xPos > tpcminx) && (xPos < readoutwindowsize)) inreadoutwindow =
true;
740 if (!inreadoutwindow)
continue;
743 if (xPos > xMinimum && xPos < xMaximum) {
744 hitPosX[hitCount] = xPos;
745 hitPosY[hitCount] = yPos;
746 hitPosZ[hitCount] = zPos;
755 if (partCharge == 0.) {
762 pl.SetPolyLine(hitCount, hitPosX.get(), hitPosY.get(),
"");
764 pl.SetPolyLine(hitCount, hitPosZ.get(), hitPosX.get(),
"");
766 pl.SetPolyLine(hitCount, hitPosZ.get(), hitPosY.get(),
"");
772 std::map<const simb::MCParticle*, std::vector<std::vector<double>>> partToPosMap;
775 for (vxitr = voxels.
begin(); vxitr != voxels.
end(); vxitr++) {
780 int trackId = vxd.
TrackID(partIdx);
785 partToPosMap[mcPart].push_back(std::vector<double>(3));
787 partToPosMap[mcPart].back()[0] = vxd.
VoxelID().
X();
788 partToPosMap[mcPart].back()[1] = vxd.
VoxelID().
Y();
789 partToPosMap[mcPart].back()[2] = vxd.
VoxelID().
Z();
796 std::map<const simb::MCParticle*, std::vector<std::vector<double>>>
::iterator partToPosMapItr;
798 for (partToPosMapItr = partToPosMap.begin(); partToPosMapItr != partToPosMap.end();
804 if (!mcPart || partToPosMapItr->second.empty())
continue;
810 std::vector<std::array<double, 3>> posVecCorr;
811 posVecCorr.reserve(partToPosMapItr->second.size());
813 readoutwindowsize = 0.0;
816 for (
size_t posIdx = 0; posIdx < partToPosMapItr->second.size(); posIdx++) {
817 const std::vector<double>& posVec = partToPosMapItr->second[posIdx];
819 if ((posVec[0] < tpcminx) || (posVec[0] > tpcmaxx)) {
820 geo::Point_t const vtx{posVec[0], posVec[1], posVec[2]};
825 unsigned int tpc = tpcid.
TPC;
828 tpcminx = tpcgeo.
MinX();
829 tpcmaxx = tpcgeo.
MaxX();
831 coeff = detProp.GetXTicksCoefficient(tpc, cryo);
832 readoutwindowsize = detProp.ConvertTicksToX(detProp.ReadOutWindowSize(), 0, tpc, cryo);
836 g4Ticks = clockData.TPCG4Time2Tick(mcPart->
T()) +
837 detProp.GetXTicksOffset(0, tpc, cryo) -
trigger_offset(clockData);
839 xOffset = detProp.ConvertTicksToX(g4Ticks, 0, tpc, cryo);
846 readoutwindowsize = 0.0;
850 double xCoord = posVec[0] + xOffset;
852 bool inreadoutwindow =
false;
854 if ((xCoord > readoutwindowsize) && (xCoord < tpcmaxx)) inreadoutwindow =
true;
856 else if (coeff > 0) {
857 if ((xCoord > tpcminx) && (xCoord < readoutwindowsize)) inreadoutwindow =
true;
860 if (inreadoutwindow && (xCoord > xMinimum && xCoord < xMaximum)) {
861 posVecCorr.push_back({{xCoord, posVec[1], posVec[2]}});
870 for (
size_t p = 0; p < posVecCorr.size(); ++p) {
872 pm.SetPoint(p, posVecCorr[p][0], posVecCorr[p][1]);
874 pm.SetPoint(p, posVecCorr[p][2], posVecCorr[p][0]);
876 pm.SetPoint(p, posVecCorr[p][2], posVecCorr[p][1]);
885 std::vector<const simb::MCParticle*>& plist)
893 std::vector<const simb::MCParticle*> temp;
899 for (
unsigned int i = 0; i < plcol.
vals().size(); ++i) {
900 temp.push_back(plcol.
vals().at(i));
905 writeErrMsg(
"GetRawDigits", e);
919 std::vector<const simb::MCTruth*> temp;
921 std::vector<art::Handle<std::vector<simb::MCTruth>>> mctcol;
925 mctcol = evt.
getMany<std::vector<simb::MCTruth>>();
926 for (
size_t mctc = 0; mctc < mctcol.size(); ++mctc) {
929 for (
size_t i = 0; i < mclistHandle->size(); ++i) {
930 temp.push_back(&(mclistHandle->at(i)));
936 writeErrMsg(
"GetMCTruth", e);
std::map< int, bool > fHighlite
double E(const int i=0) const
details::range_type< T > Iterate() const
Initializes the specified ID with the ID of the first cryostat.
double Z(const size_type i) const
double X(const size_type i) const
Length_t WireCoordinate(Point_t const &pos, PlaneID const &planeid) const
Returns the index of the nearest wire to the specified position.
constexpr auto const & right(const_AssnsIter< L, R, D, Dir > const &a, const_AssnsIter< L, R, D, Dir > const &b)
double Py(const int i=0) const
Utilities related to art service access.
void MCTruthLongText(const art::Event &evt, evdb::View2D *view)
unsigned int fTPC
TPC number to draw, typically set by TWQProjectionView.
void HiLite(int trkId, bool hlt=true)
TPolyLine & AddPolyLine(int n, int c, int w, int s)
Container of LAr voxel information.
const simb::MCTrajectory & Trajectory() const
TLine & AddLine(double x1, double y1, double x2, double y2)
list_type::const_iterator const_iterator
simb::Origin_t Origin() const
double MinX() const
Returns the world x coordinate of the start of the box.
The data type to uniquely identify a Plane.
bool isValid
Whether this ID points to a valid element.
Geometry information for a single TPC.
double Px(const int i=0) const
static sim::LArVoxelList GetLArVoxelList(const art::Event &evt, std::string moduleLabel)
CryostatID_t Cryostat
Index of cryostat.
int GetMCTruth(const art::Event &evt, std::vector< const simb::MCTruth * > &mctruth)
art::InputTag fG4ModuleLabel
module label producing sim::SimChannel objects
double MaxX() const
Returns the world x coordinate of the end of the box.
A collection of drawable 2-D objects.
static void FromPDG(TLine &line, int pdgcode)
CryostatGeo const & GetElement(CryostatID const &cryoid) const
Returns the specified cryostat.
std::string Process() const
void MCTruth3D(const art::Event &evt, evdb::View3D *view)
list_type::const_iterator const_iterator
virtual bool EnableCorrSCE() const =0
TPolyLine3D & AddPolyLine3D(int n, int c, int w, int s)
TPCID FindTPCAtPosition(Point_t const &point) const
Returns the ID of the TPC at specified location.
virtual geo::Vector_t GetPosOffsets(geo::Point_t const &point) const =0
double Y(const size_type i) const
Encapsulates the information we want store for a voxel.
unsigned int fCryostat
Cryostat number to draw, typically set by TWQProjectionView.
const art::Ptr< simb::MCTruth > & TrackIdToMCTruth_P(int id) const
int GetParticle(const art::Event &evt, std::vector< const simb::MCParticle * > &plist)
double P(const int i=0) const
TPolyMarker & AddPolyMarker(int n, int c, int st, double sz)
static int ColorFromPDG(int pdgcode)
double T(const int i=0) const
double fMinEnergyDeposition
bool fShowMCTruthTrajectories
size_type NumberParticles() const
The data type to uniquely identify a TPC.
Description of geometry of one entire detector.
TLatex & AddLatex(double x, double y, const char *text)
void MCTruthShortText(const art::Event &evt, evdb::View2D *view)
const sim::ParticleList & ParticleList() const
std::size_t getView(std::string const &moduleLabel, std::string const &productInstanceName, std::string const &processName, std::vector< ELEMENT const * > &result) const
CryostatID PositionToCryostatID(Point_t const &point) const
Returns the ID of the cryostat at specified location.
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.
mapped_type Energy() const
art::InputTag fSimChannelLabel
SimChannels may be independent of MC stuff.
MaybeLogger_< ELseverityLevel::ELsev_success, false > LogDebug
static const char * LatexName(int pdgcode)
Convert PDG code to a latex string (root-style)
MaybeLogger_< ELseverityLevel::ELsev_warning, false > LogWarning
double Pz(const int i=0) const
Render the objects from the Simulation package.
int fAxisOrientation
0 = TDC values on y-axis, wire number on x-axis, 1 = swapped
double Vz(const int i=0) const
int trigger_offset(DetectorClocksData const &data)
void MCTruthOrtho(const art::Event &evt, evd::OrthoProj_t proj, double msize, evdb::View2D *view)
void MCTruthVectors2D(const art::Event &evt, evdb::View2D *view, unsigned int plane)
sim::LArVoxelID VoxelID() const
A collection of 3D drawable objects.
TPCID_t TPC
Index of the TPC within its cryostat.
Namespace collecting geometry-related classes utilities.
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
TPolyMarker3D & AddPolyMarker3D(int n, int c, int st, double sz)
Encapsulate the construction of a single detector plane.
bool fShowMCTruthFullSize
const key_type & TrackID(const size_type) const
std::vector< Handle< PROD > > getMany(SelectorBase const &selector=MatchAllSelector{}) const