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>(
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());
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;
485 return sDefaultNLLOptions;
488std::shared_ptr<ROOT::Fit::FitConfig> xRooFit::createFitConfig()
490 return std::make_shared<ROOT::Fit::FitConfig>(*defaultFitConfig());
493std::shared_ptr<ROOT::Fit::FitConfig> xRooFit::defaultFitConfig()
495 if (sDefaultFitConfig)
496 return sDefaultFitConfig;
497 sDefaultFitConfig = std::make_shared<ROOT::Fit::FitConfig>();
498 auto &fitConfig = *sDefaultFitConfig;
499 fitConfig.SetParabErrors(
true);
500 fitConfig.MinimizerOptions().SetMinimizerType(
"Minuit2");
501 fitConfig.MinimizerOptions().SetErrorDef(0.5);
502 fitConfig.SetParabErrors(
true);
503 fitConfig.SetMinosErrors(
true);
504 fitConfig.MinimizerOptions().SetMaxFunctionCalls(
506 fitConfig.MinimizerOptions().SetMaxIterations(-1);
507 fitConfig.MinimizerOptions().SetStrategy(-1);
511 fitConfig.MinimizerOptions().SetPrintLevel(-2);
515#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 29, 00)
519 extraOpts->SetValue(
"HesseStrategySequence",
"23");
521 extraOpts->SetValue(
"StrategySequence",
"0s01s12s2m");
522 extraOpts->SetValue(
"HesseStrategySequence",
"2");
530 extraOpts->SetValue(
"TrackProgress", 30);
537 return sDefaultFitConfig;
542 return const_cast<ROOT::Math::IOptions *
>(defaultFitConfig()->MinimizerOptions().ExtraOptions());
553 std::cerr <<
msg << std::endl;
564 std::cout <<
msg << std::endl;
576 printCout(
"Minimization interrupted ... will exit as soon as possible");
593 vars.reset(std::unique_ptr<RooAbsCollection>(
f.getVariables())->selectByAttrib(
"Constant",
false));
626 throw std::runtime_error(
"Keyboard interrupt");
627 return std::numeric_limits<double>::quiet_NaN();
630 if (
prevMin == std::numeric_limits<double>::infinity()) {
634 if (!std::isnan(out)) {
646 std::stringstream
sout;
667 std::vector<std::pair<double, std::string>>
parDeltas;
670 parDeltas.emplace_back(std::pair<double, std::string>(
674 [](
auto &left,
auto &right) { return std::abs(left.first) > std::abs(right.first); });
676 for (i = 0; i < std::min(3,
int(
parDeltas.size())); i++) {
690 if (
gROOT->FromPopUp() &&
gROOT->GetListOfBrowsers()->At(0)) {
692 std::string status =
sout.str();
696 if (status.find(
" : ") != std::string::npos) {
697 status_part = status.substr(0, status.find(
" : "));
698 status = status.substr(status.find(
" : ") + 3);
722 mutable double minVal = std::numeric_limits<double>::infinity();
723 mutable double prevMin = std::numeric_limits<double>::infinity();
732 std::shared_ptr<RooAbsCollection>
vars;
745 const std::shared_ptr<ROOT::Fit::FitConfig> &
_fitConfig,
746 const std::shared_ptr<RooLinkedList> &
nllOpts)
761 if (nll.getStringAttribute(
"userPars")) {
763 while (
st.NextToken()) {
774 auto _nllVars = std::unique_ptr<RooAbsCollection>(_nll->getVariables());
776 std::unique_ptr<RooAbsCollection> constPars(
_nllVars->selectByAttrib(
"Constant",
true));
778 std::unique_ptr<RooAbsCollection>
floatPars(
_nllVars->selectByAttrib(
"Constant",
false));
785#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 29, 00)
790 if (fitConfig.MinimizerOptions().ExtraOptions()) {
791 fitConfig.MinimizerOptions().ExtraOptions()->GetNamedValue(
"StrategySequence", s);
792 fitConfig.MinimizerOptions().ExtraOptions()->GetIntValue(
"TrackProgress",
_progress);
793 fitConfig.MinimizerOptions().ExtraOptions()->GetRealValue(
"BoundaryCheck",
boundaryCheck);
794 fitConfig.MinimizerOptions().ExtraOptions()->GetIntValue(
"LogSize",
logSize);
795 fitConfig.MinimizerOptions().ExtraOptions()->GetIntValue(
"HesseStrategy",
hesseStrategy);
796 fitConfig.MinimizerOptions().ExtraOptions()->GetNamedValue(
"HesseStrategySequence",
hs);
807 if (
auto keys =
nllDir->GetListOfKeys(); keys) {
808 for (
auto &&k : *keys) {
810 if (cl->InheritsFrom(
"RooFitResult")) {
827 for (
auto &
p : *constPars) {
834 _p->getCurrentIndex() !=
c->getCurrentIndex()) {
846 if (!_p->getAttribute(
"global") && std::abs(_p->getVal() -
v->getVal()) > 1
e-12) {
869 if (nll.getAttribute(
"readOnly"))
872 int printLevel = fitConfig.MinimizerOptions().PrintLevel();
878 if (
floatPars->empty() || fitConfig.MinimizerOptions().MaxFunctionCalls() == 1) {
879 std::shared_ptr<RooFitResult>
result;
883 result = std::make_shared<RooFitResult>();
891 result->setCovarianceMatrix(
d);
893 result->setMinNLL(_nll->getVal());
903 if (!
cacheDir->GetDirectory(nll.GetName()))
905 if (
auto dir =
cacheDir->GetDirectory(nll.GetName()); dir) {
911 if (!dir->FindKey(
nllOpts->GetName())) {
924 std::shared_ptr<RooFitResult> out;
929 if (
p->isCategory()) {
938 std::shared_ptr<const RooFitResult>
bestFr;
939 for (
auto c : allCats) {
941 Info(
"minimize",
"Minimizing with discrete %s",
c.first.c_str());
944 Warning(
"minimize",
"Minimization with discrete %s failed",
c.first.c_str());
952 floatCats.setAttribAll(
"Constant",
false);
958 out = std::make_shared<RooFitResult>(*
bestFr);
959 const_cast<RooArgList &
>(out->floatParsFinal())
960 .addClone(*std::unique_ptr<RooAbsCollection>(out->constPars().selectCommon(
floatCats)));
966 bool restore = !fitConfig.UpdateAfterFit();
967 bool minos = fitConfig.MinosErrors();
970 int strategy = fitConfig.MinimizerOptions().Strategy();
977 std::unique_ptr<RooMinimizer>
_minimizerPtr = std::make_unique<RooMinimizer>(*_nll);
979 _minimizer->
fitter()->Config() = fitConfig;
991 bool autoMaxCalls = (_minimizer->
fitter()->Config().MinimizerOptions().MaxFunctionCalls() == 0);
993 _minimizer->
fitter()->Config().MinimizerOptions().SetMaxFunctionCalls(
996 if (_minimizer->
fitter()->Config().MinimizerOptions().MaxIterations() == 0) {
997 _minimizer->
fitter()->Config().MinimizerOptions().SetMaxIterations(500 *
floatPars->size());
1001 bool hesse = _minimizer->
fitter()->Config().ParabErrors();
1002 _minimizer->
fitter()->Config().SetParabErrors(
1004 _minimizer->
fitter()->Config().SetMinosErrors(
false);
1005 _minimizer->
fitter()->Config().SetUpdateAfterFit(
true);
1019 if (
minim ==
"Minuit2") {
1026 Warning(
"minimize",
"Strategy %d not specified in StrategySequence %s ... defaulting to start of sequence",
1030 }
else if (
minim ==
"Minuit")
1039 algo =
"migradImproved";
1049 std::unique_ptr<RooMinimizer>
_minimizerPtr2 = std::make_unique<RooMinimizer>(*_nll);
1060 fff->prevMin =
fff->minVal;
1070 fff->fState =
minim +
algo + std::to_string(_minimizer->
fitter()->Config().MinimizerOptions().Strategy());
1074 }
catch (
const std::exception &
e) {
1075 std::cerr <<
"Exception while minimizing: " <<
e.what() << std::endl;
1084 throw std::runtime_error(
"Keyboard interrupt while minimizing");
1088 status = _minimizer->
fitter()
1091 minim = _minimizer->
fitter()->Config().MinimizerType();
1093 _minimizer->
fitter()->Config().MinimizerAlgoType() +
1094 std::to_string(_minimizer->
fitter()->Config().MinimizerOptions().Strategy()),
1096 if (status % 1000 == 0)
1099 if (status == 4 &&
minim !=
"Minuit") {
1101 Warning(
"fitTo",
"%s Hit max function calls of %d",
fitName.Data(),
1102 _minimizer->
fitter()->Config().MinimizerOptions().MaxFunctionCalls());
1106 Warning(
"fitTo",
"will try doubling this");
1107 _minimizer->
fitter()->Config().MinimizerOptions().SetMaxFunctionCalls(
1108 _minimizer->
fitter()->Config().MinimizerOptions().MaxFunctionCalls() * 2);
1109 _minimizer->
fitter()->Config().MinimizerOptions().SetMaxIterations(
1110 _minimizer->
fitter()->Config().MinimizerOptions().MaxIterations() * 2);
1120 fitName.Data(), _minimizer->
fitter()->Config().MinimizerType().c_str(),
1121 _minimizer->
fitter()->Config().MinimizerAlgoType().c_str(), status,
1122 _minimizer->
fitter()->Result().Edm(),
1123 _minimizer->
fitter()->Config().MinimizerOptions().Tolerance(),
1124 _minimizer->
fitter()->Config().MinimizerOptions().Strategy(),
tries)
1150 Warning(
"fitTo",
"%s final status is %d",
fitName.Data(), status);
1159 int miniStrat = _minimizer->
fitter()->Config().MinimizerOptions().Strategy();
1160 double dCovar = std::numeric_limits<double>::quiet_NaN();
1198 "HesseStrategy %d not specified in HesseStrategySequence %s ... defaulting to start of sequence",
1202 while (
sIdx != -1) {
1207 if (_minimizer->
fitter()->GetMinimizer()->CovMatrixStatus() == 3) {
1223 fff->counter2 =
fff->counter;
1233 auto _status = _minimizer->
hesse();
1257 TString::Format(
"Hesse%d", _minimizer->
fitter()->Config().MinimizerOptions().Strategy()), _status));
1261 throw std::runtime_error(
"Keyboard interrupt while hesse calculating");
1263 if ((_status != 0 || _minimizer->
fitter()->GetMinimizer()->CovMatrixStatus() != 3) && status == 0 &&
1266 _minimizer->
fitter()->GetMinimizer()->CovMatrixStatus())
1270 if (_status == 0 && _minimizer->
fitter()->GetMinimizer()->CovMatrixStatus() == 3) {
1273 }
else if (_status == 0) {
1285 if (
gEnv->
GetValue(
"XRooFit.ResumeInvalidFits",
false) &&
1294 if (status == 0 &&
minos) {
1295 if (std::unique_ptr<RooAbsCollection>
mpars(
floatPars->selectByAttrib(
"minos",
true)); !
mpars->empty()) {
1297 fff->fState =
"Minos";
1299 fff->prevMin =
fff->minVal;
1313 if (out->status() == -1 && !_minimizer->
fitter()->Result().IsValid() && _minimizer->
fitter()->Result().Status()) {
1314 out->setStatus(_minimizer->
fitter()->Result().Status());
1319 if (out->status() == 0 && out->covQual() != 3 && hesse) {
1320 if (out->covQual() == 2) {
1329 out->edm() > _minimizer->
fitter()->Config().MinimizerOptions().Tolerance() * 1
e-2 && out->status() != 3) {
1332 std::stringstream
ss;
1333 ss <<
"Warning: post-Hesse edm " << out->edm()
1334 <<
" > 10xMaxEDM (MaxEDM=" << _minimizer->
fitter()->Config().MinimizerOptions().Tolerance() * 1
e-3
1335 <<
"). Consider increasing your minimization strategy";
1347 if (!std::isnan(
dCovar)) {
1349 .addClone(
RooRealVar(
".dCovar",
"dCovar from minimization",
dCovar),
true);
1360 double vRange =
v->getMax() -
v->getMin();
1366 auto tmp =
v->getVal();
1367 v->setVal(
v->getMin());
1370 static_cast<RooRealVar *
>(out->floatParsFinal().find(
v->GetName()))->
setVal(
v->getMin());
1379 if (
v->hasRange(
"physical"))
1384 (
v->getMin() >
v->getVal() -
v->getError() ||
v->getMax() <
v->getVal() +
v->getError())) {
1386 Info(
"minimize",
"PARLIM: %s (%f +/- %f) range (%f - %f)",
v->GetName(),
v->getVal(),
v->getError(),
1387 v->getMin(),
v->getMax());
1394 Warning(
"minimize",
"BOUNDCHK: Parameters within %g%% limit in fit result: %s",
boundaryCheck * 100,
1399 Warning(
"minimize",
"BOUNDCHK: Parameters near limit in fit result");
1431 out->setMinNLL(_nll->getVal());
1434 for (
auto o : out->floatParsFinal()) {
1436 v && !
v->
getAttribute(
"minos") && !
v->getAttribute(
"xminos") && !
v->getAttribute(
"xMinos"))
1437 v->removeAsymError();
1450 if (out && out->status() == 0 &&
minos) {
1452 for (
auto label : {
"xminos",
"xMinos"}) {
1453 std::unique_ptr<RooAbsCollection> pars(
floatPars->selectByAttrib(label,
true));
1454 for (
auto p : *pars) {
1455 Info(
"minimize",
"Computing xminos error for %s",
p->GetName());
1467 if (out && !
logs.empty()) {
1469#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 28, 00)
1470 const_cast<RooArgList &
>(out->constPars()).addOwned(std::make_unique<RooStringVar>(
".log",
"log",
logs.c_str()));
1479 if (!
cacheDir->GetDirectory(nll.GetName()))
1481 if (
auto dir =
cacheDir->GetDirectory(nll.GetName()); dir) {
1487 if (!dir->FindKey(
nllOpts->GetName())) {
1494 if (!fitConfig.MinimizerOptions().ExtraOptions()->GetValue(
"Name",
configName)) {
1500 dir->WriteObject(&fitConfig,
configName.data());
1503#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 28, 00)
1505 .addOwned(std::make_unique<RooStringVar>(
".fitConfigName",
"fitConfigName",
configName.c_str()));
1510 dir->WriteObject(out.get(), out->GetName());
1524 const std::shared_ptr<ROOT::Fit::FitConfig> &
_fitConfig)
1527 auto par =
dynamic_cast<RooRealVar *
>(std::unique_ptr<RooArgSet>(nll.getVariables())->find(
parName));
1538 bool pErrs = fitConfig.ParabErrors();
1539 fitConfig.SetParabErrors(
false);
1540 double mErrs = fitConfig.MinosErrors();
1541 fitConfig.SetMinosErrors(
false);
1550 bool isConst = par->isConstant();
1551 par->setConstant(
true);
1573 return std::numeric_limits<double>::quiet_NaN();
1576 status +=
result->status() * 10;
1582 std::cout <<
"Warning: Alternative best-fit of " << par->GetName() <<
" @ " <<
val_guess <<
" vs "
1583 <<
val_best <<
" (delta=" << tmu / 2. <<
")" << std::endl;
1589 status = (status / 10) * 10 + 1;
1602 std::cout <<
"NLL min: " <<
nll_min << std::endl;
1603 std::cout <<
"N_sigma*sigma(pre): " << std::abs(
val_pre -
val_best) << std::endl;
1604 std::cout <<
"sigma(guess): " <<
sigma_guess << std::endl;
1605 std::cout <<
"par(guess): " <<
val_guess + corr << std::endl;
1606 std::cout <<
"true val: " <<
val_best << std::endl;
1607 std::cout <<
"tmu: " << tmu << std::endl;
1608 std::cout <<
"Precision: " <<
sigma_guess * precision << std::endl;
1609 std::cout <<
"Correction: " << (-corr < 0 ?
" " :
"") << -corr << std::endl;
1610 std::cout <<
"N_sigma*sigma(guess): " << std::abs(
val_guess -
val_best) << std::endl;
1611 std::cout << std::endl;
1636 status = (status / 10) * 10 + 3;
1644 status = (status / 10) * 10 + 2;
1648 status = (status / 10) * 10 + 2;
1654 std::cout <<
"Finished in " <<
nrItr <<
" iterations." << std::endl;
1656 std::cout << std::endl;
1662 par_hat->setError(std::numeric_limits<double>::quiet_NaN());
1663 double lo =
par_hat->getErrorLo();
1665 if (std::isnan(
hi)) {
1671 if (std::isnan(lo)) {
1678 fitConfig.SetParabErrors(
pErrs);
1679 fitConfig.SetMinosErrors(
mErrs);
1700 std::deque<RooAbsArg *>
topPdfs;
1702 for (
auto p :
w.allPdfs()) {
1703 if (
p->hasClients())
1706 if (
p->getAttribute(
"hypoTest")) {
1713 Error(
"hypoTest",
"Cannot find top-level pdf in workspace");
1715 }
else if (
topPdfs.size() > 1) {
1718 Error(
"hypoTest",
"Multiple top-level pdfs. Flag which one to test with "
1719 "w->pdf(\"pdfName\")->setAttribute(\"hypoTest\",true)");
1722 Error(
"hypoTest",
"Multiple top-level pdfs flagged for hypoTest -- pick one.");
1728 Info(
"hypoTest",
"Using PDF: %s", model->GetName());
1734 std::shared_ptr<RooArgSet>
obsGlobs =
nullptr;
1736 for (
auto p :
w.allData()) {
1738 Error(
"hypoTest",
"Multiple datasets in workspace. Flag which one to test with "
1739 "w->data(\"dataName\")->setAttribute(\"hypoTest\",true)");
1746 Error(
"hypoTest",
"No data -- cannot determine observables");
1750 Info(
"hypoTest",
"Using Dataset: %s",
obsData->GetName());
1753 auto _globs = xRooNode(
w).datasets()[
obsData->GetName()]->globs();
1754 obsGlobs = std::make_shared<RooArgSet>();
1756 Info(
"hypoTest",
"Using Globs: %s", (
obsGlobs->empty()) ?
" <NONE>" :
obsGlobs->contentsString().c_str());
1761 auto _vars = std::unique_ptr<RooArgSet>(model->getVariables());
1764 for (
auto _v : *_vars) {
1769 if (poi.
size() > 1) {
1774 if (!args.
empty()) {
1778 Error(
"hypoTest",
"No POI detected: add the hypoPoints binning to at least one non-const model parameter e.g.:\n "
1779 "w->var(\"mu\")->setBinning(RooUniformBinning(0.5,10.5,10),\"hypoPoints\"))");
1792 nll.SetFitConfig(fitConfig);
1794 if (poi.
size() == 1) {
1797 double altVal = (mu->getStringAttribute(
"altVal")) ?
TString(mu->getStringAttribute(
"altVal")).Atof()
1798 : std::numeric_limits<double>::quiet_NaN();
1800 if (std::isnan(
altVal) && mu->hasRange(
"physical")) {
1802 altVal = mu->getMin(
"physical");
1803 Info(
"hypoTest",
"No altVal specified - using min of given physical range = %g",
altVal);
1805 if (!std::isnan(
altVal)) {
1806 Info(
"hypoTest",
"alt hypo: %g - CLs activated",
altVal);
1808 Info(
"hypoTest",
"No altVal found - to specify setStringAttribute(\"altVal\",\"<value>\") on POI or set "
1809 "the physical range");
1812 bool doCLs = !std::isnan(
altVal) && std::abs(mu->getMin(
"hypoPoints")) >
altVal &&
1813 std::abs(mu->getMax(
"hypoPoints")) >
altVal;
1815 const char *
sCL = (
doCLs) ?
"CLs" :
"null";
1816 Info(
"hypoTest",
"%s testing active",
sCL);
1826 std::vector<int>
expSig = {-2, -1, 0, 1, 2};
1829 std::map<int, TGraphErrors>
exp_pcls;
1830 std::map<int, TGraphErrors>
exp_cls;
1839 double _out = std::numeric_limits<double>::quiet_NaN();
1841 for (
int i = 0; i <
pValues.GetN(); i++) {
1847 ((1. -
CL) -
pValues.GetPointY(i - 1)) /
1857 obs_ts->SetPoint(obs_ts->GetN(),
testVal,
hp.pll().first);
1858 obs_ts->SetPointError(obs_ts->GetN() - 1, 0,
hp.pll().second);
1867 (
doCLs) ?
hp.pCLs_asymp(s).first :
hp.pNull_asymp(s).first);
1870 Info(
"hypoTest",
"%s=%g: %s=%g sigma_mu=%g %s=%g", mu->GetName(),
testVal, obs_ts->GetName(),
1871 obs_ts->GetPointY(obs_ts->GetN() - 1),
hp.sigma_mu().first,
obs_pcls->GetName(),
1874 Info(
"hypoTest",
"%s=%g: %s=%g %s=%g", mu->GetName(),
testVal, obs_ts->GetName(),
1879 if (mu->getBins(
"hypoPoints") <= 0) {
1884 testPoint((mu->getMax(
"hypoPoints") + mu->getMin(
"hypoPoints")) / 2.);
1908 for (
int i = 0; i <= mu->getBins(
"hypoPoints"); i++) {
1909 testPoint((i == mu->getBins(
"hypoPoints")) ? mu->getBinning(
"hypoPoints").binHigh(i - 1)
1910 : mu->getBinning(
"hypoPoints").binLow(i));
1922 band2->SetNameTitle(
".pCLs_2sigma",
"2 sigma band");
1924 band2up->SetNameTitle(
".pCLs_2sigma_upUncert",
"");
1926 band2down->SetNameTitle(
".pCLs_2sigma_downUncert",
"");
1932 for (
int i = 0; i <
exp_pcls[2].GetN(); i++) {
1938 for (
int i =
exp_pcls[2].GetN() - 1; i >= 0; i--) {
1942 for (
int i = 0; i <
exp_pcls[-2].GetN(); i++) {
1946 for (
int i =
exp_pcls[-2].GetN() - 1; i >= 0; i--) {
1965 band2->SetNameTitle(
".pCLs_1sigma",
"1 sigma band");
1967 band2up->SetNameTitle(
".pCLs_1sigma_upUncert",
"");
1969 band2down->SetNameTitle(
".pCLs_1sigma_downUncert",
"");
1975 for (
int i = 0; i <
exp_pcls[1].GetN(); i++) {
1981 for (
int i =
exp_pcls[1].GetN() - 1; i >= 0; i--) {
1985 for (
int i = 0; i <
exp_pcls[-1].GetN(); i++) {
1989 for (
int i =
exp_pcls[-1].GetN() - 1; i >= 0; i--) {
2011 obs_pcls->Draw(
gPad->GetListOfPrimitives()->IsEmpty() ?
"ALP" :
"LP");
2013 obs_ts->SetLineColor(
kRed);
2014 obs_ts->SetMarkerColor(
kRed);
2018 auto l =
new TLegend(0.5, 0.6, 1. -
gPad->GetRightMargin(), 1. -
gPad->GetTopMargin());
2019 l->SetName(
"legend");
2020 l->AddEntry(obs_ts, obs_ts->GetTitle(),
"LPE");
2023 l->AddEntry(
expPlot,
"Expected",
"LFE");
2031 exp_cls[s].SetMarkerStyle(29);
2032 exp_cls[s].SetEditable(
false);
2047 double factor = pow(10.0,
digits - ceil(log10(std::abs(
value))));
2048 return std::round(
value * factor) / factor;
2060 if (!std::isinf(out.second)) {
2061 auto tmp = out.second;
2063 int expo = (out.second == 0) ? 0 : (
int)std::floor(std::log10(std::abs(out.second)));
2067 }
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.
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
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.
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 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)