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);
684 out.setName(
"rankings");
686 out.addClone(*
get()->floatParsFinal().find(
n.c_str()));
687 auto vv =
static_cast<RooRealVar *
>(out.at(out.size() - 1));
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")) {
716 return xRooFitResult(std::make_shared<xRooNode>(out,
fPdf), std::make_shared<xRooNLLVar>(*
this));
738 if (
size_t(_data->numEntries()) <=
entry)
741 *std::unique_ptr<RooAbsCollection>(_pdf->getObservables(_data)) = *_data->get(
entry);
744 return -_data->weight() * _pdf->getLogVal(_data->get());
749 std::set<std::string> out;
760 c->
get<
RooAbsArg>()->treeNodeServerList(&nodes,
nullptr,
true,
false);
762 for (
auto a : nodes) {
763 if (
a->InheritsFrom(
"RooRealSumPdf") &&
781 pdf()->treeNodeServerList(&nodes,
nullptr,
true,
false);
782 for (
auto a : nodes) {
783 if (
a->InheritsFrom(
"RooRealSumPdf") &&
799 if (
size_t(_data->numEntries()) <=
entry)
801 auto _pdf =
pdf().get();
802 std::unique_ptr<RooAbsCollection>
_robs(_pdf->getObservables(_data->get()));
805 _pdf = s->getPdf(s->indexCat().getCurrentLabel());
808 for (
auto o : *
_robs) {
812 std::unique_ptr<std::list<double>> bins(
813 _pdf->binBoundaries(*
a, -std::numeric_limits<double>::infinity(), std::numeric_limits<double>::infinity()));
815 double lowEdge = -std::numeric_limits<double>::infinity();
816 for (
auto b : *bins) {
817 if (
b >
a->getVal()) {
844 for (
auto c :
cTerm->list()) {
845 if (std::string(
c->ClassName()) ==
"RooAbsPdf" ||
846 std::string(
c->ClassName()).find(
"RooNormalizedPdf") != std::string::npos) {
856 gaus->getMean().GetName()));
875 std::unique_ptr<RooAbsCollection>(
pars()->selectByAttrib(
"Constant",
false))->
size();
889 std::unique_ptr<RooAbsCollection>
_floats(
pars()->selectByAttrib(
"Constant",
false));
932 return std::numeric_limits<double>::quiet_NaN();
946 double out = _data->sumEntries();
947 for (
int i = 0; i < _data->numEntries(); i++) {
949 double w = _data->weight();
952 out -=
w * std::log(
w);
965 throw std::runtime_error(
"Cannot determine category of RooSimultaneous pdf");
976 auto out = std::shared_ptr<RooArgSet>(
get()->getVariables());
978 out->remove(*
fGlobs,
true,
true);
1003 std::unique_ptr<RooAbsCollection>
funcVars(
get()->getVariables());
1006 for (
auto &
coord : coords) {
1008 throw std::runtime_error(
"Invalid coordinate");
1010 for (
size_t i = 0; i <
coord.size(); i++) {
1033 if (
sOpt ==
"sensitivity") {
1038 if (
sOpt ==
"floating") {
1040 auto floats = std::unique_ptr<RooAbsCollection>(
_pars->selectByAttrib(
"Constant",
false));
1063 if (
auto a =
_pars->find(s);
a)
1067 if (vars.
size() == 1) {
1073 bad->SetMarkerStyle(5);
1075 bool normRange =
false;
1083 out->SetName(
get()->GetName());
1089 double step = (
v->getMax() -
v->getMin()) / 100;
1090 double init =
v->getVal();
1093 auto currTime = std::chrono::steady_clock::now();
1094 while (out->GetN() < 100 && (low >
v->getMin() ||
high < v->getMax())) {
1095 if (out->GetN() == 0) {
1096 out->SetPoint(out->GetN(), low, 0);
1105 if (low >
v->getMin()) {
1107 auto _v =
func()->getVal();
1108 if (std::isnan(
_v) || std::isinf(
_v)) {
1109 if (
bad->GetN() == 0)
1111 bad->SetPoint(
bad->GetN(), low, out->GetPointY(0));
1113 out->SetPoint(out->GetN(), low,
_v -
initVal);
1119 auto _v =
func()->getVal();
1120 if (std::isnan(
_v) || std::isinf(
_v)) {
1121 if (
bad->GetN() == 0)
1123 bad->SetPoint(
bad->GetN(), high, out->GetPointY(0));
1125 out->SetPoint(out->GetN(), high,
_v -
initVal);
1132 if (std::chrono::steady_clock::now() -
currTime > std::chrono::seconds(1)) {
1133 currTime = std::chrono::steady_clock::now();
1142#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 30, 00)
1143 gPad->GetCanvas()->ResetUpdated();
1148 Error(
"Draw",
"Name a parameter to scan over: Draw(<name>) , choose from: %s",
1149 _pars->empty() ?
"" :
_pars->contentsString().c_str());
1163 return setData(std::dynamic_pointer_cast<RooAbsData>(
data.fComp),
1164 std::shared_ptr<const RooAbsCollection>(
data.globs().argList().snapshot()));
1167bool xRooNLLVar::setData(
const std::pair<std::shared_ptr<RooAbsData>, std::shared_ptr<const RooAbsCollection>> &_data)
1170 if (
fData == _data.first &&
fGlobs == _data.second)
1175 auto _dglobs = (_data.second) ? _data.second
1176 : std::shared_ptr<const RooAbsCollection>(_data.first->getGlobalObservables(),
1183 throw std::runtime_error(
"Missing globs");
1194 rC.remove(*std::unique_ptr<RooAbsCollection>(
rC.selectCommon(*
_actualGlobs)));
1200 throw std::runtime_error(
TString::Format(
"globs mismatch: adding %s removing %s",
r.Data(),
l.Data()));
1205 if (!std::shared_ptr<RooAbsReal>::get()) {
1206 fData = _data.first;
1219 fFuncVars->setAttribAll(
"Constant",
false);
1223 fData = _data.first;
1244 fData = _data.first;
1246 }
catch (std::runtime_error &) {
1251 fFuncVars->setAttribAll(
"Constant",
false);
1255 fData = _data.first;
1259 throw std::runtime_error(
"Unable to setData");
1266 }
else if (
auto f = std::unique_ptr<RooAbsCollection>(
fConstVars->selectByAttrib(
"Constant",
false)); !
f->empty()) {
1295 }
else if (
strcmp(opt.
GetName(),
"StrategySequence") == 0) {
1319 if (std::shared_ptr<RooAbsReal>::get()) {
1392 return fData->sumEntries() * log(1.0 * (s->servers().size() - 1));
1404 for (
int i = 0; i <
fData->numEntries(); i++) {
1414 auto _func =
func();
1417 for (
auto s : _func->servers()) {
1421 for (
auto s2 : s->servers()) {
1439 sWhat.ReplaceAll(
" =",
"=").ReplaceAll(
"= ",
"=");
1449 : std::numeric_limits<double>::quiet_NaN();
1462 if (getVal(
sWhat +
" readonly").second != 0) {
1463 if (
sWhat.Contains(
"toys=")) {
1472 if (nullToys.size() <
nToys) {
1473 addNullToys(
nToys - nullToys.size());
1476 addAltToys(
nToysAlt - altToys.size());
1480 addCLsToys(100, 0, 0.05,
nSigma);
1482 throw std::runtime_error(
"Auto-generating toys for anything other than CLs not yet supported, please "
1483 "specify number of toys with 'toys=N' ");
1491 if (
rr && var && var->get()) {
1492 _readOnly = var->get()->getAttribute(
"readOnly");
1493 var->get()->setAttribute(
"readOnly",
rr);
1501 var->get()->setAttribute(
"readOnly",
_readOnly);
1507 std::shared_ptr<xRooNLLVar> &var;
1521 throw std::runtime_error(std::string(
"Unknown: ") +
what);
1528 out.add(*std::unique_ptr<RooAbsCollection>(coords->selectByAttrib(
"poi",
true)));
1535 out.setName(
"alt_poi");
1536 out.addClone(*std::unique_ptr<RooAbsCollection>(coords->selectByAttrib(
"poi",
true)));
1537 for (
auto a : out) {
1541 if (
auto s =
a->getStringAttribute(
"altVal"); s &&
strlen(s)) {
1544 v->setVal(std::numeric_limits<double>::quiet_NaN());
1554 if (me.ufit(
true) && !allowedStatusCodes.count(me.ufit(
true)->status()))
1556 if (me.cfit_null(
true) && !allowedStatusCodes.count(me.cfit_null(
true)->status()))
1558 if (me.cfit_alt(
true) && !allowedStatusCodes.count(me.cfit_alt(
true)->status()))
1560 if (me.asimov(
true))
1561 out += me.asimov(
true)->status() << 3;
1569 std::cout <<
"POI: " << _poi.contentsString() <<
" , null: ";
1571 for (
auto a : _poi) {
1580 std::cout <<
" , alt: ";
1591 if (!std::isnan(
v->getVal()))
1594 std::cout <<
" , pllType: " << fPllType << std::endl;
1597 std::cout <<
" obs ts: " << obs_ts <<
" +/- " << obs_ts_err << std::endl;
1600 std::cout <<
" - ufit: ";
1602 std::cout << fUfit->GetName() <<
" " << fUfit->minNll() <<
" (status=" << fUfit->status() <<
") (";
1604 for (
auto a : _poi) {
1605 auto v =
dynamic_cast<RooRealVar *
>(fUfit->floatParsFinal().find(
a->GetName()));
1610 std::cout <<
v->
GetName() <<
"_hat: " <<
v->getVal() <<
" +/- " <<
v->getError();
1613 std::cout <<
")" << std::endl;
1615 std::cout <<
"Not calculated" << std::endl;
1617 std::cout <<
" - cfit_null: ";
1619 std::cout << fNull_cfit->GetName() <<
" " << fNull_cfit->minNll() <<
" (status=" << fNull_cfit->status() <<
")";
1621 std::cout <<
"Not calculated";
1624 std::cout << std::endl <<
" - cfit_alt: ";
1626 std::cout << fAlt_cfit->GetName() <<
" " << fAlt_cfit->minNll() <<
" (status=" << fAlt_cfit->status() <<
")"
1629 std::cout <<
"Not calculated" << std::endl;
1631 std::cout <<
" sigma_mu: ";
1633 if (!fAsimov || !fAsimov->fUfit || !fAsimov->fNull_cfit) {
1634 std::cout <<
"Not calculated";
1636 std::cout << const_cast<xRooHypoPoint *>(
this)->
sigma_mu().first <<
" +/- "
1640 std::cout << std::endl;
1641 std::cout <<
" - asimov ufit: ";
1642 if (fAsimov->fUfit) {
1643 std::cout << fAsimov->
fUfit->GetName() <<
" " << fAsimov->fUfit->minNll()
1644 <<
" (status=" << fAsimov->fUfit->status() <<
")";
1646 std::cout <<
"Not calculated";
1648 std::cout << std::endl <<
" - asimov cfit_null: ";
1649 if (fAsimov->fNull_cfit) {
1650 std::cout << fAsimov->fNull_cfit->GetName() <<
" " << fAsimov->fNull_cfit->minNll()
1651 <<
" (status=" << fAsimov->fNull_cfit->status() <<
")";
1653 std::cout <<
"Not calculated";
1656 std::cout << std::endl;
1658 std::cout << std::endl;
1661 std::cout <<
" - cfit_lbound: " << fLbound_cfit->GetName() <<
" " << fLbound_cfit->minNll()
1662 <<
" (status=" << fLbound_cfit->status() <<
")" << std::endl;
1665 std::cout <<
" - gfit: " << fGenFit->GetName() << std::endl;
1666 if (!nullToys.empty() || !altToys.empty()) {
1667 std::cout <<
" * null toys: " << nullToys.size();
1669 while (
firstToy < nullToys.size() && std::isnan(std::get<1>(nullToys[
firstToy])))
1672 std::cout <<
" [ of which " <<
firstToy <<
" are bad]";
1673 std::cout <<
" , alt toys: " << altToys.size();
1675 while (
firstToy < altToys.size() && std::isnan(std::get<1>(altToys[
firstToy])))
1678 std::cout <<
" [ of which " <<
firstToy <<
" are bad]";
1679 std::cout << std::endl;
1687 auto var =
dynamic_cast<RooRealVar *
>(ufit()->floatParsFinal().find(fPOIName()));
1691 throw std::runtime_error(
TString::Format(
"Cannot find POI: %s", fPOIName()));
1694 throw std::runtime_error(
"Unconditional fit unavailable");
1701 if (fGenFit && isExpected) {
1709 : hypoTestResult(
htr)
1725 if (
toys->getGlobalObservables()) {
1726 coords = std::shared_ptr<RooAbsCollection>(
toys->getGlobalObservables()->snapshot());
1728 for (
int i = 0; i <
toys->numEntries(); i++) {
1731 std::make_tuple(
int(
toy->getRealValue(
"seed")),
toy->getRealValue(
"ts"),
toys->weight()));
1736 for (
int i = 0; i <
toys->numEntries(); i++) {
1739 std::make_tuple(
int(
toy->getRealValue(
"seed")),
toy->getRealValue(
"ts"),
toys->weight()));
1750 if (!fAsimov && (nllVar || hypoTestResult)) {
1751 auto theFit = (!
fData.first && fGenFit && !isExpected)
1756 if (!
theFit || allowedStatusCodes.find(
theFit->status()) == allowedStatusCodes.
end())
1758 fAsimov = std::make_shared<xRooHypoPoint>(*
this);
1759 fAsimov->coords.reset(fAsimov->coords->snapshot());
1760 fAsimov->hypoTestResult.reset();
1762 for (
auto p : fAsimov->poi()) {
1765 v->deleteSharedProperties();
1769 fAsimov->nullToys.clear();
1770 fAsimov->altToys.clear();
1771 fAsimov->fUfit = retrieveFit(3);
1772 fAsimov->fNull_cfit = retrieveFit(4);
1773 fAsimov->fAlt_cfit.reset();
1775 std::make_pair(
nullptr,
nullptr);
1776 fAsimov->fGenFit =
theFit;
1777 fAsimov->isExpected =
true;
1786 return std::pair<double, double>(1, 0);
1789 return std::pair<double, double>(std::numeric_limits<double>::quiet_NaN(), 0);
1799 return std::pair(
nom, std::max(std::abs(
up -
nom), std::abs(
down -
nom)));
1805 return std::pair<double, double>(1, 0);
1808 return std::pair<double, double>(std::numeric_limits<double>::quiet_NaN(), 0);
1819 return std::pair(
nom, std::max(std::abs(
up -
nom), std::abs(
down -
nom)));
1824 if (fNullVal() == fAltVal())
1825 return std::pair<double, double>(1, 0);
1828 return std::pair<double, double>(1, 0);
1831 return std::pair<double, double>(std::numeric_limits<double>::quiet_NaN(), 0);
1856 return std::pair(
nom, std::max(std::abs(
up -
nom), std::abs(
down -
nom)));
1861 if (std::isnan(
nSigma)) {
1868 return std::pair<double, double>(std::numeric_limits<double>::quiet_NaN(), 0);
1877 return std::pair<double, double>(
nom, std::max(std::abs(
nom -
up), std::abs(
nom -
down)));
1882 if (std::isnan(
nSigma)) {
1887 while (
firstToy < altToys.size() && std::isnan(std::get<1>(altToys[
firstToy])))
1890 return std::pair(std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN());
1893 return std::pair(std::get<1>(altToys[
targetIdx]), (std::get<1>(altToys[std::min(
int(altToys.size()),
targetIdx)]) -
1894 std::get<1>(altToys[std::max(0,
targetIdx)])) /
1903 return std::pair<double, double>(hypoTestResult->GetTestStatisticData(), 0);
1904 return std::pair<double, double>(std::numeric_limits<double>::quiet_NaN(), 0);
1906 if (allowedStatusCodes.find(
_ufit->status()) == allowedStatusCodes.end()) {
1907 return std::pair<double, double>(std::numeric_limits<double>::quiet_NaN(), 0);
1911 mu_hat().getVal() <
_first_poi->getMin(
"physical")) {
1915 return std::pair<double, double>(std::numeric_limits<double>::quiet_NaN(), 0);
1922 return std::pair<double, double>(0, 0);
1925 return std::pair<double, double>(std::numeric_limits<double>::quiet_NaN(), 0);
1933 return std::pair<double, double>(2. * cFactor *
diff,
1934 2. * cFactor * sqrt(pow(cfit_null(
readOnly)->edm(), 2) + pow(
_ufit->edm(), 2)));
1940 if (!hypoTestResult)
1943 if (
auto fits = hypoTestResult->GetFitInfo()) {
1944 for (
int i = 0; i <
fits->numEntries(); i++) {
1945 auto fit =
fits->get(i);
1946 if (fit->getCatIndex(
"type") !=
type)
1950 fits->getGlobalObservables()->getStringValue(
TString::Format(
"%s.name", fit->getCatLabel(
"type")));
1953 for (
auto file : *
gROOT->GetListOfFiles()) {
1957 k->GetMotherDir()->GetList()
1971 rfit->setStatus(fit->getRealValue(
"status"));
1972 rfit->setMinNLL(fit->getRealValue(
"minNll"));
1973 rfit->setEDM(fit->getRealValue(
"edm"));
1975 std::unique_ptr<RooAbsCollection>
par_hats(
1976 hypoTestResult->GetFitInfo()->getGlobalObservables()->selectByName(coords->contentsString().c_str()));
1977 par_hats->setName(
"floatParsFinal");
1985 rfit->setCovarianceMatrix(
cov);
1986 rfit->setCovQual(fit->getRealValue(
"covQual"));
1997 if (
auto rfit = retrieveFit(0)) {
1998 return fUfit =
rfit;
2000 if (!nllVar || (
readOnly && nllVar->get() && !nllVar->get()->getAttribute(
"readOnly")))
2002 if (!nllVar->fFuncVars)
2003 nllVar->reinitialize();
2006 if (!
readOnly && isExpected && fGenFit) {
2008 bool tmp = nllVar->get()->getAttribute(
"readOnly");
2009 nllVar->get()->setAttribute(
"readOnly");
2010 auto out = ufit(
true);
2011 nllVar->get()->setAttribute(
"readOnly", tmp);
2016 nllVar->setData(
data());
2019 }
else if (!nllVar->get()->getAttribute(
"readOnly")) {
2020 nllVar->setData(
fData);
2022 nllVar->fFuncVars->setAttribAll(
"Constant",
false);
2023 *nllVar->fFuncVars = *coords;
2024 if (nllVar->fFuncGlobs)
2025 nllVar->fFuncGlobs->setAttribAll(
"Constant",
true);
2026 std::unique_ptr<RooAbsCollection>(nllVar->fFuncVars->selectCommon(poi()))
2027 ->setAttribAll(
"Constant",
false);
2030 nllVar->fFuncVars->assignValueOnly(fGenFit->constPars());
2031 nllVar->fFuncVars->assignValueOnly(fGenFit->floatParsFinal());
2033 nllVar->get()->SetName(
2034 TString::Format(
"%s/%s_%s", nllVar->get()->GetName(), fGenFit->GetName(), (isExpected) ?
"asimov" :
"toys"));
2036 nllVar->get()->SetName(
TString::Format(
"%s/%s", nllVar->get()->GetName(),
fData.first->GetName()));
2038 }
else if (!std::isnan(fAltVal())) {
2043 _poi->
setVal(_poi->getStringAttribute(
"initVal") ?
TString(_poi->getStringAttribute(
"initVal")).
Atof()
2048 return (fUfit = nllVar->minimize());
2054 for (
auto &
c :
coll) {
2057 out +=
c->GetName();
2073 if (
auto rfit = retrieveFit(1)) {
2074 return fNull_cfit =
rfit;
2076 if (!nllVar || (
readOnly && nllVar->get() && !nllVar->get()->getAttribute(
"readOnly")))
2078 if (!nllVar->fFuncVars)
2079 nllVar->reinitialize();
2082 if (!
readOnly && isExpected && fGenFit) {
2084 bool tmp = nllVar->get()->getAttribute(
"readOnly");
2085 nllVar->get()->setAttribute(
"readOnly");
2086 auto out = cfit_null(
true);
2087 nllVar->get()->setAttribute(
"readOnly", tmp);
2092 nllVar->setData(
data());
2095 }
else if (!nllVar->get()->getAttribute(
"readOnly")) {
2096 nllVar->setData(
fData);
2100 *nllVar->fFuncVars = fUfit->floatParsFinal();
2102 nllVar->fFuncVars->setAttribAll(
"Constant",
false);
2103 *nllVar->fFuncVars = *coords;
2104 if (nllVar->fFuncGlobs)
2105 nllVar->fFuncGlobs->setAttribAll(
"Constant",
true);
2107 nllVar->fFuncVars->find(fPOIName())
2108 ->setStringAttribute(
"altVal", (!std::isnan(fAltVal())) ?
TString::Format(
"%g", fAltVal()) :
nullptr);
2111 nllVar->get()->SetName(
2112 TString::Format(
"%s/%s_%s", nllVar->get()->GetName(), fGenFit->GetName(), (isExpected) ?
"asimov" :
"toys"));
2114 nllVar->get()->SetName(
TString::Format(
"%s/%s", nllVar->get()->GetName(),
fData.first->GetName()));
2116 nllVar->get()->setStringAttribute(
"fitresultTitle",
collectionContents(poi()).c_str());
2117 return (fNull_cfit = nllVar->minimize());
2128 return fLbound_cfit;
2129 if (
auto rfit = retrieveFit(6)) {
2130 return fLbound_cfit =
rfit;
2132 if (!nllVar || (
readOnly && nllVar->get() && !nllVar->get()->getAttribute(
"readOnly")))
2134 if (!nllVar->fFuncVars)
2135 nllVar->reinitialize();
2138 if (!
readOnly && isExpected && fGenFit) {
2140 bool tmp = nllVar->get()->getAttribute(
"readOnly");
2141 nllVar->get()->setAttribute(
"readOnly");
2142 auto out = cfit_lbound(
true);
2143 nllVar->get()->setAttribute(
"readOnly", tmp);
2148 nllVar->setData(
data());
2151 }
else if (!nllVar->get()->getAttribute(
"readOnly")) {
2152 nllVar->setData(
fData);
2156 *nllVar->fFuncVars = fUfit->floatParsFinal();
2158 nllVar->fFuncVars->setAttribAll(
"Constant",
false);
2159 *nllVar->fFuncVars = *coords;
2161 if (nllVar->fFuncGlobs)
2162 nllVar->fFuncGlobs->setAttribAll(
"Constant",
true);
2164 nllVar->fFuncVars->find(fPOIName())
2165 ->setStringAttribute(
"altVal", (!std::isnan(fAltVal())) ?
TString::Format(
"%g", fAltVal()) :
nullptr);
2168 nllVar->get()->SetName(
2169 TString::Format(
"%s/%s_%s", nllVar->get()->GetName(), fGenFit->GetName(), (isExpected) ?
"asimov" :
"toys"));
2171 nllVar->get()->SetName(
TString::Format(
"%s/%s", nllVar->get()->GetName(),
fData.first->GetName()));
2173 nllVar->get()->setStringAttribute(
2175 collectionContents(*std::unique_ptr<RooAbsCollection>(nllVar->fFuncVars->selectCommon(poi()))).c_str());
2176 return (fLbound_cfit = nllVar->minimize());
2181 if (std::isnan(fAltVal()))
2185 if (
auto rfit = retrieveFit(2)) {
2186 return fAlt_cfit =
rfit;
2188 if (!nllVar || (
readOnly && nllVar->get() && !nllVar->get()->getAttribute(
"readOnly")))
2190 if (!nllVar->fFuncVars)
2191 nllVar->reinitialize();
2194 if (!
readOnly && isExpected && fGenFit) {
2196 bool tmp = nllVar->get()->getAttribute(
"readOnly");
2197 nllVar->get()->setAttribute(
"readOnly");
2198 auto out = cfit_alt(
true);
2199 nllVar->get()->setAttribute(
"readOnly", tmp);
2204 nllVar->setData(
data());
2207 }
else if (!nllVar->get()->getAttribute(
"readOnly")) {
2208 nllVar->setData(
fData);
2212 *nllVar->fFuncVars = fUfit->floatParsFinal();
2214 nllVar->fFuncVars->setAttribAll(
"Constant",
false);
2215 *nllVar->fFuncVars = *coords;
2216 if (nllVar->fFuncGlobs)
2217 nllVar->fFuncGlobs->setAttribAll(
"Constant",
true);
2218 *nllVar->fFuncVars = alt_poi();
2220 nllVar->get()->SetName(
2221 TString::Format(
"%s/%s_%s", nllVar->get()->GetName(), fGenFit->GetName(), (isExpected) ?
"asimov" :
"toys"));
2223 nllVar->get()->SetName(
TString::Format(
"%s/%s", nllVar->get()->GetName(),
fData.first->GetName()));
2225 nllVar->get()->setStringAttribute(
"fitresultTitle",
collectionContents(alt_poi()).c_str());
2226 return (fAlt_cfit = nllVar->minimize());
2235 return std::pair<double, double>(std::numeric_limits<double>::quiet_NaN(), 0);
2239 return std::pair<double, double>(std::abs(fNullVal() - fAltVal()) / sqrt(out.first),
2240 out.second * 0.5 * std::abs(fNullVal() - fAltVal()) /
2241 (out.first * sqrt(out.first)));
2247 if (std::isnan(
_ts.first))
2250 return std::pair<double, double>(1, 0);
2257 return std::pair(0.5, std::numeric_limits<double>::infinity());
2267 if (std::isnan(std::get<1>(
toy))) {
2270 bool res = std::get<1>(
toy) >=
_ts.first;
2271 if (std::get<2>(
toy) != 1) {
2278 if (std::get<1>(
toy) >=
_ts.first -
_ts.second)
2280 if (std::get<1>(
toy) >=
_ts.first -
_ts.second)
2302 return pX_toys(
false,
nSigma);
2307 if (!std::isnan(
nSigma)) {
2310 return pX_toys(
true,
nSigma);
2316 out.coords = coords;
2317 out.fPllType = fPllType;
2318 out.nllVar = nllVar;
2321 auto _cfit = cfit_null();
2324 if (!nllVar->fFuncVars)
2325 nllVar->reinitialize();
2329 out.fGenFit =
_cfit;
2336 out.coords = coords;
2337 out.fPllType = fPllType;
2338 out.nllVar = nllVar;
2343 if (!nllVar->fFuncVars)
2344 nllVar->reinitialize();
2349 out.fGenFit = cfit_alt();
2356 if ((
alt && !cfit_alt()) || (!
alt && !cfit_null())) {
2357 throw std::runtime_error(
"Cannot add toys, invalid conditional fit");
2360 auto condition = [&]() {
2364 if (!std::isnan(obs.first)) {
2366 double err = obs.second;
2387 throw std::runtime_error(
"Cannot target obs p-value because ts value unavailable");
2395 Info(
"addToys",
"First generating 100 alt toys in order to determine expected ts value");
2399 throw std::runtime_error(
"Unable to determine expected ts value");
2424 auto &
toys = (
alt) ? altToys : nullToys;
2430 if (!std::isnan(
target) && !condition()) {
2438 for (
size_t i = 0; i <
nnToys; i++) {
2440 auto toy = ((
alt) ? generateAlt(seed) : generateNull(seed));
2443 toys.push_back(std::make_tuple(seed,
toy.pll().first, 1.));
2446 if (std::isnan(std::get<1>(
toys.back())))
2452 <<
TString::Format(
"Generated %d/%d %s hypothesis toys [%.2f toys/s]",
2455 if (!std::isnan(
target)) {
2459 std::cout <<
"..." << std::flush;
2462 if (!
gROOT->IsBatch()) {
2466#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 30, 00)
2467 gPad->GetCanvas()->ResetUpdated();
2480 for (
auto &t :
toys) {
2481 if (std::isnan(std::get<1>(t)))
2482 std::get<1>(t) = -std::numeric_limits<double>::infinity();
2485 [](
const decltype(nullToys)::value_type &
a,
const decltype(nullToys)::value_type &
b) ->
bool {
2486 if (std::isnan(std::get<1>(a)))
2488 if (std::isnan(std::get<1>(b)))
2490 return std::get<1>(a) < std::get<1>(b);
2492 for (
auto &t :
toys) {
2493 if (std::isinf(std::get<1>(t)))
2494 std::get<1>(t) = std::numeric_limits<double>::quiet_NaN();
2496 if (std::isnan(
target)) {
2503 }
while (condition());
2506 <<
"Finished Generating ";
2515 if (!
gROOT->IsBatch()) {
2519#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 30, 00)
2520 gPad->GetCanvas()->ResetUpdated();
2528 std::cout <<
"Warning: " <<
nans <<
" toys were bad" << std::endl;
2605 out.nllVar = std::make_shared<xRooNLLVar>(*
this);
2610 while (pattern.NextToken()) {
2613 double val = std::numeric_limits<double>::quiet_NaN();
2614 auto i = s.
Index(
"=");
2618 if (!
cVal.IsFloat())
2619 throw std::runtime_error(
"poiValues must contain value");
2624 throw std::runtime_error(
"Cannot find poi");
2625 if (!std::isnan(val))
2634 throw std::runtime_error(
"No poi");
2639 if (!
static_cast<RooRealVar *
>(
b)->hasRange(
"physical")) {
2640 static_cast<RooRealVar *
>(
b)->setRange(
"physical", 0, std::numeric_limits<double>::infinity());
2644 auto _snap = std::unique_ptr<RooAbsCollection>(
fFuncVars->selectByAttrib(
"Constant",
true))->snapshot();
2645 _snap->setAttribAll(
"poi",
false);
2646 std::unique_ptr<RooAbsCollection> _poi(
_snap->selectByName(
poiNames));
2647 _poi->setAttribAll(
"poi",
true);
2649 for (
auto a : *_poi)
2650 a->setStringAttribute(
"altVal", nullptr);
2652 for (
auto a : *_poi)
2671 out.fPllType = _type;
2676xRooNLLVar::xRooHypoPoint
2682 std::unique_ptr<RooAbsCollection> _poi(
fFuncVars->selectByAttrib(
"poi",
true));
2683 if (_poi->empty()) {
2684 throw std::runtime_error(
"No POI specified in model");
2685 }
else if (_poi->size() != 1) {
2686 throw std::runtime_error(
"Multiple POI specified in model");
2700 if (!nllVar && !hypoTestResult)
2706 sOpt.ReplaceAll(
"same",
"");
2714 if (
gPad->GetNumber() == 0) {
2730 hAxis =
dynamic_cast<TH1 *
>(
pad->GetPrimitive(
".axis"));
2732 for (
auto o : *
pad->GetListOfPrimitives()) {
2740 double _min = std::numeric_limits<double>::quiet_NaN();
2741 double _max = -std::numeric_limits<double>::quiet_NaN();
2743 for (
auto &
p : nullToys) {
2744 if (std::get<2>(
p) == 0)
2746 if (std::isnan(std::get<1>(
p)))
2749 _max = std::max(std::get<1>(
p), _max);
2751 for (
auto &
p : altToys) {
2752 if (std::get<2>(
p) == 0)
2754 if (std::isnan(std::get<1>(
p)))
2757 _max = std::max(std::get<1>(
p), _max);
2760 auto obs = ts_asymp();
2761 if (!std::isnan(obs.first)) {
2762 _min = std::min(obs.first - std::abs(obs.first) * 0.1,
_min);
2763 _max = std::max(obs.first + std::abs(obs.first) * 0.1, _max);
2766 auto pNull = pNull_toys();
2767 auto pAlt = pAlt_toys();
2769 ? std::pair(std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN())
2772 ? std::pair(std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN())
2776 ? fAsimov->pll().first
2777 : std::numeric_limits<double>::quiet_NaN();
2778 if (!std::isnan(
asi) &&
asi > 0) {
2781 _max = std::max(
asi + std::abs(
asi), _max);
2786 auto _poi =
dynamic_cast<RooRealVar *
>(poi().first());
2790 auto h =
new TH1D((
isAlt) ?
"alt_toys" :
"null_toys",
"", 100,
_min, _max + (_max -
_min) * 0.01);
2791 h->SetDirectory(
nullptr);
2793 for (
auto &
p : (
isAlt) ? altToys : nullToys) {
2794 double w = std::isnan(std::get<1>(
p)) ? 0 : std::get<2>(
p);
2797 if (!std::isnan(std::get<1>(
p)))
2798 h->Fill(std::get<1>(
p),
w);
2800 if (
h->GetEntries() > 0)
2801 h->Scale(1. /
h->Integral(0,
h->GetNbinsX() + 1));
2825 h->SetMarkerSize(0);
2837 auto axis =
static_cast<TH1 *
>(
h->Clone(
".axis"));
2839 axis->SetStats(
false);
2840 axis->Reset(
"ICES");
2842 axis->SetLineWidth(0);
2844 axis->SetMinimum(1
e-7);
2845 axis->GetYaxis()->SetRangeUser(1
e-7, 10);
2846 axis->SetMaximum(
h->GetMaximum());
2848 l =
new TLegend(0.4, 0.7, 1. -
gPad->GetRightMargin(), 1. -
gPad->GetTopMargin());
2849 l->SetName(
"legend");
2851 l->SetBorderSize(0);
2854 l->ConvertNDCtoPad();
2856 for (
auto o : *
gPad->GetListOfPrimitives()) {
2863 if (
h->GetEntries() > 0) {
2866 h->Draw(
"axissame");
2869 if (
h->GetEntries() > 0) {
2872 h->Draw(
"axissame");
2880 if (fAsimov && fAsimov->fUfit && fAsimov->fNull_cfit && !std::isnan(sigma_mu().first) && !std::isnan(fAltVal())) {
2881 auto hh =
static_cast<TH1 *
>(
nullHist->Clone(
"null_asymp"));
2883 hh->SetStats(
false);
2884 hh->SetLineStyle(2);
2886 for (
int i = 1; i <=
hh->GetNbinsX(); i++) {
2889 _poi->getMin(
"physical"), _poi->getMax(
"physical")) -
2891 sigma_mu().first, _poi->getMin(
"physical"), _poi->getMax(
"physical")));
2896 hh->SetStats(
false);
2897 hh->SetLineStyle(2);
2899 for (
int i = 1; i <=
hh->GetNbinsX(); i++) {
2902 _poi->getMin(
"physical"), _poi->getMax(
"physical")) -
2904 sigma_mu().first, _poi->getMin(
"physical"), _poi->getMax(
"physical")));
2914 auto tl =
ll.DrawLine(obs.first,
hAxis->GetMinimum(), obs.first, 0.1);
2919 l->AddEntry(
tl, label,
"l");
2922 auto pCLs = pCLs_toys();
2923 label +=
" p_{toy}=(";
2928 if (label.Length() > 0)
2929 l->AddEntry(
"", label,
"");
2931 if (!std::isnan(
pNullA.first) || !std::isnan(
pAltA.first)) {
2932 auto pCLs = pCLs_asymp();
2933 label +=
" p_{asymp}=(";
2938 if (label.Length() > 0)
2939 l->AddEntry(
"", label,
"");
2941 if (
auto ax =
dynamic_cast<TH1 *
>(
gPad->GetPrimitive(
".axis")))
2942 ax->GetYaxis()->SetRangeUser(1
e-7, 1);
2947 auto v =
dynamic_cast<RooRealVar *
>(poi().empty() ? nullptr : poi().first());
2949 if (
v &&
v->hasRange(
"physical") &&
v->getMin(
"physical") != -std::numeric_limits<double>::infinity()) {
2959 if (
v &&
v->hasRange(
"physical") &&
v->getMin(
"physical") != -std::numeric_limits<double>::infinity()) {
2969 if (
v &&
v->hasRange(
"physical") &&
v->getMin(
"physical") != -std::numeric_limits<double>::infinity()) {
2979 if (
v &&
v->hasRange(
"physical") &&
v->getMin(
"physical") != -std::numeric_limits<double>::infinity()) {
2988 return "Test Statistic";
2994 return (poi().empty()) ? nullptr : (poi().first())->GetName();
2999 return (
first_poi ==
nullptr) ? std::numeric_limits<double>::quiet_NaN() :
first_poi->getVal();
3005 return (
first_poi ==
nullptr) ? std::numeric_limits<double>::quiet_NaN() :
first_poi->getVal();
3012 throw std::runtime_error(
"HypoPoint has no POI, cannot set null value");
3020 throw std::runtime_error(
"HypoPoint has no POI, cannot set alt value");
3037 if (
alt_value == std::numeric_limits<double>::quiet_NaN()) {
3051 for (
auto p : out.poi()) {
3053 dynamic_cast<RooRealVar *
>(
p)->setRange(
"physical", 0, std::numeric_limits<double>::infinity());
3054 Info(
"xRooNLLVar::hypoSpace",
"Setting physical range of %s to [0,inf]",
p->GetName());
3055 }
else if (
dynamic_cast<RooRealVar *
>(
p)->hasRange(
"physical")) {
3056 dynamic_cast<RooRealVar *
>(
p)->removeRange(
"physical");
3057 Info(
"xRooNLLVar::hypoSpace",
"Removing physical range of %s",
p->GetName());
3073 if (!std::isnan(low) && !std::isnan(high) && !(std::isinf(low) && std::isinf(high))) {
3074 for (
auto p : out.poi()) {
3075 dynamic_cast<RooRealVar *
>(
p)->setRange(
"scan", low, high);
3086 if (!std::isnan(low) && !std::isnan(high) && !(std::isinf(low) && std::isinf(high))) {
3087 for (
auto p :
hs.poi()) {
3088 dynamic_cast<RooRealVar *
>(
p)->setRange(
"scan", low, high);
3098 auto _poi = std::unique_ptr<RooAbsCollection>(
3099 std::unique_ptr<RooAbsCollection>(
pdf()->getVariables())->selectByAttrib(
"poi",
true));
3101 throw std::runtime_error(
"You must specify a POI for the hypoSpace");
3112 std::unique_ptr<RooAbsCollection> axes(s.
pars()->selectByName(
parName));
3114 throw std::runtime_error(
"parameter not found");
3115 axes->setAttribAll(
"axis",
true);
3120 s.
fNlls[s.
fPdfs.begin()->second] = std::make_shared<xRooNLLVar>(*
this);
3123 for (
auto poi : s.
poi()) {
3132 if (hypoTestResult) {
3133 return *hypoTestResult;
3136 out.SetBackgroundAsAlt(
true);
3137 out.SetName(
TUUID().AsString());
3141 if (nllVar && !nllVar->get()->getAttribute(
"readOnly")) {
3143 nllVar->get()->setAttribute(
"readOnly");
3146 out.SetTestStatisticData(ts_asymp().first);
3154 {
"OneSidedPositive", 1},
3155 {
"OneSidedNegative", 2},
3156 {
"OneSidedAbsolute", 3},
3160 fitMeta.addClone(ufit()->floatParsFinal());
3162 fitMeta.setCatIndex(
"pllType",
int(fPllType));
3170 {
"asimov_cfit_null", 4},
3172 {
"cfit_lbound", 6}}));
3182 for (
int i = 0; i < 7; i++) {
3183 std::shared_ptr<const RooFitResult> fit;
3185 case 0: fit = ufit();
break;
3186 case 1: fit = cfit_null();
break;
3187 case 2: fit = cfit_alt();
break;
3188 case 3: fit = asimov() ? asimov()->ufit(
true) :
nullptr;
break;
3189 case 4: fit = asimov() ? asimov()->cfit_null(
true) :
nullptr;
break;
3190 case 5: fit = fGenFit;
break;
3191 case 6: fit = cfit_lbound();
break;
3196 fitDetails.getCatLabel(
"type"), fit->GetName()));
3198 fitDetails.setRealValue(
"status", fit->status());
3199 fitDetails.setRealValue(
"minNll", fit->minNll());
3201 fitDetails.setRealValue(
"covQual", fit->covQual());
3207 out.SetFitInfo(
fitDS);
3217 if (!nullToys.empty()) {
3219 std::vector<double> values;
3220 std::vector<double> weights;
3221 values.reserve(nullToys.size());
3222 weights.reserve(nullToys.size());
3224 for (
auto &t : nullToys) {
3225 values.push_back(std::get<1>(t));
3226 weights.push_back(std::get<2>(t));
3232#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
3233 out.fNullPValue = pNull_toys().first;
3234 out.fNullPValueError =
3235 pNull_toys().second;
3237 out.SetNullPValue(pNull_toys().first);
3238 out.SetNullPValueError(
3239 pNull_toys().second);
3242#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
3243 out.fNullPValue = pNull_asymp().first;
3244 out.fNullPValueError = pNull_asymp().second;
3246 out.SetNullPValue(pNull_asymp().first);
3247 out.SetNullPValueError(pNull_asymp().second);
3252 if (!altToys.empty()) {
3253 std::vector<double> values;
3254 std::vector<double> weights;
3255 values.reserve(altToys.size());
3256 weights.reserve(altToys.size());
3264 for (
auto &t : altToys) {
3265 values.push_back(std::get<1>(t));
3266 weights.push_back(std::get<2>(t));
3267 altDetails.setRealValue(
"seed", std::get<0>(t));
3268 altDetails.setRealValue(
"ts", std::get<1>(t));
3272 out.SetAltDetailedOutput(
altToyDS);
3273#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
3274 out.fAlternatePValue = pAlt_toys().first;
3275 out.fAlternatePValueError =
3278 out.SetAltPValue(pAlt_toys().first);
3279 out.SetAltPValueError(
3280 pAlt_toys().second);
3284#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
3285 out.fAlternatePValue = pAlt_asymp().first;
3286 out.fAlternatePValueError = pAlt_asymp().second;
3288 out.SetAltPValue(pAlt_asymp().first);
3289 out.SetAltPValueError(pAlt_asymp().second);
3294 nllVar->get()->setAttribute(
"readOnly",
false);
3303 return "xValueWithError: nullptr\n";
3304 return Form(
"%f +/- %f",
v->first,
v->second);
3306std::string cling::printValue(
const std::map<std::string, xRooNLLVar::xValueWithError> *
m)
3310 std::string out =
"{\n";
3311 for (
auto [k,
v] : *
m) {
3312 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::vector< std::tuple< int, double, double > > altToys
std::shared_ptr< const RooAbsCollection > coords
std::shared_ptr< const RooFitResult > cfit_lbound(bool readOnly=false)
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())
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
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.
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.
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).
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 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.
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.
const char * GetName() const override
Returns name of object.
const char * GetTitle() const override
Returns title of object.
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)