12 #include "TDirectory.h" 13 #include "TObjString.h" 21 template<> std::unique_ptr<ModularExtrapComponent>
24 TObjString* ptag = (TObjString*)dir->Get((
name+
"/type").c_str());
27 const TString
tag = ptag->GetString();
30 if(tag ==
"NoReweight")
32 if(tag ==
"TruthReweight")
34 if(tag ==
"RecoReweight")
37 std::cerr <<
"Unknown Component Extrapolation type '" 52 std::cerr <<
"\nWARNING: There were attempted divisions by empty bins (for which a fallback to no reweighting was used)" 53 <<
"\n during extrapolation in the following bins (check your MC stats):" 56 for (
const auto & tuple : this->
fBins)
58 std::cerr <<
"\t Channel: " << std::get<0>(tuple)
59 <<
"\t\t Location: " << std::get<1>(tuple)
60 <<
"\t\t Bin Index: " << std::get<2>(tuple)
93 assert( 0 &&
"Bad DecompResult" );
110 assert( 0 &&
"Bad DecompResult" );
125 else assert( 0 &&
"Bad DecompResult String" );
137 const Eigen::ArrayXd numa = num.
GetEigen(1e20);
138 const Eigen::ArrayXd denoma = denom.
GetEigen(1e20);
139 const Eigen::ArrayXd multa = mult.
GetEigen(1e20);
141 Eigen::ArrayXd ratioa = numa;
144 assert( (numa.size() == denoma.size()) &&
"Bin Mismatch" );
145 assert( (numa.size() == multa.size()) &&
"Bin Mismatch" );
148 for (
int bin = 0;
bin < numa.size(); ++
bin)
150 if ( denoma[
bin] != 0 ){
156 counter.
fBins.insert(std::make_tuple(component, location,
bin));
176 : fRecoFD( loader, axis, fdcut && flavors, shiftMC, weight )
189 TDirectory*
tmp = gDirectory;
191 dir = dir->mkdir(name.c_str());
194 TObjString(
"NoReweight").Write(
"type");
203 std::unique_ptr<NoReweight>
206 dir = dir->GetDirectory(name.c_str());
213 return std::unique_ptr<NoReweight>(
new NoReweight(*s));
234 : fRecoToTrueND(ndloader, axisND, ndcut && ndflavor, shiftMC, weight),
235 fTrueToRecoFD(fdloader, axisFD, fdcut && fdflavors, shiftMC, weight),
236 fDecomp(decomposition),
283 TDirectory*
tmp = gDirectory;
285 dir = dir->mkdir(name.c_str());
288 TObjString(
"TruthReweight").Write(
"type");
302 std::unique_ptr<TruthReweight>
305 dir = dir->GetDirectory(name.c_str());
308 TObjString* dr = (TObjString*)dir->Get(
"DecompRes");
310 TObjString*
label = (TObjString*)dir->Get(
"Label");
311 TObjString*
latex = (TObjString*)dir->Get(
"Latex");
320 label->GetString().Data(),
321 latex->GetString().Data()
331 return std::unique_ptr<TruthReweight>(
ret);
349 const Cut& fdflavors,
353 : fRecoND(ndloader, axis, ndcut && ndflavor, shiftMC, weight),
354 fTrueToRecoFD(fdloader, axis, fdcut && fdflavors, shiftMC, weight),
396 TDirectory*
tmp = gDirectory;
398 dir = dir->mkdir(name.c_str());
401 TObjString(
"RecoReweight").Write(
"type");
415 std::unique_ptr<RecoReweight>
418 dir = dir->GetDirectory(name.c_str());
421 assert(dir->GetDirectory(
"RecoND"));
422 assert(dir->GetDirectory(
"TrueToRecoFD"));
423 assert(dir->GetDirectory(
"Decomp"));
424 TObjString* dr = (TObjString*)dir->Get(
"DecompRes");
426 TObjString*
label = (TObjString*)dir->Get(
"Label");
427 TObjString*
latex = (TObjString*)dir->Get(
"Latex");
436 label->GetString().Data(),
437 latex->GetString().Data()
445 return std::unique_ptr<RecoReweight>(
ret);
static std::unique_ptr< OscillatableSpectrum > LoadFrom(TDirectory *dir, const std::string &name)
const std::vector< Binning > & GetBinnings() const
static std::unique_ptr< TruthReweight > LoadFrom(TDirectory *dir, const std::string &name)
std::unique_ptr< ModularExtrapComponent > LoadFrom< ModularExtrapComponent >(TDirectory *dir, const std::string &label)
Cuts and Vars for the 2020 FD DiF Study.
virtual Spectrum AntiNueComponent() const =0
OscillatableSpectrum fTrueToRecoFD
virtual Spectrum NumuComponent() const =0
Simple record of shifts applied to systematic parameters.
virtual Spectrum NCAntiComponent() const =0
const Eigen::ArrayXd & GetEigen() const
NB these don't have POT scaling. For expert high performance ops only!
OscillatableSpectrum fRecoToTrueND
virtual Spectrum NCComponent() const =0
const DecompResult fDecompRes
void ReweightToRecoSpectrum(const Spectrum &target)
Recale bins so that Unweighted will return target.
OscillatableSpectrum Eval() const override
Core extrapolation math.
Representation of a spectrum in any variable, with associated POT.
Spectrum Unoscillated() const
void SaveTo(TDirectory *dir, const std::string &name) const override
OscillatableSpectrum fTrueToRecoFD
NoReweight(SpectrumLoaderBase &loader, const HistAxis &axis, const Cut &fdcut, const SystShifts &shiftMC, const Var &weight, const Cut &flavors, SpectrumLoaderBase &extraloaderswap=kNullLoader, SpectrumLoaderBase &extraloadertau=kNullLoader)
void SaveTo(TDirectory *dir, const std::string &name) const override
const Var kTrueE([](const caf::SRProxy *sr){assert(sr->mc.nnu==1);return sr->mc.nu[0].E;})
static std::unique_ptr< Spectrum > LoadFrom(TDirectory *dir, const std::string &name)
Spectrum TrueEnergy() const
std::vector< std::string > flavors
RecoReweight(SpectrumLoaderBase &ndloader, const HistAxis &axis, const Cut &fdcut, const SystShifts &shiftMC, const Var &weight, std::string label, std::string latex, const Cut &ndcut, const IDecomp &decomposition, const DecompResult dr, const Cut &ndflavor, SpectrumLoaderBase &fdloader, const Cut &fdflavors, SpectrumLoaderBase &extrafdloaderswap=kNullLoader, SpectrumLoaderBase &extrafdloadertau=kNullLoader)
Extrapolates component using truth-over-truth method.
DecompResult
Simple way to remember what to ask the decomposition for.
void SaveTo(TDirectory *dir, const std::string &name) const
static std::unique_ptr< NoReweight > LoadFrom(TDirectory *dir, const std::string &name)
virtual Spectrum AntiNumuComponent() const =0
Represent the ratio between two spectra.
virtual void AddReweightableSpectrum(ReweightableSpectrum &spect, const Var &xvar, const Var &yvar, const Cut &cut, const SystShifts &shift, const Var &wei)
For use by the constructors of ReweightableSpectrum subclasses.
Base class for the various types of spectrum loader.
OscillatableSpectrum fRecoFD
OscillatableSpectrum Eval() const override
Core extrapolation math.
virtual Spectrum NCTotalComponent() const
void SaveTo(TDirectory *dir, const std::string &name) const override
Standard interface to all decomposition techniques.
assert(nhit_max >=nhit_nbins)
virtual void SaveTo(TDirectory *dir, const std::string &name) const =0
void ReweightToTrueSpectrum(const Spectrum &target)
Rescale bins so that WeightingVariable will return target.
TruthReweight(SpectrumLoaderBase &ndloader, const HistAxis &axisFD, const HistAxis &axisND, const Cut &fdcut, const SystShifts &shiftMC, const Var &weight, std::string label, std::string latex, const Cut &ndcut, const IDecomp &decomposition, const DecompResult dr, const Cut &ndflavor, SpectrumLoaderBase &fdloader, const Cut &fdflavors)
const std::vector< std::string > & GetLabels() const
std::unique_ptr< IDecomp > LoadFrom< IDecomp >(TDirectory *dir, const std::string &label)
Spectrum with true energy information, allowing it to be oscillated
const DecompResult fDecompRes
OscillatableSpectrum Eval() const override
Core extrapolation math.
void SaveTo(TDirectory *dir, const std::string &name) const
virtual Spectrum NueComponent() const =0
static std::unique_ptr< RecoReweight > LoadFrom(TDirectory *dir, const std::string &name)
Extrapolates using reco-over-reco method.