9 #include "CAFAna/Core/Binning.h" 13 #include "CAFAna/Core/Var.h" 15 #include "CAFAna/Cuts/NumuCuts.h" 18 #include "CAFAna/Vars/NumuVars.h" 32 std::string nd_nonswap =
"/pnfs/nova/persistent/production/concat/R16-03-03-prod2reco.d/prod_decaf_R16-03-03-prod2reco.d_nd_genie_nonswap_nogenierw_fhc_nova_v08_full_numu_contain_v1/*.root";
48 const Cut kTrueEbelow5({
"mc.nnu",
"mc.nu.E"},
51 if (
sr->
mc.
nnu < 1)
return false;
52 else return (
sr->
mc.
nu[0].E <= 5.0);
55 const Cut kHasTrueMuon({
"energy.numusimp.mc.truegoodmuon",
"energy.numusimp.mc.truemuonE"},
58 if (
sr->
energy.numusimp.mc.truegoodmuon < 1)
return false;
59 else return (
sr->
energy.numusimp.mc.truemuonE > 0);
70 std::vector<double> hadronBins;
71 double hadronAxis = 0.0;
72 for(
int i = 0;
i < 116; ++
i){
73 hadronBins.push_back(hadronAxis);
74 if (hadronAxis < 1.0){hadronAxis = hadronAxis + 0.01;}
75 else if (hadronAxis < 1.5){hadronAxis = hadronAxis + 0.05;}
76 else {hadronAxis = hadronAxis + 0.1;}
94 const Var kHadActive = kActive1 + kActive2;
95 const Var kHadTran = kTran1 + kTran2;
96 const Var kHadCatcher = kCatcher1 + kCatcher2;
98 const Var kHadAll = kHadActive + kHadTran + kHadCatcher;
107 return (
sr->
energy.numusimp.ndtrklenact / 100);
113 return (
sr->
energy.numusimp.ndtrklencat / 100);
116 const Cut kAllActive = (kTrkCalAct + kTrkCalTran > 0) && (kTrkCalCat == 0);
117 const Cut kAllCatcher = (kTrkCalAct + kTrkCalTran == 0) && (kTrkCalCat > 0);
120 const int kNumPlots2D = 4;
122 Plot2D plots2D[kNumPlots2D] = {
124 {
"MuonE_hist_active",
"Reco muon track length (m)", kTrackLengthBinning,
kTrkLenAct,
"True muon energy (GeV)" , kMuonEnergyBinning,
kTrueMuonE, kCut && kAllActive},
125 {
"MuonE_hist_catcher",
"Reco muon track length (m)", kTrackLengthBinning,
kTrkLenCat,
"True muon energy (GeV)" , kMuonEnergyBinning,
kTrueMuonE, kCut && kAllCatcher},
126 {
"MuonE_hist_activeAndCatcher",
"Reco muon track length (m)", kTrackLengthBinning,
kTrkLenCat,
"True muon energy in catcher (GeV)" , kMuonEnergyBinning,
kTrueCatcherE, kCut && kActiveAndCatcher},
127 {
"HadE_hist_DIS",
"Visible hadronic energy (GeV)", kHadEBinning, kHadAll,
"True hadronic energy (GeV)" ,
kHadEnergyBinning,
kTrueHadE, kCut}
132 for(
int i = 0;
i < kNumPlots2D;
i++)
141 TFile
f(
"2DPlotsForFittingND.root",
"RECREATE");
143 for(
int i = 0;
i < kNumPlots2D;
i++)
147 h->SetName(p.name.c_str());
const Cut kIsNumuCC(CCFlavSel(14, 14))
Select CC .
TH2 * ToTH2(double exposure, EExposureType expotype=kPOT, EBinType bintype=kBinContent) const
Spectrum must be 2D to obtain TH2.
Represent the binning of a Spectrum's x-axis.
Cuts and Vars for the 2020 FD DiF Study.
void Plot2D(TH1 *total, std::map< std::string, TH1 * > systs, std::vector< std::string > to_plot, std::string basename)
void SetSpillCut(const SpillCut &cut)
const Binning kHadEnergyBinning
Representation of a spectrum in any variable, with associated POT.
const Var kTrkLenCat([](const caf::SRProxy *sr){int ibesttrk=kBestTrack(sr);if(sr->trk.kalman.ntracks< 1) return-1000.f;if(ibesttrk< 0||ibesttrk >=int(sr->trk.kalman.ntracks)) return-1000.f; if(sr->trk.kalman.tracks[ibesttrk].leninact > 0 && sr->trk.kalman.tracks[ibesttrk].lenincat< 0) return 0.f; if(sr->trk.kalman.tracks[ibesttrk].leninact > 0 && sr->trk.kalman.tracks[ibesttrk].lenincat > 0) return float(sr->trk.kalman.tracks[ibesttrk].lenincat/100.); if(sr->trk.kalman.tracks[ibesttrk].leninact< 0 && sr->trk.kalman.tracks[ibesttrk].lenincat > 0) return float((sr->trk.kalman.tracks[ibesttrk].leninact/100.) +(sr->trk.kalman.tracks[ibesttrk].lenincat/100.));return-1000.f;})
const Var kTrueE([](const caf::SRProxy *sr){assert(sr->mc.nnu==1);return sr->mc.nu[0].E;})
const Var kTrkLenAct([](const caf::SRProxy *sr){int ibesttrk=kBestTrack(sr);if(sr->trk.kalman.ntracks< 1) return-1000.f;if(ibesttrk< 0||ibesttrk >=int(sr->trk.kalman.ntracks)) return-1000.f; if(sr->trk.kalman.tracks[ibesttrk].leninact > 0 && sr->trk.kalman.tracks[ibesttrk].lenincat< 0) return float((sr->trk.kalman.tracks[ibesttrk].leninact/100.) +(sr->trk.kalman.tracks[ibesttrk].lenincat/100.)); if(sr->trk.kalman.tracks[ibesttrk].leninact > 0 && sr->trk.kalman.tracks[ibesttrk].lenincat > 0) return float(sr->trk.kalman.tracks[ibesttrk].leninact/100.); if(sr->trk.kalman.tracks[ibesttrk].leninact< 0 && sr->trk.kalman.tracks[ibesttrk].lenincat > 0) return 0.f;return-1000.f;})
virtual void Go() override
Load all the registered spectra.
short nnu
Number of neutrinos in nu vector (0 or 1)
static Binning Custom(const std::vector< double > &edges)
std::vector< float > Spectrum
const SystShifts kNoShift
std::vector< double > POT
The StandardRecord is the primary top-level object in the Common Analysis File trees.
Collaborates with Spectrum and OscillatableSpectrum to fill spectra from CAF files.
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);})
#define SIMPLEVAR(CAFNAME)
For Vars where literally all you need is a single CAF variable.
SRTruthBranch mc
Truth branch for MC: energy, flavor, etc.
const Cut kActiveAndCatcher([](const caf::SRProxy *sr){int ibesttrk=muonid_classifier::kBestMuonTrack(sr);if(sr->trk.kalman.ntracks< 1||ibesttrk< 0||ibesttrk >=int(sr->trk.kalman.ntracks)) return false;const caf::SRKalmanTrackProxy &bestmuon=sr->trk.kalman.tracks[ibesttrk];return(bestmuon.leninact > 0 && bestmuon.lenincat > 0);})
const SpillCut kStandardSpillCuts
Apply this unless you're doing something special.
SREnergyBranch energy
Energy estimator branch.
static Binning Simple(int n, double lo, double hi, const std::vector< std::string > &labels={})
std::vector< SRNeutrino > nu
implemented as a vector to maintain mc.nu structure, i.e. not a pointer, but with 0 or 1 entries...