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;
87 return RooCmdArg(
"ReuseNLL", flag, 0, 0, 0,
nullptr,
nullptr,
nullptr,
nullptr);
97 return RooCmdArg(
"StrategySequence", 0, 0, 0, 0, val);
134std::shared_ptr<const RooFitResult>
136 const std::pair<std::shared_ptr<RooAbsData>, std::shared_ptr<const RooAbsCollection>> &
data,
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);
190 if (!_globs->empty()) {
195 std::unique_ptr<RooArgSet> globs(_pdf->getObservables(t));
196 globs->snapshot(*toy_gobs);
197 if (!toy_gobs->
empty() &&
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));
218 bool foundServer =
false;
226 !(cClass && strcmp(cClass->
GetName(),
"SimpleGaussianConstraint") == 0)) {
229 <<
"xRooFit::generateFrom : constraint term " << thePdf->GetName() <<
" of type "
230 << className <<
" is a non-supported type - result might be not correct " << std::endl;
248 <<
"xRooFit::generateFrom : constraint term " << thePdf->GetName()
249 <<
" has no direct dependence on global observable- cannot generate it " << std::endl;
267 if (thetaGamma ==
nullptr) {
269 <<
"xRooFit::generateFrom : constraint term " << thePdf->GetName()
270 <<
" is a Gamma distribution and no server named theta is found. Assume that the Gamma "
283 <<
"xRooFit::generateFrom : constraint term " << thePdf->GetName()
284 <<
" constraint term has more server depending on nuisance- cannot generate it "
289 if (thetaGamma && thetaGamma->
getVal() > 0) {
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(),
316 _out.second.reset(toy_gobs);
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)
329 std::string cLabel =
c.first;
331 std::string cLabel =
c->GetName();
333 auto p = s->getPdf(cLabel.c_str());
336 auto toy = genSubPdf(p);
337 if (toy.second && _out.second)
338 *
const_cast<RooArgSet *
>(_out.second.get()) = *toy.second;
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()));
380 _out.first = std::make_unique<RooDataSet>(
"",
"Toy", _tmp,
RooFit::WeightVar(
"weightVar"));
381 _out.first->add(_tmp);
383 if (_pdf->canBeExtended()) {
393 _out.first = std::unique_ptr<RooDataSet>{_pdf->generate(*_obs,
RooFit::ExpectedData(expected))};
397 _out.first->SetName(
TUUID().AsString());
399 for (
auto &
b : binnings) {
401 auto binning =
b.second;
402 v->setBinning(*binning);
405 auto x =
dynamic_cast<RooRealVar *
>(_out.first->get()->find(
v->GetName()));
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());
415 out = genSubPdf(&pdf);
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();
470 out->Add(opt->Clone(
nullptr));
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);
516 auto extraOpts =
const_cast<ROOT::Math::IOptions *
>(fitConfig.MinimizerOptions().ExtraOptions());
517 extraOpts->
SetValue(
"OptimizeConst", 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");
531 extraOpts->SetValue(
"LogSize", 0);
532 extraOpts->SetValue(
"BoundaryCheck",
534 extraOpts->SetValue(
"TrackProgress", 30);
557 std::cerr << msg << std::endl;
568 std::cout << msg << std::endl;
579 if (signum == SIGINT) {
580 printCout(
"Minimization interrupted ... will exit as soon as possible");
585 me->oldHandlerr(signum);
591 fFunc(
"func",
"func", this,
f),
597 vars.reset(std::unique_ptr<RooAbsCollection>(
f.getVariables())->selectByAttrib(
"Constant",
false));
617 return fFunc->getParameters(observables, outputSet, stripDisconnected);
624 fFunc->printMultiline(os, contents, verbose,
indent);
628 fFunc->constOptimizeTestStatistic(opcode, doAlsoTrackingOpt);
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;
663 nRequired *= (nRequired - 1);
675 std::vector<std::pair<double, std::string>> parDeltas;
676 parDeltas.reserve(
minPars.size());
678 parDeltas.emplace_back(std::pair<double, std::string>(
681 std::sort(parDeltas.begin(), parDeltas.end(),
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++) {
685 if (parDeltas.at(i).first == 0)
689 sout << parDeltas.at(i).second << (parDeltas.at(i).first >= 0 ?
"+" :
"-") <<
"="
690 << std::abs(parDeltas.at(i).first) <<
"(" <<
minPars.getRealValue(parDeltas.at(i).second.c_str())
693 if (i <
int(parDeltas.size()) && parDeltas.at(i).first != 0)
698 if (
gROOT->FromPopUp() &&
gROOT->GetListOfBrowsers()->At(0)) {
699 auto browser =
dynamic_cast<TBrowser *
>(
gROOT->GetListOfBrowsers()->At(0));
700 std::string status = sout.str();
703 std::string status_part;
704 if (status.find(
" : ") != std::string::npos) {
705 status_part = status.substr(0, status.find(
" : "));
706 status = status.substr(status.find(
" : ") + 3);
708 status_part = status;
711 browser->SetStatusText(status_part.c_str(), col);
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)
758 auto &fitConfig = *myFitConfig;
762 TString resultTitle = nll.getStringAttribute(
"fitresultTitle");
764 if (resultTitle ==
"")
769 if (nll.getStringAttribute(
"userPars")) {
770 TStringToken st(nll.getStringAttribute(
"userPars"),
",");
773 TString parVal = nll.getStringAttribute(parName);
782 auto _nllVars = std::unique_ptr<RooAbsCollection>(_nll->getVariables());
784 std::unique_ptr<RooAbsCollection> constPars(_nllVars->selectByAttrib(
"Constant",
true));
785 constPars->add(fUserPars,
true);
786 std::unique_ptr<RooAbsCollection> floatPars(_nllVars->selectByAttrib(
"Constant",
false));
789 double boundaryCheck = 0;
793#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 29, 00)
794 int hesseStrategy = 3;
796 int hesseStrategy = 2;
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);
814 if (
auto nllDir = cacheDir->
GetDirectory(nll.GetName()); nllDir) {
815 if (
auto keys = nllDir->GetListOfKeys(); keys) {
816 for (
auto &&k : *keys) {
818 if (cl->InheritsFrom(
"RooFitResult")) {
820 nllDir->GetList() ?
dynamic_cast<StoredFitResult *
>(nllDir->GetList()->FindObject(k->GetName()))
827 nllDir->Add(storedFr);
832 if (!cachedFit->floatParsFinal().equals(*floatPars)) {
835 for (
auto &p : *constPars) {
840 dynamic_cast<RooAbsCategory *
>(cachedFit->constPars().find(p->GetName()));
842 _p->getCurrentIndex() !=
c->getCurrentIndex()) {
851 if (
auto _p =
dynamic_cast<RooAbsReal *
>(cachedFit->constPars().find(p->GetName())); _p) {
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;
889 parsList.
add(*floatPars);
891 result = std::make_shared<RooFitResult>();
893 result->SetTitle(resultTitle);
894 result->setFinalParList(parsList);
895 result->setInitParList(parsList);
898 d.ResizeTo(parsList.
size(), parsList.
size());
899 result->setCovarianceMatrix(
d);
900 result->setCovQual(floatPars->empty() ? 3 : -1);
901 result->setMinNLL(_nll->getVal());
903 result->setStatus(floatPars->empty() ? 0 : 1);
905 std::vector<std::pair<std::string, int>> statusHistory;
906 statusHistory.emplace_back(std::make_pair(
"EVAL",
result->status()));
907 result->setStatusHistory(statusHistory);
912 cacheDir->
mkdir(nll.GetName());
913 if (
auto dir = cacheDir->
GetDirectory(nll.GetName()); dir) {
916 if (strlen(nllOpts->GetName()) == 0) {
917 nllOpts->SetName(
TUUID().AsString());
919 if (!dir->FindKey(nllOpts->GetName())) {
920 dir->WriteObject(nllOpts.get(), nllOpts->GetName());
932 std::shared_ptr<RooFitResult> out;
936 for (
auto p : *floatPars) {
937 if (p->isCategory()) {
941 if (!floatCats.
empty()) {
942 RooSuperCategory allCats(
"floatCats",
"Floating categorical parameters", floatCats);
943 std::unique_ptr<RooAbsCollection> _snap(floatCats.
snapshot());
946 std::shared_ptr<const RooFitResult> bestFr;
947 for (
auto c : allCats) {
949 Info(
"minimize",
"Minimizing with discrete %s",
c.first.c_str());
950 auto fr =
minimize(nll, _fitConfig, nllOpts);
952 Warning(
"minimize",
"Minimization with discrete %s failed",
c.first.c_str());
955 if (!bestFr || fr->minNll() < bestFr->minNll()) {
966 out = std::make_shared<RooFitResult>(*bestFr);
967 const_cast<RooArgList &
>(out->floatParsFinal())
968 .
addClone(*std::unique_ptr<RooAbsCollection>(out->constPars().selectCommon(floatCats)));
971 out->SetName(
TUUID().AsString());
974 bool restore = !fitConfig.UpdateAfterFit();
975 bool minos = fitConfig.MinosErrors();
978 int strategy = fitConfig.MinimizerOptions().Strategy();
980 if (_progress && printLevel >= -2) {
984 auto logger = (logSize > 0) ? std::make_unique<cout_redirect>(logs, logSize) :
nullptr;
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(
1002 500 * floatPars->size() * floatPars->size());
1004 if (_minimizer->
fitter()->Config().MinimizerOptions().MaxIterations() == 0) {
1005 _minimizer->
fitter()->Config().MinimizerOptions().SetMaxIterations(500 * floatPars->size());
1008 std::unique_ptr<RooAbsCollection> floatInitVals(floatPars->snapshot());
1009 bool hesse = _minimizer->
fitter()->Config().ParabErrors();
1010 _minimizer->
fitter()->Config().SetParabErrors(
1012 _minimizer->
fitter()->Config().SetMinosErrors(
false);
1013 _minimizer->
fitter()->Config().SetUpdateAfterFit(
true);
1015 std::vector<std::pair<std::string, int>> statusHistory;
1020 TString actualFirstMinimizer = _minimizer->
fitter()->Config().MinimizerType();
1024 int constOptimize = 2;
1025 _minimizer->
fitter()->Config().MinimizerOptions().ExtraOptions()->GetValue(
"OptimizeConst", constOptimize);
1026 if (constOptimize) {
1045 TString minim = _minimizer->
fitter()->Config().MinimizerType();
1046 TString algo = _minimizer->
fitter()->Config().MinimizerAlgoType();
1047 if (minim ==
"Minuit2") {
1048 if (strategy == -1) {
1051 sIdx = m_strategy.
Index(
'0' + strategy);
1054 Warning(
"minimize",
"Strategy %d not specified in StrategySequence %s ... defaulting to start of sequence",
1055 strategy, m_strategy.
Data());
1058 }
else if (minim ==
"Minuit")
1059 sIdx = m_strategy.
Index(
'm');
1064 while (tries < maxtries && sIdx != -1) {
1065 if (m_strategy(sIdx) ==
'm') {
1067 algo =
"migradImproved";
1068 }
else if (m_strategy(sIdx) ==
's') {
1070 }
else if (m_strategy(sIdx) ==
'h') {
1072 }
else if (m_strategy(sIdx) ==
'r') {
1076 *floatPars = *floatInitVals;
1077 std::unique_ptr<RooMinimizer> _minimizerPtr2 = std::make_unique<RooMinimizer>(*_nll);
1078 auto initPars = _minimizerPtr2->fitter()->Config().ParamsSettings();
1079 auto initOpts = _minimizerPtr2->fitter()->Config().MinimizerOptions();
1080 _minimizerPtr2->fitter()->Config() = _minimizer->
fitter()->Config();
1081 _minimizerPtr2->fitter()->Config().SetParamsSettings({});
1082 _minimizerPtr = std::move(_minimizerPtr2);
1083 _minimizer = _minimizerPtr.get();
1085 statusHistory.emplace_back(
"Reset", 0);
1088 fff->prevMin = fff->minVal;
1092 strategy =
int(m_strategy(sIdx) -
'0');
1098 fff->fState = minim + algo + std::to_string(_minimizer->
fitter()->Config().MinimizerOptions().Strategy());
1101 status = _minimizer->
minimize(minim, algo);
1102 }
catch (
const std::exception &
e) {
1103 std::cerr <<
"Exception while minimizing: " <<
e.what() << std::endl;
1105 if (first && actualFirstMinimizer != _minimizer->
fitter()->Config().MinimizerType())
1106 actualFirstMinimizer = _minimizer->
fitter()->Config().MinimizerType();
1112 throw std::runtime_error(
"Keyboard interrupt while minimizing");
1116 status = _minimizer->
fitter()
1119 minim = _minimizer->
fitter()->Config().MinimizerType();
1120 statusHistory.emplace_back(_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") {
1128 if (printLevel >= -1) {
1129 Warning(
"fitTo",
"%s Hit max function calls of %d", fitName.
Data(),
1130 _minimizer->
fitter()->Config().MinimizerOptions().MaxFunctionCalls());
1133 if (printLevel >= -1)
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);
1146 if (printLevel >= -1) {
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)
1157 if (sIdx == m_strategy.
Length() - 1) {
1164 auto mini_sIdx = sIdx;
1177 if (printLevel >= -1 && status != 0) {
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();
1195 if (hesse && m_hessestrategy.
Length() != 0 &&
1196 (m_strategy(sIdx) ==
'h' || (_minimizer->
fitter()->Result().IsValid()))) {
1219 if (hesseStrategy == -1) {
1222 sIdx = m_hessestrategy.
Index(
'0' + hesseStrategy);
1226 "HesseStrategy %d not specified in HesseStrategySequence %s ... defaulting to start of sequence",
1227 hesseStrategy, m_hessestrategy.
Data());
1230 while (sIdx != -1) {
1231 hesseStrategy =
int(m_hessestrategy(sIdx) -
'0');
1233 if (strategy == 2 && hesseStrategy == 2) {
1235 if (_minimizer->
fitter()->GetMinimizer()->CovMatrixStatus() == 3) {
1238 if (sIdx >= m_hessestrategy.
Length() - 1) {
1245 _minimizer->
fitter()->Config().MinimizerOptions().SetStrategy(hesseStrategy);
1250 fff->fState =
TString::Format(
"Hesse%d", _minimizer->
fitter()->Config().MinimizerOptions().Strategy());
1251 fff->counter2 = fff->counter;
1261 auto _status = _minimizer->
hesse();
1284 statusHistory.push_back(std::pair<std::string, int>(
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) {
1303 statusHistory.back().second = _minimizer->
fitter()->GetMinimizer()->CovMatrixStatus();
1306 if (sIdx >= m_hessestrategy.
Length() - 1) {
1313 if (
gEnv->GetValue(
"XRooFit.ResumeInvalidFits",
false) &&
1314 (statusHistory.back().second == 1 || statusHistory.back().second == 2) &&
1315 mini_sIdx < (m_strategy.
Length() - 1)) {
1317 goto resetMinimization;
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;
1329 auto _status = _minimizer->
minos(*mpars);
1330 statusHistory.push_back(std::pair(
"Minos", _status));
1339 out = std::unique_ptr<RooFitResult>{_minimizer->
save(fitName, resultTitle)};
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) {
1360 if (printLevel >= -2 && miniStrat < _minimizer->fitter()->Config().MinimizerOptions().Strategy() && hesse &&
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";
1374 out->setStatusHistory(statusHistory);
1379 if (!std::isnan(dCovar)) {
1384 if (boundaryCheck) {
1387 int limit_status = 0;
1388 std::string listpars;
1392 double vRange =
v->getMax() -
v->getMin();
1393 if (
v->getMin() >
v->getVal() - vRange * boundaryCheck ||
1394 v->getMax() <
v->getVal() + vRange * boundaryCheck) {
1398 auto tmp =
v->getVal();
1399 v->setVal(
v->getMin());
1400 double boundary_nll = _nll->getVal();
1401 if (boundary_nll <= out->minNll()) {
1402 static_cast<RooRealVar *
>(out->floatParsFinal().find(
v->GetName()))->
setVal(
v->getMin());
1403 out->setMinNLL(boundary_nll);
1411 if (
v->hasRange(
"physical"))
1413 listpars +=
v->GetName();
1416 (
v->getMin() >
v->getVal() -
v->getError() ||
v->getMax() <
v->getVal() +
v->getError())) {
1417 if (printLevel >= 0) {
1418 Info(
"minimize",
"PARLIM: %s (%f +/- %f) range (%f - %f)",
v->GetName(),
v->getVal(),
v->getError(),
1419 v->getMin(),
v->getMax());
1421 limit_status = 9000;
1424 if (limit_status == 900) {
1425 if (printLevel >= 0) {
1426 Warning(
"minimize",
"BOUNDCHK: Parameters within %g%% limit in fit result: %s", boundaryCheck * 100,
1429 }
else if (limit_status > 0) {
1430 if (printLevel >= 0)
1431 Warning(
"minimize",
"BOUNDCHK: Parameters near limit in fit result");
1435 statusHistory.emplace_back(
"BOUNDCHK", limit_status);
1436 out->setStatusHistory(statusHistory);
1437 out->setStatus(out->status() + limit_status);
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();
1473 if (fitConfig.MinimizerOptions().MinimizerType() != actualFirstMinimizer) {
1474 fitConfig.MinimizerOptions().SetMinimizerType(actualFirstMinimizer);
1477 if (_progress && printLevel >= -2) {
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());
1491 *floatPars = out->floatParsFinal();
1496 *floatPars = out->floatParsInit();
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()));
1508 if (out && cacheDir && cacheDir->
IsWritable()) {
1512 cacheDir->
mkdir(nll.GetName());
1513 if (
auto dir = cacheDir->
GetDirectory(nll.GetName()); dir) {
1516 if (strlen(nllOpts->GetName()) == 0) {
1517 nllOpts->SetName(
TUUID().AsString());
1519 if (!dir->FindKey(nllOpts->GetName())) {
1520 dir->WriteObject(nllOpts.get(), nllOpts->GetName());
1525 std::string configName;
1526 if (!fitConfig.MinimizerOptions().ExtraOptions()->GetValue(
"Name", configName)) {
1527 auto extraOpts =
const_cast<ROOT::Math::IOptions *
>(fitConfig.MinimizerOptions().ExtraOptions());
1529 extraOpts->SetValue(
"Name", configName.data());
1531 if (!dir->GetKey(configName.data())) {
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));
1568 auto &fitConfig = *myFitConfig;
1570 bool pErrs = fitConfig.ParabErrors();
1571 fitConfig.SetParabErrors(
false);
1572 double mErrs = fitConfig.MinosErrors();
1573 fitConfig.SetMinosErrors(
false);
1575 double val_best = par_hat->getVal();
1576 double val_err = (par_hat->hasError() ? par_hat->getError() : -1);
1577 double orig_err = val_err;
1578 double nll_min = ufit.
minNll();
1582 bool isConst = par->isConstant();
1583 par->setConstant(
true);
1585 auto findValue = [&](
double val_guess,
double N_sigma = 1,
double precision = 0.002,
int printLevel = 0) {
1588 double sigma_guess = std::abs((val_guess - val_best) / N_sigma);
1591 10 * precision * sigma_guess;
1592 bool lastOverflow =
false;
1593 bool lastUnderflow =
false;
1594 while (std::abs(val_pre - val_guess) > precision * sigma_guess) {
1595 val_pre = val_guess;
1596 if (val_guess > 0 && par->getMax() < val_guess)
1597 par->setMax(2 * val_guess);
1598 if (val_guess < 0 && par->getMin() > val_guess)
1599 par->setMin(2 * val_guess);
1600 par->setVal(val_guess);
1605 return std::numeric_limits<double>::quiet_NaN();
1607 double nll_val =
result->minNll();
1608 status +=
result->status() * 10;
1609 tmu = 2 * (nll_val - nll_min);
1610 sigma_guess = std::abs(val_guess - val_best) / sqrt(tmu);
1614 std::cout <<
"Warning: Alternative best-fit of " << par->GetName() <<
" @ " << val_guess <<
" vs "
1615 << val_best <<
" (delta=" << tmu / 2. <<
")" << std::endl;
1616 double new_guess = val_guess + (val_guess - val_best);
1617 val_best = val_guess;
1618 val_guess = new_guess;
1619 sigma_guess = std::abs((val_guess - val_best) / N_sigma);
1620 val_pre = val_guess - 10 * precision * sigma_guess;
1621 status = (status / 10) * 10 + 1;
1625 double corr = (val_pre - val_best - N_sigma * sigma_guess);
1630 if (printLevel > 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;
1645 if (val_guess > par->getMax()) {
1647 val_guess = par->getMin();
1650 lastOverflow =
true;
1651 lastUnderflow =
false;
1652 val_guess = par->getMax() - 1
e-12;
1653 }
else if (val_guess < par->getMin()) {
1654 if (lastUnderflow) {
1655 val_guess = par->getMin();
1658 lastOverflow =
false;
1659 lastUnderflow =
true;
1660 val_guess = par->getMin() + 1
e-12;
1662 lastUnderflow =
false;
1663 lastOverflow =
false;
1668 status = (status / 10) * 10 + 3;
1676 status = (status / 10) * 10 + 2;
1677 }
else if (lastUnderflow) {
1680 status = (status / 10) * 10 + 2;
1684 std::cout <<
"Found sigma for nll " << nll.GetName() <<
": " << (val_guess - val_best) / N_sigma << std::endl;
1686 std::cout <<
"Finished in " << nrItr <<
" iterations." << std::endl;
1688 std::cout << std::endl;
1689 return (val_guess - val_best) / N_sigma;
1694 par_hat->setError(std::numeric_limits<double>::quiet_NaN());
1695 double lo = par_hat->getErrorLo();
1696 double hi = par_hat->getErrorHi();
1697 if (std::isnan(
hi)) {
1698 hi = findValue(val_best + val_err, 1) + val_best -
1703 if (std::isnan(lo)) {
1704 lo = -findValue(val_best - val_err, -1) + val_best -
1708 par_hat->setError(orig_err);
1710 fitConfig.SetParabErrors(pErrs);
1711 fitConfig.SetMinosErrors(mErrs);
1712 par->setConstant(isConst);
1714 std::vector<std::pair<std::string, int>> statusHistory;
1718 statusHistory.emplace_back(
TString::Format(
"xMinos:%s", parName), status);
1719 const_cast<RooFitResult &
>(ufit).setStatusHistory(statusHistory);
1732 std::deque<RooAbsArg *> topPdfs;
1734 for (
auto p :
w.allPdfs()) {
1735 if (p->hasClients())
1737 flagCount += p->getAttribute(
"hypoTest");
1738 if (p->getAttribute(
"hypoTest")) {
1739 topPdfs.push_front(p);
1741 topPdfs.push_back(p);
1744 if (topPdfs.empty()) {
1745 Error(
"hypoTest",
"Cannot find top-level pdf in workspace");
1747 }
else if (topPdfs.size() > 1) {
1749 if (flagCount == 0) {
1750 Error(
"hypoTest",
"Multiple top-level pdfs. Flag which one to test with "
1751 "w->pdf(\"pdfName\")->setAttribute(\"hypoTest\",true)");
1753 }
else if (flagCount != 1) {
1754 Error(
"hypoTest",
"Multiple top-level pdfs flagged for hypoTest -- pick one.");
1758 model =
dynamic_cast<RooAbsPdf *
>(topPdfs.front());
1760 Info(
"hypoTest",
"Using PDF: %s", model->
GetName());
1765 RooAbsData *obsData =
nullptr;
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>();
1787 obsGlobs->addClone(_globs.argList());
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) {
1797 if (
auto v =
dynamic_cast<RooRealVar *
>(_v);
v &&
v->hasBinning(
"hypoPoints")) {
1801 if (poi.
size() > 1) {
1802 auto _const = std::unique_ptr<RooAbsCollection>(poi.
selectByAttrib(
"Constant",
true));
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\"))");
1823 xRooNLLVar
nll(*model, std::make_pair(obsData, obsGlobs.get()), *nllOpts);
1824 nll.SetFitConfig(fitConfig);
1826 if (poi.
size() == 1) {
1827 auto mu =
dynamic_cast<RooRealVar *
>(poi.
first());
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);
1850 auto obs_ts =
new TGraphErrors;
1851 obs_ts->SetNameTitle(
"obs_ts",
TString::Format(
"Observed TestStat;%s", mu->GetTitle()));
1852 auto obs_pcls =
new TGraphErrors;
1855 auto obs_cls =
new TGraphErrors;
1858 std::vector<int> expSig = {-2, -1, 0, 1, 2};
1859 if (std::isnan(altVal))
1861 std::map<int, TGraphErrors> exp_pcls;
1862 std::map<int, TGraphErrors> exp_cls;
1863 for (
auto &s : expSig) {
1865 TString::Format(
"Expected (%d#sigma) p_{%s};%s", s, sCL, mu->GetTitle()));
1867 TString::Format(
"Expected (%d#sigma) %s;%s", s, sCL, mu->GetTitle()));
1870 auto getLimit = [CL](TGraphErrors &pValues) {
1871 double _out = std::numeric_limits<double>::quiet_NaN();
1872 bool lastAbove =
false;
1873 for (
int i = 0; i < pValues.GetN(); i++) {
1874 bool thisAbove = pValues.GetPointY(i) >= (1. - CL);
1875 if (i != 0 && thisAbove != lastAbove) {
1878 _out = pValues.GetPointX(i - 1) + (pValues.GetPointX(i) - pValues.GetPointX(i - 1)) *
1879 ((1. - CL) - pValues.GetPointY(i - 1)) /
1880 (pValues.GetPointY(i) - pValues.GetPointY(i - 1));
1882 lastAbove = thisAbove;
1887 auto testPoint = [&](
double testVal) {
1888 auto hp =
nll.hypoPoint(mu->GetName(), testVal, altVal, pllType);
1889 obs_ts->SetPoint(obs_ts->GetN(), testVal, hp.pll().first);
1890 obs_ts->SetPointError(obs_ts->GetN() - 1, 0, hp.pll().second);
1892 if (nToysNull > 0) {
1895 obs_pcls->SetPoint(obs_pcls->GetN(), testVal, (doCLs) ? hp.pCLs_asymp().first : hp.pNull_asymp().first);
1896 obs_pcls->SetPointError(obs_pcls->GetN() - 1, 0, (doCLs) ? hp.pCLs_asymp().second : hp.pNull_asymp().second);
1897 for (
auto &s : expSig) {
1898 exp_pcls[s].SetPoint(exp_pcls[s].GetN(), testVal,
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(),
1904 obs_pcls->GetPointY(obs_pcls->GetN() - 1));
1906 Info(
"hypoTest",
"%s=%g: %s=%g %s=%g", mu->GetName(), testVal, obs_ts->GetName(),
1907 obs_ts->GetPointY(obs_ts->GetN() - 1), obs_pcls->GetName(), obs_pcls->GetPointY(obs_pcls->GetN() - 1));
1911 if (mu->getBins(
"hypoPoints") <= 0) {
1914 testPoint(mu->getMin(
"hypoPoints"));
1915 testPoint(mu->getMax(
"hypoPoints"));
1916 testPoint((mu->getMax(
"hypoPoints") + mu->getMin(
"hypoPoints")) / 2.);
1918 while (std::abs(obs_pcls->GetPointY(obs_pcls->GetN() - 1) - (1. - CL)) > 0.01) {
1920 double nextTest = getLimit(*obs_pcls);
1921 if (std::isnan(nextTest))
1923 testPoint(nextTest);
1925 for (
auto s : expSig) {
1926 while (std::abs(exp_pcls[s].GetPointY(exp_pcls[s].GetN() - 1) - (1. - CL)) > 0.01) {
1928 double nextTest = getLimit(exp_pcls[s]);
1929 if (std::isnan(nextTest))
1931 testPoint(nextTest);
1936 for (
auto &s : expSig)
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));
1946 obs_cls->SetPoint(obs_cls->GetN(), getLimit(*obs_pcls), 0.05);
1947 for (
auto &s : expSig) {
1948 exp_cls[s].SetPoint(exp_cls[s].GetN(), getLimit(exp_pcls[s]), 0.05);
1952 if (exp_pcls[2].GetN() > 1) {
1953 TGraph *band2 =
new TGraph;
1955 TGraph *band2up =
new TGraph;
1957 TGraph *band2down =
new TGraph;
1958 band2down->
SetNameTitle(
".pCLs_2sigma_downUncert",
"");
1964 for (
int i = 0; i < exp_pcls[2].GetN(); i++) {
1965 band2->
SetPoint(band2->
GetN(), exp_pcls[2].GetPointX(i),
1966 exp_pcls[2].GetPointY(i) - exp_pcls[2].GetErrorYlow(i));
1967 band2up->
SetPoint(band2up->
GetN(), exp_pcls[2].GetPointX(i),
1968 exp_pcls[2].GetPointY(i) + exp_pcls[2].GetErrorYhigh(i));
1970 for (
int i = exp_pcls[2].GetN() - 1; i >= 0; i--) {
1971 band2up->
SetPoint(band2up->
GetN(), exp_pcls[2].GetPointX(i),
1972 exp_pcls[2].GetPointY(i) - exp_pcls[2].GetErrorYlow(i));
1974 for (
int i = 0; i < exp_pcls[-2].GetN(); i++) {
1975 band2down->
SetPoint(band2down->
GetN(), exp_pcls[-2].GetPointX(i),
1976 exp_pcls[-2].GetPointY(i) + exp_pcls[-2].GetErrorYhigh(i));
1978 for (
int i = exp_pcls[-2].GetN() - 1; i >= 0; i--) {
1979 band2->
SetPoint(band2->
GetN(), exp_pcls[-2].GetPointX(i),
1980 exp_pcls[-2].GetPointY(i) + exp_pcls[-2].GetErrorYhigh(i));
1981 band2down->
SetPoint(band2down->
GetN(), exp_pcls[-2].GetPointX(i),
1982 exp_pcls[-2].GetPointY(i) - exp_pcls[-2].GetErrorYlow(i));
1987 auto ax =
static_cast<TNamed *
>(band2->
Clone(
".axis"));
1992 band2down->
Draw(
"F");
1995 if (exp_pcls[1].GetN() > 1) {
1996 TGraph *band2 =
new TGraph;
1998 TGraph *band2up =
new TGraph;
2000 TGraph *band2down =
new TGraph;
2001 band2down->
SetNameTitle(
".pCLs_1sigma_downUncert",
"");
2007 for (
int i = 0; i < exp_pcls[1].GetN(); i++) {
2008 band2->
SetPoint(band2->
GetN(), exp_pcls[1].GetPointX(i),
2009 exp_pcls[1].GetPointY(i) - exp_pcls[1].GetErrorYlow(i));
2010 band2up->
SetPoint(band2up->
GetN(), exp_pcls[1].GetPointX(i),
2011 exp_pcls[1].GetPointY(i) + exp_pcls[1].GetErrorYhigh(i));
2013 for (
int i = exp_pcls[1].GetN() - 1; i >= 0; i--) {
2014 band2up->
SetPoint(band2up->
GetN(), exp_pcls[1].GetPointX(i),
2015 exp_pcls[1].GetPointY(i) - exp_pcls[1].GetErrorYlow(i));
2017 for (
int i = 0; i < exp_pcls[-1].GetN(); i++) {
2018 band2down->
SetPoint(band2down->
GetN(), exp_pcls[-1].GetPointX(i),
2019 exp_pcls[-1].GetPointY(i) + exp_pcls[-1].GetErrorYhigh(i));
2021 for (
int i = exp_pcls[-1].GetN() - 1; i >= 0; i--) {
2022 band2->
SetPoint(band2->
GetN(), exp_pcls[-1].GetPointX(i),
2023 exp_pcls[-1].GetPointY(i) + exp_pcls[-1].GetErrorYhigh(i));
2024 band2down->
SetPoint(band2down->
GetN(), exp_pcls[-1].GetPointX(i),
2025 exp_pcls[-1].GetPointY(i) - exp_pcls[-1].GetErrorYlow(i));
2032 band2down->
Draw(
"F");
2035 TObject *expPlot =
nullptr;
2036 if (exp_cls[0].GetN() > 0) {
2037 exp_pcls[0].SetLineStyle(2);
2038 exp_pcls[0].SetFillColor(
kGreen);
2039 exp_pcls[0].SetMarkerStyle(0);
2040 expPlot = exp_pcls[0].DrawClone(
"L");
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");
2053 l->AddEntry(obs_pcls, obs_pcls->GetTitle(),
"LPE");
2055 l->AddEntry(expPlot,
"Expected",
"LFE");
2059 obs_cls->SetMarkerStyle(29);
2060 obs_cls->SetEditable(
false);
2061 obs_cls->Draw(
"LP");
2062 for (
auto s : expSig) {
2063 exp_cls[s].SetMarkerStyle(29);
2064 exp_cls[s].SetEditable(
false);
2065 exp_cls[s].DrawClone(
"LP");
2079 double factor = pow(10.0, digits - ceil(log10(std::abs(
value))));
2080 return std::round(
value * factor) / factor;
2084 const double multiplier = std::pow(10.0, decimal_places);
2085 return std::round(
value * multiplier) / multiplier;
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)));
2098 out.first = (expo >= 0) ? round(out.first) :
round_to_decimal(out.first, -expo);
2099 }
else if (out.second != 0) {
2100 out.first = (expo >= 0) ? round(out.first) :
round_to_decimal(out.first, -expo + 1);
ROOT::RRangeCast< T, true, Range_t > dynamic_range_cast(Range_t &&coll)
RooTemplateProxy< RooAbsReal > RooRealProxy
Compatibility typedef replacing the old RooRealProxy class.
int Int_t
Signed integer 4 bytes (int)
static void indent(ostringstream &buf, int indent_level)
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.
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 w
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
TMatrixTSym< Double_t > TMatrixDSym
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 RooCmdArg ReuseNLL(bool flag)
static RooCmdArg Tolerance(double value)
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 std::pair< std::shared_ptr< RooAbsData >, std::shared_ptr< const RooAbsCollection > > generateFrom(RooAbsPdf &pdf, const RooFitResult &fr, bool expected=false, int seed=0)
static TCanvas * hypoTest(RooWorkspace &w, const xRooFit::Asymptotics::PLLType &pllType=xRooFit::Asymptotics::Unknown)
static const char * GetVersion()
static ROOT::Math::IOptions * defaultFitConfigOptions()
static xRooNLLVar createNLL(const std::shared_ptr< RooAbsPdf > pdf, const std::shared_ptr< RooAbsData > data, const RooLinkedList &nllOpts)
static std::shared_ptr< ROOT::Fit::FitConfig > defaultFitConfig()
static std::shared_ptr< ROOT::Fit::FitConfig > createFitConfig()
static std::shared_ptr< const RooFitResult > fitTo(RooAbsPdf &pdf, const std::pair< std::shared_ptr< RooAbsData >, std::shared_ptr< const RooAbsCollection > > &data, const RooLinkedList &nllOpts, const ROOT::Fit::FitConfig &fitConf)
static RooCmdArg StrategySequence(const char *stratSeq)
static std::shared_ptr< RooLinkedList > sDefaultNLLOptions
static const char * GetVersionDate()
static std::shared_ptr< ROOT::Fit::FitConfig > sDefaultFitConfig
static RooCmdArg MaxIterations(int nIterations)
static std::shared_ptr< RooLinkedList > defaultNLLOptions()
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.
void SetValue(const char *name, double val)
generic methods for retrieving options
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.
RooWorkspace * _myws
! In which workspace do I live, if any
bool isConstant() const
Check if the "Constant" attribute is set.
RooWorkspace * workspace() const
const RefCountList_t & servers() const
List of all servers of this object.
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)
RooAbsArg * findServer(const char *name) const
Return server of this with name name. Returns nullptr if not found.
A space to attach TBranches.
virtual bool remove(const RooAbsArg &var, bool silent=false, bool matchByNameOnly=false)
Remove the specified argument from our list.
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...
Storage_t::size_type size() const
RooAbsArg * first() const
virtual bool addOwned(RooAbsArg &var, bool silent=false)
Add an argument and transfer the ownership to the collection.
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.
RooAbsReal()
coverity[UNINIT_CTOR] Default constructor
RooArgList is a container object that can hold multiple RooAbsArg objects.
RooArgSet is a container object that can hold multiple RooAbsArg objects.
RooArgSet * snapshot(bool deepCopy=true) const
Use RooAbsCollection::snapshot(), but return as RooArgSet.
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...
void optimizeConst(int flag)
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.
void setGlobalKillBelow(RooFit::MsgLevel level)
RooFit::MsgLevel globalKillBelow() const
Implementation of a RooCacheManager<RooAbsCacheElement> that specializes in the storage of cache elem...
void setNoRounding(bool flag=true)
Switch off/on rounding of x to the nearest integer.
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'.
void setAsymError(double lo, double hi)
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.
virtual void SetFillColor(Color_t fcolor)
Set the fill area color.
virtual void SetFillStyle(Style_t fstyle)
Set the fill area style.
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.
TClass * IsA() const override
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 TDirectory * GetDirectory(const char *namecycle, Bool_t printError=false, const char *funcname="GetDirectory")
Find a directory using apath.
virtual TDirectory * mkdir(const char *name, const char *title="", Bool_t returnExistingDirectory=kFALSE)
virtual Bool_t IsWritable() const
virtual void SetPoint(Int_t i, Double_t x, Double_t y)
Set x and y values for point number i.
void Draw(Option_t *chopt="") override
Draw this graph with its current attributes.
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.
T * ReadObject()
To read an object (non deriving from TObject) from the file.
TObject * Clone(const char *newname="") const override
Make a clone of an object using the Streamer facility.
const char * GetName() const override
Returns name of object.
Mother of all ROOT objects.
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
virtual Bool_t InheritsFrom(const char *classname) const
Returns kTRUE if object inherits from class "classname".
virtual void Draw(Option_t *option="")
Default Draw method for all objects.
void RedrawAxis(Option_t *option="") override
Redraw the frame axis.
virtual void SetSeed(ULong_t seed=0)
Set the random generator seed.
virtual UInt_t Integer(UInt_t imax)
Returns a random integer uniformly distributed on the interval [ 0, imax-1 ].
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.
Bool_t IsFloat() const
Returns kTRUE if string contains a floating point or integer number.
const char * Data() 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
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)
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 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)