22#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
23#define protected public
28#if ROOT_VERSION_CODE < ROOT_VERSION(6, 33, 00)
61#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
63#define GETWS(a) a->_myws
64#define GETWSSETS(w) w->_namedSets
66#define GETWS(a) a->workspace()
67#define GETWSSETS(w) w->sets()
74#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
75#define protected public
104std::set<int> xRooNLLVar::xRooHypoPoint::allowedStatusCodes = {0};
115 fOldTitle =
fNll->get()->getStringAttribute(
"fitresultTitle");
140 std::unique_ptr<RooAbsCollection>
fSnap;
143 std::pair<std::shared_ptr<RooAbsData>, std::shared_ptr<const RooAbsCollection>>
fOldData;
152 std::make_pair(std::shared_ptr<RooAbsData>(
data.first, [](
RooAbsData *) {}),
159 const std::pair<std::shared_ptr<RooAbsData>, std::shared_ptr<const RooAbsCollection>> &
data,
164#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 37, 00)
181 for (
int i = 0; i < opts.
GetSize(); i++) {
184 if (strcmp(opts.
At(i)->
GetName(),
"GlobalObservables") == 0) {
189 throw std::runtime_error(
"GlobalObservables mismatch");
197 auto _vars = std::unique_ptr<RooArgSet>(
fPdf->getVariables());
198 if (
auto extCon =
dynamic_cast<RooCmdArg *
>(
fOpts->find(
"ExternalConstraints"))) {
199 for (
auto con : *extCon->getSet(0)) {
200 _vars->add(*std::unique_ptr<RooArgSet>(con->getVariables()));
203 auto _funcGlobs = std::unique_ptr<RooArgSet>(
dynamic_cast<RooArgSet *
>(_vars->selectCommon(*
fGlobs)));
207 if (
auto flag =
dynamic_cast<RooCmdArg *
>(
fOpts->find(
"ReuseNLL"))) {
213 if (
auto range =
dynamic_cast<RooCmdArg *
>(
fOpts->find(
"RangeWithName"))) {
214 TString rangeName = range->getString(0);
221 std::vector<TString> chanPatterns;
223 bool hasRange(
false);
224 std::string noneCatRanges;
226 chanPatterns.emplace_back(pattern);
227 if (_cat.hasRange(chanPatterns.back())) {
230 if (!noneCatRanges.empty())
231 noneCatRanges +=
",";
232 noneCatRanges += chanPatterns.back();
239 if (noneCatRanges.empty()) {
240 fOpts->Remove(range);
243 range->setString(0, noneCatRanges.c_str());
247 std::make_shared<RooSimultaneous>(
TString::Format(
"%s_reduced", s->GetName()),
"Reduced model", _cat);
248 for (
auto &
c : _cat) {
249 auto _pdf = s->getPdf(
c.first.c_str());
252 _cat.setIndex(
c.second);
253 bool matchAny =
false;
254 for (
auto &p : chanPatterns) {
255 if (_cat.hasRange(p) && _cat.inRange(p)) {
261 newPdf->addPdf(*_pdf,
c.first.c_str());
296 (opts.find(
"GlobalObservables"))
297 ? dynamic_cast<
RooCmdArg *>(opts.find(
"GlobalObservables"))->getSet(0)->snapshot()
305 std::cout <<
"PDF: ";
309 std::cout <<
"<null>" << std::endl;
311 std::cout <<
"Data: ";
315 std::cout <<
"<null>" << std::endl;
317 std::cout <<
"NLL Options: " << std::endl;
318 for (
int i = 0; i <
fOpts->GetSize(); i++) {
322 std::cout <<
" " <<
c->GetName() <<
" : ";
323 if (
c->getString(0)) {
324 std::cout <<
c->getString(0);
325 }
else if (
c->getSet(0) && !
c->getSet(0)->empty()) {
326 std::cout << (
c->getSet(0)->contentsString());
328 std::cout <<
c->getInt(0);
330 std::cout << std::endl;
333 std::cout <<
"Fit Config: " << std::endl;
334 std::cout <<
" UseParabErrors: " << (
fFitConfig->ParabErrors() ?
"True" :
"False")
335 <<
" [toggles HESSE algorithm]" << std::endl;
336 std::cout <<
" MinimizerOptions: " << std::endl;
345 if (std::shared_ptr<RooAbsReal>::get())
346 oldName = std::shared_ptr<RooAbsReal>::get()->GetName();
351 fPdf->treeNodeServerList(&s,
nullptr,
true,
false);
353 bool isBinned =
false;
354 bool hasBinned =
false;
357 isBinned =
a->getInt(0);
359 std::map<RooAbsArg *, bool> origValues;
362 if (
a->InheritsFrom(
"RooRealSumPdf")) {
365 bool setBinned =
false;
367 std::unique_ptr<RooArgSet> obs(
a->getObservables(
fData->get()));
368 if (obs->size() == 1) {
369 auto *var =
static_cast<RooRealVar *
>(obs->first());
370 std::unique_ptr<std::list<double>> boundaries{
dynamic_cast<RooAbsReal *
>(
a)->binBoundaries(
371 *var, -std::numeric_limits<double>::infinity(), std::numeric_limits<double>::infinity())};
373 if (!std::shared_ptr<RooAbsReal>::get()) {
374 Info(
"xRooNLLVar",
"%s will be evaluated as a Binned PDF (%d bins)",
a->GetName(),
375 int(boundaries->size() - 1));
381 origValues[
a] =
a->getAttribute(
"BinnedLikelihood");
382 a->setAttribute(
"BinnedLikelihood", setBinned);
386 std::map<RooAbsPdf *, std::string> normRanges;
387 std::set<TObject *> removedOpts;
388 if (
auto range =
dynamic_cast<RooCmdArg *
>(
fOpts->find(
"RangeWithName"))) {
389 TString rangeName = range->getString(0);
390 if (
auto sr =
dynamic_cast<RooCmdArg *
>(
fOpts->find(
"SplitRange"));
392 if (
auto special =
fOpts->find(
"RangeOptimize")) {
393 removedOpts.insert(sr);
395 removedOpts.insert(range);
396 fOpts->Remove(range);
397 removedOpts.insert(special);
398 fOpts->Remove(special);
402 for (
auto cat : simPdf->indexCat()) {
403 auto subpdf = simPdf->getPdf(cat.first.c_str());
407 srangeName.
ReplaceAll(
",",
"_" + cat.first +
",");
408 srangeName +=
"_" + cat.first;
410 subpdf->treeNodeServerList(&ss,
nullptr,
true,
false);
413 if (
a->InheritsFrom(
"RooAddPdf")) {
415 normRanges[p] = p->normRange() ? p->normRange() :
"";
416 p->setNormRange(srangeName);
425 if (
a->InheritsFrom(
"RooAddPdf")) {
427 normRanges[p] = p->normRange() ? p->normRange() :
"";
428 p->setNormRange(rangeName);
435 std::set<std::string> setNames;
438 setNames.insert(
a.first);
441 for (
auto &
a : setNames) {
445 std::set<std::string> attribs;
446 if (std::shared_ptr<RooAbsReal>::get())
447 attribs = std::shared_ptr<RooAbsReal>::get()->attributes();
448 this->reset(std::unique_ptr<RooAbsReal>{
fPdf->createNLL(*
fData, *
fOpts)}.release());
450 for (
auto o : removedOpts)
456 for (
auto &[k,
v] : normRanges)
457 k->setNormRange(
v ==
"" ?
nullptr :
v.c_str());
459 for (
auto &
a : attribs)
460 std::shared_ptr<RooAbsReal>::get()->setAttribute(
a.c_str());
466 std::shared_ptr<RooAbsReal>::get()->SetName(oldName);
467 if (!origValues.empty()) {
469 std::shared_ptr<RooAbsReal>::get()->getVal();
470 for (
auto &[o,
v] : origValues)
471 o->setAttribute(
"BinnedLikelihood",
v);
475 fFuncVars = std::unique_ptr<RooArgSet>{std::shared_ptr<RooAbsReal>::get()->getVariables()};
483std::pair<std::shared_ptr<RooAbsData>, std::shared_ptr<const RooAbsCollection>>
487 return std::pair(
nullptr,
nullptr);
488 auto fr = std::make_shared<RooFitResult>(
TUUID().AsString());
492 fr->setConstParList(
l);
495 std::unique_ptr<RooAbsCollection>(fr->constPars().selectCommon(*
fGlobs))->setAttribAll(
"global",
true);
529 throw std::runtime_error(
"xRooFitResult::cfit: Cannot create cfit without nll");
533 if (
auto res =
fCfits->find(alias); res !=
fCfits->end()) {
537 if (
auto res =
fCfits->find(poiValues); res !=
fCfits->end()) {
542 *
fNll->fFuncVars =
get()->floatParsFinal();
543 fNll->fFuncVars->assignValueOnly(
get()->constPars());
544 std::unique_ptr<RooAbsCollection>(
fNll->fFuncVars->selectCommon(
get()->floatParsFinal()))
545 ->setAttribAll(
"Constant",
false);
546 std::unique_ptr<RooAbsCollection>(
fNll->fFuncVars->selectCommon(
get()->constPars()))->setAttribAll(
"Constant",
true);
551 fCfits->insert(std::pair((alias) ? alias : poiValues, out));
558 throw std::runtime_error(
"xRooFitResult::ifit: par not found");
567 throw std::runtime_error(
"xRooFitResult::impact: poi not found");
568 auto _ifit = ifit(
np, up, prefit);
570 throw std::runtime_error(
"xRooFitResult::impact: null ifit");
571 if (_ifit->status() != 0)
572 fNode->Warning(
"impact",
"ifit status code is %d", _ifit->status());
573 return _ifit->floatParsFinal().getRealValue(poi) - poiHat->
getVal();
576 int iPoi =
get()->floatParsFinal().index(poi);
577 int iNp =
get()->floatParsFinal().index(
np);
579 throw std::runtime_error(
"xRooFitResult::impact: poi not found");
581 throw std::runtime_error(
"xRooFitResult::impact: np not found");
583 dynamic_cast<RooRealVar *
>((prefit ?
get()->floatParsInit() :
get()->floatParsFinal()).find(
np));
586 return std::numeric_limits<double>::quiet_NaN();
596 for (
auto p :
get()->floatParsFinal()) {
597 if (strcmp(p->GetName(),
poi) == 0) {
603 bool matches =
false;
606 if ((p->getStringAttribute(
"group") && s == p->getStringAttribute(
"group")) ||
615 npNames += p->GetName();
624 fNode->Warning(
"conditionalError",
"No parameters selected by: %s", nps);
625 return (up) ?
static_cast<RooRealVar *
>(poiVar)->getErrorHi() :
static_cast<RooRealVar *
>(poiVar)->getErrorLo();
630 return sqrt(
get()->conditionalCovarianceMatrix(vars)(idx, idx));
633 auto _cfit =
cfit(npNames.
Data(), nps);
635 auto _poi = _cfit->floatParsFinal().find(
poi);
637 return (up) ?
static_cast<RooRealVar *
>(_poi)->getErrorHi() :
static_cast<RooRealVar *
>(_poi)->getErrorLo();
645 throw std::runtime_error(
"xRooFitResult::ranknp: poi not found");
647 std::vector<std::pair<std::string, double>> ranks;
649 for (
auto par :
get()->floatParsFinal()) {
652 ranks.emplace_back(std::pair(par->GetName(),
impact(
poi, par->GetName(), up, prefit,
true)));
655 std::sort(ranks.begin(), ranks.end(), [](
auto &left,
auto &right) {
656 if (std::isnan(left.second) && !std::isnan(right.second))
658 if (!std::isnan(left.second) && std::isnan(right.second))
660 return fabs(left.second) > fabs(right.second);
664 for (
auto &[
n,
v] : ranks) {
665 if (
v >= approxThreshold) {
669 v = std::numeric_limits<double>::quiet_NaN();
675 std::sort(ranks.begin(), ranks.end(), [](
auto &left,
auto &right) {
676 if (std::isnan(left.second) && !std::isnan(right.second))
678 if (!std::isnan(left.second) && std::isnan(right.second))
680 return fabs(left.second) > fabs(right.second);
685 for (
auto &[
n,
v] : ranks) {
709 std::unique_ptr<RooAbsCollection>(out->constPars().selectCommon(*
fGlobs))->setAttribAll(
"global",
true);
712 if (
fOpts->find(
"GoF")) {
720 return xRooFitResult(std::make_shared<xRooNode>(out,
fPdf), std::make_shared<xRooNLLVar>(*
this));
742 if (
size_t(_data->numEntries()) <= entry)
745 *std::unique_ptr<RooAbsCollection>(_pdf->getObservables(_data)) = *_data->get(entry);
748 return (_data->weight() == 0) ? 0 : (-_data->weight() * _pdf->getLogVal(_data->get()));
753 std::set<std::string> out;
755 auto binnedOpt =
dynamic_cast<RooCmdArg *
>(
fOpts->find(
"Binned"));
759 bool allChannels =
true;
760 for (
auto c : simPdf.
bins()) {
764 c->get<
RooAbsArg>()->treeNodeServerList(&nodes,
nullptr,
true,
false);
765 bool isBinned =
false;
766 for (
auto a : nodes) {
767 if (
a->InheritsFrom(
"RooRealSumPdf") &&
768 ((binnedOpt && binnedOpt->getInt(0)) || (!binnedOpt &&
a->getAttribute(
"BinnedLikelihood")))) {
770 out.insert(chanName(chanName.
Index(
"=") + 1, chanName.
Length()).
Data());
785 pdf()->treeNodeServerList(&nodes,
nullptr,
true,
false);
786 for (
auto a : nodes) {
787 if (
a->InheritsFrom(
"RooRealSumPdf") &&
788 ((binnedOpt && binnedOpt->getInt(0)) || (!binnedOpt &&
a->getAttribute(
"BinnedLikelihood")))) {
803 if (
size_t(_data->numEntries()) <= entry)
805 auto _pdf =
pdf().get();
806 std::unique_ptr<RooAbsCollection> _robs(_pdf->getObservables(_data->get()));
807 *_robs = *_data->get(entry);
809 _pdf = s->getPdf(s->indexCat().getCurrentLabel());
812 for (
auto o : *_robs) {
815 a && _pdf->dependsOn(*
a)) {
816 std::unique_ptr<std::list<double>> bins(
817 _pdf->binBoundaries(*
a, -std::numeric_limits<double>::infinity(), std::numeric_limits<double>::infinity()));
819 double lowEdge = -std::numeric_limits<double>::infinity();
820 for (
auto b : *bins) {
821 if (
b >
a->getVal()) {
822 volume *= (
b - lowEdge);
848 for (
auto c : cTerm->list()) {
849 if (std::string(
c->ClassName()) ==
"RooAbsPdf" ||
850 std::string(
c->ClassName()).find(
"RooNormalizedPdf") != std::string::npos) {
860 gaus->getMean().GetName()));
865 }
else if (
auto pois =
dynamic_cast<RooPoisson *
>(
c)) {
879 std::unique_ptr<RooAbsCollection>(
pars()->selectByAttrib(
"Constant",
false))->size();
893 std::unique_ptr<RooAbsCollection> _floats(
pars()->selectByAttrib(
"Constant",
false));
895 _floats->remove(*std::unique_ptr<RooAbsCollection>(_constraintTerm->getVariables()));
909 return _constraintTerm->getVal();
936 return std::numeric_limits<double>::quiet_NaN();
950 double out = _data->sumEntries();
951 for (
int i = 0; i < _data->numEntries(); i++) {
953 double w = _data->weight();
956 out -=
w * std::log(
w);
957 if (_binnedChannels.count(
"*")) {
959 }
else if (_binnedChannels.empty()) {
963 if (_binnedChannels.count(_data->get()->getCatLabel(cat->
GetName()))) {
969 throw std::runtime_error(
"Cannot determine category of RooSimultaneous pdf");
980 auto out = std::shared_ptr<RooArgSet>(
get()->getVariables());
981 if (stripGlobalObs &&
fGlobs) {
982 out->remove(*
fGlobs,
true,
true);
990 return Scan(*std::unique_ptr<RooAbsCollection>(
get()->getVariables()->selectByName(scanPars)), coords, profilePars);
997 if (scanPars.
size() > 2 || scanPars.
empty())
1007 std::unique_ptr<RooAbsCollection> funcVars(
get()->getVariables());
1010 for (
auto &coord : coords) {
1011 if (coord.size() != scanPars.
size()) {
1012 throw std::runtime_error(
"Invalid coordinate");
1014 for (
size_t i = 0; i < coord.size(); i++) {
1018 if (profilePars.
empty()) {
1035 auto _pars =
pars();
1037 if (sOpt ==
"sensitivity") {
1042 if (sOpt ==
"floating") {
1044 auto floats = std::unique_ptr<RooAbsCollection>(_pars->selectByAttrib(
"Constant",
false));
1051 gr->SetName(
"multigraph");
1067 if (
auto a = _pars->find(s);
a)
1071 if (vars.
size() == 1) {
1079 bool normRange =
false;
1091 double low =
v->getVal();
1093 double step = (
v->getMax() -
v->getMin()) / 100;
1094 double init =
v->getVal();
1095 double initVal =
func()->getVal();
1097 auto currTime = std::chrono::steady_clock::now();
1098 while (out->
GetN() < 100 && (low >
v->getMin() || high < v->getMax())) {
1099 if (out->
GetN() == 0) {
1109 if (low >
v->getMin()) {
1111 auto _v =
func()->getVal();
1112 if (std::isnan(_v) || std::isinf(_v)) {
1113 if (bad->
GetN() == 0)
1121 if (high < v->getMax()) {
1123 auto _v =
func()->getVal();
1124 if (std::isnan(_v) || std::isinf(_v)) {
1125 if (bad->
GetN() == 0)
1136 if (std::chrono::steady_clock::now() - currTime > std::chrono::seconds(1)) {
1137 currTime = std::chrono::steady_clock::now();
1144 a.DrawArrow(init, 0, init, -0.1);
1146#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 30, 00)
1147 gPad->GetCanvas()->ResetUpdated();
1152 Error(
"Draw",
"Name a parameter to scan over: Draw(<name>) , choose from: %s",
1153 _pars->empty() ?
"" : _pars->contentsString().c_str());
1167 return setData(std::dynamic_pointer_cast<RooAbsData>(
data.fComp),
1168 std::shared_ptr<const RooAbsCollection>(
data.globs().argList().snapshot()));
1171bool xRooNLLVar::setData(
const std::pair<std::shared_ptr<RooAbsData>, std::shared_ptr<const RooAbsCollection>> &_data)
1174 if (
fData == _data.first &&
fGlobs == _data.second)
1179 auto _dglobs = (_data.second) ? _data.second
1180 : std::shared_ptr<const RooAbsCollection>(_data.first->getGlobalObservables(),
1183 if (
fGlobs && !(
fGlobs->empty() && !_dglobs) && _data.first &&
1187 throw std::runtime_error(
"Missing globs");
1191 std::unique_ptr<RooAbsCollection> _actualGlobs(
fPdf->getObservables(s));
1194 std::unique_ptr<RooAbsCollection> _actualGlobs2(
fPdf->getObservables(s2));
1195 if (!_actualGlobs->equals(*_actualGlobs2)) {
1197 rC.
add(*_actualGlobs2);
1201 lC.
add(*_actualGlobs);
1204 throw std::runtime_error(
TString::Format(
"globs mismatch: adding %s removing %s",
r.Data(),
l.Data()));
1209 if (!std::shared_ptr<RooAbsReal>::get()) {
1210 fData = _data.first;
1223 fFuncVars->setAttribAll(
"Constant",
false);
1225 std::shared_ptr<RooAbsData> __data =
fData;
1227 fData = _data.first;
1248 fData = _data.first;
1250 }
catch (std::runtime_error &) {
1255 fFuncVars->setAttribAll(
"Constant",
false);
1257 std::shared_ptr<RooAbsData> __data =
fData;
1259 fData = _data.first;
1263 throw std::runtime_error(
"Unable to setData");
1270 }
else if (
auto f = std::unique_ptr<RooAbsCollection>(
fConstVars->selectByAttrib(
"Constant",
false)); !
f->empty()) {
1293 if (strcmp(opt.
GetName(),
"Hesse") == 0) {
1295 }
else if (strcmp(opt.
GetName(),
"Minos") == 0) {
1297 }
else if (strcmp(opt.
GetName(),
"Strategy") == 0) {
1299 }
else if (strcmp(opt.
GetName(),
"StrategySequence") == 0) {
1301 }
else if (strcmp(opt.
GetName(),
"Tolerance") == 0) {
1303 }
else if (strcmp(opt.
GetName(),
"MaxCalls") == 0) {
1305 }
else if (strcmp(opt.
GetName(),
"MaxIterations") == 0) {
1307 }
else if (strcmp(opt.
GetName(),
"PrintLevel") == 0) {
1310 if (strcmp(opt.
GetName(),
"Optimize") == 0) {
1315 if (
auto prevObject =
fOpts->FindObject(opt.
GetName()); prevObject) {
1317 fOpts->Replace(prevObject, opt.
Clone(
nullptr));
1323 if (std::shared_ptr<RooAbsReal>::get()) {
1396 return fData->sumEntries() * log(1.0 * (s->servers().size() - 1));
1408 for (
int i = 0; i <
fData->numEntries(); i++) {
1418 auto _func =
func();
1421 for (
auto s : _func->servers()) {
1425 for (
auto s2 : s->servers()) {
1445 bool doCLs = sWhat.
Contains(
"pcls");
1446 bool doNull = sWhat.
Contains(
"pnull");
1447 bool doAlt = sWhat.
Contains(
"palt");
1448 double nSigma = (sWhat.
Contains(
"exp"))
1453 : std::numeric_limits<double>::quiet_NaN();
1455 bool toys = sWhat.
Contains(
"toys");
1459 bool readOnly = sWhat.
Contains(
"readonly");
1466 if (
getVal(sWhat +
" readonly").second != 0) {
1472 size_t nToys = toyNum.
Atoi();
1473 size_t nToysAlt = (toyNum.
Atof() - nToys) * nToys;
1474 if (nToysAlt == 0 && !toyNum.
Contains(
'.') && !doNull)
1479 if (
altToys.size() < nToysAlt) {
1482 }
else if (doCLs && toys) {
1486 throw std::runtime_error(
"Auto-generating toys for anything other than CLs not yet supported, please "
1487 "specify number of toys with 'toys=N' ");
1493 RestoreNll(std::shared_ptr<xRooNLLVar> &
v,
bool r) : rr(
r), var(
v)
1495 if (rr && var && var->get()) {
1496 _readOnly = var->get()->getAttribute(
"readOnly");
1497 var->get()->setAttribute(
"readOnly", rr);
1505 var->get()->setAttribute(
"readOnly", _readOnly);
1509 bool _readOnly =
false;
1511 std::shared_ptr<xRooNLLVar> &var;
1514 RestoreNll rest(
nllVar, readOnly);
1525 throw std::runtime_error(std::string(
"Unknown: ") +
what);
1532 out.
add(*std::unique_ptr<RooAbsCollection>(
coords->selectByAttrib(
"poi",
true)));
1540 out.
addClone(*std::unique_ptr<RooAbsCollection>(
coords->selectByAttrib(
"poi",
true)));
1541 for (
auto a : out) {
1545 if (
auto s =
a->getStringAttribute(
"altVal"); s && strlen(s)) {
1548 v->setVal(std::numeric_limits<double>::quiet_NaN());
1564 if (me.asimov(
true))
1565 out += me.asimov(
true)->status() << 3;
1573 std::cout <<
"POI: " << _poi.contentsString() <<
" , null: ";
1575 for (
auto a : _poi) {
1581 std::cout <<
v->getVal();
1584 std::cout <<
" , alt: ";
1586 bool any_alt =
false;
1587 for (
auto a : _alt_poi) {
1593 std::cout <<
v->getVal();
1595 if (!std::isnan(
v->getVal()))
1598 std::cout <<
" , pllType: ";
1600 case 0: std::cout <<
"tmu";
break;
1601 case 1: std::cout <<
"qmu or qmutilde";
break;
1602 case 2: std::cout <<
"q0";
break;
1603 case 4: std::cout <<
"u0";
break;
1604 default: std::cout <<
"unknown";
break;
1606 std::cout << std::endl;
1612 std::cout <<
" - ufit: ";
1614 std::cout <<
fUfit->GetName() <<
" " <<
fUfit->minNll() <<
" (status=" <<
fUfit->status() <<
") (";
1616 for (
auto a : _poi) {
1617 auto v =
dynamic_cast<RooRealVar *
>(
fUfit->floatParsFinal().find(
a->GetName()));
1622 std::cout <<
v->GetName() <<
"_hat: " <<
v->getVal() <<
" +/- " <<
v->getError();
1625 std::cout <<
")" << std::endl;
1627 std::cout <<
"Not calculated" << std::endl;
1629 std::cout <<
" - cfit_null: ";
1633 std::cout <<
"Not calculated";
1636 std::cout << std::endl <<
" - cfit_alt: ";
1641 std::cout <<
"Not calculated" << std::endl;
1643 std::cout <<
" sigma_mu: ";
1646 std::cout <<
"Not calculated";
1648 std::cout << const_cast<xRooHypoPoint *>(
this)->sigma_mu().first <<
" +/- "
1652 std::cout << std::endl;
1653 std::cout <<
" - asimov ufit: ";
1655 std::cout <<
fAsimov->fUfit->GetName() <<
" " <<
fAsimov->fUfit->minNll()
1656 <<
" (status=" <<
fAsimov->fUfit->status() <<
")";
1658 std::cout <<
"Not calculated";
1660 std::cout << std::endl <<
" - asimov cfit_null: ";
1662 std::cout <<
fAsimov->fNull_cfit->GetName() <<
" " <<
fAsimov->fNull_cfit->minNll()
1663 <<
" (status=" <<
fAsimov->fNull_cfit->status() <<
")";
1665 std::cout <<
"Not calculated";
1668 std::cout << std::endl;
1670 std::cout << std::endl;
1674 <<
" (status=" <<
fLbound_cfit->status() <<
")" << std::endl;
1677 std::cout <<
" - gfit: " <<
fGenFit->GetName() << std::endl;
1679 std::cout <<
" * null toys: " <<
nullToys.size();
1680 size_t firstToy = 0;
1681 while (firstToy <
nullToys.size() && std::isnan(std::get<1>(
nullToys[firstToy])))
1684 std::cout <<
" [ of which " << firstToy <<
" are bad]";
1685 std::cout <<
" , alt toys: " <<
altToys.size();
1687 while (firstToy <
altToys.size() && std::isnan(std::get<1>(
altToys[firstToy])))
1690 std::cout <<
" [ of which " << firstToy <<
" are bad]";
1691 std::cout << std::endl;
1706 throw std::runtime_error(
"Unconditional fit unavailable");
1737 if (toys->getGlobalObservables()) {
1738 coords = std::shared_ptr<RooAbsCollection>(toys->getGlobalObservables()->snapshot());
1740 for (
int i = 0; i < toys->numEntries(); i++) {
1741 auto toy = toys->get(i);
1743 std::make_tuple(
int(toy->getRealValue(
"seed")), toy->getRealValue(
"ts"), toys->weight()));
1748 for (
int i = 0; i < toys->numEntries(); i++) {
1749 auto toy = toys->get(i);
1751 std::make_tuple(
int(toy->getRealValue(
"seed")), toy->getRealValue(
"ts"), toys->weight()));
1770 fAsimov = std::make_shared<xRooHypoPoint>(*
this);
1772 fAsimov->hypoTestResult.reset();
1774 for (
auto p :
fAsimov->poi()) {
1777 v->deleteSharedProperties();
1778 if (
v->getVal() == 0) {
1784 v->setVal(theFit->constPars().getRealValue(
v->GetName()) * 0.5);
1795 std::make_pair(
nullptr,
nullptr);
1806 return std::pair<double, double>(1, 0);
1809 return std::pair<double, double>(std::numeric_limits<double>::quiet_NaN(), 0);
1810 double lowBound = first_poi->getMin(
"physical");
1811 double hiBound = first_poi->getMax(
"physical");
1814 (lowBound == -std::numeric_limits<double>::infinity() && hiBound == std::numeric_limits<double>::infinity())
1815 ? std::pair<double, double>(0, 0)
1820 fNullVal(), _sigma_mu.first, lowBound, hiBound);
1822 fNullVal(), _sigma_mu.first, lowBound, hiBound);
1823 return std::pair(nom, std::max(std::abs(up - nom), std::abs(down - nom)));
1829 return std::pair<double, double>(1, 0);
1832 return std::pair<double, double>(std::numeric_limits<double>::quiet_NaN(), 0);
1835 first_poi->getMin(
"physical"), first_poi->getMax(
"physical"));
1838 _sigma_mu.first, first_poi->getMin(
"physical"), first_poi->getMax(
"physical"));
1841 _sigma_mu.first, first_poi->getMin(
"physical"), first_poi->getMax(
"physical"));
1843 return std::pair(nom, std::max(std::abs(up - nom), std::abs(down - nom)));
1849 return std::pair<double, double>(1, 0);
1852 return std::pair<double, double>(1, 0);
1855 return std::pair<double, double>(std::numeric_limits<double>::quiet_NaN(), 0);
1860 first_poi->getMin(
"physical"), first_poi->getMax(
"physical"));
1863 _sigma_mu.first, first_poi->getMin(
"physical"), first_poi->getMax(
"physical"));
1866 _sigma_mu.first, first_poi->getMin(
"physical"), first_poi->getMax(
"physical"));
1868 first_poi->getMin(
"physical"), first_poi->getMax(
"physical"));
1871 first_poi->getMin(
"physical"), first_poi->getMax(
"physical"));
1874 first_poi->getMin(
"physical"), first_poi->getMax(
"physical"));
1876 auto nom = (nom1 == 0) ? 0 : nom1 / nom2;
1877 auto up = (up1 == 0) ? 0 : up1 / up2;
1878 auto down = (down1 == 0) ? 0 : down1 / down2;
1880 return std::pair(nom, std::max(std::abs(up - nom), std::abs(down - nom)));
1885 if (std::isnan(nSigma)) {
1891 if (!first_poi || (!std::isnan(nSigma) && std::isnan(_sigma_mu.first)))
1892 return std::pair<double, double>(std::numeric_limits<double>::quiet_NaN(), 0);
1894 _sigma_mu.first, first_poi->getMin(
"physical"), first_poi->getMax(
"physical"));
1896 _sigma_mu.first + _sigma_mu.second, first_poi->getMin(
"physical"),
1897 first_poi->getMax(
"physical"));
1899 _sigma_mu.first - _sigma_mu.second, first_poi->getMin(
"physical"),
1900 first_poi->getMax(
"physical"));
1901 return std::pair<double, double>(nom, std::max(std::abs(nom - up), std::abs(nom - down)));
1906 if (std::isnan(nSigma)) {
1910 size_t firstToy = 0;
1911 while (firstToy <
altToys.size() && std::isnan(std::get<1>(
altToys[firstToy])))
1913 if (firstToy >=
altToys.size())
1914 return std::pair(std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN());
1917 return std::pair(std::get<1>(
altToys[targetIdx]), (std::get<1>(
altToys[std::min(
int(
altToys.size()), targetIdx)]) -
1918 std::get<1>(
altToys[std::max(0, targetIdx)])) /
1924 auto _ufit =
ufit(readOnly);
1927 return std::pair<double, double>(
hypoTestResult->GetTestStatisticData(), 0);
1928 return std::pair<double, double>(std::numeric_limits<double>::quiet_NaN(), 0);
1931 return std::pair<double, double>(std::numeric_limits<double>::quiet_NaN(), 0);
1933 if (
auto _first_poi =
dynamic_cast<RooRealVar *
>(
poi().first());
1934 _first_poi && _first_poi->
getMin(
"physical") > _first_poi->getMin() &&
1939 return std::pair<double, double>(std::numeric_limits<double>::quiet_NaN(), 0);
1946 return std::pair<double, double>(0, 0);
1949 return std::pair<double, double>(std::numeric_limits<double>::quiet_NaN(), 0);
1951 double diff = _cfit_null->minNll() - _ufit->minNll();
1955 diff += (_ufit->edm() - _cfit_null->edm());
1957 return std::pair<double, double>(2. * cFactor * diff,
1958 2. * cFactor * sqrt(pow(
cfit_null(readOnly)->edm(), 2) + pow(_ufit->edm(), 2)));
1968 for (
int i = 0; i < fits->numEntries(); i++) {
1969 auto fit = fits->get(i);
1970 if (fit->getCatIndex(
"type") !=
type)
1974 fits->getGlobalObservables()->getStringValue(
TString::Format(
"%s.name", fit->getCatLabel(
"type")));
1977 for (
auto file : *
gROOT->GetListOfFiles()) {
1978 if (
auto k =
static_cast<TDirectory *
>(file)->FindKeyAny(_name.c_str())) {
1981 k->GetMotherDir()->GetList()
1984 if (
auto cachedFit = (storedFr) ? storedFr->
fr.get() : k->ReadObject<
RooFitResult>(); cachedFit) {
1987 k->GetMotherDir()->Add(storedFr);
1990 return storedFr->
fr;
1994 auto rfit = std::make_shared<RooFitResult>(_name.c_str(),
TUUID(_name.c_str()).
GetTime().
AsString());
1995 rfit->setStatus(fit->getRealValue(
"status"));
1996 rfit->setMinNLL(fit->getRealValue(
"minNll"));
1997 rfit->setEDM(fit->getRealValue(
"edm"));
1999 std::unique_ptr<RooAbsCollection> par_hats(
2000 hypoTestResult->GetFitInfo()->getGlobalObservables()->selectByName(
coords->contentsString().c_str()));
2001 par_hats->setName(
"floatParsFinal");
2002 rfit->setFinalParList(*par_hats);
2009 rfit->setCovarianceMatrix(cov);
2010 rfit->setCovQual(fit->getRealValue(
"covQual"));
2022 return fUfit = rfit;
2024 if (!
nllVar || (readOnly &&
nllVar->get() && !
nllVar->get()->getAttribute(
"readOnly")))
2032 bool tmp =
nllVar->get()->getAttribute(
"readOnly");
2033 nllVar->get()->setAttribute(
"readOnly");
2034 auto out =
ufit(
true);
2035 nllVar->get()->setAttribute(
"readOnly", tmp);
2043 }
else if (!
nllVar->get()->getAttribute(
"readOnly")) {
2046 nllVar->fFuncVars->setAttribAll(
"Constant",
false);
2049 nllVar->fFuncGlobs->setAttribAll(
"Constant",
true);
2050 std::unique_ptr<RooAbsCollection>(
nllVar->fFuncVars->selectCommon(
poi()))
2051 ->setAttribAll(
"Constant",
false);
2055 nllVar->fFuncVars->assignValueOnly(
fGenFit->floatParsFinal());
2062 }
else if (!std::isnan(
fAltVal())) {
2064 for (
auto _poiCoord :
poi()) {
2065 auto _poi =
dynamic_cast<RooRealVar *
>(
nllVar->fFuncVars->find(_poiCoord->GetName()));
2067 _poi->setVal(_poi->getStringAttribute(
"initVal") ?
TString(_poi->getStringAttribute(
"initVal")).
Atof()
2078 for (
auto &
c : coll) {
2081 out +=
c->GetName();
2100 if (!
nllVar || (readOnly &&
nllVar->get() && !
nllVar->get()->getAttribute(
"readOnly")))
2108 bool tmp =
nllVar->get()->getAttribute(
"readOnly");
2109 nllVar->get()->setAttribute(
"readOnly");
2111 nllVar->get()->setAttribute(
"readOnly", tmp);
2119 }
else if (!
nllVar->get()->getAttribute(
"readOnly")) {
2126 nllVar->fFuncVars->setAttribAll(
"Constant",
false);
2129 nllVar->fFuncGlobs->setAttribAll(
"Constant",
true);
2146 auto _first_poi =
dynamic_cast<RooRealVar *
>(
poi().first());
2149 if (_first_poi->getMin(
"physical") <= _first_poi->getMin())
2156 if (!
nllVar || (readOnly &&
nllVar->get() && !
nllVar->get()->getAttribute(
"readOnly")))
2164 bool tmp =
nllVar->get()->getAttribute(
"readOnly");
2165 nllVar->get()->setAttribute(
"readOnly");
2167 nllVar->get()->setAttribute(
"readOnly", tmp);
2175 }
else if (!
nllVar->get()->getAttribute(
"readOnly")) {
2182 nllVar->fFuncVars->setAttribAll(
"Constant",
false);
2184 nllVar->fFuncVars->setRealValue(_first_poi->GetName(), _first_poi->getMin(
"physical"));
2186 nllVar->fFuncGlobs->setAttribAll(
"Constant",
true);
2197 nllVar->get()->setStringAttribute(
2212 if (!
nllVar || (readOnly &&
nllVar->get() && !
nllVar->get()->getAttribute(
"readOnly")))
2220 bool tmp =
nllVar->get()->getAttribute(
"readOnly");
2221 nllVar->get()->setAttribute(
"readOnly");
2223 nllVar->get()->setAttribute(
"readOnly", tmp);
2231 }
else if (!
nllVar->get()->getAttribute(
"readOnly")) {
2238 nllVar->fFuncVars->setAttribAll(
"Constant",
false);
2241 nllVar->fFuncGlobs->setAttribAll(
"Constant",
true);
2256 auto asi =
asimov(readOnly);
2259 return std::pair<double, double>(std::numeric_limits<double>::quiet_NaN(), 0);
2262 auto out = asi->pll(readOnly);
2263 return std::pair<double, double>(std::abs(asi->fNullVal() -
fAltVal()) / sqrt(out.first),
2264 out.second * 0.5 * std::abs(asi->fNullVal() -
fAltVal()) /
2265 (out.first * sqrt(out.first)));
2271 if (std::isnan(_ts.first))
2274 return std::pair<double, double>(1, 0);
2280 if (_theToys.empty()) {
2281 return std::pair(0.5, std::numeric_limits<double>::infinity());
2288 double result_err_up = 0;
2289 double result_err_down = 0;
2290 for (
auto &toy : _theToys) {
2291 if (std::isnan(std::get<1>(toy))) {
2294 bool res = std::get<1>(toy) >= _ts.first;
2295 if (std::get<2>(toy) != 1) {
2301 result += std::get<2>(toy);
2302 if (std::get<1>(toy) >= _ts.first - _ts.second)
2303 result_err_up += std::get<2>(toy);
2304 if (std::get<1>(toy) >= _ts.first - _ts.second)
2305 result_err_down += std::get<2>(toy);
2310 result_err_down -=
result;
2311 double result_err = std::max(std::abs(result_err_up), std::abs(result_err_down));
2314 result_err /= _theToys.size();
2317 result /= (_theToys.size() - nans);
2321 return std::pair<double, double>(
result, result_err);
2326 return pX_toys(
false, nSigma);
2331 if (!std::isnan(nSigma)) {
2378 bool targetCLs,
double relErrThreshold,
size_t maxToys)
2381 throw std::runtime_error(
"Cannot add toys, invalid conditional fit");
2384 auto condition = [&]() {
2388 if (!std::isnan(obs.first)) {
2389 double diff = (
target < 0) ? obs.first : std::abs(obs.first -
target);
2390 double err = obs.second;
2391 if (err > 1
e-4 && diff <= relErrThreshold * obs.second) {
2399 alt = (pAlt.second * pNull.first > pNull.second * pAlt.first);
2400 if ((alt ? pAlt.second : pNull.second) < 1
e-4)
2409 if (!std::isnan(
target) && std::isnan(
ts_toys(target_nSigma).first)) {
2410 if (std::isnan(target_nSigma)) {
2411 throw std::runtime_error(
"Cannot target obs p-value because ts value unavailable");
2413 if (targetCLs &&
pCLs_toys(target_nSigma).second == 0) {
2419 Info(
"addToys",
"First generating 100 alt toys in order to determine expected ts value");
2420 addToys(
true, 100, initialSeed);
2422 if (std::isnan(
ts_toys(target_nSigma).first)) {
2423 throw std::runtime_error(
"Unable to determine expected ts value");
2433 g->SetNameTitle(
"toyTime",
"Time per toy;Toy;time [s]");
2442 size_t toysAdded(0);
2443 size_t altToysAdded(0);
2449 if (toys.size() >= maxToys) {
2454 if (!std::isnan(
target) && !condition()) {
2457 auto currVal = std::isnan(
target) ? std::pair(0., 0.)
2460 size_t nnToys = std::min(
size_t(nToys), (maxToys - toys.size()));
2462 for (
size_t i = 0; i < nnToys; i++) {
2467 toys.push_back(std::make_tuple(seed, toy.pll().first, 1.));
2469 (alt ? altToysAdded : toysAdded)++;
2470 if (std::isnan(std::get<1>(toys.back())))
2472 g->SetPoint(
g->GetN(),
g->GetN(), s.
RealTime() - lastTime);
2476 <<
TString::Format(
"Generated %d/%d %s hypothesis toys [%.2f toys/s]",
2477 int(alt ? altToysAdded : toysAdded),
int(nnToys), alt ?
"alt" :
"null",
2478 double(altToysAdded + toysAdded - lasti) / s.
RealTime());
2479 if (!std::isnan(
target)) {
2480 std::cout <<
" [current=" << currVal.first <<
"+/-" << currVal.second <<
" target=" <<
target
2481 <<
" nSigma=" << target_nSigma <<
"]";
2483 std::cout <<
"..." << std::flush;
2484 lasti = altToysAdded + toysAdded;
2486 if (!
gROOT->IsBatch()) {
2490#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 30, 00)
2491 gPad->GetCanvas()->ResetUpdated();
2504 for (
auto &t : toys) {
2505 if (std::isnan(std::get<1>(t)))
2506 std::get<1>(t) = -std::numeric_limits<double>::infinity();
2508 std::sort(toys.begin(), toys.end(),
2509 [](
const decltype(
nullToys)::value_type &
a,
const decltype(
nullToys)::value_type &
b) ->
bool {
2510 if (std::isnan(std::get<1>(a)))
2512 if (std::isnan(std::get<1>(b)))
2514 return std::get<1>(a) < std::get<1>(b);
2516 for (
auto &t : toys) {
2517 if (std::isinf(std::get<1>(t)))
2518 std::get<1>(t) = std::numeric_limits<double>::quiet_NaN();
2520 if (std::isnan(
target)) {
2527 }
while (condition());
2530 <<
"Finished Generating ";
2532 std::cout << toysAdded <<
" null ";
2535 std::cout << altToysAdded <<
" alt ";
2537 std::cout <<
"toys " <<
TString::Format(
"[%.2f toys/s overall]",
double(toysAdded + altToysAdded) / s2.
RealTime())
2539 if (!
gROOT->IsBatch()) {
2543#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 30, 00)
2544 gPad->GetCanvas()->ResetUpdated();
2552 std::cout <<
"Warning: " << nans <<
" toys were bad" << std::endl;
2629 out.
nllVar = std::make_shared<xRooNLLVar>(*
this);
2638 while (pattern.NextToken()) {
2641 double val = std::numeric_limits<double>::quiet_NaN();
2642 auto i = s.
Index(
"=");
2647 throw std::runtime_error(
"poiValues must contain value");
2652 throw std::runtime_error(
"Cannot find poi");
2653 if (!std::isnan(val))
2656 if (poiNames !=
"") {
2661 if (poiNames ==
"") {
2662 throw std::runtime_error(
"No poi");
2665 auto _snap = std::unique_ptr<RooAbsCollection>(
fFuncVars->selectByAttrib(
"Constant",
true))->snapshot();
2666 _snap->setAttribAll(
"poi",
false);
2667 std::unique_ptr<RooAbsCollection> _poi(_snap->selectByName(poiNames));
2668 _poi->setAttribAll(
"poi",
true);
2669 if (std::isnan(alt_value)) {
2670 for (
auto a : *_poi)
2671 a->setStringAttribute(
"altVal",
nullptr);
2673 for (
auto a : *_poi)
2677 _snap->remove(*
fGlobs,
true,
true);
2680 auto _type = pllType;
2683 if (std::isnan(alt_value)) {
2685 }
else if (
dynamic_cast<RooRealVar *
>(_poi->first())->getVal() >= alt_value) {
2690 for (
auto b : out.
poi()) {
2691 if (
auto r =
dynamic_cast<RooRealVar *
>(
b)) {
2692 if (
r->hasRange(
"physical") &&
r->getMin() >=
r->getMin(
"physical")) {
2694 "xRooNLLVar::hypoPoint",
2695 "fitting min of %s is >= physical limit (%g), but using uncapped test-statistic, so will set to "
2697 r->GetName(),
r->getMin(
"physical"), -
r->getMax());
2698 r->setMin(-
r->getMax());
2709 std::unique_ptr<RooAbsCollection> thePoi(
fFuncVars->selectByName(poiNames));
2710 for (
auto b : *thePoi) {
2711 if (!
static_cast<RooRealVar *
>(
b)->hasRange(
"physical")) {
2712 static_cast<RooRealVar *
>(
b)->setRange(
"physical", 0, std::numeric_limits<double>::infinity());
2720xRooNLLVar::xRooHypoPoint
2726 std::unique_ptr<RooAbsCollection> _poi(
fFuncVars->selectByAttrib(
"poi",
true));
2727 if (_poi->empty()) {
2728 throw std::runtime_error(
"No POI specified in model");
2729 }
else if (_poi->size() != 1) {
2730 throw std::runtime_error(
"Multiple POI specified in model");
2732 return hypoPoint(_poi->first()->GetName(),
value, alt_value, pllType);
2749 bool hasSame = sOpt.
Contains(
"same");
2754 TH1 *hAxis =
nullptr;
2756 auto clearPad = []() {
2758 if (
gPad->GetNumber() == 0) {
2759 gPad->SetBottomMargin(
gStyle->GetPadBottomMargin());
2760 gPad->SetTopMargin(
gStyle->GetPadTopMargin());
2761 gPad->SetLeftMargin(
gStyle->GetPadLeftMargin());
2762 gPad->SetRightMargin(
gStyle->GetPadRightMargin());
2766 if (!hasSame || !pad) {
2777 if (hAxis =
dynamic_cast<TH1 *
>(o); hAxis)
2784 double _min = std::numeric_limits<double>::quiet_NaN();
2785 double _max = -std::numeric_limits<double>::quiet_NaN();
2788 if (std::get<2>(p) == 0)
2790 if (std::isnan(std::get<1>(p)))
2792 _min = std::min(std::get<1>(p), _min);
2793 _max = std::max(std::get<1>(p), _max);
2796 if (std::get<2>(p) == 0)
2798 if (std::isnan(std::get<1>(p)))
2800 _min = std::min(std::get<1>(p), _min);
2801 _max = std::max(std::get<1>(p), _max);
2805 if (!std::isnan(obs.first)) {
2806 _min = std::min(obs.first - std::abs(obs.first) * 0.1, _min);
2807 _max = std::max(obs.first + std::abs(obs.first) * 0.1, _max);
2813 ? std::pair(std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN())
2816 ? std::pair(std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN())
2821 : std::numeric_limits<double>::quiet_NaN();
2822 if (!std::isnan(asi) && asi > 0) {
2824 _min = std::min(asi - std::abs(asi), _min);
2825 _max = std::max(asi + std::abs(asi), _max);
2832 auto makeHist = [&](
bool isAlt) {
2834 auto h =
new TH1D((isAlt) ?
"alt_toys" :
"null_toys",
"", 100, _min, _max + (_max - _min) * 0.01);
2835 h->SetDirectory(
nullptr);
2836 size_t nBadOrZero = 0;
2838 double w = std::isnan(std::get<1>(p)) ? 0 : std::get<2>(p);
2841 if (!std::isnan(std::get<1>(p)))
2842 h->Fill(std::get<1>(p),
w);
2844 if (
h->GetEntries() > 0)
2845 h->Scale(1. /
h->Integral(0,
h->GetNbinsX() + 1));
2869 h->SetMarkerSize(0);
2874 auto nullHist = makeHist(
false);
2875 auto altHist = makeHist(
true);
2878 auto h = (nullHist->GetEntries()) ? nullHist : altHist;
2881 auto axis =
static_cast<TH1 *
>(
h->Clone(
".axis"));
2883 axis->SetStats(
false);
2884 axis->Reset(
"ICES");
2886 axis->SetLineWidth(0);
2888 axis->SetMinimum(1
e-7);
2889 axis->GetYaxis()->SetRangeUser(1
e-7, 10);
2890 axis->SetMaximum(
h->GetMaximum());
2892 l =
new TLegend(0.4, 0.7, 1. -
gPad->GetRightMargin(), 1. -
gPad->GetTopMargin());
2893 l->SetName(
"legend");
2895 l->SetBorderSize(0);
2898 l->ConvertNDCtoPad();
2900 for (
auto o : *
gPad->GetListOfPrimitives()) {
2907 if (
h->GetEntries() > 0) {
2910 h->Draw(
"axissame");
2913 if (
h->GetEntries() > 0) {
2916 h->Draw(
"axissame");
2920 l->AddEntry(nullHist);
2921 l->AddEntry(altHist);
2925 auto hh =
static_cast<TH1 *
>(nullHist->Clone(
"null_asymp"));
2927 hh->SetStats(
false);
2928 hh->SetLineStyle(2);
2930 for (
int i = 1; i <= hh->GetNbinsX(); i++) {
2933 _poi->getMin(
"physical"), _poi->getMax(
"physical")) -
2935 sigma_mu().first, _poi->getMin(
"physical"), _poi->getMax(
"physical")));
2938 hh =
static_cast<TH1 *
>(altHist->Clone(
"alt_asymp"));
2940 hh->SetStats(
false);
2941 hh->SetLineStyle(2);
2943 for (
int i = 1; i <= hh->GetNbinsX(); i++) {
2946 _poi->getMin(
"physical"), _poi->getMax(
"physical")) -
2948 sigma_mu().first, _poi->getMin(
"physical"), _poi->getMax(
"physical")));
2963 l->AddEntry(tl, label,
"l");
2965 if (nullHist->GetEntries() || altHist->GetEntries()) {
2967 label +=
" p_{toy}=(";
2968 label += (std::isnan(pNull.first)) ?
"-" :
TString::Format(
"%.4f #pm %.4f", pNull.first, pNull.second);
2969 label += (std::isnan(pAlt.first)) ?
",-" :
TString::Format(
",%.4f #pm %.4f", pAlt.first, pAlt.second);
2970 label += (std::isnan(pCLs.first)) ?
",-)" :
TString::Format(
",%.4f #pm %.4f)", pCLs.first, pCLs.second);
2972 if (label.Length() > 0)
2973 l->AddEntry(
"", label,
"");
2975 if (!std::isnan(pNullA.first) || !std::isnan(pAltA.first)) {
2977 label +=
" p_{asymp}=(";
2978 label += (std::isnan(pNullA.first)) ?
"-" :
TString::Format(
"%.4f #pm %.4f", pNullA.first, pNullA.second);
2979 label += (std::isnan(pAltA.first)) ?
",-" :
TString::Format(
",%.4f #pm %.4f", pAltA.first, pAltA.second);
2980 label += (std::isnan(pCLs.first)) ?
",-)" :
TString::Format(
",%.4f #pm %.4f)", pCLs.first, pCLs.second);
2982 if (label.Length() > 0)
2983 l->AddEntry(
"", label,
"");
2985 if (
auto ax =
dynamic_cast<TH1 *
>(
gPad->GetPrimitive(
".axis")))
2986 ax->GetYaxis()->SetRangeUser(1
e-7, 1);
2993 if (
v &&
v->hasRange(
"physical") &&
v->getMin(
"physical") != -std::numeric_limits<double>::infinity()) {
3003 if (
v &&
v->hasRange(
"physical") &&
v->getMin(
"physical") != -std::numeric_limits<double>::infinity()) {
3007 return (inWords) ?
TString::Format(
"-2log[L(%s,#hat{#hat{#theta}})/L(#hat{%s},#hat{#theta})]",
v->GetTitle(),
3013 if (
v &&
v->hasRange(
"physical") &&
v->getMin(
"physical") != -std::numeric_limits<double>::infinity()) {
3014 return (inWords) ?
TString::Format(
"Lower-Bound One-Sided Discovery PLR")
3023 if (
v &&
v->hasRange(
"physical") &&
v->getMin(
"physical") != -std::numeric_limits<double>::infinity()) {
3032 return "Test Statistic";
3038 return (
poi().empty()) ? nullptr : (
poi().first())->
GetName();
3043 return (first_poi ==
nullptr) ? std::numeric_limits<double>::quiet_NaN() : first_poi->getVal();
3048 auto first_poi =
dynamic_cast<RooAbsReal *
>(_alt_poi.first());
3049 return (first_poi ==
nullptr) ? std::numeric_limits<double>::quiet_NaN() : first_poi->getVal();
3056 throw std::runtime_error(
"HypoPoint has no POI, cannot set null value");
3062 auto first_poi =
dynamic_cast<RooAbsArg *
>(
poi().first());
3064 throw std::runtime_error(
"HypoPoint has no POI, cannot set alt value");
3073 if (nPoints < 0 || tsType < 0) {
3077 nPoints =
int(low + 0.5);
3081 if (alt_value == std::numeric_limits<double>::quiet_NaN()) {
3089 auto out =
hypoSpace(parName, pllType, alt_value);
3095 for (
auto p : out.
poi()) {
3097 dynamic_cast<RooRealVar *
>(p)->setRange(
"physical", 0, std::numeric_limits<double>::infinity());
3098 Info(
"xRooNLLVar::hypoSpace",
"Setting physical range of %s to [0,inf]", p->GetName());
3099 }
else if (
auto v =
dynamic_cast<RooRealVar *
>(p);
v->hasRange(
"physical")) {
3100 v->removeMin(
"physical");
3101 v->removeMax(
"physical");
3102 Info(
"xRooNLLVar::hypoSpace",
"Removing physical range of %s", p->GetName());
3116 out.AddPoints(parName, nPoints, low, high);
3119 for (
auto p : out.
poi()) {
3121 r->setRange(
"scan", std::isnan(low) ?
r->getMin() : low, std::isnan(high) ?
r->getMax() : high);
3131 hs.
AddPoints(parName, nPoints, low, high);
3134 for (
auto p : hs.
poi()) {
3136 r->setRange(
"scan", std::isnan(low) ?
r->getMin() : low, std::isnan(high) ?
r->getMax() : high);
3147 auto _poi = std::unique_ptr<RooAbsCollection>(
3148 std::unique_ptr<RooAbsCollection>(
pdf()->getVariables())->selectByAttrib(
"poi",
true));
3150 throw std::runtime_error(
"You must specify a POI for the hypoSpace");
3151 return hypoSpace(_poi->first()->GetName(), nPoints, low, high, alt_value, pllType);
3160 if (strlen(parName)) {
3161 std::unique_ptr<RooAbsCollection> axes(s.
pars()->selectByName(parName));
3163 throw std::runtime_error(
"parameter not found");
3164 axes->setAttribAll(
"axis",
true);
3169 s.
fNlls[s.
fPdfs.begin()->second] = std::make_shared<xRooNLLVar>(*
this);
3176 for (
auto poi : s.
poi()) {
3177 poi->setStringAttribute(
"altVal", std::isnan(alt_value) ?
nullptr :
TString::Format(
"%f", alt_value));
3180 r->setRange(
"scan",
r->getMin(),
r->getMax());
3197 bool setReadonly =
false;
3198 if (
nllVar && !
nllVar->get()->getAttribute(
"readOnly")) {
3200 nllVar->get()->setAttribute(
"readOnly");
3211 {
"OneSidedPositive", 1},
3212 {
"OneSidedNegative", 2},
3213 {
"OneSidedAbsolute", 3},
3227 {
"asimov_cfit_null", 4},
3229 {
"cfit_lbound", 6}}));
3235 auto fitDS =
new RooDataSet(
"fits",
"fit summary data", fitDetails);
3239 for (
int i = 0; i < 7; i++) {
3240 std::shared_ptr<const RooFitResult> fit;
3242 case 0: fit =
ufit();
break;
3245 case 3: fit =
asimov() ?
asimov()->ufit(
true) :
nullptr;
break;
3246 case 4: fit =
asimov() ?
asimov()->cfit_null(
true) :
nullptr;
break;
3259 fitDS->add(fitDetails);
3262 fitDS->setGlobalObservables(fitMeta);
3273 nullToyDS->setGlobalObservables(nullMeta);
3276 std::vector<double> values;
3277 std::vector<double> weights;
3282 values.push_back(std::get<1>(t));
3283 weights.push_back(std::get<2>(t));
3286 nullToyDS->add(nullDetails, std::get<2>(t));
3289#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
3299#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
3310 std::vector<double> values;
3311 std::vector<double> weights;
3312 values.reserve(
altToys.size());
3313 weights.reserve(
altToys.size());
3320 altToyDS->setGlobalObservables(altMeta);
3322 values.push_back(std::get<1>(t));
3323 weights.push_back(std::get<2>(t));
3326 altToyDS->add(altDetails, std::get<2>(t));
3330#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
3341#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
3351 nllVar->get()->setAttribute(
"readOnly",
false);
3359std::string cling::printValue(
const XROOFIT_NAMESPACE_NAME::xRooNLLVar::xValueWithError *
v)
3362 return "xValueWithError: nullptr\n";
3363 return v->__repr__();
3365std::string cling::printValue(
const std::map<std::string, XROOFIT_NAMESPACE_NAME::xRooNLLVar::xValueWithError> *
m)
3369 std::string out =
"{\n";
3370 for (
auto [k,
v] : *
m) {
3371 out +=
"\"" + k +
"\" => " + printValue(&
v) +
"\n";
const char Option_t
Option string (const char)
void Info(const char *location, const char *msgfmt,...)
Use this function for informational messages.
void Error(const char *location, const char *msgfmt,...)
Use this function in case an error occurred.
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 w
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 target
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 value
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
TMatrixTSym< Double_t > TMatrixDSym
R__EXTERN TStyle * gStyle
R__EXTERN TSystem * gSystem
AutoRestorer(const RooAbsCollection &s, xRooNLLVar *nll=nullptr)
std::pair< std::shared_ptr< RooAbsData >, std::shared_ptr< const RooAbsCollection > > fOldData
std::unique_ptr< RooAbsCollection > fSnap
static double k(const IncompatFunc &compatRegions, double pValue, double poiVal, double poiPrimeVal, double sigma_mu=0, double mu_low=-std::numeric_limits< double >::infinity(), double mu_high=std::numeric_limits< double >::infinity())
static int CompatFactor(const IncompatFunc &func, double mu_hat)
static double PValue(const IncompatFunc &compatRegions, double k, double mu, double mu_prime, double sigma_mu=0, double mu_low=-std::numeric_limits< double >::infinity(), double mu_high=std::numeric_limits< double >::infinity())
std::shared_ptr< RooFitResult > fr
!
static std::shared_ptr< const RooFitResult > minimize(RooAbsReal &nll, const std::shared_ptr< ROOT::Fit::FitConfig > &fitConfig=nullptr, const std::shared_ptr< RooLinkedList > &nllOpts=nullptr)
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 std::shared_ptr< ROOT::Fit::FitConfig > createFitConfig()
double impact(const char *poi, const char *np, bool up=true, bool prefit=false, bool approx=false)
std::shared_ptr< xRooNLLVar > fNll
const RooFitResult * operator->() const
void Draw(Option_t *opt="")
xRooFitResult ifit(const char *np, bool up, bool prefit=false)
double conditionalError(const char *poi, const char *nps, bool up=true, bool approx=false)
std::shared_ptr< xRooNLLVar > nll() const
RooArgList ranknp(const char *poi, bool up=true, bool prefit=false, double approxThreshold=std::numeric_limits< double >::infinity())
std::shared_ptr< xRooNode > fNode
xRooFitResult(const RooFitResult &fr)
xRooFitResult cfit(const char *poiValues, const char *alias=nullptr)
std::shared_ptr< std::map< std::string, xRooFitResult > > fCfits
xValueWithError pll(bool readOnly=false)
std::shared_ptr< RooStats::HypoTestResult > hypoTestResult
RooStats::HypoTestResult result()
std::shared_ptr< const RooFitResult > retrieveFit(int type)
std::pair< std::shared_ptr< RooAbsData >, std::shared_ptr< const RooAbsCollection > > fData
std::vector< std::tuple< int, double, double > > altToys
std::shared_ptr< const RooAbsCollection > coords
std::shared_ptr< const RooFitResult > fLbound_cfit
std::shared_ptr< const RooFitResult > cfit_lbound(bool readOnly=false)
std::shared_ptr< xRooNLLVar > nllVar
void Draw(Option_t *opt="") override
Default Draw method for all objects.
std::shared_ptr< const RooFitResult > fNull_cfit
TString tsTitle(bool inWords=false) const
xValueWithError ts_toys(double nSigma=std::numeric_limits< double >::quiet_NaN())
std::shared_ptr< const RooFitResult > fUfit
xRooHypoPoint(std::shared_ptr< RooStats::HypoTestResult > htr=nullptr, const RooAbsCollection *_coords=nullptr)
xRooFit::Asymptotics::PLLType fPllType
xValueWithError sigma_mu(bool readOnly=false)
xValueWithError pAlt_asymp(double nSigma=std::numeric_limits< double >::quiet_NaN())
std::vector< std::tuple< int, double, double > > nullToys
std::shared_ptr< xRooHypoPoint > asimov(bool readOnly=false)
void setAltVal(double val)
xValueWithError pAlt_toys(double nSigma=std::numeric_limits< double >::quiet_NaN())
std::shared_ptr< const RooFitResult > ufit(bool readOnly=false)
void Print(Option_t *opt="") const override
Print TNamed name and title.
std::shared_ptr< const RooFitResult > cfit_null(bool readOnly=false)
std::pair< std::shared_ptr< RooAbsData >, std::shared_ptr< const RooAbsCollection > > data()
xRooHypoPoint generateNull(int seed=0)
RooArgList alt_poi() const
xValueWithError pCLs_asymp(double nSigma=std::numeric_limits< double >::quiet_NaN())
std::shared_ptr< const RooFitResult > cfit_alt(bool readOnly=false)
size_t addToys(bool alt, int nToys, int initialSeed=0, double target=std::numeric_limits< double >::quiet_NaN(), double target_nSigma=std::numeric_limits< double >::quiet_NaN(), bool targetCLs=false, double relErrThreshold=2., size_t maxToys=10000)
void addAltToys(int nToys=1, int seed=0, double target=std::numeric_limits< double >::quiet_NaN(), double target_nSigma=std::numeric_limits< double >::quiet_NaN())
std::shared_ptr< const RooFitResult > fAlt_cfit
void addCLsToys(int nToys=1, int seed=0, double target=std::numeric_limits< double >::quiet_NaN(), double target_nSigma=std::numeric_limits< double >::quiet_NaN())
xRooHypoPoint generateAlt(int seed=0)
xValueWithError pX_toys(bool alt, double nSigma=std::numeric_limits< double >::quiet_NaN())
std::shared_ptr< const RooFitResult > fGenFit
void addNullToys(int nToys=1, int seed=0, double target=std::numeric_limits< double >::quiet_NaN(), double target_nSigma=std::numeric_limits< double >::quiet_NaN())
static std::set< int > allowedStatusCodes
std::shared_ptr< xRooHypoPoint > fAsimov
xValueWithError pCLs_toys(double nSigma=std::numeric_limits< double >::quiet_NaN())
void setNullVal(double val)
xValueWithError ts_asymp(double nSigma=std::numeric_limits< double >::quiet_NaN())
xValueWithError getVal(const char *what)
xValueWithError pNull_asymp(double nSigma=std::numeric_limits< double >::quiet_NaN())
xValueWithError pNull_toys(double nSigma=std::numeric_limits< double >::quiet_NaN())
std::shared_ptr< RooArgSet > pars() const
xRooFit::Asymptotics::PLLType fTestStatType
bool AddModel(const xRooNode &pdf, const char *validity="")
std::map< std::shared_ptr< xRooNode >, std::shared_ptr< xRooNLLVar > > fNlls
int AddPoints(const char *parName, size_t nPoints, double low, double high)
std::set< std::pair< std::shared_ptr< RooArgList >, std::shared_ptr< xRooNode > > > fPdfs
std::shared_ptr< RooAbsCollection > fFuncGlobs
double binnedDataTermVal() const
double saturatedConstraintTermVal() const
std::shared_ptr< const RooAbsCollection > fGlobs
std::shared_ptr< RooLinkedList > fOpts
std::shared_ptr< RooAbsReal > func() const
RooAbsData * data() const
std::set< std::string > binnedChannels() const
ROOT::Math::IOptions * fitConfigOptions()
RooConstraintSum * constraintTerm() const
std::shared_ptr< ROOT::Fit::FitConfig > fFitConfig
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)
TObject * Scan(const RooArgList &scanPars, const std::vector< std::vector< double > > &coords, const RooArgList &profilePars=RooArgList())
std::shared_ptr< RooAbsCollection > fConstVars
xRooNLLVar(RooAbsPdf &pdf, const std::pair< RooAbsData *, const RooAbsCollection * > &data, const RooLinkedList &nllOpts=RooLinkedList())
std::shared_ptr< RooAbsPdf > pdf() const
double mainTermPgof() const
double extendedTermVal() const
double constraintTermVal() const
double simTermVal() const
void Print(Option_t *opt="")
std::string fFuncCreationLog
void Draw(Option_t *opt="")
double saturatedMainTermVal() const
std::pair< std::shared_ptr< RooAbsData >, std::shared_ptr< const RooAbsCollection > > generate(bool expected=false, int seed=0)
std::pair< std::shared_ptr< RooAbsData >, std::shared_ptr< const RooAbsCollection > > getData() const
double getEntryVal(size_t entry) const
double saturatedVal() const
std::shared_ptr< RooAbsCollection > fFuncVars
double getEntryBinWidth(size_t entry) const
std::shared_ptr< ROOT::Fit::FitConfig > fitConfig()
std::shared_ptr< RooArgSet > pars(bool stripGlobalObs=true) const
void SetOption(const RooCmdArg &opt)
double mainTermVal() const
std::shared_ptr< RooAbsData > fData
double mainTermNdof() const
std::shared_ptr< RooAbsPdf > fPdf
bool setData(const std::pair< std::shared_ptr< RooAbsData >, std::shared_ptr< const RooAbsCollection > > &_data)
xRooHypoPoint hypoPoint(const char *parName, double value, double alt_value=std::numeric_limits< double >::quiet_NaN(), const xRooFit::Asymptotics::PLLType &pllType=xRooFit::Asymptotics::Unknown)
xRooFitResult minimize(const std::shared_ptr< ROOT::Fit::FitConfig > &=nullptr)
The xRooNode class is designed to wrap over a TObject and provide functionality to aid with interacti...
xRooNode bins() const
bins of a channel or sample, or channels of a multi-channel pdf
Generic interface for defining configuration options of a numerical algorithm.
void SetValue(const char *name, double val)
generic methods for retrieving options
virtual void SetNamedValue(const char *, const char *)
Common abstract base class for objects that represent a value and a "shape" in RooFit.
void setStringAttribute(const Text_t *key, const Text_t *value)
Associate string 'value' to this object under key 'key'.
Abstract base class for objects that represent a discrete value that can be set from the outside,...
A space to attach TBranches.
Abstract container object that can hold multiple RooAbsArg objects.
virtual bool remove(const RooAbsArg &var, bool silent=false, bool matchByNameOnly=false)
Remove the specified argument from our list.
RooAbsCollection * snapshot(bool deepCopy=true) const
Take a snap shot of current collection contents.
virtual bool add(const RooAbsArg &var, bool silent=false)
Add the specified argument to list.
void setAttribAll(const Text_t *name, bool value=true)
Set given attribute in each element of the collection by calling each elements setAttribute() functio...
Int_t index(const RooAbsArg *arg) const
Returns index of given arg, or -1 if arg is not in the collection.
Storage_t::size_type size() const
RooAbsArg * first() const
bool setCatIndex(const char *name, Int_t newVal=0, bool verbose=false)
Set index value of a RooAbsCategoryLValue stored in set with given name to newVal.
bool setRealValue(const char *name, double newVal=0.0, bool verbose=false)
Set value of a RooAbsRealLValue stored in set with given name to newVal No error messages are printed...
virtual RooAbsArg * addClone(const RooAbsArg &var, bool silent=false)
Add a clone of the specified argument to list.
const char * getCatLabel(const char *name, const char *defVal="", bool verbose=false) const
Get state name of a RooAbsCategory stored in set with given name.
std::string contentsString() const
Return comma separated list of contained object names as STL string.
void setName(const char *name)
Abstract base class for binned and unbinned datasets.
virtual Int_t numEntries() const
Return number of entries in dataset, i.e., count unweighted entries.
Abstract interface for all probability density functions.
Abstract base class for objects that represent a real value that may appear on the left hand side of ...
virtual void setVal(double value)=0
Set the current value of the object. Needs to be overridden by implementations.
virtual double getMin(const char *name=nullptr) const
Get minimum of currently defined range.
Abstract base class for objects that represent a real value and implements functionality common to al...
double getVal(const RooArgSet *normalisationSet=nullptr) const
Evaluate object.
virtual bool setData(RooAbsData &, bool=true)
RooArgList is a container object that can hold multiple RooAbsArg objects.
RooAbsArg * at(Int_t idx) const
Return object at given index, or nullptr if index is out of range.
RooArgSet is a container object that can hold multiple RooAbsArg objects.
RooArgSet * selectCommon(const RooAbsCollection &refColl) const
Use RooAbsCollection::selecCommon(), but return as RooArgSet.
Object to represent discrete states.
Named container for two doubles, two integers two object points and three string pointers that can be...
const RooArgSet * getSet(Int_t idx) const
Return RooArgSet stored in slot idx.
double getDouble(Int_t idx) const
Return double stored in slot idx.
Int_t getInt(Int_t idx) const
TObject * Clone(const char *newName=nullptr) const override
Make a clone of an object using the Streamer facility.
const char * getString(Int_t idx) const
Return string stored in slot idx.
Calculates the sum of the -(log) likelihoods of a set of RooAbsPfs that represent constraint function...
Container class to hold unbinned data.
RooFitResult is a container class to hold the input and output of a PDF fit to a dataset.
Collection class for internal use, storing a collection of RooAbsArg pointers in a doubly linked list...
TObject * At(int index) const
Return object stored in sequential position given by index.
static RooMsgService & instance()
Return reference to singleton instance.
StreamConfig & getStream(Int_t id)
static TRandom * randomGenerator()
Return a pointer to a singleton random-number generator implementation.
Variable that can be changed from the outside.
void setVal(double value) override
Set value of variable to 'value'.
double getErrorLo() const
double getErrorHi() 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.
void SetAltDetailedOutput(RooDataSet *d)
double fNullPValue
p-value for the null hypothesis (small number means disfavoured)
double fAlternatePValueError
error of p-value for the alternate hypothesis (small number means disfavoured)
void SetNullDetailedOutput(RooDataSet *d)
void SetBackgroundAsAlt(bool l=true)
void SetAltPValue(double pvalue)
void SetNullDistribution(SamplingDistribution *null)
void SetTestStatisticData(const double tsd)
void SetAltPValueError(double err)
void SetFitInfo(RooDataSet *d)
double fNullPValueError
error of p-value for the null hypothesis (small number means disfavoured)
void SetAltDistribution(SamplingDistribution *alt)
double fAlternatePValue
p-value for the alternate hypothesis (small number means disfavoured)
void SetNullPValue(double pvalue)
void SetNullPValueError(double err)
This class simply holds a sampling distribution of some test statistic.
A RooAbsArg implementing string values.
Draw all kinds of Arrows.
virtual void SetLineStyle(Style_t lstyle)
Set the line style.
virtual void SetLineWidth(Width_t lwidth)
Set the line width.
virtual void SetMarkerColor(Color_t mcolor=1)
Set the marker color.
virtual void SetMarkerStyle(Style_t mstyle=1)
Set the marker style.
static TCanvas * MakeDefCanvas()
Static function to build a default canvas.
const char * AsString() const
Return the date & time as a string (ctime() format).
TDirectory::TContext keeps track and restore the current directory.
Describe directory structure in memory.
Class to handle efficiency histograms.
void FillWeighted(Bool_t bPassed, Double_t weight, Double_t x, Double_t y=0, Double_t z=0)
This function is used for filling the two histograms with a weight.
Double_t GetEfficiencyErrorUp(Int_t bin) const
Returns the upper error on the efficiency in the given global bin.
void Fill(Bool_t bPassed, Double_t x, Double_t y=0, Double_t z=0)
This function is used for filling the two histograms.
Graphics object made of three arrays X, Y and Z with the same number of points each.
virtual void SetPoint(Int_t point, Double_t x, Double_t y, Double_t z)
Sets point number n.
A TGraph is an object made of two arrays X and Y with npoints each.
virtual void SetPoint(Int_t i, Double_t x, Double_t y)
Set x and y values for point number i.
virtual void Sort(Bool_t(*greater)(const TGraph *, Int_t, Int_t)=&TGraph::CompareX, Bool_t ascending=kTRUE, Int_t low=0, Int_t high=-1111)
Sorts the points of this TGraph using in-place quicksort (see e.g.
void SetName(const char *name="") override
Set graph name.
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)
TH1 is the base class of all histogram classes in ROOT.
virtual Double_t GetMinimum(Double_t minval=-FLT_MAX) const
Return minimum value larger than minval of bins in the range, unless the value has been overridden by...
This class displays a legend box (TPaveText) containing several legend entries.
Use the TLine constructor to create a simple line.
virtual TLine * DrawLine(Double_t x1, Double_t y1, Double_t x2, Double_t y2)
Draw this line with new coordinates.
A TMultiGraph is a collection of TGraph (or derived) objects.
The TNamed class is the base class for all named ROOT classes.
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.
Mother of all ROOT objects.
virtual const char * GetName() const
Returns name of object.
virtual TObject * FindObject(const char *name) const
Must be redefined in derived classes.
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
@ kCanDelete
if object in a list can be deleted
virtual void SetSeed(ULong_t seed=0)
Set the random generator seed.
virtual UInt_t Integer(UInt_t imax)
Returns a random integer uniformly distributed on the interval [ 0, imax-1 ].
Regular expression class.
Double_t RealTime()
Stop the stopwatch (if it is running) and return the realtime (in seconds) passed between the start a...
void Start(Bool_t reset=kTRUE)
Start the stopwatch.
void Continue()
Resume a stopped stopwatch.
Provides iteration through tokens of a given string.
Bool_t NextToken()
Get the next token, it is stored in this TString.
void ToLower()
Change string to lower-case.
Int_t Atoi() const
Return integer value of 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
TString & ReplaceAll(const TString &s1, const TString &s2)
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
This class defines a UUID (Universally Unique IDentifier), also known as GUIDs (Globally Unique IDent...
TDatime GetTime() const
Get time from UUID.
TVirtualPad is an abstract base class for the Pad and Canvas classes.
virtual TList * GetListOfPrimitives() const =0
virtual TObject * GetPrimitive(const char *name) const =0
RooCmdArg WeightVar(const char *name="weight", bool reinterpretAsWeight=false)
RooCmdArg GlobalObservables(Args_t &&... argsOrArgSet)
RooCmdArg GlobalObservablesSource(const char *sourceName)
double gaussian_pdf(double x, double sigma=1, double x0=0)
Probability density function of the normal (Gaussian) distribution with mean x0 and standard deviatio...
double gaussian_cdf(double x, double sigma=1, double x0=0)
Alternative name for same function.
double gaussian_cdf_c(double x, double sigma=1, double x0=0)
Alternative name for same function.
static constexpr auto NumIntegration
Alias of MsgLevel::NumericIntegration for backwards compatibility.
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 Poisson(Double_t x, Double_t par)
Computes the Poisson distribution function for (x,par).
Double_t LnGamma(Double_t z)
Computation of ln[gamma(z)] for all z.
#define BEGIN_XROOFIT_NAMESPACE
#define END_XROOFIT_NAMESPACE
void removeTopic(RooFit::MsgTopic oldTopic)
std::string collectionContents(const RooAbsCollection &coll)