NuebarCCIncCuts.cxx
Go to the documentation of this file.
2 
3 #include "CAFAna/Core/Cut.h"
7 //#include "3FlavorAna/Cuts/NueCutsSecondAna.h"
10 #include "CAFAna/Vars/Vars.h"
11 #include "CAFAna/Cuts/TruthCuts.h"
12 
14 
15 #include "TMath.h"
16 #include "TVector3.h"
17 
18 namespace nuebarccinc
19 {
20  const ana::Cut kNHitsCut = ana::kNHit >= 20 && ana::kNHit <= 200;
21 
22  const ana::Cut kFrontPlanes = SIMPLEVAR(sel.contain.nplanestofront) > 6;
23 
24  // copied from 3FlavorAna/Cuts/NueCutsSecondAna.h
25  const ana::Cut kDQ(
26  [](const caf::SRProxy* sr)
27  {
28  // Cut out FEB flashers
29  if(sr->sel.nuecosrej.hitsperplane >= 8)
30  return false;
31 
32  // Basic Reco Quality Cuts
33  if(!sr->vtx.elastic.IsValid)
34  return false;
35  if(sr->vtx.elastic.fuzzyk.npng == 0)
36  return false;
37  if(sr->vtx.elastic.fuzzyk.nshwlid == 0)
38  return false;
39  if(sr->vtx.elastic.fuzzyk.png[0].shwlid.nhitx <= 5 || sr->vtx.elastic.fuzzyk.png[0].shwlid.nhity <= 5)
40  return false;
41  if(sr->vtx.elastic.fuzzyk.png[0].shwlid.gap > 100)
42  return false;
43 
44  //angle between two leading showers
45  //TODO study using cosdang instead
46 
47  if(sr->vtx.elastic.fuzzyk.nshwlid >= 2){
48  if ((sr->vtx.elastic.fuzzyk.png[0].shwlid.dir).
49  Dot(sr->vtx.elastic.fuzzyk.png[1].shwlid.dir) < -0.95)
50  //if(sr->sel.nuecosrej.cosdang < -0.95)
51  return false;
52  }
53 
54  //asymmetry between x and y hits of most energetic shower
55  float xyhitdiff = abs(sr->vtx.elastic.fuzzyk.png[0].shwlid.nhitx - sr->vtx.elastic.fuzzyk.png[0].shwlid.nhity);
56  float xyhitsum = sr->vtx.elastic.fuzzyk.png[0].shwlid.nhitx + sr->vtx.elastic.fuzzyk.png[0].shwlid.nhity;
57  if (xyhitdiff/xyhitsum >= 0.4) return false;
58 
59  //fraction of hits in a 3D shower out of total slice
60  float nhitall = 0.0;
61  for(unsigned int j=0;j<sr->vtx.elastic.fuzzyk.nshwlid;j++){
62  nhitall += sr->vtx.elastic.fuzzyk.png[j].shwlid.nhit;
63  }
64  if (nhitall/sr->slc.nhit <= 0.7) return false;
65 
66  return true;
67  });
68 
70  {
71  return true_electron_png(sr) >= 0;
72  });
73 
74  ///////////////////////////////////////////////////////////
75  // Selection
76  //////////////////////////////////////////////////////////
78  {
79 
80  return (sr->vtx.X() < tvtxmax.X() &&
81  sr->vtx.X() > tvtxmin.X() &&
82  sr->vtx.Y() > tvtxmin.Y() &&
83  sr->vtx.Y() < tvtxmax.Y() &&
84  sr->vtx.Z() > tvtxmin.Z() &&
85  sr->vtx.Z() < tvtxmax.Z() );
86  });
87 
88  // borrowed from nue cc inclusive
89  const ana::Cut kNueCCIncFiducial([](const caf::SRProxy* sr){
90  assert(sr->vtx.elastic.IsValid && "Must apply DQ cuts");
91  return (sr->vtx.elastic.vtx.X() < vNueCCIncFiducialMax.X() &&
92  sr->vtx.elastic.vtx.X() > vNueCCIncFiducialMin.X() &&
93  sr->vtx.elastic.vtx.Y() < vNueCCIncFiducialMax.Y() &&
94  sr->vtx.elastic.vtx.Y() > vNueCCIncFiducialMin.Y() &&
95  sr->vtx.elastic.vtx.Z() < vNueCCIncFiducialMax.Z() &&
96  sr->vtx.elastic.vtx.Z() > vNueCCIncFiducialMin.Z() );
97  return true;
98  });
99 
101  return (sr->vtx.X() < vNueCCIncFiducialMax.X() &&
102  sr->vtx.X() > vNueCCIncFiducialMin.X() &&
103  sr->vtx.Y() < vNueCCIncFiducialMax.Y() &&
104  sr->vtx.Y() > vNueCCIncFiducialMin.Y() &&
105  sr->vtx.Z() < vNueCCIncFiducialMax.Z() &&
106  sr->vtx.Z() > vNueCCIncFiducialMin.Z() );
107  });
108 
109 
110  const ana::Cut kNueCCIncContainment([](const caf::SRProxy* sr){
111  if(sr->vtx.elastic.fuzzyk.nshwlid < 1) return false;
112  TVector3 start = sr->vtx.elastic.fuzzyk.png[0].shwlid.start;
113  TVector3 stop = sr->vtx.elastic.fuzzyk.png[0].shwlid.stop;
114 
115  //Make sure none of the event goes into the muon catcher
116  for(uint ix = 0; ix < sr->vtx.elastic.fuzzyk.nshwlid; ix++){
117  TVector3 start_muoncatcher =
118  sr->vtx.elastic.fuzzyk.png[ix].shwlid.start;
119  TVector3 stop_muoncatcher =
120  sr->vtx.elastic.fuzzyk.png[ix].shwlid.stop;
121  if (std::max(start_muoncatcher.Z(),
122  stop_muoncatcher.Z()) > 1250.0) return false;
123  }
124 
125 
126  if(sr->sel.nuecosrej.distallpngtop < 50) return false;
127  if(sr->sel.nuecosrej.distallpngbottom < 30) return false;
128  if(sr->sel.nuecosrej.distallpngeast < 50) return false;
129  if(sr->sel.nuecosrej.distallpngwest < 30) return false;
130  if(sr->sel.nuecosrej.distallpngfront < 150) return false;
131 
132  return true;
133  });
134 
136  [](const caf::SRProxy* sr)
137  {
138  if ( ! sr->vtx.elastic.IsValid ) return false;
139  if (sr->vtx.elastic.vtx.X() < -165.0) return false;
140  if (sr->vtx.elastic.vtx.X() > 165.0) return false;
141  if (sr->vtx.elastic.vtx.Y() < -165.0) return false;
142  if (sr->vtx.elastic.vtx.Y() > 165.0) return false;
143  if (sr->vtx.elastic.vtx.Z() < 100.0) return false;
144  if (sr->vtx.elastic.vtx.Z() > 1000.0) return false;
145  return true;
146  });
147 
149  [](const caf::SRProxy* sr){
150  if(! sr->vtx.elastic.IsValid ) return false;
151  if(sr->vtx.elastic.fuzzyk.nshwlid < 1) return false;
152  TVector3 start = sr->vtx.elastic.fuzzyk.png[0].shwlid.start;
153  TVector3 stop = sr->vtx.elastic.fuzzyk.png[0].shwlid.stop;
154 
155  //Make sure none of the event goes into the muon catcher
156  for(uint ix = 0; ix < sr->vtx.elastic.fuzzyk.nshwlid; ix++){
157  TVector3 start_muoncatcher =
158  sr->vtx.elastic.fuzzyk.png[ix].shwlid.start;
159  TVector3 stop_muoncatcher =
160  sr->vtx.elastic.fuzzyk.png[ix].shwlid.stop;
161  if (std::max(start_muoncatcher.Z(),
162  stop_muoncatcher.Z()) > 1250.0) return false;
163  }
164 
165 
166  if(sr->sel.nuecosrej.distallpngtop < 30) return false;
167  if(sr->sel.nuecosrej.distallpngbottom < 10) return false;
168  if(sr->sel.nuecosrej.distallpngeast < 30) return false;
169  if(sr->sel.nuecosrej.distallpngwest < 10) return false;
170  if(sr->sel.nuecosrej.distallpngfront < 100) return false;
171  return true;
172  });
173 
174 
175  ///////////////////////////////////////////////////////////
176  // MC Cuts
177  //////////////////////////////////////////////////////////
178  const ana::Cut kMC([](const caf::SRProxy* sr){
179  if(sr->hdr.ismc) return true;
180  return false;
181  });
182 
184  ([](const caf::SRNeutrinoProxy* sr){
185  float costheta = kTrueElectronCosThetaST(sr);
186  float elece = kTrueElectronEST(sr);
187 
188  if( (costheta >= 0.97) && (elece >= 1.4) && (elece < 6.0))
189  return true;
190  if( (costheta >= 0.94) && (costheta < 0.97) &&
191  (elece >= 1.4) && (elece < 4.1))
192  return true;
193  if( (costheta >= 0.90) && (costheta < 0.94) &&
194  (elece >= 1.0) && (elece < 2.5))
195  return true;
196  if( (costheta >= 0.85) && (costheta < 0.90) &&
197  (elece >= 1.0) && (elece < 2.0))
198  return true;
199 
200  return false;
201  });
202 
204  ([](const caf::SRProxy* sr){
205  float costheta = kRecoElectronCosTheta(sr);
206  float elece = kElectronE(sr);
207 
208  if( (costheta >= 0.97) && (elece >= 1.4) && (elece < 6.0))
209  return true;
210  if( (costheta >= 0.94) && (costheta < 0.97) &&
211  (elece >= 1.4) && (elece < 4.1))
212  return true;
213  if( (costheta >= 0.90) && (costheta < 0.94) &&
214  (elece >= 1.0) && (elece < 2.5))
215  return true;
216  if( (costheta >= 0.85) && (costheta < 0.90) &&
217  (elece >= 1.0) && (elece < 2.0))
218  return true;
219 
220  return false;
221  });
222 
223  // interaction modes
224  const ana::NuTruthCut kNCST([](const caf::SRNeutrinoProxy* truth)
225  {
226  return !truth->iscc;
227  });
228 
229  const ana::NuTruthCut kNueCCST([](const caf::SRNeutrinoProxy* truth)
230  {
231  return (truth->iscc &&
232  truth->pdg == 12 &&
233  truth->pdgorig==12);
234  });
235 
236  const ana::NuTruthCut kNuebarCCST([](const caf::SRNeutrinoProxy* truth)
237  {
238  return (truth->iscc &&
239  truth->pdg == -12 &&
240  truth->pdgorig == -12);
241  });
242 
243  const ana::NuTruthCut kNumuCCST([](const caf::SRNeutrinoProxy* truth)
244  {
245  return (truth->iscc &&
246  truth->pdg == 14 &&
247  truth->pdgorig == 14);
248  });
249 
250  const ana::NuTruthCut kNumubarCCST([](const caf::SRNeutrinoProxy* truth)
251  {
252  return (truth->iscc &&
253  truth->pdg == -14 &&
254  truth->pdgorig == -14);
255  });
256 
257  const ana::NuTruthCut kPi0ST([](const caf::SRNeutrinoProxy* truth)
258  {
259  if(truth->prim.size() == 0) return false;
260 
261  int nbofprim=truth->prim.size();
262  int countpi=0;
263  for(int i = 0; i < nbofprim; i++){
264  if(truth->prim[i].pdg == 111){
265  countpi++;
266  }
267  }
268  if (countpi==0) return false;
269  if(countpi > 0) return true;
270  return false;
271  });
272 
273 // const ana::Cut kNueCC = ana::CutFromNuTruthCut(kIsNueCCST );
274 // const ana::Cut kNuebarCC = ana::CutFromNuTruthCut(kIsNuebarCCST );
275 // const ana::Cut kNumuCC = ana::CutFromNuTruthCut(kIsNumuCCST );
276 // const ana::Cut kNumubarCC = ana::CutFromNuTruthCut(kIsNumubarCCST);
277 // const ana::Cut kNC = ana::CutFromNuTruthCut(kIsNCST );
278 // const ana::Cut kIsPi0 = ana::CutFromNuTruthCut(kIsPi0ST );
279 
280  // signal
281 
282 
283 } // end namespace
caf::Proxy< size_t > npng
Definition: SRProxy.h:2038
caf::Proxy< unsigned int > nshwlid
Definition: SRProxy.h:2040
caf::Proxy< caf::SRFuzzyK > fuzzyk
Definition: SRProxy.h:2059
const ana::NuTruthCut kNuebarCCST([](const caf::SRNeutrinoProxy *truth){return(truth->iscc && truth->pdg==-12 && truth->pdgorig==-12);})
const TVector3 vNueCCIncFiducialMin(-130,-140, 150)
caf::Proxy< float > distallpngtop
Definition: SRProxy.h:1044
Proxy for caf::SRNeutrino.
Definition: SRProxy.h:510
caf::Proxy< caf::SRHeader > hdr
Definition: SRProxy.h:2137
caf::Proxy< float > distallpngeast
Definition: SRProxy.h:1042
Proxy for caf::StandardRecord.
Definition: SRProxy.h:2126
const ana::Cut kFrontPlanes
const ana::NuTruthCut kNumuCCST([](const caf::SRNeutrinoProxy *truth){return(truth->iscc && truth->pdg==14 && truth->pdgorig==14);})
const ana::NuTruthCut kTrueDetectorST([](const caf::SRNeutrinoProxy *sr){return(sr->vtx.X()< tvtxmax.X()&&sr->vtx.X() > tvtxmin.X()&&sr->vtx.Y() > tvtxmin.Y()&&sr->vtx.Y()< tvtxmax.Y()&&sr->vtx.Z() > tvtxmin.Z()&&sr->vtx.Z()< tvtxmax.Z());})
void abs(TH1 *hist)
const ana::NuTruthCut kNueCCST([](const caf::SRNeutrinoProxy *truth){return(truth->iscc && truth->pdg==12 && truth->pdgorig==12);})
#define SIMPLEVAR(CAFNAME)
For Vars where literally all you need is a single CAF variable.
Definition: Var.h:88
const ana::NuTruthCut kNueCCIncFiducialST([](const caf::SRNeutrinoProxy *sr){return(sr->vtx.X()< vNueCCIncFiducialMax.X()&& sr->vtx.X() > vNueCCIncFiducialMin.X()&& sr->vtx.Y()< vNueCCIncFiducialMax.Y()&& sr->vtx.Y() > vNueCCIncFiducialMin.Y()&& sr->vtx.Z()< vNueCCIncFiducialMax.Z()&& sr->vtx.Z() > vNueCCIncFiducialMin.Z());})
caf::Proxy< caf::SRElastic > elastic
Definition: SRProxy.h:2118
caf::Proxy< caf::SRVector3D > vtx
Definition: SRProxy.h:573
caf::Proxy< caf::SRNueCosRej > nuecosrej
Definition: SRProxy.h:1265
const ana::Var kElectronE
const ana::NuTruthCut kNumubarCCST([](const caf::SRNeutrinoProxy *truth){return(truth->iscc && truth->pdg==-14 && truth->pdgorig==-14);})
caf::Proxy< std::vector< caf::SRFuzzyKProng > > png
Definition: SRProxy.h:2043
caf::Proxy< unsigned int > nhit
Definition: SRProxy.h:1315
if(dump)
const ana::Cut kNuebarCCIncContainmentLoose([](const caf::SRProxy *sr){if(!sr->vtx.elastic.IsValid) return false;if(sr->vtx.elastic.fuzzyk.nshwlid< 1) return false;TVector3 start=sr->vtx.elastic.fuzzyk.png[0].shwlid.start;TVector3 stop=sr->vtx.elastic.fuzzyk.png[0].shwlid.stop;for(uint ix=0;ix< sr->vtx.elastic.fuzzyk.nshwlid;ix++){TVector3 start_muoncatcher=sr->vtx.elastic.fuzzyk.png[ix].shwlid.start;TVector3 stop_muoncatcher=sr->vtx.elastic.fuzzyk.png[ix].shwlid.stop;if(std::max(start_muoncatcher.Z(), stop_muoncatcher.Z()) > 1250.0) return false;}if(sr->sel.nuecosrej.distallpngtop< 30) return false;if(sr->sel.nuecosrej.distallpngbottom< 10) return false;if(sr->sel.nuecosrej.distallpngeast< 30) return false;if(sr->sel.nuecosrej.distallpngwest< 10) return false;if(sr->sel.nuecosrej.distallpngfront< 100) return false;return true;})
const ana::NuTruthCut kPi0ST([](const caf::SRNeutrinoProxy *truth){if(truth->prim.size()==0) return false;int nbofprim=truth->prim.size();int countpi=0;for(int i=0;i< nbofprim;i++){if(truth->prim[i].pdg==111){countpi++;}}if(countpi==0) return false;if(countpi > 0) return true;return false;})
const Var kNHit
Definition: Vars.cxx:71
caf::Proxy< bool > iscc
Definition: SRProxy.h:538
caf::Proxy< float > hitsperplane
Definition: SRProxy.h:1046
caf::StandardRecord * sr
const double j
Definition: BetheBloch.cxx:29
caf::Proxy< float > distallpngwest
Definition: SRProxy.h:1045
const ana::Cut kNueCCIncFiducial([](const caf::SRProxy *sr){assert(sr->vtx.elastic.IsValid &&"Must apply DQ cuts");return(sr->vtx.elastic.vtx.X()< vNueCCIncFiducialMax.X()&& sr->vtx.elastic.vtx.X() > vNueCCIncFiducialMin.X()&& sr->vtx.elastic.vtx.Y()< vNueCCIncFiducialMax.Y()&& sr->vtx.elastic.vtx.Y() > vNueCCIncFiducialMin.Y()&& sr->vtx.elastic.vtx.Z()< vNueCCIncFiducialMax.Z()&& sr->vtx.elastic.vtx.Z() > vNueCCIncFiducialMin.Z());return true;})
const ana::Cut kHasReconstructedElectronProng([](const caf::SRProxy *sr){return true_electron_png(sr) >=0;})
const TVector3 vNueCCIncFiducialMax(150, 140, 800)
const ana::Cut kNHitsCut
caf::Proxy< bool > IsValid
Definition: SRProxy.h:2058
caf::Proxy< short int > pdgorig
Definition: SRProxy.h:553
caf::Proxy< caf::SRSlice > slc
Definition: SRProxy.h:2142
const ana::Cut kMC([](const caf::SRProxy *sr){if(sr->hdr.ismc) return true;return false;})
caf::Proxy< bool > ismc
Definition: SRProxy.h:242
caf::Proxy< caf::SRVector3D > vtx
Definition: SRProxy.h:2073
assert(nhit_max >=nhit_nbins)
const TVector3 tvtxmin(-191,-187, 0)
caf::Proxy< float > distallpngbottom
Definition: SRProxy.h:1041
const ana::Cut kNueCCIncContainment([](const caf::SRProxy *sr){if(sr->vtx.elastic.fuzzyk.nshwlid< 1) return false;TVector3 start=sr->vtx.elastic.fuzzyk.png[0].shwlid.start;TVector3 stop=sr->vtx.elastic.fuzzyk.png[0].shwlid.stop;for(uint ix=0;ix< sr->vtx.elastic.fuzzyk.nshwlid;ix++){TVector3 start_muoncatcher=sr->vtx.elastic.fuzzyk.png[ix].shwlid.start;TVector3 stop_muoncatcher=sr->vtx.elastic.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 ana::NuTruthCut kTrueElectronPhaseSpaceCutST([](const caf::SRNeutrinoProxy *sr){float costheta=kTrueElectronCosThetaST(sr);float elece=kTrueElectronEST(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 ana::Cut kDQ([](const caf::SRProxy *sr){if(sr->sel.nuecosrej.hitsperplane >=8) return false;if(!sr->vtx.elastic.IsValid) return false;if(sr->vtx.elastic.fuzzyk.npng==0) return false;if(sr->vtx.elastic.fuzzyk.nshwlid==0) return false;if(sr->vtx.elastic.fuzzyk.png[0].shwlid.nhitx<=5||sr->vtx.elastic.fuzzyk.png[0].shwlid.nhity<=5) return false;if(sr->vtx.elastic.fuzzyk.png[0].shwlid.gap > 100) return false; if(sr->vtx.elastic.fuzzyk.nshwlid >=2){if((sr->vtx.elastic.fuzzyk.png[0].shwlid.dir). Dot(sr->vtx.elastic.fuzzyk.png[1].shwlid.dir)< -0.95) return false;}float xyhitdiff=abs(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(xyhitdiff/xyhitsum >=0.4) return false;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;}if(nhitall/sr->slc.nhit<=0.7) return false;return true;})
const ana::Cut kRecoElectronPhaseSpaceCut([](const caf::SRProxy *sr){float costheta=kRecoElectronCosTheta(sr);float elece=kElectronE(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< short int > pdg
Definition: SRProxy.h:552
int true_electron_png(const caf::SRProxy *sr)
const ana::NuTruthCut kNCST([](const caf::SRNeutrinoProxy *truth){return!truth->iscc;})
caf::Proxy< caf::SRIDBranch > sel
Definition: SRProxy.h:2141
caf::Proxy< caf::SRVertexBranch > vtx
Definition: SRProxy.h:2146
const TVector3 tvtxmax(192, 194, 1270)
const ana::Cut kNuebarCCIncFiducialLoose([](const caf::SRProxy *sr){if(!sr->vtx.elastic.IsValid) return false;if(sr->vtx.elastic.vtx.X()< -165.0) return false;if(sr->vtx.elastic.vtx.X() > 165.0) return false;if(sr->vtx.elastic.vtx.Y()< -165.0) return false;if(sr->vtx.elastic.vtx.Y() > 165.0) return false;if(sr->vtx.elastic.vtx.Z()< 100.0) return false;if(sr->vtx.elastic.vtx.Z() > 1000.0) return false;return true;})
caf::Proxy< float > distallpngfront
Definition: SRProxy.h:1043
const ana::Var kRecoElectronCosTheta([](const caf::SRProxy *sr) ->float{if(!sr->vtx.elastic.IsValid) return-1000.f;if(sr->vtx.elastic.fuzzyk.npng< 1) return-1000.f;TVector3 elecdir=(TVector3) sr->vtx.elastic.fuzzyk.png[0].dir;TVector3 beamdir=ana::NuMIBeamDirection(caf::kNEARDET);return elecdir.Dot(beamdir);})
caf::Proxy< std::vector< caf::SRTrueParticle > > prim
Definition: SRProxy.h:555
const ana::NuTruthVar kTrueElectronCosThetaST([](const caf::SRNeutrinoProxy *nu){int nprims=nu->prim.size();for(int iprim=0;iprim< nprims;iprim++){if(abs(nu->prim[iprim].pdg)==11){TVector3 edir=nu->prim[iprim].p.Vect();TVector3 beamdir=ana::NuMIBeamDirection(caf::kNEARDET);return edir.Unit().Dot(beamdir.Unit());}}return-5.0;})
const ana::NuTruthVar kTrueElectronEST([](const caf::SRNeutrinoProxy *nu){float ee=-5;int nprims=nu->prim.size();for(int iprim=0;iprim< nprims;iprim++){if(abs(nu->prim[iprim].pdg)==11){double E=nu->prim[iprim].p.E;ee=E;}}return ee;})
unsigned int uint