20#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
21#define protected public
73std::shared_ptr<RooLinkedList> xRooFit::sDefaultNLLOptions =
nullptr;
74std::shared_ptr<ROOT::Fit::FitConfig> xRooFit::sDefaultFitConfig =
nullptr;
76const char *xRooFit::GetVersion()
80const char *xRooFit::GetVersionDate()
87 return RooCmdArg(
"ReuseNLL",
flag, 0, 0, 0,
nullptr,
nullptr,
nullptr,
nullptr);
97 return RooCmdArg(
"StrategySequence", 0, 0, 0, 0, val);
105xRooNLLVar xRooFit::createNLL(
const std::shared_ptr<RooAbsPdf> pdf,
const std::shared_ptr<RooAbsData>
data,
113 return createNLL(std::shared_ptr<RooAbsPdf>(&pdf, [](
RooAbsPdf *) {}),
131 return createNLL(pdf,
data,
l);
134std::shared_ptr<const RooFitResult>
136 const std::pair<std::shared_ptr<RooAbsData>, std::shared_ptr<const RooAbsCollection>> &
data,
144std::shared_ptr<const RooFitResult> xRooFit::fitTo(
RooAbsPdf &pdf,
145 const std::pair<RooAbsData *, const RooAbsCollection *> &
data,
153std::pair<std::shared_ptr<RooAbsData>, std::shared_ptr<const RooAbsCollection>>
157 std::pair<std::shared_ptr<RooAbsData>, std::shared_ptr<const RooAbsCollection>> out;
163 auto _allVars = std::unique_ptr<RooAbsCollection>(pdf.
getVariables());
164 auto _snap = std::unique_ptr<RooAbsCollection>(_allVars->snapshot());
165 *_allVars = fr->constPars();
166 *_allVars = fr->floatParsFinal();
169 auto _globs = std::unique_ptr<RooAbsCollection>(fr->constPars().selectByAttrib(
"global",
true));
180 std::function<std::pair<std::shared_ptr<RooAbsData>, std::shared_ptr<const RooArgSet>>(
RooAbsPdf *)>
genSubPdf;
183 std::pair<std::shared_ptr<RooAbsData>, std::shared_ptr<const RooArgSet>>
_out;
186 std::unique_ptr<RooArgSet> _obs(_pdf->getVariables());
187 _obs->remove(fr->constPars(),
true,
true);
188 _obs->remove(fr->floatParsFinal(),
true,
true);
195 std::unique_ptr<RooArgSet> globs(_pdf->getObservables(t));
201 *
toy_gobs = *std::unique_ptr<RooDataSet>(_pdf->generate(*globs, 1))->get();
206 for (
auto thePdf : pp->pdfList()) {
207 auto gob = std::unique_ptr<RooArgSet>(
thePdf->getObservables(*globs));
210 if (
gob->size() > 1) {
211 Warning(
"generate",
"%s contains multiple global obs: %s",
thePdf->GetName(),
212 gob->contentsString().c_str());
216 std::unique_ptr<RooArgSet>
cpars(
thePdf->getParameters(*globs));
229 <<
"xRooFit::generateFrom : constraint term " <<
thePdf->GetName() <<
" of type "
230 << className <<
" is a non-supported type - result might be not correct " << std::endl;
237 pois->setNoRounding(
true);
248 <<
"xRooFit::generateFrom : constraint term " <<
thePdf->GetName()
249 <<
" has no direct dependence on global observable- cannot generate it " << std::endl;
269 <<
"xRooFit::generateFrom : constraint term " <<
thePdf->GetName()
270 <<
" is a Gamma distribution and no server named theta is found. Assume that the Gamma "
278 (!
rrv2->isConstant() || !
rrv2->InheritsFrom(
"RooConstVar"))) {
283 <<
"xRooFit::generateFrom : constraint term " <<
thePdf->GetName()
284 <<
" constraint term has more server depending on nuisance- cannot generate it "
300 <<
"xRooFit::generateFrom : can't find nuisance for constraint term - global "
301 "observables will not be set to Asimov value "
302 <<
thePdf->GetName() <<
" glob = " <<
rrv.GetName() << std::endl;
303 std::cerr <<
"Parameters: " << std::endl;
305 std::cerr <<
"Observables: " << std::endl;
310 Error(
"generate",
"Cannot generate global observables, pdf is: %s::%s", _pdf->ClassName(),
323 _out.first = std::make_unique<RooDataSet>(
324 uuid,
TString::Format(
"%s %s", _pdf->GetTitle(), (expected) ?
"Expected" :
"Toy"), *_obs,
327 for (
auto &
c : s->indexCat()) {
328#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 22, 00)
331 std::string
cLabel =
c->GetName();
333 auto p = s->getPdf(
cLabel.c_str());
339 _obs->setCatLabel(s->indexCat().GetName(),
cLabel.c_str());
340 for (
int i = 0; i <
toy.first->numEntries(); i++) {
341 *_obs = *
toy.first->get(i);
342 _out.first->add(*_obs,
toy.first->weight());
348 std::map<RooRealVar *, std::shared_ptr<RooAbsBinning>>
binnings;
350 for (
auto &o : *_obs) {
354 if (
auto res = _pdf->binBoundaries(*
r, -std::numeric_limits<double>::infinity(),
355 std::numeric_limits<double>::infinity())) {
356 binnings[
r] = std::shared_ptr<RooAbsBinning>(
r->getBinning().clone(
r->getBinning().GetName()));
358 std::vector<double> boundaries;
359 boundaries.reserve(res->size());
360 for (
auto &
rr : *res) {
361 if (boundaries.empty() || std::abs(boundaries.back() -
rr) > 1
e-3 ||
362 std::abs(boundaries.back() -
rr) > 1
e-5 * boundaries.back())
363 boundaries.push_back(
rr);
365 r->setBinning(
RooBinning(boundaries.size() - 1, &boundaries[0]));
367 }
else if (
r->numBins(
r->getBinning().GetName()) == 0 && expected) {
369 binnings[
r] = std::shared_ptr<RooAbsBinning>(
r->getBinning().clone(
r->getBinning().GetName()));
383 if (_pdf->canBeExtended()) {
401 auto binning =
b.second;
402 v->setBinning(*binning);
406 auto r =
x->getRange();
407 if (
r.first > binning->lowBound())
408 x->setMin(binning->lowBound());
409 if (
r.second < binning->highBound())
410 x->setMax(binning->highBound());
416 out.first->SetName(expected ? (
TString(fr->GetName()) +
"_asimov") : uuid);
420 out.first->setGlobalObservables(*out.second);
424#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 26, 00)
427 w->setStringAttribute(
"fitResult", fr->GetName());
428 w->setAttribute(
"expected", expected);
438#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
439 auto _ws = pdf.
_myws;
446 for (
auto obj : _ws->components()) {
447 for (
int i = 0; i < obj->numCaches(); i++) {
453 p->setNormRange(
p->normRange());
455 obj->setValueDirty();
463std::shared_ptr<RooLinkedList> xRooFit::createNLLOptions()
469 for (
auto opt : *defaultNLLOptions()) {
470 out->Add(opt->Clone(
nullptr));
476std::shared_ptr<RooLinkedList> xRooFit::defaultNLLOptions()
478 if (sDefaultNLLOptions)
479 return sDefaultNLLOptions;
487 return sDefaultNLLOptions;
490std::shared_ptr<ROOT::Fit::FitConfig> xRooFit::createFitConfig()
492 return std::make_shared<ROOT::Fit::FitConfig>(*defaultFitConfig());
495std::shared_ptr<ROOT::Fit::FitConfig> xRooFit::defaultFitConfig()
497 if (sDefaultFitConfig)
498 return sDefaultFitConfig;
499 sDefaultFitConfig = std::make_shared<ROOT::Fit::FitConfig>();
500 auto &fitConfig = *sDefaultFitConfig;
501 fitConfig.SetParabErrors(
true);
502 fitConfig.MinimizerOptions().SetMinimizerType(
"Minuit2");
503 fitConfig.MinimizerOptions().SetErrorDef(0.5);
504 fitConfig.SetParabErrors(
true);
505 fitConfig.SetMinosErrors(
true);
506 fitConfig.MinimizerOptions().SetMaxFunctionCalls(
508 fitConfig.MinimizerOptions().SetMaxIterations(-1);
509 fitConfig.MinimizerOptions().SetStrategy(-1);
513 fitConfig.MinimizerOptions().SetPrintLevel(-2);
519#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 29, 00)
523 extraOpts->SetValue(
"HesseStrategySequence",
"23");
525 extraOpts->SetValue(
"StrategySequence",
"0s01s12s2m");
526 extraOpts->SetValue(
"HesseStrategySequence",
"2");
534 extraOpts->SetValue(
"TrackProgress", 30);
541 return sDefaultFitConfig;
546 return const_cast<ROOT::Math::IOptions *
>(defaultFitConfig()->MinimizerOptions().ExtraOptions());
557 std::cerr <<
msg << std::endl;
568 std::cout <<
msg << std::endl;
580 printCout(
"Minimization interrupted ... will exit as soon as possible");
597 vars.reset(std::unique_ptr<RooAbsCollection>(
f.getVariables())->selectByAttrib(
"Constant",
false));
634 throw std::runtime_error(
"Keyboard interrupt");
635 return std::numeric_limits<double>::quiet_NaN();
638 if (
prevMin == std::numeric_limits<double>::infinity()) {
642 if (!std::isnan(out)) {
654 std::stringstream
sout;
675 std::vector<std::pair<double, std::string>>
parDeltas;
678 parDeltas.emplace_back(std::pair<double, std::string>(
682 [](
auto &left,
auto &right) { return std::abs(left.first) > std::abs(right.first); });
684 for (i = 0; i < std::min(3,
int(
parDeltas.size())); i++) {
698 if (
gROOT->FromPopUp() &&
gROOT->GetListOfBrowsers()->At(0)) {
700 std::string status =
sout.str();
704 if (status.find(
" : ") != std::string::npos) {
705 status_part = status.substr(0, status.find(
" : "));
706 status = status.substr(status.find(
" : ") + 3);
730 mutable double minVal = std::numeric_limits<double>::infinity();
731 mutable double prevMin = std::numeric_limits<double>::infinity();
740 std::shared_ptr<RooAbsCollection>
vars;
753 const std::shared_ptr<ROOT::Fit::FitConfig> &
_fitConfig,
754 const std::shared_ptr<RooLinkedList> &
nllOpts)
769 if (nll.getStringAttribute(
"userPars")) {
771 while (
st.NextToken()) {
782 auto _nllVars = std::unique_ptr<RooAbsCollection>(_nll->getVariables());
784 std::unique_ptr<RooAbsCollection> constPars(
_nllVars->selectByAttrib(
"Constant",
true));
786 std::unique_ptr<RooAbsCollection>
floatPars(
_nllVars->selectByAttrib(
"Constant",
false));
793#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 29, 00)
798 if (fitConfig.MinimizerOptions().ExtraOptions()) {
799 fitConfig.MinimizerOptions().ExtraOptions()->GetNamedValue(
"StrategySequence", s);
800 fitConfig.MinimizerOptions().ExtraOptions()->GetIntValue(
"TrackProgress",
_progress);
801 fitConfig.MinimizerOptions().ExtraOptions()->GetRealValue(
"BoundaryCheck",
boundaryCheck);
802 fitConfig.MinimizerOptions().ExtraOptions()->GetIntValue(
"LogSize",
logSize);
803 fitConfig.MinimizerOptions().ExtraOptions()->GetIntValue(
"HesseStrategy",
hesseStrategy);
804 fitConfig.MinimizerOptions().ExtraOptions()->GetNamedValue(
"HesseStrategySequence",
hs);
815 if (
auto keys =
nllDir->GetListOfKeys(); keys) {
816 for (
auto &&k : *keys) {
818 if (cl->InheritsFrom(
"RooFitResult")) {
835 for (
auto &
p : *constPars) {
842 _p->getCurrentIndex() !=
c->getCurrentIndex()) {
854 if (!_p->getAttribute(
"global") && std::abs(_p->getVal() -
v->getVal()) > 1
e-12) {
877 if (nll.getAttribute(
"readOnly"))
880 int printLevel = fitConfig.MinimizerOptions().PrintLevel();
886 if (
floatPars->empty() || fitConfig.MinimizerOptions().MaxFunctionCalls() == 1) {
887 std::shared_ptr<RooFitResult>
result;
891 result = std::make_shared<RooFitResult>();
899 result->setCovarianceMatrix(
d);
901 result->setMinNLL(_nll->getVal());
911 if (!
cacheDir->GetDirectory(nll.GetName()))
913 if (
auto dir =
cacheDir->GetDirectory(nll.GetName()); dir) {
919 if (!dir->FindKey(
nllOpts->GetName())) {
932 std::shared_ptr<RooFitResult> out;
937 if (
p->isCategory()) {
946 std::shared_ptr<const RooFitResult>
bestFr;
947 for (
auto c : allCats) {
949 Info(
"minimize",
"Minimizing with discrete %s",
c.first.c_str());
952 Warning(
"minimize",
"Minimization with discrete %s failed",
c.first.c_str());
960 floatCats.setAttribAll(
"Constant",
false);
966 out = std::make_shared<RooFitResult>(*
bestFr);
967 const_cast<RooArgList &
>(out->floatParsFinal())
968 .addClone(*std::unique_ptr<RooAbsCollection>(out->constPars().selectCommon(
floatCats)));
974 bool restore = !fitConfig.UpdateAfterFit();
975 bool minos = fitConfig.MinosErrors();
978 int strategy = fitConfig.MinimizerOptions().Strategy();
985 std::unique_ptr<RooMinimizer>
_minimizerPtr = std::make_unique<RooMinimizer>(*_nll);
987 _minimizer->
fitter()->Config() = fitConfig;
999 bool autoMaxCalls = (_minimizer->
fitter()->Config().MinimizerOptions().MaxFunctionCalls() == 0);
1001 _minimizer->
fitter()->Config().MinimizerOptions().SetMaxFunctionCalls(
1004 if (_minimizer->
fitter()->Config().MinimizerOptions().MaxIterations() == 0) {
1005 _minimizer->
fitter()->Config().MinimizerOptions().SetMaxIterations(500 *
floatPars->size());
1009 bool hesse = _minimizer->
fitter()->Config().ParabErrors();
1010 _minimizer->
fitter()->Config().SetParabErrors(
1012 _minimizer->
fitter()->Config().SetMinosErrors(
false);
1013 _minimizer->
fitter()->Config().SetUpdateAfterFit(
true);
1025 _minimizer->
fitter()->Config().MinimizerOptions().ExtraOptions()->GetValue(
"OptimizeConst",
constOptimize);
1047 if (
minim ==
"Minuit2") {
1054 Warning(
"minimize",
"Strategy %d not specified in StrategySequence %s ... defaulting to start of sequence",
1058 }
else if (
minim ==
"Minuit")
1067 algo =
"migradImproved";
1077 std::unique_ptr<RooMinimizer>
_minimizerPtr2 = std::make_unique<RooMinimizer>(*_nll);
1088 fff->prevMin =
fff->minVal;
1098 fff->fState =
minim +
algo + std::to_string(_minimizer->
fitter()->Config().MinimizerOptions().Strategy());
1102 }
catch (
const std::exception &
e) {
1103 std::cerr <<
"Exception while minimizing: " <<
e.what() << std::endl;
1112 throw std::runtime_error(
"Keyboard interrupt while minimizing");
1116 status = _minimizer->
fitter()
1119 minim = _minimizer->
fitter()->Config().MinimizerType();
1121 _minimizer->
fitter()->Config().MinimizerAlgoType() +
1122 std::to_string(_minimizer->
fitter()->Config().MinimizerOptions().Strategy()),
1124 if (status % 1000 == 0)
1127 if (status == 4 &&
minim !=
"Minuit") {
1129 Warning(
"fitTo",
"%s Hit max function calls of %d",
fitName.Data(),
1130 _minimizer->
fitter()->Config().MinimizerOptions().MaxFunctionCalls());
1134 Warning(
"fitTo",
"will try doubling this");
1135 _minimizer->
fitter()->Config().MinimizerOptions().SetMaxFunctionCalls(
1136 _minimizer->
fitter()->Config().MinimizerOptions().MaxFunctionCalls() * 2);
1137 _minimizer->
fitter()->Config().MinimizerOptions().SetMaxIterations(
1138 _minimizer->
fitter()->Config().MinimizerOptions().MaxIterations() * 2);
1148 fitName.Data(), _minimizer->
fitter()->Config().MinimizerType().c_str(),
1149 _minimizer->
fitter()->Config().MinimizerAlgoType().c_str(), status,
1150 _minimizer->
fitter()->Result().Edm(),
1151 _minimizer->
fitter()->Config().MinimizerOptions().Tolerance(),
1152 _minimizer->
fitter()->Config().MinimizerOptions().Strategy(),
tries)
1178 Warning(
"fitTo",
"%s final status is %d",
fitName.Data(), status);
1187 int miniStrat = _minimizer->
fitter()->Config().MinimizerOptions().Strategy();
1188 double dCovar = std::numeric_limits<double>::quiet_NaN();
1226 "HesseStrategy %d not specified in HesseStrategySequence %s ... defaulting to start of sequence",
1230 while (
sIdx != -1) {
1235 if (_minimizer->
fitter()->GetMinimizer()->CovMatrixStatus() == 3) {
1251 fff->counter2 =
fff->counter;
1261 auto _status = _minimizer->
hesse();
1285 TString::Format(
"Hesse%d", _minimizer->
fitter()->Config().MinimizerOptions().Strategy()), _status));
1289 throw std::runtime_error(
"Keyboard interrupt while hesse calculating");
1291 if ((_status != 0 || _minimizer->
fitter()->GetMinimizer()->CovMatrixStatus() != 3) && status == 0 &&
1294 _minimizer->
fitter()->GetMinimizer()->CovMatrixStatus())
1298 if (_status == 0 && _minimizer->
fitter()->GetMinimizer()->CovMatrixStatus() == 3) {
1301 }
else if (_status == 0) {
1313 if (
gEnv->
GetValue(
"XRooFit.ResumeInvalidFits",
false) &&
1322 if (status == 0 &&
minos) {
1323 if (std::unique_ptr<RooAbsCollection>
mpars(
floatPars->selectByAttrib(
"minos",
true)); !
mpars->empty()) {
1325 fff->fState =
"Minos";
1327 fff->prevMin =
fff->minVal;
1345 if (out->status() == -1 && !_minimizer->
fitter()->Result().IsValid() && _minimizer->
fitter()->Result().Status()) {
1346 out->setStatus(_minimizer->
fitter()->Result().Status());
1351 if (out->status() == 0 && out->covQual() != 3 && hesse) {
1352 if (out->covQual() == 2) {
1361 out->edm() > _minimizer->
fitter()->Config().MinimizerOptions().Tolerance() * 1
e-2 && out->status() != 3) {
1364 std::stringstream
ss;
1365 ss <<
"Warning: post-Hesse edm " << out->edm()
1366 <<
" > 10xMaxEDM (MaxEDM=" << _minimizer->
fitter()->Config().MinimizerOptions().Tolerance() * 1
e-3
1367 <<
"). Consider increasing your minimization strategy";
1379 if (!std::isnan(
dCovar)) {
1381 .addClone(
RooRealVar(
".dCovar",
"dCovar from minimization",
dCovar),
true);
1392 double vRange =
v->getMax() -
v->getMin();
1398 auto tmp =
v->getVal();
1399 v->setVal(
v->getMin());
1402 static_cast<RooRealVar *
>(out->floatParsFinal().find(
v->GetName()))->
setVal(
v->getMin());
1411 if (
v->hasRange(
"physical"))
1416 (
v->getMin() >
v->getVal() -
v->getError() ||
v->getMax() <
v->getVal() +
v->getError())) {
1418 Info(
"minimize",
"PARLIM: %s (%f +/- %f) range (%f - %f)",
v->GetName(),
v->getVal(),
v->getError(),
1419 v->getMin(),
v->getMax());
1426 Warning(
"minimize",
"BOUNDCHK: Parameters within %g%% limit in fit result: %s",
boundaryCheck * 100,
1431 Warning(
"minimize",
"BOUNDCHK: Parameters near limit in fit result");
1463 out->setMinNLL(_nll->getVal());
1466 for (
auto o : out->floatParsFinal()) {
1468 v && !
v->
getAttribute(
"minos") && !
v->getAttribute(
"xminos") && !
v->getAttribute(
"xMinos"))
1469 v->removeAsymError();
1482 if (out && out->status() == 0 &&
minos) {
1484 for (
auto label : {
"xminos",
"xMinos"}) {
1485 std::unique_ptr<RooAbsCollection> pars(
floatPars->selectByAttrib(label,
true));
1486 for (
auto p : *pars) {
1487 Info(
"minimize",
"Computing xminos error for %s",
p->GetName());
1499 if (out && !
logs.empty()) {
1501#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 28, 00)
1502 const_cast<RooArgList &
>(out->constPars()).addOwned(std::make_unique<RooStringVar>(
".log",
"log",
logs.c_str()));
1511 if (!
cacheDir->GetDirectory(nll.GetName()))
1513 if (
auto dir =
cacheDir->GetDirectory(nll.GetName()); dir) {
1519 if (!dir->FindKey(
nllOpts->GetName())) {
1526 if (!fitConfig.MinimizerOptions().ExtraOptions()->GetValue(
"Name",
configName)) {
1532 dir->WriteObject(&fitConfig,
configName.data());
1535#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 28, 00)
1537 .addOwned(std::make_unique<RooStringVar>(
".fitConfigName",
"fitConfigName",
configName.c_str()));
1542 dir->WriteObject(out.get(), out->GetName());
1556 const std::shared_ptr<ROOT::Fit::FitConfig> &
_fitConfig)
1559 auto par =
dynamic_cast<RooRealVar *
>(std::unique_ptr<RooArgSet>(nll.getVariables())->find(
parName));
1570 bool pErrs = fitConfig.ParabErrors();
1571 fitConfig.SetParabErrors(
false);
1572 double mErrs = fitConfig.MinosErrors();
1573 fitConfig.SetMinosErrors(
false);
1582 bool isConst = par->isConstant();
1583 par->setConstant(
true);
1605 return std::numeric_limits<double>::quiet_NaN();
1608 status +=
result->status() * 10;
1614 std::cout <<
"Warning: Alternative best-fit of " << par->GetName() <<
" @ " <<
val_guess <<
" vs "
1615 <<
val_best <<
" (delta=" << tmu / 2. <<
")" << std::endl;
1621 status = (status / 10) * 10 + 1;
1634 std::cout <<
"NLL min: " <<
nll_min << std::endl;
1635 std::cout <<
"N_sigma*sigma(pre): " << std::abs(
val_pre -
val_best) << std::endl;
1636 std::cout <<
"sigma(guess): " <<
sigma_guess << std::endl;
1637 std::cout <<
"par(guess): " <<
val_guess + corr << std::endl;
1638 std::cout <<
"true val: " <<
val_best << std::endl;
1639 std::cout <<
"tmu: " << tmu << std::endl;
1640 std::cout <<
"Precision: " <<
sigma_guess * precision << std::endl;
1641 std::cout <<
"Correction: " << (-corr < 0 ?
" " :
"") << -corr << std::endl;
1642 std::cout <<
"N_sigma*sigma(guess): " << std::abs(
val_guess -
val_best) << std::endl;
1643 std::cout << std::endl;
1668 status = (status / 10) * 10 + 3;
1676 status = (status / 10) * 10 + 2;
1680 status = (status / 10) * 10 + 2;
1686 std::cout <<
"Finished in " <<
nrItr <<
" iterations." << std::endl;
1688 std::cout << std::endl;
1694 par_hat->setError(std::numeric_limits<double>::quiet_NaN());
1695 double lo =
par_hat->getErrorLo();
1697 if (std::isnan(
hi)) {
1703 if (std::isnan(lo)) {
1710 fitConfig.SetParabErrors(
pErrs);
1711 fitConfig.SetMinosErrors(
mErrs);
1732 std::deque<RooAbsArg *>
topPdfs;
1734 for (
auto p :
w.allPdfs()) {
1735 if (
p->hasClients())
1738 if (
p->getAttribute(
"hypoTest")) {
1745 Error(
"hypoTest",
"Cannot find top-level pdf in workspace");
1747 }
else if (
topPdfs.size() > 1) {
1750 Error(
"hypoTest",
"Multiple top-level pdfs. Flag which one to test with "
1751 "w->pdf(\"pdfName\")->setAttribute(\"hypoTest\",true)");
1754 Error(
"hypoTest",
"Multiple top-level pdfs flagged for hypoTest -- pick one.");
1760 Info(
"hypoTest",
"Using PDF: %s", model->
GetName());
1766 std::shared_ptr<RooArgSet>
obsGlobs =
nullptr;
1768 for (
auto p :
w.allData()) {
1770 Error(
"hypoTest",
"Multiple datasets in workspace. Flag which one to test with "
1771 "w->data(\"dataName\")->setAttribute(\"hypoTest\",true)");
1778 Error(
"hypoTest",
"No data -- cannot determine observables");
1782 Info(
"hypoTest",
"Using Dataset: %s",
obsData->GetName());
1785 auto _globs = xRooNode(
w).datasets()[
obsData->GetName()]->globs();
1786 obsGlobs = std::make_shared<RooArgSet>();
1788 Info(
"hypoTest",
"Using Globs: %s", (
obsGlobs->empty()) ?
" <NONE>" :
obsGlobs->contentsString().c_str());
1793 auto _vars = std::unique_ptr<RooArgSet>(model->
getVariables());
1796 for (
auto _v : *_vars) {
1801 if (poi.
size() > 1) {
1806 if (!args.
empty()) {
1810 Error(
"hypoTest",
"No POI detected: add the hypoPoints binning to at least one non-const model parameter e.g.:\n "
1811 "w->var(\"mu\")->setBinning(RooUniformBinning(0.5,10.5,10),\"hypoPoints\"))");
1824 nll.SetFitConfig(fitConfig);
1826 if (poi.
size() == 1) {
1829 double altVal = (mu->getStringAttribute(
"altVal")) ?
TString(mu->getStringAttribute(
"altVal")).Atof()
1830 : std::numeric_limits<double>::quiet_NaN();
1832 if (std::isnan(
altVal) && mu->hasRange(
"physical")) {
1834 altVal = mu->getMin(
"physical");
1835 Info(
"hypoTest",
"No altVal specified - using min of given physical range = %g",
altVal);
1837 if (!std::isnan(
altVal)) {
1838 Info(
"hypoTest",
"alt hypo: %g - CLs activated",
altVal);
1840 Info(
"hypoTest",
"No altVal found - to specify setStringAttribute(\"altVal\",\"<value>\") on POI or set "
1841 "the physical range");
1844 bool doCLs = !std::isnan(
altVal) && std::abs(mu->getMin(
"hypoPoints")) >
altVal &&
1845 std::abs(mu->getMax(
"hypoPoints")) >
altVal;
1847 const char *
sCL = (
doCLs) ?
"CLs" :
"null";
1848 Info(
"hypoTest",
"%s testing active",
sCL);
1858 std::vector<int>
expSig = {-2, -1, 0, 1, 2};
1861 std::map<int, TGraphErrors>
exp_pcls;
1862 std::map<int, TGraphErrors>
exp_cls;
1871 double _out = std::numeric_limits<double>::quiet_NaN();
1873 for (
int i = 0; i <
pValues.GetN(); i++) {
1879 ((1. -
CL) -
pValues.GetPointY(i - 1)) /
1889 obs_ts->SetPoint(obs_ts->GetN(),
testVal,
hp.pll().first);
1890 obs_ts->SetPointError(obs_ts->GetN() - 1, 0,
hp.pll().second);
1899 (
doCLs) ?
hp.pCLs_asymp(s).first :
hp.pNull_asymp(s).first);
1902 Info(
"hypoTest",
"%s=%g: %s=%g sigma_mu=%g %s=%g", mu->GetName(),
testVal, obs_ts->GetName(),
1903 obs_ts->GetPointY(obs_ts->GetN() - 1),
hp.sigma_mu().first,
obs_pcls->GetName(),
1906 Info(
"hypoTest",
"%s=%g: %s=%g %s=%g", mu->GetName(),
testVal, obs_ts->GetName(),
1911 if (mu->getBins(
"hypoPoints") <= 0) {
1916 testPoint((mu->getMax(
"hypoPoints") + mu->getMin(
"hypoPoints")) / 2.);
1940 for (
int i = 0; i <= mu->getBins(
"hypoPoints"); i++) {
1941 testPoint((i == mu->getBins(
"hypoPoints")) ? mu->getBinning(
"hypoPoints").binHigh(i - 1)
1942 : mu->getBinning(
"hypoPoints").binLow(i));
1954 band2->SetNameTitle(
".pCLs_2sigma",
"2 sigma band");
1956 band2up->SetNameTitle(
".pCLs_2sigma_upUncert",
"");
1958 band2down->SetNameTitle(
".pCLs_2sigma_downUncert",
"");
1964 for (
int i = 0; i <
exp_pcls[2].GetN(); i++) {
1970 for (
int i =
exp_pcls[2].GetN() - 1; i >= 0; i--) {
1974 for (
int i = 0; i <
exp_pcls[-2].GetN(); i++) {
1978 for (
int i =
exp_pcls[-2].GetN() - 1; i >= 0; i--) {
1997 band2->SetNameTitle(
".pCLs_1sigma",
"1 sigma band");
1999 band2up->SetNameTitle(
".pCLs_1sigma_upUncert",
"");
2001 band2down->SetNameTitle(
".pCLs_1sigma_downUncert",
"");
2007 for (
int i = 0; i <
exp_pcls[1].GetN(); i++) {
2013 for (
int i =
exp_pcls[1].GetN() - 1; i >= 0; i--) {
2017 for (
int i = 0; i <
exp_pcls[-1].GetN(); i++) {
2021 for (
int i =
exp_pcls[-1].GetN() - 1; i >= 0; i--) {
2043 obs_pcls->Draw(
gPad->GetListOfPrimitives()->IsEmpty() ?
"ALP" :
"LP");
2045 obs_ts->SetLineColor(
kRed);
2046 obs_ts->SetMarkerColor(
kRed);
2050 auto l =
new TLegend(0.5, 0.6, 1. -
gPad->GetRightMargin(), 1. -
gPad->GetTopMargin());
2051 l->SetName(
"legend");
2052 l->AddEntry(obs_ts, obs_ts->GetTitle(),
"LPE");
2055 l->AddEntry(
expPlot,
"Expected",
"LFE");
2063 exp_cls[s].SetMarkerStyle(29);
2064 exp_cls[s].SetEditable(
false);
2079 double factor = pow(10.0,
digits - ceil(log10(std::abs(
value))));
2080 return std::round(
value * factor) / factor;
2092 if (!std::isinf(out.second)) {
2093 auto tmp = out.second;
2095 int expo = (out.second == 0) ? 0 : (
int)std::floor(std::log10(std::abs(out.second)));
2099 }
else if (out.second != 0) {
static void indent(ostringstream &buf, int indent_level)
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
void 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.
void Warning(const char *location, const char *msgfmt,...)
Use this function in warning situations.
winID h TVirtualViewer3D TVirtualGLPainter p
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 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
char * Form(const char *fmt,...)
Formats a string in a circular formatting buffer.
R__EXTERN TSystem * gSystem
double getValV(const RooArgSet *) const override
Return value of object.
double evaluate() const override
Evaluate this PDF / function / constant. Needs to be overridden by all derived classes.
bool setData(RooAbsData &data, bool cloneData) override
ProgressMonitor(const ProgressMonitor &other, const char *name=nullptr)
~ProgressMonitor() override
void printMultiline(std::ostream &os, Int_t contents, bool verbose=false, TString indent="") const override
Interface for detailed printing of object.
TObject * clone(const char *newname) const override
std::shared_ptr< RooAbsCollection > vars
bool getParameters(const RooArgSet *observables, RooArgSet &outputSet, bool stripDisconnected) const override
Fills a list with leaf nodes in the arg tree starting with ourself as top node that don't match any o...
void applyWeightSquared(bool flag) override
Disables or enables the usage of squared weights.
void constOptimizeTestStatistic(ConstOpCode opcode, bool doAlsoTrackingOpt) override
Interface function signaling a request to perform constant term optimization.
ProgressMonitor(RooAbsReal &f, int interval=30)
static ProgressMonitor * me
double defaultErrorLevel() const override
static void interruptHandler(int signum)
StoredFitResult(RooFitResult *_fr)
std::shared_ptr< RooFitResult > fr
!
static int minos(RooAbsReal &nll, const RooFitResult &ufit, const char *parName="", const std::shared_ptr< ROOT::Fit::FitConfig > &_fitConfig=nullptr)
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::shared_ptr< RooLinkedList > createNLLOptions()
static TCanvas * hypoTest(RooWorkspace &w, const xRooFit::Asymptotics::PLLType &pllType=xRooFit::Asymptotics::Unknown)
static std::shared_ptr< ROOT::Fit::FitConfig > createFitConfig()
static std::pair< double, double > matchPrecision(const std::pair< double, double > &in)
This xRooNLLVar object has several special methods, e.g.
xRooFitResult minimize(const std::shared_ptr< ROOT::Fit::FitConfig > &=nullptr)
Class describing the configuration of the fit, options and parameter settings using the ROOT::Fit::Pa...
class implementing generic options for a numerical algorithm Just store the options in a map of strin...
Generic interface for defining configuration options of a numerical algorithm.
const_iterator begin() const
const_iterator end() const
Common abstract base class for objects that represent a value and a "shape" in RooFit.
RooWorkspace * _myws
! In which workspace do I live, if any
RooFit::OwningPtr< RooArgSet > getParameters(const RooAbsData *data, bool stripDisconnected=true) const
Create a list of leaf nodes in the arg tree starting with ourself as top node that don't match any of...
RooWorkspace * workspace() const
virtual void constOptimizeTestStatistic(ConstOpCode opcode, bool doAlsoTrackingOpt=true)
Interface function signaling a request to perform constant term optimization.
bool getAttribute(const Text_t *name) const
Check if a named attribute is set. By default, all attributes are unset.
RooFit::OwningPtr< RooArgSet > getVariables(bool stripDisconnected=true) const
Return RooArgSet with all variables (tree leaf nodes of expression tree)
virtual void applyWeightSquared(bool flag)
Disables or enables the usage of squared weights.
A space to attach TBranches.
double getRealValue(const char *name, double defVal=0.0, bool verbose=false) const
Get value of a RooAbsReal stored in set with given name.
virtual bool remove(const RooAbsArg &var, bool silent=false, bool matchByNameOnly=false)
Remove the specified argument from our list.
void assignFast(const RooAbsCollection &other, bool setValDirty=true) const
Functional equivalent of assign() but assumes this and other collection have same layout.
virtual bool add(const RooAbsArg &var, bool silent=false)
Add the specified argument to list.
Storage_t::size_type size() const
RooAbsArg * first() const
virtual RooAbsArg * addClone(const RooAbsArg &var, bool silent=false)
Add a clone of the specified argument to list.
std::string contentsString() const
Return comma separated list of contained object names as STL string.
Abstract base class for binned and unbinned datasets.
Abstract interface for all probability density functions.
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 double defaultErrorLevel() const
virtual bool setData(RooAbsData &, bool=true)
void printMultiline(std::ostream &os, Int_t contents, bool verbose=false, TString indent="") const override
Structure printing.
RooArgList is a container object that can hold multiple RooAbsArg objects.
RooArgSet is a container object that can hold multiple RooAbsArg objects.
RooArgSet * selectByAttrib(const char *name, bool value) const
Use RooAbsCollection::selectByAttrib(), but return as RooArgSet.
Implements a RooAbsBinning in terms of an array of boundary values, posing no constraints on the choi...
Named container for two doubles, two integers two object points and three string pointers that can be...
Container class to hold unbinned data.
RooRealVar * weightVar() const
Returns a pointer to the weight variable (if set).
RooFitResult is a container class to hold the input and output of a PDF fit to a dataset.
Int_t statusCodeHistory(UInt_t icycle) const
const char * statusLabelHistory(UInt_t icycle) const
const RooArgList & floatParsFinal() const
Return list of floating parameters after fit.
Int_t status() const
Return MINUIT status code.
UInt_t numStatusHistory() const
double minNll() const
Return minimized -log(L) value.
Collection class for internal use, storing a collection of RooAbsArg pointers in a doubly linked list...
Wrapper class around ROOT::Math::Minimizer that provides a seamless interface between the minimizer f...
auto fitter()
Return underlying ROOT fitter object.
RooFit::OwningPtr< RooFitResult > save(const char *name=nullptr, const char *title=nullptr)
Save and return a RooFitResult snapshot of current minimizer status.
int minos()
Execute MINOS.
int hesse()
Execute HESSE.
void optimizeConst(int flag) R__DEPRECATED(6
If flag is true, perform constant term optimization on function being minimized.
int minimize(const char *type, const char *alg=nullptr)
Minimise the function passed in the constructor.
void setStrategy(int istrat)
Change MINUIT strategy to istrat.
static RooMsgService & instance()
Return reference to singleton instance.
Implementation of a RooCacheManager<RooAbsCacheElement> that specializes in the storage of cache elem...
Efficient implementation of a product of PDFs of the form.
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'.
bool hasBinning(const char *name) const override
Returns true if variable has a binning named 'name'.
Facilitates simultaneous fitting of multiple PDFs to subsets of a given dataset.
static RooAbsData * GenerateAsimovData(const RooAbsPdf &pdf, const RooArgSet &observables)
generate the asimov data for the observables (not the global ones) need to deal with the case of a si...
A RooAbsArg implementing string values.
Joins several RooAbsCategoryLValue objects into a single category.
bool setIndex(value_type index, bool printError=true) override
Set the value of the super category to the specified index.
Persistable container for RooFit projects.
Using a TBrowser one can browse all ROOT objects.
static TCanvas * MakeDefCanvas()
Static function to build a default canvas.
TClass instances represent classes, structs and namespaces in the ROOT type system.
static TClass * GetClass(const char *name, Bool_t load=kTRUE, Bool_t silent=kFALSE)
Static method returning pointer to TClass of the specified class name.
This class stores the date and time with a precision of one second in an unsigned 32 bit word (950130...
const char * AsString() const
Return the date & time as a string (ctime() format).
Describe directory structure in memory.
virtual Int_t GetValue(const char *name, Int_t dflt) const
Returns the integer value for a resource.
A TGraphErrors is a TGraph with error bars.
A TGraph is an object made of two arrays X and Y with npoints each.
void SetNameTitle(const char *name="", const char *title="") override
Set graph name and title.
Book space in a file, create I/O buffers, to fill them, (un)compress them.
This class displays a legend box (TPaveText) containing several legend entries.
TMatrixTBase< Element > & ResizeTo(Int_t nrows, Int_t ncols, Int_t=-1) override
Set size of the matrix to nrows x ncols New dynamic elements are created, the overlapping part of the...
The TNamed class is the base class for all named ROOT classes.
const char * GetName() const override
Returns name 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.
void RedrawAxis(Option_t *option="") override
Redraw the frame axis.
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.
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
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.
const char * AsString() const
Return UUID as string. Copy string immediately since it will be reused.
RooCmdArg WeightVar(const char *name="weight", bool reinterpretAsWeight=false)
RooCmdArg Offset(std::string const &mode)
RooCmdArg Optimize(Int_t flag=2) R__DEPRECATED(6
RooCmdArg Extended(bool flag=true)
RooCmdArg ExpectedData(bool flag=true)
double nll(double pdf, double weight, int binnedL, int doBinOffset)
MsgLevel
Verbosity level for RooMsgService::StreamConfig in RooMsgService.
void Sort(Index n, const Element *a, Index *index, Bool_t down=kTRUE)
Sort the n elements of the array a of generic templated type Element.
void writeStdoutLine(const char *msg)
bool isPythonInitialized()
void writeStderrLine(const char *msg)
#define BEGIN_XROOFIT_NAMESPACE
#define END_XROOFIT_NAMESPACE
double round_to_decimal(double value, int decimal_places)
void printCout(const char *msg)
void printCerr(const char *msg)
double round_to_digits(double value, int digits)