MECTuningUtils.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "CAFAna/Core/Loaders.h"
4 #include <TObjString.h>
9 
10 namespace ana
11 {
12 //-------------------------------------------------------------------------------------//
13 // cut used for official tune, not the same as official kNumu2020ND
14 // the fit was made earlier.
15 
17  [](const caf::SRProxy* sr)
18  {
19  return (sr->sel.remid.pid > 0.7 && sr->sel.cvnloosepreselptp.numuid > 0.82);
20  }
21  );
23 //-----------------------------------------------------------------------------------------//
24 
25  const Var GetWeightFromShifts( const SystShifts& sys_shifts )
26  {
27  const Var kWeightFromShifts( [ sys_shifts ]( const caf::SRProxy *sr )
28  {
29  caf::SRProxy* face_palm = const_cast<caf::SRProxy*>( sr );
30  double weight = 1.0;
31  sys_shifts.Shift( face_palm, weight );
32  return weight;
33  });
34  return kWeightFromShifts;
35  }
36 
37  // this thing basically needs to be an IPrediction that gives
38  // the correct components of the spectrum.
39  // or at least have a PredictComponent() that can do
40  // (Flavors::kAll, Current::kBoth, Sign::kBoth)
41  // when asked, since that's the one that you need
42  // to get PredictSyst() to work.
44  {
45  public:
47  const HistAxis& axis,
48  const Cut& cut,
49  const SystShifts& shift = kNoShift,
50  const Var& wei = kUnweighted)
51  : fSpec(loaders.GetLoader(caf::kNEARDET, Loaders::kMC),
52  axis, cut, shift, wei)
53  {};
54 
56  : fSpec(spec)
57  {};
58 
59  Spectrum Predict(osc::IOscCalc* calc) const override;
60 
62  Flavors::Flavors_t flav,
64  Sign::Sign_t sign) const override;
65 
66  void SaveTo(TDirectory* dir, const std::string& name) const override;
67  static std::unique_ptr<TrivialPrediction> LoadFrom(TDirectory* dir, const std::string& name);
68 
69 
70  private:
72  };
74  {
75  return fSpec;
76  }
78  Flavors::Flavors_t flav,
80  Sign::Sign_t sign) const
81  {
82  // basically the whole prediction is regarded as being one component
83  if (flav == Flavors::kNuMuToNuMu && curr == Current::kCC && sign == Sign::kBoth)
84  {
85  return fSpec;
86  }
87  else
88  {
89  auto spec = Spectrum(fSpec);
90  spec.Clear();
91  return std::move(spec);
92  }
93  }
94  void TrivialPrediction::SaveTo(TDirectory* dir, const std::string& name) const
95  {
96  TDirectory* tmp = gDirectory;
97 
98  dir = dir->mkdir(name.c_str()); // switch to subdir
99  dir->cd();
100 
101  TObjString("TrivialPrediction").Write("type", TObject::kOverwrite);
102  fSpec.SaveTo(dir, "spec");
103 
104  dir->Write();
105  delete dir;
106 
107  tmp->cd();
108  }
109  std::unique_ptr<TrivialPrediction> TrivialPrediction::LoadFrom(TDirectory* dir, const std::string& name)
110  {
111  dir = dir->GetDirectory(name.c_str()); // switch to subdir
112  assert(dir);
113 
114  return std::make_unique<TrivialPrediction>(*Spectrum::LoadFrom(dir, "spec"));
115  }
116 
117  //----------------------------------------------------------------------
118 
120  {
121  public:
122  NDPredGenerator(const HistAxis axis, const Cut cut, const Var wei = kUnweighted )
123  : fAxis(axis), fCut(cut), fWei(wei)
124  {};
125 
126  virtual ~NDPredGenerator() {};
127 
128  std::unique_ptr<IPrediction> Generate(
129  Loaders& loaders,
130  const SystShifts& shiftMC = kNoShift ) const override;
131 
132  private:
134  const Cut fCut;
135  const Var fWei;
136  };
137  std::unique_ptr<IPrediction> NDPredGenerator::Generate(
138  Loaders& loaders,
139  const SystShifts& shiftMC ) const
140  {
141  return std::unique_ptr<IPrediction>( new TrivialPrediction(
142  loaders, fAxis, fCut, shiftMC, fWei ) );
143  }
144 
145 
146 // Derived SingleSampleExpt to blow up chisq and let fitter ignore more penalties
148  {
149  public:
151  const Spectrum& data,
152  double scaleFactor = 1)
153  : SingleSampleExperiment(pred, data), fScaleFactor(scaleFactor)
154  {}
155 
157  const SystShifts& syst = SystShifts::Nominal()) const override
158  {
159  SingleSampleExperiment expt(fMC,fData);
160  return fScaleFactor * expt.ChiSq(osc, syst);
161  }
162 
163  private:
164  double fScaleFactor;
165  };
166 
167 //================================================================================
168 // Q0Q3 bins utilities
169 //================================================================================
170  class IRescaledSigmaSyst : public ISyst
171  {
172  public:
173  IRescaledSigmaSyst(const std::string & shortName, const std::string & latexName, double sigmaScale=1.0)
174  : ISyst(shortName, latexName), fSigmaScale(sigmaScale) {};
175  double GetSigmaScale() const { return fSigmaScale; };
176  void SetSigmaScale(double sc) { fSigmaScale = sc; };
177  protected:
178  double fSigmaScale;
179  };
180 
182  {
183  public:
184  CompNormSyst(const Cut & selCut, double sigmaScale=1.0)
185  : fID(sInstanceCount++),
186  IRescaledSigmaSyst("CompNormShift_" + std::to_string(sInstanceCount), "Component Normalization Shift " + std::to_string(sInstanceCount), sigmaScale),
187  fSelCut(selCut)
188  {}
189  void Shift(double sigma, caf::SRProxy* sr, double& weight) const override;
190 
191  private:
192  const Cut fSelCut;
193  unsigned int fID;
194 
195  static unsigned int sInstanceCount;
196  };
197  unsigned int CompNormSyst::sInstanceCount = 0;
198  void CompNormSyst::Shift(double sigma, caf::SRProxy* sr, double& weight) const
199  {
200  if (!fSelCut(sr))
201  return;
202 
203  double wgt = 1 + fSigmaScale * sigma;
204  if (wgt < 0)
205  wgt = 0;
206  weight *= wgt;
207  }
208 
209 
210 // Cut for binned fit
211  const Cut GetCutIsFitMEC( const bool isRHC )
212  {
213  const Cut kIsFitMEC( [ isRHC ]( const caf::SRProxy *sr )
214  {
215  if ( !kIsDytmanMEC( sr ) || !sr->mc.nu[0].iscc ) return false;
216  if ( !isRHC && sr->mc.nu[0].pdg == 14 ) return true;
217  else if ( isRHC && sr->mc.nu[0].pdg == -14 ) return true;
218  else return false;
219  });
220  return kIsFitMEC;
221  }
222 
223  struct Q3Q0Bin
224  {
225  float loQ3;
226  float hiQ3;
227  float loQ0;
228  float hiQ0;
229  };
230 
231  Cut Q3Q0CutFactory( float loQ3, float hiQ3, float loQ0, float hiQ0 )
232  {
233  return std::move( Cut ( [ loQ3, hiQ3, loQ0, hiQ0 ]( const caf::SRProxy * sr )
234  {
235  double q3 = kTrueQ3( sr );
236  double q0 = kTrueQ0( sr );
237  return q3 > loQ3 && q3 < hiQ3 && q0 > loQ0 && q0 < hiQ0;
238  }
239  ));
240  }
241 
242 //===============================================================================================================
243 // Valencia MEC 2D Gaussian Enhancement
244 //===============================================================================================================
246 
247 double CalcMECGaussEnh( const double q0, const double q3, const MECGaussEnhParam shift_param, const double shift_sigma )
248 {
249  double norm = 10.0;
250  double mean_q0 = 0.25;
251  double mean_q3 = 0.50;
252  double sigma_q0 = 0.07;
253  double sigma_q3 = 0.13;
254  double corr = 0.8;
255 
256  switch( shift_param )
257  {
258  case kGauss2DNorm :
259  norm += shift_sigma * 0.5;
260  if ( norm < 0 ) norm = 0.0;
261  break;
262  case kGauss2DMeanQ0 :
263  mean_q0 += shift_sigma * 0.025;
264  break;
265  case kGauss2DMeanQ3 :
266  mean_q3 += shift_sigma * 0.05;
267  break;
268  case kGauss2DSigmaQ0 :
269  sigma_q0 += shift_sigma * 0.015;
270  if ( sigma_q0 < 0.01 ) sigma_q0 = 0.01;
271  break;
272  case kGauss2DSigmaQ3 :
273  sigma_q3 += shift_sigma * 0.02;
274  if ( sigma_q3 < 0.01 ) sigma_q3 = 0.01;
275  break;
276  case kGauss2DCorr :
277  corr += shift_sigma * 0.2;
278  if ( corr < -0.99 ) corr = -0.99;
279  else if ( corr > 0.99 ) corr = 0.99;
280  }
281 // reminder: http://mathworld.wolfram.com/BivariateNormalDistribution.html
282  double z = pow( ( q0 - mean_q0 ) / sigma_q0, 2 ) + pow( ( q3 - mean_q3 ) / sigma_q3, 2 )
283  - 2 * corr * ( q0 - mean_q0 ) * ( q3 - mean_q3 ) / ( sigma_q0 * sigma_q3 );
284 
285  return 1.0 + norm * exp( -0.5 * z / ( 1 - corr * corr ) );
286 }
287 
288 const Var kMECGaussEnh( []( const caf::SRProxy* sr )
289 {
290  if ( !kIsNumuCC( sr ) || sr->mc.nu[0].mode != caf::kMEC ) return 1.0; // This will work for Empirical MEC. Will it also work for Valencia MEC?
291  double q0 = kTrueQ0( sr );
292  double q3 = kTrueQ3( sr );
293  return CalcMECGaussEnh( q0, q3, kGauss2DNorm, 0 ); // Shift = 0 gives nominal suppression
294 });
295 
296 class MECGaussEnhSyst : public ISyst
297 {
298  public :
299  MECGaussEnhSyst( const MECGaussEnhParam& shift_param, const std::string& shift_param_name )
300  : ISyst( "MECGaussEnhSyst" + shift_param_name, "MEC 2D Gauss Syst " + shift_param_name ),
301  fShiftParam( shift_param )
302  {}
303 
304  void Shift( double sigma, caf::SRProxy* sr, double& weight ) const override
305  {
306  //if ( !kIsNumuCC || !kIsDytmanMEC ) return;
307  if ( !kIsNumuCC( sr ) || sr->mc.nu[0].mode != caf::kMEC ) return;
308  // This will work for Empirical MEC. Will it also work for Valencia MEC?
309 
310  double q0 = kTrueQ0( sr );
311  double q3 = kTrueQ3( sr );
312 
313  double wgt_nominal = CalcMECGaussEnh( q0, q3, fShiftParam, 0 );
314  double wgt_shift = CalcMECGaussEnh( q0, q3, fShiftParam, sigma );
315 
316  weight *= wgt_shift / wgt_nominal;
317  }
318 
319  private:
321 };
322 
323 //===============================================================================================================
324 // Valencia MEC double 2D Gaussian Enhancement
325 //===============================================================================================================
326 
327 //===============================================================================================================
328 // MINOS Resonance Suppression
329 //===============================================================================================================
330 
332 
333 double CalcMinosResSupp( const double Q2, const MinosResSuppParam shift_param, const double shift_sigma )
334 {
335  double A = 1.010;
336  double Q0 = 0.156;
337 
338  switch( shift_param )
339  {
340  case kMinosResSuppNorm :
341  A += shift_sigma * 0.1;
342  if ( A < 0 ) A = 0.0;
343  break;
344  case kMinosResSuppQ0 :
345  Q0 += shift_sigma * 0.03;
346  if ( Q0 < 0.01 ) Q0 = 0.01;
347  }
348 
349  double supp = A / ( 1 + exp( 1 - sqrt( Q2 ) / Q0 ) );
350  if ( supp > 1 ) supp = 1.0;
351 
352  return supp;
353 }
354 
355 const Var kMinosResSupp( []( const caf::SRProxy* sr )
356 {
357  if ( !kIsNumuCC( sr ) || sr->mc.nu[0].mode != kIsRes( sr ) || sr->mc.nu[0].tgtA == 1 ) return 1.0; // Exclude hydrogen
358  double Q2 = kTrueQ2( sr );
359  return CalcMinosResSupp( Q2, kMinosResSuppNorm, 0 ); // Shift = 0 gives nominal suppression
360 });
361 
362 class MinosResSuppSyst : public ISyst
363 {
364  public :
365  MinosResSuppSyst( const MinosResSuppParam& shift_param, const std::string& shift_param_name )
366  : ISyst( "MinosResSuppSyst" + shift_param_name, "MINOS RES Supp Syst " + shift_param_name ),
367  fShiftParam( shift_param )
368  {}
369 
370  void Shift( double sigma, caf::SRProxy* sr, double& weight ) const override
371  {
372  if ( !kIsNumuCC( sr ) || sr->mc.nu[0].mode != kIsRes( sr ) || sr->mc.nu[0].tgtA == 1 ) return; // Exclude hydrogen
373 
374  double Q2 = kTrueQ2( sr );
375 
376  double wgt_nominal = CalcMinosResSupp( Q2, fShiftParam, 0 );
377  double wgt_shift = CalcMinosResSupp( Q2, fShiftParam, sigma );
378 
379  weight *= wgt_shift / wgt_nominal;
380  }
381 
382  private:
384 };
385 
386 //=============================================================================
387 // Extra Weight
388 //=============================================================================
389 
390 const Var kWeightPionDeuteriumTune( []( const caf::SRProxy* sr )
391 {
392  double weight = 1.0;
393 
394  if ( kIsNumuCC( sr ) && kIsRes( sr ) )
395  {
396  if ( sr->mc.nu[0].rwgt.genie.size() <= rwgt::fReweightMaCCRES - 1 )
397  {
398  if ( sr->mc.nu[0].isvtxcont )
399  throw std::runtime_error( "kWeightPionDeuteriumTune: Cannot do MA CCRES rescaling without GENIE reweights available." );
400  else
401  return 1.0;
402  }
403  // GENIE single pion production deuterium fit Eur. Phys. J. C (2016) 76: 474
404  // Scale down MA CCRES from GENIE default 1.12 GeV (+/-1 sigma = +/-20%) to Deuterium fit 0.94+/-0.05 GeV
405  const double correctionInSigma = ( 1.12 - 0.94 ) / 0.2;
406  weight *= 1. + correctionInSigma * ( sr->mc.nu[0].rwgt.genie[rwgt::fReweightMaCCRES].minus1sigma - 1. );
407 
408  // Apply 1.15 normalization correction from Deuterium fit
409  weight *= 1.15;
410  }
411  else if ( kIsNumuCC( sr ) && kIsDIS( sr ) && kTrueW( sr ) < 1.7 )
412  {
413  // Apply non-RES 1pi normalization from deuterium fit
414  if ( sr->mc.nu[0].npiminus + sr->mc.nu[0].npiplus + sr->mc.nu[0].npizero == 1 )
415  {
416  weight *= 0.43;
417  }
418  }
419  return weight;
420 });
421 
422 }
423 
caf::Proxy< caf::SRCVNResult > cvnloosepreselptp
Definition: SRProxy.h:1254
const MinosResSuppParam fShiftParam
const XML_Char * name
Definition: expat.h:151
const Cut kIsNumuCC(CCFlavSel(14, 14))
Select CC .
MinosResSuppSyst(const MinosResSuppParam &shift_param, const std::string &shift_param_name)
TrivialPrediction(const Spectrum &spec)
double corr
Cuts and Vars for the 2020 FD DiF Study.
Definition: vars.h:6
double Q2(const Interaction *const i)
Definition: KineUtils.cxx:991
virtual double ChiSq(osc::IOscCalcAdjustable *osc, const SystShifts &syst=SystShifts::Nominal()) const override
const Var weight
const HistAxis fAxis
Simple record of shifts applied to systematic parameters.
Definition: SystShifts.h:20
double ChiSq(osc::IOscCalcAdjustable *osc, const SystShifts &syst=SystShifts::Nominal()) const override
const Cut kIsRes
Definition: TruthCuts.cxx:111
Proxy for caf::StandardRecord.
Definition: SRProxy.h:2126
Collection of SpectrumLoaders for many configurations.
Definition: Loaders.h:23
T sqrt(T number)
Definition: d0nt_math.hpp:156
General interface to oscillation calculators.
Definition: StanTypedefs.h:23
caf::Proxy< std::vector< caf::SRNeutrino > > nu
Definition: SRProxy.h:618
constexpr T pow(T x)
Definition: pow.h:72
const Color_t kMC
double sigma_q3
caf::Proxy< float > pid
Definition: SRProxy.h:1136
std::vector< double > Spectrum
Definition: Constants.h:743
const Cut kIsDIS
Definition: TruthCuts.cxx:118
Float_t tmp
Definition: plot.C:36
const Var kTrueQ0
Definition: TruthVars.h:32
const Var kMECGaussEnh([](const caf::SRProxy *sr){if(!kIsNumuCC(sr)||sr->mc.nu[0].mode!=caf::kMEC) return 1.0;double q0=kTrueQ0(sr);double q3=kTrueQ3(sr);return CalcMECGaussEnh(q0, q3, kGauss2DNorm, 0);})
static SystShifts Nominal()
Definition: SystShifts.h:34
osc::OscCalcDumb calc
Encapsulate code to systematically shift a caf::SRProxy.
Definition: ISyst.h:14
const Var kMinosResSupp([](const caf::SRProxy *sr){if(!kIsNumuCC(sr)||sr->mc.nu[0].mode!=kIsRes(sr)||sr->mc.nu[0].tgtA==1) return 1.0;double Q2=kTrueQ2(sr);return CalcMinosResSupp(Q2, kMinosResSuppNorm, 0);})
const Var kTrueQ2
Definition: TruthVars.h:27
Representation of a spectrum in any variable, with associated POT.
Definition: Spectrum.h:40
MECGaussEnhParam
Spectrum PredictComponent(osc::IOscCalc *calc, Flavors::Flavors_t flav, Current::Current_t curr, Sign::Sign_t sign) const override
const XML_Char const XML_Char * data
Definition: expat.h:268
const Cut kIsDytmanMEC
Definition: TruthCuts.cxx:187
double CalcMECGaussEnh(const double q0, const double q3, const MECGaussEnhParam shift_param, const double shift_sigma)
void SaveTo(TDirectory *dir, const std::string &name) const override
Charged-current interactions.
Definition: IPrediction.h:39
Definition: Shift.h:6
expt
Definition: demo5.py:34
const Var kTrueQ3
Definition: TruthVars.h:38
double CalcMinosResSupp(const double Q2, const MinosResSuppParam shift_param, const double shift_sigma)
if(dump)
double sigma_q0
static std::unique_ptr< Spectrum > LoadFrom(TDirectory *dir, const std::string &name)
Definition: Spectrum.cxx:536
CompNormSyst(const Cut &selCut, double sigmaScale=1.0)
const Cut kNumu2020NDxsec
void Shift(double sigma, caf::SRProxy *sr, double &weight) const override
Perform the systematic shift.
Cut Q3Q0CutFactory(float loQ3, float hiQ3, float loQ0, float hiQ0)
double mean_q0
_Cut< caf::SRProxy > Cut
Representation of a cut (selection) to be applied to a caf::StandardRecord object.
Definition: Cut.h:96
unsigned int fID
Spectrum Predict(osc::IOscCalc *calc) const override
caf::StandardRecord * sr
void SaveTo(TDirectory *dir, const std::string &name) const
Definition: Spectrum.cxx:507
caf::Proxy< caf::SRRemid > remid
Definition: SRProxy.h:1269
std::unique_ptr< IPrediction > Generate(Loaders &loaders, const SystShifts &shiftMC=kNoShift) const override
double mean_q3
const ana::Var wgt
static unsigned int sInstanceCount
z
Definition: test.py:28
void SetSigmaScale(double sc)
Oscillation probability calculators.
Definition: Calcs.h:5
double sigma(TH1F *hist, double percentile)
MECGaussEnhSyst(const MECGaussEnhParam &shift_param, const std::string &shift_param_name)
const SystShifts kNoShift
Definition: SystShifts.cxx:22
(&#39; survival&#39;)
Definition: IPrediction.h:19
NDPredGenerator(const HistAxis axis, const Cut cut, const Var wei=kUnweighted)
caf::Proxy< caf::SRTruthBranch > mc
Definition: SRProxy.h:2138
const Cut cut
Definition: exporter_fd.C:30
static const double A
Definition: Units.h:82
IRescaledSigmaSyst(const std::string &shortName, const std::string &latexName, double sigmaScale=1.0)
const Var kWeightPionDeuteriumTune([](const caf::SRProxy *sr){double weight=1.0;if(kIsNumuCC(sr)&&kIsRes(sr)){if(sr->mc.nu[0].rwgt.genie.size()<=rwgt::fReweightMaCCRES-1){if(sr->mc.nu[0].isvtxcont) throw std::runtime_error("kWeightPionDeuteriumTune: Cannot do MA CCRES rescaling without GENIE reweights available.");else return 1.0;} const double correctionInSigma=(1.12-0.94)/0.2;weight *=1.+correctionInSigma *(sr->mc.nu[0].rwgt.genie[rwgt::fReweightMaCCRES].minus1sigma-1.);weight *=1.15;}else if(kIsNumuCC(sr)&&kIsDIS(sr)&&kTrueW(sr)< 1.7){if(sr->mc.nu[0].npiminus+sr->mc.nu[0].npiplus+sr->mc.nu[0].npizero==1){weight *=0.43;}}return weight;})
Float_t norm
const Cut GetCutIsFitMEC(const bool isRHC)
TDirectory * dir
Definition: macro.C:5
BigChi2SingleSampleExperiment(const IPrediction *pred, const Spectrum &data, double scaleFactor=1)
const MECGaussEnhParam fShiftParam
std::vector< Loaders * > loaders
Definition: syst_header.h:386
assert(nhit_max >=nhit_nbins)
void Shift(double sigma, caf::SRProxy *sr, double &weight) const override
Perform the systematic shift.
string shortName
THUMBNAIL BLOCK: We need to make a thumbnail for each.
Both neutrinos and antineutrinos.
Definition: IPrediction.h:52
Standard interface to all prediction techniques.
Definition: IPrediction.h:57
void Shift(double sigma, caf::SRProxy *sr, double &weight) const override
Perform the systematic shift.
const Cut kNumu2020PIDLoosePTPxsec([](const caf::SRProxy *sr){return(sr->sel.remid.pid > 0.7 &&sr->sel.cvnloosepreselptp.numuid > 0.82);})
Given loaders and an MC shift, Generate() generates an IPrediction.
caf::Proxy< caf::SRIDBranch > sel
Definition: SRProxy.h:2141
This module creates Common Analysis Files.
Definition: FileReducer.h:10
const Cut kNumuQuality
Definition: NumuCuts.h:18
double GetSigmaScale() const
static std::unique_ptr< TrivialPrediction > LoadFrom(TDirectory *dir, const std::string &name)
const Var kTrueW
Definition: TruthVars.h:22
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);})
Definition: NumuCuts2020.h:31
const Var kUnweighted
The simplest possible Var, always 1. Used as a default weight.
Definition: Var.h:96
std::string to_string(ModuleType const mt)
Definition: ModuleType.h:34
MinosResSuppParam
TrivialPrediction(Loaders &loaders, const HistAxis &axis, const Cut &cut, const SystShifts &shift=kNoShift, const Var &wei=kUnweighted)
caf::Proxy< float > numuid
Definition: SRProxy.h:907
def sign(x)
Definition: canMan.py:197
Compare a single data spectrum to the MC + cosmics expectation.
void Shift(caf::SRProxy *sr, double &weight) const
Definition: SystShifts.cxx:165
const Var GetWeightFromShifts(const SystShifts &sys_shifts)
enum BeamMode string