47#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
49#define protected public
70#define GETWS(a) a->_myws
71#define GETWSSETS(w) w->_namedSets
72#define GETWSSNAPSHOTS(w) w->_snapshots
73#define GETACTBROWSER(b) b->fActBrowser
74#define GETROOTDIR(b) b->fRootDir
75#define GETLISTTREE(b) b->fListTree
76#define GETDMP(o, m) o->m
101 return a->workspace();
109 return w->getSnapshots();
113 return b->GetActBrowser();
117 return b->GetRootDir();
121 return b->GetListTree();
123#define GETDMP(o, m) \
124 *reinterpret_cast<void **>(reinterpret_cast<unsigned char *>(o) + o->Class()->GetDataMemberOffset(#m))
176#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 26, 00)
180#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 24, 00)
184#if ROOT_VERSION_CODE > ROOT_VERSION(6, 37, 00)
214#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
220xRooNode::InteractiveObject *xRooNode::gIntObj =
nullptr;
221std::map<std::string, std::tuple<std::function<
double(
double,
double,
double)>,
bool>> xRooNode::auxFunctions;
222void xRooNode::SetAuxFunction(
const char *title,
const std::function<
double(
double,
double,
double)> &func,
225 auxFunctions[title] = std::make_tuple(func,
symmetrize);
244xRooNode::xRooNode(
const char *classname,
const char *
name,
const char *title)
250#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
251 w->_embeddedDataList.Delete();
253 xRooNode(*
w, std::make_shared<xRooNode>()).sterilize();
264xRooNode::xRooNode(
const char *
name,
const std::shared_ptr<TObject> &
comp,
const std::shared_ptr<xRooNode> &parent)
275#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 26, 00)
276 fComp = std::make_shared<RooWorkspace>(
"workspace",
name);
281 Error(
"xRooNode",
"Error reading json workspace %s",
name);
286 Error(
"xRooNode",
"json format workspaces available only in ROOT 6.26 onwards");
292 auto _file = std::make_shared<TFile>(
297 auto keys =
_file->GetListOfKeys();
299 for (
auto &&k : *keys) {
305#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
306 dynamic_cast<RooWorkspace *>(ws)->_embeddedDataList.Delete();
308 xRooNode(*ws, std::make_shared<xRooNode>()).sterilize();
314 fParent = std::make_shared<xRooNode>(
340 for (
auto f : *
gROOT->GetListOfFiles()) {
341 if ((
dynamic_cast<TFile *
>(
f)->GetVersion() / 100) > (
gROOT->GetVersionInt() / 100)) {
342 Warning(
"xRooNode",
"There is file open with version %d > current version %d ... results may be wrong",
343 dynamic_cast<TFile *
>(
f)->GetVersion(),
gROOT->GetVersionInt());
352 for (
auto col : *
colors) {
353 if (!
gROOT->GetListOfColors()->FindObject(col->GetName())) {
354 gROOT->GetListOfColors()->Add(
gROOT->GetListOfColors()->IsOwner() ? col->Clone() : col);
364 for (
auto &
d : _ws->allData()) {
365 for (
auto &
a : *
d->
get()) {
366 if (
auto v = _ws->var(
a->GetName());
v) {
367 v->setAttribute(
"obs");
368 }
else if (
auto c = _ws->cat(
a->GetName());
c) {
369 c->setAttribute(
"obs");
376 if (
checkCount == 0 && !_ws->allData().empty())
377 _ws->allData().back()->SetBit(1 << 20,
true);
380 for (
auto s : *_set) {
382 _ws->var(s->GetName())->setStringAttribute(
"nominal",
TString::Format(
"%f",
v->getVal()));
390 if (k ==
"globalObservables" ||
TString(k).
EndsWith(
"_GlobalObservables")) {
393 s->setAttribute(
"obs");
394 s->setAttribute(
"global");
397 const_cast<RooArgSet &
>(
v).setAttribAll(
"obs");
400 s->setAttribute(
"poi");
412 const_cast<RooArgSet &
>(
v).setAttribAll(
"np");
416 _ws->defineSet(
"globalObservables",
_allGlobs);
421 if (!_ws->allPdfs().empty()) {
424 for (
auto &
p :
np()) {
428 if (!
v->hasError()) {
437 "Inferring initial errors of %d parameters (%s%s) (give all nuisance parameters an error to avoid "
442 for (
auto &
a : *
this) {
446 if (
a->fFolder ==
"!pdfs") {
448 auto fr =
a->floats().reduced(
parNames).fitResult(
"prefit");
452 if (
auto arg =
dynamic_cast<RooRealVar *
>(
_fr->floatParsFinal().find(
v->GetName()));
453 arg && arg->hasError()) {
454 v->setError(arg->getError());
470 if (
strlen(GetTitle()) == 0) {
497 if (
auto a = std::dynamic_pointer_cast<RooAbsArg>(
comp);
a &&
a->getStringAttribute(
"alias"))
498 return a->getStringAttribute(
"alias");
500 return comp->GetName();
513 bool isBool = (
v ==
"TRUE" ||
v ==
"FALSE");
515 if (
value ==
nullptr ||
v ==
"NULLPTR") {
516 if (
a->getAttribute(
name))
517 a->setAttribute(
name,
false);
518 else if (
a->getStringAttribute(
name))
519 a->setStringAttribute(
name,
nullptr);
522 a->setAttribute(
name, (
v ==
"TRUE"));
533 for (
auto a : *
gROOT->GetListOfBrowsers()) {
555 if (o->isSelectedComp() && !val) {
558 o->setAttribute(
"hidden");
559 }
else if (!o->isSelectedComp() && !val) {
564 o->setAttribute(
"hidden",
false);
567 item->CheckItem(!o->getAttribute(
"hidden"));
568 if (o->isSelectedComp()) {
576 if (
auto o =
get(); o) {
578 o->SetBit(1 << 20, val);
580 if (
auto _ws =
ws(); _ws) {
583 if (fr->numStatusHistory() && !_ws->genobj(fr->GetName())) {
585 if (
auto wfr =
dynamic_cast<RooFitResult *
>(_ws->genobj(fr->GetName()))) {
590 _allVars = fr->floatParsFinal();
591 _allVars = fr->constPars();
592 for (
auto &i : fr->floatParsInit()) {
598 for (
auto oo : _ws->allGenericObjects()) {
600 ffr->ResetBit(1 << 20);
604 _ws->allVars() = fr->floatParsInit();
608 for (
auto a : *
gROOT->GetListOfBrowsers()) {
619 if (
auto first =
p->GetParent()->GetFirstChild()) {
621 if (first->HasCheckBox()) {
622 auto _obj =
static_cast<xRooNode *
>(first->GetUserData());
623 first->CheckItem(
_obj->get() &&
_obj->get()->TestBit(1 << 20));
625 }
while ((first = first->GetNextSibling()));
637 if (
auto first = i->GetFirstChild()) {
639 if (first->IsOpen() &&
640 (
TString(first->GetText()) ==
"poi" ||
TString(first->GetText()) ==
"np")) {
641 fb->DoubleClicked(first, 0);
644 }
while ((first = first->GetNextSibling()));
666 auto b2 =
dynamic_cast<TBrowser *
>(
gROOT->GetListOfBrowsers()->Last());
667 if (!b2 || !b2->GetBrowserImp()) {
674 b2 =
new TBrowser(
"nodeBrowser",
this,
"RooFit Browser");
676 }
else if (
strcmp(b2->GetName(),
"nodeBrowser") == 0) {
678 b2->BrowseObject(
this);
683 _b->AddFSDirectory(
"Workspaces",
nullptr,
"SetRootDir");
690 _b->GotoDir(
nullptr);
701 if (
auto first =
item->GetFirstChild()) {
703 if (first->HasCheckBox()) {
704 auto _obj =
static_cast<xRooNode *
>(first->GetUserData());
705 first->CheckItem(
_obj->get() &&
706 (
_obj->get()->TestBit(1 << 20) ||
709 }
while ((first = first->GetNextSibling()));
722 fBrowsables.push_back(std::make_shared<xRooNode>(
".Draw(\"pull\")",
nullptr, *
this));
723 fBrowsables.push_back(std::make_shared<xRooNode>(
".Draw(\"corr10colztext\")",
nullptr, *
this));
724 if (std::unique_ptr<RooAbsCollection>(
_fr->floatParsFinal().selectByAttrib(
"poi",
true))->size() == 1) {
725 fBrowsables.push_back(std::make_shared<xRooNode>(
".Draw(\"impact\")",
nullptr, *
this));
732 s->SetFillAttributes();
739 Draw(
b->GetDrawOption());
741 }
catch (
const std::exception &
e) {
744 (
gROOT->GetListOfBrowsers()->At(0))
747 "Exception",
e.what(),
754 for (
auto &
c : *
this) {
755 if (!
c->fFolder.empty()) {
766 _folders = emplace_back(std::make_shared<xRooNode>(
".folders",
nullptr, *
this));
769 for (
auto &
v : *
this) {
770 if (!
v->fFolder.empty() && !
_folders->find(
v->fFolder,
false)) {
771 _folders->emplace_back(std::make_shared<xRooNode>(
v->fFolder.c_str(),
nullptr, *
this));
778 _name = _name(1, _name.
Length());
779 b->Add(
v.get(), _name);
783 for (
auto &
v : *
this) {
786 if (
strcmp(
v->GetName(),
".folders") == 0)
790 if (
_fr && ((
_fr->status() == 0 &&
_fr->numStatusHistory() == 0) || (
_fr->floatParsFinal().empty()))) {
798 _name = _name(
strlen(
v->get()->ClassName()) + 2, _name.
Length());
806 :
v->get()->GetName());
808 }
else if (
v->get() && !
v->get<
TFile>() && !
TString(
v->GetName()).BeginsWith(
'/'))
810 if (
auto _type =
v->GetNodeType();
strlen(_type)) {
818 for (
size_t i = 0; i <
fv->dependents().
size(); i++) {
824 for (
size_t i = 0; i <
gv->dependents().
size(); i++) {
833 if (
auto o =
v->get(); o)
834 v->TNamed::SetNameTitle(o->GetName(), o->ClassName());
836 if (
auto o =
v->get(); o)
839 dynamic_cast<TQObject *
>(
b->GetBrowserImp())
840 ->Connect(
"Checked(TObject *, bool)",
ClassName(),
v.get(),
"Checked(TObject *, bool)");
843 if (
_fr->status() ||
_fr->covQual() != 3) {
844 v->GetTreeItem(
b)->SetColor((
_fr->numStatusHistory() && !
_fr->floatParsFinal().empty()) ?
kRed :
kBlue);
845 }
else if (
_fr->numStatusHistory() == 0) {
846 v->GetTreeItem(
b)->SetColor(
kGray);
849 if ((
v->fFolder ==
"!np" ||
v->fFolder ==
"!poi")) {
851 v->GetTreeItem(
b)->SetColor(
kGray);
853 v->GetTreeItem(
b)->ClearColor();
857 if (
auto fits =
_htr->GetFitInfo()) {
858 for (
int i = 0; i <
fits->numEntries(); i++) {
860 if (
fits->get(i)->getCatIndex(
"type") != 5 &&
fits->get(i)->getRealValue(
"status") != 0) {
861 v->GetTreeItem(
b)->SetColor(
kRed);
866 v->GetTreeItem(
b)->SetColor(
kBlue);
893 if (_name ==
".memory")
897 if (
auto o =
v->get(); o)
898 v->TNamed::SetNameTitle(o->GetName(), o->ClassName());
899 b->Add(
v.get(), _name, -1);
900 if (
auto o =
v->get(); o)
904 b->SetSelected(
this);
917 auto v = std::make_shared<xRooNode>(
vars());
928 if (
strcmp(
b->GetName(),
".vars") == 0)
951 if (
auto v = var();
v)
952 return v->getBinWidth(bin - 1, GetName());
957 if (
auto v = rvar();
v) {
958 return (bin ==
v->getBinning(GetName()).numBins() + 1) ?
v->getBinning(GetName()).binHigh(bin - 2)
959 :
v->getBinning(GetName()).binLow(bin - 1);
965 if (
auto v = rvar();
v)
966 return (bin == 0) ?
v->getBinning(GetName()).binLow(bin) :
v->getBinning(GetName()).binHigh(bin - 1);
972 return (binning() &&
strlen(binning()->GetTitle())) ? binning()->GetTitle() : GetParent()->GetTitle();
979 dynamic_cast<TNamed *
>(GetParent())->SetTitle(title);
983 void Set(
Int_t nbins,
const double *xbins)
override
986 v->setBinning(
RooBinning(nbins, xbins), GetName());
991 std::vector<double> bins(nbins + 1);
992 for (
int i = 0; i <= nbins; i++)
993 bins.at(i) = xbins[i];
994 return Set(nbins, &bins[0]);
1018 for (
auto &o : *
_owned) {
1019 if (
name == o->GetName()) {
1020 if (
type.empty() || o->get()->InheritsFrom(
type.c_str()))
1031 _parent = _parent->fParent;
1037 std::shared_ptr<TObject> out;
1038 if (
auto arg =
ws()->arg(
name.c_str()); arg) {
1039 auto _tmp = std::shared_ptr<TObject>(arg, [](
TObject *) {});
1040 if (!
type.empty() && arg->InheritsFrom(
type.c_str()))
1045 if (
auto arg =
ws()->
data(
name.c_str()); arg) {
1046 auto _tmp = std::shared_ptr<TObject>(arg, [](
TObject *) {});
1047 if (!
type.empty() && arg->InheritsFrom(
type.c_str()))
1052 if (
auto arg =
ws()->genobj(
name.c_str()); arg) {
1053 auto _tmp = std::shared_ptr<TObject>(arg, [](
TObject *) {});
1054 if (!
type.empty() && arg->InheritsFrom(
type.c_str()))
1059 if (
auto arg =
ws()->embeddedData(
name.c_str()); arg) {
1060 auto _tmp = std::shared_ptr<TObject>(arg, [](
TObject *) {});
1061 if (!
type.empty() && arg->InheritsFrom(
type.c_str()))
1067 auto _tmp = std::shared_ptr<TObject>(arg, [](
TObject *) {});
1068 if (!
type.empty() && arg->InheritsFrom(
type.c_str()))
1078 arg->treeNodeServerList(&nodes);
1091 cat && cat->numTypes() !=
fXAxis->GetNbins()) {
1107 if (
auto xName = o->getStringAttribute(
"xvar");
xName) {
1119 }
else if (
auto _obs =
obs(); !_obs.empty()) {
1120 for (
auto &
v : _obs) {
1156 TString binningName = o->getStringAttribute(
"binning");
1157 auto _bnames =
x->getBinningNames();
1158 bool hasBinning =
false;
1160 if (
b == binningName) {
1168 Warning(
"GetXaxis",
"Binning %s not defined on %s - clearing", binningName.
Data(),
1170 o->setStringAttribute(
"binning",
nullptr);
1174 if (binningName ==
"" && o !=
dynamic_cast<TObject *
>(
x)) {
1180 if (
b == o->GetName()) {
1181 binningName = o->GetName();
1185 if (binningName ==
"") {
1191 (std::list<double> *)(
nullptr),
1193 ? o->binBoundaries(*
dynamic_cast<RooAbsRealLValue *
>(
x), -std::numeric_limits<double>::infinity(),
1194 std::numeric_limits<double>::infinity())
1197 std::vector<double>
_bins;
1198 for (
auto &
b : *
bins) {
1206 _v->getBinning(o->GetName())
1211 binningName = o->GetName();
1222 if (
r->getBinning(binningName).isUniform()) {
1223 fXAxis = std::make_shared<Axis2>(
x->numBins(binningName),
r->getMin(binningName),
r->getMax(binningName));
1225 fXAxis = std::make_shared<Axis2>(
x->numBins(binningName),
r->getBinning(binningName).array());
1227 }
else if (
auto cat =
dynamic_cast<RooCategory *
>(
x)) {
1228 std::vector<double>
bins = {};
1229 for (
int i = 0; i <=
x->numBins(binningName); i++)
1231 fXAxis = std::make_shared<Axis2>(
x->numBins(binningName), &
bins[0]);
1234 std::map<int, std::string> cats;
1235 for (
auto &
c : *cat) {
1236 if (cat->isStateInRange(binningName,
c.first.c_str())) {
1237 cats[
c.second] =
c.first;
1240 for (
auto &[
_, label] : cats) {
1241 fXAxis->SetBinLabel(i++, label.c_str());
1246 fXAxis->SetName(binningName);
1253 if (
auto o =
get(); o) {
1254 if (o->InheritsFrom(
"RooWorkspace"))
1256 if (o->InheritsFrom(
"RooAbsData"))
1258 if (o->InheritsFrom(
"RooSimultaneous"))
1261 if (o->InheritsFrom(
"RooProdPdf"))
1263 if (o->InheritsFrom(
"RooRealSumPdf") || o->InheritsFrom(
"RooAddPdf"))
1266 if (o->InheritsFrom(
"RooFitResult")) {
1267 if (!
gClient->GetMimeTypeList()->GetIcon(
"xRooFitRooFitResult",
true)) {
1268 gClient->GetMimeTypeList()->AddType(
"xRooFitRooFitResult",
"xRooFitRooFitResult",
"package.xpm",
1269 "package.xpm",
"->Browse()");
1271 return "xRooFitRooFitResult";
1273 if (o->InheritsFrom(
"RooRealVar") || o->InheritsFrom(
"RooCategory")) {
1275 if (!
gClient->GetMimeTypeList()->GetIcon(
"xRooFitObs",
true)) {
1276 gClient->GetMimeTypeList()->AddType(
"xRooFitObs",
"xRooFitObs",
"x_pic.xpm",
"x_pic.xpm",
"->Browse()");
1278 if (!
gClient->GetMimeTypeList()->GetIcon(
"xRooFitGlobs",
true)) {
1279 gClient->GetMimeTypeList()->AddType(
"xRooFitGlobs",
"xRooFitGlobs",
"z_pic.xpm",
"z_pic.xpm",
1282 return (
get<RooAbsArg>()->getAttribute(
"global") ?
"xRooFitGlobs" :
"xRooFitObs");
1286 if (o->InheritsFrom(
"TStyle")) {
1287 if (!
gClient->GetMimeTypeList()->GetIcon(
"xRooFitTStyle",
true)) {
1288 gClient->GetMimeTypeList()->AddType(
"xRooFitTStyle",
"xRooFitTStyle",
"bld_colorselect.xpm",
1289 "bld_colorselect.xpm",
"->Browse()");
1291 return "xRooFitTStyle";
1293 if (o->InheritsFrom(
"RooConstVar")) {
1299 return "TMethodBrowsable-leaf";
1301 if (o->InheritsFrom(
"RooStats::HypoTestInverterResult")) {
1302 if (!
gClient->GetMimeTypeList()->GetIcon(
"xRooFitScanStyle",
true)) {
1303 gClient->GetMimeTypeList()->AddType(
"xRooFitScanStyle",
"xRooFitScanStyle",
"f2_s.xpm",
"f2_s.xpm",
1306 return "xRooFitScanStyle";
1308 if (o->InheritsFrom(
"RooStats::HypoTestResult")) {
1309 if (!
gClient->GetMimeTypeList()->GetIcon(
"xRooFitTestStyle",
true)) {
1310 gClient->GetMimeTypeList()->AddType(
"xRooFitTestStyle",
"xRooFitTestStyle",
"diamond.xpm",
"diamond.xpm",
1313 return "xRooFitTestStyle";
1315 if (o->InheritsFrom(
"RooStats::HistFactory::FlexibleInterpVar"))
1316 return "TBranchElement-folder";
1317 if (o->InheritsFrom(
"RooAbsPdf")) {
1318 if (!
gClient->GetMimeTypeList()->GetIcon(
"xRooFitPDFStyle",
true)) {
1319 gClient->GetMimeTypeList()->AddType(
"xRooFitPDFStyle",
"xRooFitPDFStyle",
"pdf.xpm",
"pdf.xpm",
1322 return "xRooFitPDFStyle";
1324 if (o->InheritsFrom(
"RooStats::ModelConfig")) {
1325 if (!
gClient->GetMimeTypeList()->GetIcon(
"xRooFitMCStyle",
true)) {
1326 gClient->GetMimeTypeList()->AddType(
"xRooFitMCStyle",
"xRooFitMCStyle",
"app_t.xpm",
"app_t.xpm",
1329 return "xRooFitMCStyle";
1333 _ax && (
a->isBinnedDistribution(*
dynamic_cast<RooAbsArg *
>(_ax->GetParent())) ||
1335 std::unique_ptr<std::list<double>>(
a->binBoundaries(
1336 *
dynamic_cast<RooAbsRealLValue *
>(_ax->GetParent()), -std::numeric_limits<double>::infinity(),
1337 std::numeric_limits<double>::infinity()))))) {
1342 return o->ClassName();
1353 if (o->InheritsFrom(
"RooStats::HistFactory::FlexibleInterpVar"))
1355 if (o->InheritsFrom(
"PiecewiseInterpolation")) {
1367 return (
dynamic_cast<RooAbsArg *
>(o)->getAttribute(
"density")) ?
"VariedDensity" :
"Varied";
1370 if (o->InheritsFrom(
"RooHistFunc"))
1371 return (
dynamic_cast<RooAbsArg *
>(o)->getAttribute(
"density")) ?
"SimpleDensity" :
"Simple";
1372 if (o->InheritsFrom(
"RooBinWidthFunction"))
1374 if (o->InheritsFrom(
"ParamHistFunc"))
1376 if (o->InheritsFrom(
"RooRealVar"))
1378 if (o->InheritsFrom(
"RooConstVar"))
1386 xRooNode out(
".coords",
nullptr, *
this);
1388 auto _p = std::shared_ptr<xRooNode>(
const_cast<xRooNode *
>(
this), [](
xRooNode *) {});
1418 if (
auto pos =
pName.Index(
'='); pos != -1) {
1419 if (pos > 0 &&
pName(pos - 1) ==
'<') {
1427 _obs->setVal((high + low) / 2.);
1428 static_cast<RooRealVar *
>(_obs.get())->setRange(
"coordRange", low, high);
1430 "coordRange",
"coordRange");
1432 out.emplace_back(std::make_shared<xRooNode>(_obs->GetName(), _obs, _p));
1437 }
else if (
auto _obs = _p->getObject<
RooAbsArg>(
pName(0, pos)); _obs) {
1440 _cat->setLabel(
pName(pos + 1,
pName.Length()));
1441 }
else if (
auto _var =
dynamic_cast<RooAbsRealLValue *
>(_obs.get()); _var) {
1445 out.emplace_back(std::make_shared<xRooNode>(_obs->GetName(), _obs, _p));
1447 throw std::runtime_error(
"Unknown observable, could not find");
1459 }
catch (
const std::exception &
e) {
1468 }
catch (
const std::exception &
e) {
1495 pdf =
p->pdfList().find(
child.GetName());
1498 auto i =
p->pdfList().index(*pdf);
1500#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
1501 const_cast<RooArgList &
>(
p->pdfList()).remove(*pdf);
1502#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 26, 00)
1503 p->_pdfNSetList.erase(
p->_pdfNSetList.
begin() + i);
1505 auto nset =
p->_pdfNSetList.At(i);
1506 p->_pdfNSetList.Remove(nset);
1509 if (
p->_extendedIndex == i)
1510 p->_extendedIndex = -1;
1511 else if (
p->_extendedIndex > i)
1512 p->_extendedIndex--;
1524 arg =
p2->components().find(
child.GetName());
1528#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
1529 p2->_compRSet.remove(*arg);
1531 const_cast<RooArgList &
>(
p2->realComponents()).remove(*arg);
1533 p2->removeServer(*arg,
true);
1543 }
catch (std::runtime_error &) {
1553 arg =
p4->funcList().find(
child.GetName());
1557 auto idx =
p4->funcList().index(arg);
1562 p4->removeServer(*arg,
true);
1564 std::vector<RooAbsArg *>
_coefs;
1566 if (
ii !=
size_t(idx))
1581 arg =
p5->pdfList().find(
child.GetName());
1585 auto idx =
p5->pdfList().index(arg);
1590 p5->removeServer(*arg,
true);
1592 std::vector<RooAbsArg *>
_coefs;
1594 if (
ii !=
size_t(idx))
1609 arg =
p6->list().find(
child.GetName());
1614 p6->removeServer(*arg,
true);
1622 auto arg =
w->components().find(
child.GetName());
1629 if (arg->hasClients()) {
1630 throw std::runtime_error(
1631 TString::Format(
"Cannot remove %s from workspace %s, because it has dependencies - first remove from those",
1634 const_cast<RooArgSet &
>(
w->components()).remove(*arg);
1635 Info(
"Remove",
"Deleted %s from workspace %s", out.GetName(),
GetName());
1643 throw std::runtime_error(
"Removal not implemented for object type " +
1693 out->setAttribute(
"obs");
1694 out->setAttribute(
"global");
1697 throw std::runtime_error(
"Failed to add global observable");
1701 out->setAttribute(
"poi");
1709 throw std::runtime_error(
"Failed to add parameter of interest");
1713 if (!
fac.Contains(
"[") && !
fac.Contains(
"("))
1719 if (
find(_data->GetName())) {
1720 throw std::runtime_error(
TString::Format(
"Cannot add dataset %s, already exists for %s. If intending to "
1721 "combine datasets, please add directly to dataset",
1731 throw std::runtime_error(
1732 "Datasets can only be created for pdfs or workspaces (except if generated dataset, then must be pdf)");
1735 if (
sOpt ==
"asimov" ||
sOpt ==
"toy") {
1753 }
else if (!_ws->obj(
_fr->GetName())) {
1762 std::unique_ptr<RooAbsCollection>
_globs(_obs.selectByAttrib(
"global",
true));
1770 _obs.add(*
dynamic_cast<RooAbsArg *
>(
ax->GetParent()));
1773 if (
auto _d = _ws->data(
child.GetName()); _d) {
1776 l.remove(*_d->get(),
true,
true);
1780 throw std::runtime_error(
"Cannot extend dataset with new columns");
1791 if (
auto __d = _ws->data(
child.GetName()))
1792 __d->SetBit(1 << 20, _ws->allData().size() == 1);
1800 auto out = std::shared_ptr<TObject>(_ws->data(
child.GetName()), [](
TObject *) {});
1809 throw std::runtime_error(
"Cannot create dataset");
1814 throw std::runtime_error(
"Cannot add to null object with no parentage");
1816 auto _ref = emplace_back(std::shared_ptr<xRooNode>(&
const_cast<xRooNode &
>(
child), [](
TObject *) {}));
1821 std::rethrow_exception(std::current_exception());
1826 throw std::runtime_error(
"No object");
1836 throw std::runtime_error(
"Can only add datasets to a dataset");
1845 }
else if (
g->GetContent() !=
glob->GetContent()) {
1846 Warning(
"Add",
"Global observable %s=%g in dataset %s mismatches %s value %g ... ignoring latter",
1851 if (
auto _dglobs =
p->getGlobalObservables()) {
1861 std::set<std::pair<RooAbsCategory *, RooCategory *>> cats;
1863 for (
auto col : *_data->get()) {
1864 if (!
p->get()->contains(*col)) {
1865 ds->addColumn(*col);
1870 throw std::runtime_error(
1871 TString::Format(
"unexpected type for regular observable: %s", col->GetName()));
1884 cats.insert({
c,
c2});
1891 for (
int i = 0; i < _data->numEntries(); i++) {
1892 auto row = _data->get(i);
1893 auto w = _data->weight();
1894 ds->get()->assign(*row);
1895 for (
auto [
c,
c2] : cats) {
1896 c2->setLabel(row->getCatLabel(
c->GetName()));
1898 ds->add(*
ds->get(),
w);
1902 ds->SetTitle(
TString(
ds->GetTitle()) +
" + " + _data->GetTitle());
1908 throw std::runtime_error(
"Can only add histogram or dataset to data");
1912 throw std::runtime_error(
"Could not find pdf");
1913 auto _ax = _pdf->GetXaxis();
1915 throw std::runtime_error(
"Cannot determine binning to add data");
1924 l.remove(*
p->get(),
true,
true);
1928 throw std::runtime_error(
"Cannot extend dataset with new columns");
1935 for (
auto &o :
obs) {
1937 if (
auto dv =
dynamic_cast<RooRealVar *
>(
p->get()->find(
v->GetName()));
dv) {
1938 if (
v->getMin() <
dv->getMin())
1939 dv->setMin(
v->getMin());
1940 if (
v->getMax() >
dv->getMax())
1941 dv->setMax(
v->getMax());
1954 for (
int i = 1; i <=
_h->GetNbinsX(); i++) {
1956 if (!
_h->GetXaxis()->GetBinLabel(i)) {
1957 throw std::runtime_error(
1958 TString::Format(
"Categorical observable %s requires bin labels", _ax->GetParent()->GetName()));
1959 }
else if (!cat->hasLabel(
_h->GetXaxis()->GetBinLabel(i))) {
1960 throw std::runtime_error(
TString::Format(
"Categorical observable %s does not have label %s",
1961 _ax->GetParent()->GetName(),
_h->GetXaxis()->GetBinLabel(i)));
1963 cat->setLabel(
_h->GetXaxis()->GetBinLabel(i));
1968 p->add(
obs,
_h->GetBinContent(i));
1978 auto _pdf = std::dynamic_pointer_cast<RooAbsPdf>(out);
1980 throw std::runtime_error(
"Something went wrong with pdf acquisition");
1987 if (
auto _boundaries = std::unique_ptr<std::list<double>>(_p->binBoundaries(
1988 *
dynamic_cast<RooAbsRealLValue *
>(_ax->GetParent()), -std::numeric_limits<double>::infinity(),
1989 std::numeric_limits<double>::infinity()));
1990 !_boundaries && _ax->GetNbins() > 0) {
1991#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 24, 00)
1992 Warning(
"Add",
"Adding unbinned pdf %s to binned %s - will wrap with RooBinSamplingPdf(...)",
1996 _p->setStringAttribute(
"alias", std::dynamic_pointer_cast<RooAbsArg>(out)->getStringAttribute(
"alias"));
1997 if (!_p->getStringAttribute(
"alias"))
1998 _p->setStringAttribute(
"alias", out->GetName());
2000 throw std::runtime_error(
2001 "unsupported addition of unbinned pdf to binned model - please upgrade to at least ROOT 6.24");
2007 if (!(_pdf->canBeExtended() &&
p->coefList().empty())) {
2011 if (_pdf->canBeExtended()) {
2013 std::cout <<
" warning " << _pdf->GetName() <<
" wont be correctly normalized" << std::endl;
2023 for (
auto i =
p->coefList().size(); i <
p->pdfList().size(); i++) {
2028 *
static_cast<RooAbsPdf *
>(
p->pdfList().at(i))));
2034 *
reinterpret_cast<bool *
>(
reinterpret_cast<unsigned char *
>(
p) +
2035 p->Class()->GetDataMemberOffset(
"_allExtendable")) =
false;
2036 *
reinterpret_cast<bool *
>(
reinterpret_cast<unsigned char *
>(
p) +
2037 p->Class()->GetDataMemberOffset(
"_haveLastCoef")) =
true;
2039 const_cast<RooArgList &
>(
p->pdfList()).add(*_pdf);
2071 std::shared_ptr<TObject> out;
2076 if (std::dynamic_pointer_cast<TH1>(
cc) && !
TString(
cc->GetOption()).
Contains(
"nostyle")) {
2081 Info(
"Add",
"Adding existing function %s to %s",
child.GetName(),
p->GetName());
2085 if (!out && !
child.fComp) {
2087 std::shared_ptr<RooAbsArg> _func;
2096 std::make_unique<TH1D>(
child.GetName(),
child.GetTitle(), _ax->GetNbins(), _ax->binning()->array());
2097 h->GetXaxis()->SetName(
TString::Format(
"%s;%s", _ax->GetParent()->GetName(), _ax->GetName()));
2099 _func = std::dynamic_pointer_cast<RooAbsArg>(
acquire(
xRooNode(*h).convertForAcquisition(*
this)));
2100 }
else if (_obs.size() == 1) {
2103 auto _bnames = _x->getBinningNames();
2104 TString binningName =
p->getStringAttribute(
"binning");
2106 if (
b ==
p->GetName()) {
2107 binningName =
p->GetName();
2111 auto h = std::make_unique<TH1D>(
child.GetName(),
child.GetTitle(), _x->numBins(binningName),
2112 _x->getBinningPtr(binningName)->array());
2113 h->GetXaxis()->SetName(
2116 _func = std::dynamic_pointer_cast<RooAbsArg>(
acquire(
xRooNode(*h).convertForAcquisition(*
this)));
2117 Info(
"Add",
"Created SimpleDensity factor %s (xaxis=%s) for %s", _func->GetName(), _obs.at(0)->GetName(),
2120 throw std::runtime_error(
"Unsupported creation of new component in SumPdf for this many obs");
2126 _func->setStringAttribute(
"alias",
child.GetName());
2130 if (
auto _f = std::dynamic_pointer_cast<RooHistFunc>(
2134 _f->setAttribute(
"density");
2135 if (
_f->getAttribute(
"autodensity")) {
2137 for (
int i = 0; i <
_f->dataHist().numEntries(); i++) {
2141 _f->setAttribute(
"autodensity",
false);
2142 _f->setValueDirty();
2151 Info(
"Add",
"Created %s factor RooHistFunc::%s for %s",
2152 _f->getAttribute(
"density") ?
"SimpleDensity" :
"Simple",
_f->GetName(),
p->GetName());
2156 if (
auto _p = std::dynamic_pointer_cast<RooAbsPdf>(out); _p) {
2161 newName.ReplaceAll(
"_samples",
"");
2163 Warning(
"Add",
"converting samples to components");
2168 if (
auto _boundaries = std::unique_ptr<std::list<double>>(_p->binBoundaries(
2169 *
dynamic_cast<RooAbsRealLValue *
>(_ax->GetParent()), -std::numeric_limits<double>::infinity(),
2170 std::numeric_limits<double>::infinity()));
2171 !_boundaries && _ax->GetNbins() > 0) {
2172#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 24, 00)
2173 Warning(
"Add",
"Adding unbinned pdf %s to binned %s - will wrap with RooBinSamplingPdf(...)",
2177 _p->setStringAttribute(
"alias", std::dynamic_pointer_cast<RooAbsArg>(out)->getStringAttribute(
"alias"));
2178 if (!_p->getStringAttribute(
"alias"))
2179 _p->setStringAttribute(
"alias", out->GetName());
2181 throw std::runtime_error(
2182 "unsupported addition of unbinned pdf to binned model - please upgrade to at least ROOT 6.24");
2189 if (!_p->canBeExtended()) {
2198 if (
auto _f = std::dynamic_pointer_cast<RooAbsReal>(out);
_f) {
2205 _f->dependsOn(*
static_cast<RooAbsArg *
>(_ax->GetParent()))) {
2207 if (
auto _boundaries = std::unique_ptr<std::list<double>>(
_f->binBoundaries(
2208 *
dynamic_cast<RooAbsRealLValue *
>(_ax->GetParent()), -std::numeric_limits<double>::infinity(),
2209 std::numeric_limits<double>::infinity()));
2210 !_boundaries && _ax->GetNbins() > 0) {
2211#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 24, 00)
2214 "Adding unbinned function %s to binned %s - will wrap with RooRealSumPdf(RooBinSamplingPdf(...))",
2218 sumPdf->setStringAttribute(
"alias",
_f->getStringAttribute(
"alias"));
2219 if (!sumPdf->getStringAttribute(
"alias"))
2220 sumPdf->setStringAttribute(
"alias", out->GetName());
2223 _f->setStringAttribute(
"alias", std::dynamic_pointer_cast<RooAbsArg>(out)->getStringAttribute(
"alias"));
2224 if (!
_f->getStringAttribute(
"alias"))
2225 _f->setStringAttribute(
"alias", out->GetName());
2227 throw std::runtime_error(
2228 "unsupported addition of unbinned function to binned model - please upgrade to at least ROOT 6.24");
2236 if (!
p->getStringAttribute(
"binning"))
2237 p->setStringAttribute(
"binning",
_f->getStringAttribute(
"binning"));
2240 if (
auto gf =
p->getStringAttribute(
"global_factors");
gf) {
2245 throw std::runtime_error(
TString::Format(
"Could not find global factor %s", pattern.
Data()));
2254 p->setStringAttribute(
"xvar",
nullptr);
2280 auto out = this->
operator[](
"components")->Add(child);
2299 for (
auto &
_pdfa :
pp->components()) {
2317 auto out = this->
operator[](
"samples")->Add(child);
2320 p2->setStringAttribute(
"xvar",
nullptr);
2333 child.convertForAcquisition(
2334 *
this,
child.get() ?
"" :
"func" );
2338 if (!
w->import(*_d)) {
2341 std::unique_ptr<RooAbsCollection>(
w->allVars().selectCommon(*_d->get()))->setAttribAll(
"obs");
2343 if (_d->getGlobalObservables()) {
2344 std::unique_ptr<RooAbsCollection>
globs(
w->allVars().selectCommon(*_d->getGlobalObservables()));
2345 globs->setAttribAll(
"obs");
2346 globs->setAttribAll(
"global");
2350 throw std::runtime_error(
2361 if (!
child.empty() ||
child.fFolder ==
"!pdfs") {
2364 std::string
catName =
"channelCat";
2365 if (!
child.empty()) {
2371 _cat->setAttribute(
"obs");
2373 Info(
"Add",
"Created pdf RooSimultaneous::%s in workspace %s", out->GetName(),
w->GetName());
2377 if (
coll->isOwning()) {
2379 }
else if (
child.ws() !=
ws()) {
2387 if (
sOpt ==
"pdf") {
2393 }
else if (
sOpt ==
"channel") {
2398 std::shared_ptr<TObject> out;
2399 child.convertForAcquisition(*
this);
2402 }
else if (!
child.fComp) {
2405 Info(
"Add",
"Created channel RooProdPdf::%s in workspace %s", out->GetName(),
get()->
GetName());
2409 }
else if (
sOpt ==
"sample" ||
sOpt ==
"func") {
2415 return (*
this)[
"samples"]->Add(
child,
sOpt ==
"func" ?
"func" :
"");
2418 }
else if (
sOpt ==
"dataset") {
2421 return (*this).datasets().Add(
child);
2479 a->setAttribute(
"hidden", set);
2490 return a->getAttribute(
"hidden");
2497 if (
get() ==
rhs.get()) {
2509 std::set<std::string>
pdfs;
2510 for (
auto &
c :
rhs.components()) {
2511 if ((*
this)[
"pdfs"]->find(
c->GetName())) {
2512 pdfs.insert(
c->GetName());
2516 Warning(
"Combine",
"No pdfs will be combined. Please check and/or rename pdfs to match");
2518 std::stringstream s;
2519 for (
auto &
p :
pdfs)
2521 Info(
"Combine",
"pdfs that will be combined: %s", s.str().c_str());
2524 std::set<std::string>
_np;
2526 for (
auto &
c :
rhs.np()) {
2527 if (
mynp.find(
c->GetName())) {
2528 _np.insert(
c->GetName());
2532 Warning(
"Combine",
"No correlated np");
2534 std::stringstream s;
2537 Info(
"Combine",
"np that will be shared (correlated): %s", s.str().c_str());
2539 std::set<std::string> _poi;
2541 for (
auto &
c :
rhs.poi()) {
2542 if (
mypoi.find(
c->GetName())) {
2543 _poi.insert(
c->GetName());
2547 Warning(
"Combine",
"No correlated poi");
2549 std::stringstream s;
2550 for (
auto &
p : _poi)
2552 Info(
"Combine",
"poi that will be shared (correlated): %s", s.str().c_str());
2569 for (
auto &
c :
rhs.components()) {
2571 (
c->fFolder ==
"!scratch" ||
c->fFolder ==
"!sets" ||
c->fFolder ==
"!snapshots" ||
c->fFolder ==
"!models"))
2575 Info(
"Combine",
"Combining %s into %s",
c->GetPath().c_str(), _c->GetPath().c_str());
2577 _c->Combine(*
c,
true);
2581 Info(
"Combine",
"Adding %s into %s",
c->GetPath().c_str(),
GetPath().c_str());
2584 }
catch (std::exception &
e) {
2585 Warning(
"Combine",
"Could not combine %s into %s",
c->GetPath().c_str(),
GetPath().c_str());
2591 for (
auto &
f :
rhs.factors()) {
2594 Info(
"Combine",
"Combining %s into %s",
f->GetPath().c_str(),
_f->GetPath().c_str());
2596 _f->Combine(*
f,
true);
2599 Info(
"Combine",
"Multiplying %s into %s",
f->GetPath().c_str(),
GetPath().c_str());
2607 for (
auto &
c :
rhs.components()) {
2608 if (
c->fFolder ==
"!sets") {
2610 Info(
"Combine",
"Extending set %s",
c->GetName());
2613 Info(
"Combine",
"Defining set %s",
c->GetName());
2620 for (
auto &
ds :
rhs.datasets()) {
2623 Info(
"Combine",
"Combining %s into %s",
ds->GetPath().c_str(),
_ds->GetPath().c_str());
2628 Info(
"Combine",
"Adding %s into %s",
ds->GetPath().c_str(),
GetPath().c_str());
2635 for (
auto &
v :
rhs.variations()) {
2638 Info(
"Combine",
"Combining variation %s into %s",
v->GetPath().c_str(),
_v->GetPath().c_str());
2640 _v->Combine(*
v,
true);
2643 Info(
"Combine",
"Varying %s into %s",
v->GetPath().c_str(),
GetPath().c_str());
2651 for (
auto &
b :
rhs.bins()) {
2653 Info(
"Combine",
"Combining %s into %s",
b->GetPath().c_str(),
_b->GetPath().c_str());
2654 _b->Combine(*
b,
true);
2656 Info(
"Combine",
"Extending with %s into %s",
b->GetPath().c_str(),
GetPath().c_str());
2682 if (!
chans.empty()) {
2693 c->shallowCopy(
name +
"_" +
c->get()->GetName(), std::shared_ptr<xRooNode>(&out, [](
xRooNode *) {}));
2699 }
else if (
auto p =
dynamic_cast<RooProdPdf *
>(o);
p) {
2701 std::shared_ptr<RooProdPdf> pdf =
2702 std::dynamic_pointer_cast<RooProdPdf>(out.acquire(std::shared_ptr<TObject>(
p->Clone()),
false,
2707 std::dynamic_pointer_cast<RooAbsArg>(out.acquire(std::shared_ptr<TObject>(
main->Clone()),
false,
true));
2723 static std::unique_ptr<cout_redirect>
capture;
2733 if (
sOpt.Contains(
"depth=")) {
2738 if (
sOpt.Contains(
"indent=")) {
2744 sOpt.Replace(
sOpt.Index(
"m"), 1,
"");
2750 if (
get() &&
get() !=
this) {
2755 auto _snap = std::unique_ptr<RooAbsCollection>(
_deps.snapshot());
2759 std::cout <<
"Minimization Logs:" << std::endl;
2760 std::cout << dynamic_cast<RooStringVar *>(
_fr->constPars().find(
".log"))->getVal() << std::endl;
2774 for (
size_t i = 0; i <
fv->dependents().
size(); i++) {
2780 for (
size_t i = 0; i <
gv->dependents().
size(); i++) {
2788 }
else if (!
get()) {
2789 std::cout << std::endl;
2793 std::vector<std::string> folderNames;
2794 for (
auto &k : *
this) {
2795 if (std::find(folderNames.begin(), folderNames.end(), k->fFolder) == folderNames.end()) {
2796 folderNames.push_back(k->fFolder);
2799 for (
auto &
f : folderNames) {
2805 std::cout <<
f << std::endl;
2808 for (
auto &k : *
this) {
2809 if (k->fFolder !=
f) {
2815 std::cout << i++ <<
") " << k->GetName() <<
" : ";
2819 auto _deps = k->coords(
false).argList();
2820 auto _snap = std::unique_ptr<RooAbsCollection>(
_deps.snapshot());
2822 k->get()->Print(
sOpt);
2826 if (
auto _type = k->GetNodeType();
strlen(_type)) {
2834 for (
size_t j = 0;
j <
fv->dependents().
size();
j++) {
2840 for (
size_t j = 0;
j <
gv->dependents().
size();
j++) {
2845 std::cout << k->get()->ClassName() <<
"::" << k->get()->GetName() <<
_suffix.Data() << std::endl;
2851 std::cout <<
" NULL " << std::endl;
2859 for (
size_t i = 0; i <
captureStr.size(); i++) {
2870 (
gROOT->GetListOfBrowsers()->At(0))
2885 double mean = std::numeric_limits<double>::quiet_NaN();
2886 double sigma = mean;
2895 mean = std::numeric_limits<double>::quiet_NaN();
2906 throw std::runtime_error(
"No error on parameter for gaussian constraint");
2912 throw std::runtime_error(
"No error on parameter for poisson constraint");
2914 sigma = pow(
v->getVal() /
v->getError(), 2);
2922 (
v->getVal() + 5 *
v->getError()) *
tau_val);
2923 globs->setConstant();
2924 globs->setAttribute(
"obs");
2925 globs->setAttribute(
"global");
2938 Info(
"Constrain",
"Added poisson constraint pdf RooPoisson::%s (tau=%g) for %s", out->GetName(),
tau_val,
2945 globs->setAttribute(
"obs");
2946 globs->setAttribute(
"global");
2947 globs->setConstant();
2956 Info(
"Constrain",
"Added gaussian constraint pdf RooGaussian::%s (mean=%g,sigma=%g) for %s", out->GetName(),
2965 throw std::runtime_error(
"Cannot constrain non arg");
2968 if (!
p->dependsOn(*
_me)) {
2969 throw std::runtime_error(
"Constraint does not depend on constrainee");
2978 throw std::runtime_error(
"Nowhere to put constraint");
2983 for (
auto d :
x->datasets()) {
2993 if (k ==
"globalObservables" ||
TString(k).
EndsWith(
"_GlobalObservables")) {
3002 for (
auto &
c : *
x) {
3008 return x->Multiply(
child);
3010 return x->Add(
child,
"+");
3033 auto o = std::dynamic_pointer_cast<RooAbsReal>(
acquire(
child.fComp));
3056 ?
fParent->mainChild()->GetName()
3063 throw std::runtime_error(
3083#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
3090 for (std::size_t i = 0; i <
pSet.size(); i++) {
3100 _bin->fBinNumber = -1;
3129 auto _ref = emplace_back(std::shared_ptr<xRooNode>(&
const_cast<xRooNode &
>(
child), [](
TObject *) {}));
3134 std::rethrow_exception(std::current_exception());
3146 Info(
"Multiply",
"Scaled %s by existing factor %s::%s",
3150 }
else if (
sOpt ==
"const") {
3153 Info(
"Multiply",
"Scaled %s by new const factor %s",
3157 }
else if (
sOpt ==
"norm") {
3164 Info(
"Multiply",
"Scaled %s by new norm factor %s",
3169 throw std::runtime_error(
TString::Format(
"Failed to create new normFactor %s",
child.GetName()));
3173 Info(
"Multiply",
"Scaled %s by new norm factor %s",
3177 }
else if (
sOpt ==
"shape" ||
sOpt ==
"simple" ||
sOpt ==
"blankshape") {
3182 for (
int i = 1; i <=
h->GetNbinsX(); i++) {
3183 h->SetBinContent(i, 1);
3188 h->SetTitle(
child.GetTitle());
3189 if (
sOpt.Contains(
"shape"))
3193 Info(
"Multiply",
"Scaled %s by new %s factor %s",
3198 }
else if (
sOpt ==
"overall") {
3200 child.GetName(),
child.GetTitle(),
RooArgList(), 1, std::vector<double>(), std::vector<double>()));
3202 Info(
"Multiply",
"Scaled %s by new overall factor %s",
3206 }
else if (
sOpt ==
"func" &&
ws()) {
3211 Info(
"Multiply",
"Scaled %s by new func factor %s",
3224 std::shared_ptr<TObject> out;
3225 child.convertForAcquisition(*
this);
3236 if (
p->coefList().empty() && !
p->pdfList().empty()) {
3237 for (
auto _pdf :
p->pdfList()) {
3243 Info(
"Multiply",
"Created RooExtendedBinding coefficients for all pdfs of %s so that can multiply coef",
3245 *
reinterpret_cast<bool *
>(
reinterpret_cast<unsigned char *
>(
p) +
3246 p->Class()->GetDataMemberOffset(
"_allExtendable")) =
false;
3247 *
reinterpret_cast<bool *
>(
reinterpret_cast<unsigned char *
>(
p) +
3248 p->Class()->GetDataMemberOffset(
"_haveLastCoef")) =
true;
3250 for (
size_t i = 0; i <
p->pdfList().size(); i++) {
3252 auto coefs =
p->coefList().at(i);
3261 for (
size_t j = 0;
j <
p->coefList().size();
j++) {
3268 const_cast<RooArgList &
>(
p->coefList()).removeAll();
3278 for (
size_t i = 0; i <
p2->funcList().
size(); i++) {
3280 auto coefs =
p2->coefList().at(i);
3289 for (
size_t j = 0;
j <
p2->coefList().size();
j++) {
3304 throw std::runtime_error(
"this coefs case is not supported");
3308 std::shared_ptr<TObject> out;
3315 if (
auto _f = std::dynamic_pointer_cast<RooHistFunc>(
3317 _f &&
_f->getAttribute(
"autodensity")) {
3327 if (
_f->getAttribute(
"density")) {
3330 for (
int i = 0; i <
_f->dataHist().numEntries(); i++) {
3334 _f->setValueDirty();
3341 _f->setAttribute(
"autodensity",
false);
3345 Info(
"Multiply",
"Created %s factor %s in %s",
3349 Info(
"Multiply",
"Created Shape factor %s in %s",
child->GetName(),
p->GetName());
3352 if (
auto _f = std::dynamic_pointer_cast<RooAbsReal>(out);
_f) {
3353#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
3354 p->_compRSet.add(*
_f);
3362 for (
auto &_par :
_out.pars()) {
3365 for (
auto &
_constr : _par->constraints()) {
3373 Info(
"Multiply",
"Pulling in %s boundConstraint: %s", _par->GetName(), s);
3376 throw std::runtime_error(
"Couldn't find boundConstraint");
3378 _par->Constrain(_pdf);
3387 std::shared_ptr<TObject> out;
3388 child.convertForAcquisition(*
this);
3397 std::shared_ptr<RooAbsPdf> _pdf;
3414 _pdf->setStringAttribute(
"alias",
child.GetName());
3416 _pdf->setStringAttribute(
"xvar",
p2->getStringAttribute(
"xvar"));
3417 _pdf->setStringAttribute(
"binning",
p2->getStringAttribute(
"binning"));
3419 Info(
"Multiply",
"Created %s::%s in channel %s", _pdf->ClassName(), _pdf->GetName(),
p2->GetName());
3424 if (
auto _pdf = std::dynamic_pointer_cast<RooAbsPdf>(out); _pdf) {
3425#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
3427#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 26, 00)
3428 p2->_pdfNSetList.emplace_back(std::make_unique<RooArgSet>(
"nset"));
3432 if (!
p2->canBeExtended() && _pdf->canBeExtended()) {
3433 p2->_extendedIndex =
p2->_pdfList.size() - 1;
3444 std::shared_ptr<TObject> out;
3445 child.convertForAcquisition(*
this);
3451 TString s =
p3->getStringAttribute(
"global_factors");
3454 s += out->GetName();
3455 p3->setStringAttribute(
"global_factors", s);
3458 "Flagged %s as a global factor in channel %s (is applied to all current and future samples in the channel)",
3459 out->GetName(),
p3->GetName());
3470 std::set<RooAbsArg *> cl;
3471 for (
auto &arg :
p5->clients()) {
3477 if (cl.size() > 1) {
3482 Warning(
"Multiply",
"Scaling %s that has multiple clients",
p5->GetName());
3488 for (
auto &
a :
p5->attributes())
3489 new_p->setAttribute(
a.c_str());
3490 for (
auto &
a :
p5->stringAttributes())
3491 new_p->setStringAttribute(
a.first.c_str(),
a.second.c_str());
3492 if (!
new_p->getStringAttribute(
"alias"))
3493 new_p->setStringAttribute(
"alias",
p5->GetName());
3496 for (
auto arg : cl) {
3508 throw std::runtime_error(
3510 (!
child.get() &&
strlen(opt) == 0) ?
" (forgot to specify factor type?)" :
""));
3518 throw std::runtime_error(
"Only replacement of RooAbsArg is supported");
3527 new_p = std::dynamic_pointer_cast<RooAbsArg>(out).get();
3529 std::set<RooAbsArg *> cl;
3530 for (
auto &arg :
p5->clients()) {
3538 if (cl.size() > 1) {
3546 Warning(
"Replace",
"Replacing %s in all clients: %s",
p5->GetName(),
clientList.str().c_str());
3550 new_p->setAttribute(
Form(
"ORIGNAME:%s",
p5->GetName()));
3551 for (
auto arg : cl) {
3575 auto _ref = emplace_back(std::shared_ptr<xRooNode>(&
const_cast<xRooNode &
>(
child), [](
TObject *) {}));
3580 std::rethrow_exception(std::current_exception());
3592 std::string label =
child.GetName();
3593 if (
auto pos = label.find(
'='); pos != std::string::npos)
3594 label = label.substr(pos + 1);
3595 if (!s->indexCat().hasLabel(label)) {
3600 if (
auto bb =
_ds->getBrowsable(
".sourceds")) {
3605 throw std::runtime_error(
TString::Format(
"Failed to find %s regular observable in %s dataset",
3606 s->indexCat().GetName(),
_ds->GetName()));
3608 dsCat->defineType(label.c_str());
3614 std::shared_ptr<TObject> out;
3615 child.convertForAcquisition(*
this);
3618 }
else if (!
child.fComp) {
3621 Info(
"Vary",
"Created channel RooProdPdf::%s in model %s", out->GetName(), s->GetName());
3624 if (
auto _pdf = std::dynamic_pointer_cast<RooAbsPdf>(out); _pdf) {
3629 if (
auto bb =
_ds->getBrowsable(
".sourceds")) {
3638 _pdf->leafNodeServerList(&
leafs);
3639 std::unique_ptr<RooAbsCollection>
globals(
leafs.selectByAttrib(
"global",
true));
3643 globs.addClone(*
_ds->getGlobalObservables());
3647 alist += std::string(
aa->GetName()) +
",";
3650 if (!alist.empty()) {
3651 Warning(
"Vary",
"Adding %s to global observables of %s", alist.c_str(),
_ds->GetName());
3657 s->addPdf(*_pdf, label.c_str());
3669 child.convertForAcquisition(*
this);
3671 if (!_c &&
child.get()) {
3672 throw std::runtime_error(
"Only pure consts can be set as variations of a flexible interpvar");
3674#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
3675 double value = (_c ? _c->getVal() :
p->_nominal);
3678 double value = (_c ? _c->getVal() :
p->nominal());
3683 if (
cName ==
"nominal") {
3687 if (
cName.CountChar(
'=') != 1) {
3688 throw std::runtime_error(
"unsupported variation form");
3693 throw std::runtime_error(
"unsupported variation magnitude");
3706 if (!
p->findServer(*
v)) {
3707#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
3708 p->_paramList.add(*
v);
3709 p->_low.push_back(0);
3710 p->_high.push_back(0);
3711 p->_interpCode.push_back(4);
3714 const_cast<std::vector<double> &
>(
p->low()).push_back(0);
3715 const_cast<std::vector<double> &
>(
p->high()).push_back(0);
3716 const_cast<std::vector<int> &
>(
p->interpolationCodes()).push_back(4);
3718 v->setAttribute(
Form(
"SYMMETRIC%s_%s", high ?
"+" :
"-",
GetName()));
3723 if (
v->getAttribute(
Form(
"SYMMETRIC+_%s",
GetName()))) {
3726 v->setAttribute(
Form(
"SYMMETRIC-_%s",
GetName()),
false);
3729 if (
v->getAttribute(
Form(
"SYMMETRIC-_%s",
GetName()))) {
3732 v->setAttribute(
Form(
"SYMMETRIC+_%s",
GetName()),
false);
3742 if (
cName.CountChar(
'=') != 1) {
3743 throw std::runtime_error(
"unsupported variation form");
3748 throw std::runtime_error(
"unsupported variation magnitude");
3750#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
3753 throw std::runtime_error(
3754 TString::Format(
"Interpolating %s instead of RooHistFunc",
p2->_nominal.absArg()->ClassName()));
3759 throw std::runtime_error(
3760 TString::Format(
"Interpolating %s instead of RooHistFunc",
p2->nominalHist()->ClassName()));
3766 for (
auto par :
p2->paramList()) {
3767 if (
parName == par->GetName()) {
3781 std::shared_ptr<RooHistFunc>
up(
3783 std::shared_ptr<RooHistFunc>
down(
3786#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
3787 std::unique_ptr<RooDataHist>
h1(
3789 std::unique_ptr<RooDataHist> h2(
3791 up->_dataHist =
dynamic_cast<RooDataHist *
>(
f->dataHist().Clone(
Form(
"hist_%s",
up->GetName())));
3797 auto ups = std::dynamic_pointer_cast<RooHistFunc>(
acquire(
up,
false,
true));
3798 auto downs = std::dynamic_pointer_cast<RooHistFunc>(
acquire(
down,
false,
true));
3799#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
3800 p2->_highSet.add(*
ups.get());
3801 p2->_lowSet.add(*
downs.get());
3802 p2->_interpCode.push_back(4);
3803 p2->_paramSet.add(*
v);
3807 const_cast<std::vector<int> &
>(
p2->interpolationCodes()).push_back(4);
3810 p2->setValueDirty();
3814 f->setStringAttribute(
"symmetrizes",
otherf->GetName());
3815 f->setStringAttribute(
"symmetrize_nominal",
nomf->GetName());
3816 otherf->setStringAttribute(
"symmetrized_by",
f->GetName());
3834#if ROOT_VERSION_CODE > ROOT_VERSION(6, 37, 00)
3837 if (
cName.CountChar(
'=') != 1) {
3838 throw std::runtime_error(
"unsupported variation form");
3844 if (!
pmr->indexCategory()->hasLabel(
parVal.Data())) {
3847 auto idx =
pmr->indexCategory()->lookupIndex(
parVal.Data());
3849 throw std::runtime_error(
"Invalid index");
3852 child.convertForAcquisition(*
this);
3855 if (
pmr->getModelList().empty()) {
3856 throw std::runtime_error(
"No real function given for variation, and no nominal function to clone");
3858 _c = std::dynamic_pointer_cast<RooAbsReal>(
3859 acquire(std::shared_ptr<TObject>(
pmr->getModelList().at(0)->Clone(
3863 _c->setStringAttribute(
"alias",
child.GetName());
3873 if (
p3->getAttribute(
"RooRealConstant_Factory_Object")) {
3874 throw std::runtime_error(
"Cannot vary pure constants");
3880 std::set<RooAbsArg *> cl;
3881 for (
auto &arg :
p3->clients()) {
3886 if (cl.size() > 1) {
3891 Warning(
"Vary",
"Varying %s that has multiple clients",
p3->GetName());
3894 p3->setStringAttribute(
"origName",
p3->GetName());
3896 p3->SetName(
Form(
"%s_nominal",
p3->GetName()));
3899 std::vector<double>(), std::vector<double>());
3902 for (
auto &
a :
p3->attributes())
3903 new_p->setAttribute(
a.c_str());
3904 for (
auto &
a :
p3->stringAttributes())
3905 new_p->setStringAttribute(
a.first.c_str(),
a.second.c_str());
3909 for (
auto arg : cl) {
3920 std::set<RooAbsArg *> cl;
3921 for (
auto &arg :
p4->clients()) {
3926 if (cl.size() > 1) {
3931 Warning(
"Vary",
"Varying %s that has multiple clients",
p4->GetName());
3934 p4->setStringAttribute(
"origName",
p4->GetName());
3936 p4->SetName(
Form(
"%s_nominal",
p4->GetName()));
3938#if ROOT_VERSION_CODE > ROOT_VERSION(6, 37, 00)
3939 std::shared_ptr<RooAbsArg>
new_p;
3942 if (
cName.CountChar(
'=') == 1) {
3949 throw std::runtime_error(
"Failed to acquire categorical index for RooMultiReal");
3952 if (
idxCat->numTypes() == 0) {
3953 idxCat->defineType(
"nominal");
3955 Info(
"Vary",
"Creating a RooMultiReal with category %s",
idxCat->GetName());
3972 for (
auto &
a :
p4->attributes())
3973 new_p->setAttribute(
a.c_str());
3974 for (
auto &
a :
p4->stringAttributes())
3975 new_p->setStringAttribute(
a.first.c_str(),
a.second.c_str());
3979 for (
auto arg : cl) {
4022 a->setStringAttribute(
"alias",
GetName());
4025 throw std::runtime_error(
"Cannot determine type");
4030 if (
auto h =
dynamic_cast<const TH1 *
>(&o);
h) {
4047 throw std::runtime_error(
"no xaxis");
4052 if (
h->GetXaxis()->IsVariableBinSize()) {
4053 _v->setBinning(
RooBinning(
h->GetNbinsX(),
h->GetXaxis()->GetXbins()->GetArray()));
4061 for (
int bin = 1; bin <=
h->GetNbinsX(); bin++) {
4070 throw std::runtime_error(
"Failed setting stat error");
4074 }
else if (
auto _c =
dynamic_cast<const RooConstVar *
>(&o); _c) {
4086 throw std::runtime_error(
"Assignment failed");
4119 std::map<RooAbsRealLValue *, double>
valsToSet;
4121 auto idx = pattern.
Index(
'=');
4124 (idx == -1) ? std::numeric_limits<double>::quiet_NaN() :
TString(pattern(idx + 1, pattern.
Length())).
Atof();
4126 for (
auto p :
_pars.argList()) {
4129 p->setAttribute(
"Constant",
true);
4130 if (!std::isnan(val)) {
4138 throw std::runtime_error(std::string(
"Unrecognised parameter: ") +
pat.Data());
4154 val.
IsAlpha() ? val :
nullptr));
4161 if (
d->get()->TestBit(1 << 20)) {
4171 _nll.fitConfigOptions()->SetValue(
"LogSize", 65536);
4172 _nll.fitConfig()->MinimizerOptions().SetPrintLevel(0);
4173 auto fr = _nll.minimize();
4176 throw std::runtime_error(
"Fit Failed");
4179 for (
unsigned int i = 0; i < fr->numStatusHistory(); i++) {
4183 (
gROOT->GetListOfBrowsers()->At(0))
4187 if (_nll.fOpts->find(
"GoF")) {
4190 if (fr->status() != 0) {
4192 TString::Format(
"%s\nData = %s\nFit Status Code = %d\nCov Quality = %d\n%s-------------%s",
4196 }
else if (fr->covQual() != 3 && _nll.fitConfig()->ParabErrors()) {
4197 new TGMsgBox(
gClient->GetRoot(),
w,
"Fit Finished with Bad Covariance Quality",
4198 TString::Format(
"%s\nData = %s\nFit Status Code = %d\nCov Quality = %d\n%s-------------%s",
4204 TString::Format(
"%s\nData = %s\nFit Status Code = %d\nCov Quality = %d\n%s-------------%s",
4209 for (
auto a : *
gROOT->GetListOfBrowsers()) {
4222 fb->DoubleClicked(
p, 0);
4223 if (
auto first =
p->GetFirstChild()) {
4225 if (first->IsOpen() &&
TString(first->GetText()) ==
"fits") {
4226 fb->DoubleClicked(first, 0);
4228 }
while ((first = first->GetNextSibling()));
4238 }
catch (
const std::exception &
e) {
4241 (
gROOT->GetListOfBrowsers()->At(0))
4254 for (
auto a : *
gROOT->GetListOfBrowsers()) {
4267 fb->DoubleClicked(
p, 0);
4268 if (
auto first =
p->GetFirstChild()) {
4270 if (first->IsOpen() &&
TString(first->GetText()) ==
"datasets") {
4271 fb->DoubleClicked(first, 0);
4273 }
while ((first = first->GetNextSibling()));
4283 }
catch (
const std::exception &
e) {
4286 (
gROOT->GetListOfBrowsers()->At(0))
4289 "Exception",
e.what(),
4296 const char *options)
4306 if (
d->get()->TestBit(1 << 20)) {
4312 std::unique_ptr<RooAbsCollection>
snap(
_pars.argList().snapshot());
4315 auto idx = pattern.
Index(
'=');
4318 (idx == -1) ? std::numeric_limits<double>::quiet_NaN() :
TString(pattern(idx + 1, pattern.
Length())).
Atof();
4320 for (
auto par :
_pars.argList()) {
4323 par->setAttribute(
"Constant",
true);
4324 if (!std::isnan(val)) {
4330 throw std::runtime_error(std::string(
"Unrecognised parameter: ") +
pat.Data());
4346 val.
IsAlpha() ? val :
nullptr));
4350 hs.SetName(
TUUID().AsString());
4362 (
gROOT->GetListOfBrowsers()->At(0))
4365 "Scan Finished with Bad Status Code",
4370 if (
auto res =
hs.result())
4377 for (
auto a : *
gROOT->GetListOfBrowsers()) {
4390 fb->DoubleClicked(
p, 0);
4391 if (
auto first =
p->GetFirstChild()) {
4393 if (first->IsOpen() &&
TString(first->GetText()) ==
"scans") {
4394 fb->DoubleClicked(first, 0);
4396 }
while ((first = first->GetNextSibling()));
4407 }
catch (
const std::exception &
e) {
4410 (
gROOT->GetListOfBrowsers()->At(0))
4421 }
catch (
const std::exception &
e) {
4430#if ROOT_VERSION_CODE > ROOT_VERSION(6, 29, 00)
4435 for (
auto a : *
this) {
4442 for (
auto c : args) {
4448 f.SetParName(i,
c->GetName());
4450 f.SetParLimits(i,
v->getMin(),
v->getMax());
4451 if (
v->isConstant())
4452 f.FixParameter(i,
v->getVal());
4454 f.SetParameter(i,
v->getVal());
4455 f.SetParError(i,
v->getError());
4466 (
gROOT->GetListOfBrowsers()->At(0))
4472 for (i = 0; i <
f.GetNpar(); i++) {
4473 auto c = args.
find(
f.GetParName(i));
4478 f.GetParLimits(i, low, high);
4480 v->setConstant(low);
4482 v->setRange(low, high);
4492 throw std::runtime_error(
"Failed to SetContent");
4493 }
catch (
const std::exception &
e) {
4507 std::shared_ptr<TH1D>
h;
4508 auto _b =
dynamic_cast<Axis2 *
>(
ax)->binning();
4510 if (
_b->isUniform()) {
4515 h->SetOption(
"nostyle");
4530 auto _ax = (bin) ?
GetXaxis() :
nullptr;
4532 throw std::runtime_error(
"Cannot determine binning to fill data");
4534 if (_ax && _ax->GetNbins() < bin) {
4535 throw std::out_of_range(
TString::Format(
"%s range %s only has %d bins", _ax->GetParent()->GetName(),
4536 _ax->GetName(), _ax->GetNbins()));
4542 for (
auto _c :
coords()) {
4546 cut +=
TString::Format(
"%s==%d", _cat->GetName(), _cat->getCurrentIndex());
4554 _rv->GetName(),
_rv->getMax(
_rv->getStringAttribute(
"coordRange")));
4557 throw std::runtime_error(
"SetBinContent of data: Unsupported coordinate type");
4566 cut2 =
TString::Format(
"%s >= %f && %s < %f", _ax->GetParent()->GetName(), _ax->GetBinLowEdge(bin),
4567 _ax->GetParent()->GetName(), _ax->GetBinUpEdge(bin));
4599 l.remove(*_data->get(),
true,
true);
4604 _data->addColumn(*
x);
4614 for (
auto &o :
obs) {
4616 if (
auto dv =
dynamic_cast<RooRealVar *
>(_data->get()->find(
v->GetName()));
dv) {
4617 if (
v->getMin() <
dv->getMin())
4618 dv->setMin(
v->getMin());
4619 if (
v->getMax() >
dv->getMax())
4620 dv->setMax(
v->getMax());
4623 if (
auto dc =
dynamic_cast<RooCategory *
>(_data->get()->find(
c->GetName()));
dc) {
4624 if (!
dc->hasLabel(
c->getCurrentLabel())) {
4625 dc->defineType(
c->getCurrentLabel(),
c->getCurrentIndex());
4634 if (
auto _nentries = std::unique_ptr<RooAbsData>(_data->reduce(
cutFormula))->numEntries();
4639 Info(
"SetBinContent",
"Binning %s in channel: %s",
GetName(), cut.
Data());
4642 for (
int j = 0;
j <
_reduced->numEntries();
j++) {
4644 _data->add(*_obs,
_reduced->weight());
4647 for (
int i = 1; i <= _ax->GetNbins(); i++) {
4651 dynamic_cast<RooAbsLValue *
>(_ax->GetParent())->setBin(i - 1, _ax->GetName());
4657 if (std::unique_ptr<RooAbsData>(_data->reduce(
cutFormula2))->numEntries() > 0) {
4660 for (
int j = 0;
j <
_reduced->numEntries();
j++) {
4662 _data->add(*_obs,
_reduced->weight());
4666 dynamic_cast<RooAbsLValue *
>(_ax->GetParent())->setBin(bin - 1, _ax->GetName());
4673 throw std::runtime_error(
"RooDataHist not supported yet");
4678 if (!par ||
strlen(par) == 0) {
4681 return it->SetBinContent(bin,
value);
4693 if (!par ||
strlen(par) == 0) {
4706 if (
strcmp(
c->GetName(),
Form(
"%g",
c->getVal())) == 0) {
4709#if ROOT_VERSION_CODE < ROOT_VERSION(6, 24, 00)
4722 auto bin_pars =
f->dataHist().get(bin - 1);
4723 if (
f->getAttribute(
"density")) {
4731 f->setStringAttribute(
"symmetrized_by",
nullptr);
4733 x->setStringAttribute(
"symmetrizes",
nullptr);
4734 x->setStringAttribute(
"symmetrize_nominal",
nullptr);
4748 f2->setNominal(
value);
4757 push_back(std::make_shared<xRooNode>(
data));
4764 return node->SetBinContent(bin,
value);
4771 push_back(std::make_shared<xRooNode>(
data));
4778 return node->SetContents(obj);
4816 throw std::runtime_error(
"stat factor must be a paramhistfunc");
4825 for (
auto &
p :
xRooNode(
"tmp", *
f, std::shared_ptr<xRooNode>(
nullptr)).vars()) {
4830 auto h = std::unique_ptr<TH1>(
f->dataHist().createHistogram(
parNames
4837 h->SetName(
"statFactor");
4839 h->SetOption(
"blankshape");
4848 throw std::runtime_error(
"Failed creating stat shapeFactor");
4854 TString prefix =
f->getStringAttribute(
"statPrefix");
4855 if (
value && prefix ==
"") {
4859 while (_p && !(_p->get()->InheritsFrom(
"RooRealSumPdf") || _p->get()->InheritsFrom(
"RooAddPdf") ||
4860 _p->get()->InheritsFrom(
"RooWorkspace") || _p->get()->InheritsFrom(
"RooAddition"))) {
4867 Form(
"#gamma^{%s}_{%d}", prefix.
Data(), bin), 1);
4868#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
4875 if (
newVar.get() != var) {
4879 for (std::size_t i = 0; i <
pSet.size(); i++) {
4880 if (
int(i) != bin - 1) {
4895 auto bin_pars =
f->dataHist().get(bin - 1);
4897 if (
f->getAttribute(
"density")) {
4903 for (
auto &[s,
sv] :
rrv->stringAttributes()) {
4904 if (s.find(
"sumw_") == 0) {
4906 }
else if (s.find(
"sumw2_") == 0) {
4910 if (
sumw2 &&
sumw2 != std::numeric_limits<double>::infinity()) {
4912 rrv->setError((tau < 1
e-15) ? 1
e15 : ( 1. / sqrt(tau)));
4913 rrv->setConstant(
false);
4918 rrv->setStringAttribute(
"boundConstraint",
_constr.Add(
"poisson").get()->GetName());
4923 double _min = tau * (1. - 5. * sqrt(1. / tau));
4924 double _max = tau * (1. + 5. * sqrt(1. / tau));
4927 _constr.at(0)->pp().at(0)->SetBinContent(0, tau);
4928 rrv->setStringAttribute(
"boundConstraint",
_constr.at(0)->get()->GetName());
4930 rrv->setRange(std::max((1. - 5. * sqrt(1. / tau)), 1
e-15), 1. + 5. * sqrt(1. / tau));
4934 v.constraints().Remove(*
_constr.at(0));
4953 throw std::out_of_range(
name +
" does not exist");
4975 xRooNode out(
".constraints",
nullptr, *
this);
4988 for (
auto &
c :
n.bins()) {
4999 for (
auto p : _ws->allPdfs()) {
5002 if (
p->dependsOn(par)) {
5003 out.emplace_back(std::make_shared<xRooNode>(par.GetName(), *
p, *
this));
5011 for (
auto p : o->pdfList()) {
5014 if (
p->dependsOn(par)) {
5015 out.emplace_back(std::make_shared<xRooNode>(par.GetName(), *
p, *
this));
5021 for (
auto &
p :
vars()) {
5027 if (
v->getAttribute(
"obs"))
5037 auto it = out.std::vector<std::shared_ptr<xRooNode>>
::begin();
5038 while (it != out.std::vector<std::shared_ptr<xRooNode>>
::end()) {
5040 for (
auto &
c : out) {
5041 if (
c.get() == it->get())
5046 std::string
_cName =
c->GetName();
5050 }
while (
_cName.find(
';') != std::string::npos);
5052 _cName = it->get()->GetName();
5056 }
while (
_cName.find(
';') != std::string::npos);
5064 c->TNamed::SetName(
_cName.c_str());
5078 for (
auto &o : out) {
5079 o->TNamed::SetName(o->get()->GetName());
5100 while (
sOpt2.Contains(
"=")) {
5101 auto pos =
sOpt2.Index(
"=");
5102 auto start =
sOpt2.Index(
";") + 1;
5126 if (
auto pos =
varName.Index(
';'); pos != -1) {
5136 binningName =
ax->GetName();
5137 }
else if (
acquirer.obs().size() == 1)
5141 h->GetXaxis()->GetXmax());
5142 if (
x->getMin() >
h->GetXaxis()->GetXmin())
5143 x->setMin(
h->GetXaxis()->GetXmin());
5144 if (
x->getMax() <
h->GetXaxis()->GetXmax())
5145 x->setMax(
h->GetXaxis()->GetXmax());
5146 if (!
x->hasBinning(binningName.c_str())) {
5147 if (
h->GetXaxis()->IsVariableBinSize()) {
5148 x->setBinning(
RooBinning(
h->GetNbinsX(),
h->GetXaxis()->GetXbins()->GetArray()), binningName.c_str());
5151 RooUniformBinning(
h->GetXaxis()->GetXmin(),
h->GetXaxis()->GetXmax(),
h->GetXaxis()->GetNbins()),
5152 binningName.c_str());
5154 x->getBinning(binningName.c_str()).
SetTitle(
h->GetXaxis()->GetTitle());
5155 if (
x->getBinningNames().size() == 2) {
5157 x->setBinning(
x->getBinning(binningName.c_str()));
5161 if (
x->getBinning(binningName.c_str()).numBins() !=
h->GetNbinsX()) {
5162 throw std::runtime_error(
5163 TString::Format(
"binning mismatch for binning %s of %s", binningName.c_str(),
x->GetName()));
5167 std::shared_ptr<RooAbsArg>
_f;
5174 _f->setStringAttribute(k.c_str(),
v.c_str());
5176 x->setAttribute(
"obs",
true);
5177 }
else if (
sOpt2.Contains(
"shape")) {
5179 for (
int i = 0; i <
x->getBinning(binningName.c_str()).numBins(); i++) {
5180 std::shared_ptr<RooAbsArg> arg;
5181 if (
sOpt2.Contains(
"blankshape")) {
5186 }
else if (
h->GetMinimumStored() != -1111 ||
h->GetMaximumStored() != -1111) {
5189 h->GetBinContent(i + 1),
h->GetMinimumStored(),
5190 h->GetMaximumStored());
5194 h->GetBinContent(i + 1));
5201 auto tmp =
dynamic_cast<RooAbsBinning *
>(
x->getBinningPtr(
nullptr)->Clone());
5202 x->setBinning(
x->getBinning(binningName.c_str()));
5204#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
5205 dynamic_cast<ParamHistFunc *
>(
_f.get())->_paramSet.setName(
"paramSet");
5208 .setName(
"paramSet");
5210 x->setBinning(*tmp);
5213 _f->setStringAttribute(k.c_str(),
v.c_str());
5217 binningName.c_str() );
5219 throw std::runtime_error(
"Couldn't make data hist");
5224 f->setAttribute(
"autodensity");
5228 _f->setStringAttribute(k.c_str(),
v.c_str());
5232 _f->setStringAttribute(
"xvar",
x->GetName());
5233 _f->setStringAttribute(
"binning", binningName.c_str());
5240 _f = std::dynamic_pointer_cast<RooAbsArg>(tmp.fComp);
5243 _f->setStringAttribute(
"xvar",
x->GetName());
5244 _f->setStringAttribute(
"binning", binningName.c_str());
5284 if (arg->getStringAttribute(
"style")) {
5285 t = arg->getStringAttribute(
"style");
5295 std::shared_ptr<TStyle>
style;
5297 if (!
gROOT->GetStyle(t)) {
5320 if (arg && !arg->getStringAttribute(
"style")) {
5321 arg->setStringAttribute(
"style",
style->GetName());
5339 if (
auto a =
dynamic_cast<RooAbsArg *
>(arg.get());
a) {
5340 auto out_arg = _ws->arg(
a->GetName());
5347 if (
aName !=
a->GetName())
5348 Warning(
"acquire",
"Renaming to %s",
a->GetName());
5352 if (
auto res = _ws->factory(arg->GetName()); res) {
5359 Info(
"acquire",
"A copy of %s has been added to workspace %s",
a->GetName(), _ws->GetName());
5382 std::unique_ptr<RooAbsCollection>
globals(
leafs.selectByAttrib(
"global",
true));
5392 }
else if (
auto a2 =
dynamic_cast<RooAbsData *
>(arg.get());
a2) {
5398 return std::shared_ptr<TObject>(_ws->embeddedData(arg->GetName()), [](
TObject *) {});
5399 }
else if (arg->InheritsFrom(
"TNamed")) {
5409 out_arg = _ws->genobj(arg->GetName());
5416 if (
aName != arg->GetName()) {
5417 Warning(
"acquire",
"Renaming to %s", arg->GetName());
5419 if (_ws->import(*arg,
false )) {
5423 out_arg = _ws->genobj(arg->GetName());
5435 auto out =
fProvider->getObject(arg->GetName(), arg->ClassName());
5441 _owned = emplace_back(std::make_shared<xRooNode>(
".memory",
nullptr, *
this));
5447 if (
strcmp(
r->GetName(), arg->GetName()) == 0 &&
strcmp(
r->get()->ClassName(), arg->ClassName()) == 0) {
5453 std::cout <<
GetName() <<
" taking over " << arg->ClassName() <<
"::" << arg->GetName() << std::endl;
5455 return _owned->emplace_back(std::make_shared<xRooNode>(arg->GetName(), arg, *
this))->fComp;
5497 throw std::runtime_error(
"Cannot SetXaxis of non-arg");
5500 _x->setBinning(binning,
a->
GetName());
5501 _x->getBinning(
a->GetName()).SetTitle(title);
5502 if (_x->getBinningNames().size() == 2) {
5504 _x->setBinning(_x->getBinning(
a->GetName()));
5509 if (_x->getMax() < high)
5511 if (_x->getMin() > low)
5517 _x->setAttribute(
"obs");
5520 a->setStringAttribute(
"xvar", _x->GetName());
5521 a->setStringAttribute(
"binning",
a->GetName());
5531 if (
ax->IsVariableBinSize()) {
5532 return SetXaxis(
ax->GetName(),
ax->GetTitle(),
ax->GetNbins(),
ax->GetXbins()->GetArray());
5534 return SetXaxis(
ax->GetName(),
ax->GetTitle(),
ax->GetNbins(),
ax->GetXmin(),
ax->GetXmax());
5540 return find(
name,
false) !=
nullptr;
5548 std::string extra = (_s) ? _s->indexCat().GetName() :
"";
5549 for (
auto &
child : *
this) {
5552 (!extra.empty() && ((extra +
"=" +
name) ==
child->GetName() ||
5565 for (
auto &
child2 :
x.browse()) {
5591 auto out = std::make_shared<xRooNode>(obj, *
this);
5606 std::string extra = (_s) ? _s->indexCat().GetName() :
"";
5608 for (
auto &
child : *
this) {
5620 for (
auto &
child2 :
x.browse()) {
5632 folderNode = std::make_shared<xRooNode>(
child->fFolder.c_str(),
nullptr, *
this);
5650 auto out = std::make_shared<xRooNode>(
partname.c_str(),
nullptr, *
this);
5653 out->SetName(
"!pdfs");
5656 return out->operator[](
name.substr(
partname.length() + 1));
5664 for (
auto o : *
gROOT->GetListOfBrowsers()) {
5666 if (!
b || !
b->GetBrowserImp())
5673 if (!
b->GetBrowserImp())
5689 for (
auto o : *
gROOT->GetListOfBrowsers()) {
5691 if (!
b || !
b->GetBrowserImp())
5698 if (
b->GetBrowserImp()) {
5716 a->setStringAttribute(
"alias",
name);
5717 for (
auto o : *
gROOT->GetListOfBrowsers()) {
5718 if (
auto b =
dynamic_cast<TBrowser *
>(o);
b) {
5743 auto findByObj = [&](
const std::shared_ptr<xRooNode> &
n) {
5744 std::vector<std::shared_ptr<xRooNode>> &
nn = *
this;
5745 for (
auto &
c :
nn) {
5746 if (
c->get() ==
n->get() &&
strcmp(
n->GetName(),
c->GetName()) == 0)
5749 return std::shared_ptr<xRooNode>(
nullptr);
5754 const std::vector<std::shared_ptr<xRooNode>> &
nn(
n);
5755 for (
auto &
c :
nn) {
5768 const std::vector<std::shared_ptr<xRooNode>> &
nn2(*
this);
5769 for (
auto &
c :
nn2) {
5770 if (
strlen(
c->GetName()) > 0 && (
c->GetName()[0] ==
'.')) {
5774 if (
strcmp(
c->GetName(),
"!.pars") == 0) {
5813 auto coef = std::make_shared<xRooNode>(
".coef", *
_coefs.at(0)->get(), *
this);
5826 emplace_back(std::make_shared<xRooNode>(
_coefs));
5838 for (
int i = 0; i < arg->numProxies(); i++) {
5839 auto _proxy = arg->getProxy(i);
5849 for (
auto &
child : *
this) {
5857 for (
auto a2 : *s) {
5858 auto c = std::make_shared<xRooNode>(*
a2, *
this);
5859 if (arg->numProxies() != 1) {
5860 c->fFolder = std::string(
"!.") +
5893 fBrowsables.emplace_back(std::make_shared<xRooNode>(
".memory", std::make_shared<xRooHypoSpace>(
ir), *
this));
5906 auto hpn = emplace_back(std::make_shared<xRooNode>(
coordString,
hp.hypoTestResult,
hs));
5908 hpn->fBrowsables.emplace_back(std::make_shared<xRooNode>(
5914 std::vector<std::shared_ptr<xRooNode>> &
nn = *
this;
5915 for (
auto &
c :
nn) {
5938 std::make_shared<xRooNLLVar::xRooHypoPoint>(std::dynamic_pointer_cast<RooStats::HypoTestResult>(
fComp));
5939 fBrowsables.emplace_back(std::make_shared<xRooNode>(
".memory",
shp, *
this));
5945 if (
auto fit =
hp->ufit()) {
5946 fits.emplace_back(std::make_shared<xRooNode>(fit, *
this))->TNamed::SetName(
"ufit");
5948 if (
auto fit =
hp->cfit_null()) {
5949 fits.emplace_back(std::make_shared<xRooNode>(fit, *
this))->TNamed::SetName(
"cfit_null");
5951 if (
auto fit =
hp->cfit_alt()) {
5952 fits.emplace_back(std::make_shared<xRooNode>(fit, *
this))->TNamed::SetName(
"cfit_alt");
5954 if (
auto fit =
hp->gfit()) {
5955 fits.emplace_back(std::make_shared<xRooNode>(fit, *
this))->TNamed::SetName(
"gfit");
5957 if (
auto asi =
hp->asimov()) {
5958 auto asiP =
fits.emplace_back(std::make_shared<xRooNode>(
5959 asi->hypoTestResult ?
asi->hypoTestResult : std::make_shared<RooStats::HypoTestResult>(
asi->result()),
5961 asiP->TNamed::SetName(
"asimov");
5962 asiP->fBrowsables.emplace_back(std::make_shared<xRooNode>(
".memory",
asi,
asiP));
5968 auto it = std::vector<std::shared_ptr<xRooNode>>
::begin();
5969 while (it != std::vector<std::shared_ptr<xRooNode>>
::end()) {
5970 if (it->get()->fTimes == 0) {
5971 for (
auto o : *
gROOT->GetListOfBrowsers()) {
5973 if (
b &&
b->GetBrowserImp()) {
6020 xRooNode out(
".obs", std::make_shared<RooArgList>(), *
this);
6022 for (
auto o :
vars()) {
6025 out.emplace_back(o);
6036 xRooNode out(
".globs", std::make_shared<RooArgList>(), *
this);
6038 for (
auto o :
obs()) {
6041 out.emplace_back(o);
6052 xRooNode out(
".robs", std::make_shared<RooArgList>(), *
this);
6054 for (
auto o :
obs()) {
6057 out.emplace_back(o);
6072 xRooNode out(
".pars", std::make_shared<RooArgList>(), *
this);
6074 for (
auto o :
vars()) {
6077 out.emplace_back(o);
6088 xRooNode out(
".consts", std::make_shared<RooArgList>(), *
this);
6090 for (
auto o :
pars()) {
6093 out.emplace_back(o);
6105 xRooNode out(
".floats", std::make_shared<RooArgList>(), *
this);
6107 for (
auto o :
pars()) {
6110 out.emplace_back(o);
6122 xRooNode out(
".poi", std::make_shared<RooArgList>(), *
this);
6124 for (
auto o :
pars()) {
6127 out.emplace_back(o);
6139 xRooNode out(
".np", std::make_shared<RooArgList>(), *
this);
6141 for (
auto o :
pars()) {
6143 (!o->get<
RooAbsArg>()->getAttribute(
"Constant") && !o->get<
RooAbsArg>()->getAttribute(
"poi") &&
6146 out.emplace_back(o);
6157 xRooNode out(
".pp", std::make_shared<RooArgList>(), *
this);
6159 for (
auto o :
pars()) {
6163 out.emplace_back(o);
6174 xRooNode out(
".vars", std::make_shared<RooArgList>(), *
this);
6177 for (
auto &
x : *
this) {
6178 for (
auto &
y :
x->vars()) {
6193 if (!
c->getAttribute(
"global")) {
6195 out.emplace_back(std::make_shared<xRooNode>(*
c, *
this));
6197 if (
c->getAttribute(
"global")) {
6198 _globs.emplace_back(std::make_shared<xRooNode>(*
c, *
this));
6199 _globs.back()->fFolder =
"!globs";
6200 }
else if (
c->getAttribute(
"obs")) {
6201 out.back()->fFolder =
"!robs";
6202 }
else if (
c->getAttribute(
"poi")) {
6203 out.back()->fFolder =
"!poi";
6204 }
else if (
c->getAttribute(
"np") ||
6206 out.back()->fFolder =
"!np";
6208 out.back()->fFolder =
"!floats";
6210 out.back()->fFolder =
"!pp";
6216 out.emplace_back(
g);
6219 for (
auto a : *
p2->get()) {
6220 a->setAttribute(
"obs");
6221 out.emplace_back(std::make_shared<xRooNode>(*
a, *
this));
6224 if (
auto _dglobs =
p2->getGlobalObservables()) {
6226 a->setAttribute(
"obs");
6227 a->setAttribute(
"global");
6228 out.emplace_back(std::make_shared<xRooNode>(*
a, *
this));
6233 a->setAttribute(
"obs");
6234 a->setAttribute(
"global");
6235 out.emplace_back(std::make_shared<xRooNode>(*
a, *
this));
6238 }
else if (
auto _ws =
ws(); _ws) {
6241 a->setAttribute(
"obs");
6242 a->setAttribute(
"global");
6243 out.emplace_back(std::make_shared<xRooNode>(*
a, *
this));
6247 for (
auto &
_g :
_gl->second) {
6248 auto _clone = std::shared_ptr<RooAbsArg>(
dynamic_cast<RooAbsArg *
>(
_g->Clone(
_g->GetName())));
6249 if (
auto v = std::dynamic_pointer_cast<RooAbsRealLValue>(
_clone);
v &&
_g->getStringAttribute(
"nominal"))
6251 out.emplace_back(std::make_shared<xRooNode>(
_clone, *
this));
6260 auto _clone = std::shared_ptr<RooAbsArg>(
dynamic_cast<RooAbsArg *
>(
_g->Clone(
_g->GetName())));
6261 if (
auto v = std::dynamic_pointer_cast<RooAbsRealLValue>(
_clone);
v &&
_g->getStringAttribute(
"nominal"))
6263 out.emplace_back(std::make_shared<xRooNode>(
_clone, *
this));
6269 for (
auto a :
w->allVars()) {
6270 out.emplace_back(std::make_shared<xRooNode>(*
a, *
this));
6274 for (
auto a :
w->allCats()) {
6275 out.emplace_back(std::make_shared<xRooNode>(*
a, *
this));
6284 xRooNode out(
".components",
nullptr, *
this);
6289 for (
auto &o :
p->pdfList()) {
6292 out.emplace_back(std::make_shared<xRooNode>(*o, *
this));
6310 for (
auto &o :
p2->funcList()) {
6313 out.emplace_back(std::make_shared<xRooNode>(*o, *
this));
6317 for (
auto &o :
p3->list()) {
6318 out.emplace_back(std::make_shared<xRooNode>(*o, *
this));
6321 for (
auto &
a : *
p4) {
6322 out.emplace_back(std::make_shared<xRooNode>(*
a, *
this));
6325 for (
auto &o :
p5->components()) {
6328 bool hasClients =
false;
6329 for (
auto &
c : o->clients()) {
6330 if (!
c->InheritsFrom(
"RooRealIntegral") &&
p5 ==
GETWS(
c)) {
6337 out.emplace_back(std::make_shared<xRooNode>(*o, *
this));
6338 if (o->InheritsFrom(
"RooAbsPdf")) {
6339 out.back()->fFolder =
"!pdfs";
6341 out.back()->fFolder =
"!scratch";
6344 for (
auto &o :
p5->allGenericObjects()) {
6348 s = s(0, s.
Index(
';'));
6349 if (
auto _pdf = out.find(s.
Data()); _pdf) {
6351 out.emplace_back(std::make_shared<xRooNode>(fr->GetName(), *fr, _pdf));
6358 out.emplace_back(std::make_shared<xRooNode>(fr->GetName(), *fr, *
this));
6360 out.back()->fFolder =
"!fits";
6362 out.emplace_back(std::make_shared<xRooNode>(*o, *
this));
6363 if (
strcmp(out.back()->get()->ClassName(),
"TStyle") == 0) {
6364 out.back()->fFolder =
"!styles";
6365 }
else if (
strcmp(out.back()->get()->ClassName(),
"RooStats::HypoTestInverterResult") == 0) {
6366 out.back()->fFolder =
"!scans";
6367 }
else if (
strcmp(out.back()->get()->ClassName(),
"RooStats::ModelConfig") == 0) {
6368 out.back()->fFolder =
"!models";
6370 out.back()->fFolder =
"!objects";
6377 if (k.find(
"CACHE_") == 0)
6379 out.emplace_back(std::make_shared<xRooNode>(k.c_str(),
v, *
this));
6380 out.back()->fFolder =
"!sets";
6384 std::unique_ptr<TIterator> iter(
snaps.MakeIterator());
6386 while ((
snap = iter->Next())) {
6387 out.emplace_back(std::make_shared<xRooNode>(*
snap, *
this));
6388 out.back()->fFolder =
"!snapshots";
6393 out.emplace_back(std::make_shared<xRooNode>(
".pdf", *
mc->GetPdf(), *
this));
6395 if (
mc->GetExternalConstraints()) {
6396 out.emplace_back(std::make_shared<xRooNode>(
".extCons", *
mc->GetExternalConstraints(), *
this));
6402 out.emplace_back(
c);
6409 out.emplace_back(
c);
6423 xRooNode out(
".bins",
nullptr, *
this);
6426 std::map<int, std::shared_ptr<xRooNode>> cats;
6427 for (
auto &
c :
p->indexCat()) {
6428 auto pp =
p->getPdf(
c.first.c_str());
6432 std::make_shared<xRooNode>(
TString::Format(
"%s=%s",
p->indexCat().GetName(),
c.first.c_str()), *
pp, *
this);
6434 for (
auto &[
_,
n] : cats)
6435 out.emplace_back(
n);
6438#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
6441 auto &
pSet =
phf->paramList();
6443 for (
auto par :
pSet) {
6444 out.emplace_back(std::make_shared<xRooNode>(*par, *
this));
6445 out.back()->fBinNumber = i;
6449 for (
int i = 1; i <=
ax->GetNbins(); i++) {
6455 for (
auto &
ss :
f->bins()[i - 1]->factors())
6462 out.emplace_back(std::make_shared<xRooNode>(
6463 TString::Format(
"%g<=%s<%g",
ax->GetBinLowEdge(i),
ax->GetParent()->GetName(),
ax->GetBinLowEdge(i + 1)),
6469#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
6475 out.back()->fBinNumber = i;
6500 std::make_shared<RooProduct>(
".recursiveCoefs",
6505 auto mem = out.emplace_back(std::make_shared<xRooNode>(
".memory",
nullptr, *
this));
6506 mem->emplace_back(std::make_shared<xRooNode>(
ourCoefs));
6519 if (!parent->fComp) {
6520 while (!parent->fComp && parent->fParent) {
6521 parent = parent->fParent;
6524 parent = parent->fParent;
6530 for (
auto &o :
p->funcList()) {
6532 if (i >=
p->coefList().size()) {
6534 coefs.add(
p->coefList());
6536 coefs.add(*
p->coefList().at(i));
6543 if (
p2->coefList().empty()) {
6548 for (
auto &o :
p2->pdfList()) {
6550 if (i >=
p2->coefList().size()) {
6554 coefs.add(*
p2->coefList().at(i));
6568 : std::make_shared<RooAddition>((
isResidual) ?
".sumOfCoefs" :
".coefs",
6569 "Coefficients of",
coefs));
6570 xRooNode out(
".coef",
coefSum ? std::dynamic_pointer_cast<RooAbsArg>(std::make_shared<RooFormulaVar>(
6571 ".coef",
"1-sum(otherCoefs)",
"1. - @0", *
coefSum))
6574 out.emplace_back(std::make_shared<xRooNode>(
".memory",
nullptr, *
this))
6576 std::make_shared<xRooNode>(
".sumOfCoefs",
coefSum, out));
6578 if (!
coefs.empty()) {
6582 }
else if (
coefs.size() == 1) {
6584 if (!
coefs.empty()) {
6603 xRooNode out(
".factors",
nullptr, *
this);
6608 a->setStringAttribute(
"alias",
"samples");
6610 a2->setStringAttribute(
"alias",
"components");
6612 int _npdfs =
p->pdfList().size();
6613 for (
auto &o :
p->pdfList()) {
6614 out.emplace_back(std::make_shared<xRooNode>(*o, *
this));
6615 if (
_npdfs > 5 && o !=
_main.get() && out.back()->robs().size() == 0)
6616 out.back()->fFolder =
"!constraints";
6619 for (
auto &o :
p2->components()) {
6620 if (o->InheritsFrom(
"RooProduct")) {
6622 auto x =
xRooNode(
"tmp", *o, *
this).factors();
6624 out.emplace_back(std::make_shared<xRooNode>(
n->GetName(),
n->fComp, *
this));
6627 out.emplace_back(std::make_shared<xRooNode>(*o, *
this));
6636 for (
auto a :
w->allFunctions()) {
6637 if (_obs.contains(*
a))
6640 for (
auto c :
a->clients()) {
6642 if (
c->InheritsFrom(
"RooProduct")) {
6648 out.emplace_back(std::make_shared<xRooNode>(*
a, *
this));
6692 xRooNode out(
".variations",
nullptr, *
this);
6705#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
6706 out.emplace_back(std::make_shared<xRooNode>(
"nominal",
p2->_nominal.arg(), *
this));
6708 out.emplace_back(std::make_shared<xRooNode>(
"nominal", *(
p2->nominalHist()), *
this));
6710 for (
size_t i = 0; i <
p2->paramList().
size(); i++) {
6712 out.emplace_back(std::make_shared<xRooNode>(
TString::Format(
"%s=1",
p2->paramList().at(i)->GetName()),
6713 *
p2->highList().at(i), *
this));
6714 out.emplace_back(std::make_shared<xRooNode>(
TString::Format(
"%s=-1",
p2->paramList().at(i)->GetName()),
6715 *
p2->lowList().at(i), *
this));
6718#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
6719 out.emplace_back(std::make_shared<xRooNode>(
"nominal",
RooFit::RooConst(
p3->_nominal), *
this));
6720 for (
size_t i = 0; i <
p3->_paramList.size(); i++) {
6721 out.emplace_back(std::make_shared<xRooNode>(
TString::Format(
"%s=1",
p3->_paramList.at(i)->GetName()),
6723 out.emplace_back(std::make_shared<xRooNode>(
TString::Format(
"%s=-1",
p3->_paramList.at(i)->GetName()),
6727 out.emplace_back(std::make_shared<xRooNode>(
"nominal",
RooFit::RooConst(
p3->nominal()), *
this));
6728 for (
size_t i = 0; i <
p3->variables().
size(); i++) {
6729 out.emplace_back(std::make_shared<xRooNode>(
TString::Format(
"%s=1",
p3->variables().at(i)->GetName()),
6731 out.emplace_back(std::make_shared<xRooNode>(
TString::Format(
"%s=-1",
p3->variables().at(i)->GetName()),
6755 for (
auto &k : *
this) {
6764 xRooNode out(
".datasets()",
nullptr, *
this);
6770 for (
auto &
d : _ws->allData()) {
6771 out.emplace_back(std::make_shared<xRooNode>(*
d, *
this));
6772 out.back()->fFolder =
"!datasets";
6785 for (
auto _c :
coords()) {
6789 cut +=
TString::Format(
"%s==%d", _cat->GetName(), _cat->getCurrentIndex());
6798 _rv->GetName(),
_rv->getMax(
_rv->getStringAttribute(
"coordRange")));
6803 throw std::runtime_error(
"datasets(): Unsupported coordinate type");
6810 for (
auto cat : s->indexCat()) {
6811 if (!s->getPdf(cat.first.c_str())) {
6823 cutobs.add(s->indexCat());
6832 for (
auto &
child : *
this) {
6838 for (
auto &
d :
_wsNode.datasets()) {
6844 if (std::unique_ptr<RooAbsCollection>(
d->obs().argList().selectCommon(_obs))->size() == _obs.
size()) {
6851 out.emplace_back(std::make_shared<xRooNode>(
6856 out.back()->get<
RooAbsData>()->setGlobalObservables(*std::unique_ptr<RooAbsCollection>(
6858 if (
d->get()->TestBit(1 << 20))
6859 out.back()->get()->SetBit(1 << 20);
6861 out.back()->fBrowsables.emplace_back(std::make_shared<xRooNode>(
".sourceds",
d->fComp, *
this));
6863 out.emplace_back(std::make_shared<xRooNode>(
d->fComp, *
this));
6905 for (
auto o : *
fromPad->GetListOfPrimitives()) {
6925 cat->numTypes(), 0, cat->numTypes());
6927 std::map<int, std::string> cats;
6928 for (
auto &
c : *cat) {
6929 cats[
c.second] =
c.first;
6931 for (
auto &[
_, label] : cats) {
6932 theHist->GetXaxis()->SetBinLabel(i++, label.c_str());
6935 auto _binning =
v->getBinningPtr(
nullptr);
6936 if (_binning->isUniform()) {
6940 v->numBins(), _binning->lowBound(), _binning->highBound());
6945 v->numBins(), _binning->array());
6949 throw std::runtime_error(
"Cannot draw dataset without parent PDF");
6962 auto nHist = std::unique_ptr<TH1>(
static_cast<TH1 *
>(
theHist->Clone(
"nEntries")));
6984 : (
theHist->GetXaxis()->IsAlphanumeric() ?
theHist->GetXaxis()->GetTimeFormatOnly()
6985 :
theHist->GetXaxis()->GetName()));
7004 int nevent =
theData->numEntries();
7005 for (
int i = 0; i < nevent; i++) {
7010 if (cat->getIndex() !=
theData->get()->getCatIndex(cat->GetName())) {
7016 if (!
rv->inRange(
theData->get()->getRealValue(
rv->GetName()),
rv->getStringAttribute(
"coordRange"))) {
7049 for (
int i = 0; i <
theHist->GetNbinsX(); i++) {
7051 double val =
theHist->GetBinContent(i + 1);
7054 (
xvar && val) ?
xPos->GetBinContent(i + 1) :
theHist->GetBinCenter(i + 1), val);
7057 double xErr =
xPos2->GetBinContent(i + 1) - pow(
xPos->GetBinContent(i + 1), 2);
7070 dataGraph->GetHistogram()->GetXaxis()->SetLimits(
theHist->GetXaxis()->GetXmin(),
theHist->GetXaxis()->GetXmax());
7074 for (
int i = 1; i <=
theHist->GetNbinsX(); i++)
7075 dataGraph->GetHistogram()->GetXaxis()->SetBinLabel(i,
theHist->GetXaxis()->GetBinLabel(i));
7109 throw std::runtime_error(
"Cannot build graph");
7115 if (
auto _w =
ws();
_w) {
7117 for (
auto o :
_w->allGenericObjects()) {
7119 _fr->ResetBit(1 << 20);
7122 res->SetBit(1 << 20);
7124 auto allVars =
_w->allVars();
7129 throw std::runtime_error(
"Not supported yet");
7143 throw std::runtime_error(
"Not a RooFitResult");
7154#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 26, 00)
7166 if (
sOpt ==
"prefit") {
7180 auto fr = std::make_shared<RooFitResult>(
"prefitResult",
"Prefit");
7181 fr->setFinalParList(*
_pars);
7182 for (
auto &
p : fr->floatParsFinal()) {
7186 if (
auto s =
_v->getStringAttribute(
"nominal"); s)
7189 std::shared_ptr<xRooNode>
pConstr;
7196 for (
auto s :
c->get<
RooAbsArg>()->servers()) {
7197 if (
strcmp(s->GetName(),
p->GetName()) == 0) {
7214 for (
auto &_d :
pConstr->vars()) {
7215 if (
strcmp(
p->GetName(), _d->get()->GetName()) == 0)
7239 if (!
_v->getStringAttribute(
"nominal"))
7251 _args.add(
_globs.argList());
7252 fr->setConstParList(_args);
7255 if (
auto atr =
p->getStringAttribute(
"initVal");
atr &&
dynamic_cast<RooRealVar *
>(
p))
7258 fr->setInitParList(*
_snap);
7263 if (
auto _w =
ws();
_w) {
7270 for (
auto p :
pars()) {
7273 if (
_fr->floatParsFinal().find(
p->GetName()) ||
7275 std::abs(
_fr->constPars().getRealValue(
p->GetName(), std::numeric_limits<double>::quiet_NaN()) -
7279 _fr->constPars().getCatIndex(
p->GetName(), std::numeric_limits<int>().max()))) {
7284 if (!
_fr->floatParsFinal().find(
p->GetName())) {
7287 std::abs(
_fr->floatParsFinal().getRealValue(
p->GetName(),
7288 std::numeric_limits<double>::quiet_NaN()) -
7292 _fr->floatParsFinal().getCatIndex(
p->GetName(), std::numeric_limits<int>().max()))) {
7308 for (
size_t i = 0; i <
newFloats.size(); i++) {
7324 auto fr = std::make_shared<RooFitResult>(
TString::Format(
"%s-dirty",
_fr->GetName()));
7327 fr->setCovarianceMatrix(
cov);
7328 fr->setInitParList(
_fr->floatParsInit());
7333 return xRooNode(*
_fr, std::make_shared<xRooNode>(*
_w, std::make_shared<xRooNode>()));
7338 for (
auto o :
_w->allGenericObjects()) {
7364 auto fr = std::make_shared<RooFitResult>(
TUUID().AsString());
7366 fr->setFinalParList(*
_pars);
7372 for (
int i = 0; i <
prevCov->GetNcols(); i++) {
7373 for (
int j = 0;
j <
prevCov->GetNrows();
j++) {
7374 cov(i,
j) = (*prevCov)(i,
j);
7379 for (
auto &
p : fr->floatParsFinal()) {
7382 cov(i, i) = pow(
v->getError(), 2);
7390 fr->setCovarianceMatrix(
cov);
7397 _args.add(
_globs.argList());
7398 fr->setConstParList(_args);
7401 if (
auto atr =
p->getStringAttribute(
"initVal");
atr &&
dynamic_cast<RooRealVar *
>(
p))
7404 fr->setInitParList(*
_snap);
7434 o->setStringAttribute(
"range",
range);
7441 std::string &out =
fRange;
7442 if (
auto o =
get<RooAbsArg>(); o && o->getStringAttribute(
"range"))
7443 out = o->getStringAttribute(
"range");
7445 while (out.empty() && _parent) {
7446 if (
auto o = _parent->get<
RooAbsArg>(); o && o->getStringAttribute(
"range"))
7447 out = o->getStringAttribute(
"range");
7448 _parent = _parent->fParent;
7473 Info(
"nll",
"Overriding NLL Option: %s", o->GetName());
7479 return nll(_data,
l);
7497 throw std::runtime_error(
TString::Format(
"Workspace has multiple models, you must specify which to "
7498 "generate with (found at least %s and %s)",
7512 std::string selected;
7515 for (
auto c :
bins()) {
7526 if (!selected.empty())
7528 selected +=
cName.Data();
7537 if (
d->get()->TestBit(1 << 20)) {
7543 throw std::runtime_error(
7544 "Need at least one dataset selected (SetChecked) to use for deselected regions");
7576 std::unique_ptr<RooFitResult>
newFr;
7578 newFr = std::make_unique<RooFitResult>(*
_fr);
7590 for (
auto par :
_pars) {
7600 newFr = std::make_unique<RooFitResult>(*
_fr);
7601 for (
auto par :
_pars) {
7623 if (
mc->GetExternalConstraints()) {
7625 for (
auto o :
opts) {
7650 throw std::runtime_error(
TString::Format(
"Workspace has multiple models, you must specify which to "
7651 "build nll with (found at least %s and %s)",
7660 throw std::runtime_error(
TString::Format(
"Workspace has multiple pdfs, you must specify which to "
7661 "build nll with (found at least %s and %s)",
7672 std::string selected;
7674 for (
auto c :
bins()) {
7680 if (!selected.empty())
7695 _d = std::make_shared<xRooNode>(
asi.first, *
this);
7698 std::make_shared<xRooNode>(
".globs", std::const_pointer_cast<RooAbsCollection>(
asi.second), *_d));
7708 me.push_back(std::make_shared<xRooNode>(_data));
7725 for (
int i = 0; i <
opts.GetSize(); i++) {
7728 if (
strcmp(
opts.At(i)->GetName(),
"GlobalObservables") == 0) {
7739 std::dynamic_pointer_cast<RooAbsData>(_data.
fComp), *
_opts);
7849 for (
auto &
c :
bins()) {
7852 _cat.setLabel(
cName);
7859 if (_cat.hasRange(
p) && _cat.inRange(
p)) {
7873 std::vector<TObject *>
funcs;
7874 for (
auto &
c : out.components()) {
7883 funcs.push_back(
c->get());
7887 if (!
funcs.empty()) {
7889 _pdf->setFloor(
false);
7915 auto _tmp = fr->reducedCovarianceMatrix(
_pars);
7917 fr->setCovarianceMatrix(
_tmp);
7919 const_cast<RooArgList &
>(fr->floatParsFinal())
7930 for (
auto c : *
this) {
7931 nobs += (
c->fFolder ==
"!robs" ||
c->fFolder ==
"!globs");
7935 (
isVars &&
p ==
"x" && (
c->fFolder ==
"!robs" ||
c->fFolder ==
"!globs") &&
nobs == 1)) {
8039 return static_cast<RooAbsPdf *
>(intpdf.absArg())->expectedEvents(nset);
8048 return getProjection(&intobs, _normSet, (_normRange.Length() > 0 ? _normRange.Data() :
nullptr), code)->getVal();
8064 return rrv->getErrorHi();
8066 return rrv->getErrorLo();
8068 return rrv->getError();
8085 if (
rrvFitRes->getError() <= std::abs(
rrvFitRes->getVal()) * std::numeric_limits<double>::epsilon())
8095 std::stringstream
errMsg;
8096 errMsg <<
"RooAbsReal::getPropagatedError(): the parameters of the RooAbsReal don't have"
8097 <<
" the same values as in the fit result! The logic of getPropagatedError is broken in this case."
8101 throw std::runtime_error(
errMsg.str());
8113 : fr.reducedCovarianceMatrix(*
_pars));
8117 double nomVal =
f.getVal(nset);
8167 for (std::size_t i = 0; i <
_pars->size(); i++) {
8168 errVec[i] = std::sqrt(V(i, i));
8169 for (std::size_t
j = i;
j <
_pars->size();
j++) {
8170 C(i,
j) = V(i,
j) / std::sqrt(V(i, i) * V(
j,
j));
8176 double sum = F * (
C *
F);
8192 fFunc(
"func",
"func",
this,
f),
8193 fCoef(
"coef",
"coef",
this),
8194 fExpPdf(
"expPdf",
"expPdf",
this)
8199 fCoef.setArg(*coef);
8203 }
else if (
auto _p =
dynamic_cast<RooAbsPdf *
>(&
f);
8215 fExpectedEventsMode(
other.fExpectedEventsMode)
8222 return fFunc->binBoundaries(obs, xlo, xhi);
8227 return (fExpectedEventsMode ? 1. : fFunc) *
8228 ((fExpPdf.absArg()) ?
static_cast<RooAbsPdf *
>(fExpPdf.absArg())->expectedEvents(_normSet) : 1.) *
8229 (fCoef.absArg() ? fCoef : 1.);
8240#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 28, 00)
8241 double oo = getPropagatedError(fr,
nset_in);
8242 if (std::isnan(
oo)) {
8261 rrvFitRes->getError() <= std::abs(
rrvFitRes->getVal()) * std::numeric_limits<double>::epsilon())
8271 std::stringstream
errMsg;
8273 <<
"RooAbsReal::getPropagatedError(): the parameters of the RooAbsReal don't have"
8274 <<
" the same values as in the fit result! The logic of getPropagatedError is broken in this case.";
8276 throw std::runtime_error(
errMsg.str());
8281 if (paramList.
empty())
8316#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
8340 std::vector<double>
errVec(paramList.
size());
8341 for (std::size_t i = 0; i < paramList.
size(); i++) {
8342 errVec[i] = std::sqrt(V(i, i));
8343 for (std::size_t
j = i;
j < paramList.
size();
j++) {
8344 C(i,
j) = V(i,
j) / std::sqrt(V(i, i) * V(
j,
j));
8351 for (
unsigned int j = 0;
j <
plusVar.size();
j++) {
8356 double sum = F * (C *
F);
8366 if (
frv->getError() > 1
e-20) {
8383 for (
Int_t i = 0; i <
fpf.size(); i++) {
8386 paramList.
add(*par);
8422 std::vector<double>
errVec(paramList.
size());
8423 for (
int i = 0; i < paramList.
size(); i++) {
8424 errVec[i] = sqrt(V(i, i));
8425 for (
int j = i;
j < paramList.
size();
j++) {
8426 C(i,
j) = V(i,
j) / sqrt(V(i, i) * V(
j,
j));
8433 for (
unsigned int j = 0;
j <
plusVar.size();
j++) {
8438 double sum = F * (C *
F);
8452 bool fExpectedEventsMode =
false;
8460 std::cout <<
"Got signal " <<
signum << std::endl;
8462 std::cout <<
"Keyboard interrupt while building histogram" << std::endl;
8475 for (
int i = 0; i < obj->numCaches(); i++) {
8481 p->setNormRange(
p->normRange());
8483#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
8488 p->setProxyNormSet(
nullptr);
8489 p->_lastNSet =
nullptr;
8492 obj->setValueDirty();
8496 for (
auto &
c :
w->components()) {
8516 for (
auto obj :
a->clients()) {
8523 }
while (
a->clients().size() !=
nClients);
8542 out.fComp = std::shared_ptr<TH1>(
8543 BuildHistogram(
nullptr, !
content,
errors, -1, -1, fr,
errorsHi,
errorsLo,
nErrorToys,
nullptr, !stack,
false));
8544 }
else if (
vars.size() == 1) {
8546 out.fComp = std::shared_ptr<TH1>(
8547 BuildHistogram(
v, !
content,
errors, 1, 0, fr,
errorsHi,
errorsLo,
nErrorToys,
nullptr, !stack,
true));
8549 throw std::runtime_error(
"multi-dim histo not yet supported");
8588 h =
new TH1D(
rar->GetName(),
rar->GetTitle(), 1, 0, 1);
8589 h->GetXaxis()->SetBinLabel(1,
rar->GetName());
8590 h->GetXaxis()->SetTimeFormat(
rar->GetName());
8599 if (
h->GetListOfFunctions())
8602 h->SetTitle(
rar->GetTitle());
8607 h =
new TH1D(
rar->GetName(),
rar->GetTitle(), 1, 0, 1);
8609 h->GetXaxis()->SetBinLabel(1,
rar->GetName());
8610 h->SetBinContent(1,
rar->getVal());
8611 if (
x->getError()) {
8612 h->SetBinError(1,
x->getError());
8613 h->SetFillStyle(3005);
8614 h->SetFillColor(
h->GetLineColor());
8616 h->SetMaximum(
x->hasMax() ?
x->getMax()
8617 : (
h->GetBinContent(1) + std::max(std::abs(
h->GetBinContent(1) * 0.1), 50.)));
8618 h->SetMinimum(
x->hasMin() ?
x->getMin()
8619 : (
h->GetBinContent(1) - std::max(std::abs(
h->GetBinContent(1) * 0.1), 50.)));
8622 h->SetMarkerSize(0);
8623 h->SetMarkerStyle(0);
8628 TString binningName = (_ax && _ax->GetParent() ==
x) ? _ax->GetName() :
rar->getStringAttribute(
"binning");
8629 if (binningName ==
"")
8630 binningName =
rar->GetName();
8631 if (
x->hasBinning(binningName)) {
8632 if (
x->getBinning(binningName).isUniform()) {
8633 h =
new TH1D(
rar->GetName(),
rar->GetTitle(),
x->numBins(binningName) <= 0 ? 100 :
x->numBins(binningName),
8634 x->getMin(binningName),
x->getMax(binningName));
8636 h =
new TH1D(
rar->GetName(),
rar->GetTitle(),
x->numBins(binningName),
x->getBinning(binningName).array());
8638 h->GetXaxis()->SetTitle(
x->getBinning(binningName).GetTitle());
8640 }
else if (
auto _boundaries =
8641 _or_func( (std::list<double> *)(
nullptr),
8642 rar->binBoundaries(*
x, -std::numeric_limits<double>::infinity(),
8643 std::numeric_limits<double>::infinity()));
8645 std::vector<double>
_bins;
8646 for (
auto &
b : *_boundaries) {
8652 }
else if (!
x->hasMax() || !
x->hasMin()) {
8654 h =
new TH1D(
rar->GetName(),
rar->GetTitle(),
v->numBins(),
x->getVal() * 0.2,
x->getVal() * 5);
8656 h =
new TH1D(
rar->GetName(),
rar->GetTitle(),
v->numBins(),
x->getBinning().array());
8660 h =
new TH1D(
rar->GetName(),
rar->GetTitle(),
v->numBins(
rar->GetName()), 0,
v->numBins(
rar->GetName()));
8663 std::map<int, std::string> cats;
8664 for (
auto &
c : *cat) {
8665 cats[
c.second] =
c.first;
8667 for (
auto &[
_, label] : cats) {
8668 h->GetXaxis()->SetBinLabel(i++, label.c_str());
8674 h->GetXaxis()->SetTitle(o->GetTitle());
8678 if (
h->GetXaxis()->IsAlphanumeric()) {
8687 if (
auto s =
styles(
nullptr,
false); s) {
8693 if (
strlen(
h->GetXaxis()->GetTitle()) == 0)
8694 h->GetXaxis()->SetTitle(
vv->GetTitle());
8723 if (!
GETDMP(fr, _finalPars)) {
8736 for (
int i = 0; i <
prevCov->GetNcols(); i++) {
8737 for (
int j = 0;
j <
prevCov->GetNrows();
j++) {
8738 cov(i,
j) = (*prevCov)(i,
j);
8758 _pars.remove(*_p,
true);
8791 if (
x && (
p ||
_coefs.get() ||
rar->getAttribute(
"density"))) {
8809 for (
auto o : _obs) {
8811 rr->removeMin(
"coordRange");
8812 rr->removeMax(
"coordRange");
8813 rr->setStringAttribute(
"coordRange",
nullptr);
8817 if (
auto rr =
dynamic_cast<RooRealVar *
>(
v);
rr &&
rr->hasRange(
"coordRange")) {
8818 rr->removeMin(
"coordRange");
8819 rr->removeMax(
"coordRange");
8820 rr->setStringAttribute(
"coordRange",
nullptr);
8830 bool hasRange =
false;
8833 rr && (
rr->getStringAttribute(
"coordRange")) &&
strlen(
rr->getStringAttribute(
"coordRange"))) {
8843 for (
auto pdf :
bins()) {
8850 dynamic_cast<RooAbsPdf *
>(_pdf)->setNormRange(
"coordRange");
8852 newrar->addPdf(*_pdf, pdf->coords()[s->indexCat().GetName()]->get<
RooCategory>()->getLabel());
8856 rar =
p->createProjection(
8860 dynamic_cast<RooAbsPdf *
>(
rar)->setNormRange(
"coordRange");
8864 p->setNormRange(
"coordRange");
8869 rar = std::unique_ptr<RooAbsReal>{
rar->createIntegral(
8875 std::unique_ptr<RooAbsReal>{
rar->createIntegral(*_obs.get<
RooArgList>() )}
8893 std::unique_ptr<RooArgSet>
snap(
normSet.snapshot());
8915 h->GetNbinsX() == 1 ||
rar->getAttribute(
"BinnedLikelihood") ||
8918 -std::numeric_limits<double>::infinity(),
8919 std::numeric_limits<double>::infinity()))))
8932 if (!(s->get() &&
_clName.Contains(
"Hist"))) {
8950 auto l =
static_cast<TH1 *
>(
h->Clone(
"nominal"));
8953 h->GetListOfFunctions()->Add(
l, (
setInterp) ?
"lsame" :
"histsame");
8957 h->SetMarkerSize(0);
8958 h->SetFillStyle(3005);
8959 h->SetFillColor(
h->GetLineColor());
8975 auto l =
static_cast<TH1 *
>(
h->Clone(
"toys"));
8978 h->GetListOfFunctions()->Add(
8992 static_cast<TH1 *
>(
main_h->GetListOfFunctions()->FindObject(
"toys"))->GetListOfFunctions()->
Add(
h);
9001 if (
_vv->getError() == 0)
9006 for (
int i = std::max(1,
binStart); i <= std::min(
h->GetNbinsX(),
binEnd); i++) {
9009 x->setVal(
h->GetBinCenter(i));
9011 cat->setLabel(
h->GetXaxis()->GetBinLabel(i));
9015 if (
x && !
x->inRange(
"coordRange"))
9019 if (!empty ||
toy > 0) {
9021#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
9030 r *=
h->GetBinWidth(i);
9038 h->SetBinContent(i,
r);
9055#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
9057 p->_normSet =
nullptr;
9075 res *=
h->GetBinWidth(i);
9077 h->SetBinError(i, res);
9093 res *=
h->GetBinWidth(i);
9098 h->SetBinContent(i,
h->GetBinContent(i) + (res -
h->GetBinError(i)) * 0.5);
9099 h->SetBinError(i, (res +
h->GetBinError(i)) * 0.5);
9111 Warning(
"BuildHistogram",
"Building this histogram will take until %s",
t2.AsString());
9121 Warning(
"BuildHistogram",
"Skipping errors for remaining bins");
9147 auto nomHist =
static_cast<TH1 *
>(
h->FindObject(
"nominal"));
9150 for (
int i = 1; i <=
h->GetNbinsX(); i++) {
9151 std::vector<double> vals;
9159 std::sort(vals.begin(), vals.end());
9168 upVal =
h->GetBinContent(i) + err;
9169 downVal =
h->GetBinContent(i) - err;
9177 std::vector<RooAbsArg *> extra;
9180 for (
auto _pdf : s->servers()) {
9182 extra.push_back(_pdf);
9185 extra.push_back(
rar);
9188 for (
auto a : extra)
9195 h->GetYaxis()->SetTitle(
rar->getStringAttribute(
"units"));
9197 h->GetYaxis()->SetTitle(
"Events");
9199 h->GetYaxis()->SetTitle(
"Probability Mass");
9201 h->GetYaxis()->SetMaxDigits(3);
9210 auto hCopy =
static_cast<TH1 *
>(
h->Clone(
"copy"));
9214 hCopy->SetStats(
false);
9215 h->GetListOfFunctions()->Add(
hCopy,
TString(
h->GetOption()) +
"same");
9216 h->GetListOfFunctions()->Add(
hCopy,
"axissame");
9234 std::vector<TH1 *>
hhs;
9241 if (!
rarNode->components().empty()) {
9244 if (
c->fFolder ==
"!.coeffs")
9250 std::shared_ptr<TH1>
prevHist(
static_cast<TH1 *
>(
h->Clone()));
9255 std::unique_ptr<RooAbsReal>
f(
9257 zero.setAttribute(
Form(
"ORIGNAME:%s",
c->GetName()));
9262 hh->SetName(
c->GetName());
9264 hh->Scale(
sf->getVal());
9266 hh->SetTitle(
c->GetName());
9268 }
else if (
strcmp(
hh->GetName(),
hh->GetTitle()) == 0) {
9273 std::shared_ptr<TH1>
nextHist(
static_cast<TH1 *
>(
hh->Clone()));
9290 auto hh =
static_cast<TH1 *
>(
h->Clone(
samp->GetName()));
9292 hh->SetTitle(
samp->GetTitle());
9294 hh->SetTitle(
samp->GetName());
9296 }
else if (
strcmp(
hh->GetName(),
hh->GetTitle()) == 0) {
9300 .ReplaceAll(
TString(
chan->get()->GetName()) +
"_",
9304 hh->SetBinContent(
hh->GetXaxis()->FindFixBin(
chanName),
samp->GetContent());
9310 auto hh =
samp->BuildHistogram(
9311 v, empty,
false ,
binStart,
binEnd,
_fr,
false,
false, 0,
h,
true,
9313 hh->SetName(
samp->GetName());
9315 hh->Scale(
sf->getVal());
9318 hh->SetTitle(
samp->GetName());
9320 }
else if (
strcmp(
hh->GetName(),
hh->GetTitle()) == 0) {
9329 for (
auto &
hh :
hhs) {
9380 if (
titlesMap[s.substr(0,
jj)] == 1 && (
jj >= s.length() || s.at(
jj) ==
' ' || s.at(
jj) ==
'_')) {
9395 (*ritr)->SetTitle(
_title.c_str());
9399 for (
auto &
hh :
hhs) {
9410 auto hhMin = (
hh->GetMinimum() == 0) ?
hh->GetMinimum(1
e-9) :
hh->GetMinimum();
9431 h->GetListOfFunctions()->AddFirst(stack,
"noclear same");
9440 if (
ll &&
ll->GetEntries()) {
9443 for (
auto ho : *
ll) {
9451 hh->SetFillStyle(1001);
9455 if (!
gROOT->GetColor(
hh->GetFillColor())) {
9457 hh->SetFillColor(0);
9461 for (
auto ho2 : *
ll) {
9482 if (
hh->GetFillColor() ==
kWhite &&
hh->GetFillStyle() != 0) {
9485 hh->SetFillColor(10);
9498 push_back(std::make_shared<xRooNode>(
data));
9506 return std::numeric_limits<double>::quiet_NaN();
9507 return node->GetBinContent(bin);
9518 std::vector<double> out;
9530 for (
int i = 0; i <
g->GetN(); i++)
9531 integral +=
g->GetPointY(i);
9532 out.push_back(integral);
9537 out.push_back(
g->GetPointY(i));
9558 for (
int i = 1; i <=
h->GetNbinsX(); i++) {
9559 tot +=
h->GetBinContent(i);
9564 out.push_back(
h->GetBinContent(i));
9575 for (
auto &
l :
a->servers()) {
9595 if (
auto o =
get(); o) {
9604#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
9608 for (
int i = 0; i <
p->fCGnx; i++) {
9609 for (
int j = 0;
j <
p->fCGny;
j++) {
9610 p->fCollideGrid[i +
j *
p->fCGnx] =
true;
9613 p->FillCollideGrid(o);
9622 if (
p->Collide(i,
j,
iw,
ih)) {
9633 return p->PlaceBox(o,
w,
h,
xl,
yb,
"trw");
9641 gPad->PaintModified();
9647 auto l =
new TPaveText(
gPad->GetLeftMargin() + 0.02, 1. -
gPad->GetTopMargin() - 0.08, 0.6,
9648 1. -
gPad->GetTopMargin() - 0.08);
9649 l->SetBorderSize(0);
9650 if (
l->GetTextSize() == 0)
9658 l->ConvertNDCtoPad();
9664 if (
auto p =
dynamic_cast<TLegend *
>(
gPad->GetPrimitive(
"legend"));
p) {
9667 double w =
p->GetX2NDC() -
p->GetX1NDC();
9668 double h =
p->GetY2NDC() -
p->GetY1NDC();
9670 gPad->PaintModified();
9674 x = std::max(
x, (
gPad->GetLeftMargin() + 0.02));
9675 y = std::max(
y, (
gPad->GetBottomMargin() + 0.02));
9676 x = std::min(
x, (1. -
gPad->GetRightMargin() - 0.02) -
w);
9677 y = std::min(
y, (1. -
gPad->GetTopMargin() - 0.02) -
h);
9678 h = std::min(
h, (1. -
gPad->GetTopMargin() - 0.02) -
y);
9679 w = std::min(
w, (1. -
gPad->GetRightMargin() - 0.02) -
x);
9691 while ((
p !=
p->GetMother()) && (
p =
p->GetMother())) {
9692 if (
auto q =
dynamic_cast<TVirtualPad *
>(
p->GetPrimitive(
"legend"));
q) {
9700 if (
p &&
strcmp(
p->GetName(),
"legend") == 0) {
9701 if (
l =
dynamic_cast<TLegend *
>(
p->GetPrimitive(
"legend"));
l || !create)
9705 gPad->GetBottomMargin());
9706 l->SetBorderSize(1);
9710 l =
new TLegend(0.6, 1. -
gPad->GetTopMargin() - 0.08, 0.75, 1. -
gPad->GetTopMargin() - 0.08);
9711 l->SetBorderSize(0);
9713 if (
l->GetTextSize() == 0) {
9721 l->SetName(
"legend");
9723 l->ConvertNDCtoPad();
9730 auto i = s.find(
"\n");
9731 if (i == std::string::npos) {
9734 return std::string(
"#splitline{") + s.substr(0, i) +
"}{" +
formatLegendString(s.substr(i + 1)) +
"}";
9743 for (
auto a : *
l->GetListOfPrimitives()) {
9747 if (
l->GetListOfPrimitives()->GetEntries() > 20)
9752 l->GetListOfPrimitives()->RemoveLast();
9753 l->GetListOfPrimitives()->AddFirst(
e);
9754 if (
auto nObj =
l->GetListOfPrimitives()->GetEntries();
nObj > 0) {
9756 int nn =
l->GetNColumns();
9759 l->SetNColumns(
l->GetNColumns() + 1);
9760 if (
l->GetBorderSize() == 0) {
9761 l->SetX1NDC(
l->GetX2NDC() - 0.15 *
l->GetNColumns());
9764 if (
l->GetBorderSize() == 0) {
9765 l->SetY1NDC(
l->GetY2NDC() - 0.05 *
gPad->GetHNDC() * std::ceil((
double(
nObj) /
l->GetNColumns())));
9781 fPad->GetCanvas()->Paint();
9782 fPad->GetCanvas()->Update();
9783#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 30, 00)
9784 fPad->GetCanvas()->ResetUpdated();
9799 if (
gROOT->FromPopUp()) {
9800 gROOT->SetFromPopUp(
false);
9803 }
catch (
const std::exception &
e) {
9806 (
gROOT->GetListOfBrowsers()->At(0))
9809 "Exception",
e.what(),
9812 gROOT->SetFromPopUp(
true);
9844 if (
d->get()->TestBit(1 << 20)) {
9850 hs.limits(
"cls visualize");
9862 [](
double a,
double b,
double) {
9865 if (
b == 0 &&
a == 0)
9872 [](
double n,
double b,
double sigma) {
9876 t0 = 2. * (((
n == 0) ? 0 :
n * log(
n /
b)) - (
n -
b));
9886 return (
n >=
b) ? sqrt(
t0) : -sqrt(
t0);
9895 if (
sOpt2.Contains(
"x=")) {
9897 int _idx =
sOpt2.Index(
"x=");
9913 }
else if (
ii == 1) {
9915 }
else if (
ii == 2) {
9923 for (
double x = min;
x <= max;
x += (max - min) / (nBins - 1)) {
9926 }
else if (nBins == 1)
9927 xPoints.push_back((min + max) / 2.);
9936 for (
int i = 0; i <
v->numBins(
GetName()); i++) {
9946 if (
sOpt2.Contains(
"force")) {
9960 Error(
"Draw",
"Can only compute forces with PDFs");
9972 if (
sOpt2.Contains(
"ratio") && !
sOpt2.Contains(
"auxratio"))
9974 if (
sOpt2.Contains(
"significance") && !
sOpt2.Contains(
"auxsignif"))
9975 sOpt +=
"auxSignif";
9986 sOpt.ReplaceAll(
"ratio",
"");
9987 sOpt.ReplaceAll(
"significance",
"");
9989 sOpt.ReplaceAll(
"nostack",
"");
9991 sOpt.ReplaceAll(
"same",
"");
9993 sOpt.ReplaceAll(
"goff",
"");
9995 sOpt.ReplaceAll(
"pull",
"");
9999 sOpt.ReplaceAll(
"e",
"");
10001 sOpt.ReplaceAll(
"txt",
"texte");
10003 sOpt.ReplaceAll(
"txt",
"text");
10016 if (
gPad->GetNumber() == 0) {
10036 hAxis =
dynamic_cast<TH1 *
>(
pad->GetPrimitive(
"axis"));
10038 for (
auto o : *
pad->GetListOfPrimitives()) {
10045 :
hAxis->GetXaxis()->GetName())
10067 double ymin =
hh->GetMinimum();
10068 double ymax =
hh->GetMaximum();
10069 if (
hh->GetMaximumStored() == -1111)
10071 if (
hh->GetMinimumStored() == -1111) {
10074 }
else if (
ymin < 0) {
10082 if (
hh->GetSumw2()) {
10084 double smallestErrUp3 = std::numeric_limits<double>::infinity();
10085 for (
int i = 1; i <=
hh->GetNbinsX(); i++) {
10105 double up =
ymax -
hh->GetBinContent(1);
10130 double ymax = -std::numeric_limits<double>::infinity();
10131 double ymin = std::numeric_limits<double>::infinity();
10132 for (
int i = 0; i <
gr->
GetN(); i++) {
10136 return std::make_pair(
ymin,
ymax);
10144 out->SetFillColor(out->GetLineColor());
10145 out->SetMarkerStyle(0);
10152 out->SetPointEYlow(out->GetN() - 1,
GetError());
10153 out->SetPointEYhigh(out->GetN() - 1, out->GetErrorYlow(out->GetN() - 1));
10166 pad->Divide(1, 2, 1
e-9, 1
e-9);
10167 pad->GetPad(1)->SetPad(0, 0.2, 1, 1);
10168 pad->GetPad(2)->SetPad(0, 0, 1, 0.2);
10170 optNoFR.ReplaceAll(
"pull",
"");
10180 gPad->GetFrame()->SetFillStyle(1001);
10181 gPad->SetTopMargin(0);
10182 gPad->SetBottomMargin(0);
10183 gPad->SetName(
"pull");
10187 Error(
"Draw",
"Couldn't find pull graph");
10196 throw std::runtime_error(
"Could not find scales in fit result");
10198 for (
auto i = 0; i <
pullGraph->GetN(); i++) {
10203 Warning(
"Draw",
"Found a non-var in the floatParsFinal list: %s - this shouldn't happen",
g->GetName());
10207 "%s=%g +/- %s [%g,%g]",
strlen(_p->GetTitle()) ? _p->GetTitle() : _p->GetName(), _p->getVal(),
10208 _p->hasAsymError() ?
TString::Format(
"(%g,%g)", _p->getAsymErrorHi(), _p->getAsymErrorLo()).Data()
10212 g->SetPointEYhigh(0,
pullGraph->GetErrorYhigh(i));
10213 g->SetPointEYlow(0,
pullGraph->GetErrorYlow(i));
10214 g->SetEditable(
true);
10215 g->SetHighlight(
true);
10216 g->SetMarkerStyle(20);
10217 g->SetMarkerSize(0.5);
10243 if (!
_v->IsHidden())
10252 pad->SetBorderSize(0);
10278 dynamic_cast<TPad *
>(
pad)->DivideSquare(_size, 1
e-9, 1
e-9);
10281 auto _pad =
pad->GetPad(_size);
10282 _pad->SetName(
"legend");
10284 _pad->SetPad(
_pad->GetXlowNDC(),
_pad->GetYlowNDC(), 1.0,
_pad->GetYlowNDC() +
_pad->GetHNDC());
10287 while (
pad->GetPad(
x + 1)) {
10288 pad->GetPad(
x + 1)->SetFillStyle(0);
10298 if (_range &&
strlen(_range)) {
10305 if (
_v->IsHidden())
10322 gPad->SetLeftMargin(std::min(
gPad->GetLeftMargin() * (1. /
gPad->GetWNDC()), 0.3));
10337 for (
auto &
_v : *
this) {
10338 if (
_v->IsHidden())
10344 if (
strcmp(
_v->get()->GetName(),
"1") == 0 ||
strcmp(
_v->get()->GetName(),
"ONE") == 0 ||
10347 if (
_v->get()->InheritsFrom(
"RooConstVar"))
10357 pad->SetBorderSize(0);
10358 dynamic_cast<TPad *
>(
pad)->DivideSquare(_size, 1
e-9, 1
e-9);
10361 for (
auto &
_v : *
this) {
10362 if (
_v->IsHidden())
10368 if (
strcmp(
_v->get()->GetName(),
"1") == 0 ||
strcmp(
_v->get()->GetName(),
"ONE") == 0 ||
10371 if (
_v->get()->InheritsFrom(
"RooConstVar"))
10380 gPad->SetLeftMargin(std::min(
gPad->GetLeftMargin() * (1. /
gPad->GetWNDC()), 0.3));
10402 if (
sOpt.Contains(
"corr")) {
10409 TH2 *hist =
nullptr;
10412 std::set<std::pair<double, size_t>>
maxCorrs;
10422 std::vector<size_t>
topN;
10432 for (
size_t i = 0; i <
topN.size(); i++) {
10435 for (
size_t j = 0;
j <
topN.size();
j++) {
10458 gPad->SetGrid(1, 1);
10464 if (
sOpt.Contains(
"brakdown")) {
10470 if (
sOpt.Contains(
"brakdown:")) {
10474 std::unique_ptr<RooAbsCollection> _poi(fr->
floatParsFinal().selectByAttrib(
"poi",
true));
10475 if (_poi->empty()) {
10476 throw std::runtime_error(
"No floating poi in the fit");
10477 }
else if (_poi->size() != 1) {
10478 throw std::runtime_error(
"Multiple poi in the fit");
10480 poiName = _poi->first()->GetName();
10486 std::set<std::string>
groups;
10490 }
else if (
p->getStringAttribute(
"group")) {
10491 groups.insert(
p->getStringAttribute(
"group"));
10493 groups.insert(
p->GetTitle());
10518 }
else if ((
p->getStringAttribute(
"group") &&
group ==
p->getStringAttribute(
"group")) ||
10519 (!
p->getStringAttribute(
"group") &&
group ==
p->GetTitle())) {
10527 Warning(
"Draw",
"breakdown group %s variance bigger than preceding?",
group.c_str());
10528 pie->SetEntryVal(i, 0);
10537 pie->SetEntryLabel(i,
group.c_str());
10552 pie->SetRadius(0.17);
10561 out->SetTitle(
"Fit Result Pulls");
10565 ugraph->SetTitle(
"Fit Result Pulls");
10567 std::map<std::string, double>
scale;
10568 std::map<std::string, double>
offset;
10574 if (std::isnan(
_v->getErrorHi()) || std::isnan(
_v->getErrorLo())) {
10575 Warning(
"Draw",
"%s error is invalid",
_v->GetName());
10589 std::shared_ptr<xRooNode>
pConstr;
10592 if (
_vv->hasRange(
"pullScale")) {
10602 for (
auto s :
c->get<
RooAbsArg>()->servers()) {
10603 if (
strcmp(s->GetName(),
p->GetName()) == 0) {
10625 std::string
xName =
pConstr->find(
".x")->get()->GetName();
10627 for (
auto &_d :
pConstr->vars()) {
10628 if (
strcmp(
p->GetName(), _d->get()->GetName()) == 0)
10630 if (
xName == _d->get()->GetName())
10666 Warning(
"Draw",
"failed to determine prefit error of %s, using post-fit error",
p->GetName());
10670 out->SetPointError(out->GetN() - 1, 0, 0, (-
_v->getErrorLo()) /
prefitError,
10681 prefitError = (std::max({
_v->getMax() -
_v->getVal(),
_v->getVal() -
_v->getMin(), 4.}) / 4);
10688 out->SetPointError(out->GetN() - 1, 0, 0, (-
_v->getErrorLo()) /
prefitError,
10700 prefitError = (std::max({
_v->getMax() -
_v->getVal(),
_v->getVal() -
_v->getMin(), 4.}) / 4);
10713 for (
int i = 0; i <
ugraph->GetN(); i++)
10714 ugraph->SetPointX(i, i + graph->GetN());
10727 graph->SetMarkerStyle(20);
10728 graph->SetMarkerSize(0.5);
10730 graph->SetMaximum(4);
10731 graph->SetMinimum(-4);
10734 (!
sOpt.Contains(
"impact") &&
sOpt.Contains(
"v")) || (
sOpt.Contains(
"impact") && !
sOpt.Contains(
"himpact"));
10736 std::vector<std::pair<double, std::string>>
covariances;
10739 if (
sOpt.Contains(
"impact")) {
10740 if (
sOpt.Contains(
"impact:")) {
10744 std::unique_ptr<RooAbsCollection> _poi(fr->
floatParsFinal().selectByAttrib(
"poi",
true));
10745 if (_poi->empty()) {
10746 throw std::runtime_error(
"No floating poi in the fit");
10747 }
else if (_poi->size() != 1) {
10748 throw std::runtime_error(
"Multiple poi in the fit");
10750 poiName = _poi->first()->GetName();
10771 [&](std::pair<double, std::string> i, std::pair<double, std::string>
j) {
10772 return doHorizontal ? (std::abs(i.first) < std::abs(j.first))
10773 : (std::abs(i.first) > std::abs(j.first));
10794 sortedGraph.SetPointError(
sortedGraph.GetN() - 1, 0, 0, graph->GetErrorYlow(i), graph->GetErrorYhigh(i));
10803 graph->SetTitle(
"Fit Result Impact");
10810 std::max(graph->GetN(), 1) - 0.5);
10819 hist =
new TH2D(
GetName(), fr->
GetTitle(), std::max(graph->GetN(), 1), -0.5, std::max(graph->GetN(), 1) - 0.5,
10845 graph->GetHistogram()->GetXaxis()->Set(std::max(graph->GetN(), 1), -0.5, std::max(graph->GetN(), 1) - 0.5);
10846 for (
int ii = 1;
ii <=
_axis->GetNbins();
ii++) {
10847 graph->GetHistogram()->GetXaxis()->SetBinLabel(
ii,
_axis->GetBinLabel(
ii));
10862 gPad->Divide(1, 1, 1
e-9, 1
e-9);
10866 gPad->SetLeftMargin(0.4);
10868 gPad->SetBottomMargin(0.4);
10871 auto pNamesHist =
dynamic_cast<TH1F *
>(graph->GetHistogram()->Clone(
"scales"));
10875 for (
int ii = 1;
ii <= graph->GetN();
ii++) {
10879 _axis->SetBinLabel(
ii,
strlen(_p->GetTitle()) ? _p->GetTitle() : _p->GetName());
10884 if (!
sOpt.Contains(
"impact")) {
10885 for (
int ii = 2;
ii >= 1;
ii--) {
10920 new TPaveText(
gPad->GetLeftMargin(), 1. -
gPad->GetTopMargin(), 1. -
gPad->GetRightMargin(), 0.98,
"NDCNB");
10921 pave->SetFillStyle(0);
10922 pave->SetBorderSize(0);
10923 pave->SetMargin(0.);
10924 pave->SetName(
"status");
10925 pave->SetTextAlign(31);
10931 case 0:
covQualTxt =
"Not calculated";
break;
10933 case 2:
covQualTxt =
"Forced Positive-Definite";
break;
10948 gPad->SetTicks(0, 0);
10952 if (
int(
gPad->GetCanvas()->GetWh()) <
pNamesHist->GetNbinsX() * 15) {
10953 gPad->GetCanvas()->SetCanvasSize(
gPad->GetCanvas()->GetWw(),
pNamesHist->GetNbinsX() * 15);
10957 double factor = 475. /
gPad->GetCanvas()->GetWh();
10986 for (
int tt = 0;
tt < 2;
tt++) {
10987 auto impact =
static_cast<TH1 *
>(
10988 graph->GetHistogram()->Clone(
TString::Format(
"%s_impact+",
tt == 0 ?
"prefit" :
"postfit")));
10991 impact->SetBarWidth(0.9);
10992 impact->SetBarOffset(0.05);
10993 impact->SetLineColor(
kBlack);
10994 impact->SetFillColor(
kAzure - 4);
10995 impact->SetFillStyle(
tt == 0 ? 3013 : 1001);
10997 static_cast<TH1 *
>(impact->Clone(
TString::Format(
"%s_impact-",
tt == 0 ?
"prefit" :
"postfit")));
10998 impact2->SetDirectory(
nullptr);
11006 impact->SetBinContent(
ii, ((
tt == 0 && !
vv_init->hasError()) || !
vv->hasError())
11008 :
c.first *
vv->getError() /
vv->getErrorHi() *
11009 (
tt == 0 ? (
vv_init->getErrorHi() /
vv->getErrorHi()) : 1.));
11012 :
c.first *
vv->getError() /
vv->getErrorLo() *
11013 (
tt == 0 ? (
vv_init->getErrorLo() /
vv->getErrorLo()) : 1.));
11020 for (
int ii = -1;
ii <= 1;
ii++) {
11033 leg1->SetFillStyle(0);
11034 leg1->SetBorderSize(0);
11035 leg1->SetMargin(0.25);
11036 leg1->SetNColumns(2);
11038 leg1->SetTextSize(
_axis->GetLabelSize());
11039 leg1->SetTextFont(
_axis->GetLabelFont());
11040 leg1->AddEntry((
TObject *)
nullptr,
"Hessian Pre-fit",
"");
11041 leg1->AddEntry((
TObject *)
nullptr,
"Impact:",
"");
11042 leg1->AddEntry(hist->
FindObject(
"prefit_impact+"),
"#theta = #hat{#theta}+#Delta#theta",
"f");
11043 leg1->AddEntry(hist->
FindObject(
"prefit_impact-"),
"#theta = #hat{#theta}-#Delta#theta",
"f");
11044 leg1->AddEntry((
TObject *)
nullptr,
"Hessian Post-fit",
"");
11045 leg1->AddEntry((
TObject *)
nullptr,
"Impact:",
"");
11046 leg1->AddEntry(hist->
FindObject(
"postfit_impact+"),
"#theta = #hat{#theta}+#Delta#theta",
"f");
11047 leg1->AddEntry(hist->
FindObject(
"postfit_impact-"),
"#theta = #hat{#theta}-#Delta#theta",
"f");
11053 new TPaveText(
gPad->GetLeftMargin(), 1. -
gPad->AbsPixeltoY(14), 1. -
gPad->GetRightMargin(), 1.,
"NDC");
11060 : ((
gPad->AbsPixeltoY(0) -
gPad->AbsPixeltoY(10 / factor)) / (
gPad->GetY2() -
gPad->GetY1())));
11068 graph->SetEditable(
false);
11072 graph->GetListOfFunctions()->Add(
pNamesHist,
"same");
11076 for (
int p = 0;
p < graph->GetN();
p++) {
11077 graph->SetPoint(
p, graph->GetPointY(
p), graph->GetPointX(
p));
11078 graph->SetPointError(
p, graph->GetErrorYlow(
p), graph->GetErrorYhigh(
p), graph->GetErrorXlow(
p),
11079 graph->GetErrorXhigh(
p));
11082 if (
f->InheritsFrom(
"TH1")) {
11091 else if (
auto g =
dynamic_cast<TGraph *
>(
f)) {
11092 for (
int p = 0;
p <
g->GetN();
p++) {
11093 g->SetPoint(
p,
g->GetPointY(
p),
g->GetPointX(
p));
11096 }
else if (
auto l =
dynamic_cast<TLine *
>(
f)) {
11106 if (!
sOpt.Contains(
"impact")) {
11113 auto x = graph->GetPointX(graph->GetN() -
ugraphLabels.size() + i);
11114 auto y = graph->GetPointY(graph->GetN() -
ugraphLabels.size() + i) +
11115 graph->GetErrorYhigh(graph->GetN() -
ugraphLabels.size() + i);
11119 t->SetTextSize(0.025);
11120 t->SetTextAngle(90);
11121 graph->GetListOfFunctions()->Add(t);
11125 graph->SetName(
"pulls");
11134 hist->
Draw(
"same");
11146 auto hh =
dynamic_cast<TH1 *
>(
histCopy->Clone(
".axiscopy"));
11147 hh->SetDirectory(
nullptr);
11165 for (
auto c : s->bins()) {
11166 auto _pad =
dynamic_cast<TPad *
>(
gPad->GetPrimitive(
c->GetName()));
11171 c->push_back(std::make_shared<xRooNode>(*
this));
11173 c->resize(
c->size() - 1);
11175 std::cout <<
" no ds " <<
GetName() <<
" - this should never happen!" << std::endl;
11194 for (
auto o : *
gPad->GetListOfPrimitives()) {
11219 for (
int i = 0; i <
dataGraph->GetN(); i++)
11236 for (
auto o : *
gPad->GetListOfPrimitives()) {
11237 if (
auto h =
dynamic_cast<TH1 *
>(o);
11247 if (
auto h =
dynamic_cast<TH1 *
>(
_pad->GetPrimitive(
"auxHist"));
h) {
11250 histName = histName(0, histName.
Index(
'|'));
11251 if (
auto mainHist =
dynamic_cast<TH1 *
>(
gPad->GetPrimitive(histName));
11257 for (
int i = 0; i <
ratioGraph->GetN(); i++) {
11269 if (!std::isnan(
yval)) {
11271 if (!std::isnan(yup))
11273 if (!std::isnan(
ydown))
11340 if (!
d->get()->TestBit(1 << 20))
11344 auto _obs =
d->obs();
11346 auto _nll =
nll(
d);
11348 int nevent =
theData->numEntries();
11349 for (
int i = 0; i < nevent; i++) {
11351 bool _skip =
false;
11352 for (
const auto &_c :
_coords) {
11354 if (cat->getIndex() !=
theData->get()->getCatIndex(cat->GetName())) {
11364 auto val = _nll.pars()->getRealValue(
initPar->GetName());
11367 auto nllVal = _nll.getEntryVal(i);
11368 _nll.pars()->setRealValue(
initPar->GetName(),
initPar->getVal());
11369 auto nllVal2 = _nll.getEntryVal(i);
11370 _nll.pars()->setRealValue(
initPar->GetName(), val);
11376 auto val = _nll.pars()->getRealValue(
initPar->GetName());
11379 auto _extTerm = _nll.extendedTermVal();
11380 _nll.pars()->setRealValue(
initPar->GetName(),
initPar->getVal());
11381 auto _extTerm2 = _nll.extendedTermVal();
11382 _nll.pars()->setRealValue(
initPar->GetName(), val);
11383 for (
int i = 1; i <=
emptyHist->GetNbinsX(); i++) {
11388 emptyHist->GetYaxis()->SetTitle(
"log (L(#theta)/L(#theta_{0}))");
11394 }
else if (
ii == 3) {
11420 (
rarNode->get()->InheritsFrom(
"RooRealSumPdf") ||
rarNode->get()->InheritsFrom(
"RooAddPdf") ||
11421 (
v &&
rarNode->get()->InheritsFrom(
"RooSimultaneous") &&
11429 auto h =
BuildHistogram(
v,
false,
hasErrorOpt, 1, 0,
"",
false,
false, 0,
nullptr,
nostack,
true );
11441 :
h->GetXaxis()->GetName())
11444 if (
h->GetXaxis()->IsAlphanumeric()) {
11452 if (
rar->InheritsFrom(
"RooAbsPdf") && !(
rar->InheritsFrom(
"RooRealSumPdf") ||
rar->InheritsFrom(
"RooAddPdf") ||
11453 rar->InheritsFrom(
"RooSimultaneous"))) {
11456 rar->leafNodeServerList(&s);
11463 for (
auto _p : s) {
11471 if (
_v->hasError()) {
11482 gPad->SetGrid(0, 0);
11484 gPad->SetGrid(1, 1);
11489 h->SetFillStyle(0);
11538 gROOT->SetEditHistograms(
true);
11540 gROOT->SetEditHistograms(
false);
11549 if (
dOpt.Contains(
"TEXT") ||
sOpt.Contains(
"text")) {
11554 bool hasError(
false);
11555 for (
int i = 0; i <
h->GetSumw2N(); i++) {
11556 if (
h->GetSumw2()->At(i)) {
11567 if (!
hasSame &&
h->GetYaxis()->GetTitleFont() % 10 == 2) {
11568 h->GetYaxis()->SetTitleOffset(1.);
11586 hCopy->SetDirectory(
nullptr);
11588 _hist->GetListOfFunctions()->Add(node);
11589 _hist->GetListOfFunctions()->Add(
new TExec(
11592 "gROOT->SetEditHistograms(true);auto h = dynamic_cast<TH1*>(gPad->GetPrimitive(\"%s\")); if(h) { double "
11593 "range= h->GetMaximum()-h->GetMinimum(); if(auto n "
11594 "= dynamic_cast<xRooNode*>(h->GetListOfFunctions()->FindObject(\"%s\")); n && "
11595 "n->TestBit(TObject::kNotDeleted) && n->get<RooRealVar>()->getVal() != h->GetBinContent(1)) {"
11596 "h->SetBinContent(1, "
11597 "TString::Format(\"%%.2g\",int(h->GetBinContent(1)/(range*0.01))*range*0.01).Atof());n->SetContent( "
11598 "h->GetBinContent(1) ); for(auto pp : *h->GetListOfFunctions()) if(auto hh = "
11599 "dynamic_cast<TH1*>(pp))hh->SetBinContent(1,h->GetBinContent(1));} if(h->GetBinContent(1)==0.) "
11600 "h->SetBinContent(1,range*0.005); gPad->Modified();gPad->Update(); }",
11601 _hist->GetName(), node->GetName())));
11603 errHist->GetListOfFunctions()->Add(
h,
"TEXT HIST same");
11604 errHist->SetFillColor(
h->GetLineColor());
11607 hCopy->SetFillStyle(0);
11608 _hist->GetListOfFunctions()->Add(
hCopy,
"TEXT HIST same");
11611 _hist->SetStats(
false);
11668 errHist->SetFillColor(
h->GetLineColor());
11685 (
rarNode->get()->InheritsFrom(
"RooSimultaneous") &&
11687 if (
auto stack =
dynamic_cast<THStack *
>(
h->FindObject(
"stack"))) {
11693 auto hhMin = (
hh->GetMinimum() == 0) ?
hh->GetMinimum(1
e-9) :
hh->GetMinimum();
11694 if (
lnk == stack->GetHists()->FirstLink() &&
h->GetMinimum() >
hhMin) {
11980 dOpt.ReplaceAll(
"TEXT",
"");
11982 double ymax = -std::numeric_limits<double>::infinity();
11983 double ymin = std::numeric_limits<double>::infinity();
11984 for (
int i = 1; i <=
errHist->GetNbinsX(); i++) {
12013 ratioHist->GetYaxis()->SetNdivisions(5, 0, 0);
12022 for (
int i = 1; i <=
ratioHist->GetNbinsX(); i++) {
12023 double val =
ratioHist->GetBinContent(i);
12024 double err =
ratioHist->GetBinError(i);
12031 if (
ratioHist->GetYaxis()->GetTitleFont() % 10 == 2) {
12038#if ROOT_VERSION_CODE < ROOT_VERSION(6, 26, 00)
12047 auto _h =
dynamic_cast<TH1 *
>(
ratioHist->Clone(
"auxHist_clone"));
12048 _h->SetDirectory(
nullptr);
12049 _h->SetFillColor(0);
12050 ratioHist->GetListOfFunctions()->Add(
_h,
"histsame");
12055 TString::Format(
"auto h1 = (TH1*)%p; auto h2 = (TH1*)%p; if(h2->GetXaxis()->GetFirst() != "
12056 "h1->GetXaxis()->GetFirst() || h1->GetXaxis()->GetLast()!=h2->GetXaxis()->GetLast()) "
12057 "{h2->GetXaxis()->SetRange(h1->GetXaxis()->GetFirst(),h1->GetXaxis()->GetLast());if(gPad) "
12058 "{gPad->GetCanvas()->Paint();gPad->GetCanvas()->Update();}}",
12068 if (
auto hr =
dynamic_cast<TH1 *
>(
ratioPad->GetPrimitive(
"auxHist"));
12072 histName = histName(0, histName.
Index(
'|'));
12074 if (
auto hnom =
dynamic_cast<TH1 *
>(
gPad->GetPrimitive(histName));
hnom) {
12075 h =
dynamic_cast<TH1 *
>(
h->Clone(
h->GetName()));
12078 for (
int i = 1; i <=
hnom->GetNbinsX(); i++) {
12079 double val =
h->GetBinContent(i);
12080 double err =
h->GetBinError(i);
12081 h->SetBinContent(i, std::get<0>(
auxFunctions[
hr->GetYaxis()->GetTitle()])(
12082 h->GetBinContent(i),
hnom->GetBinContent(i),
hnom->GetBinError(i)));
12083 h->SetBinError(i, std::get<0>(
auxFunctions[
hr->GetYaxis()->GetTitle()])(
12084 val + err,
hnom->GetBinContent(i),
hnom->GetBinError(i)) -
12085 h->GetBinContent(i));
12102 double ymax = -std::numeric_limits<double>::infinity();
12103 double ymin = std::numeric_limits<double>::infinity();
12104 for (
int i = 1; i <=
h->GetNbinsX(); i++) {
12105 ymax = std::max(
ymax,
h->GetBinContent(i) +
h->GetBinError(i));
12106 ymin = std::min(
ymin,
h->GetBinContent(i) -
h->GetBinError(i));
12140 if (
d->get()->TestBit(1 << 20)) {
12188 w->import(*
gROOT->GetListOfColors(),
true);
12191#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 26, 00)
12195 Info(
"SaveAs",
"%s saved to %s",
w->GetName(),
sFilename.Data());
12200 Error(
"SaveAs",
"json format workspaces only in ROOT 6.26 onwards");
12205#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
12209 for (
auto &
c :
w->components()) {
12210 c->_eocache =
nullptr;
12215 Info(
"SaveAs",
"%s saved to %s",
w->GetName(),
sFilename.Data());
12221 auto dir =
dest->GetDirectory(
source->GetName());
12225 for (
auto k : *
source->GetListOfKeys()) {
12226 auto key =
dynamic_cast<TKey *
>(k);
12227 const char *classname = key->GetClassName();
12236 if (dir->FindKey(key->GetName()))
12239 if (
strcmp(classname,
"ROOT::Fit::FitConfig") == 0) {
12241 dir->WriteObject(
fc, key->GetName());
12244 TObject *obj = key->ReadObj();
12246 dir->WriteTObject(obj, key->
GetName());
12253 if (
gROOT->GetListOfFiles()) {
12254 for (
auto key : *
gROOT->GetListOfFiles()) {
12265#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
12267 for (
auto &
c :
w->components()) {
12268 c->setExpensiveObjectCache(
w->expensiveObjectCache());
12278 return std::numeric_limits<double>::quiet_NaN();
12284 std::vector<double> out;
12285 out.reserve(
size());
12286 for (
auto child : *
this) {
12287 out.push_back(
child->GetContent());
12301 auto rho =
_fr->correlationMatrix();
12310 for (
int m = 0;
m < rho.GetNrows();
m++) {
12317 auto tmp = _p->getVal();
12318 _p->setVal(
p_m->getVal() +
p_m->getErrorHi());
12320 _p->setVal(
p_m->getVal() +
p_m->getErrorLo());
12323 for (
int n = 0;
n < rho.GetNrows();
n++) {
12331 _p2->setVal(
p_n->getVal() +
p_n->getErrorHi());
12333 _p2->setVal(
p_n->getVal() +
p_n->getErrorLo());
12336 for (
int i = 0; i < out.GetNrows(); i++) {
12337 for (
int j = 0;
j < out.GetNrows();
j++) {
12346std::pair<double, double>
12350 double err = std::numeric_limits<double>::quiet_NaN();
12352 std::unique_ptr<RooAbsCollection>
_snap;
12365 out =
c->getVal(
sobs);
12372#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 27, 00)
12375 out *=
p->expectedEvents(*_obs.get<
RooArgList>());
12376#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
12378 p->_normSet =
nullptr;
12382 p->setNormRange(
nullptr);
12385 auto f = std::shared_ptr<RooAbsReal>(
12386 p2->createIntegral(*std::unique_ptr<RooArgSet>(
p2->getObservables(*_obs.get<
RooArgList>())),
12390 out *=
f->getVal();
12400 for (
auto &
v : vals) {
12412 out = std::numeric_limits<double>::quiet_NaN();
12415 _pars.RooAbsCollection::operator=(*_snap);
12417 return std::make_pair(out, err);
12436 std::vector<double> out;
12442 binEnd = _hist->GetNbinsX();
12449 _hist->GetBinError(bin));
12574std::string cling::printValue(
const xRooNode *
v)
12577 return "nullptr\n";
12580 size_t left =
v->size();
12581 for (
auto n : *
v) {
12587 out +=
n->GetName();
12588 if (out.length() > 100 && left > 0) {
12594 out = std::string(
Form(
"<%s> %s",
v->get() ?
v->get()->ClassName() :
"nullptr",
v->GetName())) + out;
12599 return "<nullptr>";
12601 return Form(
"<%s> %s",
v->get() ?
v->get()->ClassName() :
"nullptr",
v->GetName());
#define ROOT_VERSION(a, b, c)
#define ROOT_VERSION_CODE
ROOT::RRangeCast< T, false, Range_t > static_range_cast(Range_t &&coll)
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
const char Option_t
Option string (const char)
static void indent(ostringstream &buf, int indent_level)
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
void Warning(const char *location, const char *msgfmt,...)
Use this function in warning situations.
winID h TVirtualViewer3D TVirtualGLPainter p
winID h TVirtualViewer3D vv
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 dest
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 filename
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 offset
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 np
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 char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t result
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 child
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 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
char * Form(const char *fmt,...)
Formats a string in a circular formatting buffer.
R__EXTERN TStyle * gStyle
R__EXTERN TSystem * gSystem
double GetBinLowEdge(Int_t bin) const override
Return low edge of bin.
double GetBinUpEdge(Int_t bin) const override
Return up edge of bin.
Int_t FindFixBin(double x) const override
Find bin number corresponding to abscissa x
void Set(Int_t nbins, const double *xbins) override
Initialize axis with variable bins.
RooAbsRealLValue * rvar() const
void SetTitle(const char *title) override
Set the title of the TNamed.
void Set(Int_t nbins, double xmin, double xmax) override
Initialize axis with fix bins.
Int_t FindFixBin(const char *label) const override
Find bin number with label.
RooAbsLValue * var() const
const RooAbsBinning * binning() const
void Set(Int_t nbins, const float *xbins) override
Initialize axis with variable bins.
const char * GetTitle() const override
Returns title of object.
double GetBinWidth(Int_t bin) const override
Return bin width.
PadRefresher(TVirtualPad *p)
A class which maps the current values of a RooRealVar (or a set of RooRealVars) to one of a number of...
bool isBinnedDistribution(const RooArgSet &obs) const override
Tests if the distribution is binned. Unless overridden by derived classes, this always returns false.
bool selfNormalized() const override
Shows if a PDF is self-normalized, which means that no attempt is made to add a normalization term.
double getSimplePropagatedError(const RooFitResult &fr, const RooArgSet &nset_in) const
double evaluate() const override
Evaluate this PDF / function / constant. Needs to be overridden by all derived classes.
TObject * clone(const char *newname) const override
std::list< double > * binBoundaries(RooAbsRealLValue &obs, double xlo, double xhi) const override
Retrieve bin boundaries if this distribution is binned in obs.
PdfWrapper(const PdfWrapper &other, const char *name=nullptr)
PdfWrapper(RooAbsReal &f, RooAbsReal *coef, bool expEvMode=false, RooAbsPdf *expPdf=nullptr)
The PiecewiseInterpolation is a class that can morph distributions into each other,...
static std::shared_ptr< RooLinkedList > createNLLOptions()
static std::pair< std::shared_ptr< RooAbsData >, std::shared_ptr< const RooAbsCollection > > generateFrom(RooAbsPdf &pdf, const RooFitResult &fr, bool expected=false, int seed=0)
static xRooNLLVar createNLL(const std::shared_ptr< RooAbsPdf > pdf, const std::shared_ptr< RooAbsData > data, const RooLinkedList &nllOpts)
static std::pair< double, double > matchPrecision(const std::pair< double, double > &in)
void Draw(Option_t *opt="") override
Default Draw method for all objects.
void Draw(Option_t *opt="") override
Default Draw method for all objects.
This xRooNLLVar object has several special methods, e.g.
xRooHypoSpace hypoSpace(const char *parName, int nPoints, double low, double high, double alt_value=std::numeric_limits< double >::quiet_NaN(), const xRooFit::Asymptotics::PLLType &pllType=xRooFit::Asymptotics::Unknown, int tsType=0)
The xRooNode class is designed to wrap over a TObject and provide functionality to aid with interacti...
void _Add_(const char *name, const char *opt)
TH1 * BuildHistogram(RooAbsLValue *v=nullptr, bool empty=false, bool errors=false, int binStart=1, int binEnd=0, const xRooNode &fr="", bool errorsHi=false, bool errorsLo=false, int nErrorToys=0, TH1 *templateHist=nullptr, bool nostack=true, bool setInterp=false) const
xRooNode filter(const xRooNode &range) const
std::vector< std::shared_ptr< xRooNode > > fBrowsables
xRooNLLVar nll(const xRooNode &_data, std::initializer_list< RooCmdArg > nllOpts) const
xRooNode poi() const
List of parameters of interest: parameters marked as "of interest" These parameters have the "poi" at...
void SetName(const char *name) override
Set the name of the TNamed.
TGListTreeItem * GetTreeItem(TBrowser *b) const
void SetTitle(const char *title) override
Set the title of the TNamed.
xRooNode Multiply(const xRooNode &child, Option_t *opt="")
xRooNode Replace(const xRooNode &node)
bool SetData(const TObject &obj, const xRooNode &data="obsData")
xRooNode datasets() const
xRooNode Remove(const xRooNode &child)
xRooNode globs() const
List of global observables of this node.
xRooNode Add(const xRooNode &child, Option_t *opt="")
xRooNode(const char *type, const char *name, const char *title="")
const char * GetIconName() const override
Returns mime type name of object.
void Draw(Option_t *opt="") override
Default Draw method for all objects.
bool _IsShowVars_() const
TGraph * BuildGraph(RooAbsLValue *v=nullptr, bool includeZeros=false, TVirtualPad *fromPad=nullptr) const
const std::shared_ptr< xRooNode > & at(size_t idx, bool browseResult=true) const
std::string fRange
! only here so can have char* GetRange return so can return nullptr for no range set !...
const char * GetNodeType() const
void _fit_(const char *constParValues="", const char *options="GoF")
bool SetBinContent(int bin, double value, const char *par=nullptr, double parVal=1)
std::shared_ptr< xRooNode > operator[](size_t idx)
void Checked(TObject *obj, bool val)
void Print(Option_t *opt="") const override
Print TNamed name and title.
double GetContent() const
std::shared_ptr< T > acquireNew(Args &&...args)
xRooNode components() const
void SaveAs(const char *filename="", Option_t *option="") const override
Save this object in the file specified by filename.
xRooNode bins() const
bins of a channel or sample, or channels of a multi-channel pdf
std::shared_ptr< xRooNode > find(const std::string &name, bool browseResult=true) const
TGListTree * GetListTree(TBrowser *b) const
xRooNode styles(TObject *initObject=nullptr, bool autoCreate=true) const
xRooNode generate(const xRooNode &fr="", bool expected=false, int seed=0)
void Inspect() const override
Dump contents of this object in a graphics canvas.
std::shared_ptr< xRooNode > getBrowsable(const char *name) const
bool SetXaxis(const RooAbsBinning &binning)
double GetBinError(int bin, const xRooNode &fr="", int nToys=0, bool errorsHi=false, bool errorsLo=false) const
RooArgList argList() const
bool SetBinData(int bin, double value, const xRooNode &data="obsData")
void SetHidden(bool set=true)
std::vector< double > GetBinContents(int binStart=1, int binEnd=0) const
xRooNode pp() const
List of prespecified parameters: non-floatable parameters.
double GetError(const xRooNode &fr="", int nToys=0, bool errorsHi=false, bool errorsLo=false) const
xRooNode constraints() const
std::shared_ptr< xRooNode > fProvider
! like a parent but only for use by getObject
std::shared_ptr< TStyle > style(TObject *initObject=nullptr, bool autoCreate=true) const
xRooNode mainChild() const
xRooNode fitResult(const char *opt="") const
std::shared_ptr< TAxis > fXAxis
! appears that if was fXaxis then dialog box for SetXaxis will take as current value
xRooNode coords(bool setVals=true) const
xRooNode Vary(const xRooNode &child)
xRooNode Constrain(const xRooNode &child)
static std::map< std::string, std::tuple< std::function< double(double, double, double)>, bool > > auxFunctions
xRooNode pars() const
List of parameters (non-observables) of this node.
void _SetContent_(double value)
void SetFitResult(const RooFitResult *fr=nullptr)
void _ShowVars_(bool set=true)
xRooNode coefs(bool recurse=false) const
bool IsFolder() const override
Returns kTRUE in case object contains browsable objects (like containers or lists of other objects).
double GetBinData(int bin, const xRooNode &data="obsData")
bool SetBinError(int bin, double value)
void _Vary_(const char *what)
bool SetContents(const TObject &obj)
std::shared_ptr< TObject > fComp
!
std::pair< double, double > IntegralAndError(const xRooNode &fr="", const char *rangeName=nullptr, int nToys=0, bool errorsHi=false, bool errorsLo=false) const
std::vector< double > contents() const
RooWorkspace * ws() const
The RooWorkspace this node belong to, if any.
xRooNode shallowCopy(const std::string &name, std::shared_ptr< xRooNode > parent=nullptr)
void _generate_(const char *name="", bool expected=false)
std::shared_ptr< TObject > getObject(const std::string &name, const std::string &type="") const
xRooNode np() const
List of nuisance parameters: non-constant parameters that are not marked of interest,...
xRooNode Combine(const xRooNode &rhs, bool silent=false)
xRooNode floats() const
List of parameters that are currently non-constant These parameters do not have the "Constant" attrib...
bool contains(const std::string &name) const
double GetBinContent(int bin) const
xRooNode reduced(const std::string &range="", bool invert=false) const
xRooNode variations() const
std::string GetPath() const
std::vector< double > GetBinErrors(int binStart=1, int binEnd=0, const xRooNode &fr="", int nToys=0, bool errorsHi=false, bool errorsLo=false) const
auto begin() const -> xRooNodeIterator
std::shared_ptr< xRooNode > parentPdf() const
bool SetContent(double value)
void _scan_(const char *what="plr", double nToys=0, const char *xvar="", int nPointsX=0, double lowX=0, double highX=0, const char *constParValues="", const char *options="")
std::shared_ptr< xRooNode > fParent
!
xRooNode robs() const
List of regular observables of this node.
TClass * IsA() const override
xRooNode & operator=(const TObject &o)
auto end() const -> xRooNodeIterator
xRooNode consts() const
List of parameters that are currently constant.
void _SetBinContent_(int bin, double value, const char *par="", double parVal=1)
std::shared_ptr< TObject > acquire(const std::shared_ptr< TObject > &arg, bool checkFactory=false, bool mustBeNew=false)
std::function< xRooNode(xRooNode *) fBrowseOperation)
void _SetAttribute_(const char *name, const char *value=nullptr)
xRooNode histo(const xRooNode &vars="x", const xRooNode &fr="", bool content=true, bool errors=true, bool stack=true, bool errorsHi=false, bool errorsLo=false, int nErrorToys=0) const
void Browse(TBrowser *b=nullptr) override
Browse object. May be overridden for another default action.
xRooNode obs() const
List of observables (global and regular) of this node.
void SetRange(const char *range, double low=std::numeric_limits< double >::quiet_NaN(), double high=std::numeric_limits< double >::quiet_NaN())
static void SetAuxFunction(const char *title, const std::function< double(double, double, double)> &func, bool symmetrize=false)
std::shared_ptr< TObject > convertForAcquisition(xRooNode &acquirer, const char *opt="") const
xRooNode vars() const
List of variables (observables and parameters) of this node.
const char * GetRange() const
TMatrixDSym covariances(const xRooNode &fr="") const
Class describing the configuration of the fit, options and parameter settings using the ROOT::Fit::Pa...
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.
void setStringAttribute(const Text_t *key, const Text_t *value)
Associate string 'value' to this object under key 'key'.
RooFit::OwningPtr< RooArgSet > getObservables(const RooArgSet &set, bool valueOnly=true) const
Given a set of possible observables, return the observables that this PDF depends on.
void SetName(const char *name) override
Set the name of the TNamed.
const Text_t * getStringAttribute(const Text_t *key) const
Get string attribute mapped under key 'key'.
bool getAttribute(const Text_t *name) const
Check if a named attribute is set. By default, all attributes are unset.
TObject * Clone(const char *newname=nullptr) const override
Make a clone of an object using the Streamer facility.
virtual bool isFundamental() const
Is this object a fundamental type that can be added to a dataset? Fundamental-type subclasses overrid...
Abstract base class for RooRealVar binning definitions.
virtual double highBound() const =0
virtual double lowBound() const =0
Abstract base class for objects that represent a discrete value that can be set from the outside,...
A space to attach TBranches.
const char * getLabel() const
Retrieve current label. Use getCurrentLabel() for more clarity.
Abstract container object that can hold multiple RooAbsArg objects.
RooAbsCollection * selectByAttrib(const char *name, bool value) const
Create a subset of the current collection, consisting only of those elements with the specified attri...
virtual bool remove(const RooAbsArg &var, bool silent=false, bool matchByNameOnly=false)
Remove the specified argument from our list.
virtual bool add(const RooAbsArg &var, bool silent=false)
Add the specified argument to list.
Storage_t::size_type size() const
bool selectCommon(const RooAbsCollection &refColl, RooAbsCollection &outColl) const
Create a subset of the current collection, consisting only of those elements that are contained as we...
std::string contentsString() const
Return comma separated list of contained object names as STL string.
RooAbsArg * find(const char *name) const
Find object with given name in list.
Abstract base class for binned and unbinned datasets.
RooFit::OwningPtr< RooAbsData > reduce(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
Create a reduced copy of this dataset.
RooArgSet const * getGlobalObservables() const
Returns snapshot of global observables stored in this data.
Abstract base class for objects that are lvalues, i.e.
Abstract interface for all probability density functions.
bool canBeExtended() const
If true, PDF can provide extended likelihood term.
Abstract base class for objects that represent a real value that may appear on the left hand side of ...
void setBin(Int_t ibin, const char *rangeName=nullptr) override
Set value to center of bin 'ibin' of binning 'rangeName' (or of default binning if no range is specif...
Context to temporarily change the error logging mode as long as the context is alive.
Abstract base class for objects that represent a real value and implements functionality common to al...
bool isSelectedComp() const
If true, the current pdf is a selected component (for use in plotting)
double getVal(const RooArgSet *normalisationSet=nullptr) const
Evaluate object.
virtual void forceNumInt(bool flag=true)
Efficient implementation of a sum of PDFs of the form.
Calculates the sum of a set of RooAbsReal terms, or when constructed with two sets,...
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.
Abstract interface for RooAbsArg proxy classes.
RooArgSet is a container object that can hold multiple RooAbsArg objects.
Implements a RooAbsBinning in terms of an array of boundary values, posing no constraints on the choi...
Object to represent discrete states.
bool defineType(const std::string &label)
Define a state with given name.
Named container for two doubles, two integers two object points and three string pointers that can be...
static const RooCmdArg & none()
Return reference to null argument.
TObject * Clone(const char *newName=nullptr) const override
Make a clone of an object using the Streamer facility.
Represents a constant real-valued object.
Container class to hold N-dimensional binned data.
Container class to hold unbinned data.
RooFitResult is a container class to hold the input and output of a PDF fit to a dataset.
TMatrixDSym conditionalCovarianceMatrix(const RooArgList ¶ms) const
Return a reduced covariance matrix, which is calculated as.
void setCovQual(Int_t val)
const TMatrixDSym & covarianceMatrix() const
Return covariance matrix.
Int_t statusCodeHistory(UInt_t icycle) const
const RooArgList & floatParsInit() const
Return list of floating parameters before fit.
TMatrixDSym reducedCovarianceMatrix(const RooArgList ¶ms) const
Return a reduced covariance matrix (Note that Vred is a simple sub-matrix of V, row/columns are order...
const RooArgList & randomizePars() const
Generate random perturbations of the final parameters using the covariance matrix.
void setCovarianceMatrix(TMatrixDSym &V)
Store externally provided correlation matrix in this RooFitResult ;.
double edm() const
Return estimated distance to minimum.
const RooArgList & constPars() const
Return list of constant parameters.
const char * statusLabelHistory(UInt_t icycle) const
Int_t covQual() const
Return MINUIT quality code of covariance matrix.
TH2 * correlationHist(const char *name="correlation_matrix") const
Return TH2D of correlation matrix.
const RooArgList & floatParsFinal() const
Return list of floating parameters after fit.
Int_t status() const
Return MINUIT status code.
void setFinalParList(const RooArgList &list)
Fill the list of final values of the floating parameters.
UInt_t numStatusHistory() const
const TMatrixDSym & correlationMatrix() const
Return correlation matrix ;.
double minNll() const
Return minimized -log(L) value.
Implementation of a probability density function that takes a RooArgList of servers and a C++ express...
A real-valued function sampled from a multidimensional histogram.
bool isBinnedDistribution(const RooArgSet &) const override
Tests if the distribution is binned. Unless overridden by derived classes, this always returns false.
Collection class for internal use, storing a collection of RooAbsArg pointers in a doubly linked list...
static RooMsgService & instance()
Return reference to singleton instance.
Implementation of a RooCacheManager<RooAbsCacheElement> that specializes in the storage of cache elem...
Efficient implementation of a product of PDFs of the form.
Represents the product of a given set of RooAbsReal objects.
A RooAbsPdf implementation that represent a projection of a given input p.d.f and the object returned...
RooProjectedPdf()
Default constructor.
Implements a PDF constructed from a sum of functions:
Variable that can be changed from the outside.
void setVal(double value) override
Set value of variable to 'value'.
void setError(double value)
bool hasError(bool allowZero=true) const
Facilitates simultaneous fitting of multiple PDFs to subsets of a given dataset.
const RooAbsCategoryLValue & indexCat() const
HypoTestResult is a base class for results from hypothesis tests.
< A class that holds configuration information for a model using a workspace as a store
A RooAbsArg implementing string values.
Persistable container for RooFit projects.
bool removeSet(const char *name)
Remove a named set from the workspace.
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.
virtual void SetTickSize(Float_t size=0.03)
virtual void SetNdivisions(Int_t n=510, Bool_t optim=kTRUE)
Set the number of divisions for this axis.
Fill Area Attributes class.
virtual void SetFillStyle(Style_t fstyle)
Set the fill area style.
virtual Size_t GetMarkerSize() const
Return the marker size.
virtual Font_t GetTextFont() const
Return the text font.
virtual void SetTextSize(Float_t tsize=1)
Set the text size.
Class to manage histogram axis.
virtual void LabelsOption(Option_t *option="h")
Set option(s) to draw axis with labels option can be:
virtual void SetBinLabel(Int_t bin, const char *label)
Set label for bin.
TAxis()
Default constructor.
virtual void Set(Int_t nbins, Double_t xmin, Double_t xmax)
Initialize axis with fix bins.
virtual Int_t FindFixBin(Double_t x) const
Find bin number corresponding to abscissa x
Using a TBrowser one can browse all ROOT objects.
TBrowserImp * GetBrowserImp() const
static TCanvas * MakeDefCanvas()
Static function to build a default canvas.
TClass instances represent classes, structs and namespaces in the ROOT type system.
Bool_t InheritsFrom(const char *cl) const override
Return kTRUE if this class inherits from a class with name "classname".
static TClass * GetClass(const char *name, Bool_t load=kTRUE, Bool_t silent=kFALSE)
Static method returning pointer to TClass of the specified class name.
static Int_t GetColorPalette(Int_t i)
Static function returning the color number i in current palette.
static void InitializeColors()
Initialize colors used by the TCanvas based graphics (via TColor objects).
static Int_t GetNumberOfColors()
Static function returning number of colors in the color palette.
TDirectory::TContext keeps track and restore the current directory.
Describe directory structure in memory.
virtual Int_t GetValue(const char *name, Int_t dflt) const
Returns the integer value for a resource.
virtual void SetValue(const char *name, const char *value, EEnvLevel level=kEnvChange, const char *type=nullptr)
Set the value of a resource or create a new resource.
TExec is a utility class that can be used to execute a C++ command when some event happens in a pad.
A ROOT file is an on-disk file, usually with extension .root, that stores objects in a file-system-li...
Create a dialog for fit function parameter settings.
System file browser, used as TRootBrowser plug-in.
A list tree is a widget that can contain a number of items arranged in a tree structure.
ROOT GUI Window base class.
virtual void SetTitle(const char *title="")
Change the title of the axis.
virtual void ImportAxisAttributes(TAxis *axis)
Internal method to import TAxis attributes to this TGaxis.
TGraph with asymmetric error bars.
A TGraphErrors is a TGraph with error bars.
Double_t GetErrorYlow(Int_t bin) const override
It returns the error along Y at point i.
Double_t GetErrorYhigh(Int_t bin) const override
It returns the error along Y at point i.
A TGraph is an object made of two arrays X and Y with npoints each.
void SetName(const char *name="") override
Set graph name.
void Draw(Option_t *chopt="") override
Draw this graph with its current attributes.
virtual Double_t GetPointY(Int_t i) const
Get y value for point i.
1-D histogram with a double per channel (see TH1 documentation)
1-D histogram with a float per channel (see TH1 documentation)
TH1 is the base class of all histogram classes in ROOT.
virtual void SetDirectory(TDirectory *dir)
By default, when a histogram is created, it is added to the list of histogram objects in the current ...
void SetTitle(const char *title) override
Change/set the title.
virtual Int_t GetNbinsY() const
@ kNoTitle
Don't draw the histogram title.
TObject * FindObject(const char *name) const override
Search object named name in the list of functions.
virtual void SetMaximum(Double_t maximum=-1111)
virtual Bool_t Add(TF1 *h1, Double_t c1=1, Option_t *option="")
Performs the operation: this = this + c1*f1 if errors are defined (see TH1::Sumw2),...
void Draw(Option_t *option="") override
Draw this histogram with options.
virtual void SetMinimum(Double_t minimum=-1111)
TList * GetListOfFunctions() const
virtual void Scale(Double_t c1=1, Option_t *option="")
Multiply this histogram by a constant c1.
TObject * Clone(const char *newname="") const override
Make a complete copy of the underlying object.
virtual void SetStats(Bool_t stats=kTRUE)
Set statistics option on/off.
2-D histogram with a double per channel (see TH1 documentation)
Service class for 2-D histogram classes.
Int_t Fill(Double_t) override
Invalid Fill method.
The Histogram stack class.
virtual void Add(TH1 *h, Option_t *option="")
Add a new histogram to the list.
Book space in a file, create I/O buffers, to fill them, (un)compress them.
To draw Mathematical Formula.
Storage class for one entry of a TLegend.
This class displays a legend box (TPaveText) containing several legend entries.
Use the TLine constructor to create a simple line.
virtual void SetY2(Double_t y2)
virtual void SetX2(Double_t x2)
virtual void SetX1(Double_t x1)
virtual void SetY1(Double_t y1)
void Clear(Option_t *option="") override
Remove all objects from the list.
void Add(TObject *obj) override
A TMemFile is like a normal TFile except that it reads and writes only from memory.
A TMultiGraph is a collection of TGraph (or derived) objects.
virtual void Add(TGraph *graph, Option_t *chopt="")
Add a new graph to the list of graphs.
void Draw(Option_t *chopt="") override
Draw this multigraph with its current attributes.
The TNamed class is the base class for all named ROOT classes.
TObject * Clone(const char *newname="") const override
Make a clone of an object using the Streamer facility.
virtual void SetTitle(const char *title="")
Set the title of the TNamed.
const char * GetName() const override
Returns name of object.
const char * GetTitle() const override
Returns title of object.
virtual void SetName(const char *name)
Set the name of the TNamed.
virtual void SetNameTitle(const char *name, const char *title)
Set all the TNamed parameters (name and title).
Wrapper around a TObject so it can be stored in a TList.
Mother of all ROOT objects.
virtual void Inspect() const
Dump contents of this object in a graphics canvas.
virtual const char * GetName() const
Returns name of object.
virtual TObject * Clone(const char *newname="") const
Make a clone of an object using the Streamer facility.
virtual const char * ClassName() const
Returns name of class to which the object belongs.
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
virtual TObject * DrawClone(Option_t *option="") const
Draw a clone of this object in the current selected pad with: gROOT->SetSelectedPad(c1).
virtual TObject * FindObject(const char *name) const
Must be redefined in derived classes.
virtual void SaveAs(const char *filename="", Option_t *option="") const
Save this object in the file specified by filename.
virtual void Delete(Option_t *option="")
Delete this object.
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
virtual Bool_t InheritsFrom(const char *classname) const
Returns kTRUE if object inherits from class "classname".
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
virtual const char * GetTitle() const
Returns title of object.
virtual void Draw(Option_t *option="")
Default Draw method for all objects.
virtual void Print(Option_t *option="") const
This method must be overridden when a class wants to print itself.
@ kCanDelete
if object in a list can be deleted
virtual void Info(const char *method, const char *msgfmt,...) const
Issue info message.
The most important graphics class in the ROOT system.
A Pave (see TPave) with text, lines or/and boxes inside.
virtual TText * AddText(Double_t x1, Double_t y1, const char *label)
Add a new Text line to this pavetext at given coordinates.
virtual void SetY1NDC(Double_t y1)
virtual void ConvertNDCtoPad()
Convert pave coordinates from NDC to Pad coordinates.
virtual void SetBorderSize(Int_t bordersize=4)
Sets the border size of the TPave box and shadow.
virtual void SetY2NDC(Double_t y2)
This is the ROOT implementation of the Qt object communication mechanism (see also http://www....
Regular expression class.
This class creates a ROOT object browser, constituted by three main tabs.
Sequenceable collection abstract base class.
Provides iteration through tokens of a given string.
Bool_t NextToken()
Get the next token, it is stored in this TString.
Bool_t IsDec() const
Returns true if all characters in string are decimal digits (0-9).
Int_t Atoi() const
Return integer value of string.
Bool_t EndsWith(const char *pat, ECaseCompare cmp=kExact) const
Return true if string ends with the specified string.
Double_t Atof() const
Return floating-point value contained in string.
Bool_t IsFloat() const
Returns kTRUE if string contains a floating point or integer number.
const char * Data() const
Bool_t IsAlpha() const
Returns true if all characters in string are alphabetic.
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.
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
TStyle objects may be created to define special styles.
void SetPaintTextFormat(const char *format="g")
Int_t GetOptTitle() const
Float_t GetLabelSize(Option_t *axis="X") const
Return label size.
Float_t GetPadRightMargin() const
Style_t GetTitleFont(Option_t *axis="X") const
Return title font.
Bool_t GetHistMinimumZero() const
Float_t GetPadLeftMargin() const
Float_t GetTitleYSize() const
Double_t GetHistTopMargin() const
Float_t GetPadBottomMargin() const
const char * GetPaintTextFormat() const
Float_t GetPadTopMargin() const
virtual Bool_t ExpandPathName(TString &path)
Expand a pathname getting rid of special shell characters like ~.
virtual Bool_t AccessPathName(const char *path, EAccessMode mode=kFileExists)
Returns FALSE if one can access a file using the specified access mode.
virtual Bool_t ProcessEvents()
Process pending events (GUI, timers, sockets).
The TTimeStamp encapsulates seconds and ns since EPOCH.
This class defines a UUID (Universally Unique IDentifier), also known as GUIDs (Globally Unique IDent...
const char * AsString() const
Return UUID as string. Copy string immediately since it will be reused.
static TVirtualPadEditor * GetPadEditor(Bool_t load=kTRUE)
Returns the pad editor dialog. Static method.
TVirtualPad is an abstract base class for the Pad and Canvas classes.
double evaluate() const override
Evaluate projected p.d.f.
TObject * clone(const char *newname) const override
double expectedEvents(const RooArgSet *nset) const override
Return expected number of events to be used in calculation of extended likelihood.
ExtendMode extendMode() const override
Returns ability of PDF to provide extended likelihood terms.
RooCmdArg RecycleConflictNodes(bool flag=true)
RooConstVar & RooConst(double val)
RooCmdArg Embedded(bool flag=true)
RooCmdArg WeightVar(const char *name="weight", bool reinterpretAsWeight=false)
RooCmdArg GlobalObservables(Args_t &&... argsOrArgSet)
RooCmdArg ExternalConstraints(const RooArgSet &constraintPdfs)
RooCmdArg Range(const char *rangeName, bool adjustNorm=true)
double gaussian_cdf(double x, double sigma=1, double x0=0)
Alternative name for same function.
CoordSystem::Scalar get(DisplacementVector2D< CoordSystem, Tag > const &p)
bool EndsWith(std::string_view string, std::string_view suffix)
The namespace RooFit contains mostly switches that change the behaviour of functions of PDFs (or othe...
static constexpr auto NumIntegration
Alias of MsgLevel::NumericIntegration for backwards compatibility.
MsgLevel
Verbosity level for RooMsgService::StreamConfig in RooMsgService.
constexpr Double_t C()
Velocity of light in .
Double_t Prob(Double_t chi2, Int_t ndf)
Computation of the probability for a certain Chi-squared (chi2) and number of degrees of freedom (ndf...
Double_t ChisquareQuantile(Double_t p, Double_t ndf)
Evaluate the quantiles of the chi-squared probability distribution function.
Double_t StdDev(Long64_t n, const T *a, const Double_t *w=nullptr)
#define BEGIN_XROOFIT_NAMESPACE
#define END_XROOFIT_NAMESPACE
bool isNaNWithPayload() const
Test if this struct has a float packed into its mantissa.
static float unpackNaN(double val)
If val is NaN and a this NaN has been tagged as containing a payload, unpack the float from the manti...
static uint64_t sum(uint64_t i)
void(* gOldHandlerr)(int)
void addLegendEntry(TObject *o, const char *title, const char *opt)
void buildHistogramInterrupt(int signum)
auto GETACTBROWSER(TRootBrowser *b)
auto & GETWSSNAPSHOTS(RooWorkspace *w)
bool TopRightPlaceBox(TPad *p, TObject *o, double w, double h, double &xl, double &yb)
TPaveText * getPave(const char *name="labels", bool create=true, bool doPaint=false)
std::string formatLegendString(const std::string &s)
auto GETROOTDIR(TGFileBrowser *b)
const xRooNode * runningNode
auto GETLISTTREE(TGFileBrowser *b)
const T & _or_func(const T &a, const T &b)
double new_getPropagatedError(const RooAbsReal &f, const RooFitResult &fr, const RooArgSet &nset={}, RooArgList **pars=nullptr, bool asymHi=false, bool asymLo=false)
TLegend * getLegend(bool create=true, bool doPaint=false)