41inline void collectNames(
const JSONNode &
n, std::vector<std::string> &names)
43 for (
const auto &
c :
n.children()) {
48inline void stackError(
const JSONNode &
n, std::vector<double> &sumW, std::vector<double> &sumW2)
52 if (!
n.has_child(
"counts"))
53 throw "no counts given";
54 if (!
n[
"counts"].is_seq())
55 throw "counts are not in list form";
56 if (!
n.has_child(
"errors"))
57 throw "no errors given";
58 if (!
n[
"errors"].is_seq())
59 throw "errors are not in list form";
60 if (
n[
"counts"].num_children() !=
n[
"errors"].num_children()) {
61 throw "inconsistent bin numbers";
63 const size_t nbins =
n[
"counts"].num_children();
64 for (
size_t ibin = 0; ibin < nbins; ++ibin) {
65 double w =
n[
"counts"][ibin].val_float();
66 double e =
n[
"errors"][ibin].val_float();
67 if (ibin < sumW.size())
71 if (ibin < sumW2.size())
74 sumW2.push_back(
e *
e);
78std::vector<std::string> getVarnames(
const RooHistFunc *hf)
85std::unique_ptr<TH1> histFunc2TH1(
const RooHistFunc *hf)
95 for (
size_t i = 0; i < volumes.size(); ++i) {
96 hist->SetBinContent(i + 1, hist->GetBinContent(i + 1) / volumes[i]);
97 hist->SetBinError(i + 1,
sqrt(hist->GetBinContent(i + 1)));
105 for (
const auto &client :
gamma->clients()) {
106 if (client->InheritsFrom(T::Class())) {
107 return static_cast<T *
>(client);
109 T *
c = findClient<T>(client);
143 sigma->setConstant(
true);
154 TString::Format(
"RooGaussian::%s_constraint(alpha_%s,nom_alpha_%s,sigma_alpha_%s)", sysname.c_str(),
155 sysname.c_str(), sysname.c_str(), sysname.c_str())
170 if (prefix.size() > 0)
176 std::stack<std::unique_ptr<RooAbsArg>> ownedArgsStack;
182 auto getBinnedData = [&tool, &p, &varlist](std::string
const &binnedDataName) ->
RooDataHist & {
185 auto dhForImport = tool->
readBinnedData(p[
"data"], binnedDataName, varlist);
195 ownedArgsStack.push(std::make_unique<RooBinWidthFunction>(
197 TString::
Format(
"%s_binWidth", (!prefix.empty() ? prefix :
name).c_str()).Data(), *hf, true));
198 shapeElems.
add(*ownedArgsStack.top());
200 if (p.has_child(
"statError") && p[
"statError"].val_bool()) {
203 shapeElems.
add(*phf);
206 "' has 'statError' active, but no element called 'mcstat' in scope!");
210 if (p.has_child(
"normFactors")) {
211 for (
const auto &nf : p[
"normFactors"].children()) {
223 if (p.has_child(
"overallSystematics")) {
225 std::vector<double> low;
226 std::vector<double> high;
227 for (
const auto &sys : p[
"overallSystematics"].children()) {
230 :
"alpha_" + sysname);
231 RooRealVar *par = ::getNP(tool, parname.c_str());
234 low.push_back(sys[
"low"].val_float());
235 high.push_back(sys[
"high"].val_float());
240 auto v = std::make_unique<RooStats::HistFactory::FlexibleInterpVar>(
241 (
"overallSys_" +
name).c_str(), (
"overallSys_" +
name).c_str(), nps, 1., low, high);
242 v->setAllInterpCodes(4);
244 ownedArgsStack.push(std::move(
v));
247 if (p.has_child(
"histogramSystematics")) {
251 for (
const auto &sys : p[
"histogramSystematics"].children()) {
254 :
"alpha_" + sysname);
255 RooAbsReal *par = ::getNP(tool, parname.c_str());
258 ownedArgsStack.push(std::make_unique<RooHistFunc>(
260 low.
add(*ownedArgsStack.top());
262 ownedArgsStack.push(std::make_unique<RooHistFunc>((sysname +
"High_" +
name).c_str(),
264 *(dh_high.
get()), dh_high));
265 high.
add(*ownedArgsStack.top());
267 auto v = std::make_unique<PiecewiseInterpolation>((
"histoSys_" +
name).c_str(),
268 (
"histoSys_" +
name).c_str(), *hf, low, high, nps,
false);
269 v->setAllInterpCodes(4);
271 ownedArgsStack.push(std::move(
v));
274 ownedArgsStack.push(std::move(hf));
277 if (p.has_child(
"shapeSystematics")) {
278 for (
const auto &sys : p[
"shapeSystematics"].children()) {
280 std::string funcName = prefix + sysname +
"_ShapeSys";
284 "' should have been created but cannot be found in scope.");
286 shapeElems.
add(*phf);
292 if (normElems.
size() > 0) {
298 }
catch (
const std::runtime_error &
e) {
300 "' is of histogram type, but 'data' is not a valid definition. " +
e.what() +
".");
308 std::unique_ptr<ParamHistFunc> createPHF(
const std::string &sysname,
const std::string &phfname,
310 const RooArgSet &observables,
const std::string &constraintType,
311 RooArgList &gammas,
double gamma_min,
double gamma_max)
const
315 std::string funcParams =
"gamma_" + sysname;
317 auto phf = std::make_unique<ParamHistFunc>(phfname.c_str(), phfname.c_str(), observables, gammas);
318 for (
auto &
g : gammas) {
319 g->setAttribute(
"np");
322 if (constraintType ==
"Gauss") {
323 for (
size_t i = 0; i < vals.size(); ++i) {
327 auto nom = std::make_unique<RooRealVar>(nomname.
Data(), nomname.
Data(), 1);
330 nom->
setRange(0, std::max(10., gamma_max));
331 auto sigma = std::make_unique<RooConstVar>(sname.
Data(), sname.
Data(), vals[i]);
333 auto gaus = std::make_unique<RooGaussian>(poisname.
Data(), poisname.
Data(), *nom, *
g, *
sigma);
334 gaus->addOwnedComponents(std::move(nom), std::move(
sigma));
335 constraints.
add(*gaus,
true);
336 ownedComponents.
addOwned(std::move(gaus),
true);
338 }
else if (constraintType ==
"Poisson") {
339 for (
size_t i = 0; i < vals.size(); ++i) {
340 double tau_float = vals[i];
345 auto tau = std::make_unique<RooConstVar>(tname.
Data(), tname.
Data(), tau_float);
346 auto nom = std::make_unique<RooRealVar>(nomname.
Data(), nomname.
Data(), tau_float);
351 auto prod = std::make_unique<RooProduct>(prodname.
Data(), prodname.
Data(), elems);
352 auto pois = std::make_unique<RooPoisson>(poisname.
Data(), poisname.
Data(), *nom, *prod);
353 pois->addOwnedComponents(std::move(tau), std::move(nom), std::move(prod));
354 pois->setNoRounding(
true);
355 constraints.
add(*pois,
true);
356 ownedComponents.
addOwned(std::move(pois),
true);
361 for (
auto &
g : gammas) {
362 for (
auto client :
g->clients()) {
363 if (client->InheritsFrom(RooAbsPdf::Class()) && !constraints.
find(*client)) {
364 constraints.
add(*client);
375 std::unique_ptr<ParamHistFunc> createPHFMCStat(
const std::string &
name,
const std::vector<double> &sumW,
378 double statErrorThreshold,
const std::string &statErrorType)
const
380 if (sumW.size() == 0)
384 std::string phfname = std::string(
"mc_stat_") +
name;
385 std::string sysname = std::string(
"stat_") +
name;
386 std::vector<double> vals(sumW.size());
387 std::vector<double> errs(sumW.size());
389 for (
size_t i = 0; i < sumW.size(); ++i) {
390 errs[i] =
sqrt(sumW2[i]) / sumW[i];
391 if (statErrorType ==
"Gauss") {
392 vals[i] = std::max(errs[i], 0.);
393 }
else if (statErrorType ==
"Poisson") {
394 vals[i] = sumW[i] * sumW[i] / sumW2[i];
398 auto phf = createPHF(sysname, phfname, vals, w, constraints, observables, statErrorType, gammas, 0, 10);
401 for (
size_t i = 0; i < sumW.size(); ++i) {
404 if (errs[i] < statErrorThreshold) {
405 g->setConstant(
true);
412 std::unique_ptr<ParamHistFunc> createPHFShapeSys(
const JSONNode &p,
const std::string &phfname,
RooWorkspace &w,
416 std::vector<double> vals;
417 for (
const auto &
v : p[
"vals"].children()) {
418 vals.push_back(
v.val_float());
421 return createPHF(sysname, phfname, vals, w, constraints, observables, p[
"constraint"].val(), gammas, 0, 1000);
433 std::vector<std::string> usesStatError;
434 double statErrorThreshold = 0;
435 std::string statErrorType =
"Poisson";
437 auto &staterr = p[
"statError"];
438 if (staterr.has_child(
"relThreshold"))
439 statErrorThreshold = staterr[
"relThreshold"].
val_float();
440 if (staterr.has_child(
"constraint"))
441 statErrorType = staterr[
"constraint"].val();
443 std::vector<double> sumW;
444 std::vector<double> sumW2;
445 std::vector<double> dummy;
446 std::vector<std::string> sysnames;
447 std::vector<std::string> funcnames;
448 std::vector<std::string> coefnames;
454 for (
const auto &comp : p[
"samples"].children()) {
456 auto &def = comp.is_container() ? comp : p[
"functions"][fname.c_str()];
458 if (def[
"type"].val() ==
"hist-sample") {
460 if (observables.
empty()) {
463 if (def.has_child(
"overallSystematics"))
464 ::collectNames(def[
"overallSystematics"], sysnames);
465 if (def.has_child(
"histogramSystematics"))
466 ::collectNames(def[
"histogramSystematics"], sysnames);
467 if (def.has_child(
"shapeSystematics")) {
468 std::vector<std::string> shapeSysNames;
469 ::collectNames(def[
"shapeSystematics"], shapeSysNames);
470 for (
auto &sysname : shapeSysNames) {
471 std::string phfname =
name +
"_" + sysname +
"_ShapeSys";
474 auto newphf = createPHFShapeSys(def[
"shapeSystematics"][sysname], phfname, *(tool->
workspace()),
475 constraints, observables);
481 }
catch (
const char *s) {
486 if (comp[
"statError"].val_bool()) {
487 ::stackError(def[
"data"], sumW, sumW2);
489 }
catch (
const char *s) {
494 funcnames.push_back(fprefix + fname);
495 coefnames.push_back(fprefix + fname +
"_norm");
498 auto phf = createPHFMCStat(
name, sumW, sumW2, *(tool->
workspace()), constraints, observables, statErrorThreshold,
506 for (
const auto &fname : funcnames) {
510 for (
const auto &coefname : coefnames) {
514 for (
auto sysname : sysnames) {
515 RooAbsPdf *pdf = ::getConstraint(tool, sysname.c_str());
516 constraints.
add(*pdf);
518 if (constraints.
empty()) {
520 sum.setAttribute(
"BinnedLikelihood");
524 sum.setAttribute(
"BinnedLikelihood");
543 std::string
const &
key()
const override
545 static const std::string keystring =
"interpolation0d";
552 elem[
"type"] <<
key();
553 auto &vars = elem[
"vars"];
556 vars.append_child() <<
v->
GetName();
559 elem[
"high"] << fip->
high();
560 elem[
"low"] << fip->
low();
567 std::string
const &
key()
const override
569 static const std::string keystring =
"interpolation";
575 elem[
"type"] <<
key();
577 auto &vars = elem[
"vars"];
579 for (
const auto &
v : pip->paramList()) {
580 vars.append_child() <<
v->
GetName();
583 auto &nom = elem[
"nom"];
586 auto &high = elem[
"high"];
588 for (
const auto &
v : pip->highList()) {
589 high.append_child() <<
v->
GetName();
592 auto &low = elem[
"low"];
594 for (
const auto &
v : pip->lowList()) {
621 std::string nomname(p[
"nom"].val());
625 for (
const auto &
d : p[
"vars"].children()) {
632 for (
const auto &
d : p[
"high"].children()) {
639 for (
const auto &
d : p[
"low"].children()) {
648 for (
size_t i = 0; i < vars.size(); ++i) {
665 for (
const auto &
e : prod->components()) {
666 if (
e->InheritsFrom(RooProduct::Class())) {
675 std::string chname(prodpdf->
GetName());
676 if (chname.find(
"model_") == 0) {
677 chname = chname.substr(6);
680 for (
const auto &
v : prodpdf->pdfList()) {
681 if (
v->InheritsFrom(RooRealSumPdf::Class())) {
687 for (
const auto &sample : sumpdf->funcList()) {
688 if (!sample->InheritsFrom(RooProduct::Class()) && !sample->InheritsFrom(RooRealSumPdf::Class()))
692 bool has_poisson_constraints =
false;
693 bool has_gauss_constraints =
false;
694 std::map<int, double> tot_yield;
695 std::map<int, double> tot_yield2;
696 std::map<int, double> rel_errors;
697 std::map<std::string, std::unique_ptr<TH1>> bb_histograms;
698 std::map<std::string, std::unique_ptr<TH1>> nonbb_histograms;
699 std::vector<std::string> varnames;
701 for (
size_t sampleidx = 0; sampleidx < sumpdf->
funcList().
size(); ++sampleidx) {
702 const auto func = sumpdf->
funcList().
at(sampleidx);
703 const auto coef = sumpdf->
coefList().
at(sampleidx);
704 std::string samplename = func->
GetName();
705 if (samplename.find(
"L_x_") == 0)
706 samplename = samplename.substr(4);
707 auto end = samplename.find(
"_" + chname);
708 if (end < samplename.size())
709 samplename = samplename.substr(0, end);
722 std::unique_ptr<TH1> hist;
723 std::vector<ParamHistFunc *> phfs;
725 std::vector<const RooAbsArg *> norms;
728 for (
const auto &
e : elems) {
729 if (
e->InheritsFrom(RooConstVar::Class())) {
733 }
else if (
e->InheritsFrom(RooRealVar::Class())) {
735 }
else if (
e->InheritsFrom(RooHistFunc::Class())) {
737 if (varnames.size() == 0) {
738 varnames = getVarnames(hf);
741 hist = histFunc2TH1(hf);
743 }
else if (
e->InheritsFrom(RooStats::HistFactory::FlexibleInterpVar::Class())) {
745 }
else if (
e->InheritsFrom(PiecewiseInterpolation::Class())) {
747 }
else if (
e->InheritsFrom(ParamHistFunc::Class())) {
763 elem[
"name"] << chname;
764 elem[
"type"] <<
key();
766 auto &samples = elem[
"samples"];
768 auto &s = samples[samplename];
770 s[
"type"] <<
"hist-sample";
772 for (
const auto &norm : norms) {
773 auto &nfs = s[
"normFactors"];
775 nfs.append_child() << norm->GetName();
779 auto &systs = s[
"histogramSystematics"];
783 if (sysname.find(
"alpha_") == 0) {
784 sysname = sysname.substr(6);
786 auto &sys = systs[sysname];
788 auto &dataLow = sys[
"dataLow"];
793 auto &dataHigh = sys[
"dataHigh"];
802 auto &systs = s[
"overallSystematics"];
806 if (sysname.find(
"alpha_") == 0) {
807 sysname = sysname.substr(6);
809 auto &sys = systs[sysname];
811 sys[
"low"] << fip->
low()[i];
812 sys[
"high"] << fip->
high()[i];
815 bool has_mc_stat =
false;
816 for (
auto phf : phfs) {
821 for (
const auto &
g : phf->paramList()) {
823 RooPoisson *constraint_p = findClient<RooPoisson>(
g);
825 if (tot_yield.find(idx) == tot_yield.end()) {
829 tot_yield[idx] += hist->GetBinContent(idx);
830 tot_yield2[idx] += (hist->GetBinContent(idx) * hist->GetBinContent(idx));
832 double erel = 1. / std::sqrt(constraint_p->
getX().
getVal());
833 rel_errors[idx] = erel;
834 has_poisson_constraints =
true;
835 }
else if (constraint_g) {
837 rel_errors[idx] = erel;
838 has_gauss_constraints =
true;
841 bb_histograms[samplename] = std::move(hist);
843 auto &shapesysts = s[
"shapeSystematics"];
844 shapesysts.set_map();
847 sysName.Remove(sysName.Index(
"_ShapeSys"));
848 sysName.Remove(0, chname.size() + 1);
849 auto &sys = shapesysts[sysName.Data()];
851 auto &cstrts = sys[
"vals"];
853 bool is_poisson =
false;
854 for (
const auto &
g : phf->paramList()) {
855 RooPoisson *constraint_p = findClient<RooPoisson>(
g);
859 cstrts.append_child() << constraint_p->
getX().
getVal();
860 }
else if (constraint_g) {
866 sys[
"constraint"] <<
"Poisson";
868 sys[
"constraint"] <<
"Gauss";
873 nonbb_histograms[samplename] = std::move(hist);
876 auto &ns = s[
"namespaces"];
878 ns.append_child() << chname;
881 auto &samples = elem[
"samples"];
882 for (
const auto &hist : nonbb_histograms) {
883 auto &s = samples[hist.first];
884 auto &data = s[
"data"];
888 for (
const auto &hist : bb_histograms) {
889 auto &s = samples[hist.first];
890 for (
auto bin : rel_errors) {
893 const int i = bin.first;
894 const double relerr_tot = bin.second;
895 const double count = hist.second->GetBinContent(i);
896 hist.second->SetBinError(i, relerr_tot * tot_yield[i] /
sqrt(tot_yield2[i]) * count);
898 auto &data = s[
"data"];
902 auto &statError = elem[
"statError"];
904 if (has_poisson_constraints) {
905 statError[
"constraint"] <<
"Poisson";
906 }
else if (has_gauss_constraints) {
907 statError[
"constraint"] <<
"Gauss";
912 std::string
const &
key()
const override
914 static const std::string keystring =
"histfactory";
920 if (tryExport(prodpdf, elem)) {
931 Tool::registerImporter<RooRealSumPdfFactory>(
"histfactory",
true);
932 Tool::registerImporter<RooHistogramFactory>(
"hist-sample",
true);
933 Tool::registerImporter<PiecewiseInterpolationFactory>(
"interpolation",
true);
934 Tool::registerExporter<FlexibleInterpVarStreamer>(RooStats::HistFactory::FlexibleInterpVar::Class(),
true);
935 Tool::registerExporter<PiecewiseInterpolationStreamer>(PiecewiseInterpolation::Class(),
true);
936 Tool::registerExporter<HistFactoryStreamer>(RooProdPdf::Class(),
true);
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
static char * Format(const char *format, va_list ap)
Format a string in a circular formatting buffer (using a printf style format descriptor).
A class which maps the current values of a RooRealVar (or a set of RooRealVars) to one of a number of...
static RooArgList createParamSet(RooWorkspace &w, const std::string &, const RooArgList &Vars)
Create the list of RooRealVar parameters which represent the height of the histogram bins.
The PiecewiseInterpolation is a class that can morph distributions into each other,...
const RooArgList & highList() const
const RooAbsReal * nominalHist() const
Return pointer to the nominal hist function.
void setInterpCode(RooAbsReal ¶m, int code, bool silent=false)
const RooArgList & lowList() const
const RooArgList & paramList() const
const std::vector< int > & interpolationCodes() const
RooAbsArg is the common abstract base class for objects that represent a value and a "shape" in RooFi...
bool addOwnedComponents(const RooAbsCollection &comps)
Take ownership of the contents of 'comps'.
void setAttribute(const Text_t *name, Bool_t value=kTRUE)
Set (default) or clear a named boolean attribute of this object.
RooArgSet * getVariables(Bool_t stripDisconnected=kTRUE) const
Return RooArgSet with all variables (tree leaf nodes of expresssion tree)
Bool_t recursiveRedirectServers(const RooAbsCollection &newServerList, Bool_t mustReplaceAll=kFALSE, Bool_t nameChange=kFALSE, Bool_t recurseInNewSet=kTRUE)
Recursively replace all servers with the new servers in newSet.
virtual Bool_t add(const RooAbsArg &var, Bool_t silent=kFALSE)
Add the specified argument to list.
virtual Bool_t addOwned(RooAbsArg &var, Bool_t silent=kFALSE)
Add an argument and transfer the ownership to the collection.
Storage_t::size_type size() const
const char * GetName() const
Returns name of object.
RooAbsArg * find(const char *name) const
Find object with given name in list.
void setConstant(Bool_t value=kTRUE)
RooAbsReal is the common abstract base class for objects that represent a real value and implements f...
TH1 * createHistogram(const char *varNameList, Int_t xbins=0, Int_t ybins=0, Int_t zbins=0) const
Create and fill a ROOT histogram TH1, TH2 or TH3 with the values of this function for the variables w...
Double_t getVal(const RooArgSet *normalisationSet=nullptr) const
Evaluate object.
RooArgList is a container object that can hold multiple RooAbsArg objects.
RooAbsArg * at(Int_t idx) const
Return object at given index, or nullptr if index is out of range.
RooArgSet is a container object that can hold multiple RooAbsArg objects.
RooConstVar represent a constant real-valued object.
The RooDataHist is a container class to hold N-dimensional binned data.
RooSpan< const double > binVolumes(std::size_t first, std::size_t len) const
Retrieve all bin volumes. Bins are indexed according to getIndex().
Int_t numEntries() const override
Return the number of bins.
const RooArgSet * get() const override
Get bin centre of current bin.
virtual bool has_child(std::string const &) const =0
virtual float val_float() const
RooAbsReal const & getMean() const
Get the mean parameter.
RooAbsReal const & getSigma() const
Get the sigma parameter.
RooHistFunc implements a real-valued function sampled from a multidimensional histogram.
RooDataHist & dataHist()
Return RooDataHist that is represented.
RooAbsReal const & getX() const
Get the x variable.
RooProdPdf is an efficient implementation of a product of PDFs of the form.
A RooProduct represents the product of a given set of RooAbsReal objects.
The class RooRealSumPdf implements a PDF constructed from a sum of functions:
const RooArgList & funcList() const
const RooArgList & coefList() const
RooRealVar represents a variable that can be changed from the outside.
void setMin(const char *name, Double_t value)
Set minimum of name range to given value.
void setError(Double_t value)
void setRange(const char *name, Double_t min, Double_t max)
Set a fit or plotting range.
const std::vector< double > & high() const
const std::vector< double > & low() const
const RooListProxy & variables() const
Const getters.
The RooWorkspace is a persistable container for RooFit projects.
RooAbsData * embeddedData(const char *name) const
Retrieve dataset (binned or unbinned) with given name. A null pointer is returned if not found.
Bool_t import(const RooAbsArg &arg, const RooCmdArg &arg1=RooCmdArg(), const RooCmdArg &arg2=RooCmdArg(), const RooCmdArg &arg3=RooCmdArg(), const RooCmdArg &arg4=RooCmdArg(), const RooCmdArg &arg5=RooCmdArg(), const RooCmdArg &arg6=RooCmdArg(), const RooCmdArg &arg7=RooCmdArg(), const RooCmdArg &arg8=RooCmdArg(), const RooCmdArg &arg9=RooCmdArg())
Import a RooAbsArg object, e.g.
RooAbsReal * function(const char *name) const
Retrieve function (RooAbsReal) with given name. Note that all RooAbsPdfs are also RooAbsReals....
RooRealVar * var(const char *name) const
Retrieve real-valued variable (RooRealVar) with given name. A null pointer is returned if not found.
RooFactoryWSTool & factory()
Return instance to factory tool.
RooAbsPdf * pdf(const char *name) const
Retrieve p.d.f (RooAbsPdf) with given name. A null pointer is returned if not found.
virtual void SetDirectory(TDirectory *dir)
By default, when a histogram is created, it is added to the list of histogram objects in the current ...
virtual const char * GetName() const
Returns name of object.
virtual Bool_t InheritsFrom(const char *classname) const
Returns kTRUE if object inherits from class "classname".
const char * Data() const
Bool_t BeginsWith(const char *s, ECaseCompare cmp=kExact) const
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
RooCmdArg RecycleConflictNodes(Bool_t flag=kTRUE)
RooCmdArg Embedded(Bool_t flag=kTRUE)
RooCmdArg Silence(Bool_t flag=kTRUE)
RooCmdArg Conditional(const RooArgSet &pdfSet, const RooArgSet &depSet, Bool_t depsAreCond=kFALSE)
VecExpr< UnaryOp< Sqrt< T >, VecExpr< A, T, D >, T >, T, D > sqrt(const VecExpr< A, T, D > &rhs)
void variables(TString dataset, TString fin="TMVA.root", TString dirName="InputVariables_Id", TString title="TMVA Input Variables", Bool_t isRegression=kFALSE, Bool_t useTMVAStyle=kTRUE)
#define STATIC_EXECUTE(MY_CODE)
static uint64_t sum(uint64_t i)