3 #include "CAFAna/Core/Var.h" 4 #include "CAFAna/Core/Cut.h" 5 #include "CAFAna/Core/HistAxis.h"
const ana::Var kAllPngDistBack
const ana::Var kAbsResElectronTheta
const ana::Var kAllPngDistBottom
const ana::Var kNHits([](const caf::SRProxy *sr){return sr->slc.nhit;})
const ana::Var kAbsResTrueElectronE
const ana::Binning three_d_bins
const Var kDistAllBottom([](const caf::SRProxy *sr){if(std::isnan(1.*sr->sel.nuecosrej.distallpngbottom)) return-1000.0f;return float(sr->sel.nuecosrej.distallpngbottom);})
Distance of all showers in slice from the bottom edge of detector.
const ana::Var kProngCVNElectronCosTheta([](const caf::SRProxy *sr){if(!sr->vtx.elastic.IsValid) return-1000.f;if(sr->vtx.elastic.fuzzyk.npng< 1) return-1000.f;int nProngs=sr->vtx.elastic.fuzzyk.npng;float maxProngCVNe=-5.;TVector3 elecdir={0, 0, 0};for(int iProng=0;iProng< nProngs;iProng++){if(sr->vtx.elastic.fuzzyk.png[iProng].cvnpart.electronid > maxProngCVNe){maxProngCVNe=sr->vtx.elastic.fuzzyk.png[iProng].cvnpart.electronid;elecdir=(TVector3) sr->vtx.elastic.fuzzyk.png[iProng].dir;}}if(maxProngCVNe==-5) return-5.f;TVector3 beamdir=ana::NuMIBeamDirection(caf::kNEARDET);return(float) elecdir.Dot(beamdir);})
const ana::Binning eelecbins
const ana::Var kTrueElectronRecoERHCTuned([](const caf::SRProxy *sr) ->float{ double p0=-0.0861793;double p1=0.235812;double p2=-0.0348964;float energy=-1000.f;if(!sr->vtx.elastic.IsValid) return-1000.f;if(sr->vtx.elastic.fuzzyk.npng< 1) return-1000.f;int true_electron_idx=true_electron_png(sr);if(true_electron_idx< 0) return-5.f;float x=(sr->vtx.elastic.fuzzyk.png[true_electron_idx].shwlid.shwE);if(x< 0) return 0.0f;if(x<=6) energy=x-(p0+x *p1+p2 *pow(x, 2));else energy=x;if(energy< 0) energy=x;return energy;})
const Var kDistAllWest([](const caf::SRProxy *sr){if(std::isnan(1.*sr->sel.nuecosrej.distallpngwest)) return-1000.0f;return float(sr->sel.nuecosrej.distallpngwest);})
Distance of all showers in slice from the west edge of detector.
const ana::NuTruthVar kTrueHadEST
const Var kDistAllTop([](const caf::SRProxy *sr){if(std::isnan(1.*sr->sel.nuecosrej.distallpngtop)) return-1000.0f;return float(sr->sel.nuecosrej.distallpngtop);})
Distance of all showers in slice from the top edge of detector.
const ana::HistAxis kTrueElectronEStandardAxis
const ana::Var kFracResNeutrinoE
const ana::NuTruthVar kTrueEMEST
const ana::Var kElectronERHCTuned([](const caf::SRProxy *sr) ->float{ double p0=-0.0861793;double p1=0.235812;double p2=-0.0348964;float energy=-1000.f;if(!sr->vtx.elastic.IsValid) return-1000.f;if(sr->vtx.elastic.fuzzyk.npng< 1) return-1000.f;float x=(sr->vtx.elastic.fuzzyk.png[0].shwlid.shwE);if(x< 0) return 0.0f;if(x<=6) energy=x-(p0+x *p1+p2 *pow(x, 2));else energy=x;if(energy< 0) energy=x;return energy;})
const ana::NuTruthVar kTrueVtxYST
const ana::Var kAllPngDistFront
const ana::Binning costhetabins
const Var kDistAllBack([](const caf::SRProxy *sr){if(std::isnan(1.*sr->sel.nuecosrej.distallpngback)) return-1000.0f;return float(sr->sel.nuecosrej.distallpngback);})
Distance of all showers in slice from the back edge of detector.
const ana::Var kRecoElectronEVsCosVsEnu
Proxy for caf::StandardRecord.
_Var< T > Var2D(const _Var< T > &a, const Binning &binsa, const _Var< T > &b, const Binning &binsb)
Variable formed from two input variables.
const ana::NuTruthHistAxis kTrueElectronEVsCosVsEnuStandardAxisST("True E_{e} vs cos #{theta} vs Neutrino Energy (GeV)", three_d_bins, kTrueElectronEVsCosVsEnuST)
const ana::Var kAbsResElectronE
const ana::Var kAbsResProngCVNElectronE
const ana::Var kTrueElectronRecoCosTheta([](const caf::SRProxy *sr) ->float{if(!sr->vtx.elastic.IsValid) return-1000.f;if(sr->vtx.elastic.fuzzyk.npng< 1) return-1000.f;int true_electron_idx=true_electron_png(sr);if(true_electron_idx< 0) return-5.f;TVector3 elecdir=(TVector3) sr->vtx.elastic.fuzzyk.png[true_electron_idx].dir;TVector3 beamdir=ana::NuMIBeamDirection(caf::kNEARDET);return elecdir.Dot(beamdir);})
const ana::HistAxis kRecoQ2StandardAxis("Reconstructed Q^{2} (GeV)", q2bins, kRecoQ2)
const ana::NuTruthVar kTrueVtxXST
const ana::Var kAbsResTrueElectronTheta
const ana::Var kAbsResElectronCosTheta
const ana::NuTruthHistAxis kTrueElectronEStandardAxisST("True E_{e} (GeV)", eelecbins, kTrueElectronEST)
const ana::HistAxis kTrueElectronEVsCosStandardAxis
const ana::Var kRecoElectronEVsCos
const ana::Var kFracResElectronCosTheta
const ana::HistAxis kRecoElectronCosThetaStandardAxis("Reco cos #theta_{e}", costhetabins, kRecoElectronCosTheta)
_Var< T > Var3D(const _Var< T > &a, const Binning &binsa, const _Var< T > &b, const Binning &binsb, const _Var< T > &c, const Binning &binsc)
This is just like a Var2D, but useful for 3D Spectra.
const ana::Var kTrueElectronRecoE
const ana::Var kAbsResNeutrinoE
const ana::NuTruthVar kTrueNeutrinoEST
const ana::Var kFracResTrueElectronCosTheta
const ana::HistAxis kTrueElectronEVsCosVsEnuStandardAxis
const Var kDistAllEast([](const caf::SRProxy *sr){if(std::isnan(1.*sr->sel.nuecosrej.distallpngeast)) return-1000.0f;return float(sr->sel.nuecosrej.distallpngeast);})
Distance of all showers in slice from the east edge of detector.
const ana::NuTruthVar kTrueHadronicYST
const ana::Var kFracResElectronTheta
const ana::Var kElectronE
const ana::Binning double_diff_bins
const ana::Var kFracResProngCVNElectronTheta
const ana::HistAxis kTrueElectronCosThetaStandardAxis
const ana::Var kTrueElectronCosTheta
const ana::Var kAllPngDistEast
const Var kNueEnergy2018([](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 kNueEnergyRHC(sr);else return kNueEnergyFHC(sr);})
const ana::Var kAbsResProngCVNElectronCosTheta
const ana::Var kTrueElectronEVsCos
const ana::HistAxis kRecoElectronEVsCosVsEnuStandardAxis("Reco. E_{e} vs cos #{theta} vs Neutrino Energy (GeV)", three_d_bins, kRecoElectronEVsCosVsEnu)
const ana::Var kRecoElectronTheta([](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);float theta=elecdir.Dot(beamdir);return(float) TMath::ACos(theta)*180/TMath::Pi();})
const ana::Var kFracResProngCVNElectronE
const ana::NuTruthHistAxis kTrueNeutrinoEnergyStandardAxisST("True Neutrino Energy (GeV)", enubins, kTrueNeutrinoEST)
HistAxis HistAxisFromNuTruthHistAxis(NuTruthHistAxis ntha, double _default)
const ana::NuTruthVar kTrueElectronEVsCosVsEnuST
const ana::Var kFracResTrueElectronTheta
const ana::Var kAllPngDistTop
const ana::Var kTrueElectronTheta
const ana::Var kAbsResProngCVNElectronTheta
const ana::NuTruthHistAxis kTrueElectronCosThetaStandardAxisST("True cos #theta_{e}", costhetabins, kTrueElectronCosThetaST)
const ana::HistAxis kRecoElectronEStandardAxis("Reco E_{e} (GeV)", eelecbins, kElectronE)
ana::NuTruthHistAxis axis
const ana::HistAxis kTrueQ2StandardAxis
const ana::Var kFracResElectronE
const ana::Binning enubins
const ana::Var kTrueElectronRecoEFHCTuned([](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.elastic.IsValid) return-1000.f;if(sr->vtx.elastic.fuzzyk.npng< 1) return-1000.f;int true_electron_idx=true_electron_png(sr);if(true_electron_idx< 0) return-5.f;float x=(sr->vtx.elastic.fuzzyk.png[true_electron_idx].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;})
Var VarFromNuTruthVar(const NuTruthVar &stv, double _default)
const Var kDistAllFront([](const caf::SRProxy *sr){if(std::isnan(1.*sr->sel.nuecosrej.distallpngfront)) return-1000.0f;return float(sr->sel.nuecosrej.distallpngfront);})
Distance of all showers in slice from the front edge of detector.
const ana::Var kFracResProngCVNElectronCosTheta
const ana::HistAxis kRecoNeutrinoEnergyStandardAxis("Reconstructed Neutrino Energy (GeV)", enubins, kRecoNeutrinoE)
const ana::NuTruthHistAxis kTrueQ2StandardAxisST("True Q^{2} (GeV)", q2bins, kTrueQ2ST)
const ana::Var kProngCVNElectronTheta([](const caf::SRProxy *sr){if(!sr->vtx.elastic.IsValid) return-1000.f;if(sr->vtx.elastic.fuzzyk.npng< 1) return-1000.f;int nProngs=sr->vtx.elastic.fuzzyk.npng;float maxProngCVNe=-5.;TVector3 elecdir={0, 0, 0};for(int iProng=0;iProng< nProngs;iProng++){if(sr->vtx.elastic.fuzzyk.png[iProng].cvnpart.electronid > maxProngCVNe){maxProngCVNe=sr->vtx.elastic.fuzzyk.png[iProng].cvnpart.electronid;elecdir=(TVector3) sr->vtx.elastic.fuzzyk.png[iProng].dir;}}if(maxProngCVNe==-5) return-5.f;TVector3 beamdir=ana::NuMIBeamDirection(caf::kNEARDET);float theta=elecdir.Dot(beamdir);return(float)(TMath::ACos(theta)*180/TMath::Pi());})
const ana::Var kTrueNeutrinoE
const ana::Var kElectronEUntuned([](const caf::SRProxy *sr) ->float{if(!sr->vtx.elastic.IsValid) return-1000.f;if(sr->vtx.elastic.fuzzyk.npng< 1) return-1000.f;float x=(sr->vtx.elastic.fuzzyk.png[0].shwlid.shwE);return x;})
const ana::Var kTrueElectronE
const ana::Var kAllPngDistWest
const ana::NuTruthVar kTrueVtxZST
const ana::Var kNProngs([](const caf::SRProxy *sr) ->int{if(!sr->vtx.elastic.IsValid) return-5;return sr->vtx.elastic.fuzzyk.npng;})
const ana::Var kProngCVNElectronScore([](const caf::SRProxy *sr){if(!sr->vtx.elastic.IsValid) return-1000.f;if(sr->vtx.elastic.fuzzyk.npng< 1) return-1000.f;int nProngs=sr->vtx.elastic.fuzzyk.npng;float maxProngCVNe=-5.;for(int iProng=0;iProng< nProngs;iProng++){if(sr->vtx.elastic.fuzzyk.png[iProng].cvnpart.electronid > maxProngCVNe){maxProngCVNe=sr->vtx.elastic.fuzzyk.png[iProng].cvnpart.electronid;}}return maxProngCVNe;})
const ana::Var kTrueElectronRecoEUntuned([](const caf::SRProxy *sr) ->float{if(!sr->vtx.elastic.IsValid) return-1000.f;if(sr->vtx.elastic.fuzzyk.npng< 1) return-1000.f;int true_electron_idx=true_electron_png(sr);if(true_electron_idx< 0) return-5.f;float x=(sr->vtx.elastic.fuzzyk.png[true_electron_idx].shwlid.shwE);return x;})
const ana::Var kProngCVNElectronE([](const caf::SRProxy *sr){if(!sr->vtx.elastic.IsValid) return-1000.f;if(sr->vtx.elastic.fuzzyk.npng< 1) return-1000.f;int nProngs=sr->vtx.elastic.fuzzyk.npng;float maxProngCVNe=-5.;float maxProngCVNe_ElecE=-5.;for(int iProng=0;iProng< nProngs;iProng++){if(sr->vtx.elastic.fuzzyk.png[iProng].cvnpart.electronid > maxProngCVNe){maxProngCVNe=sr->vtx.elastic.fuzzyk.png[iProng].cvnpart.electronid;maxProngCVNe_ElecE=sr->vtx.elastic.fuzzyk.png[iProng].calE;}}return maxProngCVNe_ElecE;})
int true_electron_png(const caf::SRProxy *sr)
const ana::Var kElectronEFHCTuned([](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.elastic.IsValid) return-1000.f;if(sr->vtx.elastic.fuzzyk.npng< 1) return-1000.f;float x=(sr->vtx.elastic.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 ana::Var kAbsResTrueElectronCosTheta
const ana::Binning q2bins
const ana::HistAxis kTrueNeutrinoEnergyStandardAxis
const ana::NuTruthVar kTrueElectronThetaST([](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){TVector3 edir=nu->prim[iprim].p.Vect();TVector3 beamdir=ana::NuMIBeamDirection(caf::kNEARDET);float theta=edir.Unit().Dot(beamdir.Unit());return(float) TMath::ACos(theta)*180/TMath::Pi();}}return-5.0;})
const ana::NuTruthVar kTrueQ2ST
const ana::HistAxis kRecoElectronEVsCosStandardAxis("Reconstructed E_{e} vs cos #theta; Elec_{e} (GeV); cos #{theta}", double_diff_bins, kRecoElectronEVsCos)
const ana::Var kRecoNeutrinoE
const ana::NuTruthHistAxis kTrueElectronEVsCosStandardAxisST("True E_{e} vs cos #theta; Elec_{e} (GeV); cos #{theta}", double_diff_bins, kTrueElectronEVsCosST)
const ana::Var kTrueElectronRecoTheta([](const caf::SRProxy *sr) ->float{if(!sr->vtx.elastic.IsValid) return-1000.f;if(sr->vtx.elastic.fuzzyk.npng< 1) return-1000.f;int true_electron_idx=true_electron_png(sr);if(true_electron_idx< 0) return-5.f;TVector3 elecdir=(TVector3) sr->vtx.elastic.fuzzyk.png[true_electron_idx].dir;TVector3 beamdir=ana::NuMIBeamDirection(caf::kNEARDET);float theta=elecdir.Dot(beamdir);return(float) TMath::ACos(theta)*180/TMath::Pi();})
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);})
const ana::NuTruthVar kTrueElectronEVsCosST
const ana::Var kRecoQ2([](const caf::SRProxy *sr){const double M_e_sqrd=std::pow(0.000511, 2);double E_e=kElectronE(sr);double E_nu=kRecoNeutrinoE(sr);double cos_e=kRecoElectronCosTheta(sr);double p_e=std::sqrt(std::pow(E_e, 2)-M_e_sqrd);return 2 *E_nu *(E_e-p_e *cos_e)-M_e_sqrd;})
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::Var kFracResTrueElectronE
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;})