53 int ndigits = std::floor(std::log10(std::abs(
d))) + 1 -
nSig;
55 if (std::abs(
d /
sf) < 2)
57 return sf * std::round(
d /
sf);
66void erasePrefix(std::string &str, std::string_view prefix)
69 str.erase(0, prefix.size());
76 str.erase(str.size() -
suffix.size());
92 for (
const auto &client :
gamma->clients()) {
93 if (
auto casted =
dynamic_cast<T *
>(client)) {
122 return "gamma_" +
sysname +
"_bin_" + std::to_string(i);
132 for (std::size_t i = 0; i < params.size(); ++i) {
133 std::string
name(params[i]->GetName());
147 nom.setConstant(
true);
186 *
tool.workspace()->var(std::string(
"nom_") + param.
GetName()), 1.);
191 "' is a known constraint type, but it cannot be resolved in this context");
195 const std::vector<std::string> &
parnames,
const std::vector<double> &vals,
202 size_t n = std::max(vals.size(),
parnames.size());
204 for (std::size_t i = 0; i <
n; ++i) {
215 if (vals.size() > 0) {
227 gamma->setConstant(
true);
237 if (!
comp.has_child(
"modifiers"))
239 for (
const auto &
mod :
comp[
"modifiers"].children()) {
240 if (
mod[
"type"].val() == ::Literals::staterror)
248 if (
comp.has_child(
"modifiers")) {
249 for (
const auto &
mod :
comp[
"modifiers"].children()) {
250 if (
mod[
"type"].val() == ::Literals::staterror)
255 ::Literals::staterror +
" modifier!");
270 param.
setError(gauss->getSigma().getVal());
275 if (
auto constr =
mod.find(
"constraint")) {
279 param.
setError(gauss->getSigma().getVal());
290 "': this looks like a legacy workspace where the 'constraint' field is neither a "
291 "constraint pdf name nor a supported legacy constraint type");
308 std::string(constraint.
GetName()));
316 if (
auto const *tau =
dynamic_cast<RooConstVar const *
>(arg)) {
317 return tau->getVal();
324 return real->getVal();
330 std::string(constraint.
GetName()));
331 return std::numeric_limits<double>::quiet_NaN();
345 return std::numeric_limits<double>::quiet_NaN();
360 if (!
p.has_child(
"data")) {
376 if (
p.has_child(
"modifiers")) {
387 for (
const auto &
mod :
p[
"modifiers"].children()) {
388 std::string
const &
modtype =
mod[
"type"].val();
390 mod.has_child(
"name")
392 : (
mod.has_child(
"parameter") ?
mod[
"parameter"].val() :
"syst_" + std::to_string(idx));
396 }
else if (
modtype ==
"normfactor") {
400 if (
mod.has_child(
"constraint") ||
mod.has_child(
"constraint_name") ||
mod.has_child(
"constraint_type")) {
404 }
else if (
modtype ==
"normsys") {
412 if (
mod.has_child(
"interpolation")) {
415 double low =
data[
"lo"].val_double();
416 double high =
data[
"hi"].val_double();
422 if (
interp == 4 && low <= 0)
423 low = std::numeric_limits<double>::epsilon();
424 if (
interp == 4 && high <= 0)
425 high = std::numeric_limits<double>::epsilon();
432 }
else if (
modtype ==
"histosys") {
449 std::vector<double> vals;
450 if (
mod[
"data"].has_child(
"vals")) {
451 for (
const auto &
v :
mod[
"data"][
"vals"].children()) {
452 vals.push_back(
v.val_double());
456 for (
const auto &
v :
mod[
"parameters"].children()) {
459 if (vals.empty() &&
parnames.empty()) {
461 "' with neither values nor parameters!");
463 std::string constraint =
"unknown";
464 std::vector<RooAbsPdf *> constraintPdfs;
467 for (
const auto &
v :
mod[
"constraints"].children()) {
469 constraintPdfs.push_back(
nullptr);
481 if (constraintPdfs.size() !=
nGammas) {
482 std::stringstream
ss;
484 <<
" constraints, but " <<
nGammas <<
" parameters";
487 }
else if (
mod.has_child(
"constraint_type")) {
488 constraint =
mod[
"constraint_type"].val();
489 }
else if (
mod.has_child(
"constraint")) {
496 "': this looks like a legacy workspace where the 'constraint' field is "
497 "not a supported legacy constraint type");
508 }
else if (
modtype ==
"custom") {
532 v.setAllInterpCodes(4);
554 if (!
p.has_child(
"samples")) {
559 if (
p.has_child(::Literals::staterror)) {
560 auto &
staterr =
p[::Literals::staterror];
561 if (
staterr.has_child(
"relThreshold"))
563 if (
staterr.has_child(
"constraint_type"))
566 std::vector<double>
sumW;
567 std::vector<double>
sumW2;
573 std::vector<std::unique_ptr<RooDataHist>>
data;
574 for (
const auto &
comp :
p[
"samples"].children()) {
577 size_t nbins =
dh->numEntries();
584 for (
size_t i = 0; i <
nbins; ++i) {
586 sumW2[i] +=
dh->weightSquared(i);
596 data.emplace_back(std::move(
dh));
605 std::vector<double>
errs(
sumW.size());
606 for (
size_t i = 0; i <
sumW.size(); ++i) {
624 for (
const auto &
comp :
p[
"samples"].children()) {
633 if (constraints.
empty()) {
648 std::string
const &key()
const override
650 static const std::string
keystring =
"interpolation0d";
656 elem[
"type"] << key();
657 elem[
"interpolationCodes"].fill_seq(
fip->interpolationCodes());
660 elem[
"high"].fill_seq(
fip->high(),
fip->variables().size());
661 elem[
"low"].fill_seq(
fip->low(),
fip->variables().size());
668 std::string
const &key()
const override
670 static const std::string
keystring =
"interpolation";
676 elem[
"type"] << key();
677 elem[
"interpolationCodes"].fill_seq(
pip->interpolationCodes());
678 elem[
"positiveDefinite"] <<
pip->positiveDefinite();
680 elem[
"nom"] <<
pip->nominalHist()->GetName();
699 pip.setPositiveDefinite(
p[
"positiveDefinite"].val_bool());
701 if (
p.has_child(
"interpolationCodes")) {
703 for (
auto const &node :
p[
"interpolationCodes"].children()) {
704 pip.setInterpCode(*
static_cast<RooAbsReal *
>(vars.at(i)), node.val_int(),
true);
718 if (!
p.has_child(
"high")) {
721 if (!
p.has_child(
"low")) {
724 if (!
p.has_child(
"nom")) {
728 double nom(
p[
"nom"].val_double());
732 std::vector<double> high;
735 std::vector<double> low;
738 if (vars.size() != low.size() || vars.size() != high.size()) {
740 "' has non-matching lengths of 'vars', 'high' and 'low'!");
745 if (
p.has_child(
"interpolationCodes")) {
747 for (
auto const &node :
p[
"interpolationCodes"].children()) {
748 fip.setInterpCode(*
static_cast<RooAbsReal *
>(vars.at(i)), node.val_int());
768 std::string
name =
"";
772 int interpolationCode = 4;
776 :
name(
n), param(
p), low(
l), high(
h), interpolationCode(i), constraint(
c)
784 std::vector<double> low;
785 std::vector<double> high;
788 int interpolationCode = 4;
791 :
name(
n), param(
p), interpolationCode(i), constraint(
c)
793 low.assign(
l->dataHist().weightArray(),
l->dataHist().weightArray() +
l->dataHist().numEntries());
794 high.assign(
h->dataHist().weightArray(),
h->dataHist().weightArray() +
h->dataHist().numEntries());
799 std::vector<double> constraints;
800 std::vector<RooAbsPdf const *> constraintPdfs;
801 std::vector<RooAbsReal *> parameters;
805struct GenericElement {
814 size_t end = s.size();
816 while (start < end && s[start] ==
'(' && s[end - 1] ==
')') {
819 for (
size_t i = start; i < end - 1; ++i) {
822 else if (s[i] ==
')')
824 if (
depth == 0 && i < end - 1) {
836 return s.substr(start, end - start);
841 std::vector<std::string>
parts;
846 for (
size_t i = 0; i <
expr.size(); ++i) {
850 }
else if (
c ==
')') {
852 }
else if (
c ==
'*' &&
depth == 0) {
854 std::string sub =
expr.substr(start, i - start);
864 std::string sub =
expr.substr(start);
871 static const std::regex pattern(
872 R
"(^\s*1(?:\.0)?\s*([\+\-])\s*([a-zA-Z_][a-zA-Z0-9_]*|[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)\s*\*\s*([a-zA-Z_][a-zA-Z0-9_]*|[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)\s*$)");
878 if (std::regex_match(s, match, pattern)) {
879 if (match[1].str() ==
"-") {
883 std::string
token2 = match[2].str();
884 std::string
token3 = match[4].str();
895 sys.name =
p2->GetName();
900 sys.name =
p3->GetName();
905 sys.name =
v2->GetName();
907 sys.high =
sign *
p3->getVal();
908 sys.low = -
sign *
p3->getVal();
910 sys.name =
v3->GetName();
912 sys.high =
sign *
p2->getVal();
913 sys.low = -
sign *
p2->getVal();
917 sys.interpolationCode = 1;
926 if (
auto prod =
dynamic_cast<RooProduct *
>(arg)) {
927 for (
const auto &
e : prod->components()) {
937 for (
auto *var : list) {
947 std::vector<double> hist;
948 std::vector<double> histError;
949 std::vector<NormFactor> normfactors;
950 std::vector<NormSys> normsys;
951 std::vector<HistoSys> histosys;
952 std::vector<ShapeSys> shapesys;
953 std::vector<GenericElement> tmpElements;
954 std::vector<GenericElement> otherElements;
955 bool useBarlowBeestonLight =
false;
956 std::vector<RooAbsReal *> staterrorParameters;
964 for (
RooAbsArg const *pdf : ws->allPdfs()) {
965 if (
auto gauss =
dynamic_cast<RooGaussian const *
>(pdf)) {
966 if (
parname == gauss->getX().GetName()) {
967 sample.normfactors.emplace_back(*par, gauss);
973 sample.normfactors.emplace_back(*par);
978 std::vector<Sample> samples;
979 std::map<int, double> tot_yield;
980 std::map<int, double> tot_yield2;
981 std::map<int, double> rel_errors;
983 long unsigned int nBins = 0;
998 std::vector<ParamHistFunc *>
phfs;
1008 if (channel.varSet ==
nullptr) {
1009 channel.varSet = dataHist.get();
1010 channel.nBins = dataHist.numEntries();
1012 if (
sample.hist.empty()) {
1013 auto *
w = dataHist.weightArray();
1014 sample.hist.assign(
w,
w + dataHist.numEntries());
1031 }
else if (
auto par =
dynamic_cast<RooRealVar *
>(
e)) {
1040 for (
size_t i = 0; i <
fip->variables().size(); ++i) {
1049 fip->interpolationCodes()[i], constraint);
1060 expression.ReplaceAll((
"x[" + std::to_string(i) +
"]").c_str(),
p->GetName());
1061 expression.ReplaceAll((
"@" + std::to_string(i)).c_str(),
p->GetName());
1064 if (components.size() == 0) {
1066 sample.otherElements.push_back(formula);
1069 std::vector<RooAbsArg *> realComponents;
1071 for (
auto &
comp : components) {
1075 realComponents.push_back(
part);
1080 if (normsys.param) {
1081 sample.normsys.emplace_back(std::move(normsys));
1086 std::string
name = std::string(formula->
GetName()) +
"_part" + std::to_string(idx);
1089 sample.tmpElements.push_back({var});
1117 for (
size_t i = 0; i <
pip->paramList().
size(); ++i) {
1121 if (
auto lo =
dynamic_cast<RooHistFunc *
>(
pip->lowList().at(i))) {
1127 sample.histosys.emplace_back(
sysname, var, lo,
hi,
pip->interpolationCodes()[i], constraint);
1138 for (
const auto &
g :
phf->paramList()) {
1142 if (channel.tot_yield.find(idx) == channel.tot_yield.end()) {
1143 channel.tot_yield[idx] = 0;
1144 channel.tot_yield2[idx] = 0;
1146 channel.tot_yield[idx] +=
sample.hist[idx - 1];
1147 channel.tot_yield2[idx] += (
sample.hist[idx - 1] *
sample.hist[idx - 1]);
1152 sample.useBarlowBeestonLight =
true;
1159 for (
const auto &
g :
phf->paramList()) {
1160 sys.parameters.push_back(
static_cast<RooRealVar *
>(
g));
1166 if (!constraint && !
g->isConstant()) {
1173 sys.constraints.push_back(0.0);
1174 sys.constraintPdfs.push_back(
nullptr);
1177 sys.constraintPdfs.push_back(constraint);
1180 sample.shapesys.emplace_back(std::move(sys));
1186 channel.samples.emplace_back(std::move(
sample));
1198 return std::string{
lhs->GetName()} ==
rhs->GetName() &&
lhs->IsA() ==
rhs->IsA();
1202 std::string_view
name, std::string_view
reason)
1204 std::stringstream
ss;
1205 ss <<
"cannot combine duplicate modifier '" <<
name <<
"' of type '" <<
type <<
"' in sample '" <<
sample.name
1206 <<
"' of channel '" << channel.name <<
"': " <<
reason;
1211 std::string_view
name, std::size_t count)
1213 std::stringstream
ss;
1214 ss <<
"combined " << count <<
" duplicate modifiers named '" <<
name <<
"' of type '" <<
type <<
"' in sample '"
1215 <<
sample.name <<
"' of channel '" << channel.name <<
"'";
1226 return interpolationCode == 1 || interpolationCode == 4;
1232template <
class Modifiers,
class CombineFn>
1239 for (std::size_t begin = 0; begin <
modifiers.size();) {
1240 std::size_t end = begin + 1;
1246 for (std::size_t i = begin + 1; i < end; ++i) {
1260 if (end - begin > 1) {
1274 if (!normSysSupportsMultiplicativeMerge(merged.interpolationCode)) {
1275 duplicateModifierError(
1276 channel, sample,
"normsys", merged.name,
1277 "multiplicative combination is only valid for log-space interpolation codes");
1286 const std::size_t nBins =
sample.hist.size();
1289 if (merged.interpolationCode != 4) {
1290 duplicateModifierError(
1291 channel, sample,
"histosys", merged.name,
1292 "non-default interpolation cannot currently be represented by the HS3 exporter");
1294 if (
merged.low.size() != nBins ||
merged.high.size() != nBins ||
1296 duplicateModifierError(channel, sample,
"histosys", merged.name,
1297 "histogram binning differs");
1299 for (std::size_t bin = 0; bin < nBins; ++bin) {
1308 std::set<std::pair<std::string, std::string>>
seen;
1309 auto add = [&](std::string
type,
const std::string &
name) {
1312 "this modifier type cannot be combined without changing its meaning");
1328 if (
sample.useBarlowBeestonLight)
1329 add(::Literals::staterror, ::Literals::staterror);
1334 for (
auto &
sample : channel.samples) {
1343 for (
auto &
sample : channel.samples) {
1344 if (
sample.useBarlowBeestonLight) {
1346 for (
auto bin : channel.rel_errors) {
1349 const int i = bin.first;
1351 const double count =
sample.hist[i - 1];
1354 sample.histError[i - 1] =
1366 if (sys.constraint) {
1367 mod[
"constraint"] << sys.constraint->GetName();
1372 for (
const auto &
sample : channel.samples) {
1374 elem[
"type"] <<
"histfactory_dist";
1381 for (
const auto &
nf :
sample.normfactors) {
1384 mod[
"name"] <<
nf.name;
1385 mod[
"parameter"] <<
nf.param->GetName();
1386 mod[
"type"] <<
"normfactor";
1387 if (
nf.constraint) {
1388 mod[
"constraint"] <<
nf.constraint->GetName();
1389 tool->queueExport(*
nf.constraint);
1393 for (
const auto &sys :
sample.normsys) {
1396 mod[
"name"] << sys.name;
1397 mod[
"type"] <<
"normsys";
1398 mod[
"parameter"] << sys.param->GetName();
1399 if (sys.interpolationCode != 4) {
1400 mod[
"interpolation"] << sys.interpolationCode;
1403 auto &
data =
mod[
"data"].set_map();
1404 data[
"lo"] << sys.low;
1405 data[
"hi"] << sys.high;
1408 for (
const auto &sys :
sample.histosys) {
1411 mod[
"name"] << sys.name;
1412 mod[
"type"] <<
"histosys";
1413 mod[
"parameter"] << sys.param->GetName();
1415 auto &
data =
mod[
"data"].set_map();
1416 if (channel.nBins != sys.low.size() || channel.nBins != sys.high.size()) {
1417 std::stringstream
ss;
1418 ss <<
"inconsistent binning: " << channel.nBins <<
" bins expected, but " << sys.low.size() <<
"/"
1419 << sys.high.size() <<
" found in nominal histogram errors!";
1426 for (
const auto &sys :
sample.shapesys) {
1429 mod[
"name"] << sys.name;
1430 mod[
"type"] <<
"shapesys";
1432 if (std::any_of(sys.constraintPdfs.begin(), sys.constraintPdfs.end(),
1433 [](
auto *pdf) { return pdf != nullptr; })) {
1435 for (
auto *constraint : sys.constraintPdfs) {
1443 mod[
"data"].set_map()[
"vals"].fill_seq(sys.constraints);
1450 mod[
"type"] <<
"custom";
1456 mod[
"type"] <<
"custom";
1459 if (
sample.useBarlowBeestonLight) {
1462 mod[
"name"] << ::Literals::staterror;
1463 mod[
"type"] << ::Literals::staterror;
1474 auto &
dataNode = s[
"data"].set_map();
1475 if (channel.nBins !=
sample.hist.size()) {
1476 std::stringstream
ss;
1477 ss <<
"inconsistent binning: " << channel.nBins <<
" bins expected, but " <<
sample.hist.size()
1478 <<
" found in nominal histogram!";
1482 if (!
sample.histError.empty()) {
1483 if (channel.nBins !=
sample.histError.size()) {
1484 std::stringstream
ss;
1485 ss <<
"inconsistent binning: " << channel.nBins <<
" bins expected, but " <<
sample.histError.size()
1486 <<
" found in nominal histogram errors!";
1499 std::set<const RooAbsReal *> vars;
1500 for (
const auto &
sample : channel.samples) {
1501 for (
const auto &
nf :
sample.normfactors) {
1502 vars.insert(
nf.param);
1504 for (
const auto &sys :
sample.normsys) {
1505 vars.insert(sys.param);
1508 for (
const auto &sys :
sample.histosys) {
1509 vars.insert(sys.param);
1511 for (
const auto &sys :
sample.shapesys) {
1512 for (
const auto &par : sys.parameters) {
1516 if (
sample.useBarlowBeestonLight) {
1517 for (
const auto &par :
sample.staterrorParameters) {
1525 for (
auto *pdf : constraints) {
1527 for (
const auto *var : vars) {
1528 if (pdf->dependsOn(*var)) {
1557 if (channel.samples.size() == 0)
1559 for (
auto &
sample : channel.samples) {
1560 if (
sample.hist.empty()) {
1574 "losing constraint term '" + std::string(constraint->
GetName()) +
1575 "', implicit constraints are not supported by HS3 yet! The term will appear in the HS3 file, but will not be "
1576 "picked up when creating a likelihood from it! You will have to add it manually as an external constraint.");
1577 tool->queueExport(*constraint);
1581 for (
const auto &
sample : channel.samples) {
1598 for (
auto *constraint :
modifier.constraintPdfs) {
1600 tool->queueExport(*constraint);
1607 for (
const auto &
sample : channel.samples) {
1618 sumpdf->getParameters(channel.varSet, parameters);
1622 tool->queueExport(*param);
1631 bool autoExportDependants()
const override {
return false; }
1634 std::vector<RooAbsPdf *> constraints;
1644 constraints.push_back(pdf);
1653 std::string
const &key()
const override
1655 static const std::string
keystring =
"histfactory_dist";
1666 bool autoExportDependants()
const override {
return false; }
1669 std::vector<RooAbsPdf *> constraints;
1672 std::string
const &key()
const override
1674 static const std::string
keystring =
"histfactory_dist";
bool startsWith(std::string_view str, std::string_view prefix)
bool endsWith(std::string_view str, std::string_view suffix)
ROOT::RRangeCast< T, false, Range_t > static_range_cast(Range_t &&coll)
double toDouble(const char *s)
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
winID h TVirtualViewer3D TVirtualGLPainter p
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void data
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t r
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void value
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void funcs
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t modifier
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t type
A class which maps the current values of a RooRealVar (or a set of RooRealVars) to one of a number of...
The PiecewiseInterpolation is a class that can morph distributions into each other,...
void setPositiveDefinite(bool flag=true)
const_iterator begin() const
const_iterator end() const
Common abstract base class for objects that represent a value and a "shape" in RooFit.
bool dependsOn(const RooAbsCollection &serverList, const RooAbsArg *ignoreArg=nullptr, bool valueOnly=false) const
Test whether we depend on (ie, are served by) any object in the specified collection.
bool isConstant() const
Check if the "Constant" attribute is set.
Abstract container object that can hold multiple RooAbsArg objects.
virtual bool add(const RooAbsArg &var, bool silent=false)
Add the specified argument to list.
Abstract interface for all probability density functions.
Abstract base class for objects that represent a real value and implements functionality common to al...
RooArgList is a container object that can hold multiple RooAbsArg objects.
RooArgSet is a container object that can hold multiple RooAbsArg objects.
Returns the bin width (or volume) given a RooHistFunc.
Represents a constant real-valued object.
Container class to hold N-dimensional binned data.
A real-valued function sampled from a multidimensional histogram.
RooAbsReal const & getMean() const
Get the mean parameter.
Efficient implementation of a product of PDFs of the form.
Represents the product of a given set of RooAbsReal objects.
Implements a PDF constructed from a sum of functions:
Variable that can be changed from the outside.
void setError(double value)
This class encapsulates all information for the statistical interpretation of one experiment.
Configuration for a constrained, coherent shape variation of affected samples.
Configuration for an un- constrained overall systematic to scale sample normalisations.
std::string GetName() const
Constrained bin-by-bin variation of affected histogram.
Persistable container for RooFit projects.
TObject * obj(RooStringView name) const
Return any type of object (RooAbsArg, RooAbsData or generic object) with given name)
RooAbsPdf * pdf(RooStringView name) const
Retrieve p.d.f (RooAbsPdf) with given name. A null pointer is returned if not found.
RooAbsReal * function(RooStringView name) const
Retrieve function (RooAbsReal) with given name. Note that all RooAbsPdfs are also RooAbsReals....
RooFactoryWSTool & factory()
Return instance to factory tool.
bool import(const RooAbsArg &arg, const RooCmdArg &arg1={}, const RooCmdArg &arg2={}, const RooCmdArg &arg3={}, const RooCmdArg &arg4={}, const RooCmdArg &arg5={}, const RooCmdArg &arg6={}, const RooCmdArg &arg7={}, const RooCmdArg &arg8={}, const RooCmdArg &arg9={})
Import a RooAbsArg object, e.g.
const char * GetName() const override
Returns name of object.
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
RooCmdArg RecycleConflictNodes(bool flag=true)
RooCmdArg Conditional(const RooArgSet &pdfSet, const RooArgSet &depSet, bool depsAreCond=false)
void function(const Char_t *name_, T fun, const Char_t *docstring=0)
constexpr double defaultShapeSysGammaMax
constexpr double minShapeUncertainty
constexpr double defaultStatErrorGammaMax
constexpr double defaultGammaMin
void configureConstrainedGammas(RooArgList const &gammas, std::span< const double > relSigmas, double minSigma)
Configure constrained gamma parameters for fitting.
CreateGammaConstraintsOutput createGammaConstraints(RooArgList const ¶mList, std::span< const double > relSigmas, double minSigma, Constraint::Type type)
#define STATIC_EXECUTE(MY_FUNC)
static uint64_t sum(uint64_t i)