Nus18SystsGENIELoad.C
Go to the documentation of this file.
1 /////////////////////////////////////////////////////////////////////
2 // GENIE systematics for Nus18
3 //
4 // Author: Sijith Edayath
5 // Modified by Mike Wallbank (wallbank@fnal.gov)
6 /////////////////////////////////////////////////////////////////////
7 
9 #include "CAFAna/Core/Loaders.h"
10 #include "CAFAna/Core/SystShifts.h"
11 #include "CAFAna/Core/Utilities.h"
12 #include "CAFAna/Cuts/Cuts.h"
13 #include "NuXAna/Cuts/NusCuts18.h"
15 #include "CAFAna/Cuts/SpillCuts.h"
23 #include "CAFAna/Systs/BeamSysts.h"
24 #include "CAFAna/Systs/Systs.h"
26 #include "CAFAna/Systs/XSecSysts.h"
28 #include "CAFAna/Vars/HistAxes.h"
29 #include "NuXAna/Vars/HistAxes.h"
31 
34 
35 using namespace ana;
36 
37 /// Get GENIE systematics labels
38 std::map<std::string, rwgt::ReweightLabel_t> GetGENIEShiftLabels();
39 
40 /// Get cross-section systematics labels
41 std::map<std::string, const ISyst*> GetXSecShiftLabels();
42 
43 void Nus18SystsGENIELoad(TString opt) {
44 
45  TH1::AddDirectory(0);
46  const Var kReweight = kXSecCVWgt2018*kPPFXFluxCVWgt;
47 
48  // Get options
49  ECAFType cafType;
50  Loaders::FluxType fluxType;
51  bool extrap = false;
52  if (opt.Contains("caf", TString::kIgnoreCase))
53  cafType = ECAFType::kFullCAF;
54  else if (opt.Contains("concat", TString::kIgnoreCase))
55  cafType = ECAFType::kNusConcat;
56  else {
57  std::cout << "ECAFType required: caf or concat" << std::endl;
58  abort();
59  }
60  if (opt.Contains("fhc", TString::kIgnoreCase))
61  fluxType = Loaders::FluxType::kFHC;
62  else if (opt.Contains("rhc", TString::kIgnoreCase))
63  fluxType = Loaders::FluxType::kRHC;
64  else {
65  std::cout << "FluxType required: fhc or rhc" << std::endl;
66  abort();
67  }
68  if (opt.Contains("extrap", TString::kIgnoreCase))
69  extrap = true;
70 
71  // Specific GENIE options
72  bool genie_nd = true, genie_fd = true;
73  bool genie_nova = true, genie_general = true;
74  if (opt.Contains("nd", TString::kIgnoreCase) and
75  !opt.Contains("fd", TString::kIgnoreCase))
76  genie_fd = false;
77  if (opt.Contains("fd", TString::kIgnoreCase) and
78  !opt.Contains("nd", TString::kIgnoreCase))
79  genie_nd = false;
80  if (opt.Contains("NoPred", TString::kIgnoreCase)) {
81  genie_nd = false;
82  genie_fd = false;
83  }
84  if (opt.Contains("1", TString::kIgnoreCase) and
85  !opt.Contains("2", TString::kIgnoreCase))
86  genie_general = false;
87  if (opt.Contains("2", TString::kIgnoreCase) and
88  !opt.Contains("1", TString::kIgnoreCase))
89  genie_nova = false;
90 
91  // Set up the loaders
92  Loaders* loaders = new Prod4NomLoaders(cafType, fluxType);
94 
95  // Vector of sigmas, levels to set each systematic
96  std::vector<int> sigmas{-2, -1, +1, +2};
97 
98  // Get the labels for GENIE systematics
99  std::map<std::string, rwgt::ReweightLabel_t> genieLabels;
100  if (genie_nova)
101  genieLabels = GetGENIEShiftLabels();
102 
103  // Get the labels for the cross-section systematics
104  std::map<std::string, const ISyst*> xsecLabels;
105  if (genie_general)
106  xsecLabels = GetXSecShiftLabels();
107 
108  // Define map of systematic objects, indexed by same labels as previous map
109  std::map<std::string, std::map<int, SystShifts*> > systematics;
110 
111  // Fill the map with all shifts
112  for (const auto& sigma : sigmas) {
113  for (const auto& genieLabel : genieLabels)
114  systematics[genieLabel.first][sigma] = new SystShifts(GetGenieKnobSyst(genieLabel.second), sigma);
115  for (const auto& xsecLabel : xsecLabels)
116  systematics[xsecLabel.first][sigma] = new SystShifts(xsecLabel.second, sigma);
117  }
118 
119  // Define a map of samples and cuts/axes to set them up
120  // Each sample, essentially, is a way to set up the analysis
121  HistAxis AxisRecoE = kNus18AxisE;
122  std::map<std::string, std::pair<HistAxis*, std::pair<Cut*, Cut*> > > cut_samples;
123  cut_samples["Nus18"] = std::make_pair(&AxisRecoE, std::make_pair(new Cut(kNus18ND), new Cut(kNus18FD)));
124 
125  // Set up maps to the decompositions/predictions (each flavor component)
126  // Nominal maps are indexed purely by sample label
127  // Shifted maps are indexed by sample label, systematic label, then sigma of the shift
128  std::map<std::string, NDPredictionSterile*> predsND_nominal;
129  std::map<std::string, FDPredictionSterile*> predsFD_nominal;
130  std::map<std::string, PredictionSterile*> predsExtrap_nominal;
131  std::map<std::string, std::map<std::string, std::map<int, NDPredictionSterile*> > > predsND_shifted;
132  std::map<std::string, std::map<std::string, std::map<int, FDPredictionSterile*> > > predsFD_shifted;
133  std::map<std::string, std::map<std::string, std::map<int, PredictionSterile*> > > predsExtrap_shifted;
134 
135  // Set up the actual decompositions/predictions
136  // sample.first = the sample label
137  // shiftlabel.first = the systematic shift label
138  // sample.second.first = the sample HistAxis
139  // sample.second.second = the sample Cut
140  // syst.first = the integer number of sigmas for the shift
141  // syst.second = the systematic being shifted
142  for(const auto& sample : cut_samples) {
143 
144  const NDPredictionGenerator gennd(*sample.second.first, *sample.second.second.first, kNoShift, kReweight);
145  const FDPredictionGenerator genfd(*sample.second.first, *sample.second.second.second, kNoShift, kReweight);
146  SterileGenerator* genExtrap;
147  if (extrap)
148  genExtrap = new SterileGenerator(*sample.second.first, kNus18BinsNumuCCAxis,
149  *sample.second.second.second, *sample.second.second.first,
150  kNumuCutND2018, kNoShift, kReweight);
151 
152  // Set up the nominal decompositions
153  // Only one is needed per sample
154  if (genie_nd)
155  predsND_nominal[sample.first] = (NDPredictionSterile*)gennd.Generate(*loaders).release();
156  if (genie_fd)
157  predsFD_nominal[sample.first] = (FDPredictionSterile*)genfd.Generate(*loaders).release();
158  if (extrap)
159  predsExtrap_nominal[sample.first] = (PredictionSterile*)genExtrap->Generate(*loaders).release();
160 
161  // Set up the shifted decompositions
162  // One is needed for every sample, systematic, and sigma level
163  for (const auto& systLabel : systematics) {
164  for (const auto& syst : systLabel.second) {
165  if (genie_nd)
166  predsND_shifted[sample.first][systLabel.first][syst.first]
167  = (NDPredictionSterile*)gennd.Generate(*loaders, *syst.second).release();
168  if (genie_fd)
169  predsFD_shifted[sample.first][systLabel.first][syst.first]
170  = (FDPredictionSterile*)genfd.Generate(*loaders, *syst.second).release();
171  if (extrap)
172  predsExtrap_shifted[sample.first][systLabel.first][syst.first]
173  = (PredictionSterile*)genExtrap->Generate(*loaders, *syst.second).release();
174  }
175  }
176 
177  if (extrap)
178  delete genExtrap;
179 
180  }
181 
182  loaders->Go();
183 
184  std::string folder = "./";
185  std::string filenm = "SystsGENIE";
186 
187  std::string fullLocation = folder + filenm + ".root";
188  TFile* rootF = new TFile(fullLocation.c_str(), "RECREATE");
189  if (genie_nd)
190  SaveMaps(rootF, predsND_nominal, predsND_shifted);
191  if (genie_fd)
192  SaveMaps(rootF, predsFD_nominal, predsFD_shifted);
193  if (extrap)
194  SaveMaps(rootF, predsExtrap_nominal, predsExtrap_shifted);
195  rootF->Close();
196 
197  // delete loaders;
198  // for (const auto& syst : systematics)
199  // for (const auto& sigma : syst.second)
200  // delete sigma.second;
201 
202  return;
203 
204 }
205 
206 std::map<std::string, rwgt::ReweightLabel_t> GetGENIEShiftLabels() {
207 
208  std::map<std::string, rwgt::ReweightLabel_t> shiftlabels;
209 
210  // Ma NCEL, affects dsigma(NCEL)/dQ2 both in shape and normalization
211  shiftlabels["ReweightMaNCEL"] = rwgt::fReweightMaNCEL;
212  // NCEL strange axial form factor eta, affects dsigma(NCEL)/dQ2 both in shape and normalization
213  shiftlabels["ReweightEtaNCEL"] = rwgt::fReweightEtaNCEL;
214 
215  // CCQE parameters -----------------------
216  // elastic nucleon form factors (BBA/default -> dipole) - shape only effect of dsigma(CCQE)/dQ2
217  shiftlabels["ReweightVecCCQEshape"] = rwgt::fReweightVecCCQEshape;
218  // Ma CCRES, affects d2sigma(CCRES)/dWdQ2 both in shape and normalization
219  shiftlabels["ReweightMaCCRES"] = rwgt::fReweightMaCCRES;
220  // Mv CCRES, affects d2sigma(CCRES)/dWdQ2 both in shape and normalization
221  shiftlabels["ReweightMvCCRES"] = rwgt::fReweightMvCCRES;
222  // Ma NCRES, affects d2sigma(NCRES)/dWdQ2 both in shape and normalization
223  shiftlabels["ReweightMaNCRES"] = rwgt::fReweightMaNCRES;
224  // Mv NCRES, affects d2sigma(NCRES)/dWdQ2 both in shape and normalization
225  shiftlabels["ReweightMvNCRES"] = rwgt::fReweightMvNCRES;
226 
227  // Coherent pion production parameters -----------------------
228  // Ma for COH pion production
229  shiftlabels["ReweightMaCOHpi"] = rwgt::fReweightMaCOHpi;
230  // R0 for COH pion production
231  shiftlabels["ReweightR0COHpi"] = rwgt::fReweightR0COHpi;
232  // the Bodek-Yang model parameter A_{ht} - incl. both shape and normalization effect
233  shiftlabels["ReweightAhtBY"] = rwgt::fReweightAhtBY;
234  // the Bodek-Yang model parameter B_{ht} - incl. both shape and normalization effect
235  shiftlabels["ReweightBhtBY"] = rwgt::fReweightBhtBY;
236  // the Bodek-Yang model parameter CV1u - incl. both shape and normalization effect
237  shiftlabels["ReweightCV1uBY"] = rwgt::fReweightCV1uBY;
238  // the Bodek-Yang model parameter CV2u - incl. both shape and normalization effect
239  shiftlabels["ReweightCV2uBY"] = rwgt::fReweightCV2uBY;
240  // // the Bodek-Yang model parameter A_{ht} - shape only effect to d2sigma(DIS)/dxdy
241  // shiftlabels["ReweightAhtBYshape"] = rwgt::fReweightAhtBYshape;
242  // // the Bodek-Yang model parameter B_{ht} - shape only effect to d2sigma(DIS)/dxdy
243  // shiftlabels["ReweightBhtBYshape"] = rwgt::fReweightBhtBYshape;
244  // // the Bodek-Yang model parameter CV1u - shape only effect to d2sigma(DIS)/dxdy
245  // shiftlabels["ReweightCV1uBYshape"] = rwgt::fReweightCV1uBYshape;
246  // // the Bodek-Yang model parameter CV2u - shape only effect to d2sigma(DIS)/dxdy
247  // shiftlabels["ReweightCV2uBYshape"] = rwgt::fReweightCV2uBYshape;
248  // the inclusive DIS CC normalization (not currently working in genie)
249  shiftlabels["ReweightNormDISCC"] = rwgt::fReweightNormDISCC;
250  // the ratio of \sigma(\bar\nu CC) / \sigma(\nu CC) (not currently working in genie)
251  shiftlabels["ReweightRnubarnuCC"] = rwgt::fReweightRnubarnuCC;
252  // DIS nuclear modification (shadowing, anti-shadowing, EMC). Not working in GENIE at the moment
253  shiftlabels["ReweightDISNuclMod"] = rwgt::fReweightDISNuclMod;
254 
255  // NC: general -----------------------
256  // NC total normalization (currently does nothing, but should retain for future)
257  shiftlabels["ReweightNC"] = rwgt::fReweightNC;
258 
259  // Hadronization (free nucleon target) -----------------------
260  // xF distribution for low multiplicity (N + pi) DIS f/s produced by AGKY
261  shiftlabels["ReweightAGKY_xF1pi"] = rwgt::fReweightAGKY_xF1pi;
262  // pT distribution for low multiplicity (N + pi) DIS f/s produced by AGKY
263  shiftlabels["ReweightAGKY_pT1pi"] = rwgt::fReweightAGKY_pT1pi;
264  // Hadron formation zone
265  shiftlabels["ReweightFormZone"] = rwgt::fReweightFormZone;
266 
267  // Resonance decays -----------------------
268  // Intranuclear rescattering systematics. There are 2 sets of parameters:
269  // - parameters that control the total rescattering probability, P(total)
270  // - parameters that control the fraction of each process (`fate'), given a total rescat. prob., P(fate|total)
271  // These parameters are considered separately for pions and nucleons.
272  // -----------------------
273  // mean free path for pions
274  shiftlabels["ReweightMFP_pi"] = rwgt::fReweightMFP_pi;
275  // mean free path for nucleons
276  shiftlabels["ReweightMFP_N"] = rwgt::fReweightMFP_N;
277  // charge exchange probability for pions, for given total rescattering probability
278  shiftlabels["ReweightFrCEx_pi"] = rwgt::fReweightFrCEx_pi;
279  // elastic probability for pions, for given total rescattering probability
280  shiftlabels["ReweightFrElas_pi"] = rwgt::fReweightFrElas_pi;
281  // inelastic probability for pions, for given total rescattering probability`
282  shiftlabels["ReweightFrInel_pi"] = rwgt::fReweightFrInel_pi;
283  // absorption probability for pions, for given total rescattering probability
284  shiftlabels["ReweightFrAbs_pi"] = rwgt::fReweightFrAbs_pi;
285  // pion production probability for pions, for given total rescattering probability
286  shiftlabels["ReweightFrPiProd_pi"] = rwgt::fReweightFrPiProd_pi;
287  // charge exchange probability for nucleons, for given total rescattering probability
288  shiftlabels["ReweightFrCEx_N"] = rwgt::fReweightFrCEx_N;
289  // elastic probability for nucleons, for given total rescattering probability
290  shiftlabels["ReweightFrElas_N"] = rwgt::fReweightFrElas_N;
291  // inelastic probability for nucleons, for given total rescattering probability
292  shiftlabels["ReweightFrInel_N"] = rwgt::fReweightFrInel_N;
293  // absorption probability for nucleons, for given total rescattering probability
294  shiftlabels["ReweightFrAbs_N"] = rwgt::fReweightFrAbs_N;
295  // pion production probability for nucleons, for given total rescattering probability
296  shiftlabels["ReweightFrPiProd_N"] = rwgt::fReweightFrPiProd_N;
297  shiftlabels["ReweightCCQEPauliSupViaKF"] = rwgt::fReweightCCQEPauliSupViaKF;
298  shiftlabels["ReweightCCQEMomDistroFGtoSF"] = rwgt::fReweightCCQEMomDistroFGtoSF;
299  // Resonance -> X + gamma branching ratio, eg Delta+(1232) -> p gamma
300  shiftlabels["ReweightBR1gamma"] = rwgt::fReweightBR1gamma;
301  // Resonance -> X + eta branching ratio, eg N+(1440) -> p eta
302  shiftlabels["ReweightBR1eta"] = rwgt::fReweightBR1eta;
303  // distort pi angular distribution in Delta -> N + pi
304  shiftlabels["ReweightTheta_Delta2Npi"] = rwgt::fReweightTheta_Delta2Npi;
305 
306  // Nuclear model -----------------------
307  // shiftlabels["ReweightNC"] = rwgt::fReweightNC;
308 
309  return shiftlabels;
310 
311 }
312 
313 std::map<std::string, const ISyst*> GetXSecShiftLabels() {
314 
315  std::map<std::string, const ISyst*> shiftlabels;
316 
317  // Get cross-section systematics
318  std::vector<const ISyst*> AllSyst= getAllXsecSysts_2018();
319 
320  shiftlabels["PD3_MAQAGenieReducedSyst2018"] = AllSyst.at(0);
321  shiftlabels["PD3_RPACCQEEnhSyst2018"] = AllSyst.at(1);
322  shiftlabels["PD3_RPACCQESuppSyst2018"] = AllSyst.at(2);
323  shiftlabels["PD3_RPARESSyst2018"] = AllSyst.at(3);
324  shiftlabels["PD3_MECEShapeSyst2018Nu"] = AllSyst.at(4);
325  // shiftlabels["PD3_MECq0ShapeSyst2018"] = AllSyst.at(4);
326  shiftlabels["PD3_MECEShapeSyst2018AntiNu"] = AllSyst.at(5);
327  shiftlabels["PD3_MECEnuShapeSyst2018Nu"] = AllSyst.at(6);
328  // shiftlabels["PD3_MECEnuShapeSyst2018"] = AllSyst.at(6);
329  shiftlabels["PD3_MECEnuShapeSyst2018AntiNu"] = AllSyst.at(7);
330  shiftlabels["PD3_MECInitStateNPFracSyst2018Nu"] = AllSyst.at(8);
331  shiftlabels["PD3_MECInitStateNPFracSyst2018AntiNu"] = AllSyst.at(9);
332  shiftlabels["PD3_DISvpCC0pi"] = AllSyst.at(10);
333  shiftlabels["PD3_DISvpCC1pi"] = AllSyst.at(11);
334  shiftlabels["PD3_DISvpCC2pi"] = AllSyst.at(12);
335  shiftlabels["PD3_DISvpCC3pi"] = AllSyst.at(13);
336  shiftlabels["PD3_DISvpNC0pi"] = AllSyst.at(14);
337  shiftlabels["PD3_DISvpNC1pi"] = AllSyst.at(15);
338  shiftlabels["PD3_DISvpNC2pi"] = AllSyst.at(16);
339  shiftlabels["PD3_DISvpNC3pi"] = AllSyst.at(17);
340  shiftlabels["PD3_DISvnCC0pi"] = AllSyst.at(18);
341  shiftlabels["PD3_DISvnCC1pi"] = AllSyst.at(19);
342  shiftlabels["PD3_DISvnCC2pi"] = AllSyst.at(20);
343  shiftlabels["PD3_DISvnCC3pi"] = AllSyst.at(21);
344  shiftlabels["PD3_DISvnNC0pi"] = AllSyst.at(22);
345  shiftlabels["PD3_DISvnNC1pi"] = AllSyst.at(23);
346  shiftlabels["PD3_DISvnNC2pi"] = AllSyst.at(24);
347  shiftlabels["PD3_DISvnNC3pi"] = AllSyst.at(25);
348  shiftlabels["PD3_DISvbarpCC0pi"] = AllSyst.at(26);
349  shiftlabels["PD3_DISvbarpCC1pi"] = AllSyst.at(27);
350  shiftlabels["PD3_DISvbarpCC2pi"] = AllSyst.at(28);
351  shiftlabels["PD3_DISvbarpCC3pi"] = AllSyst.at(29);
352  shiftlabels["PD3_DISvbarpNC0pi"] = AllSyst.at(30);
353  shiftlabels["PD3_DISvbarpNC1pi"] = AllSyst.at(31);
354  shiftlabels["PD3_DISvbarpNC2pi"] = AllSyst.at(32);
355  shiftlabels["PD3_DISvbarpNC3pi"] = AllSyst.at(33);
356  shiftlabels["PD3_DISvbarnCC0pi"] = AllSyst.at(34);
357  shiftlabels["PD3_DISvbarnCC1pi"] = AllSyst.at(35);
358  shiftlabels["PD3_DISvbarnCC2pi"] = AllSyst.at(36);
359  shiftlabels["PD3_DISvbarnCC3pi"] = AllSyst.at(37);
360  shiftlabels["PD3_DISvbarnNC0pi"] = AllSyst.at(38);
361  shiftlabels["PD3_DISvbarnNC1pi"] = AllSyst.at(39);
362  shiftlabels["PD3_DISvbarnNC2pi"] = AllSyst.at(40);
363  shiftlabels["PD3_DISvbarnNC3pi"] = AllSyst.at(41);
364  shiftlabels["PD3_RadCorrNue"] = AllSyst.at(42);
365  shiftlabels["PD3_RadCorrNuebar"] = AllSyst.at(43);
366  shiftlabels["PD3_k2ndClassCurr"] = AllSyst.at(44);
367 
368  return shiftlabels;
369 
370 }
Cuts and Vars for the 2020 FD DiF Study.
Definition: vars.h:6
std::map< std::string, rwgt::ReweightLabel_t > GetGENIEShiftLabels()
Get GENIE systematics labels.
std::vector< const ISyst * > getAllXsecSysts_2018()
Get master XSec syst list for 2018 analyses.
const Var kPPFXFluxCVWgt
Definition: PPFXWeights.h:16
std::unique_ptr< IPrediction > Generate(Loaders &loaders, const SystShifts &shiftMC=kNoShift) const override
std::unique_ptr< IPrediction > Generate(Loaders &loaders, const SystShifts &shiftMC=kNoShift) const override
Simple record of shifts applied to systematic parameters.
Definition: SystShifts.h:20
const Cut kNumuCutND2018
Definition: NumuCuts2018.h:41
Collection of SpectrumLoaders for many configurations.
Definition: Loaders.h:23
void SaveMaps(TDirectory *out, std::map< std::string, IDecomp * > decomps_nominal, std::map< std::string, std::map< std::string, std::map< int, IDecomp * > > > decomps_shifted, std::map< std::string, PredictionNoExtrap * > predsNE_nominal, std::map< std::string, std::map< std::string, std::map< int, PredictionNoExtrap * > > > predsNE_shifted, std::map< std::string, PredictionSterile * > predsSt_nominal, std::map< std::string, std::map< std::string, std::map< int, PredictionSterile * > > > predsSt_shifted)
Save all of the objects in the input maps to the out directory/file.
Definition: PPFXHelper.h:1077
std::pair< Spectrum *, CheatDecomp * > make_pair(SpectrumLoaderBase &loader_data, SpectrumLoaderBase &loader_mc, HistAxis *axis, Cut *cut, const SystShifts &shift, const Var &wei)
Definition: DataMCLoad.C:336
Generates extrapolated NC predictions using ProportionalDecomp.
const Cut kNus18FD
Definition: NusCuts18.h:100
const HistAxis kNus18AxisE("Energy Deposited in Scintillator (GeV)", kNus18EnergyBinning, kNus18Energy)
Axes used in Nus18 analysis by nus group.
Definition: HistAxes.h:16
void Go()
Call Go() on all the loaders.
Definition: Loaders.cxx:162
void Nus18SystsGENIELoad(TString opt)
void SetSpillCut(const SpillCut &cut)
Definition: Loaders.cxx:121
std::map< std::string, const ISyst * > GetXSecShiftLabels()
Get cross-section systematics labels.
_Cut< caf::SRProxy > Cut
Representation of a cut (selection) to be applied to a caf::StandardRecord object.
Definition: Cut.h:96
const Cut kNus18ND
Full Nus18 ND analysis selection.
Definition: NusCuts18.h:137
Take the output of an extrapolation and oscillate it as required.
double sigma(TH1F *hist, double percentile)
const SystShifts kNoShift
Definition: SystShifts.cxx:21
OStream cout
Definition: OStream.cxx:6
const Var kXSecCVWgt2018
Definition: XsecTunes.h:49
std::vector< Loaders * > loaders
Definition: syst_header.h:386
bool systematics
Definition: fnexvscaf.C:31
A prediction object compatible with sterile oscillations.
const HistAxis kNus18BinsNumuCCAxis("Reconstructed Neutrino Energy (GeV)", kNus18EnergyBinning, kCCE)
Definition: HistAxes.h:17
std::unique_ptr< IPrediction > Generate(Loaders &loaders, const SystShifts &shiftMC=kNoShift) const override
Take the output of an extrapolation and oscillate it as required.
const SpillCut kStandardSpillCuts
Apply this unless you&#39;re doing something special.
Definition: SpillCuts.h:49
For nominal spectra and reweighting systs (xsec/flux)
Definition: Prod4Loaders.h:96
Generates Near Detector predictions.
const NOvARwgtSyst * GetGenieKnobSyst(rwgt::ReweightLabel_t knobIdx, std::string altName, std::string altLabel)
Convenience function to get a GENIE knob syst. (Allows using the GENIE knob name & description as the...
Definition: XSecSysts.cxx:119
ECAFType
Definition: Loaders.h:19
enum BeamMode string