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;
147xRooNLLVar::~xRooNLLVar() {}
149xRooNLLVar::xRooNLLVar(
RooAbsPdf &pdf,
const std::pair<RooAbsData *, const RooAbsCollection *> &
data,
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,
161 : fPdf(pdf), fData(
data.first), fGlobs(
data.second)
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());
200 _vars->add(*std::unique_ptr<RooArgSet>(
con->getVariables()));
223 bool hasRange(
false);
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);
255 if (_cat.hasRange(
p) && _cat.inRange(
p)) {
261 newPdf->addPdf(*_pdf,
c.first.c_str());
296 (
opts.find(
"GlobalObservables"))
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);
362 if (
a->InheritsFrom(
"RooRealSumPdf")) {
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));
382 a->setAttribute(
"BinnedLikelihood",
setBinned);
386 std::map<RooAbsPdf *, std::string>
normRanges;
390 if (
auto sr =
dynamic_cast<RooCmdArg *
>(
fOpts->find(
"SplitRange"));
402 for (
auto cat :
simPdf->indexCat()) {
407 srangeName.ReplaceAll(
",",
"_" + cat.first +
",");
410 subpdf->treeNodeServerList(&
ss,
nullptr,
true,
false);
413 if (
a->InheritsFrom(
"RooAddPdf")) {
425 if (
a->InheritsFrom(
"RooAddPdf")) {
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());
457 k->setNormRange(
v ==
"" ?
nullptr :
v.c_str());
460 std::shared_ptr<RooAbsReal>::get()->setAttribute(
a.c_str());
466 std::shared_ptr<RooAbsReal>::get()->SetName(
oldName);
469 std::shared_ptr<RooAbsReal>::get()->getVal();
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);
493 const_cast<RooArgList &
>(fr->constPars()).setAttribAll(
"global",
false);
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);
558 throw std::runtime_error(
"xRooFitResult::ifit: par not found");
567 throw std::runtime_error(
"xRooFitResult::impact: poi not found");
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");
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")) ||
621 throw std::runtime_error(
TString::Format(
"Could not find poi: %s", poi));
624 fNode->Warning(
"conditionalError",
"No parameters selected by: %s",
nps);
629 int idx = vars.
index(poi);
630 return sqrt(
get()->conditionalCovarianceMatrix(vars)(idx, idx));
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)));
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);
669 v = std::numeric_limits<double>::quiet_NaN();
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);
690 vv->removeMin();
vv->removeMax();
706 const_cast<RooArgList &
>(out->constPars()).setAttribAll(
"global",
false);
708 std::unique_ptr<RooAbsCollection>(out->constPars().selectCommon(*
fGlobs))->
setAttribAll(
"global",
true);
711 if (
fOpts->find(
"GoF")) {
718 return xRooFitResult(std::make_shared<xRooNode>(out,
fPdf), std::make_shared<xRooNLLVar>(*
this));
740 if (
size_t(_data->numEntries()) <=
entry)
743 *std::unique_ptr<RooAbsCollection>(_pdf->getObservables(_data)) = *_data->get(
entry);
746 return -_data->weight() * _pdf->getLogVal(_data->get());
751 std::set<std::string> out;
762 c->
get<
RooAbsArg>()->treeNodeServerList(&nodes,
nullptr,
true,
false);
764 for (
auto a : nodes) {
765 if (
a->InheritsFrom(
"RooRealSumPdf") &&
783 pdf()->treeNodeServerList(&nodes,
nullptr,
true,
false);
784 for (
auto a : nodes) {
785 if (
a->InheritsFrom(
"RooRealSumPdf") &&
801 if (
size_t(_data->numEntries()) <=
entry)
803 auto _pdf =
pdf().get();
804 std::unique_ptr<RooAbsCollection>
_robs(_pdf->getObservables(_data->get()));
807 _pdf = s->getPdf(s->indexCat().getCurrentLabel());
810 for (
auto o : *
_robs) {
814 std::unique_ptr<std::list<double>> bins(
815 _pdf->binBoundaries(*
a, -std::numeric_limits<double>::infinity(), std::numeric_limits<double>::infinity()));
817 double lowEdge = -std::numeric_limits<double>::infinity();
818 for (
auto b : *bins) {
819 if (
b >
a->getVal()) {
846 for (
auto c :
cTerm->list()) {
847 if (std::string(
c->ClassName()) ==
"RooAbsPdf" ||
848 std::string(
c->ClassName()).find(
"RooNormalizedPdf") != std::string::npos) {
858 gaus->getMean().GetName()));
877 std::unique_ptr<RooAbsCollection>(
pars()->selectByAttrib(
"Constant",
false))->
size();
891 std::unique_ptr<RooAbsCollection>
_floats(
pars()->selectByAttrib(
"Constant",
false));
934 return std::numeric_limits<double>::quiet_NaN();
948 double out = _data->sumEntries();
949 for (
int i = 0; i < _data->numEntries(); i++) {
951 double w = _data->weight();
954 out -=
w * std::log(
w);
967 throw std::runtime_error(
"Cannot determine category of RooSimultaneous pdf");
978 auto out = std::shared_ptr<RooArgSet>(
get()->getVariables());
980 out->remove(*
fGlobs,
true,
true);
1005 std::unique_ptr<RooAbsCollection>
funcVars(
get()->getVariables());
1008 for (
auto &
coord : coords) {
1010 throw std::runtime_error(
"Invalid coordinate");
1012 for (
size_t i = 0; i <
coord.size(); i++) {
1035 if (
sOpt ==
"sensitivity") {
1040 if (
sOpt ==
"floating") {
1042 auto floats = std::unique_ptr<RooAbsCollection>(
_pars->selectByAttrib(
"Constant",
false));
1065 if (
auto a =
_pars->find(s);
a)
1069 if (vars.
size() == 1) {
1075 bad->SetMarkerStyle(5);
1077 bool normRange =
false;
1091 double step = (
v->getMax() -
v->getMin()) / 100;
1092 double init =
v->getVal();
1095 auto currTime = std::chrono::steady_clock::now();
1096 while (out->
GetN() < 100 && (low >
v->getMin() ||
high < v->getMax())) {
1097 if (out->
GetN() == 0) {
1107 if (low >
v->getMin()) {
1109 auto _v =
func()->getVal();
1110 if (std::isnan(
_v) || std::isinf(
_v)) {
1111 if (
bad->GetN() == 0)
1121 auto _v =
func()->getVal();
1122 if (std::isnan(
_v) || std::isinf(
_v)) {
1123 if (
bad->GetN() == 0)
1134 if (std::chrono::steady_clock::now() -
currTime > std::chrono::seconds(1)) {
1135 currTime = std::chrono::steady_clock::now();
1144#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 30, 00)
1145 gPad->GetCanvas()->ResetUpdated();
1150 Error(
"Draw",
"Name a parameter to scan over: Draw(<name>) , choose from: %s",
1151 _pars->empty() ?
"" :
_pars->contentsString().c_str());
1165 return setData(std::dynamic_pointer_cast<RooAbsData>(
data.fComp),
1166 std::shared_ptr<const RooAbsCollection>(
data.globs().argList().snapshot()));
1169bool xRooNLLVar::setData(
const std::pair<std::shared_ptr<RooAbsData>, std::shared_ptr<const RooAbsCollection>> &_data)
1172 if (
fData == _data.first &&
fGlobs == _data.second)
1177 auto _dglobs = (_data.second) ? _data.second
1178 : std::shared_ptr<const RooAbsCollection>(_data.first->getGlobalObservables(),
1185 throw std::runtime_error(
"Missing globs");
1196 rC.remove(*std::unique_ptr<RooAbsCollection>(
rC.selectCommon(*
_actualGlobs)));
1202 throw std::runtime_error(
TString::Format(
"globs mismatch: adding %s removing %s",
r.Data(),
l.Data()));
1207 if (!std::shared_ptr<RooAbsReal>::get()) {
1208 fData = _data.first;
1221 fFuncVars->setAttribAll(
"Constant",
false);
1225 fData = _data.first;
1246 fData = _data.first;
1248 }
catch (std::runtime_error &) {
1253 fFuncVars->setAttribAll(
"Constant",
false);
1257 fData = _data.first;
1261 throw std::runtime_error(
"Unable to setData");
1268 }
else if (
auto f = std::unique_ptr<RooAbsCollection>(
fConstVars->selectByAttrib(
"Constant",
false)); !
f->empty()) {
1297 }
else if (
strcmp(opt.
GetName(),
"StrategySequence") == 0) {
1321 if (std::shared_ptr<RooAbsReal>::get()) {
1394 return fData->sumEntries() * log(1.0 * (s->servers().size() - 1));
1406 for (
int i = 0; i <
fData->numEntries(); i++) {
1416 auto _func =
func();
1419 for (
auto s : _func->servers()) {
1423 for (
auto s2 : s->servers()) {
1441 sWhat.ReplaceAll(
" =",
"=").ReplaceAll(
"= ",
"=");
1451 : std::numeric_limits<double>::quiet_NaN();
1464 if (getVal(
sWhat +
" readonly").second != 0) {
1465 if (
sWhat.Contains(
"toys=")) {
1474 if (nullToys.size() <
nToys) {
1475 addNullToys(
nToys - nullToys.size());
1478 addAltToys(
nToysAlt - altToys.size());
1482 addCLsToys(100, 0, 0.05,
nSigma);
1484 throw std::runtime_error(
"Auto-generating toys for anything other than CLs not yet supported, please "
1485 "specify number of toys with 'toys=N' ");
1493 if (
rr && var && var->get()) {
1494 _readOnly = var->get()->getAttribute(
"readOnly");
1495 var->get()->setAttribute(
"readOnly",
rr);
1503 var->get()->setAttribute(
"readOnly",
_readOnly);
1509 std::shared_ptr<xRooNLLVar> &var;
1523 throw std::runtime_error(std::string(
"Unknown: ") +
what);
1530 out.
add(*std::unique_ptr<RooAbsCollection>(coords->selectByAttrib(
"poi",
true)));
1538 out.
addClone(*std::unique_ptr<RooAbsCollection>(coords->selectByAttrib(
"poi",
true)));
1539 for (
auto a : out) {
1543 if (
auto s =
a->getStringAttribute(
"altVal"); s &&
strlen(s)) {
1546 v->setVal(std::numeric_limits<double>::quiet_NaN());
1556 if (me.ufit(
true) && !allowedStatusCodes.count(me.ufit(
true)->status()))
1558 if (me.cfit_null(
true) && !allowedStatusCodes.count(me.cfit_null(
true)->status()))
1560 if (me.cfit_alt(
true) && !allowedStatusCodes.count(me.cfit_alt(
true)->status()))
1562 if (me.asimov(
true))
1563 out += me.asimov(
true)->status() << 3;
1571 std::cout <<
"POI: " << _poi.contentsString() <<
" , null: ";
1573 for (
auto a : _poi) {
1582 std::cout <<
" , alt: ";
1593 if (!std::isnan(
v->getVal()))
1596 std::cout <<
" , pllType: " << fPllType << std::endl;
1599 std::cout <<
" obs ts: " << obs_ts <<
" +/- " << obs_ts_err << std::endl;
1602 std::cout <<
" - ufit: ";
1604 std::cout << fUfit->GetName() <<
" " << fUfit->minNll() <<
" (status=" << fUfit->status() <<
") (";
1606 for (
auto a : _poi) {
1607 auto v =
dynamic_cast<RooRealVar *
>(fUfit->floatParsFinal().find(
a->GetName()));
1612 std::cout <<
v->
GetName() <<
"_hat: " <<
v->getVal() <<
" +/- " <<
v->getError();
1615 std::cout <<
")" << std::endl;
1617 std::cout <<
"Not calculated" << std::endl;
1619 std::cout <<
" - cfit_null: ";
1621 std::cout << fNull_cfit->GetName() <<
" " << fNull_cfit->minNll() <<
" (status=" << fNull_cfit->status() <<
")";
1623 std::cout <<
"Not calculated";
1626 std::cout << std::endl <<
" - cfit_alt: ";
1628 std::cout << fAlt_cfit->GetName() <<
" " << fAlt_cfit->minNll() <<
" (status=" << fAlt_cfit->status() <<
")"
1631 std::cout <<
"Not calculated" << std::endl;
1633 std::cout <<
" sigma_mu: ";
1635 if (!fAsimov || !fAsimov->fUfit || !fAsimov->fNull_cfit) {
1636 std::cout <<
"Not calculated";
1638 std::cout << const_cast<xRooHypoPoint *>(
this)->
sigma_mu().first <<
" +/- "
1642 std::cout << std::endl;
1643 std::cout <<
" - asimov ufit: ";
1644 if (fAsimov->fUfit) {
1645 std::cout << fAsimov->
fUfit->GetName() <<
" " << fAsimov->fUfit->minNll()
1646 <<
" (status=" << fAsimov->fUfit->status() <<
")";
1648 std::cout <<
"Not calculated";
1650 std::cout << std::endl <<
" - asimov cfit_null: ";
1651 if (fAsimov->fNull_cfit) {
1652 std::cout << fAsimov->fNull_cfit->GetName() <<
" " << fAsimov->fNull_cfit->minNll()
1653 <<
" (status=" << fAsimov->fNull_cfit->status() <<
")";
1655 std::cout <<
"Not calculated";
1658 std::cout << std::endl;
1660 std::cout << std::endl;
1663 std::cout <<
" - cfit_lbound: " << fLbound_cfit->GetName() <<
" " << fLbound_cfit->minNll()
1664 <<
" (status=" << fLbound_cfit->status() <<
")" << std::endl;
1667 std::cout <<
" - gfit: " << fGenFit->GetName() << std::endl;
1668 if (!nullToys.empty() || !altToys.empty()) {
1669 std::cout <<
" * null toys: " << nullToys.size();
1671 while (
firstToy < nullToys.size() && std::isnan(std::get<1>(nullToys[
firstToy])))
1674 std::cout <<
" [ of which " <<
firstToy <<
" are bad]";
1675 std::cout <<
" , alt toys: " << altToys.size();
1677 while (
firstToy < altToys.size() && std::isnan(std::get<1>(altToys[
firstToy])))
1680 std::cout <<
" [ of which " <<
firstToy <<
" are bad]";
1681 std::cout << std::endl;
1689 auto var =
dynamic_cast<RooRealVar *
>(ufit()->floatParsFinal().find(fPOIName()));
1693 throw std::runtime_error(
TString::Format(
"Cannot find POI: %s", fPOIName()));
1696 throw std::runtime_error(
"Unconditional fit unavailable");
1703 if (fGenFit && isExpected) {
1711 : hypoTestResult(
htr)
1727 if (
toys->getGlobalObservables()) {
1728 coords = std::shared_ptr<RooAbsCollection>(
toys->getGlobalObservables()->snapshot());
1730 for (
int i = 0; i <
toys->numEntries(); i++) {
1733 std::make_tuple(
int(
toy->getRealValue(
"seed")),
toy->getRealValue(
"ts"),
toys->weight()));
1738 for (
int i = 0; i <
toys->numEntries(); i++) {
1741 std::make_tuple(
int(
toy->getRealValue(
"seed")),
toy->getRealValue(
"ts"),
toys->weight()));
1752 if (!fAsimov && (nllVar || hypoTestResult)) {
1753 auto theFit = (!
fData.first && fGenFit && !isExpected)
1758 if (!
theFit || allowedStatusCodes.find(
theFit->status()) == allowedStatusCodes.
end())
1760 fAsimov = std::make_shared<xRooHypoPoint>(*
this);
1761 fAsimov->coords.reset(fAsimov->coords->snapshot());
1762 fAsimov->hypoTestResult.reset();
1764 for (
auto p : fAsimov->poi()) {
1767 v->deleteSharedProperties();
1771 fAsimov->nullToys.clear();
1772 fAsimov->altToys.clear();
1773 fAsimov->fUfit = retrieveFit(3);
1774 fAsimov->fNull_cfit = retrieveFit(4);
1775 fAsimov->fAlt_cfit.reset();
1777 std::make_pair(
nullptr,
nullptr);
1778 fAsimov->fGenFit =
theFit;
1779 fAsimov->isExpected =
true;
1788 return std::pair<double, double>(1, 0);
1791 return std::pair<double, double>(std::numeric_limits<double>::quiet_NaN(), 0);
1801 return std::pair(
nom, std::max(std::abs(
up -
nom), std::abs(
down -
nom)));
1807 return std::pair<double, double>(1, 0);
1810 return std::pair<double, double>(std::numeric_limits<double>::quiet_NaN(), 0);
1821 return std::pair(
nom, std::max(std::abs(
up -
nom), std::abs(
down -
nom)));
1826 if (fNullVal() == fAltVal())
1827 return std::pair<double, double>(1, 0);
1830 return std::pair<double, double>(1, 0);
1833 return std::pair<double, double>(std::numeric_limits<double>::quiet_NaN(), 0);
1858 return std::pair(
nom, std::max(std::abs(
up -
nom), std::abs(
down -
nom)));
1863 if (std::isnan(
nSigma)) {
1870 return std::pair<double, double>(std::numeric_limits<double>::quiet_NaN(), 0);
1879 return std::pair<double, double>(
nom, std::max(std::abs(
nom -
up), std::abs(
nom -
down)));
1884 if (std::isnan(
nSigma)) {
1889 while (
firstToy < altToys.size() && std::isnan(std::get<1>(altToys[
firstToy])))
1892 return std::pair(std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN());
1895 return std::pair(std::get<1>(altToys[
targetIdx]), (std::get<1>(altToys[std::min(
int(altToys.size()),
targetIdx)]) -
1896 std::get<1>(altToys[std::max(0,
targetIdx)])) /
1905 return std::pair<double, double>(hypoTestResult->GetTestStatisticData(), 0);
1906 return std::pair<double, double>(std::numeric_limits<double>::quiet_NaN(), 0);
1908 if (allowedStatusCodes.find(
_ufit->status()) == allowedStatusCodes.end()) {
1909 return std::pair<double, double>(std::numeric_limits<double>::quiet_NaN(), 0);
1913 mu_hat().getVal() <
_first_poi->getMin(
"physical")) {
1917 return std::pair<double, double>(std::numeric_limits<double>::quiet_NaN(), 0);
1924 return std::pair<double, double>(0, 0);
1927 return std::pair<double, double>(std::numeric_limits<double>::quiet_NaN(), 0);
1935 return std::pair<double, double>(2. * cFactor *
diff,
1936 2. * cFactor * sqrt(pow(cfit_null(
readOnly)->edm(), 2) + pow(
_ufit->edm(), 2)));
1942 if (!hypoTestResult)
1945 if (
auto fits = hypoTestResult->GetFitInfo()) {
1946 for (
int i = 0; i <
fits->numEntries(); i++) {
1947 auto fit =
fits->get(i);
1948 if (fit->getCatIndex(
"type") !=
type)
1952 fits->getGlobalObservables()->getStringValue(
TString::Format(
"%s.name", fit->getCatLabel(
"type")));
1955 for (
auto file : *
gROOT->GetListOfFiles()) {
1959 k->GetMotherDir()->GetList()
1973 rfit->setStatus(fit->getRealValue(
"status"));
1974 rfit->setMinNLL(fit->getRealValue(
"minNll"));
1975 rfit->setEDM(fit->getRealValue(
"edm"));
1977 std::unique_ptr<RooAbsCollection>
par_hats(
1978 hypoTestResult->GetFitInfo()->getGlobalObservables()->selectByName(coords->contentsString().c_str()));
1979 par_hats->setName(
"floatParsFinal");
1987 rfit->setCovarianceMatrix(
cov);
1988 rfit->setCovQual(fit->getRealValue(
"covQual"));
1999 if (
auto rfit = retrieveFit(0)) {
2000 return fUfit =
rfit;
2002 if (!nllVar || (
readOnly && nllVar->get() && !nllVar->get()->getAttribute(
"readOnly")))
2004 if (!nllVar->fFuncVars)
2005 nllVar->reinitialize();
2008 if (!
readOnly && isExpected && fGenFit) {
2010 bool tmp = nllVar->get()->getAttribute(
"readOnly");
2011 nllVar->get()->setAttribute(
"readOnly");
2012 auto out = ufit(
true);
2013 nllVar->get()->setAttribute(
"readOnly",
tmp);
2018 nllVar->setData(
data());
2021 }
else if (!nllVar->get()->getAttribute(
"readOnly")) {
2022 nllVar->setData(
fData);
2024 nllVar->fFuncVars->setAttribAll(
"Constant",
false);
2025 *nllVar->fFuncVars = *coords;
2026 if (nllVar->fFuncGlobs)
2027 nllVar->fFuncGlobs->setAttribAll(
"Constant",
true);
2028 std::unique_ptr<RooAbsCollection>(nllVar->fFuncVars->selectCommon(poi()))
2029 ->setAttribAll(
"Constant",
false);
2032 nllVar->fFuncVars->assignValueOnly(fGenFit->constPars());
2033 nllVar->fFuncVars->assignValueOnly(fGenFit->floatParsFinal());
2035 nllVar->get()->SetName(
2036 TString::Format(
"%s/%s_%s", nllVar->get()->GetName(), fGenFit->GetName(), (isExpected) ?
"asimov" :
"toys"));
2038 nllVar->get()->SetName(
TString::Format(
"%s/%s", nllVar->get()->GetName(),
fData.first->GetName()));
2040 }
else if (!std::isnan(fAltVal())) {
2045 _poi->
setVal(_poi->getStringAttribute(
"initVal") ?
TString(_poi->getStringAttribute(
"initVal")).
Atof()
2050 return (fUfit = nllVar->minimize());
2056 for (
auto &
c :
coll) {
2059 out +=
c->GetName();
2075 if (
auto rfit = retrieveFit(1)) {
2076 return fNull_cfit =
rfit;
2078 if (!nllVar || (
readOnly && nllVar->get() && !nllVar->get()->getAttribute(
"readOnly")))
2080 if (!nllVar->fFuncVars)
2081 nllVar->reinitialize();
2084 if (!
readOnly && isExpected && fGenFit) {
2086 bool tmp = nllVar->get()->getAttribute(
"readOnly");
2087 nllVar->get()->setAttribute(
"readOnly");
2088 auto out = cfit_null(
true);
2089 nllVar->get()->setAttribute(
"readOnly",
tmp);
2094 nllVar->setData(
data());
2097 }
else if (!nllVar->get()->getAttribute(
"readOnly")) {
2098 nllVar->setData(
fData);
2102 *nllVar->fFuncVars = fUfit->floatParsFinal();
2104 nllVar->fFuncVars->setAttribAll(
"Constant",
false);
2105 *nllVar->fFuncVars = *coords;
2106 if (nllVar->fFuncGlobs)
2107 nllVar->fFuncGlobs->setAttribAll(
"Constant",
true);
2109 nllVar->fFuncVars->find(fPOIName())
2110 ->setStringAttribute(
"altVal", (!std::isnan(fAltVal())) ?
TString::Format(
"%g", fAltVal()) :
nullptr);
2113 nllVar->get()->SetName(
2114 TString::Format(
"%s/%s_%s", nllVar->get()->GetName(), fGenFit->GetName(), (isExpected) ?
"asimov" :
"toys"));
2116 nllVar->get()->SetName(
TString::Format(
"%s/%s", nllVar->get()->GetName(),
fData.first->GetName()));
2118 nllVar->get()->setStringAttribute(
"fitresultTitle",
collectionContents(poi()).c_str());
2119 return (fNull_cfit = nllVar->minimize());
2130 return fLbound_cfit;
2131 if (
auto rfit = retrieveFit(6)) {
2132 return fLbound_cfit =
rfit;
2134 if (!nllVar || (
readOnly && nllVar->get() && !nllVar->get()->getAttribute(
"readOnly")))
2136 if (!nllVar->fFuncVars)
2137 nllVar->reinitialize();
2140 if (!
readOnly && isExpected && fGenFit) {
2142 bool tmp = nllVar->get()->getAttribute(
"readOnly");
2143 nllVar->get()->setAttribute(
"readOnly");
2144 auto out = cfit_lbound(
true);
2145 nllVar->get()->setAttribute(
"readOnly",
tmp);
2150 nllVar->setData(
data());
2153 }
else if (!nllVar->get()->getAttribute(
"readOnly")) {
2154 nllVar->setData(
fData);
2158 *nllVar->fFuncVars = fUfit->floatParsFinal();
2160 nllVar->fFuncVars->setAttribAll(
"Constant",
false);
2161 *nllVar->fFuncVars = *coords;
2163 if (nllVar->fFuncGlobs)
2164 nllVar->fFuncGlobs->setAttribAll(
"Constant",
true);
2166 nllVar->fFuncVars->find(fPOIName())
2167 ->setStringAttribute(
"altVal", (!std::isnan(fAltVal())) ?
TString::Format(
"%g", fAltVal()) :
nullptr);
2170 nllVar->get()->SetName(
2171 TString::Format(
"%s/%s_%s", nllVar->get()->GetName(), fGenFit->GetName(), (isExpected) ?
"asimov" :
"toys"));
2173 nllVar->get()->SetName(
TString::Format(
"%s/%s", nllVar->get()->GetName(),
fData.first->GetName()));
2175 nllVar->get()->setStringAttribute(
2177 collectionContents(*std::unique_ptr<RooAbsCollection>(nllVar->fFuncVars->selectCommon(poi()))).c_str());
2178 return (fLbound_cfit = nllVar->minimize());
2183 if (std::isnan(fAltVal()))
2187 if (
auto rfit = retrieveFit(2)) {
2188 return fAlt_cfit =
rfit;
2190 if (!nllVar || (
readOnly && nllVar->get() && !nllVar->get()->getAttribute(
"readOnly")))
2192 if (!nllVar->fFuncVars)
2193 nllVar->reinitialize();
2196 if (!
readOnly && isExpected && fGenFit) {
2198 bool tmp = nllVar->get()->getAttribute(
"readOnly");
2199 nllVar->get()->setAttribute(
"readOnly");
2200 auto out = cfit_alt(
true);
2201 nllVar->get()->setAttribute(
"readOnly",
tmp);
2206 nllVar->setData(
data());
2209 }
else if (!nllVar->get()->getAttribute(
"readOnly")) {
2210 nllVar->setData(
fData);
2214 *nllVar->fFuncVars = fUfit->floatParsFinal();
2216 nllVar->fFuncVars->setAttribAll(
"Constant",
false);
2217 *nllVar->fFuncVars = *coords;
2218 if (nllVar->fFuncGlobs)
2219 nllVar->fFuncGlobs->setAttribAll(
"Constant",
true);
2220 *nllVar->fFuncVars = alt_poi();
2222 nllVar->get()->SetName(
2223 TString::Format(
"%s/%s_%s", nllVar->get()->GetName(), fGenFit->GetName(), (isExpected) ?
"asimov" :
"toys"));
2225 nllVar->get()->SetName(
TString::Format(
"%s/%s", nllVar->get()->GetName(),
fData.first->GetName()));
2227 nllVar->get()->setStringAttribute(
"fitresultTitle",
collectionContents(alt_poi()).c_str());
2228 return (fAlt_cfit = nllVar->minimize());
2237 return std::pair<double, double>(std::numeric_limits<double>::quiet_NaN(), 0);
2241 return std::pair<double, double>(std::abs(fNullVal() - fAltVal()) / sqrt(out.first),
2242 out.second * 0.5 * std::abs(fNullVal() - fAltVal()) /
2243 (out.first * sqrt(out.first)));
2249 if (std::isnan(
_ts.first))
2252 return std::pair<double, double>(1, 0);
2259 return std::pair(0.5, std::numeric_limits<double>::infinity());
2269 if (std::isnan(std::get<1>(
toy))) {
2272 bool res = std::get<1>(
toy) >=
_ts.first;
2273 if (std::get<2>(
toy) != 1) {
2280 if (std::get<1>(
toy) >=
_ts.first -
_ts.second)
2282 if (std::get<1>(
toy) >=
_ts.first -
_ts.second)
2304 return pX_toys(
false,
nSigma);
2309 if (!std::isnan(
nSigma)) {
2312 return pX_toys(
true,
nSigma);
2323 auto _cfit = cfit_null();
2326 if (!nllVar->fFuncVars)
2327 nllVar->reinitialize();
2345 if (!nllVar->fFuncVars)
2346 nllVar->reinitialize();
2358 if ((
alt && !cfit_alt()) || (!
alt && !cfit_null())) {
2359 throw std::runtime_error(
"Cannot add toys, invalid conditional fit");
2362 auto condition = [&]() {
2366 if (!std::isnan(obs.first)) {
2368 double err = obs.second;
2389 throw std::runtime_error(
"Cannot target obs p-value because ts value unavailable");
2397 Info(
"addToys",
"First generating 100 alt toys in order to determine expected ts value");
2401 throw std::runtime_error(
"Unable to determine expected ts value");
2426 auto &
toys = (
alt) ? altToys : nullToys;
2432 if (!std::isnan(
target) && !condition()) {
2440 for (
size_t i = 0; i <
nnToys; i++) {
2442 auto toy = ((
alt) ? generateAlt(seed) : generateNull(seed));
2445 toys.push_back(std::make_tuple(seed,
toy.pll().first, 1.));
2448 if (std::isnan(std::get<1>(
toys.back())))
2454 <<
TString::Format(
"Generated %d/%d %s hypothesis toys [%.2f toys/s]",
2457 if (!std::isnan(
target)) {
2461 std::cout <<
"..." << std::flush;
2464 if (!
gROOT->IsBatch()) {
2468#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 30, 00)
2469 gPad->GetCanvas()->ResetUpdated();
2482 for (
auto &t :
toys) {
2483 if (std::isnan(std::get<1>(t)))
2484 std::get<1>(t) = -std::numeric_limits<double>::infinity();
2487 [](
const decltype(nullToys)::value_type &
a,
const decltype(nullToys)::value_type &
b) ->
bool {
2488 if (std::isnan(std::get<1>(a)))
2490 if (std::isnan(std::get<1>(b)))
2492 return std::get<1>(a) < std::get<1>(b);
2494 for (
auto &t :
toys) {
2495 if (std::isinf(std::get<1>(t)))
2496 std::get<1>(t) = std::numeric_limits<double>::quiet_NaN();
2498 if (std::isnan(
target)) {
2505 }
while (condition());
2508 <<
"Finished Generating ";
2517 if (!
gROOT->IsBatch()) {
2521#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 30, 00)
2522 gPad->GetCanvas()->ResetUpdated();
2530 std::cout <<
"Warning: " <<
nans <<
" toys were bad" << std::endl;
2607 out.
nllVar = std::make_shared<xRooNLLVar>(*
this);
2612 while (pattern.NextToken()) {
2615 double val = std::numeric_limits<double>::quiet_NaN();
2616 auto i = s.
Index(
"=");
2620 if (!
cVal.IsFloat())
2621 throw std::runtime_error(
"poiValues must contain value");
2626 throw std::runtime_error(
"Cannot find poi");
2627 if (!std::isnan(val))
2636 throw std::runtime_error(
"No poi");
2641 if (!
static_cast<RooRealVar *
>(
b)->hasRange(
"physical")) {
2642 static_cast<RooRealVar *
>(
b)->setRange(
"physical", 0, std::numeric_limits<double>::infinity());
2646 auto _snap = std::unique_ptr<RooAbsCollection>(
fFuncVars->selectByAttrib(
"Constant",
true))->snapshot();
2647 _snap->setAttribAll(
"poi",
false);
2648 std::unique_ptr<RooAbsCollection> _poi(
_snap->selectByName(
poiNames));
2649 _poi->setAttribAll(
"poi",
true);
2651 for (
auto a : *_poi)
2652 a->setStringAttribute(
"altVal", nullptr);
2654 for (
auto a : *_poi)
2678xRooNLLVar::xRooHypoPoint
2684 std::unique_ptr<RooAbsCollection> _poi(
fFuncVars->selectByAttrib(
"poi",
true));
2685 if (_poi->empty()) {
2686 throw std::runtime_error(
"No POI specified in model");
2687 }
else if (_poi->size() != 1) {
2688 throw std::runtime_error(
"Multiple POI specified in model");
2702 if (!nllVar && !hypoTestResult)
2708 sOpt.ReplaceAll(
"same",
"");
2716 if (
gPad->GetNumber() == 0) {
2732 hAxis =
dynamic_cast<TH1 *
>(
pad->GetPrimitive(
".axis"));
2734 for (
auto o : *
pad->GetListOfPrimitives()) {
2742 double _min = std::numeric_limits<double>::quiet_NaN();
2743 double _max = -std::numeric_limits<double>::quiet_NaN();
2745 for (
auto &
p : nullToys) {
2746 if (std::get<2>(
p) == 0)
2748 if (std::isnan(std::get<1>(
p)))
2751 _max = std::max(std::get<1>(
p), _max);
2753 for (
auto &
p : altToys) {
2754 if (std::get<2>(
p) == 0)
2756 if (std::isnan(std::get<1>(
p)))
2759 _max = std::max(std::get<1>(
p), _max);
2762 auto obs = ts_asymp();
2763 if (!std::isnan(obs.first)) {
2764 _min = std::min(obs.first - std::abs(obs.first) * 0.1,
_min);
2765 _max = std::max(obs.first + std::abs(obs.first) * 0.1, _max);
2768 auto pNull = pNull_toys();
2769 auto pAlt = pAlt_toys();
2771 ? std::pair(std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN())
2774 ? std::pair(std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN())
2778 ? fAsimov->pll().first
2779 : std::numeric_limits<double>::quiet_NaN();
2780 if (!std::isnan(
asi) &&
asi > 0) {
2783 _max = std::max(
asi + std::abs(
asi), _max);
2788 auto _poi =
dynamic_cast<RooRealVar *
>(poi().first());
2792 auto h =
new TH1D((
isAlt) ?
"alt_toys" :
"null_toys",
"", 100,
_min, _max + (_max -
_min) * 0.01);
2793 h->SetDirectory(
nullptr);
2795 for (
auto &
p : (
isAlt) ? altToys : nullToys) {
2796 double w = std::isnan(std::get<1>(
p)) ? 0 : std::get<2>(
p);
2799 if (!std::isnan(std::get<1>(
p)))
2800 h->Fill(std::get<1>(
p),
w);
2802 if (
h->GetEntries() > 0)
2803 h->Scale(1. /
h->Integral(0,
h->GetNbinsX() + 1));
2827 h->SetMarkerSize(0);
2839 auto axis =
static_cast<TH1 *
>(
h->Clone(
".axis"));
2841 axis->SetStats(
false);
2842 axis->Reset(
"ICES");
2844 axis->SetLineWidth(0);
2846 axis->SetMinimum(1
e-7);
2847 axis->GetYaxis()->SetRangeUser(1
e-7, 10);
2848 axis->SetMaximum(
h->GetMaximum());
2850 l =
new TLegend(0.4, 0.7, 1. -
gPad->GetRightMargin(), 1. -
gPad->GetTopMargin());
2851 l->SetName(
"legend");
2853 l->SetBorderSize(0);
2856 l->ConvertNDCtoPad();
2858 for (
auto o : *
gPad->GetListOfPrimitives()) {
2865 if (
h->GetEntries() > 0) {
2868 h->Draw(
"axissame");
2871 if (
h->GetEntries() > 0) {
2874 h->Draw(
"axissame");
2882 if (fAsimov && fAsimov->fUfit && fAsimov->fNull_cfit && !std::isnan(sigma_mu().first) && !std::isnan(fAltVal())) {
2883 auto hh =
static_cast<TH1 *
>(
nullHist->Clone(
"null_asymp"));
2885 hh->SetStats(
false);
2886 hh->SetLineStyle(2);
2888 for (
int i = 1; i <=
hh->GetNbinsX(); i++) {
2891 _poi->getMin(
"physical"), _poi->getMax(
"physical")) -
2893 sigma_mu().first, _poi->getMin(
"physical"), _poi->getMax(
"physical")));
2898 hh->SetStats(
false);
2899 hh->SetLineStyle(2);
2901 for (
int i = 1; i <=
hh->GetNbinsX(); i++) {
2904 _poi->getMin(
"physical"), _poi->getMax(
"physical")) -
2906 sigma_mu().first, _poi->getMin(
"physical"), _poi->getMax(
"physical")));
2916 auto tl =
ll.DrawLine(obs.first,
hAxis->GetMinimum(), obs.first, 0.1);
2921 l->AddEntry(
tl, label,
"l");
2924 auto pCLs = pCLs_toys();
2925 label +=
" p_{toy}=(";
2930 if (label.Length() > 0)
2931 l->AddEntry(
"", label,
"");
2933 if (!std::isnan(
pNullA.first) || !std::isnan(
pAltA.first)) {
2934 auto pCLs = pCLs_asymp();
2935 label +=
" p_{asymp}=(";
2940 if (label.Length() > 0)
2941 l->AddEntry(
"", label,
"");
2943 if (
auto ax =
dynamic_cast<TH1 *
>(
gPad->GetPrimitive(
".axis")))
2944 ax->GetYaxis()->SetRangeUser(1
e-7, 1);
2949 auto v =
dynamic_cast<RooRealVar *
>(poi().empty() ? nullptr : poi().first());
2951 if (
v &&
v->hasRange(
"physical") &&
v->getMin(
"physical") != -std::numeric_limits<double>::infinity()) {
2961 if (
v &&
v->hasRange(
"physical") &&
v->getMin(
"physical") != -std::numeric_limits<double>::infinity()) {
2971 if (
v &&
v->hasRange(
"physical") &&
v->getMin(
"physical") != -std::numeric_limits<double>::infinity()) {
2981 if (
v &&
v->hasRange(
"physical") &&
v->getMin(
"physical") != -std::numeric_limits<double>::infinity()) {
2990 return "Test Statistic";
2996 return (poi().empty()) ? nullptr : (poi().first())->GetName();
3001 return (
first_poi ==
nullptr) ? std::numeric_limits<double>::quiet_NaN() :
first_poi->getVal();
3007 return (
first_poi ==
nullptr) ? std::numeric_limits<double>::quiet_NaN() :
first_poi->getVal();
3014 throw std::runtime_error(
"HypoPoint has no POI, cannot set null value");
3022 throw std::runtime_error(
"HypoPoint has no POI, cannot set alt value");
3039 if (
alt_value == std::numeric_limits<double>::quiet_NaN()) {
3053 for (
auto p : out.
poi()) {
3055 dynamic_cast<RooRealVar *
>(
p)->setRange(
"physical", 0, std::numeric_limits<double>::infinity());
3056 Info(
"xRooNLLVar::hypoSpace",
"Setting physical range of %s to [0,inf]",
p->GetName());
3058 v->removeMin(
"physical");
v->removeMax(
"physical");
3059 Info(
"xRooNLLVar::hypoSpace",
"Removing physical range of %s",
p->GetName());
3075 if (!std::isnan(low) && !std::isnan(high) && !(std::isinf(low) && std::isinf(high))) {
3076 for (
auto p : out.
poi()) {
3077 dynamic_cast<RooRealVar *
>(
p)->setRange(
"scan", low, high);
3088 if (!std::isnan(low) && !std::isnan(high) && !(std::isinf(low) && std::isinf(high))) {
3089 for (
auto p :
hs.poi()) {
3090 dynamic_cast<RooRealVar *
>(
p)->setRange(
"scan", low, high);
3100 auto _poi = std::unique_ptr<RooAbsCollection>(
3101 std::unique_ptr<RooAbsCollection>(
pdf()->getVariables())->selectByAttrib(
"poi",
true));
3103 throw std::runtime_error(
"You must specify a POI for the hypoSpace");
3114 std::unique_ptr<RooAbsCollection> axes(s.
pars()->selectByName(
parName));
3116 throw std::runtime_error(
"parameter not found");
3117 axes->setAttribAll(
"axis",
true);
3122 s.
fNlls[s.
fPdfs.begin()->second] = std::make_shared<xRooNLLVar>(*
this);
3125 for (
auto poi : s.
poi()) {
3134 if (hypoTestResult) {
3135 return *hypoTestResult;
3143 if (nllVar && !nllVar->get()->getAttribute(
"readOnly")) {
3145 nllVar->get()->setAttribute(
"readOnly");
3156 {
"OneSidedPositive", 1},
3157 {
"OneSidedNegative", 2},
3158 {
"OneSidedAbsolute", 3},
3162 fitMeta.addClone(ufit()->floatParsFinal());
3164 fitMeta.setCatIndex(
"pllType",
int(fPllType));
3172 {
"asimov_cfit_null", 4},
3174 {
"cfit_lbound", 6}}));
3184 for (
int i = 0; i < 7; i++) {
3185 std::shared_ptr<const RooFitResult> fit;
3187 case 0: fit = ufit();
break;
3188 case 1: fit = cfit_null();
break;
3189 case 2: fit = cfit_alt();
break;
3190 case 3: fit = asimov() ? asimov()->ufit(
true) :
nullptr;
break;
3191 case 4: fit = asimov() ? asimov()->cfit_null(
true) :
nullptr;
break;
3192 case 5: fit = fGenFit;
break;
3193 case 6: fit = cfit_lbound();
break;
3198 fitDetails.getCatLabel(
"type"), fit->GetName()));
3200 fitDetails.setRealValue(
"status", fit->status());
3201 fitDetails.setRealValue(
"minNll", fit->minNll());
3203 fitDetails.setRealValue(
"covQual", fit->covQual());
3219 if (!nullToys.empty()) {
3221 std::vector<double> values;
3222 std::vector<double> weights;
3223 values.reserve(nullToys.size());
3224 weights.reserve(nullToys.size());
3226 for (
auto &t : nullToys) {
3227 values.push_back(std::get<1>(t));
3228 weights.push_back(std::get<2>(t));
3234#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
3237 pNull_toys().second;
3241 pNull_toys().second);
3244#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
3254 if (!altToys.empty()) {
3255 std::vector<double> values;
3256 std::vector<double> weights;
3257 values.reserve(altToys.size());
3258 weights.reserve(altToys.size());
3266 for (
auto &t : altToys) {
3267 values.push_back(std::get<1>(t));
3268 weights.push_back(std::get<2>(t));
3269 altDetails.setRealValue(
"seed", std::get<0>(t));
3270 altDetails.setRealValue(
"ts", std::get<1>(t));
3275#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
3282 pAlt_toys().second);
3286#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
3296 nllVar->get()->setAttribute(
"readOnly",
false);
3305 return "xValueWithError: nullptr\n";
3306 return Form(
"%f +/- %f",
v->first,
v->second);
3308std::string cling::printValue(
const std::map<std::string, xRooNLLVar::xValueWithError> *
m)
3312 std::string out =
"{\n";
3313 for (
auto [k,
v] : *
m) {
3314 out +=
"\"" + k +
"\" => " + printValue(&
v) +
"\n";
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
const char Option_t
Option string (const char)
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
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.
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 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 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 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
static char * Format(const char *format, va_list ap)
Format a string in a circular formatting buffer (using a printf style format descriptor).
char * Form(const char *fmt,...)
Formats a string in a circular formatting buffer.
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())
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)
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)
RooArgList ranknp(const char *poi, bool up=true, bool prefit=false, double approxThreshold=std::numeric_limits< double >::infinity())
xRooFitResult(const RooFitResult &fr)
xRooFitResult cfit(const char *poiValues, const char *alias=nullptr)
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 > cfit_lbound(bool readOnly=false)
std::shared_ptr< xRooNLLVar > nllVar
void Draw(Option_t *opt="") override
Default Draw method for all objects.
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())
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())
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
std::set< std::pair< std::shared_ptr< RooArgList >, std::shared_ptr< xRooNode > > > fPdfs
This xRooNLLVar object has several special methods, e.g.
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...
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 *)
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.
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.
Storage_t const & get() const
Const access to the underlying stl container.
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
virtual RooAbsArg * addClone(const RooAbsArg &var, bool silent=false)
Add a clone of the specified argument to list.
void setName(const char *name)
Abstract base class for binned and unbinned datasets.
virtual const RooArgSet * get() const
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.
bool hasRange(const char *name) const override
Check if variable has a binning with given name.
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.
Object to represent discrete states.
Named container for two doubles, two integers two object points and three string pointers that can be...
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...
static RooMsgService & instance()
Return reference to singleton instance.
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'.
Facilitates simultaneous fitting of multiple PDFs to subsets of a given dataset.
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 TArrow * DrawArrow(Double_t x1, Double_t y1, Double_t x2, Double_t y2, Float_t arrowsize=0, Option_t *option="")
Draw this arrow with new coordinates.
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.
virtual TKey * FindKeyAny(const char *) const
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.
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.
virtual void Add(TF1 *f, Double_t c1=1)
Performs the operation: y = y + c1*f(x,y) Errors are not recalculated.
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.
void SetTitle(const char *title="") override
Change (i.e.
void SetNameTitle(const char *name="", const char *title="") override
Set graph name and title.
1-D histogram with a double per channel (see TH1 documentation)
TH1 is the base class of all histogram classes in ROOT.
This class displays a legend box (TPaveText) containing several legend entries.
void Draw(Option_t *option="") override
Draw this legend with its current attributes.
Use the TLine constructor to create a simple line.
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 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 void Draw(Option_t *option="")
Default Draw method for all objects.
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.
Double_t Atof() const
Return floating-point value contained in string.
const char * Data() const
Bool_t BeginsWith(const char *s, ECaseCompare cmp=kExact) const
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
Float_t GetPadRightMargin() const
Float_t GetPadLeftMargin() const
Float_t GetPadBottomMargin() const
Float_t GetPadTopMargin() const
virtual Bool_t ProcessEvents()
Process pending events (GUI, timers, sockets).
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.
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
std::string collectionContents(const RooAbsCollection &coll)