20#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
21#define protected public
69std::shared_ptr<RooLinkedList> xRooFit::sDefaultNLLOptions =
nullptr;
70std::shared_ptr<ROOT::Fit::FitConfig> xRooFit::sDefaultFitConfig =
nullptr;
83 return RooCmdArg(
"ReuseNLL", flag, 0, 0, 0,
nullptr,
nullptr,
nullptr,
nullptr);
93 return RooCmdArg(
"StrategySequence", 0, 0, 0, 0, val);
110 std::shared_ptr<RooAbsData>(data, [](
RooAbsData *) {}), nllOpts);
130std::shared_ptr<const RooFitResult>
132 const std::pair<std::shared_ptr<RooAbsData>, std::shared_ptr<const RooAbsCollection>> &data,
141 const std::pair<RooAbsData *, const RooAbsCollection *> &data,
149std::pair<std::shared_ptr<RooAbsData>, std::shared_ptr<const RooAbsCollection>>
153 std::pair<std::shared_ptr<RooAbsData>, std::shared_ptr<const RooAbsCollection>> out;
159 auto _allVars = std::unique_ptr<RooAbsCollection>(pdf.
getVariables());
160 auto _snap = std::unique_ptr<RooAbsCollection>(_allVars->snapshot());
161 *_allVars = fr->constPars();
162 *_allVars = fr->floatParsFinal();
165 auto _globs = std::unique_ptr<RooAbsCollection>(fr->constPars().selectByAttrib(
"global",
true));
176 std::function<std::pair<std::shared_ptr<RooAbsData>, std::shared_ptr<const RooArgSet>>(
RooAbsPdf *)> genSubPdf;
179 std::pair<std::shared_ptr<RooAbsData>, std::shared_ptr<const RooArgSet>> _out;
182 std::unique_ptr<RooArgSet> _obs(_pdf->getVariables());
183 _obs->remove(fr->constPars(),
true,
true);
184 _obs->remove(fr->floatParsFinal(),
true,
true);
186 if (!_globs->empty()) {
191 std::unique_ptr<RooArgSet> globs(_pdf->getObservables(t));
192 globs->snapshot(*toy_gobs);
193 if (!toy_gobs->
empty() &&
197 *toy_gobs = *std::unique_ptr<RooDataSet>(_pdf->generate(*globs, 1))->
get();
202 for (
auto thePdf : pp->pdfList()) {
203 auto gob = std::unique_ptr<RooArgSet>(thePdf->getObservables(*globs));
206 if (gob->size() > 1) {
207 Warning(
"generate",
"%s contains multiple global obs: %s", thePdf->GetName(),
208 gob->contentsString().c_str());
212 std::unique_ptr<RooArgSet> cpars(thePdf->getParameters(*globs));
214 bool foundServer =
false;
222 !(cClass && strcmp(cClass->
GetName(),
"SimpleGaussianConstraint") == 0)) {
225 <<
"xRooFit::generateFrom : constraint term " << thePdf->GetName()
226 <<
" of type " << className <<
" is a non-supported type - result might be not correct "
245 <<
"xRooFit::generateFrom : constraint term " << thePdf->GetName()
246 <<
" has no direct dependence on global observable- cannot generate it " << std::endl;
264 if (thetaGamma ==
nullptr) {
266 <<
"xRooFit::generateFrom : constraint term " << thePdf->GetName()
267 <<
" is a Gamma distribution and no server named theta is found. Assume that the Gamma "
280 <<
"xRooFit::generateFrom : constraint term " << thePdf->GetName()
281 <<
" constraint term has more server depending on nuisance- cannot generate it "
286 if (thetaGamma && thetaGamma->
getVal() > 0) {
297 <<
"xRooFit::generateFrom : can't find nuisance for constraint term - global "
298 "observables will not be set to Asimov value "
299 << thePdf->GetName() <<
" glob = " << rrv.
GetName() << std::endl;
300 std::cerr <<
"Parameters: " << std::endl;
302 std::cerr <<
"Observables: " << std::endl;
307 Error(
"generate",
"Cannot generate global observables, pdf is: %s::%s", _pdf->ClassName(),
313 _out.second.reset(toy_gobs);
320 _out.first = std::make_unique<RooDataSet>(
321 uuid,
TString::Format(
"%s %s", _pdf->GetTitle(), (expected) ?
"Expected" :
"Toy"), *_obs,
324 for (
auto &
c : s->indexCat()) {
325#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 22, 00)
326 std::string cLabel =
c.first;
328 std::string cLabel =
c->GetName();
330 auto p = s->getPdf(cLabel.c_str());
333 auto toy = genSubPdf(p);
334 if (toy.second && _out.second)
335 *
const_cast<RooArgSet *
>(_out.second.get()) = *toy.second;
336 _obs->setCatLabel(s->indexCat().GetName(), cLabel.c_str());
337 for (
int i = 0; i < toy.first->numEntries(); i++) {
338 *_obs = *toy.first->get(i);
339 _out.first->add(*_obs, toy.first->weight());
345 std::map<RooRealVar *, std::shared_ptr<RooAbsBinning>> binnings;
347 for (
auto &o : *_obs) {
351 if (
auto res = _pdf->binBoundaries(*
r, -std::numeric_limits<double>::infinity(),
352 std::numeric_limits<double>::infinity())) {
353 binnings[
r] = std::shared_ptr<RooAbsBinning>(
r->getBinning().clone(
r->getBinning().GetName()));
355 std::vector<double> boundaries;
356 boundaries.reserve(res->size());
357 for (
auto &rr : *res) {
358 if (boundaries.empty() || std::abs(boundaries.back() - rr) > 1
e-3 ||
359 std::abs(boundaries.back() - rr) > 1
e-5 * boundaries.back())
360 boundaries.push_back(rr);
362 r->setBinning(
RooBinning(boundaries.size() - 1, &boundaries[0]));
364 }
else if (
r->numBins(
r->getBinning().GetName()) == 0 && expected) {
366 binnings[
r] = std::shared_ptr<RooAbsBinning>(
r->getBinning().clone(
r->getBinning().GetName()));
377 _out.first = std::make_unique<RooDataSet>(
"",
"Toy", _tmp,
RooFit::WeightVar(
"weightVar"));
378 _out.first->add(_tmp);
380 if (_pdf->canBeExtended()) {
390 _out.first = std::unique_ptr<RooDataSet>{_pdf->generate(*_obs,
RooFit::ExpectedData(expected))};
394 _out.first->SetName(
TUUID().AsString());
396 for (
auto &
b : binnings) {
398 auto binning =
b.second;
399 v->setBinning(*binning);
402 auto x =
dynamic_cast<RooRealVar *
>(_out.first->get()->find(
v->GetName()));
403 auto r =
x->getRange();
404 if (
r.first > binning->lowBound())
405 x->setMin(binning->lowBound());
406 if (
r.second < binning->highBound())
407 x->setMax(binning->highBound());
412 out = genSubPdf(&pdf);
413 out.first->SetName(expected ? (
TString(fr->GetName()) +
"_asimov") : uuid);
417 out.first->setGlobalObservables(*out.second);
421#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 26, 00)
424 w->setStringAttribute(
"fitResult", fr->GetName());
425 w->setAttribute(
"expected", expected);
435#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
436 auto _ws = pdf.
_myws;
443 for (
auto obj : _ws->components()) {
444 for (
int i = 0; i < obj->numCaches(); i++) {
450 p->setNormRange(p->normRange());
452 obj->setValueDirty();
467 out->Add(opt->Clone(
nullptr));
498 fitConfig.SetParabErrors(
true);
499 fitConfig.MinimizerOptions().SetMinimizerType(
"Minuit2");
500 fitConfig.MinimizerOptions().SetErrorDef(0.5);
501 fitConfig.SetParabErrors(
true);
502 fitConfig.SetMinosErrors(
true);
503 fitConfig.MinimizerOptions().SetMaxFunctionCalls(
505 fitConfig.MinimizerOptions().SetMaxIterations(-1);
506 fitConfig.MinimizerOptions().SetStrategy(-1);
510 fitConfig.MinimizerOptions().SetPrintLevel(-2);
513 auto extraOpts =
const_cast<ROOT::Math::IOptions *
>(fitConfig.MinimizerOptions().ExtraOptions());
514 extraOpts->
SetValue(
"OptimizeConst", 2);
516#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 29, 00)
517 extraOpts->SetValue(
"StrategySequence",
"0s01s12s2s3m");
518 extraOpts->SetValue(
"HesseStrategySequence",
"23");
520 extraOpts->SetValue(
"StrategySequence",
"0s01s12s2m");
521 extraOpts->SetValue(
"HesseStrategySequence",
"2");
526 extraOpts->SetValue(
"LogSize", 0);
527 extraOpts->SetValue(
"BoundaryCheck",
529 extraOpts->SetValue(
"TrackProgress", 30);
551 if (signum == SIGINT) {
552 std::cout <<
"Minimization interrupted ... will exit as soon as possible" << std::endl;
557 me->oldHandlerr(signum);
563 fFunc(
"func",
"func", this,
f),
569 vars.reset(std::unique_ptr<RooAbsCollection>(
f.getVariables())->selectByAttrib(
"Constant",
false));
589 return fFunc->getParameters(observables, outputSet, stripDisconnected);
596 fFunc->printMultiline(os, contents, verbose,
indent);
600 fFunc->constOptimizeTestStatistic(opcode, doAlsoTrackingOpt);
606 throw std::runtime_error(
"Keyboard interrupt");
607 return std::numeric_limits<double>::quiet_NaN();
610 if (
prevMin == std::numeric_limits<double>::infinity()) {
614 if (!std::isnan(out)) {
626 std::stringstream sout;
635 nRequired *= (nRequired-1);
647 std::vector<std::pair<double, std::string>> parDeltas;
648 parDeltas.reserve(
minPars.size());
650 parDeltas.emplace_back(std::pair<double, std::string>(
653 std::sort(parDeltas.begin(), parDeltas.end(),
654 [](
auto &left,
auto &right) { return std::abs(left.first) > std::abs(right.first); });
656 for (i = 0; i < std::min(3,
int(parDeltas.size())); i++) {
657 if (parDeltas.at(i).first == 0)
661 sout << parDeltas.at(i).second << (parDeltas.at(i).first >= 0 ?
"+" :
"-") <<
"="
662 << std::abs(parDeltas.at(i).first) <<
"(" <<
minPars.getRealValue(parDeltas.at(i).second.c_str())
665 if (i <
int(parDeltas.size()) && parDeltas.at(i).first != 0)
670 if (
gROOT->FromPopUp() &&
gROOT->GetListOfBrowsers()->At(0)) {
671 auto browser =
dynamic_cast<TBrowser *
>(
gROOT->GetListOfBrowsers()->At(0));
672 std::string status = sout.str();
675 std::string status_part;
676 if (status.find(
" : ") != std::string::npos) {
677 status_part = status.substr(0, status.find(
" : "));
678 status = status.substr(status.find(
" : ") + 3);
680 status_part = status;
683 browser->SetStatusText(status_part.c_str(), col);
688 std::cerr << sout.str() << std::endl;
704 mutable double minVal = std::numeric_limits<double>::infinity();
705 mutable double prevMin = std::numeric_limits<double>::infinity();
711 std::shared_ptr<RooAbsCollection>
vars;
724 const std::shared_ptr<ROOT::Fit::FitConfig> &_fitConfig,
725 const std::shared_ptr<RooLinkedList> &nllOpts)
729 auto &fitConfig = *myFitConfig;
733 TString resultTitle = nll.getStringAttribute(
"fitresultTitle");
735 if (resultTitle ==
"")
740 if (nll.getStringAttribute(
"userPars")) {
741 TStringToken st(nll.getStringAttribute(
"userPars"),
",");
744 TString parVal = nll.getStringAttribute(parName);
753 auto _nllVars = std::unique_ptr<RooAbsCollection>(_nll->getVariables());
755 std::unique_ptr<RooAbsCollection> constPars(_nllVars->selectByAttrib(
"Constant",
true));
756 constPars->add(fUserPars,
true);
757 std::unique_ptr<RooAbsCollection> floatPars(_nllVars->selectByAttrib(
"Constant",
false));
760 double boundaryCheck = 0;
764#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 29, 00)
765 int hesseStrategy = 3;
767 int hesseStrategy = 2;
769 if (fitConfig.MinimizerOptions().ExtraOptions()) {
770 fitConfig.MinimizerOptions().ExtraOptions()->GetNamedValue(
"StrategySequence", s);
771 fitConfig.MinimizerOptions().ExtraOptions()->GetIntValue(
"TrackProgress", _progress);
772 fitConfig.MinimizerOptions().ExtraOptions()->GetRealValue(
"BoundaryCheck", boundaryCheck);
773 fitConfig.MinimizerOptions().ExtraOptions()->GetIntValue(
"LogSize", logSize);
774 fitConfig.MinimizerOptions().ExtraOptions()->GetIntValue(
"HesseStrategy", hesseStrategy);
775 fitConfig.MinimizerOptions().ExtraOptions()->GetNamedValue(
"HesseStrategySequence", hs);
785 if (
auto nllDir = cacheDir->
GetDirectory(nll.GetName()); nllDir) {
786 if (
auto keys = nllDir->GetListOfKeys(); keys) {
787 for (
auto &&k : *keys) {
789 if (cl->InheritsFrom(
"RooFitResult")) {
791 nllDir->GetList() ?
dynamic_cast<StoredFitResult *
>(nllDir->GetList()->FindObject(k->GetName()))
798 nllDir->Add(storedFr);
803 if (!cachedFit->floatParsFinal().equals(*floatPars)) {
806 for (
auto &p : *constPars) {
811 dynamic_cast<RooAbsCategory *
>(cachedFit->constPars().find(p->GetName()));
813 _p->getCurrentIndex() !=
c->getCurrentIndex()) {
822 if (
auto _p =
dynamic_cast<RooAbsReal *
>(cachedFit->constPars().find(p->GetName())); _p) {
825 if (!_p->getAttribute(
"global") && std::abs(_p->getVal() -
v->getVal()) > 1
e-12) {
848 if (nll.getAttribute(
"readOnly"))
851 int printLevel = fitConfig.MinimizerOptions().PrintLevel();
857 if (floatPars->empty() || fitConfig.MinimizerOptions().MaxFunctionCalls() == 1) {
858 std::shared_ptr<RooFitResult> result;
860 parsList.
add(*floatPars);
862 result = std::make_shared<RooFitResult>();
863 result->SetName(
TUUID().AsString());
864 result->SetTitle(resultTitle);
865 result->setFinalParList(parsList);
866 result->setInitParList(parsList);
867 result->setConstParList(
dynamic_cast<RooArgSet &
>(*constPars));
869 d.ResizeTo(parsList.
size(), parsList.
size());
870 result->setCovarianceMatrix(
d);
871 result->setCovQual(floatPars->empty() ? 3 : -1);
872 result->setMinNLL(_nll->getVal());
874 result->setStatus(floatPars->empty() ? 0 : 1);
876 std::vector<std::pair<std::string, int>> statusHistory;
877 statusHistory.emplace_back(std::make_pair(
"EVAL", result->status()));
878 result->setStatusHistory(statusHistory);
883 cacheDir->
mkdir(nll.GetName());
884 if (
auto dir = cacheDir->
GetDirectory(nll.GetName()); dir) {
887 if (strlen(nllOpts->GetName()) == 0) {
888 nllOpts->SetName(
TUUID().AsString());
890 if (!dir->FindKey(nllOpts->GetName())) {
891 dir->WriteObject(nllOpts.get(), nllOpts->GetName());
894 dir->WriteObject(result.get(), result->GetName());
903 std::shared_ptr<RooFitResult> out;
907 for (
auto p : *floatPars) {
908 if (p->isCategory()) {
912 if (!floatCats.
empty()) {
913 RooSuperCategory allCats(
"floatCats",
"Floating categorical parameters", floatCats);
914 std::unique_ptr<RooAbsCollection> _snap(floatCats.
snapshot());
917 std::shared_ptr<const RooFitResult> bestFr;
918 for (
auto c : allCats) {
920 Info(
"minimize",
"Minimizing with discrete %s",
c.first.c_str());
921 auto fr =
minimize(nll, _fitConfig, nllOpts);
923 Warning(
"minimize",
"Minimization with discrete %s failed",
c.first.c_str());
926 if (!bestFr || fr->minNll() < bestFr->minNll()) {
937 out = std::make_shared<RooFitResult>(*bestFr);
938 const_cast<RooArgList &
>(out->floatParsFinal())
939 .
addClone(*std::unique_ptr<RooAbsCollection>(out->constPars().selectCommon(floatCats)));
942 out->SetName(
TUUID().AsString());
945 bool restore = !fitConfig.UpdateAfterFit();
946 bool minos = fitConfig.MinosErrors();
949 int strategy = fitConfig.MinimizerOptions().Strategy();
955 auto logger = (logSize > 0) ? std::make_unique<cout_redirect>(logs, logSize) :
nullptr;
957 _minimizer.
fitter()->Config() = fitConfig;
969 bool autoMaxCalls = (_minimizer.
fitter()->Config().MinimizerOptions().MaxFunctionCalls() == 0);
971 _minimizer.
fitter()->Config().MinimizerOptions().SetMaxFunctionCalls(
972 500 * floatPars->size() * floatPars->size());
974 if (_minimizer.
fitter()->Config().MinimizerOptions().MaxIterations() == 0) {
975 _minimizer.
fitter()->Config().MinimizerOptions().SetMaxIterations(500 * floatPars->size());
978 bool hesse = _minimizer.
fitter()->Config().ParabErrors();
979 _minimizer.
fitter()->Config().SetParabErrors(
981 _minimizer.
fitter()->Config().SetMinosErrors(
false);
982 _minimizer.
fitter()->Config().SetUpdateAfterFit(
true);
984 std::vector<std::pair<std::string, int>> statusHistory;
989 TString actualFirstMinimizer = _minimizer.
fitter()->Config().MinimizerType();
993 int constOptimize = 2;
994 _minimizer.
fitter()->Config().MinimizerOptions().ExtraOptions()->GetValue(
"OptimizeConst", constOptimize);
1014 TString minim = _minimizer.
fitter()->Config().MinimizerType();
1015 TString algo = _minimizer.
fitter()->Config().MinimizerAlgoType();
1016 if (minim ==
"Minuit2") {
1017 if (strategy == -1) {
1020 sIdx = m_strategy.
Index(
'0' + strategy);
1023 Warning(
"minimize",
"Strategy %d not specified in StrategySequence %s ... defaulting to start of sequence",
1024 strategy, m_strategy.
Data());
1027 }
else if (minim ==
"Minuit")
1028 sIdx = m_strategy.
Index(
'm');
1033 while (tries < maxtries && sIdx != -1) {
1034 if (m_strategy(sIdx) ==
'm') {
1036 algo =
"migradImproved";
1037 }
else if (m_strategy(sIdx) ==
's') {
1039 }
else if (m_strategy(sIdx) ==
'h') {
1042 strategy =
int(m_strategy(sIdx) -
'0');
1048 fff->fState = minim + algo + std::to_string(_minimizer.
fitter()->Config().MinimizerOptions().Strategy());
1051 status = _minimizer.
minimize(minim, algo);
1052 }
catch (
const std::exception &
e) {
1053 std::cerr <<
"Exception while minimizing: " <<
e.what() << std::endl;
1055 if (first && actualFirstMinimizer != _minimizer.
fitter()->Config().MinimizerType())
1056 actualFirstMinimizer = _minimizer.
fitter()->Config().MinimizerType();
1062 throw std::runtime_error(
"Keyboard interrupt while minimizing");
1066 status = _minimizer.
fitter()
1069 minim = _minimizer.
fitter()->Config().MinimizerType();
1070 statusHistory.emplace_back(_minimizer.
fitter()->Config().MinimizerType() +
1071 _minimizer.
fitter()->Config().MinimizerAlgoType() +
1072 std::to_string(_minimizer.
fitter()->Config().MinimizerOptions().Strategy()),
1074 if (status % 1000 == 0)
1077 if (status == 4 && minim !=
"Minuit") {
1078 if (printLevel >= -1) {
1079 Warning(
"fitTo",
"%s Hit max function calls of %d", fitName.
Data(),
1080 _minimizer.
fitter()->Config().MinimizerOptions().MaxFunctionCalls());
1083 if (printLevel >= -1)
1084 Warning(
"fitTo",
"will try doubling this");
1085 _minimizer.
fitter()->Config().MinimizerOptions().SetMaxFunctionCalls(
1086 _minimizer.
fitter()->Config().MinimizerOptions().MaxFunctionCalls() * 2);
1087 _minimizer.
fitter()->Config().MinimizerOptions().SetMaxIterations(
1088 _minimizer.
fitter()->Config().MinimizerOptions().MaxIterations() * 2);
1096 if (printLevel >= -1) {
1097 Warning(
"fitTo",
"%s %s%s Status=%d (edm=%f, tol=%f, strat=%d), tries=#%d...", fitName.
Data(),
1098 _minimizer.
fitter()->Config().MinimizerType().c_str(),
1099 _minimizer.
fitter()->Config().MinimizerAlgoType().c_str(), status,
1100 _minimizer.
fitter()->Result().Edm(), _minimizer.
fitter()->Config().MinimizerOptions().Tolerance(),
1101 _minimizer.
fitter()->Config().MinimizerOptions().Strategy(), tries);
1105 if (sIdx == m_strategy.
Length() - 1) {
1124 if (printLevel >= -1 && status != 0) {
1125 Warning(
"fitTo",
"%s final status is %d", fitName.
Data(), status);
1134 int miniStrat = _minimizer.
fitter()->Config().MinimizerOptions().Strategy();
1135 double dCovar = std::numeric_limits<double>::quiet_NaN();
1142 if (hesse && m_hessestrategy.
Length() != 0 &&
1143 (m_strategy(sIdx) ==
'h' || (_minimizer.
fitter()->Result().IsValid()))) {
1166 if (hesseStrategy == -1) {
1169 sIdx = m_hessestrategy.
Index(
'0' + hesseStrategy);
1173 "HesseStrategy %d not specified in HesseStrategySequence %s ... defaulting to start of sequence",
1174 hesseStrategy, m_hessestrategy.
Data());
1177 while (sIdx != -1) {
1178 hesseStrategy =
int(m_hessestrategy(sIdx) -
'0');
1180 if (strategy == 2 && hesseStrategy == 2) {
1182 if (_minimizer.
fitter()->GetMinimizer()->CovMatrixStatus() == 3) {
1185 if (sIdx >= m_hessestrategy.
Length() - 1) {
1192 _minimizer.
fitter()->Config().MinimizerOptions().SetStrategy(hesseStrategy);
1197 fff->fState =
TString::Format(
"Hesse%d", _minimizer.
fitter()->Config().MinimizerOptions().Strategy());
1198 fff->counter2 = fff->counter;
1206 auto _status = _minimizer.
hesse();
1229 statusHistory.push_back(std::pair<std::string, int>(
1234 throw std::runtime_error(
"Keyboard interrupt while hesse calculating");
1236 if ((_status != 0 || _minimizer.
fitter()->GetMinimizer()->CovMatrixStatus() != 3) && status == 0 &&
1238 Warning(
"fitTo",
"%s hesse status is %d, covQual=%d", fitName.
Data(), _status,
1239 _minimizer.
fitter()->GetMinimizer()->CovMatrixStatus());
1242 if (sIdx >= m_hessestrategy.
Length() - 1) {
1246 if (_status == 0 && _minimizer.
fitter()->GetMinimizer()->CovMatrixStatus() == 3) {
1249 }
else if (_status == 0) {
1251 statusHistory.back().second = _minimizer.
fitter()->GetMinimizer()->CovMatrixStatus();
1258 if (status == 0 &&
minos) {
1259 if (std::unique_ptr<RooAbsCollection> mpars(floatPars->selectByAttrib(
"minos",
true)); !mpars->empty()) {
1261 fff->fState =
"Minos";
1264 auto _status = _minimizer.
minos(*mpars);
1265 statusHistory.push_back(std::pair(
"Minos", _status));
1274 out = std::unique_ptr<RooFitResult>{_minimizer.
save(fitName, resultTitle)};
1278 if (out->status() == 0 && out->covQual() != 3 && hesse) {
1279 if (out->covQual() == 2) {
1287 if (miniStrat < _minimizer.
fitter()->Config().MinimizerOptions().Strategy() && hesse &&
1288 out->edm() > _minimizer.
fitter()->Config().MinimizerOptions().Tolerance() * 1
e-3 && out->status() != 3) {
1291 std::cerr <<
"Warning: post-Hesse edm " << out->edm() <<
" greater than allowed by tolerance "
1292 << _minimizer.
fitter()->Config().MinimizerOptions().Tolerance() * 1
e-3
1293 <<
", consider increasing minimization strategy" << std::endl;
1299 out->setStatusHistory(statusHistory);
1304 if (!std::isnan(dCovar)) {
1309 if (boundaryCheck) {
1312 int limit_status = 0;
1313 std::string listpars;
1317 double vRange =
v->getMax() -
v->getMin();
1318 if (
v->getMin() >
v->getVal() - vRange * boundaryCheck ||
1319 v->getMax() <
v->getVal() + vRange * boundaryCheck) {
1323 auto tmp =
v->getVal();
1324 v->setVal(
v->getMin());
1325 double boundary_nll = _nll->getVal();
1326 if (boundary_nll <= out->minNll()) {
1327 static_cast<RooRealVar *
>(out->floatParsFinal().find(
v->GetName()))->
setVal(
v->getMin());
1328 out->setMinNLL(boundary_nll);
1336 if (
v->hasRange(
"physical"))
1338 listpars +=
v->GetName();
1341 (
v->getMin() >
v->getVal() -
v->getError() ||
v->getMax() <
v->getVal() +
v->getError())) {
1342 if (printLevel >= 0) {
1343 Info(
"minimize",
"PARLIM: %s (%f +/- %f) range (%f - %f)",
v->GetName(),
v->getVal(),
v->getError(),
1344 v->getMin(),
v->getMax());
1346 limit_status = 9000;
1349 if (limit_status == 900) {
1350 if (printLevel >= 0) {
1351 Warning(
"minimize",
"BOUNDCHK: Parameters within %g%% limit in fit result: %s", boundaryCheck * 100,
1354 }
else if (limit_status > 0) {
1355 if (printLevel >= 0)
1356 Warning(
"minimize",
"BOUNDCHK: Parameters near limit in fit result");
1360 statusHistory.emplace_back(
"BOUNDCHK", limit_status);
1361 out->setStatusHistory(statusHistory);
1362 out->setStatus(out->status() + limit_status);
1388 out->setMinNLL(_nll->getVal());
1391 for (
auto o : out->floatParsFinal()) {
1393 v && !
v->getAttribute(
"minos") && !
v->getAttribute(
"xminos") && !
v->getAttribute(
"xMinos"))
1394 v->removeAsymError();
1398 if (fitConfig.MinimizerOptions().MinimizerType() != actualFirstMinimizer) {
1399 fitConfig.MinimizerOptions().SetMinimizerType(actualFirstMinimizer);
1407 if (out && out->status() == 0 &&
minos) {
1409 for (
auto label : {
"xminos",
"xMinos"}) {
1410 std::unique_ptr<RooAbsCollection> pars(floatPars->selectByAttrib(label,
true));
1411 for (
auto p : *pars) {
1412 Info(
"minimize",
"Computing xminos error for %s", p->GetName());
1416 *floatPars = out->floatParsFinal();
1421 *floatPars = out->floatParsInit();
1424 if (out && !logs.empty()) {
1426#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 28, 00)
1427 const_cast<RooArgList &
>(out->constPars()).
addOwned(std::make_unique<RooStringVar>(
".log",
"log", logs.c_str()));
1433 if (out && cacheDir && cacheDir->
IsWritable()) {
1437 cacheDir->
mkdir(nll.GetName());
1438 if (
auto dir = cacheDir->
GetDirectory(nll.GetName()); dir) {
1441 if (strlen(nllOpts->GetName()) == 0) {
1442 nllOpts->SetName(
TUUID().AsString());
1444 if (!dir->FindKey(nllOpts->GetName())) {
1445 dir->WriteObject(nllOpts.get(), nllOpts->GetName());
1450 std::string configName;
1451 if (!fitConfig.MinimizerOptions().ExtraOptions()->GetValue(
"Name", configName)) {
1452 auto extraOpts =
const_cast<ROOT::Math::IOptions *
>(fitConfig.MinimizerOptions().ExtraOptions());
1454 extraOpts->SetValue(
"Name", configName.data());
1456 if (!dir->GetKey(configName.data())) {
1457 dir->WriteObject(&fitConfig, configName.data());
1460#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 28, 00)
1462 .
addOwned(std::make_unique<RooStringVar>(
".fitConfigName",
"fitConfigName", configName.c_str()));
1467 dir->WriteObject(out.get(), out->GetName());
1481 const std::shared_ptr<ROOT::Fit::FitConfig> &_fitConfig)
1484 auto par =
dynamic_cast<RooRealVar *
>(std::unique_ptr<RooArgSet>(nll.getVariables())->find(parName));
1493 auto &fitConfig = *myFitConfig;
1495 bool pErrs = fitConfig.ParabErrors();
1496 fitConfig.SetParabErrors(
false);
1497 double mErrs = fitConfig.MinosErrors();
1498 fitConfig.SetMinosErrors(
false);
1500 double val_best = par_hat->getVal();
1501 double val_err = (par_hat->hasError() ? par_hat->getError() : -1);
1502 double orig_err = val_err;
1503 double nll_min = ufit.
minNll();
1507 bool isConst = par->isConstant();
1508 par->setConstant(
true);
1510 auto findValue = [&](
double val_guess,
double N_sigma = 1,
double precision = 0.002,
int printLevel = 0) {
1513 double sigma_guess = std::abs((val_guess - val_best) / N_sigma);
1516 10 * precision * sigma_guess;
1517 bool lastOverflow =
false;
1518 bool lastUnderflow =
false;
1519 while (std::abs(val_pre - val_guess) > precision * sigma_guess) {
1520 val_pre = val_guess;
1521 if (val_guess > 0 && par->getMax() < val_guess)
1522 par->setMax(2 * val_guess);
1523 if (val_guess < 0 && par->getMin() > val_guess)
1524 par->setMin(2 * val_guess);
1525 par->setVal(val_guess);
1530 return std::numeric_limits<double>::quiet_NaN();
1532 double nll_val = result->minNll();
1533 status += result->status() * 10;
1534 tmu = 2 * (nll_val - nll_min);
1535 sigma_guess = std::abs(val_guess - val_best) / sqrt(tmu);
1539 std::cout <<
"Warning: Alternative best-fit of " << par->GetName() <<
" @ " << val_guess <<
" vs "
1540 << val_best <<
" (delta=" << tmu / 2. <<
")" << std::endl;
1541 double new_guess = val_guess + (val_guess - val_best);
1542 val_best = val_guess;
1543 val_guess = new_guess;
1544 sigma_guess = std::abs((val_guess - val_best) / N_sigma);
1545 val_pre = val_guess - 10 * precision * sigma_guess;
1546 status = (status / 10) * 10 + 1;
1550 double corr = (val_pre - val_best - N_sigma * sigma_guess);
1555 if (printLevel > 1) {
1559 std::cout <<
"NLL min: " << nll_min << std::endl;
1560 std::cout <<
"N_sigma*sigma(pre): " << std::abs(val_pre - val_best) << std::endl;
1561 std::cout <<
"sigma(guess): " << sigma_guess << std::endl;
1562 std::cout <<
"par(guess): " << val_guess + corr << std::endl;
1563 std::cout <<
"true val: " << val_best << std::endl;
1564 std::cout <<
"tmu: " << tmu << std::endl;
1565 std::cout <<
"Precision: " << sigma_guess * precision << std::endl;
1566 std::cout <<
"Correction: " << (-corr < 0 ?
" " :
"") << -corr << std::endl;
1567 std::cout <<
"N_sigma*sigma(guess): " << std::abs(val_guess - val_best) << std::endl;
1568 std::cout << std::endl;
1570 if (val_guess > par->getMax()) {
1572 val_guess = par->getMin();
1575 lastOverflow =
true;
1576 lastUnderflow =
false;
1577 val_guess = par->getMax() - 1
e-12;
1578 }
else if (val_guess < par->getMin()) {
1579 if (lastUnderflow) {
1580 val_guess = par->getMin();
1583 lastOverflow =
false;
1584 lastUnderflow =
true;
1585 val_guess = par->getMin() + 1
e-12;
1587 lastUnderflow =
false;
1588 lastOverflow =
false;
1593 status = (status / 10) * 10 + 3;
1601 status = (status / 10) * 10 + 2;
1602 }
else if (lastUnderflow) {
1605 status = (status / 10) * 10 + 2;
1609 std::cout <<
"Found sigma for nll " << nll.GetName() <<
": " << (val_guess - val_best) / N_sigma << std::endl;
1611 std::cout <<
"Finished in " << nrItr <<
" iterations." << std::endl;
1613 std::cout << std::endl;
1614 return (val_guess - val_best) / N_sigma;
1619 par_hat->setError(std::numeric_limits<double>::quiet_NaN());
1620 double lo = par_hat->getErrorLo();
1621 double hi = par_hat->getErrorHi();
1622 if (std::isnan(
hi)) {
1623 hi = findValue(val_best + val_err, 1) + val_best -
1628 if (std::isnan(lo)) {
1629 lo = -findValue(val_best - val_err, -1) + val_best -
1633 par_hat->setError(orig_err);
1635 fitConfig.SetParabErrors(pErrs);
1636 fitConfig.SetMinosErrors(mErrs);
1637 par->setConstant(isConst);
1639 std::vector<std::pair<std::string, int>> statusHistory;
1643 statusHistory.emplace_back(
TString::Format(
"xMinos:%s", parName), status);
1644 const_cast<RooFitResult &
>(ufit).setStatusHistory(statusHistory);
1657 std::deque<RooAbsArg *> topPdfs;
1659 for (
auto p : w.allPdfs()) {
1660 if (p->hasClients())
1662 flagCount += p->getAttribute(
"hypoTest");
1663 if (p->getAttribute(
"hypoTest")) {
1664 topPdfs.push_front(p);
1666 topPdfs.push_back(p);
1669 if (topPdfs.empty()) {
1670 Error(
"hypoTest",
"Cannot find top-level pdf in workspace");
1672 }
else if (topPdfs.size() > 1) {
1674 if (flagCount == 0) {
1675 Error(
"hypoTest",
"Multiple top-level pdfs. Flag which one to test with "
1676 "w->pdf(\"pdfName\")->setAttribute(\"hypoTest\",true)");
1678 }
else if (flagCount != 1) {
1679 Error(
"hypoTest",
"Multiple top-level pdfs flagged for hypoTest -- pick one.");
1683 model =
dynamic_cast<RooAbsPdf *
>(topPdfs.front());
1685 Info(
"hypoTest",
"Using PDF: %s", model->GetName());
1691 std::shared_ptr<RooArgSet> obsGlobs =
nullptr;
1693 for (
auto p : w.allData()) {
1695 Error(
"hypoTest",
"Multiple datasets in workspace. Flag which one to test with "
1696 "w->data(\"dataName\")->setAttribute(\"hypoTest\",true)");
1703 Error(
"hypoTest",
"No data -- cannot determine observables");
1707 Info(
"hypoTest",
"Using Dataset: %s", obsData->
GetName());
1711 obsGlobs = std::make_shared<RooArgSet>();
1712 obsGlobs->addClone(_globs.argList());
1713 Info(
"hypoTest",
"Using Globs: %s", (obsGlobs->empty()) ?
" <NONE>" : obsGlobs->contentsString().c_str());
1718 auto _vars = std::unique_ptr<RooArgSet>(model->getVariables());
1721 for (
auto _v : *_vars) {
1722 if (
auto v =
dynamic_cast<RooRealVar *
>(_v);
v &&
v->hasBinning(
"hypoPoints")) {
1726 if (poi.
size() > 1) {
1727 auto _const = std::unique_ptr<RooAbsCollection>(poi.
selectByAttrib(
"Constant",
true));
1731 if (!args.
empty()) {
1735 Error(
"hypoTest",
"No POI detected: add the hypoPoints binning to at least one non-const model parameter e.g.:\n "
1736 "w->var(\"mu\")->setBinning(RooUniformBinning(0.5,10.5,10),\"hypoPoints\"))");
1748 xRooNLLVar nll(*model, std::make_pair(obsData, obsGlobs.get()), *nllOpts);
1749 nll.SetFitConfig(fitConfig);
1751 if (poi.
size() == 1) {
1754 double altVal = (mu->getStringAttribute(
"altVal")) ?
TString(mu->getStringAttribute(
"altVal")).
Atof()
1755 : std::numeric_limits<double>::quiet_NaN();
1757 if (std::isnan(altVal) && mu->hasRange(
"physical")) {
1759 altVal = mu->getMin(
"physical");
1760 Info(
"hypoTest",
"No altVal specified - using min of given physical range = %g", altVal);
1762 if (!std::isnan(altVal)) {
1763 Info(
"hypoTest",
"alt hypo: %g - CLs activated", altVal);
1765 Info(
"hypoTest",
"No altVal found - to specify setStringAttribute(\"altVal\",\"<value>\") on POI or set "
1766 "the physical range");
1769 bool doCLs = !std::isnan(altVal) && std::abs(mu->getMin(
"hypoPoints")) > altVal &&
1770 std::abs(mu->getMax(
"hypoPoints")) > altVal;
1772 const char *sCL = (doCLs) ?
"CLs" :
"null";
1773 Info(
"hypoTest",
"%s testing active", sCL);
1783 std::vector<int> expSig = {-2, -1, 0, 1, 2};
1784 if (std::isnan(altVal))
1786 std::map<int, TGraphErrors> exp_pcls;
1787 std::map<int, TGraphErrors> exp_cls;
1788 for (
auto &s : expSig) {
1790 TString::Format(
"Expected (%d#sigma) p_{%s};%s", s, sCL, mu->GetTitle()));
1792 TString::Format(
"Expected (%d#sigma) %s;%s", s, sCL, mu->GetTitle()));
1796 double _out = std::numeric_limits<double>::quiet_NaN();
1797 bool lastAbove =
false;
1798 for (
int i = 0; i < pValues.GetN(); i++) {
1799 bool thisAbove = pValues.GetPointY(i) >= (1. - CL);
1800 if (i != 0 && thisAbove != lastAbove) {
1803 _out = pValues.GetPointX(i - 1) + (pValues.GetPointX(i) - pValues.GetPointX(i - 1)) *
1804 ((1. - CL) - pValues.GetPointY(i - 1)) /
1805 (pValues.GetPointY(i) - pValues.GetPointY(i - 1));
1807 lastAbove = thisAbove;
1812 auto testPoint = [&](
double testVal) {
1813 auto hp = nll.hypoPoint(mu->GetName(), testVal, altVal, pllType);
1814 obs_ts->SetPoint(obs_ts->GetN(), testVal, hp.pll().first);
1815 obs_ts->SetPointError(obs_ts->GetN() - 1, 0, hp.pll().second);
1817 if (nToysNull > 0) {
1820 obs_pcls->SetPoint(obs_pcls->GetN(), testVal, (doCLs) ? hp.pCLs_asymp().first : hp.pNull_asymp().first);
1821 obs_pcls->SetPointError(obs_pcls->GetN() - 1, 0, (doCLs) ? hp.pCLs_asymp().second : hp.pNull_asymp().second);
1822 for (
auto &s : expSig) {
1823 exp_pcls[s].SetPoint(exp_pcls[s].GetN(), testVal,
1824 (doCLs) ? hp.pCLs_asymp(s).first : hp.pNull_asymp(s).first);
1827 Info(
"hypoTest",
"%s=%g: %s=%g sigma_mu=%g %s=%g", mu->GetName(), testVal, obs_ts->GetName(),
1828 obs_ts->GetPointY(obs_ts->GetN() - 1), hp.sigma_mu().first, obs_pcls->GetName(),
1829 obs_pcls->GetPointY(obs_pcls->GetN() - 1));
1831 Info(
"hypoTest",
"%s=%g: %s=%g %s=%g", mu->GetName(), testVal, obs_ts->GetName(),
1832 obs_ts->GetPointY(obs_ts->GetN() - 1), obs_pcls->GetName(), obs_pcls->GetPointY(obs_pcls->GetN() - 1));
1836 if (mu->getBins(
"hypoPoints") <= 0) {
1839 testPoint(mu->getMin(
"hypoPoints"));
1840 testPoint(mu->getMax(
"hypoPoints"));
1841 testPoint((mu->getMax(
"hypoPoints") + mu->getMin(
"hypoPoints")) / 2.);
1843 while (std::abs(obs_pcls->GetPointY(obs_pcls->GetN() - 1) - (1. - CL)) > 0.01) {
1845 double nextTest = getLimit(*obs_pcls);
1846 if (std::isnan(nextTest))
1848 testPoint(nextTest);
1850 for (
auto s : expSig) {
1851 while (std::abs(exp_pcls[s].GetPointY(exp_pcls[s].GetN() - 1) - (1. - CL)) > 0.01) {
1853 double nextTest = getLimit(exp_pcls[s]);
1854 if (std::isnan(nextTest))
1856 testPoint(nextTest);
1861 for (
auto &s : expSig)
1865 for (
int i = 0; i <= mu->getBins(
"hypoPoints"); i++) {
1866 testPoint((i == mu->getBins(
"hypoPoints")) ? mu->getBinning(
"hypoPoints").binHigh(i - 1)
1867 : mu->getBinning(
"hypoPoints").binLow(i));
1871 obs_cls->SetPoint(obs_cls->GetN(), getLimit(*obs_pcls), 0.05);
1872 for (
auto &s : expSig) {
1873 exp_cls[s].SetPoint(exp_cls[s].GetN(), getLimit(exp_pcls[s]), 0.05);
1877 if (exp_pcls[2].GetN() > 1) {
1883 band2down->
SetNameTitle(
".pCLs_2sigma_downUncert",
"");
1889 for (
int i = 0; i < exp_pcls[2].GetN(); i++) {
1890 band2->
SetPoint(band2->
GetN(), exp_pcls[2].GetPointX(i),
1891 exp_pcls[2].GetPointY(i) - exp_pcls[2].GetErrorYlow(i));
1892 band2up->
SetPoint(band2up->
GetN(), exp_pcls[2].GetPointX(i),
1893 exp_pcls[2].GetPointY(i) + exp_pcls[2].GetErrorYhigh(i));
1895 for (
int i = exp_pcls[2].GetN() - 1; i >= 0; i--) {
1896 band2up->
SetPoint(band2up->
GetN(), exp_pcls[2].GetPointX(i),
1897 exp_pcls[2].GetPointY(i) - exp_pcls[2].GetErrorYlow(i));
1899 for (
int i = 0; i < exp_pcls[-2].GetN(); i++) {
1900 band2down->
SetPoint(band2down->
GetN(), exp_pcls[-2].GetPointX(i),
1901 exp_pcls[-2].GetPointY(i) + exp_pcls[-2].GetErrorYhigh(i));
1903 for (
int i = exp_pcls[-2].GetN() - 1; i >= 0; i--) {
1904 band2->
SetPoint(band2->
GetN(), exp_pcls[-2].GetPointX(i),
1905 exp_pcls[-2].GetPointY(i) + exp_pcls[-2].GetErrorYhigh(i));
1906 band2down->
SetPoint(band2down->
GetN(), exp_pcls[-2].GetPointX(i),
1907 exp_pcls[-2].GetPointY(i) - exp_pcls[-2].GetErrorYlow(i));
1912 auto ax =
static_cast<TNamed *
>(band2->
Clone(
".axis"));
1917 band2down->
Draw(
"F");
1920 if (exp_pcls[1].GetN() > 1) {
1926 band2down->
SetNameTitle(
".pCLs_1sigma_downUncert",
"");
1932 for (
int i = 0; i < exp_pcls[1].GetN(); i++) {
1933 band2->
SetPoint(band2->
GetN(), exp_pcls[1].GetPointX(i),
1934 exp_pcls[1].GetPointY(i) - exp_pcls[1].GetErrorYlow(i));
1935 band2up->
SetPoint(band2up->
GetN(), exp_pcls[1].GetPointX(i),
1936 exp_pcls[1].GetPointY(i) + exp_pcls[1].GetErrorYhigh(i));
1938 for (
int i = exp_pcls[1].GetN() - 1; i >= 0; i--) {
1939 band2up->
SetPoint(band2up->
GetN(), exp_pcls[1].GetPointX(i),
1940 exp_pcls[1].GetPointY(i) - exp_pcls[1].GetErrorYlow(i));
1942 for (
int i = 0; i < exp_pcls[-1].GetN(); i++) {
1943 band2down->
SetPoint(band2down->
GetN(), exp_pcls[-1].GetPointX(i),
1944 exp_pcls[-1].GetPointY(i) + exp_pcls[-1].GetErrorYhigh(i));
1946 for (
int i = exp_pcls[-1].GetN() - 1; i >= 0; i--) {
1947 band2->
SetPoint(band2->
GetN(), exp_pcls[-1].GetPointX(i),
1948 exp_pcls[-1].GetPointY(i) + exp_pcls[-1].GetErrorYhigh(i));
1949 band2down->
SetPoint(band2down->
GetN(), exp_pcls[-1].GetPointX(i),
1950 exp_pcls[-1].GetPointY(i) - exp_pcls[-1].GetErrorYlow(i));
1957 band2down->
Draw(
"F");
1961 if (exp_cls[0].GetN() > 0) {
1962 exp_pcls[0].SetLineStyle(2);
1963 exp_pcls[0].SetFillColor(
kGreen);
1964 exp_pcls[0].SetMarkerStyle(0);
1965 expPlot = exp_pcls[0].DrawClone(
"L");
1968 obs_pcls->Draw(
gPad->GetListOfPrimitives()->IsEmpty() ?
"ALP" :
"LP");
1970 obs_ts->SetLineColor(
kRed);
1971 obs_ts->SetMarkerColor(
kRed);
1975 auto l =
new TLegend(0.5, 0.6, 1. -
gPad->GetRightMargin(), 1. -
gPad->GetTopMargin());
1976 l->SetName(
"legend");
1977 l->AddEntry(obs_ts, obs_ts->GetTitle(),
"LPE");
1978 l->AddEntry(obs_pcls, obs_pcls->GetTitle(),
"LPE");
1980 l->AddEntry(expPlot,
"Expected",
"LFE");
1984 obs_cls->SetMarkerStyle(29);
1985 obs_cls->SetEditable(
false);
1986 obs_cls->Draw(
"LP");
1987 for (
auto s : expSig) {
1988 exp_cls[s].SetMarkerStyle(29);
1989 exp_cls[s].SetEditable(
false);
1990 exp_cls[s].DrawClone(
"LP");
2004 double factor = pow(10.0, digits - ceil(log10(std::abs(value))));
2005 return std::round(value * factor) / factor;
2009 const double multiplier = std::pow(10.0, decimal_places);
2010 return std::round(value * multiplier) / multiplier;
2017 if (!std::isinf(out.second)) {
2018 auto tmp = out.second;
2020 int expo = (out.second == 0) ? 0 : (
int)std::floor(std::log10(std::abs(out.second)));
2023 out.first = (expo >= 0) ? round(out.first) :
round_to_decimal(out.first, -expo);
2024 }
else if (out.second != 0) {
2025 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)
double evaluate() const override
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)
Error("WriteTObject","The current directory (%s) is not associated with a file. The object (%s) has not been written.", GetName(), objname)
void Info(const char *location, const char *msgfmt,...)
Use this function for informational messages.
void Warning(const char *location, const char *msgfmt,...)
Use this function in warning situations.
TMatrixTSym< Double_t > TMatrixDSym
char * Form(const char *fmt,...)
Formats a string in a circular formatting buffer.
void printMultiline(std::ostream &os, Int_t contents, bool verbose=false, TString indent="") const override
Interface for detailed printing of object.
static void interruptHandler(int signum)
std::shared_ptr< RooAbsCollection > vars
double evaluate() const override
Evaluate this PDF / function / constant. Needs to be overridden by all derived classes.
~ProgressMonitor() override
void constOptimizeTestStatistic(ConstOpCode opcode, bool doAlsoTrackingOpt) override
Interface function signaling a request to perform constant term optimization.
ProgressMonitor(const ProgressMonitor &other, const char *name=nullptr)
double defaultErrorLevel() const override
double getValV(const RooArgSet *) const override
Return value of object.
bool setData(RooAbsData &data, bool cloneData) override
static ProgressMonitor * me
ProgressMonitor(RooAbsReal &f, int interval=30)
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.
TObject * clone(const char *newname) const override
StoredFitResult(RooFitResult *_fr)
std::shared_ptr< RooFitResult > fr
!
static std::shared_ptr< ROOT::Fit::FitConfig > defaultFitConfig()
static RooCmdArg Tolerance(double value)
static const char * GetVersionDate()
static TCanvas * hypoTest(RooWorkspace &w, const xRooFit::Asymptotics::PLLType &pllType=xRooFit::Asymptotics::Unknown)
static const char * GetVersion()
static RooCmdArg MaxIterations(int nIterations)
static std::shared_ptr< ROOT::Fit::FitConfig > sDefaultFitConfig
static RooCmdArg StrategySequence(const char *stratSeq)
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 std::shared_ptr< ROOT::Fit::FitConfig > createFitConfig()
static std::shared_ptr< RooLinkedList > defaultNLLOptions()
static RooCmdArg ReuseNLL(bool flag)
static int minos(RooAbsReal &nll, const RooFitResult &ufit, const char *parName="", const std::shared_ptr< ROOT::Fit::FitConfig > &_fitConfig=nullptr)
static xRooNLLVar createNLL(const std::shared_ptr< RooAbsPdf > pdf, const std::shared_ptr< RooAbsData > data, const RooLinkedList &nllOpts)
static ROOT::Math::IOptions * defaultFitConfigOptions()
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 > sDefaultNLLOptions
static std::shared_ptr< RooLinkedList > createNLLOptions()
static std::pair< double, double > matchPrecision(const std::pair< double, double > &in)
static std::pair< std::shared_ptr< RooAbsData >, std::shared_ptr< const RooAbsCollection > > generateFrom(RooAbsPdf &pdf, const RooFitResult &fr, bool expected=false, int seed=0)
This xRooNLLVar object has several special methods, e.g.
xRooFitResult minimize(const std::shared_ptr< ROOT::Fit::FitConfig > &=nullptr)
The xRooNode class is designed to wrap over a TObject and provide functionality to aid with interacti...
xRooNode datasets() const
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 Bool_t IsWritable() const
virtual TDirectory * mkdir(const char *name, const char *title="", Bool_t returnExistingDirectory=kFALSE)
Create a sub-directory "a" or a hierarchy of sub-directories "a/b/c/...".
virtual void SetPoint(Int_t i, Double_t x, Double_t y)
void Draw(Option_t *chopt="") override
Default Draw method for all objects.
void SetNameTitle(const char *name="", const char *title="") override
Set all the TNamed parameters (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.
The TNamed class is the base class for all named ROOT classes.
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".
TObject()
TObject constructor.
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 round_to_decimal(double value, int decimal_places)
double round_to_digits(double value, int digits)
MsgLevel
Verbosity level for RooMsgService::StreamConfig in RooMsgService.
#define BEGIN_XROOFIT_NAMESPACE
#define END_XROOFIT_NAMESPACE