3 #include "CAFAna/Core/Cut.h" 7 #include "3FlavorAna/Cuts/NueCutsSecondAna.h" 29 "Must apply DQ cuts");
52 for(
uint ix = 0; ix < sr->vtx.elastic[0].fuzzyk.nshwlid; ix++){
53 TVector3 start_muoncatcher =
54 sr->vtx.elastic[0].fuzzyk.png[ix].shwlid.start;
55 TVector3 stop_muoncatcher =
56 sr->vtx.elastic[0].fuzzyk.png[ix].shwlid.stop;
57 if (std::max(start_muoncatcher.Z(),
58 stop_muoncatcher.Z()) > 1250.0) return false;
77 if( (costheta >= 0.97) && (elece >= 1.4) && (elece < 6.0))
79 if( (costheta >= 0.94) && (costheta < 0.97) &&
80 (elece >= 1.4) && (elece < 4.1))
82 if( (costheta >= 0.90) && (costheta < 0.94) &&
83 (elece >= 1.0) && (elece < 2.5))
85 if( (costheta >= 0.85) && (costheta < 0.90) &&
86 (elece >= 1.0) && (elece < 2.0))
97 if( (costheta >= 0.97) && (elece >= 1.4) && (elece < 6.0))
99 if( (costheta >= 0.94) && (costheta < 0.97) &&
100 (elece >= 1.4) && (elece < 4.1))
102 if( (costheta >= 0.90) && (costheta < 0.94) &&
103 (elece >= 1.0) && (elece < 2.5))
105 if( (costheta >= 0.85) && (costheta < 0.90) &&
106 (elece >= 1.0) && (elece < 2.0))
150 if(sr->
mc.
nnu == 0)
return false;
151 return (sr->
mc.
nu[0].iscc &&
152 (sr->
mc.
nu[0].pdg == 12) &&
153 (sr->
mc.
nu[0].pdgorig == 12));
157 if(sr->
mc.
nnu == 0)
return false;
158 return (sr->
mc.
nu[0].iscc &&
159 (sr->
mc.
nu[0].pdg == -12) &&
160 (sr->
mc.
nu[0].pdgorig == -12));
164 if(sr->
mc.
nnu == 0)
return false;
165 return (sr->
mc.
nu[0].iscc &&
166 (sr->
mc.
nu[0].pdg == 14) &&
167 (sr->
mc.
nu[0].pdgorig == 14));
171 if(sr->
mc.
nnu == 0)
return false;
172 return (sr->
mc.
nu[0].iscc &&
173 (sr->
mc.
nu[0].pdg == -14) &&
174 (sr->
mc.
nu[0].pdgorig == -14));
178 if(sr->
mc.
nnu == 0)
return false;
179 return (!sr->
mc.
nu[0].iscc);
194 if(sr->
mc.
nnu == 0)
return false;
200 if(sr->
mc.
nu[0].prim.size() == 0)
return false;
202 int nbofprim=sr->
mc.
nu[0].prim.size();
204 for(
int i = 0;
i < nbofprim;
i++){
205 if(sr->
mc.
nu[0].prim[
i].pdg == 111){
213 if (countpi==0)
return false;
214 if(countpi > 0)
return true;
233 const TVector3
vtxmin(-130,-140,150);
234 const TVector3
vtxmax(150,140,800);
254 return (truth->
iscc &&
261 return (truth->
iscc &&
299 {
"fiducial", kcDQ && kcFiducial},
300 {
"containment", kcDQ && kcFiducial && kcContainment},
301 {
"frontplanes", kcDQ && kcFiducial && kcContainment && kcFrontPlanes},
302 {
"nhits", kcDQ && kcFiducial && kcContainment &&
303 kcFrontPlanes && kcNHits},
304 {
"muonid", kcDQ && kcFiducial && kcContainment && kcFrontPlanes &&
305 kcNHits && kcMuonIDCut},
306 {
"cvn", kcDQ && kcFiducial && kcContainment && kcFrontPlanes &&
307 kcNHits && kcMuonIDCut && kcCVN},
315 {
"frontplanes", kcDQ && kcNueCCIncFiducial && kcNueCCIncContainment
317 {
"nhits", kcDQ && kcNueCCIncFiducial && kcNueCCIncContainment &&
318 kcFrontPlanes && kcNHits},
319 {
"muonid", kcDQ && kcNueCCIncFiducial && kcNueCCIncContainment &&
320 kcFrontPlanes && kcNHits && kcMuonIDCut},
322 {
"cvn", kcPresel && kcCVN},
323 {
"electronid", kcPresel && kcElectronIDCut},
333 {
"frontplanes", kcDQ && kcNueCCIncFiducial && kcNueCCIncContainment
335 {
"nhits", kcDQ && kcNueCCIncFiducial && kcNueCCIncContainment &&
336 kcFrontPlanes && kcNHits},
337 {
"muonid", kcDQ && kcNueCCIncFiducial && kcNueCCIncContainment &&
338 kcFrontPlanes && kcNHits && kcRemid},
339 {
"electronid", kcDQ && kcNueCCIncFiducial && kcNueCCIncContainment &&
340 kcFrontPlanes && kcNHits && kcRemid && kcElectronIDCut},
341 {
"cvn", kcDQ && kcNueCCIncFiducial && kcNueCCIncContainment &&
342 kcFrontPlanes && kcNHits && kcRemid && kcCVN},
357 {
"other",
ktMC && ktOther},
371 {
"other",
ktMC && ktOther},
385 {
"numucc_pi0",
ktMC && ktIsNumuCCPi0},
386 {
"numucc_not_pi0",
ktMC && ktIsNumuCCNotPi0},
388 {
"nc_pi0",
ktMC && ktIsNCPi0},
389 {
"nc_not_pi0",
ktMC && ktIsNCNotPi0},
390 {
"other",
ktMC && ktIsOther2},
391 {
"non_pi0_background",
ktMC && (ktIsNumuCCNotPi0 || ktNumubarCC ||
393 {
"background",
ktMC && !ktSignal},
412 {
"cc", kIsTrueSigST},
418 {
"other", kIsTrueSigST && !kIsQE_NT &&
419 !kIsRes_NT && !kIsDIS_NT && ! kIsCoh_NT && !kIsDytmanMEC_NT},
428 {
"presel", kcPresel_loose},
434 {
"spilltruth", kIsTrueNotNumuCCST},
443 {
"presel", kcPresel},
445 {
"presel_background", kcPresel &&
ktMC && !ktSignal},
449 {
"spilltruth", kIsTrueSigST},
474 {
"other",
ktMC && ktOther},
caf::Proxy< unsigned int > nshwlid
const Cut kcNueCCIncContainment([](const caf::SRProxy *sr){if(sr->vtx.elastic[0].fuzzyk.nshwlid< 1) return false;TVector3 start=sr->vtx.elastic[0].fuzzyk.png[0].shwlid.start;TVector3 stop=sr->vtx.elastic[0].fuzzyk.png[0].shwlid.stop;for(uint ix=0;ix< sr->vtx.elastic[0].fuzzyk.nshwlid;ix++){TVector3 start_muoncatcher=sr->vtx.elastic[0].fuzzyk.png[ix].shwlid.start;TVector3 stop_muoncatcher=sr->vtx.elastic[0].fuzzyk.png[ix].shwlid.stop;if(std::max(start_muoncatcher.Z(), stop_muoncatcher.Z()) > 1250.0) return false;}if(sr->sel.nuecosrej.distallpngtop< 50) return false;if(sr->sel.nuecosrej.distallpngbottom< 30) return false;if(sr->sel.nuecosrej.distallpngeast< 50) return false;if(sr->sel.nuecosrej.distallpngwest< 30) return false;if(sr->sel.nuecosrej.distallpngfront< 150) return false;return true;})
const TVector3 vtxmax(150, 140, 800)
const SpillTruthCut kIsNumuCCST([](const caf::SRNeutrinoProxy *truth){return(truth->iscc && abs(truth->pdg)==14 && abs(truth->pdgorig)==14);})
const NuTruthCut kTrueElectronPhaseSpaceCutST([](const caf::SRNeutrinoProxy *sr){float costheta=kTrueElecCosthetaST(sr);float elece=kTrueElecEST(sr);if((costheta >=0.97)&&(elece >=1.4)&&(elece< 6.0)) return true;if((costheta >=0.94)&&(costheta< 0.97)&& (elece >=1.4)&&(elece< 4.1)) return true;if((costheta >=0.90)&&(costheta< 0.94)&& (elece >=1.0)&&(elece< 2.5)) return true;if((costheta >=0.85)&&(costheta< 0.90)&& (elece >=1.0)&&(elece< 2.0)) return true;return false;})
caf::Proxy< caf::SRFuzzyK > fuzzyk
Cuts and Vars for the 2020 FD DiF Study.
const NuTruthCut kTrueSignal1DST
const NuTruthCut kIsCoh_NT([](const caf::SRNeutrinoProxy *truth){return(truth->mode==caf::kCoh);})
const SelDefST cvn_selection_st[kcCvnSelsST]
const TVector3 * vtxmax_ptr
caf::Proxy< float > distallpngtop
const SpillTruthCut kIsCorrectSignal
Proxy for caf::SRNeutrino.
const TVector3 vtxmin(-130,-140, 150)
caf::Proxy< caf::SRHeader > hdr
const SelDef chns[kcNumChns]
caf::Proxy< float > distallpngeast
const NuTruthCut kIsRes_NT([](const caf::SRNeutrinoProxy *truth){return(truth->mode==caf::kRes);})
Proxy for caf::StandardRecord.
caf::Proxy< std::vector< caf::SRNeutrino > > nu
const Cut ktSignal([](const caf::SRProxy *sr){if(sr->mc.nnu==0) return false;return(sr->mc.nu[0].iscc &&(sr->mc.nu[0].pdg==12)&&(sr->mc.nu[0].pdgorig==12));})
const NuTruthVar kTrueElecCosthetaST([](const caf::SRNeutrinoProxy *nu){if(abs(nu->pdg)!=12|| !nu->iscc) return-5.0;int nprims=nu->prim.size();for(int iprim=0;iprim< nprims;iprim++){if(abs(nu->prim[iprim].pdg)==11||abs(nu->prim[iprim].pdg)==13){TVector3 edir=nu->prim[iprim].p.Vect();TVector3 beamdir=NuMIBeamDirection(caf::kNEARDET);return edir.Unit().Dot(beamdir.Unit());}}return-5.0;})
caf::Proxy< short int > nnu
const SelDef interaction_chns[kcNumIntChns]
_Cut< caf::SRNeutrinoProxy > NuTruthCut
Cut designed to be used over the nuTree, ie all neutrinos, not just those that got slices...
const SelDefST interaction_chns_st[kcNumIntChnsST]
const NuTruthCut kIsDIS_NT([](const caf::SRNeutrinoProxy *truth){return(truth->mode==caf::kDIS);})
caf::Proxy< caf::SRElastic > elastic
caf::Proxy< caf::SRVector3D > vtx
caf::Proxy< caf::SRNueCosRej > nuecosrej
const Cut ktNumuCC([](const caf::SRProxy *sr){if(sr->mc.nnu==0) return false;return(sr->mc.nu[0].iscc &&(sr->mc.nu[0].pdg==14)&&(sr->mc.nu[0].pdgorig==14));})
const Var kvCVN2017([](const caf::SRProxy *sr){return(sr->sel.cvn2017.nueid);})
caf::Proxy< std::vector< caf::SRFuzzyKProng > > png
const Cut ktIsPi0([](const caf::SRProxy *sr){ if(sr->mc.nnu==0) return false;assert(sr->mc.nnu==1); if(sr->mc.nu[0].prim.size()==0) return false;int nbofprim=sr->mc.nu[0].prim.size();int countpi=0;for(int i=0;i< nbofprim;i++){if(sr->mc.nu[0].prim[i].pdg==111){ countpi++;}}if(countpi==0) return false;if(countpi > 0) return true;return false;})
const SelDef cut_flow[kcNumSels]
const NuTruthVar kTrueElecEST([](const caf::SRNeutrinoProxy *nu){float ee=-5;if(abs(nu->pdg)!=12|| !nu->iscc) return ee;int nprims=nu->prim.size();for(int iprim=0;iprim< nprims;iprim++){if(abs(nu->prim[iprim].pdg)==11||abs(nu->prim[iprim].pdg)==13){double E=nu->prim[iprim].p.E;ee=E;}}return ee;})
const Cut kIsNC([](const caf::SRProxy *sr){if(sr->mc.nnu==0) return false;assert(sr->mc.nnu==1);return!sr->mc.nu[0].iscc;})
Is this a Neutral Current event?
const SpillTruthCut kIsTrueSigST
const SelDef chns_1d[kcNumChns]
_Cut< caf::SRProxy > Cut
Representation of a cut (selection) to be applied to a caf::StandardRecord object.
const Cut ktMC([](const caf::SRProxy *sr){if(sr->hdr.ismc) return true;return false;})
const Cut ktNumubarCC([](const caf::SRProxy *sr){if(sr->mc.nnu==0) return false;return(sr->mc.nu[0].iscc &&(sr->mc.nu[0].pdg==-14)&&(sr->mc.nu[0].pdgorig==-14));})
const SpillTruthCut kIsNueCCST([](const caf::SRNeutrinoProxy *truth){return(truth->iscc && truth->pdg==12 && truth->pdgorig==12);})
const NuTruthCut kIsQE_NT([](const caf::SRNeutrinoProxy *truth){return(truth->mode==caf::kQE);})
Select truly quasielastic events.
caf::Proxy< float > distallpngwest
const Var kvRecoCos([](const caf::SRProxy *sr) ->float{if(sr->vtx.nelastic< 1) return-1000.f;if(sr->vtx.elastic[0].fuzzyk.npng< 1) return-1000.f;TVector3 elecdir=(TVector3) sr->vtx.elastic[0].fuzzyk.png[0].dir;TVector3 beamdir=NuMIBeamDirection(caf::kNEARDET);return elecdir.Dot(beamdir);})
const SelDef cut_flow_test[kcNumSelsTest]
caf::Proxy< caf::SRTruthBranch > mc
const SelDef chns_extra[kcNumChnsExtra]
const NuTruthCut kIsDytmanMEC_NT([](const caf::SRNeutrinoProxy *truth){return(truth->mode==caf::kMEC);})
const Cut ktNuebarCC([](const caf::SRProxy *sr){if(sr->mc.nnu==0) return false;return(sr->mc.nu[0].iscc &&(sr->mc.nu[0].pdg==-12)&&(sr->mc.nu[0].pdgorig==-12));})
const SelDef chns_data[kcNumChns+1]
caf::Proxy< short int > pdgorig
const TVector3 * vtxmin_ptr
const SelDef remid_selection[kcReMIDSels]
caf::Proxy< caf::SRVector3D > vtx
assert(nhit_max >=nhit_nbins)
caf::Proxy< float > distallpngbottom
const SelDefST remid_selection_st[kcReMIDSelsST]
caf::Proxy< short int > pdg
const Cut kcElectronIDCut
caf::Proxy< caf::SRIDBranch > sel
const SelDef cvn_selection[kcCvnSels]
const Cut ktIsNumuCCNotPi0
caf::Proxy< caf::SRVertexBranch > vtx
const SpillTruthCut kTrueFiducialST([](const caf::SRNeutrinoProxy *sr){return(sr->vtx.X()< vtxmax.X()&&sr->vtx.X() > vtxmin.X()&&sr->vtx.Y()< vtxmax.Y()&&sr->vtx.Y() > vtxmin.Y()&&sr->vtx.Z()< vtxmax.Z()&&sr->vtx.Z() > vtxmin.Z());})
const NuTruthVar kTrueEST([](const caf::SRNeutrinoProxy *nu) ->float{float ee=-5;if(abs(nu->pdg)!=12|| !nu->iscc) return ee;return(float) nu->E;})
const Var kvElecE([](const caf::SRProxy *sr) ->float{double p0=-0.10588;double p1=0.57885;double p2=-0.408767;double p3=0.153795;double p4=-0.0270565;double p5=0.00171687;float energy=-1000.f;if(sr->vtx.nelastic< 1) return-1000.f;if(sr->vtx.elastic[0].fuzzyk.npng< 1) return-1000.f;float x=(sr->vtx.elastic[0].fuzzyk.png[0].shwlid.shwE);if(x< 0) return 0.0f;if(x<=6) energy=x-(p0+x *p1+p2 *pow(x, 2)+p3 *pow(x, 3)+p4 *pow(x, 4)+p5 *pow(x, 5));else energy=x;if(energy< 0) energy=x;return energy;})
const NuTruthCut kTrueSignal2DST
const SpillTruthCut kIsTrueNotNumuCCST
const Cut ktNC([](const caf::SRProxy *sr){if(sr->mc.nnu==0) return false;return(!sr->mc.nu[0].iscc);})
const Cut kNoCut
The simplest possible cut: pass everything, used as a default.
Cut CutFromNuTruthCut(const NuTruthCut &stc)
caf::Proxy< float > distallpngfront
const Cut kRecoElectronPhaseSpaceCut([](const caf::SRProxy *sr){float costheta=kvRecoCos(sr);float elece=kvElecE(sr);if((costheta >=0.97)&&(elece >=1.4)&&(elece< 6.0)) return true;if((costheta >=0.94)&&(costheta< 0.97)&& (elece >=1.4)&&(elece< 4.1)) return true;if((costheta >=0.90)&&(costheta< 0.94)&& (elece >=1.0)&&(elece< 2.5)) return true;if((costheta >=0.85)&&(costheta< 0.90)&& (elece >=1.0)&&(elece< 2.0)) return true;return false;})
const SelDef cut_flow2[kcNumSels2]
const Cut kcNueCCIncFiducial([](const caf::SRProxy *sr){assert(sr->vtx.nelastic > 0 &&"Must apply DQ cuts");if(sr->vtx.elastic[0].vtx.X()< -130.0) return false;if(sr->vtx.elastic[0].vtx.X() > 150.0) return false;if(sr->vtx.elastic[0].vtx.Y()< -140.0) return false;if(sr->vtx.elastic[0].vtx.Y() > 140.0) return false;if(sr->vtx.elastic[0].vtx.Z()< 150.0) return false;if(sr->vtx.elastic[0].vtx.Z() > 800.0) return false;return true;})