5 #include "CAFAna/Core/Cut.h" 6 #include "CAFAna/Core/Var.h" const Var kBPFBestMuonStopz([](const caf::SRProxy *sr){float stopz=-999.0;if(kBPFValidMuon(sr)==false) return-999.f; unsigned int muIdx=(unsigned int) kCVNMuonIdx(sr);if(sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.IsValid) stopz=sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.stop.z/100.0;return stopz;})
: Reco End Z-position for the best muon track
const Var kBPFBestMuonTrkNPlaneGap([](const caf::SRProxy *sr){int nplanegap=500;if(kBPFValidMuon(sr)==false) return 500;unsigned int muIdx=(unsigned int) kCVNMuonIdx(sr);if(sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.IsValid) nplanegap=sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.nplanegap;return nplanegap;})
: Number of missing planes for best muon track
Cuts and Vars for the 2020 FD DiF Study.
const Var kBPFBestMuonDirx([](const caf::SRProxy *sr){float dirx=-5.0;if(kBPFValidMuon(sr)==false) return-5.f; unsigned int muIdx=(unsigned int) kCVNMuonIdx(sr);if(sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.IsValid) dirx=sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.dir.x;return dirx;})
: Reco Start X-direction for the best muon track
const Var kBPFBestMuonHitRatio([](const caf::SRProxy *sr){float hitRatio=-5.0;if(kBPFValidMuon(sr)==false) return-5.f; unsigned int muIdx=(unsigned int) kCVNMuonIdx(sr);if(sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.IsValid) hitRatio=sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.hitRatio;return hitRatio;})
: hitRatio for the best muon track
const Var kBPFBestMuonStopx([](const caf::SRProxy *sr){float stopx=-999.0;if(kBPFValidMuon(sr)==false) return-999.f; unsigned int muIdx=(unsigned int) kCVNMuonIdx(sr);if(sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.IsValid) stopx=sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.stop.x/100.0;return stopx;})
: Reco End X-position for the best muon track
const Var kBPFBestMuonStartx([](const caf::SRProxy *sr){float startx=-999.0;if(kBPFValidMuon(sr)==false) return-999.f; unsigned int muIdx=(unsigned int) kCVNMuonIdx(sr);if(sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.IsValid) startx=sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.start.x/100.0;return startx;})
: Reco Start X-position for the best muon track
const MultiVar kBPFAllTrkLenProton(BPFAllTrkLenHelper(2212))
: track length for all BPF tracks under the proton assumption
const Var kBPFBestMuonStartz([](const caf::SRProxy *sr){float startz=-999.0;if(kBPFValidMuon(sr)==false) return-999.f; unsigned int muIdx=(unsigned int) kCVNMuonIdx(sr);if(sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.IsValid) startz=sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.start.z/100.0;return startz;})
: Reco Start Z-position for the best muon track
const Var kBPFBestMuonDirz([](const caf::SRProxy *sr){float dirz=-5.0;if(kBPFValidMuon(sr)==false) return-5.f; unsigned int muIdx=(unsigned int) kCVNMuonIdx(sr);if(sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.IsValid) dirz=sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.dir.z;return dirz;})
: Reco Start Z-direction for the best muon track
const Var kBPFBestMuonCalE([](const caf::SRProxy *sr){float calE=-5.0;if(kBPFValidMuon(sr)==false) return-5.f; unsigned int muIdx=(unsigned int) kCVNMuonIdx(sr);if(sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.IsValid) calE=sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.calE;return calE;})
: Cal energy for the best muon track
const Var kCVNMuonIdx([](const caf::SRProxy *sr){float longest_idx=-5.0;float longest_len=-5.0;if(sr->vtx.elastic.IsValid){for(unsigned int png_idx=0;png_idx< sr->vtx.elastic.fuzzyk.png.size();png_idx++){auto &png=sr->vtx.elastic.fuzzyk.png[png_idx];if(png.len > longest_len){longest_len=png.len;longest_idx=png_idx;}}} if(longest_len > 500.0) return longest_idx;float best_idx=-5.0;float best_score=-5.0;if(sr->vtx.elastic.IsValid){for(unsigned int png_idx=0;png_idx< sr->vtx.elastic.fuzzyk.png.size();png_idx++){auto &png=sr->vtx.elastic.fuzzyk.png[png_idx];if(png.cvnpart.muonid > best_score){best_score=png.cvnpart.muonid;best_idx=png_idx;}}}return best_idx;})
: Prong index of best muon prong by CVN score & length
const MultiVar kBPFAllTrkLenPion(BPFAllTrkLenHelper(211))
: track length for all BPF tracks under the pion assumption
const Var kBPFBestMuonPx([](const caf::SRProxy *sr){float px=-5.0;if(kBPFValidMuon(sr)==false) return-5.f; unsigned int muIdx=(unsigned int) kCVNMuonIdx(sr);if(sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.IsValid) px=sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.momentum.x;return px;})
: Reco X-momentum for the best muon track
const Var kBPFBestMuondEdXLL([](const caf::SRProxy *sr){float dEdXLL=-999.0;if(kBPFValidMuon(sr)==false) return-5.f; unsigned int muIdx=(unsigned int) kCVNMuonIdx(sr);if(sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.IsValid) dEdXLL=sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.dEdXLL;return dEdXLL;})
: dEdXLL for the best muon track
const Var kBPFBestMuonTrkE([](const caf::SRProxy *sr){float trkE=-5.0;if(kBPFValidMuon(sr)==false) return-5.f; unsigned int muIdx=(unsigned int) kCVNMuonIdx(sr);if(sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.IsValid) trkE=sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.energy;return trkE;})
: Track energy for the best muon track
const Var kBPFBestMuonPz([](const caf::SRProxy *sr){float pz=-5.0;if(kBPFValidMuon(sr)==false) return-5.f; unsigned int muIdx=(unsigned int) kCVNMuonIdx(sr);if(sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.IsValid) pz=sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.momentum.z;return pz;})
: Reco Z-momentum for the best muon track
const Var kBPFBestMuonBakCell([](const caf::SRProxy *sr){float trkbakcell=-5.0;if(kBPFValidMuon(sr)==false) return-5.f; unsigned int muIdx=(unsigned int) kCVNMuonIdx(sr);if(sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.IsValid) trkbakcell=sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.trkbakcell;return trkbakcell;})
: Projected number of cells from endpoint backward to detector edge for the best muon track ...
const Var kBPFBestMuonCosNumi([](const caf::SRProxy *sr){float cosnumi=-5.0;if(kBPFValidMuon(sr)==false) return-5.f; unsigned int muIdx=(unsigned int) kCVNMuonIdx(sr);if(sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.IsValid){if(sr->hdr.det==caf::kNEARDET) cosnumi=sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.dir.Dot(beamDirND);if(sr->hdr.det==caf::kFARDET) cosnumi=sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.dir.Dot(beamDirFD);}return cosnumi;})
: Cos(NuMI beam dir) w.r.t. Best BPF Muon track
_Cut< caf::SRProxy > Cut
Representation of a cut (selection) to be applied to a caf::StandardRecord object.
const Var kBPFBestMuonNhits([](const caf::SRProxy *sr){float Nhits=-5.0;if(kBPFValidMuon(sr)==false) return-999.f; unsigned int muIdx=(unsigned int) kCVNMuonIdx(sr);if(sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.IsValid) Nhits=sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.nhit;return Nhits;})
: Number of hits in the best muon track
const Var kBPFBestMuonStopy([](const caf::SRProxy *sr){float stopy=-999.0;if(kBPFValidMuon(sr)==false) return-999.f; unsigned int muIdx=(unsigned int) kCVNMuonIdx(sr);if(sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.IsValid) stopy=sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.stop.y/100.0;return stopy;})
: Reco End Y-position for the best muon track
const Var kBPFBestMuonPosAtTrans([](const caf::SRProxy *sr){float trkyposattrans=-5.0;if(kBPFValidMuon(sr)==false) return-5.f; unsigned int muIdx=(unsigned int) kCVNMuonIdx(sr);if(sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.IsValid) trkyposattrans=sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.trkyposattrans;return trkyposattrans;})
: Position at the MuCat transition for the best muon track
const Var kBPFBestMuonStarty([](const caf::SRProxy *sr){float starty=-999.0;if(kBPFValidMuon(sr)==false) return-999.f; unsigned int muIdx=(unsigned int) kCVNMuonIdx(sr);if(sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.IsValid) starty=sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.start.y/100.0;return starty;})
: Reco Start Y-position for the best muon track
const Var kBPFBestMuonDiry([](const caf::SRProxy *sr){float diry=-5.0;if(kBPFValidMuon(sr)==false) return-5.f; unsigned int muIdx=(unsigned int) kCVNMuonIdx(sr);if(sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.IsValid) diry=sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.dir.y;return diry;})
: Reco Start Y-direction for the best muon track
const MultiVar kBPFPionRecoE([](const caf::SRProxy *sr){unsigned int muIdx=(unsigned int) kCVNMuonIdx(sr);std::vector< double > recoE;if(sr->vtx.elastic.IsValid){for(unsigned int png_idx=0;png_idx< sr->vtx.elastic.fuzzyk.png.size();png_idx++){if((unsigned int) png_idx==muIdx) continue;auto &png=sr->vtx.elastic.fuzzyk.png[png_idx];if(!png.bpf.pion.IsValid) continue;recoE.push_back(png.bpf.pion.energy);}}return recoE;})
: EXAMPLE MULTIVAR: reco E for all "pion-like" tracks
const Var kBPFBestMuonFwdCell([](const caf::SRProxy *sr){float trkfwdcell=-5.0;if(kBPFValidMuon(sr)==false) return-5.f; unsigned int muIdx=(unsigned int) kCVNMuonIdx(sr);if(sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.IsValid) trkfwdcell=sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.trkfwdcell;return trkfwdcell;})
: Projected number of cells from endpoint forward to detector edge for the best muon track ...
const MultiVar kBPFAllTrkLenMuon(BPFAllTrkLenHelper(13))
: track length for all BPF tracks under the muon assumption
const Var kBPFBestMuonTrkNPlanes([](const caf::SRProxy *sr){int nplanes=500;if(kBPFValidMuon(sr)==false) return 500;unsigned int muIdx=(unsigned int) kCVNMuonIdx(sr);if(sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.IsValid) nplanes=sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.nplane;return nplanes;})
: Number of planes for best muon track
const Var kBPFBestMuonCosDirY([](const caf::SRProxy *sr){float diry=kBPFBestMuonDiry(sr);if(diry==-5) return diry;else return(float) cos(diry);})
: Cosine of Reco Start Y-direction for the best muon track
const Cut kBPFValidMuon
: Make sure CVN-prong returns a valid muon score.
const Var kBPFBestMuonFwdCellND([](const caf::SRProxy *sr){float trkfwdcellnd=-5.0;if(kBPFValidMuon(sr)==false) return-5.f; unsigned int muIdx=(unsigned int) kCVNMuonIdx(sr);if(sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.IsValid) trkfwdcellnd=sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.trkfwdcellnd;return trkfwdcellnd;})
: Projected number of cells from endpoint forward to detector edge in ND for the best muon track ...
const Var kBPFBestMuonChi2T([](const caf::SRProxy *sr){float chi2T=-5.0;if(kBPFValidMuon(sr)==false) return-5.f; unsigned int muIdx=(unsigned int) kCVNMuonIdx(sr);if(sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.IsValid) chi2T=sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.chi2T;return chi2T;})
: chi2T for the best muon track
const Var kBPFBestMuonPy([](const caf::SRProxy *sr){float py=-5.0;if(kBPFValidMuon(sr)==false) return-5.f; unsigned int muIdx=(unsigned int) kCVNMuonIdx(sr);if(sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.IsValid) py=sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.momentum.y;return py;})
: Reco Y-momentum for the best muon track
const Var kBPFBestMuonNpng([](const caf::SRProxy *sr){float npng=-5.0;if(kBPFValidMuon(sr)==false) return-999.f;npng=sr->vtx.elastic.fuzzyk.npng;return npng;})
: Best muon PID for the slice
const Var kBPFBestMuonPtP([](const caf::SRProxy *sr){float ptp=-5.0;if(kBPFValidMuon(sr)==false) return-5.f; unsigned int muIdx=(unsigned int) kCVNMuonIdx(sr);double Zbeam=-5.0;if(sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.IsValid){if(sr->hdr.det==caf::kNEARDET) Zbeam=sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.dir.Dot(beamDirND);if(sr->hdr.det==caf::kFARDET) Zbeam=sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.dir.Dot(beamDirFD);}if(Zbeam==-5.0) ptp=-5.0;else ptp=sqrt(1-Zbeam *Zbeam);return ptp;})
: Pt/P for Best Muon track
const Var kBPFLongestMuonTrkLen([](const caf::SRProxy *sr){float length=-1.0;if(kBPFValidMuon(sr)==false) return-5.f;if(sr->vtx.elastic.IsValid){for(unsigned int png_idx=0;png_idx< sr->vtx.elastic.fuzzyk.png.size();png_idx++){auto &png=sr->vtx.elastic.fuzzyk.png[png_idx]; if(png.bpf.muon.len > length &&png.bpf.muon.IsValid){length=png.bpf.muon.len;}}}return length;})
: EXAMPLE VAR: longest track length under the muon assumption
const Var kBPFBestMuonBakCellND([](const caf::SRProxy *sr){float trkbakcellnd=-5.0;if(kBPFValidMuon(sr)==false) return-5.f; unsigned int muIdx=(unsigned int) kCVNMuonIdx(sr);if(sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.IsValid) trkbakcellnd=sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.trkbakcellnd;return trkbakcellnd;})
: Projected number of cells from endpoint backward to detector edge in ND for the best muon track ...
const Var kBPFBestMuonTrkLen([](const caf::SRProxy *sr){float len=-1.0;if(kBPFValidMuon(sr)==false) return-5.f; unsigned int muIdx=(unsigned int) kCVNMuonIdx(sr);if(sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.IsValid) len=sr->vtx.elastic.fuzzyk.png[muIdx].bpf.muon.len/100.0;return len;})
: Reco length for the best muon track