33 #include "art_root_io/TFileService.h" 44 #define MAX_TRACKS 1000 57 void endJob()
override;
58 void beginRun(
const art::Run& run)
override;
61 void processEff(
const art::Event& evt,
bool& isFiducial);
64 std::vector<recob::Hit>
const& AllHits,
69 double& TotalRecoEnergy);
73 double& TempDistanceBetweenTracks,
74 double& TempAngleBetweenTracks,
75 double& TempCriteriaTwoTracks);
77 void FuncDistanceAndAngleBetweenTruthAndRecoTrack(
const simb::MCParticle*& MCparticle,
79 double& TempDistanceBetweenTruthAndRecoTrack,
80 double& TempAngleBeetweenTruthAndRecoTrack);
84 bool insideFV(
double vertex[4]);
86 void doEfficiencies();
96 double MCTruthMuonVertex[4];
104 double MCTruthMuonThetaXZ = 0;
105 double MCTruthMuonThetaYZ = 0;
108 int EventCounter = 0;
110 int CountMCTruthMuon = 0;
111 int CountRecoMuon = 0;
113 int CountGoodLeadingMuonTrack = 0;
114 int CountNoRecoTracks = 0;
115 int CountNoMuonTracks = 0;
116 int CountBadLeadingMuonTrack = 0;
117 int CountCompleteness = 0;
119 int CountTrackLengthTooShort = 0;
120 int CountTrackLengthTooLong = 0;
122 int CountBadLeadingMuonTrackAndOnlyOneMuonTrack = 0;
123 int CountBadLeadingMuonTrackButLeadingPlusSecondGood = 0;
124 int CountBadLeadingMuonTrackAndLeadingPlusSecondBad = 0;
126 int CountBadLeadingMuonTrackAndLeadingPlusSecondBadCompleteness = 0;
127 int CountBadLeadingMuonTrackAndLeadingPlusSecondBadPurity = 0;
128 int CountBadLeadingMuonTrackAndLeadingPlusSecondBadTrackTooShort = 0;
129 int CountBadLeadingMuonTrackAndLeadingPlusSecondBadTrackTooLong = 0;
131 int CountBadLeadingMuonTrackAndOnlyOneMuonTrackCompleteness = 0;
132 int CountBadLeadingMuonTrackAndOnlyOneMuonTrackPurity = 0;
133 int CountBadLeadingMuonTrackAndOnlyOneMuonTrackTrackTooShort = 0;
134 int CountBadLeadingMuonTrackAndOnlyOneMuonTrackTrackTooLong = 0;
139 int GoodEvents1MuonTrack = 0;
140 int GoodEvents2MuonTrack = 0;
141 int GoodEvents3MuonTrack = 0;
142 int GoodEvents4OrMoreMuonTrack = 0;
144 int BadEvents0MuonTrack = 0;
145 int BadEvents1MuonTrack = 0;
146 int BadEvents2MuonTrack = 0;
147 int BadEvents3MuonTrack = 0;
148 int BadEvents4OrMoreMuonTrack = 0;
270 int NThetaXZBins = 36;
271 int ThetaXZBinMin = 0;
272 int ThetaXZBinMax = 360;
274 int NThetaYZBins = 18;
275 int ThetaYZBinMin = -90;
276 int ThetaYZBinMax = 90;
278 int NSinThetaYZBins = 18;
279 int SinThetaYZBinMin = -1;
280 int SinThetaYZBinMax = 1;
282 int NCriteriaBins = 13;
283 double CriteriaBinMin = -0.25;
284 double CriteriaBinMax = 6.25;
286 int NRecoTracksBins = 19;
287 double RecoTracksBinMin = -0.25;
288 double RecoTracksBinMax = 9.25;
305 std::cout <<
"job begin..." << std::endl;
307 auto const*
geo = lar::providerFrom<geo::Geometry>();
317 auto const world = tpc.GetCenter();
318 if (minx > world.X() - tpc.HalfWidth()) minx = world.X() - tpc.HalfWidth();
319 if (maxx < world.X() + tpc.HalfWidth()) maxx = world.X() + tpc.HalfWidth();
320 if (miny > world.Y() - tpc.HalfHeight()) miny = world.Y() - tpc.HalfHeight();
321 if (maxy < world.Y() + tpc.HalfHeight()) maxy = world.Y() + tpc.HalfHeight();
322 if (minz > world.Z() - tpc.Length() / 2.) minz = world.Z() - tpc.Length() / 2.;
323 if (maxz < world.Z() + tpc.Length() / 2.) maxz = world.Z() + tpc.Length() / 2.;
333 std::cout <<
"Fiducial volume:" 342 gStyle->SetTitleOffset(1.3,
"Y");
346 tfs->make<TH1D>(
"h_Purity",
"All events: Purity vs. # events; Purity; # events", 60, 0, 1.2);
349 "h_Completeness",
"All events: Completeness vs # events; Completeness; # events", 60, 0, 1.2);
353 tfs->make<TH1D>(
"h_TrackRes",
354 "All events: L_{reco}/L_{truth} vs. # events; L_{reco}/L_{truth}; # events;",
361 "All events: Total reco energy (sum of all hits in all " 362 "tracks) vs. # events; E_{reco., tot.} [MeV]; # events",
369 "All events: truth muon length vs. # events; truth muon length [cm]; # events",
376 "All events: Vertex residuals vs. # events; #Delta vertex_{truth-teco} [cm]; # events",
383 "All events: Angular residuals vs. # events; #Delta#theta_{truth-reco} [#circ]; # events",
390 tfs->make<TH1D>(
"h_Efficiency_ThetaXZ",
391 "Muon reco efficiency vs. #theta_{XZ}; #theta_{XZ} [#circ]; Efficiency",
396 tfs->make<TH1D>(
"h_ThetaXZ_den",
397 "# generated muons vs. #theta_{XZ}; #theta_{XZ} [#circ]; # generated muons",
403 "# reconstructed muons vs. #theta_{XZ}; #theta_{XZ} [#circ]; # reconstructed muons",
410 "h_Efficiency_ThetaYZ",
411 "Muon reco efficiency vs. #theta_{YZ}; #theta_{YZ} [#circ]; Muon reco efficiency",
417 tfs->make<TH1D>(
"h_ThetaYZ_den",
418 "# generated muons vs. #theta_{YZ}; #theta_{YZ} [#circ]; # generated muons",
424 "# reconstructed muons vs. #theta_{YZ}; #theta_{YZ} [#circ]; # reconstructed muons",
431 "h_Efficiency_SinThetaYZ",
432 "Muon reco efficiency vs. sin(#theta_{YZ}); sin(#theta_{YZ}); Muon reco efficiency",
438 tfs->make<TH1D>(
"h_SinThetaYZ_den",
439 "# generated muons vs. sin(#theta_{YZ}); sin(#theta_{YZ}); # generated muons",
445 "# reconstructed muons vs. sin(#theta_{YZ}); sin(#theta_{YZ}); # reconstructed muons",
454 h_TruthLength->Sumw2();
455 h_VertexRes->Sumw2();
456 h_DirectionRes->Sumw2();
458 h_Efficiency_SinThetaYZ->Sumw2();
460 h_SinThetaYZ_num->Sumw2();
462 h_Efficiency_ThetaXZ->Sumw2();
463 h_ThetaXZ_den->Sumw2();
464 h_ThetaXZ_num->Sumw2();
466 h_Efficiency_ThetaYZ->Sumw2();
468 h_ThetaYZ_num->Sumw2();
473 "h_Efficiency_ThetaXZ_ThetaYZ",
474 "Muon reco efficiency: #theta_{XZ} vs. #theta_{YZ}; #theta_{XZ} [#circ]; #theta_{YZ} [#circ]",
484 "h_ThetaXZ_ThetaYZ_den",
485 "# generated muons: #theta_{XZ} vs. #theta_{YZ}; #theta_{XZ} [#circ]; #theta_{YZ} [#circ]",
495 "# reconstructed muons: #theta_{XZ} vs. #theta_{YZ}; " 496 "#theta_{XZ} [#circ]; #theta_{YZ} [#circ]",
506 tfs->make<TH2D>(
"h_FailedReconstruction_ThetaXZ_ThetaYZ",
507 "# failed reconstructions: #theta_{XZ} vs. #theta_{YZ}; #theta_{XZ} [#circ]; " 508 "#theta_{YZ} [#circ]",
519 tfs->make<TH2D>(
"h_Efficiency_ThetaXZ_SinThetaYZ",
520 "Muon reco efficiency: #theta_{XZ} vs. sin(#theta_{YZ}); #theta_{XZ} " 521 "[#circ]; sin(#theta_{YZ})",
531 "h_ThetaXZ_SinThetaYZ_den",
532 "# generated muons: #theta_{XZ} vs. sin(#theta_{YZ}); #theta_{XZ} [#circ]; sin(#theta_{YZ})",
542 tfs->make<TH2D>(
"h_ThetaXZ_SinThetaYZ_num",
543 "# reconstructed muons: #theta_{XZ} vs. sin(#theta_{YZ}); #theta_{XZ} " 544 "[#circ]; sin(#theta_{YZ}); #theta_{XZ} [#circ]; sin(#theta_{YZ})",
554 tfs->make<TH2D>(
"h_FailedReconstruction_ThetaXZ_SinThetaYZ",
555 "# failed reconstructions: #theta_{XZ} vs. sin(#theta_{YZ}); #theta_{XZ} " 556 "[#circ]; sin(#theta_{YZ})",
567 tfs->make<TH2D>(
"h_Efficiency_ThetaXZ_ThetaYZ_LeadingPlusSecond",
568 "Muon reco efficiency after stitching: #theta_{XZ} vs. #theta_{YZ}; " 569 "#theta_{XZ} [#circ]; #theta_{YZ} [#circ]",
579 tfs->make<TH2D>(
"h_ThetaXZ_ThetaYZ_LeadingPlusSecondOk",
580 "# reconstructed muons after stitching (failed before stitching): " 581 "#theta_{XZ} vs #theta_{YZ}; #theta_{XZ} [#circ]; #theta_{YZ} [#circ]",
591 tfs->make<TH2D>(
"h_ThetaXZ_ThetaYZ_LeadingPlusSecondOk_num",
592 "# reconstructed muons after stitching: #theta_{XZ} vs. #theta_{YZ}; " 593 "#theta_{XZ} [#circ]; #theta_{YZ} [#circ]",
604 tfs->make<TH2D>(
"h_Efficiency_ThetaXZ_SinThetaYZ_LeadingPlusSecond",
605 "Muon reco efficiency after stitching: #theta_{XZ} vs. sin(#theta_{YZ}); " 606 "#theta_{XZ} [#circ]; sin(#theta_{YZ})",
616 tfs->make<TH2D>(
"h_ThetaXZ_SinThetaYZ_LeadingPlusSecondOk",
617 "# reconstructed muons after stitching (failed before stitching): " 618 "#theta_{XZ} vs. sin(#theta_{YZ}); #theta_{XZ} [#circ]; sin(#theta_{YZ})",
628 tfs->make<TH2D>(
"h_ThetaXZ_SinThetaYZ_LeadingPlusSecondOk_num",
629 "# reconstructed muons after stitching: #theta_{XZ} vs. sin(#theta_{YZ}); " 630 "#theta_{XZ} [#circ]; sin(#theta_{YZ})",
641 tfs->make<TH2D>(
"h_Efficiency_ThetaXZ_ThetaYZ_DifferenceLeadingAndLeadingPlusSecond",
642 "Muon reco efficiency: difference before and after stitching: #theta_{XZ} " 643 "vs. #theta_{YZ}; #theta_{XZ} [#circ]; #theta_{YZ} [#circ]",
654 tfs->make<TH2D>(
"h_NoRecoTrackAtAll_ThetaXZ_SinThetaYZ",
655 "# events with no reco track at all: #theta_{XZ} vs. sin(#theta_{YZ}); " 656 "#theta_{XZ} [#circ]; sin(#theta_{YZ})",
666 tfs->make<TH2D>(
"h_NoMuonTrack_ThetaXZ_SinThetaYZ",
667 "# events with no muon track: #theta_{XZ} vs. sin(#theta_{YZ}); #theta_{XZ} " 668 "[#circ]; sin(#theta_{YZ})",
678 tfs->make<TH2D>(
"h_TrackTooShort_ThetaXZ_SinThetaYZ",
679 "# events with L_{reco}/L_{truth} < 75%: #theta_{XZ} vs. sin(#theta_{YZ}); " 680 "#theta_{XZ} [#circ]; sin(#theta_{YZ})",
690 tfs->make<TH2D>(
"h_TrackTooLong_ThetaXZ_SinThetaYZ",
691 "#events with L_{reco}/L_{truth} > 125%: #theta_{XZ} vs. sin(#theta_{YZ}); " 692 "#theta_{XZ} [#circ]; sin(#theta_{YZ})",
702 tfs->make<TH2D>(
"h_Completeness_ThetaXZ_SinThetaYZ",
703 "# events with Completeness < 50%: #theta_{XZ} vs. sin(#theta_{YZ}); " 704 "#theta_{XZ} [#circ]; sin(#theta_{YZ})",
714 tfs->make<TH2D>(
"h_Purity_ThetaXZ_SinThetaYZ",
715 "# events with Purity < 50%: #theta_{XZ} vs. sin(#theta_{YZ}); #theta_{XZ} " 716 "[#circ]; sin(#theta_{YZ})",
727 tfs->make<TH2D>(
"h_Criteria_NRecoTrack",
728 "Ratio: criteria vs. # reco tracks; Criteria; # reco tracks",
738 tfs->make<TH2D>(
"h_Criteria_NRecoTrack_num",
739 "# events: criteria vs. # reco tracks; Criteria; # reco tracks",
749 "Divider histogram; Criteria; # reco tracks",
760 tfs->make<TH2D>(
"h_Criteria_NMuonTrack",
761 "Ratio: criteria vs. # muon tracks; Criteria; # muon tracks",
771 tfs->make<TH2D>(
"h_Criteria_NMuonTrack_num",
772 "# events: criteria vs. # muon tracks; Criteria; # muon tracks",
782 "Divider histogram; Criteria; # muon tracks",
793 "h_NoMuonTrack_MaxTrackLength_PDGCode",
794 "Events with no muon track: L_{reco, max} vs. PDG Code; L_{reco} [cm]; PDG Code",
805 tfs->make<TH2D>(
"h_MuonTrackStitching_TrackRes_Completeness",
806 "All events: L_{reco}/L_{truth} (leading) vs. Completeness (leading); " 807 "L_{reco}/L_{truth} (leading); Completeness (leading)",
817 tfs->make<TH2D>(
"h_MuonTrackStitching_TrackResLeading_TrackResSecond",
818 "All events: L_{reco}/L_{truth} (leading) vs. L_{reco}/L_{truth} (second); " 819 "L_{reco}/L_{truth} (leading); L_{reco}/L_{truth} (second)",
829 tfs->make<TH2D>(
"h_MuonTrackStitching_Distance_Angle",
830 "All events: distance vs. angle b/w leading and second muon track; Distance " 831 "[cm]; Angle [#circ]",
841 tfs->make<TH2D>(
"h_MuonTrackStitching_TrackResSecondMuon_Angle",
842 "All events: L_{reco}/L_{truth} (second) vs. angle; L_{reco}/L_{truth} " 843 "(second); Angle [#circ]",
853 "h_MuonTrackStitching_CompletenessSecondMuon_Angle",
854 "All events: Completeness (second) vs. angle; Completeness (second); Angle [#circ]",
864 tfs->make<TH2D>(
"h_MuonTrackStitching_CriteriaTwoTracks_Angle",
865 "All events: CriteriaTwoTracks vs. angle; Criteria; Angle [#circ]",
876 tfs->make<TH2D>(
"h_MuonTrackStitching_FailedCriteria_TrackRes_Completeness",
877 "Bad events: L_{reco}/L_{truth} (leading) vs. Completeness (leading); " 878 "L_{reco}/L_{truth} (leading); Completeness (leading)",
888 tfs->make<TH2D>(
"h_MuonTrackStitching_FailedCriteria_Distance_Angle",
889 "Bad events: distance vs. angle b/w leading and second muon track; Distance " 890 "[cm]; Angle [#circ]",
900 tfs->make<TH2D>(
"h_MuonTrackStitching_FailedCriteria_TrackResLeading_TrackResSecond",
901 "Bad events: L_{reco}/L_{truth} (leading) vs. L_{reco}/L_{truth} (second); " 902 "L_{reco}/L_{truth} (leading); L_{reco}/L_{truth} (second)",
912 tfs->make<TH2D>(
"*h_MuonTrackStitching_FailedCriteria_CompletenessLeading_CompletenessSecond",
913 "Bad events: Completeness (leading) vs. Completeness (second); Completeness " 914 "(leading); Completeness (second)",
924 tfs->make<TH2D>(
"h_MuonTrackStitching_FailedCriteria_TrackResSecondMuon_Angle",
925 "Bad events: L_{reco}/L_{truth} (second) vs. angle; L_{reco}/L_{truth} " 926 "(second); Angle [#circ]",
936 "h_MuonTrackStitching_FailedCriteria_CompletenessSecondMuon_Angle",
937 "Bad events: Completeness (second) vs. angle; Completeness (second); Angle [#circ]",
947 tfs->make<TH2D>(
"h_MuonTrackStitching_FailedCriteria_CriteriaTwoTracks_Angle",
948 "Bad events: CriteriaTwoTracks vs. angle; Criteria; Angle [#circ]",
959 tfs->make<TH2D>(
"h_MuonTrackStitching_MatchedCriteria_TrackRes_Completeness",
960 "Good events: L_{reco}/L_{truth} (leading) vs. Completeness (leading); " 961 "L_{reco}/L_{truth} (leading); Completeness (leading)",
971 tfs->make<TH2D>(
"h_MuonTrackStitching_MatchedCriteria_Distance_Angle",
972 "Good events: distance vs. angle b/w leading and second muon track; Distance " 973 "[cm]; Angle [#circ]",
983 tfs->make<TH2D>(
"h_MuonTrackStitching_MatchedCriteria_TrackResLeading_TrackResSecond",
984 "Good events: L_{reco}/L_{truth} (leading) vs. L_{reco}/L_{truth} (second); " 985 "L_{reco}/L_{truth} (leading); L_{reco}/L_{truth} (second)",
995 tfs->make<TH2D>(
"h_MuonTrackStitching_MatchedCriteria_CriteriaTwoTracks_Angle",
996 "Good events: CriteriaTwoTracks vs. angle b/w leading and second muon track; " 997 "Criteria; Angle [#circ]",
1009 "h_MuonTrackStitching_FailedCriteriaButLeadingPlusSecondGood_TrackRes_Completeness",
1010 "Bad events but leading + second is good: L_{reco}/L_{truth} (leading) vs. Completeness " 1011 "(leading); L_{reco}/L_{truth} (leading); Completeness (leading)",
1022 tfs->make<TH2D>(
"h_MuonTrackStitching_FailedCriteriaButLeadingPlusSecondGood_Distance_Angle",
1023 "Bad events but leading + second is good: distance vs. angle b/w leading and " 1024 "second muon track; Distance [cm]; Angle [#circ]",
1035 "h_MuonTrackStitching_FailedCriteriaButLeadingPlusSecondGood_TrackResLeading_" 1037 "Bad events but leading + second is good: L_{reco}/L_{truth} (leading) vs. " 1038 "L_{reco}/L_{truth} (second); L_{reco}/L_{truth} (leading); L_{reco}/L_{truth} (second)",
1046 ->SetOption(
"colz");
1051 "h_MuonTrackStitching_FailedCriteriaAndLeadingPlusSecondBad_TrackRes_Completeness",
1052 "Bad events and leading + second is bad: L_{reco}/L_{truth} (leading) vs. Completeness " 1053 "(leading); L_{reco}/L_{truth} (leading); Completeness (leading)",
1064 tfs->make<TH2D>(
"h_MuonTrackStitching_FailedCriteriaAndLeadingPlusSecondBad_Distance_Angle",
1065 "Bad events and leading + second is bad: distance vs. angle b/w leading and " 1066 "second muon track; Distance [cm]; Angle [#circ]",
1077 "h_MuonTrackStitching_FailedCriteriaAndLeadingPlusSecondBad_TrackResLeading_TrackResSecond",
1078 "Bad events and leading + second is bad: L_{reco}/L_{truth} (leading) vs. " 1079 "L_{reco}/L_{truth} (second); L_{reco}/L_{truth} (leading); L_{reco}/L_{truth} (second)",
1087 ->SetOption(
"colz");
1097 mf::LogInfo(
"MuonTrackingEff") <<
"begin run..." << std::endl;
1104 bool isFiducial =
false;
1119 particle = ipar->second;
1121 if (particle->
Mother() ==
1123 const TLorentzVector& positionStart = particle->
Position(0);
1124 positionStart.GetXYZT(
1129 MCTruthMuonParticle = particle;
1132 sqrt(pow(particle->
Momentum().Px(), 2) + pow(particle->
Momentum().Py(), 2) +
1133 pow(particle->
Momentum().Pz(), 2));
1137 (180.0 / 3.14159) * atan(particle->
Momentum().Px() / particle->
Momentum().Pz());
1139 else if (particle->
Momentum().Pz() < 0 && particle->
Momentum().Px() >= 0) {
1141 180.0 + (180.0 / 3.14159) * atan(particle->
Momentum().Px() / particle->
Momentum().Pz());
1145 180.0 + (180.0 / 3.14159) * atan(particle->
Momentum().Px() / particle->
Momentum().Pz());
1147 else if (particle->
Momentum().Pz() >= 0 && particle->
Momentum().Px() < 0) {
1149 360.0 + (180.0 / 3.14159) * atan(particle->
Momentum().Px() / particle->
Momentum().Pz());
1156 double MCTruthLengthMuon =
truthLength(MCTruthMuonParticle);
1163 if (!isFiducial)
return;
1166 if (MCTruthMuonParticle) {
1180 int NMuonTracks = 0;
1184 std::vector<art::Ptr<recob::Track>> TrackList;
1186 int NRecoTracks = TrackList.size();
1188 if (NRecoTracks == 0) {
1189 MF_LOG_DEBUG(
"MuonTrackingEff") <<
"There are no reco tracks... bye";
1190 std::cout <<
"There are no reco tracks! MCTruthMuonThetaXZ: " << std::endl;
1203 MF_LOG_DEBUG(
"MuonTrackingEff") <<
"Found this many reco tracks " << NRecoTracks;
1207 double PurityLeadingMuon = 0.;
1208 double CompletenessLeadingMuon = 0.;
1209 double RecoLengthLeadingMuon = 0.;
1212 double RecoLengthSecondMuon = 0.;
1213 double CompletenessSecondMuon = 0.;
1214 double PuritySecondMuon = 0.;
1217 double tmpTotalRecoEnergy = 0.;
1219 double MaxLengthNoRecoMuon = 0;
1220 int PDGCodeMaxLengthNoRecoMuon = 0;
1224 std::vector<art::Ptr<recob::Hit>>
const& tmp_TrackHits = track_hits.at(0);
1225 std::vector<recob::Hit>
const& AllHits = tmp_TrackHits[0].parentAs<
std::vector>();
1227 auto const clockData =
1231 for (
int i = 0; i < NRecoTracks; i++) {
1233 std::vector<art::Ptr<recob::Hit>> TrackHits = track_hits.at(i);
1234 double tmpPurity = 0.;
1235 double tmpCompleteness = 0.;
1239 clockData, AllHits, TrackHits, particle, tmpPurity, tmpCompleteness, tmpTotalRecoEnergy);
1242 std::cout <<
"ERROR: Truth matcher didn't find a particle!" << std::endl;
1248 MaxLengthNoRecoMuon = track->
Length();
1249 PDGCodeMaxLengthNoRecoMuon = particle->
PdgCode();
1253 tmpCompleteness > 0 && tmpPurity > 0) {
1257 if (NMuonTracks == 1) {
1258 CompletenessLeadingMuon = tmpCompleteness;
1259 PurityLeadingMuon = tmpPurity;
1260 RecoLengthLeadingMuon = track->
Length();
1261 TrackLeadingMuon =
track;
1263 RecoMuonParticle = particle;
1266 if (NMuonTracks >= 2 && tmpCompleteness > CompletenessLeadingMuon) {
1268 CompletenessSecondMuon = CompletenessLeadingMuon;
1269 PuritySecondMuon = PurityLeadingMuon;
1270 RecoLengthSecondMuon = RecoLengthLeadingMuon;
1271 TrackSecondMuon = TrackLeadingMuon;
1273 CompletenessLeadingMuon = tmpCompleteness;
1274 PurityLeadingMuon = tmpPurity;
1275 RecoLengthLeadingMuon = track->
Length();
1276 TrackLeadingMuon =
track;
1278 RecoMuonParticle = particle;
1281 else if (NMuonTracks >= 2 && tmpCompleteness < CompletenessLeadingMuon &&
1282 tmpCompleteness > CompletenessSecondMuon) {
1283 CompletenessSecondMuon = tmpCompleteness;
1284 PuritySecondMuon = tmpPurity;
1285 RecoLengthSecondMuon = track->
Length();
1286 TrackSecondMuon =
track;
1296 if (RecoMuonParticle && MCTruthMuonParticle) {
1300 h_TrackRes->Fill(RecoLengthLeadingMuon / MCTruthLengthMuon);
1302 std::cout <<
"TrackLeadingMuon->Vertex().X(): " << TrackLeadingMuon->
Vertex().X()
1304 std::cout <<
"MCTruthMuonParticle->Vz(): " << MCTruthMuonParticle->
Vz() << std::endl;
1305 std::cout <<
" " << std::endl;
1307 double DistanceBetweenTruthAndRecoTrack;
1308 double AngleBetweenTruthAndRecoTrack;
1311 DistanceBetweenTruthAndRecoTrack,
1312 AngleBetweenTruthAndRecoTrack);
1314 h_VertexRes->Fill(DistanceBetweenTruthAndRecoTrack);
1318 CompletenessLeadingMuon);
1319 if (NMuonTracks >= 2) {
1320 double DistanceBetweenTracks;
1321 double AngleBetweenTracks;
1322 double CriteriaTwoTracks;
1326 DistanceBetweenTracks,
1331 RecoLengthLeadingMuon / MCTruthLengthMuon, RecoLengthSecondMuon / MCTruthLengthMuon);
1334 RecoLengthSecondMuon / MCTruthLengthMuon, AngleBetweenTracks);
1336 AngleBetweenTracks);
1341 if (CompletenessLeadingMuon < 0.5) {
1350 if (PurityLeadingMuon < 0.5) {
1359 if (RecoLengthLeadingMuon / MCTruthLengthMuon < 0.75) {
1368 if (RecoLengthLeadingMuon / MCTruthLengthMuon > 1.25) {
1396 if (CompletenessLeadingMuon < 0.5 || PurityLeadingMuon < 0.5 ||
1397 RecoLengthLeadingMuon / MCTruthLengthMuon < 0.75 ||
1398 RecoLengthLeadingMuon / MCTruthLengthMuon > 1.25) {
1404 RecoLengthLeadingMuon / MCTruthLengthMuon, CompletenessLeadingMuon);
1411 if (NMuonTracks >= 2) {
1412 double AngleBetweenTracks;
1413 double DistanceBetweenTracks;
1414 double CriteriaTwoTracks;
1417 DistanceBetweenTracks,
1421 if (AngleBetweenTracks > 160.) {
1422 std::cout <<
"EventCounter: " <<
EventCounter << std::endl;
1423 std::cout <<
"Angle b/w tracks: " << AngleBetweenTracks << std::endl;
1424 std::cout <<
"CriteriaTwoTracks: " << CriteriaTwoTracks << std::endl;
1425 std::cout <<
"CompletenessLeadingMuon: " << CompletenessLeadingMuon << std::endl;
1426 std::cout <<
"CompletenessSecondMuon: " << CompletenessSecondMuon << std::endl;
1427 std::cout <<
"PurityLeadingMuon: " << PurityLeadingMuon << std::endl;
1428 std::cout <<
"PuritySecondMuon: " << PuritySecondMuon << std::endl;
1429 std::cout <<
"TrackLeadingMuon: " << RecoLengthLeadingMuon / MCTruthLengthMuon
1431 std::cout <<
"TrackResSecondMuon: " << RecoLengthSecondMuon / MCTruthLengthMuon
1433 std::cout <<
"TrackID leading: " << TrackLeadingMuon->
ID() << std::endl;
1434 std::cout <<
"TrackID second: " << TrackSecondMuon->
ID() << std::endl;
1438 AngleBetweenTracks);
1440 RecoLengthLeadingMuon / MCTruthLengthMuon, RecoLengthSecondMuon / MCTruthLengthMuon);
1442 CompletenessLeadingMuon, CompletenessSecondMuon);
1444 RecoLengthSecondMuon / MCTruthLengthMuon, AngleBetweenTracks);
1446 CompletenessSecondMuon, AngleBetweenTracks);
1448 AngleBetweenTracks);
1449 if ((CompletenessLeadingMuon + CompletenessSecondMuon) >= 0.5 &&
1450 PurityLeadingMuon >= 0.5 && PuritySecondMuon >= 0.5 &&
1451 (RecoLengthLeadingMuon + RecoLengthSecondMuon) / MCTruthLengthMuon >= 0.75 &&
1452 (RecoLengthLeadingMuon + RecoLengthSecondMuon) / MCTruthLengthMuon <= 1.25) {
1459 RecoLengthLeadingMuon / MCTruthLengthMuon, CompletenessLeadingMuon);
1461 ->Fill(RecoLengthLeadingMuon / MCTruthLengthMuon,
1462 RecoLengthSecondMuon / MCTruthLengthMuon);
1464 DistanceBetweenTracks, AngleBetweenTracks);
1466 if ((CompletenessLeadingMuon + CompletenessSecondMuon) < 0.5 || PurityLeadingMuon < 0.5 ||
1467 PuritySecondMuon < 0.5 ||
1468 (RecoLengthLeadingMuon + RecoLengthSecondMuon) / MCTruthLengthMuon < 0.75 ||
1469 (RecoLengthLeadingMuon + RecoLengthSecondMuon) / MCTruthLengthMuon > 1.25) {
1473 RecoLengthLeadingMuon / MCTruthLengthMuon, CompletenessLeadingMuon);
1475 ->Fill(RecoLengthLeadingMuon / MCTruthLengthMuon,
1476 RecoLengthSecondMuon / MCTruthLengthMuon);
1478 DistanceBetweenTracks, AngleBetweenTracks);
1480 if ((CompletenessLeadingMuon + CompletenessSecondMuon) < 0.5) {
1483 if (PurityLeadingMuon < 0.5 || PuritySecondMuon < 0.5) {
1486 if ((RecoLengthLeadingMuon + RecoLengthSecondMuon) / MCTruthLengthMuon < 0.75) {
1489 if ((RecoLengthLeadingMuon + RecoLengthSecondMuon) / MCTruthLengthMuon > 1.25) {
1493 else if (NMuonTracks == 1) {
1495 if (CompletenessLeadingMuon < 0.5) {
1499 if (RecoLengthLeadingMuon / MCTruthLengthMuon < 0.75) {
1502 if (RecoLengthLeadingMuon / MCTruthLengthMuon > 1.25) {
1508 if (CompletenessLeadingMuon >= 0.5 && PurityLeadingMuon >= 0.5 &&
1509 RecoLengthLeadingMuon / MCTruthLengthMuon >= 0.75 &&
1510 RecoLengthLeadingMuon / MCTruthLengthMuon <= 1.25) {
1523 RecoLengthLeadingMuon / MCTruthLengthMuon, CompletenessLeadingMuon);
1530 if (NMuonTracks >= 2) {
1532 RecoLengthLeadingMuon / MCTruthLengthMuon, RecoLengthSecondMuon / MCTruthLengthMuon);
1534 double AngleBetweenTracks;
1535 double DistanceBetweenTracks;
1536 double CriteriaTwoTracks;
1539 DistanceBetweenTracks,
1543 AngleBetweenTracks);
1545 AngleBetweenTracks);
1550 if (!RecoMuonParticle && MCTruthMuonParticle) {
1562 static_cast<double>(PDGCodeMaxLengthNoRecoMuon));
1567 std::vector<recob::Hit>
const& AllHits,
1571 double& Completeness,
1572 double& TotalRecoEnergy)
1576 std::map<int, double> trkID_E;
1578 for (
size_t j = 0; j < track_hits.size(); ++j) {
1580 std::vector<sim::TrackIDE>
TrackIDs =
1589 for (
size_t k = 0; k < TrackIDs.size(); k++) {
1590 trkID_E[TrackIDs[k].trackID] +=
1596 double max_E = -999.0;
1597 double TotalEnergyTrack = 0.0;
1599 double PartialEnergyTrackID =
1605 if (!trkID_E.size()) {
1613 TotalEnergyTrack += ii->second;
1615 if ((ii->second) > max_E) {
1617 PartialEnergyTrackID = ii->second;
1619 TrackID = ii->first;
1630 if (TrackID < 0) {
return; }
1632 Purity = PartialEnergyTrackID / TotalEnergyTrack;
1635 TotalRecoEnergy = 0;
1638 for (
size_t l = 0; l < TrackIDs.size(); ++l) {
1639 if (TrackIDs[l].trackID == TrackID)
1640 TotalRecoEnergy += TrackIDs[l].energy;
1644 Completeness = PartialEnergyTrackID / TotalRecoEnergy;
1649 double& TempDistanceBetweenTracks,
1650 double& TempAngleBetweenTracks,
1651 double& TempCriteriaTwoTracks)
1654 TempDistanceBetweenTracks = sqrt(pow(Track1->
End().X() - Track2->
Vertex().X(), 2) +
1655 pow(Track1->
End().Y() - Track2->
Vertex().Y(), 2) +
1656 pow(Track1->
End().Z() - Track2->
Vertex().Z(), 2));
1657 TempAngleBetweenTracks = (180.0 / 3.14159) * Track1->
EndDirection<TVector3>().Angle(
1659 TempCriteriaTwoTracks = 1.;
1661 if (TempDistanceBetweenTracks > sqrt(pow(Track1->
End().X() - Track2->
End().X(), 2) +
1662 pow(Track1->
End().Y() - Track2->
End().Y(), 2) +
1663 pow(Track1->
End().Z() - Track2->
End().Z(), 2))) {
1664 TempDistanceBetweenTracks = sqrt(pow(Track1->
End().X() - Track2->
End().X(), 2) +
1665 pow(Track1->
End().Y() - Track2->
End().Y(), 2) +
1666 pow(Track1->
End().Z() - Track2->
End().Z(), 2));
1667 TempAngleBetweenTracks = 180. - (180.0 / 3.14159) * Track1->
EndDirection<TVector3>().Angle(
1669 TempCriteriaTwoTracks = 2.;
1672 if (TempDistanceBetweenTracks > sqrt(pow(Track1->
Vertex().X() - Track2->
End().X(), 2) +
1673 pow(Track1->
Vertex().Y() - Track2->
End().Y(), 2) +
1674 pow(Track1->
Vertex().Z() - Track2->
End().Z(), 2))) {
1675 TempDistanceBetweenTracks = sqrt(pow(Track1->
Vertex().X() - Track2->
End().X(), 2) +
1676 pow(Track1->
Vertex().Y() - Track2->
End().Y(), 2) +
1677 pow(Track1->
Vertex().Z() - Track2->
End().Z(), 2));
1678 TempAngleBetweenTracks = (180.0 / 3.14159) * Track1->
VertexDirection<TVector3>().Angle(
1680 TempCriteriaTwoTracks = 3.;
1683 if (TempDistanceBetweenTracks > sqrt(pow(Track1->
Vertex().X() - Track2->
Vertex().X(), 2) +
1685 pow(Track1->
Vertex().Z() - Track2->
Vertex().Z(), 2))) {
1686 TempDistanceBetweenTracks = sqrt(pow(Track1->
Vertex().X() - Track2->
Vertex().X(), 2) +
1689 TempAngleBetweenTracks = 180. - (180.0 / 3.14159) * Track1->
VertexDirection<TVector3>().Angle(
1691 TempCriteriaTwoTracks = 4.;
1698 double& TempDistanceBetweenTruthAndRecoTrack,
1699 double& TempAngleBeetweenTruthAndRecoTrack)
1701 TempDistanceBetweenTruthAndRecoTrack = sqrt(pow(Track->
Vertex().X() - MCparticle->
Vx(), 2) +
1702 pow(Track->
Vertex().Y() - MCparticle->
Vy(), 2) +
1703 pow(Track->
Vertex().Z() - MCparticle->
Vz(), 2));
1705 TempAngleBeetweenTruthAndRecoTrack = 0;
1714 if (!MCparticle)
return -999.0;
1716 std::vector<double> TPCLengthHits(numberTrajectoryPoints, 0);
1717 int FirstHit = 0, LastHit = 0;
1718 double TPCLength = 0.0;
1719 bool BeenInVolume =
false;
1721 for (
unsigned int MCHit = 0; MCHit < TPCLengthHits.size(); ++MCHit) {
1723 TPCLengthHits[MCHit] = sqrt(pow((MCparticle->
Vx(MCHit - 1) - MCparticle->
Vx(MCHit)), 2) +
1724 pow((MCparticle->
Vy(MCHit - 1) - MCparticle->
Vy(MCHit)), 2) +
1725 pow((MCparticle->
Vz(MCHit - 1) - MCparticle->
Vz(MCHit)), 2));
1728 if (tpcid.isValid) {
1730 if (!BeenInVolume) {
1731 BeenInVolume =
true;
1736 for (
int Hit = FirstHit + 1; Hit <= LastHit; ++Hit)
1737 TPCLength += TPCLengthHits[Hit];
1743 double x = vertex[0];
1744 double y = vertex[1];
1745 double z = vertex[2];
1753 std::cout << std::endl;
1755 std::cout <<
"EventCounter: " 1758 std::cout <<
"CountMCTruthMuon: " 1761 <<
"%" << std::endl;
1763 std::cout <<
"CountGoodLeadingMuonTrack (=good events): " 1767 <<
"%" << std::endl;
1769 std::cout <<
"CountBadLeadingMuonTrack+CountNoRecoTracks+CountNoMuonTracks (=bad events): " 1775 <<
"%" << std::endl;
1777 std::cout <<
"CountNoRecoTracks+CountNoMuonTracks: " 1781 <<
"%" << std::endl;
1783 std::cout <<
"CountTrackLengthTooShort: " 1787 <<
"%" << std::endl;
1789 std::cout <<
"CountCompleteness: " 1793 <<
"%" << std::endl;
1795 std::cout <<
"CountTrackLengthTooLong: " 1799 <<
"%" << std::endl;
1801 std::cout <<
"CountPurity: " 1804 <<
"%" << std::endl;
1806 std::cout << std::endl;
1808 std::cout <<
"GoodLeadingMuonTrack+CountBadLeadingMuonTrackButLeadingPlusSecondGood (=good " 1809 "events after stitching): " 1817 <<
"%" << std::endl;
1819 std::cout <<
"CountBadLeadingMuonTrack+CountNoRecoTracks+CountNoMuonTracks-" 1820 "CountBadLeadingMuonTrackButLeadingPlusSecondGood (=bad events after stitching) : " 1830 <<
"%" << std::endl;
1832 std::cout << std::endl;
1834 std::cout <<
"CountBadLeadingMuonTrackButLeadingPlusSecondGood: " 1838 <<
"%" << std::endl;
1840 std::cout <<
"CountBadLeadingMuonTrackAndOnlyOneMuonTrack: " 1844 <<
"%" << std::endl;
1846 std::cout <<
"CountBadLeadingMuonTrackAndLeadingPlusSecondBad: " 1850 <<
"%" << std::endl;
1852 std::cout <<
"CountNoRecoTracks: " 1856 <<
"%" << std::endl;
1858 std::cout <<
"CountNoMuonTracks: " 1862 <<
"%" << std::endl;
1864 std::cout << std::endl;
1866 std::cout <<
"CountBadLeadingMuonTrackAndOnlyOneMuonTrackCompleteness: " 1868 std::cout <<
"CountBadLeadingMuonTrackAndOnlyOneMuonTrackPurity: " 1870 std::cout <<
"CountBadLeadingMuonTrackAndOnlyOneMuonTrackTrackTooShort: " 1872 std::cout <<
"CountBadLeadingMuonTrackAndOnlyOneMuonTrackTrackTooLong: " 1875 std::cout << std::endl;
1877 std::cout <<
"CountBadLeadingMuonTrackAndLeadingPlusSecondBadCompleteness: " 1880 static_cast<double>(
1883 <<
"%" << std::endl;
1885 std::cout <<
"CountBadLeadingMuonTrackAndLeadingPlusSecondBadPurity: " 1889 <<
"%" << std::endl;
1891 std::cout <<
"CountBadLeadingMuonTrackAndLeadingPlusSecondBadTrackTooShort: " 1894 static_cast<double>(
1897 <<
"%" << std::endl;
1899 std::cout <<
"CountBadLeadingMuonTrackAndLeadingPlusSecondBadTrackTooLong: " 1902 static_cast<double>(
1905 <<
"%" << std::endl;
1907 std::cout << std::endl;
TH2D * h_MuonTrackStitching_TrackRes_Completeness
TH2D * h_NoRecoTrackAtAll_ThetaXZ_SinThetaYZ
TH2D * h_NoMuonTrack_ThetaXZ_SinThetaYZ
TH2D * h_Completeness_ThetaXZ_SinThetaYZ
void beginRun(const art::Run &run) override
int CountBadLeadingMuonTrackAndOnlyOneMuonTrackPurity
int CountBadLeadingMuonTrackButLeadingPlusSecondGood
unsigned int NumberTrajectoryPoints() const
const TLorentzVector & Position(const int i=0) const
Utilities related to art service access.
void truthMatcher(detinfo::DetectorClocksData const &clockData, std::vector< recob::Hit > const &AllHits, std::vector< art::Ptr< recob::Hit >> track_hits, const simb::MCParticle *&MCparticle, double &Purity, double &Completeness, double &TotalRecoEnergy)
int BadEvents4OrMoreMuonTrack
std::vector< sim::TrackIDE > HitToTrackIDEs(detinfo::DetectorClocksData const &clockData, recob::Hit const &hit) const
TH2D * h_TrackTooLong_ThetaXZ_SinThetaYZ
void FuncDistanceAndAngleBetweenTruthAndRecoTrack(const simb::MCParticle *&MCparticle, art::Ptr< recob::Track > Track, double &TempDistanceBetweenTruthAndRecoTrack, double &TempAngleBeetweenTruthAndRecoTrack)
int CountBadLeadingMuonTrackAndLeadingPlusSecondBadPurity
MaybeLogger_< ELseverityLevel::ELsev_info, false > LogInfo
std::vector< TrackID > TrackIDs
const simb::MCParticle * TrackIdToParticle_P(int id) const
int GoodEvents4OrMoreMuonTrack
TH1D * h_Efficiency_ThetaXZ
TH2D * h_TrackTooShort_ThetaXZ_SinThetaYZ
TH2D * h_ThetaXZ_ThetaYZ_LeadingPlusSecondOk
int CountTrackLengthTooShort
list_type::const_iterator const_iterator
TH2D * h_MuonTrackStitching_Distance_Angle
TH2D * h_MuonTrackStitching_FailedCriteria_CriteriaTwoTracks_Angle
Geometry information for a single TPC.
TH2D * h_NoMuonTrack_MaxTrackLength_PDGCode
TH2D * h_MuonTrackStitching_MatchedCriteria_TrackResLeading_TrackResSecond
::geo::Point_t toPoint(Point const &p)
Convert the specified point into a geo::Point_t.
TH2D * h_Efficiency_ThetaXZ_SinThetaYZ_LeadingPlusSecond
TH2D * h_Criteria_NRecoTrack_num
Vector_t VertexDirection() const
Access to track direction at different points.
TH2D * h_MuonTrackStitching_FailedCriteria_Distance_Angle
TH2D * h_ThetaXZ_ThetaYZ_LeadingPlusSecondOk_num
TH2D * h_MuonTrackStitching_MatchedCriteria_TrackRes_Completeness
TH1D * h_Efficiency_ThetaYZ
int CountBadLeadingMuonTrackAndOnlyOneMuonTrack
TH2D * h_ThetaXZ_SinThetaYZ_LeadingPlusSecondOk
TH2D * h_MuonTrackStitching_MatchedCriteria_CriteriaTwoTracks_Angle
TH2D * h_MuonTrackStitching_FailedCriteria_CompletenessSecondMuon_Angle
TH2D * h_MuonTrackStitching_FailedCriteria_CompletenessLeading_CompletenessSecond
bool insideFV(double vertex[4])
TH2D * h_FailedReconstruction_ThetaXZ_SinThetaYZ
auto vector(Vector const &v)
Returns a manipulator which will print the specified array.
TH2D * h_MuonTrackStitching_FailedCriteria_TrackRes_Completeness
std::string fMCTruthModuleLabel
TPCID FindTPCAtPosition(Point_t const &point) const
Returns the ID of the TPC at specified location.
TH2D * h_MuonTrackStitching_TrackResLeading_TrackResSecond
double Length(size_t p=0) const
Access to various track properties.
TH2D * h_MuonTrackStitching_FailedCriteriaAndLeadingPlusSecondBad_TrackResLeading_TrackResSecond
#define DEFINE_ART_MODULE(klass)
TH2D * h_Efficiency_ThetaXZ_ThetaYZ_DifferenceLeadingAndLeadingPlusSecond
T get(std::string const &key) const
double MCTruthMuonVertex[4]
int CountBadLeadingMuonTrackAndLeadingPlusSecondBadTrackTooShort
TH2D * h_Efficiency_ThetaXZ_ThetaYZ
TH2D * h_MuonTrackStitching_FailedCriteriaAndLeadingPlusSecondBad_TrackRes_Completeness
Point_t const & Vertex() const
Access to track position at different points.
int CountBadLeadingMuonTrack
void processEff(const art::Event &evt, bool &isFiducial)
int CountGoodLeadingMuonTrack
int CountBadLeadingMuonTrackAndOnlyOneMuonTrackTrackTooLong
Provides recob::Track data product.
TH2D * h_Criteria_NMuonTrack_den
void FuncDistanceAndAngleBetweenTracks(art::Ptr< recob::Track > Track1, art::Ptr< recob::Track > Track2, double &TempDistanceBetweenTracks, double &TempAngleBetweenTracks, double &TempCriteriaTwoTracks)
The data type to uniquely identify a TPC.
TH1D * h_Efficiency_SinThetaYZ
Definition of data types for geometry description.
TH2D * h_ThetaXZ_SinThetaYZ_den
Detector simulation of raw signals on wires.
TH2D * h_MuonTrackStitching_FailedCriteria_TrackResSecondMuon_Angle
const sim::ParticleList & ParticleList() const
double MCTruthMuonThetaYZ
double Vx(const int i=0) const
int CountBadLeadingMuonTrackAndLeadingPlusSecondBad
TH2D * h_Criteria_NMuonTrack
TH2D * h_Efficiency_ThetaXZ_ThetaYZ_LeadingPlusSecond
TH2D * h_MuonTrackStitching_FailedCriteriaButLeadingPlusSecondGood_TrackResLeading_TrackResSecond
bool getByLabel(std::string const &label, std::string const &instance, Handle< PROD > &result) const
TH2D * h_ThetaXZ_SinThetaYZ_LeadingPlusSecondOk_num
int CountBadLeadingMuonTrackAndLeadingPlusSecondBadTrackTooLong
Contains all timing reference information for the detector.
TH2D * h_Criteria_NRecoTrack_den
TH2D * h_Purity_ThetaXZ_SinThetaYZ
TH2D * h_ThetaXZ_ThetaYZ_num
TH2D * h_MuonTrackStitching_FailedCriteriaAndLeadingPlusSecondBad_Distance_Angle
Vector_t EndDirection() const
Access to track direction at different points.
int CountTrackLengthTooLong
TH2D * h_ThetaXZ_ThetaYZ_den
const TLorentzVector & Momentum(const int i=0) const
TH2D * h_MuonTrackStitching_CompletenessSecondMuon_Angle
void analyze(const art::Event &evt) override
double Vz(const int i=0) const
TH2D * h_Efficiency_ThetaXZ_SinThetaYZ
Point_t const & End() const
Access to track position at different points.
TH2D * h_Criteria_NRecoTrack
TH2D * h_MuonTrackStitching_FailedCriteriaButLeadingPlusSecondGood_TrackRes_Completeness
art::ServiceHandle< geo::Geometry const > geom
TH2D * h_FailedReconstruction_ThetaXZ_ThetaYZ
double truthLength(const simb::MCParticle *MCparticle)
2D representation of charge deposited in the TDC/wire plane
TH2D * h_MuonTrackStitching_FailedCriteria_TrackResLeading_TrackResSecond
void fill_ptr_vector(std::vector< Ptr< T >> &ptrs, H const &h)
int CountBadLeadingMuonTrackAndOnlyOneMuonTrackTrackTooShort
TH2D * h_MuonTrackStitching_CriteriaTwoTracks_Angle
double MCTruthMuonThetaXZ
Namespace collecting geometry-related classes utilities.
TH2D * h_Criteria_NMuonTrack_num
TH2D * h_MuonTrackStitching_TrackResSecondMuon_Angle
int CountBadLeadingMuonTrackAndOnlyOneMuonTrackCompleteness
int CountBadLeadingMuonTrackAndLeadingPlusSecondBadCompleteness
double MCTruthMuonMomentum
TH2D * h_ThetaXZ_SinThetaYZ_num
double Vy(const int i=0) const
art framework interface to geometry description
TH2D * h_MuonTrackStitching_MatchedCriteria_Distance_Angle
Event finding and building.
Encapsulate the construction of a single detector plane.
The data type to uniquely identify a cryostat.
TH2D * h_MuonTrackStitching_FailedCriteriaButLeadingPlusSecondGood_Distance_Angle
std::string fTrackModuleLabel