227 std::vector<std::vector<unsigned int>> slHitsVec;
229 std::vector<int> slcIDs;
231 std::vector<art::Ptr<recob::Slice>>
slices;
232 unsigned int nInputHits = 0;
236 nInputHits = (*inputHits).size();
247 for(
size_t isl = 0; isl < slices.size(); ++isl) {
250 float zlo = slices[isl]->End0Pos().Z();
251 if(slices[isl]->End1Pos().
Z() < zlo) zlo = slices[isl]->End1Pos().Z();
252 auto sepVec = slices[isl]->End0Pos() - slices[isl]->End1Pos();
253 float len = sqrt(sepVec.Mag2());
256 std::cout<<
"Beam slice "<<slices[isl]->ID();
257 std::cout<<
" Direction "<<slices[isl]->Direction().X()<<
" "<<slices[isl]->Direction().Y()<<
" "<<slices[isl]->Direction().Z();
258 std::cout<<
" AspectRatio "<<std::setprecision(2)<<slices[isl]->AspectRatio();
259 std::cout<<
" Length "<<(int)len;
262 if(!isBeam)
continue;
264 auto& hit_in_slc = hitFromSlc.at(isl);
265 if(hit_in_slc.size() < 3)
continue;
266 std::vector<unsigned int> slhits(hit_in_slc.size());
267 unsigned int indx = 0;
269 for(
auto&
hit : hit_in_slc) {
270 if(
hit.key() > nInputHits - 1)
throw cet::exception(
"TrajClusterModule")<<
"Found an invalid slice index "<<
hit.key()<<
" to the input hit collection of size "<<nInputHits<<
"\n";
271 slhits[indx] =
hit.key();
274 if(slhits.size() < 3)
continue;
275 slHitsVec.push_back(slhits);
276 slcIDs.push_back(slices[isl]->ID());
282 slHitsVec[0].resize(nInputHits);
283 for(
unsigned int iht = 0; iht < nInputHits; ++iht) slHitsVec[0][iht] = iht;
289 if(geom->
NTPC() > 1) {
290 std::vector<std::vector<unsigned int>> tpcSlcHitsVec;
291 std::vector<int> tpcSlcIDs;
292 for(
unsigned short isl = 0; isl < slHitsVec.size(); ++isl) {
293 auto& slhits = slHitsVec[isl];
294 if(slhits.size() < 2)
continue;
296 std::vector<std::vector<unsigned int>> tpcHits;
298 std::vector<unsigned short> tpcNum;
299 for(
auto iht : slhits) {
300 auto&
hit = (*inputHits)[iht];
301 unsigned short tpc =
hit.WireID().TPC;
302 unsigned short tpcIndex = 0;
303 for(tpcIndex = 0; tpcIndex < tpcNum.size(); ++tpcIndex)
if(tpcNum[tpcIndex] == tpc)
break;
304 if(tpcIndex == tpcNum.size()) {
306 tpcHits.resize(tpcIndex + 1);
307 tpcNum.push_back(tpc);
309 tpcHits[tpcIndex].push_back(iht);
311 for(
auto& tHits : tpcHits) {
312 tpcSlcHitsVec.push_back(tHits);
313 tpcSlcIDs.push_back(slcIDs[isl]);
317 slHitsVec = tpcSlcHitsVec;
323 std::vector<simb::MCParticle*> mcpList;
325 std::vector<unsigned int> mcpListIndex((*inputHits).size(), UINT_MAX);
340 auto& p = (*ipart).second;
343 int KE = 1000 * (p->E() - p->Mass());
344 if(!anySource && theTruth->
Origin() !=
origin)
continue;
345 if(
tca::tcc.matchTruth[1] > 1 && KE > 10 && p->Process() ==
"primary") {
346 std::cout<<
"TCM: mcp Origin "<<theTruth->
Origin()
347 <<std::setw(8)<<p->TrackId()
348 <<
" pdg "<<p->PdgCode()
349 <<std::setw(7)<<KE<<
" mom "<<p->Mother()
353 mcpList.push_back(p);
355 std::vector<art::Ptr<simb::MCParticle>> particle_vec;
356 std::vector<anab::BackTrackerHitMatchingData const*> match_vec;
357 unsigned int nMatHits = 0;
358 for(
unsigned int iht = 0; iht < (*inputHits).size(); ++iht) {
359 particle_vec.clear(); match_vec.clear();
360 try{ particles_per_hit.get(iht, particle_vec, match_vec); }
362 std::cout<<
"BackTrackerHitMatchingData not found\n";
365 if(particle_vec.empty())
continue;
367 for(
unsigned short im = 0; im < match_vec.size(); ++im) {
368 if(match_vec[im]->ideFraction < 0.5)
continue;
369 trackID = particle_vec[im]->TrackId();
372 if(trackID == 0)
continue;
375 auto& mcp = mcpList[
ipart];
376 if(mcp->TrackId() != trackID)
continue;
377 mcpListIndex[iht] =
ipart;
382 if(
tca::tcc.matchTruth[1] > 1) std::cout<<
"Loaded "<<mcpList.size()<<
" MCParticles. "<<nMatHits<<
"/"<<(*inputHits).size()<<
" hits are matched to MCParticles\n";
386 for(
unsigned short isl = 0; isl < slHitsVec.size(); ++isl) {
387 auto& slhits = slHitsVec[isl];
390 std::vector<HitLoc> sortVec(slhits.size());
392 for(
unsigned short indx = 0; indx < slhits.size(); ++indx) {
393 if(slhits[indx] > nInputHits - 1) {
397 auto&
hit = (*inputHits)[slhits[indx]];
398 sortVec[indx].index = indx;
400 sortVec[indx].wire =
hit.WireID().Wire;
401 sortVec[indx].tick =
hit.StartTick();
402 sortVec[indx].localIndex =
hit.LocalIndex();
405 std::cout<<
"TrajCluster found an invalid slice reference to the input hit collection. Ignoring this slice.\n";
408 std::sort(sortVec.begin(), sortVec.end(),
SortHits);
412 for(
unsigned short ii = 0; ii < slhits.size(); ++ii) slhits[ii] = tmp[sortVec[ii].index];
417 for(
unsigned short indx = 0; indx < slhits.size(); ++indx) {
418 auto&
hit = (*inputHits)[slhits[indx]];
423 std::cout<<
"Debug hit "<<slhits[indx]<<
" found in sub-slice index "<<isl;
433 fTCAlg->RunTrajClusterAlg(slhits, slcIDs[isl]);
439 if(!mcpListIndex.empty()) {
440 fTCAlg->fTM.MatchTruth(mcpList, mcpListIndex);
447 std::vector<recob::Hit> hitCol;
448 std::vector<recob::Cluster> clsCol;
449 std::vector<recob::PFParticle> pfpCol;
450 std::vector<recob::Vertex> vx3Col;
451 std::vector<recob::EndPoint2D> vx2Col;
452 std::vector<recob::Seed> sedCol;
453 std::vector<recob::Shower> shwCol;
454 std::vector<anab::CosmicTag> ctCol;
456 std::vector<unsigned int> newIndex(nInputHits, UINT_MAX);
460 std::unique_ptr<art::Assns<recob::Cluster, recob::Hit>>
463 std::unique_ptr<art::Assns<recob::Cluster, recob::EndPoint2D, unsigned short>>
465 std::unique_ptr<art::Assns<recob::Cluster, recob::Vertex, unsigned short>>
468 std::unique_ptr<art::Assns<recob::Shower, recob::Hit>>
471 std::unique_ptr<art::Assns<recob::PFParticle, recob::Cluster>>
473 std::unique_ptr<art::Assns<recob::PFParticle, recob::Shower>>
475 std::unique_ptr<art::Assns<recob::PFParticle, recob::Vertex>>
477 std::unique_ptr<art::Assns<recob::PFParticle, anab::CosmicTag>>
479 std::unique_ptr<art::Assns<recob::PFParticle, recob::Seed>>
482 std::unique_ptr<art::Assns<recob::Slice, recob::Cluster>>
484 std::unique_ptr<art::Assns<recob::Slice, recob::PFParticle>>
486 std::unique_ptr<art::Assns<recob::Slice, recob::Hit>>
489 std::unique_ptr<art::Assns<recob::SpacePoint, recob::Hit>>
495 unsigned short slIndx;
497 unsigned short vxColIndx;
499 std::vector<slcVxStruct> vx2StrList;
501 std::vector<slcVxStruct> vx3StrList;
505 unsigned short nSlices =
fTCAlg->GetSlicesSize();
507 unsigned int hitColBeginIndex = 0;
508 for(
unsigned short isl = 0; isl < nSlices; ++isl) {
509 unsigned short slcIndex = 0;
510 if(!slices.empty()) {
511 for(slcIndex = 0; slcIndex < slices.size(); ++slcIndex)
if(slices[slcIndex]->ID() == slcIDs[isl])
break;
512 if(slcIndex == slices.size())
continue;
514 auto& slc =
fTCAlg->GetSlice(isl);
516 if(!slc.isValid)
continue;
518 for(
auto& vx2 : slc.vtxs) {
519 if(vx2.ID <= 0)
continue;
520 unsigned int vtxID = vx2.UID;
521 unsigned int wire = std::nearbyint(vx2.Pos[0]);
536 tmp.vxColIndx = vx2Col.size() - 1;
537 vx2StrList.push_back(tmp);
541 for(
auto& vx3 : slc.vtx3s) {
542 if(vx3.ID <= 0)
continue;
544 if(vx3.Wire >= 0)
continue;
545 unsigned int vtxID = vx3.UID;
550 vx3Col.emplace_back(xyz, vtxID);
556 tmp.vxColIndx = vx3Col.size() - 1;
557 vx3StrList.push_back(tmp);
561 for(
auto& tj : slc.tjs) {
563 hitColBeginIndex = hitCol.size();
564 for(
unsigned short ipt = tj.EndPt[0]; ipt <= tj.EndPt[1]; ++ipt) {
565 auto& tp = tj.Pts[ipt];
566 if(tp.Chg <= 0)
continue;
568 std::vector<unsigned int> tpHits;
569 for(
unsigned short ii = 0; ii < tp.Hits.size(); ++ii) {
570 if(!tp.UseHit[ii])
continue;
571 if(tp.Hits[ii] > slc.slHits.size() - 1) {
574 unsigned int allHitsIndex = slc.slHits[tp.Hits[ii]].allHitsIndex;
575 if(allHitsIndex > nInputHits - 1) {
578 tpHits.push_back(allHitsIndex);
579 if(newIndex[allHitsIndex] != UINT_MAX) {
580 std::cout<<
"Bad Slice "<<isl<<
" tp.Hits "<<tp.Hits[ii]<<
" allHitsIndex "<<allHitsIndex;
581 std::cout<<
" old newIndex "<<newIndex[allHitsIndex];
582 auto& oldhit = (*inputHits)[allHitsIndex];
583 std::cout<<
" old "<<oldhit.WireID().Plane<<
":"<<oldhit.WireID().Wire<<
":"<<(int)oldhit.PeakTime();
584 auto& newhit = hitCol[newIndex[allHitsIndex]];
585 std::cout<<
" new "<<newhit.WireID().Plane<<
":"<<newhit.WireID().Wire<<
":"<<(int)newhit.PeakTime();
586 std::cout<<
" hitCol size "<<hitCol.size();
598 for(
auto iht : tpHits) {
599 hitCol.push_back((*inputHits)[iht]);
600 newIndex[iht] = hitCol.size() - 1;
603 fTCAlg->MergeTPHits(tpHits, hitCol, newIndex);
606 if(hitCol.empty())
continue;
610 for(
unsigned short indx = hitColBeginIndex; indx < hitCol.size(); ++indx) {
611 auto&
hit = hitCol[indx];
612 sumChg +=
hit.Integral();
613 sumADC +=
hit.SummedADC();
614 if(!slices.empty() && !
util::CreateAssn(*
this, evt, hitCol, slices[slcIndex], *slc_hit_assn, indx)) {
618 geo::View_t view = hitCol[hitColBeginIndex].View();
619 auto& firstTP = tj.Pts[tj.EndPt[0]];
620 auto& lastTP = tj.Pts[tj.EndPt[1]];
625 unsigned short nclhits = hitCol.size() - hitColBeginIndex + 1;
653 if(!
util::CreateAssn(*
this, evt, clsCol, hitCol, *cls_hit_assn, hitColBeginIndex, hitCol.size()))
658 if(!slices.empty()) {
665 for(
unsigned short end = 0;
end < 2; ++
end) {
666 if(tj.VtxID[
end] <= 0)
continue;
667 for(
auto& vx2str : vx2StrList) {
668 if(vx2str.slIndx != isl)
continue;
669 if(vx2str.ID != tj.VtxID[
end])
continue;
673 auto& vx2 = slc.vtxs[tj.VtxID[
end] - 1];
675 for(
auto vx3str : vx3StrList) {
676 if(vx3str.slIndx != isl)
continue;
677 if(vx3str.ID != vx2.Vx3ID)
continue;
690 for(
auto& ss3 : slc.showers) {
691 if(ss3.ID <= 0)
continue;
699 TVector3
dir = {ss3.Dir[0], ss3.Dir[1], ss3.Dir[2]};
701 TVector3 dirErr = {ss3.DirErr[0], ss3.DirErr[1], ss3.DirErr[2]};
703 TVector3 pos = {ss3.Start[0], ss3.Start[1], ss3.Start[2]};
705 TVector3 posErr = {ss3.StartErr[0], ss3.StartErr[1], ss3.StartErr[2]};
711 shwCol.push_back(shower);
713 std::vector<unsigned int> shwHits(ss3.Hits.size());
714 for(
unsigned int iht = 0; iht < ss3.Hits.size(); ++iht) shwHits[iht] = newIndex[ss3.Hits[iht]];
715 if(!
util::CreateAssn(*
this, evt, *shwr_hit_assn, shwCol.size()-1, shwHits.begin(), shwHits.end()))
724 for(
unsigned short isl = 0; isl < nSlices; ++isl) {
725 unsigned short slcIndex = 0;
726 if(!slices.empty()) {
727 for(slcIndex = 0; slcIndex < slices.size(); ++slcIndex)
if(slices[slcIndex]->ID() == slcIDs[isl])
break;
728 if(slcIndex == slices.size())
continue;
730 auto& slc =
fTCAlg->GetSlice(isl);
732 if(!slc.isValid)
continue;
734 for(
size_t ipfp = 0; ipfp < slc.pfps.size(); ++ipfp) {
735 auto& pfp = slc.pfps[ipfp];
736 if(pfp.ID <= 0)
continue;
738 size_t self = pfpCol.size();
739 size_t offset =
self - ipfp;
740 size_t parentIndex = UINT_MAX;
741 if(pfp.ParentUID > 0) parentIndex = pfp.ParentUID + offset - 1;
742 std::vector<size_t> dtrIndices(pfp.DtrUIDs.size());
743 for(
unsigned short idtr = 0; idtr < pfp.DtrUIDs.size(); ++idtr) dtrIndices[idtr] = pfp.DtrUIDs[idtr] + offset - 1;
744 pfpCol.emplace_back(pfp.PDGCode,
self, parentIndex, dtrIndices);
745 double sp[] = {pfp.XYZ[0][0],pfp.XYZ[0][1],pfp.XYZ[0][2]};
746 double sd[] = {pfp.Dir[0][0],pfp.Dir[0][1],pfp.Dir[0][2]};
747 double spe[] = {0.,0.,0.};
748 double sde[] = {0.,0.,0.};
749 sedCol.emplace_back(sp,sd,spe,sde);
751 std::vector<unsigned int> clsIndices;
752 for(
auto tuid : pfp.TjUIDs) {
753 unsigned int clsIndex = 0;
754 for(clsIndex = 0; clsIndex < clsCol.size(); ++clsIndex)
if(abs(clsCol[clsIndex].ID()) == tuid)
break;
755 if(clsIndex == clsCol.size()) {
756 std::cout<<
"TrajCluster module invalid P"<<pfp.UID<<
" -> T"<<tuid<<
" -> cluster index \n";
759 clsIndices.push_back(clsIndex);
761 if(!
util::CreateAssn(*
this, evt, *pfp_cls_assn, pfpCol.size()-1, clsIndices.begin(), clsIndices.end()))
766 if(pfp.Vx3ID[0] > 0) {
767 for(
auto vx3str : vx3StrList) {
768 if(vx3str.slIndx != isl)
continue;
769 if(vx3str.ID != pfp.Vx3ID[0])
continue;
770 std::vector<unsigned short> indx(1, vx3str.vxColIndx);
771 if(!
util::CreateAssn(*
this, evt, *pfp_vx3_assn, pfpCol.size() - 1, indx.begin(), indx.end()))
779 if(!sedCol.empty()) {
780 if(!
util::CreateAssn(*
this, evt, pfpCol, sedCol, *pfp_sed_assn, sedCol.size()-1, sedCol.size(), pfpCol.size()-1))
786 if(!slices.empty()) {
793 if(pfp.PDGCode == 1111) {
794 std::vector<unsigned short> shwIndex(1, 0);
795 for(
auto& ss3 : slc.showers) {
796 if(ss3.ID <= 0)
continue;
797 if(ss3.PFPIndex == ipfp)
break;
800 if(shwIndex[0] < shwCol.size()) {
801 if(!
util::CreateAssn(*
this, evt, *pfp_shwr_assn, pfpCol.size()-1, shwIndex.begin(), shwIndex.end()))
809 std::vector<float> tempPt1, tempPt2;
810 tempPt1.push_back(-999);
811 tempPt1.push_back(-999);
812 tempPt1.push_back(-999);
813 tempPt2.push_back(-999);
814 tempPt2.push_back(-999);
815 tempPt2.push_back(-999);
817 if (!
util::CreateAssn(*
this, evt, pfpCol, ctCol, *pfp_cos_assn, ctCol.size()-1, ctCol.size())){
829 for(
unsigned int allHitsIndex = 0; allHitsIndex < nInputHits; ++allHitsIndex) {
830 if(newIndex[allHitsIndex] != UINT_MAX)
continue;
831 std::vector<unsigned int> oneHit(1, allHitsIndex);
832 fTCAlg->MergeTPHits(oneHit, hitCol, newIndex);
835 for(
size_t isl = 0; isl < slices.size(); ++isl) {
836 auto& hit_in_slc = hitFromSlc.at(isl);
837 for(
auto&
hit : hit_in_slc) {
838 if(
hit.key() != allHitsIndex)
continue;
853 for(
unsigned int allHitsIndex = 0; allHitsIndex < nInputHits; ++allHitsIndex) {
854 if(newIndex[allHitsIndex] != UINT_MAX)
continue;
855 std::vector<unsigned int> oneHit(1, allHitsIndex);
856 fTCAlg->MergeTPHits(oneHit, hitCol, newIndex);
862 if (nInputHits > 0) {
867 for (
unsigned int allHitsIndex = 0; allHitsIndex < nInputHits; ++allHitsIndex) {
868 if (newIndex[allHitsIndex] == UINT_MAX)
continue;
869 auto & sp_from_hit = spFromHit.at(allHitsIndex);
870 for (
auto& sp : sp_from_hit) {
872 if(!
util::CreateAssn(*
this, evt, hitCol, sp, *sp_hit_assn, newIndex[allHitsIndex])) {
884 std::unique_ptr<std::vector<recob::Hit> > hcol(
new std::vector<recob::Hit>(std::move(hitCol)));
885 std::unique_ptr<std::vector<recob::Cluster> > ccol(
new std::vector<recob::Cluster>(std::move(clsCol)));
886 std::unique_ptr<std::vector<recob::EndPoint2D> > v2col(
new std::vector<recob::EndPoint2D>(std::move(vx2Col)));
887 std::unique_ptr<std::vector<recob::Vertex> > v3col(
new std::vector<recob::Vertex>(std::move(vx3Col)));
888 std::unique_ptr<std::vector<recob::PFParticle> > pcol(
new std::vector<recob::PFParticle>(std::move(pfpCol)));
889 std::unique_ptr<std::vector<recob::Seed> > sdcol(
new std::vector<recob::Seed>(std::move(sedCol)));
890 std::unique_ptr<std::vector<recob::Shower> > scol(
new std::vector<recob::Shower>(std::move(shwCol)));
891 std::unique_ptr<std::vector<anab::CosmicTag>> ctgcol(
new std::vector<anab::CosmicTag>(std::move(ctCol)));
896 shcol.use_hits(std::move(hcol));
900 shcol.use_hits(std::move(hcol));
903 evt.
put(std::move(ccol));
904 evt.
put(std::move(cls_hit_assn));
905 evt.
put(std::move(v2col));
906 evt.
put(std::move(v3col));
907 evt.
put(std::move(scol));
908 evt.
put(std::move(sdcol));
909 evt.
put(std::move(shwr_hit_assn));
910 evt.
put(std::move(cls_vx2_assn));
911 evt.
put(std::move(cls_vx3_assn));
912 evt.
put(std::move(pcol));
913 evt.
put(std::move(pfp_cls_assn));
914 evt.
put(std::move(pfp_shwr_assn));
915 evt.
put(std::move(pfp_vx3_assn));
916 evt.
put(std::move(pfp_sed_assn));
917 evt.
put(std::move(slc_cls_assn));
918 evt.
put(std::move(slc_pfp_assn));
919 evt.
put(std::move(slc_hit_assn));
920 evt.
put(std::move(ctgcol));
921 evt.
put(std::move(pfp_cos_assn));
922 evt.
put(std::move(sp_hit_assn));
Expect tracks entering from the front face. Don't create neutrino PFParticles.
void set_start_point_err(const TVector3 &xyz_e)
void set_dedx_err(const std::vector< double > &q)
void set_direction_err(const TVector3 &dir_e)
const key_type & TrackId(const size_type) const
enum geo::_plane_proj View_t
Enumerate the possible plane projections.
list_type::const_iterator const_iterator
simb::Origin_t Origin() const
The data type to uniquely identify a Plane.
enum simb::_ev_origin Origin_t
event origin types
void set_total_energy(const std::vector< double > &q)
art::InputTag fSliceModuleLabel
CryostatID_t Cryostat
Index of cryostat.
void set_total_MIPenergy_err(const std::vector< double > &q)
std::vector< float > matchTruth
Match to MC truth.
bool SortHits(HitLoc const &h1, HitLoc const &h2)
void set_total_energy_err(const std::vector< double > &q)
static const SentryArgument_t Sentry
An instance of the sentry object.
ProductID put(std::unique_ptr< PROD > &&product)
void set_id(const int id)
unsigned int Hit
set to the hit index in evt.allHits if a Plane:Wire:Tick match is found
int Cryostat
Select Cryostat.
art::InputTag fHitModuleLabel
void set_direction(const TVector3 &dir)
bool dbgStp
debug stepping using debug.Cryostat, debug.TPC, etc
int Wire
Select hit Wire for debugging.
std::vector< float > testBeamCuts
float unitsPerTick
scale factor from Tick to WSE equivalent units
bool CreateAssnD(PRODUCER const &prod, art::Event &evt, art::Assns< T, U, D > &assn, size_t first_index, size_t second_index, typename art::Assns< T, U, D >::data_t &&data)
Creates a single one-to-one association with associated data.
void set_length(const double &l)
void set_open_angle(const double &a)
A class handling a collection of hits and its associations.
bool CreateAssn(PRODUCER const &prod, art::Event &evt, std::vector< T > const &a, art::Ptr< U > const &b, art::Assns< U, T > &assn, std::string a_instance, size_t indx=UINT_MAX)
Creates a single one-to-one association.
EventNumber_t event() const
const geo::GeometryCore * geom
PlaneID_t Plane
Index of the plane within its TPC.
Description of geometry of one entire detector.
void set_total_best_plane(const int q)
View_t View(geo::PlaneID const &pid) const
Returns the view (wire orientation) on the channels of specified TPC plane.
std::unique_ptr< tca::TrajClusterAlg > fTCAlg
void set_total_MIPenergy(const std::vector< double > &q)
std::vector< TCSlice > slices
Detector simulation of raw signals on wires.
art::InputTag fSpacePointModuleLabel
void PrintAll(std::string someText, const std::vector< simb::MCParticle * > &mcpList)
unsigned int NTPC(unsigned int cstat=0) const
Returns the total number of TPCs in the specified cryostat.
cet::coded_exception< errors::ErrorCodes, ExceptionDetail::translate > Exception
int Tick
Select hit PeakTime for debugging (< 0 for vertex finding)
bool getByLabel(std::string const &label, std::string const &productInstanceName, Handle< PROD > &result) const
geo::PlaneID DecodeCTP(CTP_t CTP)
CTP_t EncodeCTP(unsigned int cryo, unsigned int tpc, unsigned int plane)
const sim::ParticleList & ParticleList()
std::vector< evd::details::RawDigitInfo_t >::const_iterator end(RawDigitCacheDataClass const &cache)
ValidHandle< PROD > getValidHandle(InputTag const &tag) const
void set_start_point(const TVector3 &xyz)
void fill_ptr_vector(std::vector< Ptr< T >> &ptrs, H const &h)
TPCID_t TPC
Index of the TPC within its cryostat.
short recoSlice
only reconstruct the slice with ID (0 = all)
master switch for turning on debug mode
art::InputTag fHitTruthModuleLabel
constexpr Point origin()
Returns a origin position with a point of the specified type.
cet::coded_exception< error, detail::translate > exception
const art::Ptr< simb::MCTruth > & TrackIdToMCTruth_P(int const &id)
void set_dedx(const std::vector< double > &q)