30 #include "art_root_io/TFileService.h" 33 #include "cetlib_except/exception.h" 56 double bdist(
const TVector3& pos,
unsigned int = 0,
unsigned int = 0)
69 return std::min({d1, d2, d3, d4, d5, d6});
103 for (
int i = 0; i <
n; ++i) {
104 TVector3 pos = part.
Position(i).Vect();
110 if (pos.X() >= xmin && pos.X() <= xmax && pos.Y() >= ymin && pos.Y() <= ymax &&
111 pos.Z() >= zmin && pos.Z() <= zmax) {
121 result += disp.Mag();
158 int n = mctrk.size();
161 for (
int i = 0; i <
n; ++i) {
162 TVector3 pos = mctrk[i].Position().Vect();
168 if (pos.X() >= xmin && pos.X() <= xmax && pos.Y() >= ymin && pos.Y() <= ymax &&
169 pos.Z() >= zmin && pos.Z() <= zmax) {
175 startmom = 0.001 * mctrk[i].Momentum().Vect();
179 result += disp.Mag();
184 endmom = 0.001 * mctrk[i].Momentum().Vect();
194 void effcalc(
const TH1* hnum,
const TH1* hden, TH1* heff)
196 int nbins = hnum->GetNbinsX();
197 if (nbins != hden->GetNbinsX())
198 throw cet::exception(
"TrackAna") <<
"effcalc[" __FILE__
"]: incompatible histograms (I)\n";
199 if (nbins != heff->GetNbinsX())
200 throw cet::exception(
"TrackAna") <<
"effcalc[" __FILE__
"]: incompatible histograms (II)\n";
204 for (
int ibin = 0; ibin <= nbins + 1; ++ibin) {
205 double num = hnum->GetBinContent(ibin);
206 double den = hden->GetBinContent(ibin);
208 heff->SetBinContent(ibin, 0.);
209 heff->SetBinError(ibin, 0.);
212 double eff = num /
den;
213 if (eff < 0.) eff = 0.;
214 if (eff > 1.) eff = 1.;
215 double err = std::sqrt(eff * (1. - eff) / den);
216 heff->SetBinContent(ibin, eff);
217 heff->SetBinError(ibin, err);
221 heff->SetMinimum(0.);
222 heff->SetMaximum(1.05);
223 heff->SetMarkerStyle(20);
226 class flattener :
public std::vector<unsigned int> {
228 flattener() =
default;
230 flattener(
const std::vector<std::vector<unsigned int>>& input) { Convert(input); }
232 void Convert(
const std::vector<std::vector<unsigned int>>& input)
236 for (
auto const& vec : input)
237 length += vec.size();
240 for (
auto const& vec : input)
241 for (
auto const&
value : vec)
257 explicit RecoHists(
const std::string& subdir);
261 TH1F* fHstartx{
nullptr};
262 TH1F* fHstarty{
nullptr};
263 TH1F* fHstartz{
nullptr};
264 TH1F* fHstartd{
nullptr};
265 TH1F* fHendx{
nullptr};
266 TH1F* fHendy{
nullptr};
267 TH1F* fHendz{
nullptr};
268 TH1F* fHendd{
nullptr};
269 TH1F* fHtheta{
nullptr};
270 TH1F* fHphi{
nullptr};
271 TH1F* fHtheta_xz{
nullptr};
272 TH1F* fHtheta_yz{
nullptr};
273 TH1F* fHmom{
nullptr};
274 TH1F* fHmoml{
nullptr};
275 TH1F* fHlen{
nullptr};
276 TH1F* fHlens{
nullptr};
280 TH1F* fHHitChg{
nullptr};
281 TH1F* fHHitWidth{
nullptr};
282 TH1F* fHHitPdg{
nullptr};
283 TH1F* fHHitTrkId{
nullptr};
284 TH1F* fModeFrac{
nullptr};
285 TH1F* fNTrkIdTrks{
nullptr};
286 TH2F* fNTrkIdTrks2{
nullptr};
287 TH2F* fNTrkIdTrks3{
nullptr};
293 explicit MCHists(
const std::string& subdir);
297 TH2F* fHduvcosth{
nullptr};
298 TH1F* fHcosth{
nullptr};
299 TH1F* fHmcu{
nullptr};
300 TH1F* fHmcv{
nullptr};
301 TH1F* fHmcw{
nullptr};
302 TH1F* fHupull{
nullptr};
303 TH1F* fHvpull{
nullptr};
304 TH1F* fHmcdudw{
nullptr};
305 TH1F* fHmcdvdw{
nullptr};
306 TH1F* fHdudwpull{
nullptr};
307 TH1F* fHdvdwpull{
nullptr};
308 TH1F* fHHitEff{
nullptr};
309 TH1F* fHHitPurity{
nullptr};
313 TH1F* fHstartdx{
nullptr};
314 TH1F* fHstartdy{
nullptr};
315 TH1F* fHstartdz{
nullptr};
316 TH1F* fHenddx{
nullptr};
317 TH1F* fHenddy{
nullptr};
318 TH1F* fHenddz{
nullptr};
319 TH2F* fHlvsl{
nullptr};
321 TH2F* fHpvsp{
nullptr};
322 TH2F* fHpvspc{
nullptr};
324 TH1F* fHdpc{
nullptr};
325 TH1F* fHppull{
nullptr};
326 TH1F* fHppullc{
nullptr};
330 TH1F* fHmcstartx{
nullptr};
331 TH1F* fHmcstarty{
nullptr};
332 TH1F* fHmcstartz{
nullptr};
333 TH1F* fHmcendx{
nullptr};
334 TH1F* fHmcendy{
nullptr};
335 TH1F* fHmcendz{
nullptr};
336 TH1F* fHmctheta{
nullptr};
337 TH1F* fHmcphi{
nullptr};
338 TH1F* fHmctheta_xz{
nullptr};
339 TH1F* fHmctheta_yz{
nullptr};
340 TH1F* fHmcmom{
nullptr};
341 TH1F* fHmcmoml{
nullptr};
342 TH1F* fHmcke{
nullptr};
343 TH1F* fHmckel{
nullptr};
344 TH1F* fHmclen{
nullptr};
345 TH1F* fHmclens{
nullptr};
349 TH1F* fHgstartx{
nullptr};
350 TH1F* fHgstarty{
nullptr};
351 TH1F* fHgstartz{
nullptr};
352 TH1F* fHgendx{
nullptr};
353 TH1F* fHgendy{
nullptr};
354 TH1F* fHgendz{
nullptr};
355 TH1F* fHgtheta{
nullptr};
356 TH1F* fHgphi{
nullptr};
357 TH1F* fHgtheta_xz{
nullptr};
358 TH1F* fHgtheta_yz{
nullptr};
359 TH1F* fHgmom{
nullptr};
360 TH1F* fHgmoml{
nullptr};
361 TH1F* fHgke{
nullptr};
362 TH1F* fHgkel{
nullptr};
363 TH1F* fHglen{
nullptr};
364 TH1F* fHglens{
nullptr};
368 TH1F* fHestartx{
nullptr};
369 TH1F* fHestarty{
nullptr};
370 TH1F* fHestartz{
nullptr};
371 TH1F* fHeendx{
nullptr};
372 TH1F* fHeendy{
nullptr};
373 TH1F* fHeendz{
nullptr};
374 TH1F* fHetheta{
nullptr};
375 TH1F* fHephi{
nullptr};
376 TH1F* fHetheta_xz{
nullptr};
377 TH1F* fHetheta_yz{
nullptr};
378 TH1F* fHemom{
nullptr};
379 TH1F* fHemoml{
nullptr};
380 TH1F* fHeke{
nullptr};
381 TH1F* fHekel{
nullptr};
382 TH1F* fHelen{
nullptr};
383 TH1F* fHelens{
nullptr};
392 void endJob()
override;
398 std::vector<size_t> fsort_indexes(
const std::vector<double>& v);
448 art::TFileDirectory topdir = tfs->mkdir(
"trkana",
"TrackAna histograms");
449 art::TFileDirectory
dir = topdir.mkdir(subdir);
453 fHstartx = dir.make<TH1F>(
455 fHstarty = dir.make<TH1F>(
457 fHstartz = dir.make<TH1F>(
"zstart",
"Z Start Position", 100, 0., geom->
DetLength());
458 fHstartd = dir.make<TH1F>(
459 "dstart",
"Start Position Distance to Boundary", 100, -10., geom->
DetHalfWidth());
460 fHendx = dir.make<TH1F>(
464 fHendz = dir.make<TH1F>(
"zend",
"Z End Position", 100, 0., geom->
DetLength());
466 dir.make<TH1F>(
"dend",
"End Position Distance to Boundary", 100, -10., geom->
DetHalfWidth());
467 fHtheta = dir.make<TH1F>(
"theta",
"Theta", 100, 0., 3.142);
468 fHphi = dir.make<TH1F>(
"phi",
"Phi", 100, -3.142, 3.142);
469 fHtheta_xz = dir.make<TH1F>(
"theta_xz",
"Theta_xz", 100, -3.142, 3.142);
470 fHtheta_yz = dir.make<TH1F>(
"theta_yz",
"Theta_yz", 100, -3.142, 3.142);
471 fHmom = dir.make<TH1F>(
"mom",
"Momentum", 100, 0., 10.);
472 fHmoml = dir.make<TH1F>(
"moml",
"Momentum", 100, 0., 1.);
473 fHlen = dir.make<TH1F>(
"len",
"Track Length", 100, 0., 1.1 * geom->
DetLength());
474 fHlens = dir.make<TH1F>(
"lens",
"Track Length", 100, 0., 0.1 * geom->
DetLength());
475 fHHitChg = dir.make<TH1F>(
"hchg",
"Hit Charge (ADC counts)", 100, 0., 4000.);
476 fHHitWidth = dir.make<TH1F>(
"hwid",
"Hit Width (ticks)", 40, 0., 20.);
477 fHHitPdg = dir.make<TH1F>(
"hpdg",
"Hit Pdg code", 5001, -2500.5, +2500.5);
478 fHHitTrkId = dir.make<TH1F>(
"htrkid",
"Hit Track ID", 401, -200.5, +200.5);
480 dir.make<TH1F>(
"hmodefrac",
481 "quasi-Purity: Fraction of component tracks with the Track mode value",
486 dir.make<TH1F>(
"hntrkids",
487 "quasi-Efficiency: Number of stitched tracks in which TrkId appears",
491 fNTrkIdTrks2 = dir.make<TH2F>(
"hntrkids2",
492 "Number of stitched tracks in which TrkId appears vs KE [GeV]",
499 fNTrkIdTrks3 = dir.make<TH2F>(
"hntrkids3",
500 "MC Track vs Reco Track, wtd by nhits on Collection Plane",
507 fNTrkIdTrks3->GetXaxis()->SetTitle(
"Sorted-by-Descending-CPlane-Hits outer Track Number");
508 fNTrkIdTrks3->GetYaxis()->SetTitle(
"Sorted-by-Descending-True-Length G4Track");
513 TrackAna::MCHists::MCHists(
const std::string& subdir)
522 art::TFileDirectory topdir = tfs->mkdir(
"trkana",
"TrackAna histograms");
523 art::TFileDirectory
dir = topdir.mkdir(subdir);
528 dir.make<TH2F>(
"duvcosth",
"Delta(uv) vs. Colinearity", 100, 0.95, 1., 100, 0., 1.);
529 fHcosth = dir.make<TH1F>(
"colin",
"Colinearity", 100, 0.95, 1.);
530 fHmcu = dir.make<TH1F>(
"mcu",
"MC Truth U", 100, -5., 5.);
531 fHmcv = dir.make<TH1F>(
"mcv",
"MC Truth V", 100, -5., 5.);
532 fHmcw = dir.make<TH1F>(
"mcw",
"MC Truth W", 100, -20., 20.);
533 fHupull = dir.make<TH1F>(
"dupull",
"U Pull", 100, -20., 20.);
534 fHvpull = dir.make<TH1F>(
"dvpull",
"V Pull", 100, -20., 20.);
535 fHmcdudw = dir.make<TH1F>(
"mcdudw",
"MC Truth U Slope", 100, -0.2, 0.2);
536 fHmcdvdw = dir.make<TH1F>(
"mcdvdw",
"MV Truth V Slope", 100, -0.2, 0.2);
537 fHdudwpull = dir.make<TH1F>(
"dudwpull",
"U Slope Pull", 100, -10., 10.);
538 fHdvdwpull = dir.make<TH1F>(
"dvdwpull",
"V Slope Pull", 100, -10., 10.);
539 fHHitEff = dir.make<TH1F>(
"hiteff",
"MC Hit Efficiency", 100, 0., 1.0001);
540 fHHitPurity = dir.make<TH1F>(
"hitpurity",
"MC Hit Purity", 100, 0., 1.0001);
541 fHstartdx = dir.make<TH1F>(
"startdx",
"Start Delta x", 100, -10., 10.);
542 fHstartdy = dir.make<TH1F>(
"startdy",
"Start Delta y", 100, -10., 10.);
543 fHstartdz = dir.make<TH1F>(
"startdz",
"Start Delta z", 100, -10., 10.);
544 fHenddx = dir.make<TH1F>(
"enddx",
"End Delta x", 100, -10., 10.);
545 fHenddy = dir.make<TH1F>(
"enddy",
"End Delta y", 100, -10., 10.);
546 fHenddz = dir.make<TH1F>(
"enddz",
"End Delta z", 100, -10., 10.);
547 fHlvsl = dir.make<TH2F>(
"lvsl",
548 "Reco Length vs. MC Truth Length",
555 fHdl = dir.make<TH1F>(
"dl",
"Track Length Minus MC Particle Length", 100, -50., 50.);
557 dir.make<TH2F>(
"pvsp",
"Reco Momentum vs. MC Truth Momentum", 100, 0., 5., 100, 0., 5.);
558 fHpvspc = dir.make<TH2F>(
559 "pvspc",
"Reco Momentum vs. MC Truth Momentum (Contained Tracks)", 100, 0., 5., 100, 0., 5.);
560 fHdp = dir.make<TH1F>(
"dp",
"Reco-MC Momentum Difference", 100, -5., 5.);
561 fHdpc = dir.make<TH1F>(
"dpc",
"Reco-MC Momentum Difference (Contained Tracks)", 100, -5., 5.);
562 fHppull = dir.make<TH1F>(
"ppull",
"Momentum Pull", 100, -10., 10.);
563 fHppullc = dir.make<TH1F>(
"ppullc",
"Momentum Pull (Contained Tracks)", 100, -10., 10.);
565 fHmcstartx = dir.make<TH1F>(
567 fHmcstarty = dir.make<TH1F>(
569 fHmcstartz = dir.make<TH1F>(
"mczstart",
"MC Z Start Position", 10, 0., geom->
DetLength());
570 fHmcendx = dir.make<TH1F>(
572 fHmcendy = dir.make<TH1F>(
574 fHmcendz = dir.make<TH1F>(
"mczend",
"MC Z End Position", 10, 0., geom->
DetLength());
575 fHmctheta = dir.make<TH1F>(
"mctheta",
"MC Theta", 20, 0., 3.142);
576 fHmcphi = dir.make<TH1F>(
"mcphi",
"MC Phi", 10, -3.142, 3.142);
577 fHmctheta_xz = dir.make<TH1F>(
"mctheta_xz",
"MC Theta_xz", 40, -3.142, 3.142);
578 fHmctheta_yz = dir.make<TH1F>(
"mctheta_yz",
"MC Theta_yz", 40, -3.142, 3.142);
579 fHmcmom = dir.make<TH1F>(
"mcmom",
"MC Momentum", 10, 0., 10.);
580 fHmcmoml = dir.make<TH1F>(
"mcmoml",
"MC Momentum", 10, 0., 1.);
581 fHmcke = dir.make<TH1F>(
"mcke",
"MC Kinetic Energy", 10, 0., 10.);
582 fHmckel = dir.make<TH1F>(
"mckel",
"MC Kinetic Energy", 10, 0., 1.);
583 fHmclen = dir.make<TH1F>(
"mclen",
"MC Particle Length", 10, 0., 1.1 * geom->
DetLength());
584 fHmclens = dir.make<TH1F>(
"mclens",
"MC Particle Length", 10, 0., 0.1 * geom->
DetLength());
586 fHgstartx = dir.make<TH1F>(
"gxstart",
587 "Good X Start Position",
591 fHgstarty = dir.make<TH1F>(
593 fHgstartz = dir.make<TH1F>(
"gzstart",
"Good Z Start Position", 10, 0., geom->
DetLength());
594 fHgendx = dir.make<TH1F>(
596 fHgendy = dir.make<TH1F>(
598 fHgendz = dir.make<TH1F>(
"gzend",
"Good Z End Position", 10, 0., geom->
DetLength());
599 fHgtheta = dir.make<TH1F>(
"gtheta",
"Good Theta", 20, 0., 3.142);
600 fHgphi = dir.make<TH1F>(
"gphi",
"Good Phi", 10, -3.142, 3.142);
601 fHgtheta_xz = dir.make<TH1F>(
"gtheta_xz",
"Good Theta_xz", 40, -3.142, 3.142);
602 fHgtheta_yz = dir.make<TH1F>(
"gtheta_yz",
"Good Theta_yz", 40, -3.142, 3.142);
603 fHgmom = dir.make<TH1F>(
"gmom",
"Good Momentum", 10, 0., 10.);
604 fHgmoml = dir.make<TH1F>(
"gmoml",
"Good Momentum", 10, 0., 1.);
605 fHgke = dir.make<TH1F>(
"gke",
"Good Kinetic Energy", 10, 0., 10.);
606 fHgkel = dir.make<TH1F>(
"gkel",
"Good Kinetic Energy", 10, 0., 1.);
607 fHglen = dir.make<TH1F>(
"glen",
"Good Particle Length", 10, 0., 1.1 * geom->
DetLength());
608 fHglens = dir.make<TH1F>(
"glens",
"Good Particle Length", 10, 0., 0.1 * geom->
DetLength());
610 fHestartx = dir.make<TH1F>(
"exstart",
611 "Efficiency vs. X Start Position",
615 fHestarty = dir.make<TH1F>(
"eystart",
616 "Efficiency vs. Y Start Position",
621 dir.make<TH1F>(
"ezstart",
"Efficiency vs. Z Start Position", 10, 0., geom->
DetLength());
622 fHeendx = dir.make<TH1F>(
"exend",
623 "Efficiency vs. X End Position",
627 fHeendy = dir.make<TH1F>(
629 fHeendz = dir.make<TH1F>(
"ezend",
"Efficiency vs. Z End Position", 10, 0., geom->
DetLength());
630 fHetheta = dir.make<TH1F>(
"etheta",
"Efficiency vs. Theta", 20, 0., 3.142);
631 fHephi = dir.make<TH1F>(
"ephi",
"Efficiency vs. Phi", 10, -3.142, 3.142);
632 fHetheta_xz = dir.make<TH1F>(
"etheta_xz",
"Efficiency vs. Theta_xz", 40, -3.142, 3.142);
633 fHetheta_yz = dir.make<TH1F>(
"etheta_yz",
"Efficiency vs. Theta_yz", 40, -3.142, 3.142);
634 fHemom = dir.make<TH1F>(
"emom",
"Efficiency vs. Momentum", 10, 0., 10.);
635 fHemoml = dir.make<TH1F>(
"emoml",
"Efficiency vs. Momentum", 10, 0., 1.);
636 fHeke = dir.make<TH1F>(
"eke",
"Efficiency vs. Kinetic Energy", 10, 0., 10.);
637 fHekel = dir.make<TH1F>(
"ekel",
"Efficiency vs. Kinetic Energy", 10, 0., 1.);
639 dir.make<TH1F>(
"elen",
"Efficiency vs. Particle Length", 10, 0., 1.1 * geom->
DetLength());
641 dir.make<TH1F>(
"elens",
"Efficiency vs. Particle Length", 10, 0., 0.1 * geom->
DetLength());
651 , fTrackModuleLabel(pset.
get<
std::string>(
"TrackModuleLabel"))
652 , fMCTrackModuleLabel(pset.
get<
std::string>(
"MCTrackModuleLabel"))
653 , fSpacepointModuleLabel(pset.
get<
std::string>(
"SpacepointModuleLabel"))
654 , fStitchModuleLabel(pset.
get<
std::string>(
"StitchModuleLabel"))
655 , fTrkSpptAssocModuleLabel(pset.
get<
std::string>(
"TrkSpptAssocModuleLabel"))
656 , fHitSpptAssocModuleLabel(pset.
get<
std::string>(
"HitSpptAssocModuleLabel"))
657 , fHitModuleLabel(pset.
get<
std::string>(
"HitModuleLabel"))
658 , fDump(pset.
get<int>(
"Dump"))
659 , fMinMCKE(pset.
get<double>(
"MinMCKE"))
660 , fMinMCLen(pset.
get<double>(
"MinMCLen"))
661 , fMatchColinearity(pset.
get<double>(
"MatchColinearity"))
662 , fMatchDisp(pset.
get<double>(
"MatchDisp"))
663 , fWMatchDisp(pset.
get<double>(
"WMatchDisp"))
664 , fMatchLength(pset.
get<double>(
"MatchLength"))
665 , fIgnoreSign(pset.
get<bool>(
"IgnoreSign"))
666 , fStitchedAnalysis(pset.
get<bool>(
"StitchedAnalysis", false))
667 , fOrigin(pset.
get<
std::string>(
"MCTrackOrigin",
"Any"))
668 , fPrintLevel(pset.
get<int>(
"PrintLevel", 0))
675 if (
fOrigin.find(
"Beam") != std::string::npos) {
679 else if (
fOrigin.find(
"Cosmic") != std::string::npos) {
683 else if (
fOrigin.find(
"Super") != std::string::npos) {
687 else if (
fOrigin.find(
"Single") != std::string::npos) {
694 mf::LogInfo(
"TrackAna") <<
"TrackAna configured with the following parameters:\n" 701 <<
" Dump = " <<
fDump <<
"\n" 702 <<
" MinMCKE = " <<
fMinMCKE <<
"\n" 717 std::unique_ptr<mf::LogInfo> pdump;
720 pdump = std::make_unique<mf::LogInfo>(
"TrackAna");
732 std::vector<std::pair<const sim::MCTrack*, int>> selected_mctracks;
738 if (mc && mctrackh.
isValid()) {
740 selected_mctracks.reserve(mctrackh->size());
745 *pdump <<
"MC Tracks\n" 746 <<
" Id pdg x y z dx dy dz " 748 <<
"--------------------------------------------------------------------------------" 757 imctrk != mctrackh->end();
780 double mctime = mctrk.
Start().
T();
789 double plen = length(detProp, mctrk, mcdx, mcstart, mcend, mcstartmom, mcendmom);
798 selected_mctracks.push_back(std::make_pair(&mctrk, -1));
803 double pstart = mcstartmom.Mag();
804 double pend = mcendmom.Mag();
805 *pdump <<
"\nOffset" << std::setw(3) << mctrk.
TrackID() << std::setw(6)
806 << mctrk.
PdgCode() <<
" " << std::fixed << std::setprecision(2)
807 << std::setw(10) << mcdx <<
"\nStart " << std::setw(3) << mctrk.
TrackID()
808 << std::setw(6) << mctrk.
PdgCode() <<
" " << std::fixed
809 << std::setprecision(2) << std::setw(10) << mcstart.X() << std::setw(10)
810 << mcstart.Y() << std::setw(10) << mcstart.Z();
812 *pdump <<
" " << std::fixed << std::setprecision(3) << std::setw(10)
813 << mcstartmom[0] / pstart << std::setw(10) << mcstartmom[1] / pstart
814 << std::setw(10) << mcstartmom[2] / pstart;
817 *pdump << std::setw(32) <<
" ";
818 *pdump << std::setw(12) << std::fixed << std::setprecision(3) << pstart;
819 *pdump <<
"\nEnd " << std::setw(3) << mctrk.
TrackID() << std::setw(6)
820 << mctrk.
PdgCode() <<
" " << std::fixed << std::setprecision(2)
821 << std::setw(10) << mcend.X() << std::setw(10) << mcend.Y() << std::setw(10)
824 *pdump <<
" " << std::fixed << std::setprecision(3) << std::setw(10)
825 << mcendmom[0] / pend << std::setw(10) << mcendmom[1] / pend
826 << std::setw(10) << mcendmom[2] / pend;
829 *pdump << std::setw(32) <<
" ";
830 *pdump << std::setw(12) << std::fixed << std::setprecision(3) << pend
831 <<
"\nLength: " << plen <<
"\n";
837 std::ostringstream ostr;
843 double mctheta_xz = std::atan2(mcstartmom.X(), mcstartmom.Z());
844 double mctheta_yz = std::atan2(mcstartmom.Y(), mcstartmom.Z());
845 double mcmom = mcstartmom.Mag();
847 double mcke = mcmom * mcmom / (std::hypot(mcmom, mcmass) + mcmass);
855 mchists.
fHmctheta->Fill(mcstartmom.Theta());
856 mchists.
fHmcphi->Fill(mcstartmom.Phi());
861 mchists.
fHmcke->Fill(mcke);
882 std::vector<art::Ptr<recob::Hit>> allhits;
884 allhits.reserve(hith->size());
885 for (
unsigned int i = 0; i < hith->size(); ++i) {
886 allhits.emplace_back(hith, i);
899 mf::LogDebug(
"TrackAna") <<
"TrackAna read " << trackvh->size()
900 <<
" vectors of Stitched PtrVectorsof tracks.";
907 *pdump <<
"\nReconstructed Tracks\n" 908 <<
" Id MCid x y z dx dy dz " 910 <<
"--------------------------------------------------------------------------------" 916 int ntrack = trackh->size();
917 for (
int i = 0; i < ntrack; ++i) {
923 std::vector<art::Ptr<recob::Hit>> trackhits;
924 tkhit_find.
get(i, trackhits);
934 TVector3 pos = track.
Vertex<TVector3>();
936 TVector3 end = track.
End<TVector3>();
940 double dpos = bdist(pos);
941 double dend = bdist(end);
942 double tlen = length(track);
943 double theta_xz = std::atan2(dir.X(), dir.Z());
944 double theta_yz = std::atan2(dir.Y(), dir.Z());
953 rhists.
fHendx->Fill(end.X());
954 rhists.
fHendy->Fill(end.Y());
955 rhists.
fHendz->Fill(end.Z());
956 rhists.
fHendd->Fill(dend);
957 rhists.
fHtheta->Fill(dir.Theta());
958 rhists.
fHphi->Fill(dir.Phi());
964 rhists.
fHmom->Fill(mom);
966 rhists.
fHlen->Fill(tlen);
967 rhists.
fHlens->Fill(tlen);
975 for (
int swap = 0; swap < 2; ++swap) {
985 int start_point = (swap == 0 ? 0 : ntraj - 1);
991 rot(1, 0) = -rot(1, 0);
992 rot(2, 0) = -rot(2, 0);
993 rot(1, 1) = -rot(1, 1);
994 rot(2, 1) = -rot(2, 1);
995 rot(1, 2) = -rot(1, 2);
996 rot(2, 2) = -rot(2, 2);
998 pos = track.
End<TVector3>();
1000 end = track.
Vertex<TVector3>();
1006 theta_xz = std::atan2(dir.X(), dir.Z());
1007 theta_yz = std::atan2(dir.Y(), dir.Z());
1018 for (
unsigned int imc = 0; imc < selected_mctracks.size(); ++imc) {
1019 const sim::MCTrack& mctrk = *selected_mctracks[imc].first;
1024 throw cet::exception(
"TrackAna") <<
"no particle with ID=" << pdg <<
"\n";
1025 const MCHists& mchists = iMCHistMap->second;
1029 double mctime = mctrk.
Start().
T();
1037 TVector3 mcstartmom;
1039 double plen = length(detProp, mctrk, mcdx, mcstart, mcend, mcstartmom, mcendmom);
1043 TVector3 mcpos{mcstart.X() - pos[0], mcstart.Y() - pos[1], mcstart.Z() - pos[2]};
1048 TVector3 mcmoml = rot * mcstartmom;
1049 TVector3 mcposl = rot * mcpos;
1051 double colinearity = mcmoml.Z() / mcmoml.Mag();
1053 double u = mcposl.X();
1054 double v = mcposl.Y();
1055 double w = mcposl.Z();
1057 double pu = mcmoml.X();
1058 double pv = mcmoml.Y();
1059 double pw = mcmoml.Z();
1061 double dudw = pu / pw;
1062 double dvdw = pv / pw;
1064 double u0 = u - w * dudw;
1065 double v0 = v - w * dvdw;
1066 double uv0 = std::hypot(u0, v0);
1076 mchists.
fHdudwpull->Fill(dudw / std::sqrt(cov(2, 2)));
1077 mchists.
fHdvdwpull->Fill(dvdw / std::sqrt(cov(3, 3)));
1079 mchists.
fHcosth->Fill(colinearity);
1084 mchists.
fHmcu->Fill(u0);
1085 mchists.
fHmcv->Fill(v0);
1086 mchists.
fHmcw->Fill(w);
1087 mchists.
fHupull->Fill(u0 / std::sqrt(cov(0, 0)));
1088 mchists.
fHvpull->Fill(v0 / std::sqrt(cov(1, 1)));
1094 double mctheta_xz = std::atan2(mcstartmom.X(), mcstartmom.Z());
1095 double mctheta_yz = std::atan2(mcstartmom.Y(), mcstartmom.Z());
1096 double mcmom = mcstartmom.Mag();
1098 double mcke = mcmom * mcmom / (std::hypot(mcmom, mcmass) + mcmass);
1100 mchists.
fHstartdx->Fill(pos.X() - mcstart.X());
1101 mchists.
fHstartdy->Fill(pos.Y() - mcstart.Y());
1102 mchists.
fHstartdz->Fill(pos.Z() - mcstart.Z());
1103 mchists.
fHenddx->Fill(end.X() - mcend.X());
1104 mchists.
fHenddy->Fill(end.Y() - mcend.Y());
1105 mchists.
fHenddz->Fill(end.Z() - mcend.Z());
1106 mchists.
fHlvsl->Fill(plen, tlen);
1107 mchists.
fHdl->Fill(tlen - plen);
1108 mchists.
fHpvsp->Fill(mcmom, mom);
1109 double dp = mom - mcmom;
1110 mchists.
fHdp->Fill(dp);
1111 mchists.
fHppull->Fill(dp / std::sqrt(cov(4, 4)));
1113 mchists.
fHpvspc->Fill(mcmom, mom);
1114 mchists.
fHdpc->Fill(dp);
1115 mchists.
fHppullc->Fill(dp / std::sqrt(cov(4, 4)));
1129 std::set<int> tkidset;
1130 tkidset.insert(mcid);
1132 clockData, tkidset, trackhits, allhits,
geo::k3D);
1142 mchists.
fHgendx->Fill(mcend.X());
1143 mchists.
fHgendy->Fill(mcend.Y());
1144 mchists.
fHgendz->Fill(mcend.Z());
1145 mchists.
fHgtheta->Fill(mcstartmom.Theta());
1146 mchists.
fHgphi->Fill(mcstartmom.Phi());
1149 mchists.
fHgmom->Fill(mcmom);
1151 mchists.
fHgke->Fill(mcke);
1152 mchists.
fHgkel->Fill(mcke);
1153 mchists.
fHglen->Fill(plen);
1157 selected_mctracks[imc].second = i;
1161 float KE = ptkl->
E() - ptkl->
Mass();
1162 std::string KEUnits =
" GeV";
1169 << evt.
run() <<
"." << evt.
event() <<
" Match MCTkID " << std::setw(6)
1170 << mctrk.
TrackID() <<
" Origin " << mctrk.
Origin() <<
" PDG" << std::setw(5)
1171 << mctrk.
PdgCode() <<
" KE" << std::setw(4) << (int)KE << KEUnits
1172 <<
" RecoTrkID " << track.
ID() <<
" hitEff " << std::setprecision(2)
1173 << hiteff <<
" hitPur " << hitpurity;
1175 for (
unsigned short ipl = 0; ipl < geom->
Nplanes(); ++ipl) {
1182 <<
" Wire:Tick in Pln " << ipl <<
" W:T " << sWire <<
":" << sTick
1183 <<
" - " << eWire <<
":" << eTick;
1195 TVector3 pos = track.
Vertex<TVector3>();
1197 TVector3 end = track.
End<TVector3>();
1203 *pdump <<
"\nOffset" << std::setw(3) << track.
ID() << std::setw(6) << mcid <<
" " 1204 << std::fixed << std::setprecision(2) << std::setw(10) << trackdx <<
"\nStart " 1205 << std::setw(3) << track.
ID() << std::setw(6) << mcid <<
" " << std::fixed
1206 << std::setprecision(2) << std::setw(10) << pos[0] << std::setw(10) << pos[1]
1207 << std::setw(10) << pos[2];
1209 *pdump <<
" " << std::fixed << std::setprecision(3) << std::setw(10) << dir[0]
1210 << std::setw(10) << dir[1] << std::setw(10) << dir[2];
1213 *pdump << std::setw(32) <<
" ";
1214 *pdump << std::setw(12) << std::fixed << std::setprecision(3) << pstart;
1215 *pdump <<
"\nEnd " << std::setw(3) << track.
ID() << std::setw(6) << mcid <<
" " 1216 << std::fixed << std::setprecision(2) << std::setw(10) << end[0] << std::setw(10)
1217 << end[1] << std::setw(10) << end[2];
1219 *pdump <<
" " << std::fixed << std::setprecision(3) << std::setw(10) << enddir[0]
1220 << std::setw(10) << enddir[1] << std::setw(10) << enddir[2];
1223 *pdump << std::setw(32) <<
" ";
1224 *pdump << std::setw(12) << std::fixed << std::setprecision(3) << pend
1225 <<
"\nLength: " << tlen <<
"\n";
1233 for (
unsigned int imc = 0; imc < selected_mctracks.size(); ++imc) {
1234 if (selected_mctracks[imc].
second >= 0)
continue;
1235 const sim::MCTrack& mctrk = *selected_mctracks[imc].first;
1237 float KE = ptkl->
E() - ptkl->
Mass();
1238 std::string KEUnits =
" GeV";
1246 TVector3 mcstartmom, mcendmom;
1248 double plen = length(detProp, mctrk, mcdx, mcstart, mcend, mcstartmom, mcendmom);
1250 << evt.
run() <<
"." << evt.
event() <<
" NoMat MCTkID " << std::setw(6) << mctrk.
TrackID()
1251 <<
" Origin " << mctrk.
Origin() <<
" PDG" << std::setw(5) << mctrk.
PdgCode() <<
" KE" 1252 << std::setw(4) << (int)KE << KEUnits <<
" Length " << std::fixed << std::setprecision(1)
1256 for (
unsigned short ipl = 0; ipl < geom->
Nplanes(); ++ipl) {
1262 mf::LogVerbatim(
"TrackAna") <<
" Wire:Tick in Pln " << ipl <<
" W:T " << sWire <<
":" 1263 << sTick <<
" - " << eWire <<
":" << eTick;
1278 std::map<int, std::map<int, art::PtrVector<recob::Hit>>> hitmap;
1279 std::map<int, int> KEmap;
1288 int ntv(trackvh->size());
1290 std::vector<art::PtrVector<recob::Track>>
::const_iterator cti = trackvh->begin();
1294 int nsppts_assnwhole = fswhole.size();
1295 std::cout <<
"TrackAna: Number of clumps of Spacepoints from Assn for all Tracks: " 1296 << nsppts_assnwhole << std::endl;
1302 <<
"\t\t TrkAna: Fresh fRecoHistMap[0] ******* \n" 1307 std::vector<std::vector<unsigned int>> NtrkIdsAll;
1308 std::vector<double> ntvsorted;
1313 for (
int o = 0; o < ntv; ++o)
1316 int ntrack = pvtrack.
size();
1317 std::vector<std::vector<unsigned int>> NtrkId_Hit;
1318 std::vector<unsigned int> vecMode;
1321 for (
int i = 0; i < ntrack; ++i) {
1330 int nsppts_assn = fs.at(i).size();
1332 const auto&
sppt = fs.at(i);
1342 std::vector<unsigned int> vecNtrkIds;
1343 for (
int is = 0; is < nsppts_assn; ++is) {
1344 int nhits = fh.at(is).size();
1345 for (
int ih = 0; ih < nhits; ++ih) {
1346 const auto&
hit = fh.at(is).at(ih);
1358 int trackID =
std::abs(itid->trackID);
1359 hitmap[trackID][o].push_back(
hit);
1362 vecNtrkIds.push_back(trackID);
1375 TVector3 mcstartmom;
1377 double mctime = part->
T();
1380 double plen = length(detProp, *part, mcdx, mcstart, mcend, mcstartmom, mcendmom);
1382 KEmap[(int)(1e6 * plen)] = trackID;
1392 NtrkId_Hit.push_back(vecNtrkIds);
1395 int max(-12),
n(1), ind(0);
1396 std::sort(vecNtrkIds.begin(), vecNtrkIds.end());
1397 std::vector<unsigned int> strkIds(vecNtrkIds);
1398 while (ii < vecNtrkIds.size()) {
1399 if (strkIds.at(ii) != strkIds.at(ii - 1)) { n = 1; }
1410 if (strkIds.begin() != strkIds.end()) mode = strkIds.at(ind);
1411 vecMode.push_back(mode);
1413 if (strkIds.size() != 0)
1414 rhistsStitched.
fModeFrac->Fill((
double)max / (
double)strkIds.size());
1423 if (!assns)
throw cet::exception(
"TrackAna") <<
"Bad Associations. \n";
1429 NtrkIdsAll.push_back(vecMode);
1431 std::unique(NtrkIdsAll.back().begin(), NtrkIdsAll.back().end());
1433 for (
auto const val : NtrkIdsAll.back()) {
1434 sum += hitmap[val][o].size();
1436 ntvsorted.push_back(sum);
1444 for (
auto it = KEmap.rbegin(); it != KEmap.rend(); ++it) {
1452 for (
auto it = KEmap.rbegin(); it != KEmap.rend(); ++it) {
1453 int val = it->second;
1461 flattener flat(NtrkIdsAll);
1462 std::vector<unsigned int>& v = flat;
1465 for (
auto const val : v) {
1468 double T(part->
E() - 0.001 * part->
Mass());
1469 rhistsStitched.
fNTrkIdTrks->Fill(std::count(v.begin(), v.end(), val));
1470 rhistsStitched.
fNTrkIdTrks2->Fill(std::count(v.begin(), v.end(), val), T);
1482 mf::LogInfo(
"TrackAna") <<
"TrackAna statistics:\n" 1489 const MCHists& mchists = i->second;
1513 std::vector<size_t> idx(v.size());
1514 for (
size_t i = 0; i != idx.size(); ++i)
1517 std::sort(idx.begin(), idx.end(), [&v](
size_t i1,
size_t i2) {
1518 return v[i1] > v[i2];
double E(const int i=0) const
MaybeLogger_< ELseverityLevel::ELsev_info, true > LogVerbatim
unsigned int NumberTrajectoryPoints() const
const TLorentzVector & Position(const int i=0) const
simb::Origin_t Origin() const
double EndMomentum() const
double VertexMomentum() const
std::vector< sim::TrackIDE > HitToTrackIDEs(detinfo::DetectorClocksData const &clockData, recob::Hit const &hit) const
std::string fHitSpptAssocModuleLabel
std::string fTrkSpptAssocModuleLabel
MaybeLogger_< ELseverityLevel::ELsev_info, false > LogInfo
const simb::MCParticle * TrackIdToParticle_P(int id) const
std::string fSpacepointModuleLabel
Declaration of signal hit object.
double HitCollectionEfficiency(detinfo::DetectorClocksData const &clockData, std::set< int > const &trackIds, std::vector< art::Ptr< recob::Hit >> const &hits, std::vector< art::Ptr< recob::Hit >> const &allhits, geo::View_t const &view) const
Length_t DetHalfWidth(TPCID const &tpcid=tpc_zero) const
Returns the half width of the active volume of the specified TPC.
The data type to uniquely identify a Plane.
enum simb::_ev_origin Origin_t
event origin types
size_t NumberTrajectoryPoints() const
Various functions related to the presence and the number of (valid) points.
constexpr auto abs(T v)
Returns the absolute value of the argument.
Vector_t VertexDirection() const
Access to track direction at different points.
const SMatrixSym55 & VertexCovariance() const
Access to covariance matrices.
unsigned int ReadOutWindowSize() const
std::string fStitchModuleLabel
WireID_t Wire
Index of the wire within its plane.
tick ticks
Alias for common language habits.
Length_t DetLength(TPCID const &tpcid=tpc_zero) const
Returns the length of the active volume of the specified TPC.
std::map< int, MCHists > fMCHistMap
3-dimensional objects, potentially hits, clusters, prongs, etc.
Rotation_t GlobalToLocalRotationAtPoint(size_t p) const
bool isValid() const noexcept
decltype(auto) constexpr end(T &&obj)
ADL-aware version of std::end.
decltype(auto) constexpr size(T &&obj)
ADL-aware version of std::size.
auto vector(Vector const &v)
Returns a manipulator which will print the specified array.
double Length(size_t p=0) const
Access to various track properties.
#define DEFINE_ART_MODULE(klass)
std::vector< size_t > fsort_indexes(const std::vector< double > &v)
static const int NoParticleId
double HitCollectionPurity(detinfo::DetectorClocksData const &clockData, std::set< int > const &trackIds, std::vector< art::Ptr< recob::Hit >> const &hits) const
single particles thrown at the detector
void anaStitch(const art::Event &evt, detinfo::DetectorClocksData const &clockData, detinfo::DetectorPropertiesData const &detProp)
Point_t const & Vertex() const
Access to track position at different points.
double T(const int i=0) const
double ConvertXToTicks(double X, int p, int t, int c) const
const SMatrixSym55 & EndCovariance() const
Access to covariance matrices.
Provides recob::Track data product.
std::string fMCTrackModuleLabel
EventNumber_t event() const
double DriftVelocity(double efield=0., double temperature=0.) const
cm/us
Class def header for mctrack data container.
void analyze(const art::Event &evt) override
Detector simulation of raw signals on wires.
const TLorentzVector & Momentum() const
simb::Origin_t fOriginValue
ROOT::Math::PositionVector3D< ROOT::Math::Cartesian3D< double >, ROOT::Math::GlobalCoordinateSystemTag > Point_t
Type for representation of position in physical 3D space.
decltype(auto) get(T &&obj)
ADL-aware version of std::to_string.
WireID NearestWireID(Point_t const &point, PlaneID const &planeid) const
Returns the ID of wire closest to position in the specified TPC.
bool getByLabel(std::string const &label, std::string const &instance, Handle< PROD > &result) const
Contains all timing reference information for the detector.
MaybeLogger_< ELseverityLevel::ELsev_success, false > LogDebug
Vector_t EndDirection() const
Access to track direction at different points.
std::map< int, RecoHists > fRecoHistMap
const TLorentzVector & Momentum(const int i=0) const
Point_t const & End() const
Access to track position at different points.
unsigned int Nplanes(TPCID const &tpcid=tpc_zero) const
Returns the total number of planes in the specified TPC.
const MCStep & Start() const
size_type get(size_type i, reference item, data_reference data) const
Length_t DetHalfHeight(TPCID const &tpcid=tpc_zero) const
Returns the half height of the active volume of the specified TPC.
std::string fTrackModuleLabel
unsigned int TrackID() const
second_as<> second
Type of time stored in seconds, in double precision.
std::string fHitModuleLabel
Tools and modules for checking out the basics of the Monte Carlo.
art framework interface to geometry description
Track from a non-cascading particle.A recob::Track consists of a recob::TrackTrajectory, plus additional members relevant for a "fitted" track:
cet::coded_exception< error, detail::translate > exception
Signal from collection planes.