10 #include "Utilities/func/MathUtil.h" 70 if (sr->hdr.det == 1){
71 return sr->trk.kalman.tracks[0].dir.Dot(beamDirND);
74 return sr->trk.kalman.tracks[0].dir.Dot(beamDirFD);
88 if (sr->hdr.det == 1){
89 double Zbeam = sr->trk.kalman.tracks[0].dir.Dot(beamDirND);
90 double ptp = sqrt(1 - Zbeam*Zbeam);
94 double Zbeam = sr->trk.kalman.tracks[0].dir.Dot(beamDirFD);
95 double ptp = sqrt(1 - Zbeam*Zbeam);
108 double pmu = sqrt( util::sqr( kMuE( sr ) ) - util::sqr( 0.1056 ) );
109 double Zbeam = kCosNumi( sr );
110 double pt = pmu * sqrt( 1 - Zbeam * Zbeam );
171 unsigned int nought = 0;
183 if(nHit<=0)
return 0.0f;
369 if(sr->
mc.
nnu == 0)
return 0.f;
370 if(sr->
mc.
nu[0].prim.empty())
return 0.
f;
392 double slope1 = 1.01;
393 double slope2 = 1.504;
394 double stitch = 0.315;
396 return(visE*slope1 +
offset);
399 return(visE*slope2 + ((slope1-slope2)*stitch +
offset));
411 double slope1 = 1.14;
412 double slope2 = 1.475;
413 double stitch = 0.312;
415 return(visE*slope1 +
offset);
418 return(visE*slope2 + ((slope1-slope2)*stitch +
offset));
428 if(sr->
mc.
nnu == 0)
return -1.;
429 if(sr->
mc.
nu[0].prim.empty())
return -1.;
430 if(
std::abs(sr->
mc.
nu[0].prim[0].pdg) != 13)
return -1.;
433 double slope1 = 1.01;
434 double slope2 = 1.504;
435 double stitch = 0.315;
438 recoE = visE*slope1 +
offset;
441 recoE = visE*slope2 + ((slope1-slope2)*stitch + offset);
443 double trueE = sr->
mc.
nu[0].prim[0].p.E;
444 if (trueE <= 0.0)
return -1.;
445 return((recoE - trueE)/trueE);
454 if(sr->
mc.
nnu == 0)
return -1.;
455 if(sr->
mc.
nu[0].prim.empty())
return -1.;
456 if(
std::abs(sr->
mc.
nu[0].prim[0].pdg) != 13)
return -1.;
458 double offset = 0.222;
459 double slope1 = 1.14;
460 double slope2 = 1.475;
461 double stitch = 0.312;
464 recoE = visE*slope1 +
offset;
467 recoE = visE*slope2 + ((slope1-slope2)*stitch + offset);
469 double trueE = sr->
mc.
nu[0].prim[0].p.E;
470 if (trueE <= 0.0)
return -1.;
471 return((recoE - trueE)/trueE);
480 if(sr->
mc.
nnu == 0)
return -1.;
481 if(sr->
mc.
nu[0].prim.empty())
return -1.;
482 if(
std::abs(sr->
mc.
nu[0].prim[0].pdg) != 13)
return -1.;
484 double trueE = sr->
mc.
nu[0].prim[0].p.E;
485 if (trueE <= 0.0)
return -1.;
486 return((recoE - trueE)/trueE);
495 if(sr->
mc.
nnu == 0)
return -1.;
496 if(sr->
mc.
nu[0].prim.empty())
return -1.;
497 if(
std::abs(sr->
mc.
nu[0].prim[0].pdg) != 13)
return -1.;
500 double offset = 0.32;
501 double slope1 = 1.01;
502 double slope2 = 1.504;
503 double stitch = 0.315;
506 recoE = visE*slope1 +
offset;
509 recoE = visE*slope2 + ((slope1-slope2)*stitch + offset);
511 if (recoETrkLen <= 0.0)
return -1.;
512 return((recoE - recoETrkLen)/recoETrkLen);
523 double offset = 0.222;
524 double slope1 = 1.14;
525 double slope2 = 1.475;
526 double stitch = 0.312;
529 recoE = visE*slope1 +
offset;
532 recoE = visE*slope2 + ((slope1-slope2)*stitch + offset);
534 if (recoETrkLen <= 0.0)
return -1.;
535 return((recoE - recoETrkLen)/recoETrkLen);
570 const double M_mu_sqrd =
util::sqr(0.1056);
571 double E_mu =
kMuE(sr);
573 return 2 *
kCCE(sr) * ( E_mu - p_mu *
kCosNumi(sr) ) - M_mu_sqrd;
590 const double M_p = 0.938272;
591 double WSq = M_p * M_p + 2 * M_p * (
kCCE(sr) -
kMuE(sr)) -
kRecoQ2(sr);
Near Detector underground.
const Var kHadNHit([](const caf::SRProxy *sr){unsigned int nought=0;if(sr->trk.kalman.ntracks< 1) return nought;return sr->slc.nhit-sr->trk.kalman.tracks[0].nhit;})
caf::Proxy< float > trkccE
const Var kNonQEE
Energy estimator for non quasielastic CC events.
const ana::Var kRecoQ2([](const caf::SRProxy *sr){const double M_mu_sqrd=util::sqr(0.1056);double E_mu=kMuE(sr);double p_mu=sqrt(util::sqr(E_mu)-M_mu_sqrd);return 2 *kCCE(sr)*(E_mu-p_mu *kCosNumi(sr))-M_mu_sqrd;})
Reconstructed four-momentum transfer invariant (Q^2)
caf::Proxy< float > cosbakdist
Far Detector at Ash River.
const Var kNcellsFromEdge
Cuts and Vars for the 2020 FD DiF Study.
const Var kSlcMeanTime([](const caf::SRProxy *sr){return sr->slc.meantime/1000.;})
const Var kKalmanBackwardCell
const Var kNumuMuonPt([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks > 0 &&sr->trk.kalman.idxremid!=999){double pmu=sqrt(util::sqr(kMuE(sr))-util::sqr(0.1056));double Zbeam=kCosNumi(sr);double pt=pmu *sqrt(1-Zbeam *Zbeam);return(float) pt;}return-5.f;})
caf::Proxy< unsigned int > idxremid
const Var kSlcMaxZ([](const caf::SRProxy *sr){return sr->slc.boxmax.Z()/100.;})
const Var kSlcCalEPerNHit([](const caf::SRProxy *sr){if(sr->slc.nhit > 0) return sr->slc.calE/(1.78 *sr->slc.nhit);return-5.;})
const Var kSlcMaxY([](const caf::SRProxy *sr){return sr->slc.boxmax.Y()/100.;})
caf::Proxy< size_t > ntracks
caf::Proxy< caf::SRHeader > hdr
caf::Proxy< float > starttime
const Var kRecoQmag([](const caf::SRProxy *sr){return sqrt(kRecoQ2(sr)+util::sqr(kHadE(sr)));})
Reconstructed three-momentum transfer.
const Var kNumuCosRejAngleKal
caf::Proxy< caf::SRContain > contain
caf::Proxy< caf::SRNumuEnergy > numu
Proxy for caf::StandardRecord.
caf::Proxy< std::vector< caf::SRNeutrino > > nu
const Var kTrkStartY([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return-10.0f;return sr->trk.kalman.tracks[0].start.Y()/100;})
caf::Proxy< float > hadtrkE
const Var kSliceTime([](const caf::SRProxy *sr){return sr->slc.meantime/1000;})
const Var kCosBackDist([](const caf::SRProxy *sr){return sr->sel.contain.cosbakdist/100.;})
const Var kSliceDuration([](const caf::SRProxy *sr){return(sr->slc.endtime-sr->slc.starttime);})
const Var kCosFwdDist([](const caf::SRProxy *sr){return sr->sel.contain.cosfwddist/100.;})
caf::Proxy< short int > nnu
const Var kSlcExtentY([](const caf::SRProxy *sr){return(sr->slc.boxmax.Y()-sr->slc.boxmin.Y())/100.;})
const Var kTrkCalEPerNHit([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return 0.f;return sr->trk.kalman.tracks[0].calE/sr->trk.kalman.tracks[0].nhit;})
const Var kMuonRecoRelTrueTrkLen([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return-1.;if(sr->energy.numu.trkccE<=0) return-1.;if(sr->energy.numu.hadtrkE< 0) return-1.;if(sr->mc.nnu==0) return-1.;if(sr->mc.nu[0].prim.empty()) return-1.;if(std::abs(sr->mc.nu[0].prim[0].pdg)!=13) return-1.;double recoE=sr->energy.numu.recomuonE;double trueE=sr->mc.nu[0].prim[0].p.E;if(trueE<=0.0) return-1.;return((recoE-trueE)/trueE);})
caf::Proxy< caf::SREnergyBranch > energy
const Var kRecoMuonEFromVisEND([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return 0.;if(sr->energy.numu.trkccE<=0) return 0.;if(sr->energy.numu.hadtrkE< 0) return 0.;double visE=((sr->trk.kalman.tracks[0].calE)/1.78)-sr->energy.numu.hadtrkE;double offset=0.222;double slope1=1.14;double slope2=1.475;double stitch=0.312;if(visE< stitch){return(visE *slope1+offset);}else{return(visE *slope2+((slope1-slope2)*stitch+offset));}})
const Var kDirZ([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return-5.f;return sr->trk.kalman.tracks[0].dir.Z();})
const Var kTrkLength([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return-5.f;return sr->trk.kalman.tracks[0].len/100;})
T sqr(T x)
More efficient square function than pow(x,2)
const Var kSlcMinX([](const caf::SRProxy *sr){return sr->slc.boxmin.X()/100.;})
#define SIMPLEVAR(CAFNAME)
For Vars where literally all you need is a single CAF variable.
const Var kHadEPerNHit([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return 0.0f;int nHit=sr->slc.nhit-sr->trk.kalman.tracks[0].nhit;if(nHit<=0) return 0.0f;float hadE=sr->energy.numu.hadcalE;return hadE/nHit;})
const Var kRecoMuonEFromVisEFD([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return 0.;if(sr->energy.numu.trkccE<=0) return 0.;if(sr->energy.numu.hadtrkE< 0) return 0.;double visE=((sr->trk.kalman.tracks[0].calE)/1.78)-sr->energy.numu.hadtrkE;double offset=0.32;double slope1=1.01;double slope2=1.504;double stitch=0.315;if(visE< stitch){return(visE *slope1+offset);}else{return(visE *slope2+((slope1-slope2)*stitch+offset));}})
const Var kNumuHadVisE([](const caf::SRProxy *sr){return kNumuHadCalE(sr)+kNumuHadTrkE(sr);})
const Var kSlcMaxX([](const caf::SRProxy *sr){return sr->slc.boxmax.X()/100.;})
caf::Proxy< unsigned int > ncalhit
const Var kCosmicForwardCell
const Var kDirY([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return-5.f;return sr->trk.kalman.tracks[0].dir.Y();})
_Var< caf::SRProxy > Var
Representation of a variable to be retrieved from a caf::StandardRecord object.
const Var kMuonRecoRelTrueVisEND([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return-1.;if(sr->energy.numu.trkccE<=0) return-1.;if(sr->energy.numu.hadtrkE< 0) return-1.;if(sr->mc.nnu==0) return-1.;if(sr->mc.nu[0].prim.empty()) return-1.;if(std::abs(sr->mc.nu[0].prim[0].pdg)!=13) return-1.;double visE=((sr->trk.kalman.tracks[0].calE)/1.78)-sr->energy.numu.hadtrkE;double offset=0.222;double slope1=1.14;double slope2=1.475;double stitch=0.312;double recoE=-5.0;if(visE< stitch){recoE=visE *slope1+offset;}else{recoE=visE *slope2+((slope1-slope2)*stitch+offset);}double trueE=sr->mc.nu[0].prim[0].p.E;if(trueE<=0.0) return-1.;return((recoE-trueE)/trueE);})
const Var kSlcMinY([](const caf::SRProxy *sr){return sr->slc.boxmin.Y()/100.;})
const Var kMuonRecoRelRecoFD([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return-1.;if(sr->energy.numu.trkccE<=0) return-1.;if(sr->energy.numu.hadtrkE< 0) return-1.;if(sr->mc.nnu==0) return-1.;if(sr->mc.nu[0].prim.empty()) return-1.;if(std::abs(sr->mc.nu[0].prim[0].pdg)!=13) return-1.;double recoETrkLen=sr->energy.numu.recomuonE;double visE=((sr->trk.kalman.tracks[0].calE)/1.78)-sr->energy.numu.hadtrkE;double offset=0.32;double slope1=1.01;double slope2=1.504;double stitch=0.315;double recoE=-5.0;if(visE< stitch){recoE=visE *slope1+offset;}else{recoE=visE *slope2+((slope1-slope2)*stitch+offset);}if(recoETrkLen<=0.0) return-1.;return((recoE-recoETrkLen)/recoETrkLen);})
caf::Proxy< caf::SRVector3D > boxmin
Track finder for cosmic rays.
const Var kRecoMuonEFromTrkLen([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return 0.f;if(sr->energy.numu.trkccE<=0) return 0.f;if(sr->energy.numu.hadtrkE< 0) return 0.f;return float(sr->energy.numu.recomuonE);})
caf::Proxy< unsigned int > nhit
caf::Proxy< float > trkqeE
caf::Proxy< float > endtime
const Var kKalmanFwdDist([](const caf::SRProxy *sr){return sr->sel.contain.kalfwddist/100.;})
const Var kMuonRecoRelTrueVisEFD([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return-1.;if(sr->energy.numu.trkccE<=0) return-1.;if(sr->energy.numu.hadtrkE< 0) return-1.;if(sr->mc.nnu==0) return-1.;if(sr->mc.nu[0].prim.empty()) return-1.;if(std::abs(sr->mc.nu[0].prim[0].pdg)!=13) return-1.;double visE=((sr->trk.kalman.tracks[0].calE)/1.78)-sr->energy.numu.hadtrkE;double offset=0.32;double slope1=1.01;double slope2=1.504;double stitch=0.315;double recoE=-5.0;if(visE< stitch){recoE=visE *slope1+offset;}else{recoE=visE *slope2+((slope1-slope2)*stitch+offset);}double trueE=sr->mc.nu[0].prim[0].p.E;if(trueE<=0.0) return-1.;return((recoE-trueE)/trueE);})
caf::Proxy< caf::SRTrackBranch > trk
const Var kMuonRecoRelRecoND([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return-1.;if(sr->energy.numu.trkccE<=0) return-1.;if(sr->energy.numu.hadtrkE< 0) return-1.;double recoETrkLen=sr->energy.numu.recomuonE;double visE=((sr->trk.kalman.tracks[0].calE)/1.78)-sr->energy.numu.hadtrkE;double offset=0.222;double slope1=1.14;double slope2=1.475;double stitch=0.312;double recoE=-5.0;if(visE< stitch){recoE=visE *slope1+offset;}else{recoE=visE *slope2+((slope1-slope2)*stitch+offset);}if(recoETrkLen<=0.0) return-1.;return((recoE-recoETrkLen)/recoETrkLen);})
const Var kNumuContPID2019
const Var kTrkStartZ([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return-10.0f;return sr->trk.kalman.tracks[0].start.Z()/100;})
const Var kNumuMuonPtP([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks > 0 &&sr->trk.kalman.idxremid!=999){if(sr->hdr.det==1){double Zbeam=sr->trk.kalman.tracks[0].dir.Dot(beamDirND);double ptp=sqrt(1-Zbeam *Zbeam);return(float) ptp;}if(sr->hdr.det==2){double Zbeam=sr->trk.kalman.tracks[0].dir.Dot(beamDirFD);double ptp=sqrt(1-Zbeam *Zbeam);return(float) ptp;}}return-5.f;})
const Var kNonQeHadE([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks > 0 &&sr->trk.kalman.idxremid!=999) return float(sr->energy.numu.recotrkcchadE);return-5.f;})
const Var kSlcStartTime([](const caf::SRProxy *sr){return sr->slc.starttime/1000.;})
const Var kVisTrkCalE([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return 0.;if(sr->energy.numu.trkccE<=0) return 0.;if(sr->energy.numu.hadtrkE< 0) return 0.;return((sr->trk.kalman.tracks[0].calE)/1.78)-sr->energy.numu.hadtrkE;})
caf::Proxy< float > recotrkcchadE
const Var kTrkCalE([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return 0.f;return float(sr->trk.kalman.tracks[0].calE);})
const Var kKalmanForwardCell
caf::Proxy< float > hadcalE
const Var kKalmanBackDist([](const caf::SRProxy *sr){return sr->sel.contain.kalbakdist/100.;})
const Var kQeHadE([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks > 0 &&sr->trk.kalman.idxremid!=999) return sr->energy.numu.trkqeE-sr->energy.numu.recomuonE;return-5.f;})
const Var kTrkStartX([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return-10.0f;return sr->trk.kalman.tracks[0].start.X()/100;})
const Var kTrkEndZ([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return-10.0f;return sr->trk.kalman.tracks[0].stop.Z()/100;})
const Var kMuEPerNHit([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return 0.f;return(float) kMuE(sr)/sr->trk.kalman.tracks[0].nhit;})
caf::Proxy< caf::SRTruthBranch > mc
const Var kRecoW([](const caf::SRProxy *sr){const double M_p=0.938272;double WSq=M_p *M_p+2 *M_p *(kCCE(sr)-kMuE(sr))-kRecoQ2(sr);if(WSq > 0) return sqrt(WSq);else return-5.;})
Reconstructed invariant mass (W)
caf::Proxy< caf::SRKalman > kalman
const Var kTrkNPlaneGap([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks > 0 &&sr->trk.kalman.idxremid!=999) return int(sr->trk.kalman.tracks[0].nplanegap);return 500;})
caf::Proxy< float > kalbakdist
caf::Proxy< caf::SRSlice > slc
const Var kTrkEndY([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return-10.0f;return sr->trk.kalman.tracks[0].stop.Y()/100;})
const Var kTrkEndX([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return-10.0f;return sr->trk.kalman.tracks[0].stop.X()/100;})
const Var kSlcEndTime([](const caf::SRProxy *sr){return sr->slc.endtime/1000.;})
const Var kTrueMuonE([](const caf::SRProxy *sr){if(sr->mc.nnu==0) return 0.f;if(sr->mc.nu[0].prim.empty()) return 0.f;if(std::abs(sr->mc.nu[0].prim[0].pdg)!=13) return 0.f;return float(sr->mc.nu[0].prim[0].p.E);})
const Var kDirX([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return-5.f;return sr->trk.kalman.tracks[0].dir.X();})
const Var kRecoThetaMu([](const caf::SRProxy *sr){return acos(kCosNumi(sr))*180.0/3.1416;})
caf::Proxy< float > meantime
caf::Proxy< float > cosfwddist
const Var kQEE
Energy estimator for quasielastic CC events.
caf::Proxy< float > recomuonE
const Var kCosmicBackwardCell
TVector3 NuMIBeamDirection(caf::Det_t det)
Average direction of NuMI neutrinos in a given detector This function is a copy of geo::GeometryBase:...
const Var kNplanesToFront
const Var kcosDirY([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return-5.f;return(float) cos(kDirY(sr));})
caf::Proxy< std::vector< caf::SRKalmanTrack > > tracks
caf::Proxy< caf::SRIDBranch > sel
const Var kSlcExtentX([](const caf::SRProxy *sr){return(sr->slc.boxmax.X()-sr->slc.boxmin.X())/100.;})
caf::Proxy< float > kalfwddist
const Var kSlcExtentZ([](const caf::SRProxy *sr){return(sr->slc.boxmax.Z()-sr->slc.boxmin.Z())/100.;})
const Var kSlcUnCalibNHit([](const caf::SRProxy *sr){return sr->slc.nhit-sr->slc.ncalhit;})
const Var kCosNumi([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks > 0 &&sr->trk.kalman.idxremid!=999){if(sr->hdr.det==1){return sr->trk.kalman.tracks[0].dir.Dot(beamDirND);}if(sr->hdr.det==2){return sr->trk.kalman.tracks[0].dir.Dot(beamDirFD);}}return-5.f;})
const Var kSlcMinZ([](const caf::SRProxy *sr){return sr->slc.boxmin.Z()/100.;})
const Var kTrkNhits([](const caf::SRProxy *sr){if(sr->trk.kalman.ntracks< 1) return 65535;return int(sr->trk.kalman.tracks[0].nhit);})
caf::Proxy< caf::SRVector3D > boxmax
const Var kNumuCosRejAngleCos