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));
707 const_cast<RooArgList &
>(out->constPars()).setAttribAll(
"global",
false);
709 std::unique_ptr<RooAbsCollection>(out->constPars().selectCommon(*
fGlobs))->
setAttribAll(
"global",
true);
712 if (
fOpts->find(
"GoF")) {
717 return xRooFitResult(std::make_shared<xRooNode>(out,
fPdf), std::make_shared<xRooNLLVar>(*
this));
739 if (
size_t(_data->numEntries()) <=
entry)
742 *std::unique_ptr<RooAbsCollection>(_pdf->getObservables(_data)) = *_data->get(
entry);
745 return -_data->weight() * _pdf->getLogVal(_data->get());
750 std::set<std::string> out;
761 c->
get<
RooAbsArg>()->treeNodeServerList(&nodes,
nullptr,
true,
false);
763 for (
auto a : nodes) {
764 if (
a->InheritsFrom(
"RooRealSumPdf") &&
782 pdf()->treeNodeServerList(&nodes,
nullptr,
true,
false);
783 for (
auto a : nodes) {
784 if (
a->InheritsFrom(
"RooRealSumPdf") &&
800 if (
size_t(_data->numEntries()) <=
entry)
802 auto _pdf =
pdf().get();
803 std::unique_ptr<RooAbsCollection>
_robs(_pdf->getObservables(_data->get()));
806 _pdf = s->getPdf(s->indexCat().getCurrentLabel());
809 for (
auto o : *
_robs) {
813 std::unique_ptr<std::list<double>> bins(
814 _pdf->binBoundaries(*
a, -std::numeric_limits<double>::infinity(), std::numeric_limits<double>::infinity()));
816 double lowEdge = -std::numeric_limits<double>::infinity();
817 for (
auto b : *bins) {
818 if (
b >
a->getVal()) {
845 for (
auto c :
cTerm->list()) {
846 if (std::string(
c->ClassName()) ==
"RooAbsPdf" ||
847 std::string(
c->ClassName()).find(
"RooNormalizedPdf") != std::string::npos) {
857 gaus->getMean().GetName()));
876 std::unique_ptr<RooAbsCollection>(
pars()->selectByAttrib(
"Constant",
false))->
size();
890 std::unique_ptr<RooAbsCollection>
_floats(
pars()->selectByAttrib(
"Constant",
false));
933 return std::numeric_limits<double>::quiet_NaN();
947 double out = _data->sumEntries();
948 for (
int i = 0; i < _data->numEntries(); i++) {
950 double w = _data->weight();
953 out -=
w * std::log(
w);
966 throw std::runtime_error(
"Cannot determine category of RooSimultaneous pdf");
977 auto out = std::shared_ptr<RooArgSet>(
get()->getVariables());
979 out->remove(*
fGlobs,
true,
true);
1004 std::unique_ptr<RooAbsCollection>
funcVars(
get()->getVariables());
1007 for (
auto &
coord : coords) {
1009 throw std::runtime_error(
"Invalid coordinate");
1011 for (
size_t i = 0; i <
coord.size(); i++) {
1034 if (
sOpt ==
"sensitivity") {
1039 if (
sOpt ==
"floating") {
1041 auto floats = std::unique_ptr<RooAbsCollection>(
_pars->selectByAttrib(
"Constant",
false));
1064 if (
auto a =
_pars->find(s);
a)
1068 if (vars.
size() == 1) {
1074 bad->SetMarkerStyle(5);
1076 bool normRange =
false;
1084 out->SetName(
get()->GetName());
1090 double step = (
v->getMax() -
v->getMin()) / 100;
1091 double init =
v->getVal();
1094 auto currTime = std::chrono::steady_clock::now();
1095 while (out->GetN() < 100 && (low >
v->getMin() ||
high < v->getMax())) {
1096 if (out->GetN() == 0) {
1097 out->SetPoint(out->GetN(), low, 0);
1106 if (low >
v->getMin()) {
1108 auto _v =
func()->getVal();
1109 if (std::isnan(
_v) || std::isinf(
_v)) {
1110 if (
bad->GetN() == 0)
1112 bad->SetPoint(
bad->GetN(), low, out->GetPointY(0));
1114 out->SetPoint(out->GetN(), low,
_v -
initVal);
1120 auto _v =
func()->getVal();
1121 if (std::isnan(
_v) || std::isinf(
_v)) {
1122 if (
bad->GetN() == 0)
1124 bad->SetPoint(
bad->GetN(), high, out->GetPointY(0));
1126 out->SetPoint(out->GetN(), high,
_v -
initVal);
1133 if (std::chrono::steady_clock::now() -
currTime > std::chrono::seconds(1)) {
1134 currTime = std::chrono::steady_clock::now();
1143#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 30, 00)
1144 gPad->GetCanvas()->ResetUpdated();
1149 Error(
"Draw",
"Name a parameter to scan over: Draw(<name>) , choose from: %s",
1150 _pars->empty() ?
"" :
_pars->contentsString().c_str());
1164 return setData(std::dynamic_pointer_cast<RooAbsData>(
data.fComp),
1165 std::shared_ptr<const RooAbsCollection>(
data.globs().argList().snapshot()));
1168bool xRooNLLVar::setData(
const std::pair<std::shared_ptr<RooAbsData>, std::shared_ptr<const RooAbsCollection>> &_data)
1171 if (
fData == _data.first &&
fGlobs == _data.second)
1176 auto _dglobs = (_data.second) ? _data.second
1177 : std::shared_ptr<const RooAbsCollection>(_data.first->getGlobalObservables(),
1184 throw std::runtime_error(
"Missing globs");
1195 rC.remove(*std::unique_ptr<RooAbsCollection>(
rC.selectCommon(*
_actualGlobs)));
1201 throw std::runtime_error(
TString::Format(
"globs mismatch: adding %s removing %s",
r.Data(),
l.Data()));
1206 if (!std::shared_ptr<RooAbsReal>::get()) {
1207 fData = _data.first;
1220 fFuncVars->setAttribAll(
"Constant",
false);
1224 fData = _data.first;
1245 fData = _data.first;
1247 }
catch (std::runtime_error &) {
1252 fFuncVars->setAttribAll(
"Constant",
false);
1256 fData = _data.first;
1260 throw std::runtime_error(
"Unable to setData");
1267 }
else if (
auto f = std::unique_ptr<RooAbsCollection>(
fConstVars->selectByAttrib(
"Constant",
false)); !
f->empty()) {
1296 }
else if (
strcmp(opt.
GetName(),
"StrategySequence") == 0) {
1320 if (std::shared_ptr<RooAbsReal>::get()) {
1393 return fData->sumEntries() * log(1.0 * (s->servers().size() - 1));
1405 for (
int i = 0; i <
fData->numEntries(); i++) {
1415 auto _func =
func();
1418 for (
auto s : _func->servers()) {
1422 for (
auto s2 : s->servers()) {
1440 sWhat.ReplaceAll(
" =",
"=").ReplaceAll(
"= ",
"=");
1450 : std::numeric_limits<double>::quiet_NaN();
1463 if (getVal(
sWhat +
" readonly").second != 0) {
1464 if (
sWhat.Contains(
"toys=")) {
1473 if (nullToys.size() <
nToys) {
1474 addNullToys(
nToys - nullToys.size());
1477 addAltToys(
nToysAlt - altToys.size());
1481 addCLsToys(100, 0, 0.05,
nSigma);
1483 throw std::runtime_error(
"Auto-generating toys for anything other than CLs not yet supported, please "
1484 "specify number of toys with 'toys=N' ");
1492 if (
rr && var && var->get()) {
1493 _readOnly = var->get()->getAttribute(
"readOnly");
1494 var->get()->setAttribute(
"readOnly",
rr);
1502 var->get()->setAttribute(
"readOnly",
_readOnly);
1508 std::shared_ptr<xRooNLLVar> &var;
1522 throw std::runtime_error(std::string(
"Unknown: ") +
what);
1529 out.add(*std::unique_ptr<RooAbsCollection>(coords->selectByAttrib(
"poi",
true)));
1536 out.setName(
"alt_poi");
1537 out.addClone(*std::unique_ptr<RooAbsCollection>(coords->selectByAttrib(
"poi",
true)));
1538 for (
auto a : out) {
1542 if (
auto s =
a->getStringAttribute(
"altVal"); s &&
strlen(s)) {
1545 v->setVal(std::numeric_limits<double>::quiet_NaN());
1555 if (me.ufit(
true) && !allowedStatusCodes.count(me.ufit(
true)->status()))
1557 if (me.cfit_null(
true) && !allowedStatusCodes.count(me.cfit_null(
true)->status()))
1559 if (me.cfit_alt(
true) && !allowedStatusCodes.count(me.cfit_alt(
true)->status()))
1561 if (me.asimov(
true))
1562 out += me.asimov(
true)->status() << 3;
1570 std::cout <<
"POI: " << _poi.contentsString() <<
" , null: ";
1572 for (
auto a : _poi) {
1581 std::cout <<
" , alt: ";
1592 if (!std::isnan(
v->getVal()))
1595 std::cout <<
" , pllType: " << fPllType << std::endl;
1598 std::cout <<
" obs ts: " << obs_ts <<
" +/- " << obs_ts_err << std::endl;
1601 std::cout <<
" - ufit: ";
1603 std::cout << fUfit->GetName() <<
" " << fUfit->minNll() <<
" (status=" << fUfit->status() <<
") (";
1605 for (
auto a : _poi) {
1606 auto v =
dynamic_cast<RooRealVar *
>(fUfit->floatParsFinal().find(
a->GetName()));
1611 std::cout <<
v->
GetName() <<
"_hat: " <<
v->getVal() <<
" +/- " <<
v->getError();
1614 std::cout <<
")" << std::endl;
1616 std::cout <<
"Not calculated" << std::endl;
1618 std::cout <<
" - cfit_null: ";
1620 std::cout << fNull_cfit->GetName() <<
" " << fNull_cfit->minNll() <<
" (status=" << fNull_cfit->status() <<
")";
1622 std::cout <<
"Not calculated";
1625 std::cout << std::endl <<
" - cfit_alt: ";
1627 std::cout << fAlt_cfit->GetName() <<
" " << fAlt_cfit->minNll() <<
" (status=" << fAlt_cfit->status() <<
")"
1630 std::cout <<
"Not calculated" << std::endl;
1632 std::cout <<
" sigma_mu: ";
1634 if (!fAsimov || !fAsimov->fUfit || !fAsimov->fNull_cfit) {
1635 std::cout <<
"Not calculated";
1637 std::cout << const_cast<xRooHypoPoint *>(
this)->
sigma_mu().first <<
" +/- "
1641 std::cout << std::endl;
1642 std::cout <<
" - asimov ufit: ";
1643 if (fAsimov->fUfit) {
1644 std::cout << fAsimov->
fUfit->GetName() <<
" " << fAsimov->fUfit->minNll()
1645 <<
" (status=" << fAsimov->fUfit->status() <<
")";
1647 std::cout <<
"Not calculated";
1649 std::cout << std::endl <<
" - asimov cfit_null: ";
1650 if (fAsimov->fNull_cfit) {
1651 std::cout << fAsimov->fNull_cfit->GetName() <<
" " << fAsimov->fNull_cfit->minNll()
1652 <<
" (status=" << fAsimov->fNull_cfit->status() <<
")";
1654 std::cout <<
"Not calculated";
1657 std::cout << std::endl;
1659 std::cout << std::endl;
1662 std::cout <<
" - cfit_lbound: " << fLbound_cfit->GetName() <<
" " << fLbound_cfit->minNll()
1663 <<
" (status=" << fLbound_cfit->status() <<
")" << std::endl;
1666 std::cout <<
" - gfit: " << fGenFit->GetName() << std::endl;
1667 if (!nullToys.empty() || !altToys.empty()) {
1668 std::cout <<
" * null toys: " << nullToys.size();
1670 while (
firstToy < nullToys.size() && std::isnan(std::get<1>(nullToys[
firstToy])))
1673 std::cout <<
" [ of which " <<
firstToy <<
" are bad]";
1674 std::cout <<
" , alt toys: " << altToys.size();
1676 while (
firstToy < altToys.size() && std::isnan(std::get<1>(altToys[
firstToy])))
1679 std::cout <<
" [ of which " <<
firstToy <<
" are bad]";
1680 std::cout << std::endl;
1688 auto var =
dynamic_cast<RooRealVar *
>(ufit()->floatParsFinal().find(fPOIName()));
1692 throw std::runtime_error(
TString::Format(
"Cannot find POI: %s", fPOIName()));
1695 throw std::runtime_error(
"Unconditional fit unavailable");
1702 if (fGenFit && isExpected) {
1710 : hypoTestResult(
htr)
1726 if (
toys->getGlobalObservables()) {
1727 coords = std::shared_ptr<RooAbsCollection>(
toys->getGlobalObservables()->snapshot());
1729 for (
int i = 0; i <
toys->numEntries(); i++) {
1732 std::make_tuple(
int(
toy->getRealValue(
"seed")),
toy->getRealValue(
"ts"),
toys->weight()));
1737 for (
int i = 0; i <
toys->numEntries(); i++) {
1740 std::make_tuple(
int(
toy->getRealValue(
"seed")),
toy->getRealValue(
"ts"),
toys->weight()));
1751 if (!fAsimov && (nllVar || hypoTestResult)) {
1752 auto theFit = (!
fData.first && fGenFit && !isExpected)
1757 if (!
theFit || allowedStatusCodes.find(
theFit->status()) == allowedStatusCodes.
end())
1759 fAsimov = std::make_shared<xRooHypoPoint>(*
this);
1760 fAsimov->coords.reset(fAsimov->coords->snapshot());
1761 fAsimov->hypoTestResult.reset();
1763 for (
auto p : fAsimov->poi()) {
1766 v->deleteSharedProperties();
1770 fAsimov->nullToys.clear();
1771 fAsimov->altToys.clear();
1772 fAsimov->fUfit = retrieveFit(3);
1773 fAsimov->fNull_cfit = retrieveFit(4);
1774 fAsimov->fAlt_cfit.reset();
1776 std::make_pair(
nullptr,
nullptr);
1777 fAsimov->fGenFit =
theFit;
1778 fAsimov->isExpected =
true;
1787 return std::pair<double, double>(1, 0);
1790 return std::pair<double, double>(std::numeric_limits<double>::quiet_NaN(), 0);
1800 return std::pair(
nom, std::max(std::abs(
up -
nom), std::abs(
down -
nom)));
1806 return std::pair<double, double>(1, 0);
1809 return std::pair<double, double>(std::numeric_limits<double>::quiet_NaN(), 0);
1820 return std::pair(
nom, std::max(std::abs(
up -
nom), std::abs(
down -
nom)));
1825 if (fNullVal() == fAltVal())
1826 return std::pair<double, double>(1, 0);
1829 return std::pair<double, double>(1, 0);
1832 return std::pair<double, double>(std::numeric_limits<double>::quiet_NaN(), 0);
1857 return std::pair(
nom, std::max(std::abs(
up -
nom), std::abs(
down -
nom)));
1862 if (std::isnan(
nSigma)) {
1869 return std::pair<double, double>(std::numeric_limits<double>::quiet_NaN(), 0);
1878 return std::pair<double, double>(
nom, std::max(std::abs(
nom -
up), std::abs(
nom -
down)));
1883 if (std::isnan(
nSigma)) {
1888 while (
firstToy < altToys.size() && std::isnan(std::get<1>(altToys[
firstToy])))
1891 return std::pair(std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN());
1894 return std::pair(std::get<1>(altToys[
targetIdx]), (std::get<1>(altToys[std::min(
int(altToys.size()),
targetIdx)]) -
1895 std::get<1>(altToys[std::max(0,
targetIdx)])) /
1904 return std::pair<double, double>(hypoTestResult->GetTestStatisticData(), 0);
1905 return std::pair<double, double>(std::numeric_limits<double>::quiet_NaN(), 0);
1907 if (allowedStatusCodes.find(
_ufit->status()) == allowedStatusCodes.end()) {
1908 return std::pair<double, double>(std::numeric_limits<double>::quiet_NaN(), 0);
1912 mu_hat().getVal() <
_first_poi->getMin(
"physical")) {
1916 return std::pair<double, double>(std::numeric_limits<double>::quiet_NaN(), 0);
1923 return std::pair<double, double>(0, 0);
1926 return std::pair<double, double>(std::numeric_limits<double>::quiet_NaN(), 0);
1934 return std::pair<double, double>(2. * cFactor *
diff,
1935 2. * cFactor * sqrt(pow(cfit_null(
readOnly)->edm(), 2) + pow(
_ufit->edm(), 2)));
1941 if (!hypoTestResult)
1944 if (
auto fits = hypoTestResult->GetFitInfo()) {
1945 for (
int i = 0; i <
fits->numEntries(); i++) {
1946 auto fit =
fits->get(i);
1947 if (fit->getCatIndex(
"type") !=
type)
1951 fits->getGlobalObservables()->getStringValue(
TString::Format(
"%s.name", fit->getCatLabel(
"type")));
1954 for (
auto file : *
gROOT->GetListOfFiles()) {
1958 k->GetMotherDir()->GetList()
1972 rfit->setStatus(fit->getRealValue(
"status"));
1973 rfit->setMinNLL(fit->getRealValue(
"minNll"));
1974 rfit->setEDM(fit->getRealValue(
"edm"));
1976 std::unique_ptr<RooAbsCollection>
par_hats(
1977 hypoTestResult->GetFitInfo()->getGlobalObservables()->selectByName(coords->contentsString().c_str()));
1978 par_hats->setName(
"floatParsFinal");
1986 rfit->setCovarianceMatrix(
cov);
1987 rfit->setCovQual(fit->getRealValue(
"covQual"));
1998 if (
auto rfit = retrieveFit(0)) {
1999 return fUfit =
rfit;
2001 if (!nllVar || (
readOnly && nllVar->get() && !nllVar->get()->getAttribute(
"readOnly")))
2003 if (!nllVar->fFuncVars)
2004 nllVar->reinitialize();
2007 if (!
readOnly && isExpected && fGenFit) {
2009 bool tmp = nllVar->get()->getAttribute(
"readOnly");
2010 nllVar->get()->setAttribute(
"readOnly");
2011 auto out = ufit(
true);
2012 nllVar->get()->setAttribute(
"readOnly", tmp);
2017 nllVar->setData(
data());
2020 }
else if (!nllVar->get()->getAttribute(
"readOnly")) {
2021 nllVar->setData(
fData);
2023 nllVar->fFuncVars->setAttribAll(
"Constant",
false);
2024 *nllVar->fFuncVars = *coords;
2025 if (nllVar->fFuncGlobs)
2026 nllVar->fFuncGlobs->setAttribAll(
"Constant",
true);
2027 std::unique_ptr<RooAbsCollection>(nllVar->fFuncVars->selectCommon(poi()))
2028 ->setAttribAll(
"Constant",
false);
2031 nllVar->fFuncVars->assignValueOnly(fGenFit->constPars());
2032 nllVar->fFuncVars->assignValueOnly(fGenFit->floatParsFinal());
2034 nllVar->get()->SetName(
2035 TString::Format(
"%s/%s_%s", nllVar->get()->GetName(), fGenFit->GetName(), (isExpected) ?
"asimov" :
"toys"));
2037 nllVar->get()->SetName(
TString::Format(
"%s/%s", nllVar->get()->GetName(),
fData.first->GetName()));
2039 }
else if (!std::isnan(fAltVal())) {
2044 _poi->
setVal(_poi->getStringAttribute(
"initVal") ?
TString(_poi->getStringAttribute(
"initVal")).
Atof()
2049 return (fUfit = nllVar->minimize());
2055 for (
auto &
c :
coll) {
2058 out +=
c->GetName();
2074 if (
auto rfit = retrieveFit(1)) {
2075 return fNull_cfit =
rfit;
2077 if (!nllVar || (
readOnly && nllVar->get() && !nllVar->get()->getAttribute(
"readOnly")))
2079 if (!nllVar->fFuncVars)
2080 nllVar->reinitialize();
2083 if (!
readOnly && isExpected && fGenFit) {
2085 bool tmp = nllVar->get()->getAttribute(
"readOnly");
2086 nllVar->get()->setAttribute(
"readOnly");
2087 auto out = cfit_null(
true);
2088 nllVar->get()->setAttribute(
"readOnly", tmp);
2093 nllVar->setData(
data());
2096 }
else if (!nllVar->get()->getAttribute(
"readOnly")) {
2097 nllVar->setData(
fData);
2101 *nllVar->fFuncVars = fUfit->floatParsFinal();
2103 nllVar->fFuncVars->setAttribAll(
"Constant",
false);
2104 *nllVar->fFuncVars = *coords;
2105 if (nllVar->fFuncGlobs)
2106 nllVar->fFuncGlobs->setAttribAll(
"Constant",
true);
2108 nllVar->fFuncVars->find(fPOIName())
2109 ->setStringAttribute(
"altVal", (!std::isnan(fAltVal())) ?
TString::Format(
"%g", fAltVal()) :
nullptr);
2112 nllVar->get()->SetName(
2113 TString::Format(
"%s/%s_%s", nllVar->get()->GetName(), fGenFit->GetName(), (isExpected) ?
"asimov" :
"toys"));
2115 nllVar->get()->SetName(
TString::Format(
"%s/%s", nllVar->get()->GetName(),
fData.first->GetName()));
2117 nllVar->get()->setStringAttribute(
"fitresultTitle",
collectionContents(poi()).c_str());
2118 return (fNull_cfit = nllVar->minimize());
2129 return fLbound_cfit;
2130 if (
auto rfit = retrieveFit(6)) {
2131 return fLbound_cfit =
rfit;
2133 if (!nllVar || (
readOnly && nllVar->get() && !nllVar->get()->getAttribute(
"readOnly")))
2135 if (!nllVar->fFuncVars)
2136 nllVar->reinitialize();
2139 if (!
readOnly && isExpected && fGenFit) {
2141 bool tmp = nllVar->get()->getAttribute(
"readOnly");
2142 nllVar->get()->setAttribute(
"readOnly");
2143 auto out = cfit_lbound(
true);
2144 nllVar->get()->setAttribute(
"readOnly", tmp);
2149 nllVar->setData(
data());
2152 }
else if (!nllVar->get()->getAttribute(
"readOnly")) {
2153 nllVar->setData(
fData);
2157 *nllVar->fFuncVars = fUfit->floatParsFinal();
2159 nllVar->fFuncVars->setAttribAll(
"Constant",
false);
2160 *nllVar->fFuncVars = *coords;
2162 if (nllVar->fFuncGlobs)
2163 nllVar->fFuncGlobs->setAttribAll(
"Constant",
true);
2165 nllVar->fFuncVars->find(fPOIName())
2166 ->setStringAttribute(
"altVal", (!std::isnan(fAltVal())) ?
TString::Format(
"%g", fAltVal()) :
nullptr);
2169 nllVar->get()->SetName(
2170 TString::Format(
"%s/%s_%s", nllVar->get()->GetName(), fGenFit->GetName(), (isExpected) ?
"asimov" :
"toys"));
2172 nllVar->get()->SetName(
TString::Format(
"%s/%s", nllVar->get()->GetName(),
fData.first->GetName()));
2174 nllVar->get()->setStringAttribute(
2176 collectionContents(*std::unique_ptr<RooAbsCollection>(nllVar->fFuncVars->selectCommon(poi()))).c_str());
2177 return (fLbound_cfit = nllVar->minimize());
2182 if (std::isnan(fAltVal()))
2186 if (
auto rfit = retrieveFit(2)) {
2187 return fAlt_cfit =
rfit;
2189 if (!nllVar || (
readOnly && nllVar->get() && !nllVar->get()->getAttribute(
"readOnly")))
2191 if (!nllVar->fFuncVars)
2192 nllVar->reinitialize();
2195 if (!
readOnly && isExpected && fGenFit) {
2197 bool tmp = nllVar->get()->getAttribute(
"readOnly");
2198 nllVar->get()->setAttribute(
"readOnly");
2199 auto out = cfit_alt(
true);
2200 nllVar->get()->setAttribute(
"readOnly", tmp);
2205 nllVar->setData(
data());
2208 }
else if (!nllVar->get()->getAttribute(
"readOnly")) {
2209 nllVar->setData(
fData);
2213 *nllVar->fFuncVars = fUfit->floatParsFinal();
2215 nllVar->fFuncVars->setAttribAll(
"Constant",
false);
2216 *nllVar->fFuncVars = *coords;
2217 if (nllVar->fFuncGlobs)
2218 nllVar->fFuncGlobs->setAttribAll(
"Constant",
true);
2219 *nllVar->fFuncVars = alt_poi();
2221 nllVar->get()->SetName(
2222 TString::Format(
"%s/%s_%s", nllVar->get()->GetName(), fGenFit->GetName(), (isExpected) ?
"asimov" :
"toys"));
2224 nllVar->get()->SetName(
TString::Format(
"%s/%s", nllVar->get()->GetName(),
fData.first->GetName()));
2226 nllVar->get()->setStringAttribute(
"fitresultTitle",
collectionContents(alt_poi()).c_str());
2227 return (fAlt_cfit = nllVar->minimize());
2236 return std::pair<double, double>(std::numeric_limits<double>::quiet_NaN(), 0);
2240 return std::pair<double, double>(std::abs(fNullVal() - fAltVal()) / sqrt(out.first),
2241 out.second * 0.5 * std::abs(fNullVal() - fAltVal()) /
2242 (out.first * sqrt(out.first)));
2248 if (std::isnan(
_ts.first))
2251 return std::pair<double, double>(1, 0);
2258 return std::pair(0.5, std::numeric_limits<double>::infinity());
2268 if (std::isnan(std::get<1>(
toy))) {
2271 bool res = std::get<1>(
toy) >=
_ts.first;
2272 if (std::get<2>(
toy) != 1) {
2279 if (std::get<1>(
toy) >=
_ts.first -
_ts.second)
2281 if (std::get<1>(
toy) >=
_ts.first -
_ts.second)
2303 return pX_toys(
false,
nSigma);
2308 if (!std::isnan(
nSigma)) {
2311 return pX_toys(
true,
nSigma);
2317 out.coords = coords;
2318 out.fPllType = fPllType;
2319 out.nllVar = nllVar;
2322 auto _cfit = cfit_null();
2325 if (!nllVar->fFuncVars)
2326 nllVar->reinitialize();
2330 out.fGenFit =
_cfit;
2337 out.coords = coords;
2338 out.fPllType = fPllType;
2339 out.nllVar = nllVar;
2344 if (!nllVar->fFuncVars)
2345 nllVar->reinitialize();
2350 out.fGenFit = cfit_alt();
2357 if ((
alt && !cfit_alt()) || (!
alt && !cfit_null())) {
2358 throw std::runtime_error(
"Cannot add toys, invalid conditional fit");
2361 auto condition = [&]() {
2365 if (!std::isnan(obs.first)) {
2367 double err = obs.second;
2388 throw std::runtime_error(
"Cannot target obs p-value because ts value unavailable");
2396 Info(
"addToys",
"First generating 100 alt toys in order to determine expected ts value");
2400 throw std::runtime_error(
"Unable to determine expected ts value");
2425 auto &
toys = (
alt) ? altToys : nullToys;
2431 if (!std::isnan(
target) && !condition()) {
2439 for (
size_t i = 0; i <
nnToys; i++) {
2441 auto toy = ((
alt) ? generateAlt(seed) : generateNull(seed));
2444 toys.push_back(std::make_tuple(seed,
toy.pll().first, 1.));
2447 if (std::isnan(std::get<1>(
toys.back())))
2453 <<
TString::Format(
"Generated %d/%d %s hypothesis toys [%.2f toys/s]",
2456 if (!std::isnan(
target)) {
2460 std::cout <<
"..." << std::flush;
2463 if (!
gROOT->IsBatch()) {
2467#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 30, 00)
2468 gPad->GetCanvas()->ResetUpdated();
2481 for (
auto &t :
toys) {
2482 if (std::isnan(std::get<1>(t)))
2483 std::get<1>(t) = -std::numeric_limits<double>::infinity();
2486 [](
const decltype(nullToys)::value_type &
a,
const decltype(nullToys)::value_type &
b) ->
bool {
2487 if (std::isnan(std::get<1>(a)))
2489 if (std::isnan(std::get<1>(b)))
2491 return std::get<1>(a) < std::get<1>(b);
2493 for (
auto &t :
toys) {
2494 if (std::isinf(std::get<1>(t)))
2495 std::get<1>(t) = std::numeric_limits<double>::quiet_NaN();
2497 if (std::isnan(
target)) {
2504 }
while (condition());
2507 <<
"Finished Generating ";
2516 if (!
gROOT->IsBatch()) {
2520#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 30, 00)
2521 gPad->GetCanvas()->ResetUpdated();
2529 std::cout <<
"Warning: " <<
nans <<
" toys were bad" << std::endl;
2606 out.nllVar = std::make_shared<xRooNLLVar>(*
this);
2611 while (pattern.NextToken()) {
2614 double val = std::numeric_limits<double>::quiet_NaN();
2615 auto i = s.
Index(
"=");
2619 if (!
cVal.IsFloat())
2620 throw std::runtime_error(
"poiValues must contain value");
2625 throw std::runtime_error(
"Cannot find poi");
2626 if (!std::isnan(val))
2635 throw std::runtime_error(
"No poi");
2640 if (!
static_cast<RooRealVar *
>(
b)->hasRange(
"physical")) {
2641 static_cast<RooRealVar *
>(
b)->setRange(
"physical", 0, std::numeric_limits<double>::infinity());
2645 auto _snap = std::unique_ptr<RooAbsCollection>(
fFuncVars->selectByAttrib(
"Constant",
true))->snapshot();
2646 _snap->setAttribAll(
"poi",
false);
2647 std::unique_ptr<RooAbsCollection> _poi(
_snap->selectByName(
poiNames));
2648 _poi->setAttribAll(
"poi",
true);
2650 for (
auto a : *_poi)
2651 a->setStringAttribute(
"altVal", nullptr);
2653 for (
auto a : *_poi)
2672 out.fPllType = _type;
2677xRooNLLVar::xRooHypoPoint
2683 std::unique_ptr<RooAbsCollection> _poi(
fFuncVars->selectByAttrib(
"poi",
true));
2684 if (_poi->empty()) {
2685 throw std::runtime_error(
"No POI specified in model");
2686 }
else if (_poi->size() != 1) {
2687 throw std::runtime_error(
"Multiple POI specified in model");
2701 if (!nllVar && !hypoTestResult)
2707 sOpt.ReplaceAll(
"same",
"");
2715 if (
gPad->GetNumber() == 0) {
2731 hAxis =
dynamic_cast<TH1 *
>(
pad->GetPrimitive(
".axis"));
2733 for (
auto o : *
pad->GetListOfPrimitives()) {
2741 double _min = std::numeric_limits<double>::quiet_NaN();
2742 double _max = -std::numeric_limits<double>::quiet_NaN();
2744 for (
auto &
p : nullToys) {
2745 if (std::get<2>(
p) == 0)
2747 if (std::isnan(std::get<1>(
p)))
2750 _max = std::max(std::get<1>(
p), _max);
2752 for (
auto &
p : altToys) {
2753 if (std::get<2>(
p) == 0)
2755 if (std::isnan(std::get<1>(
p)))
2758 _max = std::max(std::get<1>(
p), _max);
2761 auto obs = ts_asymp();
2762 if (!std::isnan(obs.first)) {
2763 _min = std::min(obs.first - std::abs(obs.first) * 0.1,
_min);
2764 _max = std::max(obs.first + std::abs(obs.first) * 0.1, _max);
2767 auto pNull = pNull_toys();
2768 auto pAlt = pAlt_toys();
2770 ? std::pair(std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN())
2773 ? std::pair(std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN())
2777 ? fAsimov->pll().first
2778 : std::numeric_limits<double>::quiet_NaN();
2779 if (!std::isnan(
asi) &&
asi > 0) {
2782 _max = std::max(
asi + std::abs(
asi), _max);
2787 auto _poi =
dynamic_cast<RooRealVar *
>(poi().first());
2791 auto h =
new TH1D((
isAlt) ?
"alt_toys" :
"null_toys",
"", 100,
_min, _max + (_max -
_min) * 0.01);
2792 h->SetDirectory(
nullptr);
2794 for (
auto &
p : (
isAlt) ? altToys : nullToys) {
2795 double w = std::isnan(std::get<1>(
p)) ? 0 : std::get<2>(
p);
2798 if (!std::isnan(std::get<1>(
p)))
2799 h->Fill(std::get<1>(
p),
w);
2801 if (
h->GetEntries() > 0)
2802 h->Scale(1. /
h->Integral(0,
h->GetNbinsX() + 1));
2826 h->SetMarkerSize(0);
2838 auto axis =
static_cast<TH1 *
>(
h->Clone(
".axis"));
2840 axis->SetStats(
false);
2841 axis->Reset(
"ICES");
2843 axis->SetLineWidth(0);
2845 axis->SetMinimum(1
e-7);
2846 axis->GetYaxis()->SetRangeUser(1
e-7, 10);
2847 axis->SetMaximum(
h->GetMaximum());
2849 l =
new TLegend(0.4, 0.7, 1. -
gPad->GetRightMargin(), 1. -
gPad->GetTopMargin());
2850 l->SetName(
"legend");
2852 l->SetBorderSize(0);
2855 l->ConvertNDCtoPad();
2857 for (
auto o : *
gPad->GetListOfPrimitives()) {
2864 if (
h->GetEntries() > 0) {
2867 h->Draw(
"axissame");
2870 if (
h->GetEntries() > 0) {
2873 h->Draw(
"axissame");
2881 if (fAsimov && fAsimov->fUfit && fAsimov->fNull_cfit && !std::isnan(sigma_mu().first) && !std::isnan(fAltVal())) {
2882 auto hh =
static_cast<TH1 *
>(
nullHist->Clone(
"null_asymp"));
2884 hh->SetStats(
false);
2885 hh->SetLineStyle(2);
2887 for (
int i = 1; i <=
hh->GetNbinsX(); i++) {
2890 _poi->getMin(
"physical"), _poi->getMax(
"physical")) -
2892 sigma_mu().first, _poi->getMin(
"physical"), _poi->getMax(
"physical")));
2897 hh->SetStats(
false);
2898 hh->SetLineStyle(2);
2900 for (
int i = 1; i <=
hh->GetNbinsX(); i++) {
2903 _poi->getMin(
"physical"), _poi->getMax(
"physical")) -
2905 sigma_mu().first, _poi->getMin(
"physical"), _poi->getMax(
"physical")));
2915 auto tl =
ll.DrawLine(obs.first,
hAxis->GetMinimum(), obs.first, 0.1);
2920 l->AddEntry(
tl, label,
"l");
2923 auto pCLs = pCLs_toys();
2924 label +=
" p_{toy}=(";
2929 if (label.Length() > 0)
2930 l->AddEntry(
"", label,
"");
2932 if (!std::isnan(
pNullA.first) || !std::isnan(
pAltA.first)) {
2933 auto pCLs = pCLs_asymp();
2934 label +=
" p_{asymp}=(";
2939 if (label.Length() > 0)
2940 l->AddEntry(
"", label,
"");
2942 if (
auto ax =
dynamic_cast<TH1 *
>(
gPad->GetPrimitive(
".axis")))
2943 ax->GetYaxis()->SetRangeUser(1
e-7, 1);
2948 auto v =
dynamic_cast<RooRealVar *
>(poi().empty() ? nullptr : poi().first());
2950 if (
v &&
v->hasRange(
"physical") &&
v->getMin(
"physical") != -std::numeric_limits<double>::infinity()) {
2960 if (
v &&
v->hasRange(
"physical") &&
v->getMin(
"physical") != -std::numeric_limits<double>::infinity()) {
2970 if (
v &&
v->hasRange(
"physical") &&
v->getMin(
"physical") != -std::numeric_limits<double>::infinity()) {
2980 if (
v &&
v->hasRange(
"physical") &&
v->getMin(
"physical") != -std::numeric_limits<double>::infinity()) {
2989 return "Test Statistic";
2995 return (poi().empty()) ? nullptr : (poi().first())->GetName();
3000 return (
first_poi ==
nullptr) ? std::numeric_limits<double>::quiet_NaN() :
first_poi->getVal();
3006 return (
first_poi ==
nullptr) ? std::numeric_limits<double>::quiet_NaN() :
first_poi->getVal();
3013 throw std::runtime_error(
"HypoPoint has no POI, cannot set null value");
3021 throw std::runtime_error(
"HypoPoint has no POI, cannot set alt value");
3038 if (
alt_value == std::numeric_limits<double>::quiet_NaN()) {
3052 for (
auto p : out.poi()) {
3054 dynamic_cast<RooRealVar *
>(
p)->setRange(
"physical", 0, std::numeric_limits<double>::infinity());
3055 Info(
"xRooNLLVar::hypoSpace",
"Setting physical range of %s to [0,inf]",
p->GetName());
3059 var->removeMax(
"physical");
3060 Info(
"xRooNLLVar::hypoSpace",
"Removing physical range of %s",
p->GetName());
3076 if (!std::isnan(low) && !std::isnan(high) && !(std::isinf(low) && std::isinf(high))) {
3077 for (
auto p : out.poi()) {
3078 dynamic_cast<RooRealVar *
>(
p)->setRange(
"scan", low, high);
3089 if (!std::isnan(low) && !std::isnan(high) && !(std::isinf(low) && std::isinf(high))) {
3090 for (
auto p :
hs.poi()) {
3091 dynamic_cast<RooRealVar *
>(
p)->setRange(
"scan", low, high);
3101 auto _poi = std::unique_ptr<RooAbsCollection>(
3102 std::unique_ptr<RooAbsCollection>(
pdf()->getVariables())->selectByAttrib(
"poi",
true));
3104 throw std::runtime_error(
"You must specify a POI for the hypoSpace");
3115 std::unique_ptr<RooAbsCollection> axes(s.
pars()->selectByName(
parName));
3117 throw std::runtime_error(
"parameter not found");
3118 axes->setAttribAll(
"axis",
true);
3123 s.
fNlls[s.
fPdfs.begin()->second] = std::make_shared<xRooNLLVar>(*
this);
3126 for (
auto poi : s.
poi()) {
3135 if (hypoTestResult) {
3136 return *hypoTestResult;
3139 out.SetBackgroundAsAlt(
true);
3140 out.SetName(
TUUID().AsString());
3144 if (nllVar && !nllVar->get()->getAttribute(
"readOnly")) {
3146 nllVar->get()->setAttribute(
"readOnly");
3149 out.SetTestStatisticData(ts_asymp().first);
3157 {
"OneSidedPositive", 1},
3158 {
"OneSidedNegative", 2},
3159 {
"OneSidedAbsolute", 3},
3163 fitMeta.addClone(ufit()->floatParsFinal());
3165 fitMeta.setCatIndex(
"pllType",
int(fPllType));
3173 {
"asimov_cfit_null", 4},
3175 {
"cfit_lbound", 6}}));
3185 for (
int i = 0; i < 7; i++) {
3186 std::shared_ptr<const RooFitResult> fit;
3188 case 0: fit = ufit();
break;
3189 case 1: fit = cfit_null();
break;
3190 case 2: fit = cfit_alt();
break;
3191 case 3: fit = asimov() ? asimov()->ufit(
true) :
nullptr;
break;
3192 case 4: fit = asimov() ? asimov()->cfit_null(
true) :
nullptr;
break;
3193 case 5: fit = fGenFit;
break;
3194 case 6: fit = cfit_lbound();
break;
3199 fitDetails.getCatLabel(
"type"), fit->GetName()));
3201 fitDetails.setRealValue(
"status", fit->status());
3202 fitDetails.setRealValue(
"minNll", fit->minNll());
3204 fitDetails.setRealValue(
"covQual", fit->covQual());
3210 out.SetFitInfo(
fitDS);
3220 if (!nullToys.empty()) {
3222 std::vector<double> values;
3223 std::vector<double> weights;
3224 values.reserve(nullToys.size());
3225 weights.reserve(nullToys.size());
3227 for (
auto &t : nullToys) {
3228 values.push_back(std::get<1>(t));
3229 weights.push_back(std::get<2>(t));
3235#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
3236 out.fNullPValue = pNull_toys().first;
3237 out.fNullPValueError =
3238 pNull_toys().second;
3240 out.SetNullPValue(pNull_toys().first);
3241 out.SetNullPValueError(
3242 pNull_toys().second);
3245#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
3246 out.fNullPValue = pNull_asymp().first;
3247 out.fNullPValueError = pNull_asymp().second;
3249 out.SetNullPValue(pNull_asymp().first);
3250 out.SetNullPValueError(pNull_asymp().second);
3255 if (!altToys.empty()) {
3256 std::vector<double> values;
3257 std::vector<double> weights;
3258 values.reserve(altToys.size());
3259 weights.reserve(altToys.size());
3267 for (
auto &t : altToys) {
3268 values.push_back(std::get<1>(t));
3269 weights.push_back(std::get<2>(t));
3270 altDetails.setRealValue(
"seed", std::get<0>(t));
3271 altDetails.setRealValue(
"ts", std::get<1>(t));
3275 out.SetAltDetailedOutput(
altToyDS);
3276#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
3277 out.fAlternatePValue = pAlt_toys().first;
3278 out.fAlternatePValueError =
3281 out.SetAltPValue(pAlt_toys().first);
3282 out.SetAltPValueError(
3283 pAlt_toys().second);
3287#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
3288 out.fAlternatePValue = pAlt_asymp().first;
3289 out.fAlternatePValueError = pAlt_asymp().second;
3291 out.SetAltPValue(pAlt_asymp().first);
3292 out.SetAltPValueError(pAlt_asymp().second);
3297 nllVar->get()->setAttribute(
"readOnly",
false);
3306 return "xValueWithError: nullptr\n";
3307 return Form(
"%f +/- %f",
v->first,
v->second);
3309std::string cling::printValue(
const std::map<std::string, xRooNLLVar::xValueWithError> *
m)
3313 std::string out =
"{\n";
3314 for (
auto [k,
v] : *
m) {
3315 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 removeMin(const char *name=nullptr)
Remove lower range limit for binning with given name. Empty name means default range.
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).
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 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)