14 #include "CAFAna/Core/Var.h" 36 bool isRHC = sFHC_RHC.Contains(
"rhc") ?
true :
false;
39 TString fnameMC =
"prod_sumdecaf_R19-11-18-prod5reco.d.h.l_nd_genie_N1810j0211a_nonswap_fhc_nova_v08_full_v1_"+sNumu_Nue+
"2020";
40 TString fnameData =
"prod_sumdecaf_R19-11-18-prod5reco.d.f.h.l_nd_numi_fhc_full_v1_goodruns_"+sNumu_Nue+
"2020";
43 fnameMC =
"prod_sumdecaf_R19-11-18-prod5reco.d_nd_genie_N1810j0211a_nonswap_rhc_nova_v08_full_v1_"+sNumu_Nue+
"2020";
44 fnameData =
"prod_sumdecaf_R19-11-18-prod5reco.g_nd_numi_rhc_full_v1_goodruns_"+sNumu_Nue+
"2020";
57 TString
fileOut = sFHC_RHC+
"_"+sNumu_Nue+
".root";
60 if(sNumu_Nue.Contains(
"numu")){
64 std::vector<std::string>
selNames = {
"QualCont"};
68 unsigned int nSels = selNames.size();
72 std::vector<std::string> hadEfracNames = {
"hadEfracQ1",
"hadEfracQ2",
"hadEfracQ3",
"hadEfracQ4"};
73 unsigned int nhadEfracQuants = hadEfracNames.size();
75 std::vector<Cut> quantCuts;
76 std::vector<std::string> quantNames;
77 for(
unsigned int q1 = 0; q1<nhadEfracQuants; ++q1){
81 std::vector<std::string> ptNames = {
"pTfracQ1",
"pTfracQ2",
"pTfracQ3",
"pTfracAllQs"};
82 unsigned int nptQuants = ptNames.size();
84 for(
unsigned int q2 = 0;
q2<nptQuants; ++
q2){
85 quantCuts.push_back(hadEfracCuts[q1]&&ptCuts[
q2]);
86 quantNames.push_back(hadEfracNames[q1]+
"_"+ptNames[q2]);
90 quantCuts.push_back(
kNoCut);
91 quantNames.push_back(
"hadEfracAllQs_pTfracAllQs");
92 unsigned int nQuants = quantNames.size();
95 std::vector<HistDef>
defs;
97 unsigned int nVars = defs.size();
98 std::vector<std::string> varNames; std::vector<HistAxis>
axis;
99 for(
unsigned int var = 0;
var<nVars; ++
var){
100 varNames.emplace_back(defs[
var].
name);
101 axis.emplace_back(defs[
var].axis);
107 DataMCPair* numuDataMC[nVars][nSels][nQuants];
110 if(isRHC) WrongSign =
kIsNu;
112 for(
unsigned int var = 0;
var<nVars; ++
var){
113 for(
unsigned int sel = 0; sel<nSels; ++sel){
114 for(
unsigned int quant = 0; quant<nQuants; ++quant){
115 Cut thisCut = selCuts[sel] && quantCuts[quant];
116 numuDataMC[
var][sel][quant] =
new DataMCPair(thisCut, axis[
var], ldrData, ldrMC, weight, systs, {{
"Total Background", !
kIsNumuCC},{
"Wrong Sign", WrongSign}});
124 TFile*
fout =
new TFile(fileOut,
"RECREATE");
126 for(
unsigned int var = 0;
var<nVars; ++
var){
127 for(
unsigned int sel = 0; sel<nSels; ++sel){
128 for(
unsigned int quant = 0; quant<nQuants; ++quant){
129 TString
name = varNames[
var]+
"_"+selNames[sel]+
"_"+quantNames[quant];
130 numuDataMC[
var][sel][quant]->
SaveTo(fout, name);
143 std::vector<std::string>
selNames = {
"Presel",
"CVNeLow",
"CVNeHigh"};
145 unsigned int nSels = selNames.size();
147 std::string decompFName =
"nue2020_rhc_prop_decomp_ratios.root";
149 if(sFHC_RHC.Contains(
"fhc")) decompFName =
"nue2020_fhc_combo_decomp_ratios.root";
152 "/nue/decomp/" + decompFName,
156 std::vector<HistDef>
defs;
165 unsigned int nVars = defs.size();
166 std::vector<std::string> varNames; std::vector<HistAxis>
axis;
167 for(
unsigned int var = 0;
var<nVars; ++
var){
168 varNames.emplace_back(defs[
var].
name);
169 axis.emplace_back(defs[
var].axis);
176 for(
unsigned int var = 0;
var<nVars; ++
var){
177 for(
unsigned int sel = 0; sel<nSels; ++sel){
178 Cut thisCut = selCuts[sel];
188 TString fileOut1(fileOut); fileOut1.ReplaceAll(
".root",
"_mc.root");
189 TString fileOut2(fileOut); fileOut2.ReplaceAll(
".root",
"_data.root");
190 TString fileOut3(fileOut); fileOut3.ReplaceAll(
".root",
"_mc_decomp.root");
192 TFile* fout_mc =
new TFile(fileOut1,
"RECREATE");
193 TFile* fout_data =
new TFile(fileOut2,
"RECREATE");
194 TFile* fout_mcdecomp =
new TFile(fileOut3,
"RECREATE");
196 std::vector<TString> compNames = {
"nue",
"numu",
"antinue",
"antinumu",
"nc"};
197 unsigned int nComp = compNames.size();
199 for(
unsigned int var = 0;
var<nVars; ++
var){
200 for(
unsigned int sel = 0; sel<nSels; ++sel){
201 TString
name = varNames[
var]+
"_"+selNames[sel];
214 specData[
var][sel]->
SaveTo(fout_data, name);
void AddHistDefNumuNDDataMC(std::vector< HistDef > &hd)
const Cut kIsNumuCC(CCFlavSel(14, 14))
Select CC .
Cuts and Vars for the 2020 FD DiF Study.
void AddHistDefNueShower(std::vector< HistDef > &hd)
void AddHistDefSlice(std::vector< HistDef > &hd)
void SaveTo(TDirectory *dir, const std::string &name) const
const double kNue2020CVNRHCHighEdge
const Cut kIsAntiNu([](const caf::SRProxy *sr){if(sr->mc.nnu==0) return false;assert(sr->mc.nnu==1);return sr->mc.nu[0].pdg< 0;})
Is this truly an antineutrino?
void SetSpillCut(const SpillCut &cut)
void AddHistDefNueSelectionExtras(std::vector< HistDef > &hd)
std::string FindCAFAnaDir()
const Cut kIsNu([](const caf::SRProxy *sr){if(sr->mc.nnu==0) return false;assert(sr->mc.nnu==1);return sr->mc.nu[0].pdg > 0;})
Representation of a spectrum in any variable, with associated POT.
Spectrum Unoscillated() const
std::vector< Cut > GetNumuPtQuantCuts2020(const bool isRHC, const unsigned int ehad_quant, const unsigned int nquants)
const double kNue2020CVNFHCHighEdge
const Cut kNue2020NDPresel
void AddHistDefRecoND(std::vector< HistDef > &hd)
virtual void Go() override
Load all the registered spectra.
void SaveTo(TDirectory *dir, const std::string &name) const
virtual OscillatableSpectrum ComponentCC(int from, int to) const
const HistDef defs[kNumVars]
void AddHistDefProngCVN(std::vector< HistDef > &hd)
std::vector< float > Spectrum
void AddHistDefNuePID(std::vector< HistDef > &hd)
const SystShifts kNoShift
void ND_DataMC(TString sFHC_RHC, TString sNumu_Nue)
Collaborates with Spectrum and OscillatableSpectrum to fill spectra from CAF files.
virtual Spectrum ComponentNCTotal() const
void AddHistDefNueND(std::vector< HistDef > &hd)
const Var kNue2020AnaBin([](const caf::SRProxy *sr){int selBin=kNue2020SelectionBin(sr);float nuE=kNueEnergy2020(sr);int nuEBin=nuE/0.5;assert(nuEBin<=8 &&"An event with nuE > 4.5 should never happen");int anaBin=9 *selBin+nuEBin;return anaBin;})
Use this Analysis Binning for Ana2020, official Binning.
std::vector< const ISyst * > get3FlavorAna2020AllSysts(const EAnaType2020 ana, const bool smallgenie, const BeamType2020 beam, const bool isFit, const bool ptExtrap)
Standard interface to all prediction techniques.
const SpillCut kStandardSpillCuts
Apply this unless you're doing something special.
const std::string selNames[kNumSels]
void AddHistDefNueEnergy(std::vector< HistDef > &hd)
const Cut kNumuContainND2020([](const caf::SRProxy *sr){if(!sr->vtx.elastic.IsValid) return false;for(unsigned int i=0;i< sr->vtx.elastic.fuzzyk.nshwlid;++i){const caf::SRVector3DProxy &start=sr->vtx.elastic.fuzzyk.png[i].shwlid.start;const caf::SRVector3DProxy &stop=sr->vtx.elastic.fuzzyk.png[i].shwlid.stop;if(std::min(start.X(), stop.X())< -180.0) return false;if(std::max(start.X(), stop.X()) > 180.0) return false;if(std::min(start.Y(), stop.Y())< -180.0) return false;if(std::max(start.Y(), stop.Y()) > 180.0) return false;if(std::min(start.Z(), stop.Z())< 40.0) return false;if(std::max(start.Z(), stop.Z()) > 1525.0) return false;}if(sr->trk.kalman.ntracks< 1) return false;for(unsigned int i=0;i< sr->trk.kalman.ntracks;++i){if(i==sr->trk.kalman.idxremid) continue;else if(sr->trk.kalman.tracks[i].start.Z() > 1275||sr->trk.kalman.tracks[i].stop.Z() > 1275) return false;}return(sr->trk.kalman.ntracks > sr->trk.kalman.idxremid &&sr->slc.firstplane > 1
&&sr->slc.lastplane< 212 &&sr->trk.kalman.tracks[0].start.Z()< 1100
&&(sr->trk.kalman.tracks[0].stop.Z()< 1275 ||sr->sel.contain.kalyposattrans< 55) &&sr->sel.contain.kalfwdcellnd > 5 &&sr->sel.contain.kalbakcellnd > 10);})
std::vector< Cut > GetNumuEhadFracQuantCuts2020(const bool isRHC, const unsigned int nquants)
const Cut kNoCut
The simplest possible cut: pass everything, used as a default.
static NullLoader kNullLoader
Dummy loader that doesn't load any files.