6 #include "CAFAna/Core/Var.h"
const Var kProtonCount([](const caf::SRProxy *sr){int count=0;const caf::SRVector3DProxy &vtx=sr->vtx.elastic.vtx;for(unsigned int i=0;i< sr->vtx.elastic.fuzzyk.npng;++i){if(sr->vtx.elastic.fuzzyk.png[i].cvnpart.pdgmax!=2212) continue;const caf::SRVector3DProxy &st=sr->vtx.elastic.fuzzyk.png[i].start;if(util::pythag(vtx.X()-st.X(), vtx.Y()-st.Y(), vtx.Z()-st.Z())>20) if(sr->vtx.elastic.fuzzyk.png[i].cvnpart.maxval< 0.9) continue;count++;}return count;})
Cuts and Vars for the 2020 FD DiF Study.
const Var kConfusionCVNLEM([](const caf::SRProxy *sr){std::cout<< "ERROR::kConfusionCVNLEM. Looking for cvnProd3Train. Branch no longer exists."<< std::endl;abort();return-5.;})
const Var kEMNhit([](const caf::SRProxy *sr){if(!sr->vtx.elastic.IsValid) return-1.0;if(sr->vtx.elastic.fuzzyk.npng< 1) return-1.0;double Nhit=0;for(const caf::SRFuzzyKProngProxy &png:sr->vtx.elastic.fuzzyk.png){double hits=png.nhit;double emPID=((double) png.cvnpart.photonid+ (double) png.cvnpart.pizeroid+ (double) png.cvnpart.electronid);double haPID=((double) png.cvnpart.protonid+ (double) png.cvnpart.pionid+ (double) png.cvnpart.neutronid+ (double) png.cvnpart.otherid+ (double) png.cvnpart.muonid);if(emPID<=0) continue;if(emPID >=haPID ) Nhit+=hits;}return Nhit;})
const Var kHADEPerHit([](const caf::SRProxy *sr){if((sr->slc.nhit-kEMNhit(sr))>0) return 1000.0 *(sr->slc.calE *CalibrationBugCorrectionFactor(sr->hdr)-kemCalE(sr))/(sr->slc.nhit-kEMNhit(sr));else return-5.;})
const Var kConfusionCVNLID([](const caf::SRProxy *sr){std::cout<< "ERROR::kConfusionCVNLID. Looking for cvnProd3Train. Branch no longer exists."<< std::endl;abort();return-5.;})
const Var kCVNmQE([](const caf::SRProxy *sr){float cvnOut=-1;std::cout<< "ERROR::kCVNeQE. Looking for cvnProd3Train. Branch no longer exists."<< std::endl;abort(); return cvnOut;})
const Var kProngCVNMaxProtonDist([](const caf::SRProxy *sr){double score=-5;double dist=-5;const caf::SRVector3DProxy &vtx=sr->vtx.elastic.vtx;for(unsigned int i=0;i< sr->vtx.elastic.fuzzyk.npng;++i){if(sr->vtx.elastic.fuzzyk.png[i].cvnpart.protonid > score){score=sr->vtx.elastic.fuzzyk.png[i].cvnpart.protonid;const caf::SRVector3DProxy &st=sr->vtx.elastic.fuzzyk.png[i].start;dist=util::pythag(vtx.X()-st.X(), vtx.Y()-st.Y(), vtx.Z()-st.Z());}}return dist;})
return distance from vertex for most proton-like prong
const Var kFirstProngCosTheta([](const caf::SRProxy *sr){if(!sr->vtx.elastic.IsValid) return-1000.f;if(sr->vtx.elastic.fuzzyk.npng< 1) return-1000.f;TVector3 prongDir=(TVector3) sr->vtx.elastic.fuzzyk.png[0].dir;TVector3 beamDir=ana::NuMIBeamDirection(sr->hdr.det);return float(prongDir.Dot(beamDir));})
const Var kemCalE([](const caf::SRProxy *sr){if(!sr->vtx.elastic.IsValid) return-1.0;if(sr->vtx.elastic.fuzzyk.npng< 1) return-1.0;double CVNem_CalE=0;for(const caf::SRFuzzyKProngProxy &png:sr->vtx.elastic.fuzzyk.png){double png_CalE=png.calE;double emPID=((double) png.cvnpart.photonid+ (double) png.cvnpart.pizeroid+ (double) png.cvnpart.electronid);double haPID=((double) png.cvnpart.protonid+ (double) png.cvnpart.pionid+ (double) png.cvnpart.neutronid+ (double) png.cvnpart.otherid+ (double) png.cvnpart.muonid);if(emPID<=0) continue;if(emPID >=haPID ) CVNem_CalE+=png_CalE;}return CVNem_CalE *CalibrationBugCorrectionFactor(sr->hdr);})
const Var kCVNmDIS([](const caf::SRProxy *sr){float cvnOut=-1;std::cout<< "ERROR::kCVNmDIS. Looking for cvnProd3Train. Branch no longer exists."<< std::endl;abort(); return cvnOut;})
const Var kemE2017([](const caf::SRProxy *sr){if(!sr->vtx.elastic.IsValid) return-1.0;if(sr->vtx.elastic.fuzzyk.npng< 1) return-1.0;return NueRecoE_2017FDFit(kCVNemE(sr), 0.0);})
const Var kNueHadEFrac2020([](const caf::SRProxy *sr){if(!sr->vtx.elastic.IsValid) return-1.0;if(sr->vtx.elastic.fuzzyk.npng< 1) return-1.0;if(kNueEnergy2020(sr) > 0.) return(kRecoHADE(sr)/kNueEnergy2020(sr));else return-5.;})
const Var kNueHadEFrac2([](const caf::SRProxy *sr){if(!sr->vtx.elastic.IsValid) return-1.0;if(sr->vtx.elastic.fuzzyk.npng< 1) return-1.0;if(kNueEnergy2018(sr) >0) return(kRecoHADE(sr)/kNueEnergy2018(sr));else return-5.;})
const Var kNueHadEFrac([](const caf::SRProxy *sr){if(!sr->vtx.elastic.IsValid) return-1.0;if(sr->vtx.elastic.fuzzyk.npng< 1) return-1.0;if(kNueEnergy2018(sr)>0){if(kIsRHC(sr)) return(NueRecoE_2018RHCFit(0.0, kRecoHADE(sr)))/(NueRecoE_2018RHCFit(kRecoEME(sr), kRecoHADE(sr)));else return(NueRecoE_2017FDFit(0.0, kRecoHADE(sr)))/NueRecoE_2017FDFit(kRecoEME(sr), kRecoHADE(sr));}else return-5.;})
const Var kCVNmRES([](const caf::SRProxy *sr){float cvnOut=-1;std::cout<< "ERROR::kCVNmRES. Looking for cvnProd3Train. Branch no longer exists."<< std::endl;abort(); return cvnOut;})
const Var kEPerHit([](const caf::SRProxy *sr){if(sr->slc.nhit >0) return 1000.0 *(sr->slc.calE/sr->slc.nhit);else return-5.;})
const Var kHadCalE([](const caf::SRProxy *sr){if(!sr->vtx.elastic.IsValid) return float(sr->slc.calE);if(sr->vtx.elastic.fuzzyk.nshwlid< 1) return float(sr->slc.calE);return((sr->slc.calE- sr->vtx.elastic.fuzzyk.png[0].shwlid.calE));})
_Var< caf::SRProxy > Var
Representation of a variable to be retrieved from a caf::StandardRecord object.
const Var kPtpMassless([](const caf::SRProxy *sr){if(std::isnan(1.*sr->sel.nuecosrej.photptp)|| std::isinf(1.*sr->sel.nuecosrej.photptp)) return-1.f;return float(sr->sel.nuecosrej.photptp);})
const Var kCVNeOTHER([](const caf::SRProxy *sr){float cvnOut=-1;std::cout<< "ERROR::kCVNeOTHER. Looking for cvnProd3Train. Branch no longer exists."<< std::endl;abort(); return cvnOut;})
const Var kCVNmOTHER([](const caf::SRProxy *sr){float cvnOut=-1;std::cout<< "ERROR::kCVNmOTHER. Looking for cvnProd3Train. Branch no longer exists."<< std::endl;abort(); return cvnOut;})
const Var kCosAngleNextShower([](const caf::SRProxy *sr){if(!sr->vtx.elastic.IsValid) return-5.f;if(sr->vtx.elastic.fuzzyk.nshwlid >=2) return(sr->vtx.elastic.fuzzyk.png[0].shwlid.dir).Dot(sr->vtx.elastic.fuzzyk.png[1].shwlid.dir);else return-5.f;})
const Var kConfusion([](const caf::SRProxy *sr){if(sr->sel.lem.pid< .47 &&sr->sel.lid.ann< .63) return.5;if(sr->sel.lem.pid< .47 &&sr->sel.lid.ann >=.63) return 1.5;if(sr->sel.lem.pid >=.47 &&sr->sel.lid.ann< .63) return 2.5;if(sr->sel.lem.pid >=.47 &&sr->sel.lid.ann >=.63) return 3.5;return-5.;})
const Var kCVNeQE([](const caf::SRProxy *sr){float cvnOut=-1;std::cout<< "ERROR::kCVNeQE. Looking for cvnProd3Train. Branch no longer exists."<< std::endl;abort(); return cvnOut;})
const Var kFirstProngTheta([](const caf::SRProxy *sr){if(!sr->vtx.elastic.IsValid) return-1000.f;if(sr->vtx.elastic.fuzzyk.npng< 1) return-1000.f;float ct=kFirstProngCosTheta(sr);if(fabs(ct) > 1) return-1000.f;return float(acos(ct)*180.0/3.1416);})
const Var kCVNMode([](const caf::SRProxy *sr){std::cout<< "ERROR::kCVNMode. Looking for cvnProd3Train. Branch no longer exists."<< std::endl;abort();if(sr->sel.cvn.nueid< 0){return-1.;}return-5.;})
const Var kRecoEPerHit([](const caf::SRProxy *sr){if(sr->slc.nhit >0) return 1000.0 *(kNueEnergy2018(sr)/sr->slc.nhit);else return-5.;})
const Var kNueHadCalEFrac([](const caf::SRProxy *sr){return kHadCalE(sr)/sr->slc.calE;})
const Var khadE2018([](const caf::SRProxy *sr){if(!sr->vtx.elastic.IsValid) return-1.0;if(sr->vtx.elastic.fuzzyk.npng< 1) return-1.0;if(kIsRHC(sr)) return NueRecoE_2018RHCFit(0.0, kRecoHADE(sr));else return NueRecoE_2017FDFit(0.0, kRecoHADE(sr));})
const Var kInelasticity([](const caf::SRProxy *sr){if(!sr->vtx.elastic.IsValid) return 1.f;if(sr->vtx.elastic.fuzzyk.nshwlid< 1) return 1.f;return((sr->slc.calE- sr->vtx.elastic.fuzzyk.png[0].shwlid.calE)/(sr->slc.calE));})
const Var kCVNeDIS([](const caf::SRProxy *sr){float cvnOut=-1;std::cout<< "ERROR::kCVNeDIS. Looking for cvnProd3Train. Branch no longer exists."<< std::endl;abort(); return cvnOut;})
const Var kProngCVNMaxProton([](const caf::SRProxy *sr){double score=-5;for(unsigned int i=0;i< sr->vtx.elastic.fuzzyk.npng;++i){if(sr->vtx.elastic.fuzzyk.png[i].cvnpart.protonid > score) score=sr->vtx.elastic.fuzzyk.png[i].cvnpart.protonid;}return score;})
return CVN proton score for most proton-like prong
const Var kShwHitFrac([](const caf::SRProxy *sr){if(sr->slc.nhit< 1) return-5.f;if(!sr->vtx.elastic.IsValid) return 0.f;float nhitall=0.0;for(unsigned int j=0;j< sr->vtx.elastic.fuzzyk.nshwlid;j++){nhitall+=sr->vtx.elastic.fuzzyk.png[j].shwlid.nhit;}return(nhitall/sr->slc.nhit);})
Fraction of hits in a 3D shower out of total slice.
const Var kEMEPerHit([](const caf::SRProxy *sr){if(kEMNhit(sr)>0) return 1000.0 *(kemCalE(sr)/kEMNhit(sr));else return-5.;})
const Var kShwHitXYUnsignedAsymm([](const caf::SRProxy *sr){return abs(kShwHitXYAsymm(sr));})
Asymmetry of x vs y hits.
const Var kNPlanesToFront
const Var kemE2018([](const caf::SRProxy *sr){if(!sr->vtx.elastic.IsValid) return-1.0;if(sr->vtx.elastic.fuzzyk.npng< 1) return-1.0;if(kIsRHC(sr)) return NueRecoE_2018RHCFit(kRecoEME(sr), 0.0);else return NueRecoE_2017FDFit(kRecoEME(sr), 0.0);})
const Var kShwHitXYAsymm([](const caf::SRProxy *sr){if(!sr->vtx.elastic.IsValid) return-5.f;if(sr->vtx.elastic.fuzzyk.nshwlid< 1) return-5.f;float xyhitdiff=sr->vtx.elastic.fuzzyk.png[0].shwlid.nhitx-sr->vtx.elastic.fuzzyk.png[0].shwlid.nhity;float xyhitsum=(sr->vtx.elastic.fuzzyk.png[0].shwlid.nhitx+ sr->vtx.elastic.fuzzyk.png[0].shwlid.nhity);if(xyhitsum >0) return xyhitdiff/xyhitsum;else return-5.f;})
asymmetry between x and y hits of most energetic shower
const Var kNShwLID([](const caf::SRProxy *sr){if(!sr->vtx.elastic.IsValid) return 0u;return(unsigned int) sr->vtx.elastic.fuzzyk.nshwlid;})
const Var kNElastic([](const caf::SRProxy *sr){if(!sr->vtx.elastic.IsValid){return 0.;}else{return 1.;}})
const Var kCVNeRES([](const caf::SRProxy *sr){float cvnOut=-1;std::cout<< "ERROR::kCVNeRES. Looking for cvnProd3Train. Branch no longer exists."<< std::endl;abort(); return cvnOut;})
const Var khadE2017([](const caf::SRProxy *sr){if(!sr->vtx.elastic.IsValid) return-1.0;if(sr->vtx.elastic.fuzzyk.npng< 1) return-1.0;return NueRecoE_2017FDFit(0.0, kCVNhadE(sr));})