10 #include "TDatabasePDG.h" 13 #include "TPolyLine.h" 14 #include "TPolyLine3D.h" 15 #include "TPolyMarker.h" 16 #include "TPolyMarker3D.h" 49 mf::LogWarning(
"SimulationDrawer") <<
"SimulationDrawer::" << fcn <<
" failed with message:\n" 69 for (
auto const& tpc : geom->Iterate<
geo::TPCGeo>()) {
70 auto const tpc_center = tpc.Center();
71 auto const active_volume_center = tpc.GetActiveVolumeCenter();
72 mf::LogDebug(
"SimulationDrawer") << tpc.ID() <<
", TPC center: " << tpc_center.X() <<
", " 73 << tpc_center.Y() <<
", " << tpc_center.Z() << std::endl;
75 <<
" TPC Active center: " << active_volume_center.X() <<
", " 76 << active_volume_center.Y() <<
", " << active_volume_center.Z()
77 <<
", H/W/L: " << tpc.ActiveHalfHeight() <<
"/" << tpc.ActiveHalfWidth() <<
"/" 78 << tpc.ActiveLength() << std::endl;
80 if (
minx > tpc_center.X() - tpc.HalfWidth())
minx = tpc_center.X() - tpc.HalfWidth();
81 if (
maxx < tpc_center.X() + tpc.HalfWidth())
maxx = tpc_center.X() + tpc.HalfWidth();
82 if (
miny > tpc_center.Y() - tpc.HalfHeight())
miny = tpc_center.Y() - tpc.HalfHeight();
83 if (
maxy < tpc_center.Y() + tpc.HalfHeight())
maxy = tpc_center.Y() + tpc.HalfHeight();
84 if (
minz > tpc_center.Z() - tpc.Length() / 2.)
minz = tpc_center.Z() - tpc.Length() / 2.;
85 if (
maxz < tpc_center.Z() + tpc.Length() / 2.)
maxz = tpc_center.Z() + tpc.Length() / 2.;
88 <<
" minx/maxx: " <<
minx <<
"/" <<
maxx <<
", miny/maxy: " <<
miny <<
"/" <<
maxy 89 <<
", minz/miny: " <<
minz <<
"/" <<
maxz << std::endl;
108 std::vector<const simb::MCTruth*> mctruth;
111 for (
unsigned int i = 0; i < mctruth.size(); ++i) {
114 bool firstout =
true;
116 std::string incoming;
117 std::string outgoing;
120 int jmax = TMath::Min(20, mctruth[i]->NParticles());
121 for (
int j = 0; j < jmax; ++j) {
126 "#color[%d]{%s #scale[0.75]{[%.1f GeV/c]}}",
138 if (firstin ==
false) incoming +=
" + ";
143 if (firstout ==
false) outgoing +=
" + ";
148 if (origin ==
"" && incoming ==
"") { mctext = outgoing; }
150 mctext = origin + incoming +
" #rightarrow " + outgoing;
152 TLatex& latex = view->
AddLatex(0.03, 0.2, mctext.c_str());
153 latex.SetTextSize(0.6);
168 std::vector<const simb::MCTruth*> mctruth;
170 std::cout <<
"\nMCTruth Ptcl trackID PDG P T Moth Process\n";
171 for (
unsigned int i = 0; i < mctruth.size(); ++i) {
172 for (
int j = 0; j < mctruth[i]->NParticles(); ++j) {
175 int KE = 1000 * (p.
E() - p.
Mass());
176 std::cout <<
std::right << std::setw(7) << i << std::setw(5) << j << std::setw(8)
178 << std::setw(7) << int(1000 * p.
P()) << std::setw(7) << KE << std::setw(7)
183 std::cout <<
"Note: Momentum, P, and kinetic energy, T, in MeV/c\n";
198 if (drawopt->fShowMCTruthVectors > 3) {
199 std::cout <<
"Unsupported ShowMCTruthVectors option (> 2)\n";
208 double const xShift = -2;
210 static bool first =
true;
213 <<
"******** Show MCTruth (Genie) particles when ShowMCTruthVectors = 1 or 3 ******** \n";
214 std::cout <<
" MCTruth vectors corrected for space charge? " << sce->
EnableCorrSCE()
215 <<
" and shifted by " << xShift <<
" cm in X\n";
216 std::cout <<
" Neutrons and photons drawn with dotted lines. \n";
217 std::cout <<
" Red = e+/-, nue, nuebar. Blue = mu+/-, numu, numubar. Green = tau+/-, nutau, " 219 std::cout <<
" Yellow = photons. Magenta = pions, protons and nuetrons.\n";
220 std::cout <<
"******** Show MCParticle (Geant) decay photons (e.g. from pizeros) when " 221 "ShowMCTruthVectors = 2 or 3 ******** \n";
222 std::cout <<
" Photons > 50 MeV are drawn as dotted lines corrected for space charge and " 223 "are not shifted.\n";
224 std::cout <<
" Decay photon end points are drawn at 2 interaction lengths (44 cm) from the " 226 std::cout <<
" Color: Green = (50 < E_photon < 100 MeV), Blue = (100 MeV < E_photon < 200 " 227 "MeV), Red = (E_photon > 300 MeV).\n";
230 bool showTruth = (drawopt->fShowMCTruthVectors == 1 || drawopt->fShowMCTruthVectors == 3);
231 bool showPhotons = (drawopt->fShowMCTruthVectors > 1);
238 std::vector<const simb::MCTruth*> mctruth;
241 for (
size_t i = 0; i < mctruth.size(); ++i) {
243 for (
int j = 0; j < mctruth[i]->NParticles(); ++j) {
249 double r = p.
P() * 10.0;
257 p.
Vx() - sceOffset.X(), p.
Vy() + sceOffset.Y(), p.
Vz() + sceOffset.Z()};
259 xyz1.Y() + r * p.
Py() / p.
P(),
260 xyz1.Z() + r * p.
Pz() / p.
P()};
261 double w1 = planeg.WireCoordinate(xyz1);
262 double w2 = planeg.WireCoordinate(xyz2);
264 double time = detProp.ConvertXToTicks(xyz1.X() + xShift, planeID);
265 double time2 = detProp.ConvertXToTicks(xyz2.X() + xShift, planeID);
268 TLine& l = view->
AddLine(w1, time, w2, time2);
272 TLine& l = view->
AddLine(time, w1, time2, w2);
285 if (plist.
empty())
return;
293 if (p->
PdgCode() != 22)
continue;
294 if (p->
Process() !=
"Decay")
continue;
295 int TMeV = 1000 * (p->
E() - p->
Mass());
296 if (TMeV < 30)
continue;
301 p->
Vx() - sceOffset.X(), p->
Vy() + sceOffset.Y(), p->
Vz() + sceOffset.Z()};
303 xyz1.Y() + r * p->
Py() / p->
P(),
304 xyz1.Z() + r * p->
Pz() / p->
P()};
305 double w1 = planeg.WireCoordinate(xyz1);
306 double t1 = detProp.ConvertXToTicks(xyz1.X(), planeID);
307 double w2 = planeg.WireCoordinate(xyz2);
308 double t2 = detProp.ConvertXToTicks(xyz2.X(), planeID);
309 TLine& l = view->
AddLine(w1, t1, w2, t2);
311 l.SetLineStyle(kDotted);
312 if (TMeV < 100) { l.SetLineColor(kGreen); }
313 else if (TMeV < 200) {
314 l.SetLineColor(kBlue);
317 l.SetLineColor(kRed);
342 std::vector<const simb::MCParticle*> plist;
346 int neutralColor(12);
348 int neutrinoColor(38);
355 <<
"Starting loop over " << plist.size() <<
" McParticles, voxel list size is " 356 << voxels.
size() << std::endl;
368 std::map<int, const simb::MCParticle*> trackToMcParticleMap;
371 double minPartEnergy(0.01);
373 for (
size_t p = 0; p < plist.size(); ++p) {
374 trackToMcParticleMap[plist[p]->TrackId()] = plist[p];
382 int pdgCode(mcPart->
PdgCode());
384 TParticlePDG* partPDG(TDatabasePDG::Instance()->
GetParticle(pdgCode));
385 double partCharge = partPDG ? partPDG->Charge() : 0.;
386 double partEnergy = mcPart->
E();
390 if (!mcTraj.
empty() && partEnergy > minPartEnergy && mcPart->
TrackId() < 100000000) {
391 double g4Ticks(clockData.TPCG4Time2Tick(mcPart->
T()) -
trigger_offset(clockData));
393 double xPosMinTick = 0.;
394 double xPosMaxTick = std::numeric_limits<double>::max();
397 int numTrajPoints = mcTraj.
size();
399 std::unique_ptr<double[]> hitPositions(
new double[3 * numTrajPoints]);
402 for (
int hitIdx = 0; hitIdx < numTrajPoints; hitIdx++) {
403 double xPos = mcTraj.
X(hitIdx);
404 double yPos = mcTraj.
Y(hitIdx);
405 double zPos = mcTraj.
Z(hitIdx);
416 xPosMinTick = detProp.ConvertTicksToX(0, planeID);
417 xPosMaxTick = detProp.ConvertTicksToX(detProp.NumberTimeSamples(), planeID);
418 xOffset = detProp.ConvertTicksToX(g4Ticks, planeID) - xPosMinTick;
420 if (xPosMaxTick < xPosMinTick) std::swap(xPosMinTick, xPosMaxTick);
430 if (xPos > xPosMinTick && xPos < xPosMaxTick) {
440 hitPositions[3 * hitCount] = xPos;
441 hitPositions[3 * hitCount + 1] = yPos;
442 hitPositions[3 * hitCount + 2] = zPos;
450 if (partCharge == 0.) {
451 pl.SetLineColor(neutralColor);
455 pl.SetPolyLine(hitCount, hitPositions.get(),
"");
461 std::map<const simb::MCParticle*, std::vector<std::vector<double>>> partToPosMap;
464 for (vxitr = voxels.
begin(); vxitr != voxels.
end(); vxitr++) {
469 int trackId = vxd.
TrackID(partIdx);
474 partToPosMap[mcPart].push_back(std::vector<double>(3));
476 partToPosMap[mcPart].back()[0] = vxd.
VoxelID().
X();
477 partToPosMap[mcPart].back()[1] = vxd.
VoxelID().
Y();
478 partToPosMap[mcPart].back()[2] = vxd.
VoxelID().
Z();
485 std::map<const simb::MCParticle*, std::vector<std::vector<double>>>
::iterator partToPosMapItr;
487 for (partToPosMapItr = partToPosMap.begin(); partToPosMapItr != partToPosMap.end();
493 if (!mcPart || partToPosMapItr->second.empty())
continue;
495 double g4Ticks(clockData.TPCG4Time2Tick(mcPart->
T()) -
trigger_offset(clockData));
497 double xPosMinTick = 0.;
498 double xPosMaxTick = std::numeric_limits<double>::max();
501 int markerIdx(kFullDotSmall);
505 colorIdx = grayedColor;
510 std::unique_ptr<double[]> hitPositions(
new double[3 * partToPosMapItr->second.size()]);
514 for (
size_t posIdx = 0; posIdx < partToPosMapItr->second.size(); posIdx++) {
515 const std::vector<double>& posVec = partToPosMapItr->second[posIdx];
518 geo::Point_t hitLocation(posVec[0], posVec[1], posVec[2]);
524 xPosMinTick = detProp.ConvertTicksToX(0, planeID);
525 xPosMaxTick = detProp.ConvertTicksToX(detProp.NumberTimeSamples(), planeID);
526 xOffset = detProp.ConvertTicksToX(g4Ticks, planeID) - xPosMinTick;
528 if (xPosMaxTick < xPosMinTick) std::swap(xPosMinTick, xPosMaxTick);
534 double xCoord = posVec[0] + xOffset;
538 if (xCoord > xPosMinTick && xCoord < xPosMaxTick) {
539 hitPositions[3 * hitCount] = xCoord;
540 hitPositions[3 * hitCount + 1] = posVec[1];
541 hitPositions[3 * hitCount + 2] = posVec[2];
546 TPolyMarker3D& pm = view->
AddPolyMarker3D(1, colorIdx, markerIdx, markerSize);
547 pm.SetPolyMarker(hitCount, hitPositions.get(), markerIdx);
551 std::vector<const simb::MCTruth*> mctruth;
555 for (
unsigned int idx = 0; idx < mctruth.size(); idx++) {
557 for (
int particleIdx = 0; particleIdx < mctruth[idx]->NParticles(); particleIdx++) {
562 mf::LogDebug(
"SimulationDrawer") << mcPart << std::endl;
565 TVector3 particlePosition(mcPart.
Vx(), mcPart.
Vy(), mcPart.
Vz());
568 TVector3 oppPartDir(-mcPart.
Px(), -mcPart.
Py(), -mcPart.
Pz());
570 if (oppPartDir.Mag2() > 0.) oppPartDir.SetMag(1.);
572 double arcLenToDraw = -particlePosition.Z() / oppPartDir.CosTheta();
575 if (arcLenToDraw > 0.) {
577 TPolyLine3D& pl(view->
AddPolyLine3D(2, neutrinoColor, 1, 2));
579 pl.SetPoint(0, particlePosition.X(), particlePosition.Y(), particlePosition.Z());
581 particlePosition += std::min(arcLenToDraw + 10., 1000.) * oppPartDir;
583 pl.SetPoint(1, particlePosition.X(), particlePosition.Y(), particlePosition.Z());
615 std::vector<const simb::MCParticle*> plist;
620 double xMinimum(-1. * (
maxx -
minx));
621 double xMaximum(2. * (
maxx -
minx));
630 <<
"Starting loop over " << plist.size() <<
" McParticles, voxel list size is " 631 << voxels.
size() << std::endl;
643 std::map<int, const simb::MCParticle*> trackToMcParticleMap;
646 bool displayMcTrajectories(
true);
647 double minPartEnergy(0.025);
649 double tpcminx = 1.0;
650 double tpcmaxx = -1.0;
651 double xOffset = 0.0;
652 double g4Ticks = 0.0;
654 double readoutwindowsize = 0.0;
655 for (
size_t p = 0; p < plist.size(); ++p) {
656 trackToMcParticleMap[plist[p]->TrackId()] = plist[p];
659 if (displayMcTrajectories) {
664 int pdgCode(mcPart->
PdgCode());
665 TParticlePDG* partPDG(TDatabasePDG::Instance()->
GetParticle(pdgCode));
666 double partCharge = partPDG ? partPDG->Charge() : 0.;
667 double partEnergy = mcPart->
E();
669 if (!mcTraj.
empty() && partEnergy > minPartEnergy && mcPart->
TrackId() < 100000000) {
671 int numTrajPoints = mcTraj.
size();
673 std::unique_ptr<double[]> hitPosX(
new double[numTrajPoints]);
674 std::unique_ptr<double[]> hitPosY(
new double[numTrajPoints]);
675 std::unique_ptr<double[]> hitPosZ(
new double[numTrajPoints]);
678 double xPos = mcTraj.
X(0);
679 double yPos = mcTraj.
Y(0);
680 double zPos = mcTraj.
Z(0);
687 readoutwindowsize = 0.0;
688 for (
int hitIdx = 0; hitIdx < numTrajPoints; hitIdx++) {
689 xPos = mcTraj.
X(hitIdx);
690 yPos = mcTraj.
Y(hitIdx);
691 zPos = mcTraj.
Z(hitIdx);
694 if (xPos < minx || xPos >
maxx || yPos < miny || yPos >
maxy || zPos <
minz ||
698 if ((xPos < tpcminx) || (xPos > tpcmaxx)) {
704 unsigned int tpc = tpcid.
TPC;
706 tpcminx = tpcgeo.
MinX();
707 tpcmaxx = tpcgeo.
MaxX();
709 coeff = detProp.GetXTicksCoefficient(tpc, cryo);
711 detProp.ConvertTicksToX(detProp.ReadOutWindowSize(), 0, tpc, cryo);
716 g4Ticks = clockData.TPCG4Time2Tick(mcPart->
T()) +
717 detProp.GetXTicksOffset(0, tpc, cryo) -
trigger_offset(clockData);
719 xOffset = detProp.ConvertTicksToX(g4Ticks, 0, tpc, cryo);
726 readoutwindowsize = 0.0;
733 bool inreadoutwindow =
false;
735 if ((xPos > readoutwindowsize) && (xPos < tpcmaxx)) inreadoutwindow =
true;
737 else if (coeff > 0) {
738 if ((xPos > tpcminx) && (xPos < readoutwindowsize)) inreadoutwindow =
true;
741 if (!inreadoutwindow)
continue;
744 if (xPos > xMinimum && xPos < xMaximum) {
745 hitPosX[hitCount] = xPos;
746 hitPosY[hitCount] = yPos;
747 hitPosZ[hitCount] = zPos;
756 if (partCharge == 0.) {
763 pl.SetPolyLine(hitCount, hitPosX.get(), hitPosY.get(),
"");
765 pl.SetPolyLine(hitCount, hitPosZ.get(), hitPosX.get(),
"");
767 pl.SetPolyLine(hitCount, hitPosZ.get(), hitPosY.get(),
"");
773 std::map<const simb::MCParticle*, std::vector<std::vector<double>>> partToPosMap;
776 for (vxitr = voxels.
begin(); vxitr != voxels.
end(); vxitr++) {
781 int trackId = vxd.
TrackID(partIdx);
786 partToPosMap[mcPart].push_back(std::vector<double>(3));
788 partToPosMap[mcPart].back()[0] = vxd.
VoxelID().
X();
789 partToPosMap[mcPart].back()[1] = vxd.
VoxelID().
Y();
790 partToPosMap[mcPart].back()[2] = vxd.
VoxelID().
Z();
797 std::map<const simb::MCParticle*, std::vector<std::vector<double>>>
::iterator partToPosMapItr;
799 for (partToPosMapItr = partToPosMap.begin(); partToPosMapItr != partToPosMap.end();
805 if (!mcPart || partToPosMapItr->second.empty())
continue;
811 std::vector<std::array<double, 3>> posVecCorr;
812 posVecCorr.reserve(partToPosMapItr->second.size());
814 readoutwindowsize = 0.0;
817 for (
size_t posIdx = 0; posIdx < partToPosMapItr->second.size(); posIdx++) {
818 const std::vector<double>& posVec = partToPosMapItr->second[posIdx];
820 if ((posVec[0] < tpcminx) || (posVec[0] > tpcmaxx)) {
821 geo::Point_t const vtx{posVec[0], posVec[1], posVec[2]};
826 unsigned int tpc = tpcid.
TPC;
829 tpcminx = tpcgeo.
MinX();
830 tpcmaxx = tpcgeo.
MaxX();
832 coeff = detProp.GetXTicksCoefficient(tpc, cryo);
833 readoutwindowsize = detProp.ConvertTicksToX(detProp.ReadOutWindowSize(), 0, tpc, cryo);
837 g4Ticks = clockData.TPCG4Time2Tick(mcPart->
T()) +
838 detProp.GetXTicksOffset(0, tpc, cryo) -
trigger_offset(clockData);
840 xOffset = detProp.ConvertTicksToX(g4Ticks, 0, tpc, cryo);
847 readoutwindowsize = 0.0;
851 double xCoord = posVec[0] + xOffset;
853 bool inreadoutwindow =
false;
855 if ((xCoord > readoutwindowsize) && (xCoord < tpcmaxx)) inreadoutwindow =
true;
857 else if (coeff > 0) {
858 if ((xCoord > tpcminx) && (xCoord < readoutwindowsize)) inreadoutwindow =
true;
861 if (inreadoutwindow && (xCoord > xMinimum && xCoord < xMaximum)) {
862 posVecCorr.push_back({{xCoord, posVec[1], posVec[2]}});
871 for (
size_t p = 0; p < posVecCorr.size(); ++p) {
873 pm.SetPoint(p, posVecCorr[p][0], posVecCorr[p][1]);
875 pm.SetPoint(p, posVecCorr[p][2], posVecCorr[p][0]);
877 pm.SetPoint(p, posVecCorr[p][2], posVecCorr[p][1]);
886 std::vector<const simb::MCParticle*>& plist)
894 std::vector<const simb::MCParticle*> temp;
900 for (
unsigned int i = 0; i < plcol.
vals().size(); ++i) {
901 temp.push_back(plcol.
vals().at(i));
906 writeErrMsg(
"GetRawDigits", e);
920 std::vector<const simb::MCTruth*> temp;
922 std::vector<art::Handle<std::vector<simb::MCTruth>>> mctcol;
926 mctcol = evt.
getMany<std::vector<simb::MCTruth>>();
927 for (
size_t mctc = 0; mctc < mctcol.size(); ++mctc) {
930 for (
size_t i = 0; i < mclistHandle->size(); ++i) {
931 temp.push_back(&(mclistHandle->at(i)));
937 writeErrMsg(
"GetMCTruth", e);
std::map< int, bool > fHighlite
double E(const int i=0) const
double Z(const size_type i) const
double X(const size_type i) const
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
cout<< "Opened file "<< fin<< " ixs= "<< ixs<< endl;if(ixs==0) hhh=(TH1F *) fff-> Get("h1")
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 the physical 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.
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