20#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
21#define protected public
68std::shared_ptr<RooLinkedList> xRooFit::sDefaultNLLOptions =
nullptr;
69std::shared_ptr<ROOT::Fit::FitConfig> xRooFit::sDefaultFitConfig =
nullptr;
73 return RooCmdArg(
"ReuseNLL", flag, 0, 0, 0, 0, 0, 0, 0);
83 return RooCmdArg(
"StrategySequence", 0, 0, 0, 0, val);
86xRooNLLVar xRooFit::createNLL(
const std::shared_ptr<RooAbsPdf> pdf,
const std::shared_ptr<RooAbsData>
data,
94 return createNLL(std::shared_ptr<RooAbsPdf>(&pdf, [](
RooAbsPdf *) {}),
112 return createNLL(pdf,
data,
l);
115std::shared_ptr<const RooFitResult>
117 const std::pair<std::shared_ptr<RooAbsData>, std::shared_ptr<const RooAbsCollection>> &
data,
125std::shared_ptr<const RooFitResult> xRooFit::fitTo(
RooAbsPdf &pdf,
126 const std::pair<RooAbsData *, const RooAbsCollection *> &
data,
134std::pair<std::shared_ptr<RooAbsData>, std::shared_ptr<const RooAbsCollection>>
138 std::pair<std::shared_ptr<RooAbsData>, std::shared_ptr<const RooAbsCollection>> out;
144 auto _allVars = std::unique_ptr<RooAbsCollection>(pdf.
getVariables());
145 auto _snap = std::unique_ptr<RooAbsCollection>(_allVars->snapshot());
146 *_allVars = fr->constPars();
147 *_allVars = fr->floatParsFinal();
150 auto _globs = std::unique_ptr<RooAbsCollection>(fr->constPars().selectByAttrib(
"global",
true));
161 std::function<std::pair<std::shared_ptr<RooAbsData>, std::shared_ptr<const RooArgSet>>(
RooAbsPdf *)> genSubPdf;
164 std::pair<std::shared_ptr<RooAbsData>, std::shared_ptr<const RooArgSet>> _out;
167 std::unique_ptr<RooArgSet> _obs(_pdf->getVariables());
168 _obs->remove(fr->constPars(),
true,
true);
169 _obs->remove(fr->floatParsFinal(),
true,
true);
171 if (!_globs->empty()) {
176 std::unique_ptr<RooArgSet> globs(_pdf->getObservables(t));
177 globs->snapshot(*toy_gobs);
178 if (!toy_gobs->
empty() &&
182 *toy_gobs = *std::unique_ptr<RooDataSet>(_pdf->generate(*globs, 1))->
get();
187 for (
auto thePdf : pp->pdfList()) {
188 auto gob = std::unique_ptr<RooArgSet>(thePdf->getObservables(*globs));
191 if (gob->size() > 1) {
192 Warning(
"generate",
"%s contains multiple global obs: %s", thePdf->GetName(),
193 gob->contentsString().c_str());
197 std::unique_ptr<RooArgSet> cpars(thePdf->getParameters(*globs));
199 bool foundServer =
false;
208 <<
"AsymptoticCalculator::MakeAsimovData:constraint term " << thePdf->GetName()
209 <<
" of type " << className <<
" is a non-supported type - result might be not correct "
228 <<
"AsymptoticCalculator::MakeAsimovData:constraint term " << thePdf->
GetName()
229 <<
" has no direct dependence on global observable- cannot generate it " << std::endl;
241 RooFIter itc(thePdf->serverMIterator());
248 if (thetaGamma == 0) {
250 <<
"AsymptoticCalculator::MakeAsimovData:constraint term " << thePdf->
GetName()
251 <<
" is a Gamma distribution and no server named theta is found. Assume that the Gamma "
256 RooFIter iter2(thePdf->serverMIterator());
265 <<
"AsymptoticCalculator::MakeAsimovData:constraint term " << thePdf->
GetName()
266 <<
" constraint term has more server depending on nuisance- cannot generate it "
271 if (thetaGamma && thetaGamma->
getVal() > 0)
281 <<
"AsymptoticCalculator::MakeAsimovData - can't find nuisance for constraint term - global "
282 "observables will not be set to Asimov value "
283 << thePdf->GetName() << std::endl;
284 std::cerr <<
"Parameters: " << std::endl;
286 std::cerr <<
"Observables: " << std::endl;
291 Error(
"generate",
"Cannot generate global observables, pdf is: %s::%s", _pdf->ClassName(),
297 _out.second.reset(toy_gobs);
305 uuid,
TString::Format(
"%s %s", _pdf->GetTitle(), (expected) ?
"Expected" :
"Toy"), *_obs,
"weightVar"));
307 for (
auto &
c : s->indexCat()) {
308#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 22, 00)
309 std::string cLabel =
c.first.c_str();
311 std::string cLabel =
c->GetName();
313 auto p = s->getPdf(cLabel.c_str());
316 auto toy = genSubPdf(
p);
317 if (toy.second && _out.second)
318 *
const_cast<RooArgSet *
>(_out.second.get()) = *toy.second;
319 _obs->setCatLabel(s->indexCat().GetName(), cLabel.c_str());
320 for (
int i = 0; i < toy.first->numEntries(); i++) {
321 *_obs = *toy.first->get(i);
322 _out.first->add(*_obs, toy.first->weight());
328 std::map<RooRealVar *, std::shared_ptr<RooAbsBinning>> binnings;
330 for (
auto &o : *_obs) {
334 if (
auto res = _pdf->binBoundaries(*
r, -std::numeric_limits<double>::infinity(),
335 std::numeric_limits<double>::infinity())) {
336 binnings[
r] = std::shared_ptr<RooAbsBinning>(
r->getBinning().clone(
r->getBinning().GetName()));
338 std::vector<double> boundaries;
339 boundaries.reserve(res->size());
340 for (
auto &rr : *res) {
341 if (boundaries.empty() || std::abs(boundaries.back() - rr) > 1
e-3 ||
342 std::abs(boundaries.back() - rr) > 1
e-5 * boundaries.back())
343 boundaries.push_back(rr);
345 r->setBinning(
RooBinning(boundaries.size() - 1, &boundaries[0]));
347 }
else if (
r->numBins(
r->getBinning().GetName()) == 0 && expected) {
349 binnings[
r] = std::shared_ptr<RooAbsBinning>(
r->getBinning().clone(
r->getBinning().GetName()));
360 _out.first.reset(
new RooDataSet(
"",
"Toy", _tmp,
"weightVar"));
361 _out.first->add(_tmp);
363 if (_pdf->canBeExtended()) {
373 _out.first = std::unique_ptr<RooDataSet>{_pdf->generate(*_obs,
RooFit::ExpectedData(expected))};
377 _out.first->SetName(
TUUID().AsString());
379 for (
auto &
b : binnings) {
381 auto binning =
b.second;
382 v->setBinning(*binning);
385 auto x =
dynamic_cast<RooRealVar *
>(_out.first->get()->find(
v->GetName()));
386 auto r =
x->getRange();
387 if (
r.first > binning->lowBound())
388 x->setMin(binning->lowBound());
389 if (
r.second < binning->highBound())
390 x->setMax(binning->highBound());
395 out = genSubPdf(&pdf);
396 out.first->SetName(expected ? (
TString(fr->GetName()) +
"_asimov") : uuid);
400 out.first->setGlobalObservables(*out.second);
404#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 26, 00)
407 w->setStringAttribute(
"fitResult", fr->GetName());
408 w->setAttribute(
"expected", expected);
418#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00)
419 auto _ws = pdf.
_myws;
426 for (
auto obj : _ws->components()) {
427 for (
int i = 0; i < obj->numCaches(); i++) {
433 p->setNormRange(
p->normRange());
435 obj->setValueDirty();
443std::shared_ptr<RooLinkedList> xRooFit::createNLLOptions()
449 for (
auto opt : *defaultNLLOptions()) {
450 out->Add(opt->Clone(
nullptr));
456std::shared_ptr<RooLinkedList> xRooFit::defaultNLLOptions()
458 if (sDefaultNLLOptions)
459 return sDefaultNLLOptions;
467 return sDefaultNLLOptions;
470std::shared_ptr<ROOT::Fit::FitConfig> xRooFit::createFitConfig()
472 return std::make_shared<ROOT::Fit::FitConfig>(*defaultFitConfig());
475std::shared_ptr<ROOT::Fit::FitConfig> xRooFit::defaultFitConfig()
477 if (sDefaultFitConfig)
478 return sDefaultFitConfig;
479 sDefaultFitConfig = std::make_shared<ROOT::Fit::FitConfig>();
480 auto &fitConfig = *sDefaultFitConfig;
481 fitConfig.SetParabErrors(
true);
482 fitConfig.MinimizerOptions().SetMinimizerType(
"Minuit2");
483 fitConfig.MinimizerOptions().SetErrorDef(0.5);
484 fitConfig.SetParabErrors(
true);
485 fitConfig.SetMinosErrors(
true);
486 fitConfig.MinimizerOptions().SetMaxFunctionCalls(
488 fitConfig.MinimizerOptions().SetMaxIterations(-1);
489 fitConfig.MinimizerOptions().SetStrategy(-1);
493 fitConfig.MinimizerOptions().SetPrintLevel(-2);
496 auto extraOpts =
const_cast<ROOT::Math::IOptions *
>(fitConfig.MinimizerOptions().ExtraOptions());
497 extraOpts->
SetValue(
"OptimizeConst", 2);
499#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 29, 00)
500 extraOpts->SetValue(
"StrategySequence",
"0s01s12s2s3m");
501 extraOpts->SetValue(
"HesseStrategy", 3);
503 extraOpts->SetValue(
"StrategySequence",
"0s01s12s2m");
504 extraOpts->SetValue(
"HesseStrategy", 2);
506 extraOpts->SetValue(
"LogSize", 0);
507 extraOpts->SetValue(
"BoundaryCheck",
509 extraOpts->SetValue(
"TrackProgress", 30);
516 return sDefaultFitConfig;
526 if (signum == SIGINT) {
527 std::cout <<
"Minimization interrupted ... will exit as soon as possible" << std::endl;
541 vars.reset(std::unique_ptr<RooAbsCollection>(
f.getVariables())->selectByAttrib(
"Constant",
false));
560 throw std::runtime_error(
"Keyboard interrupt");
561 return std::numeric_limits<double>::quiet_NaN();
564 if (
prevMin == std::numeric_limits<double>::infinity()) {
568 if (!std::isnan(out)) {
582 std::cerr <<
" : " <<
fState;
587 std::vector<std::pair<double, std::string>> parDeltas;
590 parDeltas.emplace_back(std::pair<double, std::string>(
593 std::sort(parDeltas.begin(), parDeltas.end(),
594 [](
auto &left,
auto &right) { return std::abs(left.first) > std::abs(right.first); });
596 for (i = 0; i < std::min(3,
int(parDeltas.size())); i++) {
597 if (parDeltas.at(i).first == 0)
601 std::cerr << parDeltas.at(i).second << (parDeltas.at(i).first >= 0 ?
"+" :
"-") <<
"="
602 << std::abs(parDeltas.at(i).first) <<
"("
605 if (i <
int(parDeltas.size()) && parDeltas.at(i).first != 0)
609 std::cerr << std::endl;
623 mutable double minVal = std::numeric_limits<double>::infinity();
624 mutable double prevMin = std::numeric_limits<double>::infinity();
630 std::shared_ptr<RooAbsCollection>
vars;
646 const std::shared_ptr<ROOT::Fit::FitConfig> &_fitConfig,
647 const std::shared_ptr<RooLinkedList> &nllOpts)
651 auto &fitConfig = *myFitConfig;
657 if (resultTitle ==
"")
674 auto _nllVars = std::unique_ptr<RooAbsCollection>(_nll->getVariables());
676 std::unique_ptr<RooAbsCollection> constPars(_nllVars->selectByAttrib(
"Constant",
true));
677 constPars->add(fUserPars,
true);
678 std::unique_ptr<RooAbsCollection> floatPars(_nllVars->selectByAttrib(
"Constant",
false));
681 double boundaryCheck = 0;
684#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 29, 00)
685 int hesseStrategy = 3;
687 int hesseStrategy = 2;
689 if (fitConfig.MinimizerOptions().ExtraOptions()) {
690 fitConfig.MinimizerOptions().ExtraOptions()->GetNamedValue(
"StrategySequence", s);
691 fitConfig.MinimizerOptions().ExtraOptions()->GetIntValue(
"TrackProgress", _progress);
692 fitConfig.MinimizerOptions().ExtraOptions()->GetRealValue(
"BoundaryCheck", boundaryCheck);
693 fitConfig.MinimizerOptions().ExtraOptions()->GetIntValue(
"LogSize", logSize);
694 fitConfig.MinimizerOptions().ExtraOptions()->GetIntValue(
"HesseStrategy", hesseStrategy);
704 if (
auto keys = nllDir->GetListOfKeys(); keys) {
705 for (
auto &&k : *keys) {
707 if (cl->InheritsFrom(
"RooFitResult")) {
712 (storedFr) ? storedFr->
fr.get() :
dynamic_cast<TKey *
>(k)->ReadObject<RooFitResult>();
716 nllDir->Add(storedFr);
721 if (!cachedFit->floatParsFinal().equals(*floatPars)) {
724 for (
auto &
p : *constPars) {
730 if (
auto _p =
dynamic_cast<RooAbsReal *
>(cachedFit->constPars().find(
p->
GetName())); _p) {
733 if (!_p->getAttribute(
"global") && std::abs(_p->getVal() -
v->getVal()) > 1
e-12) {
759 int printLevel = fitConfig.MinimizerOptions().PrintLevel();
765 if (floatPars->empty() || fitConfig.MinimizerOptions().MaxFunctionCalls() == 1) {
766 std::shared_ptr<RooFitResult>
result;
768 parsList.
add(*floatPars);
770 result = std::make_shared<RooFitResult>();
772 result->SetTitle(resultTitle);
773 result->setFinalParList(parsList);
774 result->setInitParList(parsList);
778 result->setCovarianceMatrix(
d);
780 result->setMinNLL(_nll->getVal());
782 result->setStatus(floatPars->getSize() == 0 ? 0 : 1);
784 std::vector<std::pair<std::string, int>> statusHistory;
785 statusHistory.emplace_back(std::make_pair(
"EVAL",
result->status()));
786 result->setStatusHistory(statusHistory);
795 if (strlen(nllOpts->GetName()) == 0) {
798 if (!dir->FindKey(nllOpts->GetName())) {
799 dir->WriteObject(nllOpts.get(), nllOpts->GetName());
811 std::shared_ptr<RooFitResult> out;
815 for (
auto p : *floatPars) {
816 if (
p->isCategory()) {
820 if (!floatCats.
empty()) {
821 RooSuperCategory allCats(
"floatCats",
"Floating categorical parameters", floatCats);
822 std::unique_ptr<RooAbsCollection> _snap(floatCats.
snapshot());
825 std::shared_ptr<const RooFitResult> bestFr;
826 for (
auto c : allCats) {
828 Info(
"minimize",
"Minimizing with discrete %s",
c.first.c_str());
829 auto fr =
minimize(nll, _fitConfig, nllOpts);
831 Warning(
"minimize",
"Minimization with discrete %s failed",
c.first.c_str());
834 if (!bestFr || fr->minNll() < bestFr->minNll()) {
845 out = std::make_shared<RooFitResult>(*bestFr);
846 const_cast<RooArgList &
>(out->floatParsFinal())
847 .addClone(*std::unique_ptr<RooAbsCollection>(out->constPars().selectCommon(floatCats)));
848 const_cast<RooArgList &
>(out->floatParsInit()).addClone(*_snap);
849 const_cast<RooArgList &
>(out->constPars()).remove(floatCats);
853 bool restore = !fitConfig.UpdateAfterFit();
856 int strategy = fitConfig.MinimizerOptions().Strategy();
862 auto logger = (logSize > 0) ? std::make_unique<cout_redirect>(logs, logSize) :
nullptr;
879 500 * floatPars->size() * floatPars->size());
892 std::vector<std::pair<std::string, int>> statusHistory;
901 int constOptimize = 2;
924 if (minim ==
"Minuit2") {
928 sIdx = m_strategy.
Index(
'0' + strategy);
930 Warning(
"minimize",
"Strategy %d not specified in StrategySequence %s ... defaulting to start of sequence",
931 strategy, m_strategy.
Data());
934 }
else if (minim ==
"Minuit")
935 sIdx = m_strategy.
Index(
'm');
940 while (tries < maxtries && sIdx != -1) {
941 if (m_strategy(sIdx) ==
'm') {
943 algo =
"migradImproved";
944 }
else if (m_strategy(sIdx) ==
's') {
947 strategy =
int(m_strategy(sIdx) -
'0');
956 status = _minimizer.
minimize(minim, algo);
957 }
catch (
const std::exception &
e) {
958 std::cerr <<
"Exception while minimizing: " <<
e.what() << std::endl;
967 throw std::runtime_error(
"Keyboard interrupt while minimizing");
971 status = _minimizer.
fitter()
979 if (status % 1000 == 0)
982 if (status == 4 && minim !=
"Minuit") {
983 if (printLevel >= -1)
984 Warning(
"fitTo",
"%s Hit max function calls of %d", fitName.
Data(),
987 if (printLevel >= -1)
988 Warning(
"fitTo",
"will try doubling this");
1000 if (printLevel >= -1)
1001 Warning(
"fitTo",
"%s %s%s Status=%d (edm=%f, tol=%f, strat=%d), tries=#%d...", fitName.
Data(),
1008 if (sIdx == m_strategy.
Length() - 1) {
1027 if (printLevel >= -1 && status != 0) {
1028 Warning(
"fitTo",
"%s final status is %d", fitName.
Data(), status);
1037 double dCovar = std::numeric_limits<double>::quiet_NaN();
1046 if (hesse && (strategy < 2 || strategy != hesseStrategy) && _minimizer.
fitter()->
Result().
IsValid()) {
1081 auto _status = _minimizer.
hesse();
1104 statusHistory.push_back(std::pair<std::string, int>(
1109 throw std::runtime_error(
"Keyboard interrupt while hesse calculating");
1111 if (_status != 0 && status == 0 && printLevel >= -1) {
1112 Warning(
"fitTo",
"%s hesse status is %d", fitName.
Data(), _status);
1117 if (status == 0 &&
minos) {
1118 if (std::unique_ptr<RooAbsCollection> mpars(floatPars->selectByAttrib(
"minos",
true)); !mpars->empty()) {
1120 fff->fState =
"Minos";
1122 auto _status = _minimizer.
minos(*mpars);
1123 statusHistory.push_back(std::pair(
"Minos", _status));
1132 out = std::unique_ptr<RooFitResult>{_minimizer.
save(fitName, resultTitle)};
1136 if (out->status() == 0 && out->covQual() != 3 && hesse) {
1137 if (out->covQual() == 2) {
1145 out->setStatusHistory(statusHistory);
1148 const_cast<RooArgList &
>(out->constPars()).addClone(fUserPars,
true);
1150 if (!std::isnan(dCovar)) {
1152 .addClone(
RooRealVar(
".dCovar",
"dCovar from minimization", dCovar),
true);
1155 if (boundaryCheck) {
1158 RooFIter itr = floatPars->fwdIterator();
1160 int limit_status = 0;
1161 std::string listpars;
1162 while ((
a = itr.
next())) {
1166 double vRange =
v->
getMax() -
v->getMin();
1167 if (
v->getMin() >
v->getVal() - vRange * boundaryCheck ||
1168 v->getMax() <
v->getVal() + vRange * boundaryCheck) {
1172 auto tmp =
v->getVal();
1173 v->setVal(
v->getMin());
1174 double boundary_nll = _nll->getVal();
1175 if (boundary_nll <= out->minNll()) {
1176 static_cast<RooRealVar *
>(out->floatParsFinal().find(
v->GetName()))->
setVal(
v->getMin());
1177 out->setMinNLL(boundary_nll);
1185 if (
v->hasRange(
"physical"))
1187 listpars +=
v->GetName();
1190 (
v->getMin() >
v->getVal() -
v->getError() ||
v->getMax() <
v->getVal() +
v->getError())) {
1191 if (printLevel >= 0) {
1192 Info(
"minimize",
"PARLIM: %s (%f +/- %f) range (%f - %f)",
v->GetName(),
v->getVal(),
v->getError(),
1193 v->getMin(),
v->getMax());
1195 limit_status = 9000;
1198 if (limit_status == 900) {
1199 if (printLevel >= 0)
1200 Warning(
"minimize",
"BOUNDCHK: Parameters within %g%% limit in fit result: %s", boundaryCheck * 100,
1202 }
else if (limit_status > 0) {
1203 if (printLevel >= 0)
1204 Warning(
"minimize",
"BOUNDCHK: Parameters near limit in fit result");
1208 statusHistory.emplace_back(
"BOUNDCHK", limit_status);
1209 out->setStatusHistory(statusHistory);
1210 out->setStatus(out->status() + limit_status);
1236 out->setMinNLL(_nll->getVal());
1239 for (
auto o : out->floatParsFinal()) {
1241 v && !
v->
getAttribute(
"minos") && !
v->getAttribute(
"xminos") && !
v->getAttribute(
"xMinos"))
1242 v->removeAsymError();
1246 if (fitConfig.MinimizerOptions().MinimizerType() != actualFirstMinimizer) {
1247 fitConfig.MinimizerOptions().SetMinimizerType(actualFirstMinimizer);
1255 if (status == 0 &&
minos) {
1256 for (
auto label : {
"xminos",
"xMinos"}) {
1257 std::unique_ptr<RooAbsCollection> pars(floatPars->selectByAttrib(label,
true));
1258 for (
auto p : *pars) {
1259 Info(
"minimize",
"Computing xminos error for %s",
p->
GetName());
1263 *floatPars = out->floatParsFinal();
1269 *floatPars = out->floatParsInit();
1272 if (out && !logs.empty()) {
1274#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 28, 00)
1275 const_cast<RooArgList &
>(out->constPars()).addOwned(std::make_unique<RooStringVar>(
".log",
"log", logs.c_str()));
1281 if (out && cacheDir && cacheDir->
IsWritable()) {
1289 if (strlen(nllOpts->GetName()) == 0) {
1292 if (!dir->FindKey(nllOpts->GetName())) {
1293 dir->WriteObject(nllOpts.get(), nllOpts->GetName());
1298 std::string configName;
1299 if (!fitConfig.MinimizerOptions().ExtraOptions()->GetValue(
"Name", configName)) {
1300 auto extraOpts =
const_cast<ROOT::Math::IOptions *
>(fitConfig.MinimizerOptions().ExtraOptions());
1302 extraOpts->SetValue(
"Name", configName.data());
1304 if (!dir->GetKey(configName.data())) {
1305 dir->WriteObject(&fitConfig, configName.data());
1308#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 28, 00)
1310 .addOwned(std::make_unique<RooStringVar>(
".fitConfigName",
"fitConfigName", configName.c_str()));
1313 .addOwned(*
new RooStringVar(
".fitConfigName",
"fitConfigName", configName.c_str()));
1315 dir->WriteObject(out.get(), out->GetName());
1329 const std::shared_ptr<ROOT::Fit::FitConfig> &_fitConfig)
1341 auto &fitConfig = *myFitConfig;
1343 bool pErrs = fitConfig.ParabErrors();
1344 fitConfig.SetParabErrors(
false);
1345 double mErrs = fitConfig.MinosErrors();
1346 fitConfig.SetMinosErrors(
false);
1348 double val_best = par_hat->getVal();
1349 double val_err = (par_hat->hasError() ? par_hat->getError() : -1);
1350 double orig_err = val_err;
1351 double nll_min = ufit.
minNll();
1355 bool isConst = par->isConstant();
1356 par->setConstant(
true);
1358 auto findValue = [&](
double val_guess,
double N_sigma = 1,
double precision = 0.002,
int printLevel = 0) {
1361 double sigma_guess = std::abs((val_guess - val_best) / N_sigma);
1364 10 * precision * sigma_guess;
1365 bool lastOverflow =
false, lastUnderflow =
false;
1366 while (std::abs(val_pre - val_guess) > precision * sigma_guess) {
1367 val_pre = val_guess;
1368 if (val_guess > 0 && par->getMax() < val_guess)
1369 par->setMax(2 * val_guess);
1370 if (val_guess < 0 && par->getMin() > val_guess)
1371 par->setMin(2 * val_guess);
1372 par->setVal(val_guess);
1377 return std::numeric_limits<double>::quiet_NaN();
1379 double nll_val =
result->minNll();
1380 status +=
result->status() * 10;
1381 tmu = 2 * (nll_val - nll_min);
1382 sigma_guess = std::abs(val_guess - val_best) / sqrt(tmu);
1386 std::cout <<
"Warning: Alternative best-fit of " << par->GetName() <<
" @ " << val_guess <<
" vs "
1387 << val_best <<
" (delta=" << tmu / 2. <<
")" << std::endl;
1388 double new_guess = val_guess + (val_guess - val_best);
1389 val_best = val_guess;
1390 val_guess = new_guess;
1391 sigma_guess = std::abs((val_guess - val_best) / N_sigma);
1392 val_pre = val_guess - 10 * precision * sigma_guess;
1393 status = (status / 10) * 10 + 1;
1397 double corr = (val_pre - val_best - N_sigma * sigma_guess);
1402 if (printLevel > 1) {
1406 std::cout <<
"NLL min: " << nll_min << std::endl;
1407 std::cout <<
"N_sigma*sigma(pre): " << std::abs(val_pre - val_best) << std::endl;
1408 std::cout <<
"sigma(guess): " << sigma_guess << std::endl;
1409 std::cout <<
"par(guess): " << val_guess + corr << std::endl;
1410 std::cout <<
"true val: " << val_best << std::endl;
1411 std::cout <<
"tmu: " << tmu << std::endl;
1412 std::cout <<
"Precision: " << sigma_guess * precision << std::endl;
1413 std::cout <<
"Correction: " << (-corr < 0 ?
" " :
"") << -corr << std::endl;
1414 std::cout <<
"N_sigma*sigma(guess): " << std::abs(val_guess - val_best) << std::endl;
1415 std::cout << std::endl;
1417 if (val_guess > par->getMax()) {
1419 val_guess = par->getMin();
1422 lastOverflow =
true;
1423 lastUnderflow =
false;
1424 val_guess = par->getMax() - 1
e-12;
1425 }
else if (val_guess < par->getMin()) {
1426 if (lastUnderflow) {
1427 val_guess = par->getMin();
1430 lastOverflow =
false;
1431 lastUnderflow =
true;
1432 val_guess = par->getMin() + 1
e-12;
1434 lastUnderflow =
false;
1435 lastOverflow =
false;
1440 status = (status / 10) * 10 + 3;
1448 status = (status / 10) * 10 + 2;
1449 }
else if (lastUnderflow) {
1452 status = (status / 10) * 10 + 2;
1456 std::cout <<
"Found sigma for nll " << nll.
GetName() <<
": " << (val_guess - val_best) / N_sigma << std::endl;
1458 std::cout <<
"Finished in " << nrItr <<
" iterations." << std::endl;
1460 std::cout << std::endl;
1461 return (val_guess - val_best) / N_sigma;
1466 par_hat->setError(std::numeric_limits<double>::quiet_NaN());
1467 double lo = par_hat->getErrorLo();
1468 double hi = par_hat->getErrorHi();
1469 if (std::isnan(
hi)) {
1470 hi = findValue(val_best + val_err, 1) + val_best -
1475 if (std::isnan(lo)) {
1476 lo = -findValue(val_best - val_err, -1) + val_best -
1482 fitConfig.SetParabErrors(pErrs);
1483 fitConfig.SetMinosErrors(mErrs);
1484 par->setConstant(isConst);
1486 std::vector<std::pair<std::string, int>> statusHistory;
1490 statusHistory.emplace_back(
TString::Format(
"xMinos:%s", parName), status);
1491 const_cast<RooFitResult &
>(ufit).setStatusHistory(statusHistory);
1504 std::deque<RooAbsArg *> topPdfs;
1506 for (
auto p :
w.allPdfs()) {
1507 if (
p->hasClients())
1509 flagCount +=
p->getAttribute(
"hypoTest");
1510 if (
p->getAttribute(
"hypoTest"))
1511 topPdfs.push_front(
p);
1513 topPdfs.push_back(
p);
1515 if (topPdfs.empty()) {
1516 Error(
"hypoTest",
"Cannot find top-level pdf in workspace");
1518 }
else if (topPdfs.size() > 1) {
1520 if (flagCount == 0) {
1521 Error(
"hypoTest",
"Multiple top-level pdfs. Flag which one to test with "
1522 "w->pdf(\"pdfName\")->setAttribute(\"hypoTest\",true)");
1524 }
else if (flagCount != 1) {
1525 Error(
"hypoTest",
"Multiple top-level pdfs flagged for hypoTest -- pick one.");
1529 model =
dynamic_cast<RooAbsPdf *
>(topPdfs.front());
1531 Info(
"hypoTest",
"Using PDF: %s", model->
GetName());
1537 std::shared_ptr<RooArgSet> obsGlobs =
nullptr;
1539 for (
auto p :
w.allData()) {
1541 Error(
"hypoTest",
"Multiple datasets in workspace. Flag which one to test with "
1542 "w->data(\"dataName\")->setAttribute(\"hypoTest\",true)");
1549 Error(
"hypoTest",
"No data -- cannot determine observables");
1553 Info(
"hypoTest",
"Using Dataset: %s", obsData->
GetName());
1556 auto _globs = xRooNode(
w).datasets()[obsData->
GetName()]->globs();
1557 obsGlobs = std::make_shared<RooArgSet>();
1558 obsGlobs->addClone(_globs.argList());
1559 Info(
"hypoTest",
"Using Globs: %s", (obsGlobs->empty()) ?
" <NONE>" : obsGlobs->contentsString().c_str());
1564 auto _vars = std::unique_ptr<RooArgSet>(model->
getVariables());
1567 for (
auto _v : *_vars) {
1572 if (poi.
size() > 1) {
1573 auto _const = std::unique_ptr<RooAbsCollection>(poi.
selectByAttrib(
"Constant",
true));
1577 if (!args.
empty()) {
1581 Error(
"hypoTest",
"No POI detected: add the hypoPoints binning to at least one non-const model parameter e.g.:\n "
1582 "w->var(\"mu\")->setBinning(RooUniformBinning(0.5,10.5,10),\"hypoPoints\"))");
1594 xRooNLLVar nll(*model, std::make_pair(obsData, obsGlobs.get()), *nllOpts);
1595 nll.SetFitConfig(fitConfig);
1597 if (poi.
size() == 1) {
1600 double altVal = (mu->getStringAttribute(
"altVal")) ?
TString(mu->getStringAttribute(
"altVal")).Atof()
1601 : std::numeric_limits<double>::quiet_NaN();
1603 if (std::isnan(altVal) && mu->hasRange(
"physical")) {
1605 altVal = mu->getMin(
"physical");
1606 Info(
"hypoTest",
"No altVal specified - using min of given physical range = %g", altVal);
1608 if (!std::isnan(altVal))
1609 Info(
"hypoTest",
"alt hypo: %g - CLs activated", altVal);
1611 Info(
"hypoTest",
"No altVal found - to specify setStringAttribute(\"altVal\",\"<value>\") on POI or set "
1612 "the physical range");
1614 bool doCLs = !std::isnan(altVal) && std::abs(mu->getMin(
"hypoPoints")) > altVal &&
1615 std::abs(mu->getMax(
"hypoPoints")) > altVal;
1617 const char *sCL = (doCLs) ?
"CLs" :
"null";
1618 Info(
"hypoTest",
"%s testing active", sCL);
1628 std::vector<int> expSig = {-2, -1, 0, 1, 2};
1629 if (std::isnan(altVal))
1631 std::map<int, TGraphErrors> exp_pcls, exp_cls;
1632 for (
auto &s : expSig) {
1634 TString::Format(
"Expected (%d#sigma) p_{%s};%s", s, sCL, mu->GetTitle()));
1636 TString::Format(
"Expected (%d#sigma) %s;%s", s, sCL, mu->GetTitle()));
1640 double _out = std::numeric_limits<double>::quiet_NaN();
1641 bool lastAbove =
false;
1642 for (
int i = 0; i < pValues.GetN(); i++) {
1643 bool thisAbove = pValues.GetPointY(i) >= (1. - CL);
1644 if (i != 0 && thisAbove != lastAbove) {
1647 _out = pValues.GetPointX(i - 1) + (pValues.GetPointX(i) - pValues.GetPointX(i - 1)) *
1648 ((1. - CL) - pValues.GetPointY(i - 1)) /
1649 (pValues.GetPointY(i) - pValues.GetPointY(i - 1));
1651 lastAbove = thisAbove;
1656 auto testPoint = [&](
double testVal) {
1657 auto hp = nll.hypoPoint(mu->GetName(), testVal, altVal, pllType);
1658 obs_ts->SetPoint(obs_ts->GetN(), testVal, hp.pll().first);
1659 obs_ts->SetPointError(obs_ts->GetN() - 1, 0, hp.pll().second);
1661 if (nToysNull > 0) {
1664 obs_pcls->SetPoint(obs_pcls->GetN(), testVal, (doCLs) ? hp.pCLs_asymp().first : hp.pNull_asymp().first);
1665 obs_pcls->SetPointError(obs_pcls->GetN() - 1, 0, (doCLs) ? hp.pCLs_asymp().second : hp.pNull_asymp().second);
1666 for (
auto &s : expSig) {
1667 exp_pcls[s].SetPoint(exp_pcls[s].GetN(), testVal,
1668 (doCLs) ? hp.pCLs_asymp(s).first : hp.pNull_asymp(s).
first);
1671 Info(
"hypoTest",
"%s=%g: %s=%g sigma_mu=%g %s=%g", mu->GetName(), testVal, obs_ts->GetName(),
1672 obs_ts->GetPointY(obs_ts->GetN() - 1), hp.sigma_mu().first, obs_pcls->GetName(),
1673 obs_pcls->GetPointY(obs_pcls->GetN() - 1));
1675 Info(
"hypoTest",
"%s=%g: %s=%g %s=%g", mu->GetName(), testVal, obs_ts->GetName(),
1676 obs_ts->GetPointY(obs_ts->GetN() - 1), obs_pcls->GetName(), obs_pcls->GetPointY(obs_pcls->GetN() - 1));
1679 if (mu->getBins(
"hypoPoints") <= 0) {
1682 testPoint(mu->getMin(
"hypoPoints"));
1683 testPoint(mu->getMax(
"hypoPoints"));
1684 testPoint((mu->getMax(
"hypoPoints") + mu->getMin(
"hypoPoints")) / 2.);
1686 while (std::abs(obs_pcls->GetPointY(obs_pcls->GetN() - 1) - (1. - CL)) > 0.01) {
1688 double nextTest = getLimit(*obs_pcls);
1689 if (std::isnan(nextTest))
1691 testPoint(nextTest);
1693 for (
auto s : expSig) {
1694 while (std::abs(exp_pcls[s].GetPointY(exp_pcls[s].GetN() - 1) - (1. - CL)) > 0.01) {
1696 double nextTest = getLimit(exp_pcls[s]);
1697 if (std::isnan(nextTest))
1699 testPoint(nextTest);
1704 for (
auto &s : expSig)
1708 for (
int i = 0; i <= mu->getBins(
"hypoPoints"); i++) {
1709 testPoint((i == mu->getBins(
"hypoPoints")) ? mu->getBinning(
"hypoPoints").binHigh(i - 1)
1710 : mu->getBinning(
"hypoPoints").binLow(i));
1714 obs_cls->SetPoint(obs_cls->GetN(), getLimit(*obs_pcls), 0.05);
1715 for (
auto &s : expSig) {
1716 exp_cls[s].SetPoint(exp_cls[s].GetN(), getLimit(exp_pcls[s]), 0.05);
1720 if (exp_pcls[2].GetN() > 1) {
1726 band2down->
SetNameTitle(
".pCLs_2sigma_downUncert",
"");
1732 for (
int i = 0; i < exp_pcls[2].GetN(); i++) {
1733 band2->
SetPoint(band2->
GetN(), exp_pcls[2].GetPointX(i),
1734 exp_pcls[2].GetPointY(i) - exp_pcls[2].GetErrorYlow(i));
1735 band2up->
SetPoint(band2up->
GetN(), exp_pcls[2].GetPointX(i),
1736 exp_pcls[2].GetPointY(i) + exp_pcls[2].GetErrorYhigh(i));
1738 for (
int i = exp_pcls[2].GetN() - 1; i >= 0; i--) {
1739 band2up->
SetPoint(band2up->
GetN(), exp_pcls[2].GetPointX(i),
1740 exp_pcls[2].GetPointY(i) - exp_pcls[2].GetErrorYlow(i));
1742 for (
int i = 0; i < exp_pcls[-2].GetN(); i++) {
1743 band2down->
SetPoint(band2down->
GetN(), exp_pcls[-2].GetPointX(i),
1744 exp_pcls[-2].GetPointY(i) + exp_pcls[-2].GetErrorYhigh(i));
1746 for (
int i = exp_pcls[-2].GetN() - 1; i >= 0; i--) {
1747 band2->
SetPoint(band2->
GetN(), exp_pcls[-2].GetPointX(i),
1748 exp_pcls[-2].GetPointY(i) + exp_pcls[-2].GetErrorYhigh(i));
1749 band2down->
SetPoint(band2down->
GetN(), exp_pcls[-2].GetPointX(i),
1750 exp_pcls[-2].GetPointY(i) - exp_pcls[-2].GetErrorYlow(i));
1760 band2down->
Draw(
"F");
1763 if (exp_pcls[1].GetN() > 1) {
1769 band2down->
SetNameTitle(
".pCLs_1sigma_downUncert",
"");
1775 for (
int i = 0; i < exp_pcls[1].GetN(); i++) {
1776 band2->
SetPoint(band2->
GetN(), exp_pcls[1].GetPointX(i),
1777 exp_pcls[1].GetPointY(i) - exp_pcls[1].GetErrorYlow(i));
1778 band2up->
SetPoint(band2up->
GetN(), exp_pcls[1].GetPointX(i),
1779 exp_pcls[1].GetPointY(i) + exp_pcls[1].GetErrorYhigh(i));
1781 for (
int i = exp_pcls[1].GetN() - 1; i >= 0; i--) {
1782 band2up->
SetPoint(band2up->
GetN(), exp_pcls[1].GetPointX(i),
1783 exp_pcls[1].GetPointY(i) - exp_pcls[1].GetErrorYlow(i));
1785 for (
int i = 0; i < exp_pcls[-1].GetN(); i++) {
1786 band2down->
SetPoint(band2down->
GetN(), exp_pcls[-1].GetPointX(i),
1787 exp_pcls[-1].GetPointY(i) + exp_pcls[-1].GetErrorYhigh(i));
1789 for (
int i = exp_pcls[-1].GetN() - 1; i >= 0; i--) {
1790 band2->
SetPoint(band2->
GetN(), exp_pcls[-1].GetPointX(i),
1791 exp_pcls[-1].GetPointY(i) + exp_pcls[-1].GetErrorYhigh(i));
1792 band2down->
SetPoint(band2down->
GetN(), exp_pcls[-1].GetPointX(i),
1793 exp_pcls[-1].GetPointY(i) - exp_pcls[-1].GetErrorYlow(i));
1800 band2down->
Draw(
"F");
1804 if (exp_cls[0].GetN() > 0) {
1805 exp_pcls[0].SetLineStyle(2);
1806 exp_pcls[0].SetFillColor(
kGreen);
1807 exp_pcls[0].SetMarkerStyle(0);
1811 obs_pcls->Draw(
gPad->GetListOfPrimitives()->IsEmpty() ?
"ALP" :
"LP");
1813 obs_ts->SetLineColor(
kRed);
1814 obs_ts->SetMarkerColor(
kRed);
1818 auto l =
new TLegend(0.5, 0.6, 1. -
gPad->GetRightMargin(), 1. -
gPad->GetTopMargin());
1819 l->SetName(
"legend");
1820 l->AddEntry(obs_ts, obs_ts->GetTitle(),
"LPE");
1821 l->AddEntry(obs_pcls, obs_pcls->GetTitle(),
"LPE");
1823 l->AddEntry(expPlot,
"Expected",
"LFE");
1827 obs_cls->SetMarkerStyle(29);
1828 obs_cls->SetEditable(
false);
1829 obs_cls->Draw(
"LP");
1830 for (
auto s : expSig) {
1831 exp_cls[s].SetMarkerStyle(29);
1832 exp_cls[s].SetEditable(
false);
1833 exp_cls[s].DrawClone(
"LP");
1847 double factor = pow(10.0, digits - ceil(log10(std::abs(
value))));
1848 return std::round(
value * factor) / factor;
1852 const double multiplier = std::pow(10.0, decimal_places);
1853 return std::round(
value * multiplier) / multiplier;
1860 if (!std::isinf(out.second)) {
1861 auto tmp = out.second;
1863 int expo = (out.second == 0) ? 0 : (
int)std::floor(std::log10(std::abs(out.second)));
1866 out.first = (expo >= 0) ? round(out.first) :
round_to_decimal(out.first, -expo);
1867 }
else if (out.second != 0) {
1868 out.first = (expo >= 0) ? round(out.first) :
round_to_decimal(out.first, -expo + 1);
void Info(const char *location, const char *msgfmt,...)
Use this function for informational messages.
void Error(const char *location, const char *msgfmt,...)
Use this function in case an error occurred.
void Warning(const char *location, const char *msgfmt,...)
Use this function in warning situations.
winID h TVirtualViewer3D TVirtualGLPainter p
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void data
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t r
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t result
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void value
char * Form(const char *fmt,...)
Formats a string in a circular formatting buffer.
double evaluate() const override
Evaluate this PDF / function / constant. Needs to be overridden by all derived classes.
ProgressMonitor(const ProgressMonitor &other, const char *name=0)
virtual ~ProgressMonitor()
std::shared_ptr< RooAbsCollection > vars
ProgressMonitor(RooAbsReal &f, int interval=30)
virtual TObject * clone(const char *newname) const override
static ProgressMonitor * me
static void interruptHandler(int signum)
StoredFitResult(RooFitResult *_fr)
std::shared_ptr< RooFitResult > fr
static int minos(RooAbsReal &nll, const RooFitResult &ufit, const char *parName="", const std::shared_ptr< ROOT::Fit::FitConfig > &_fitConfig=nullptr)
static std::shared_ptr< const RooFitResult > minimize(RooAbsReal &nll, const std::shared_ptr< ROOT::Fit::FitConfig > &fitConfig=nullptr, const std::shared_ptr< RooLinkedList > &nllOpts=nullptr)
static std::shared_ptr< RooLinkedList > createNLLOptions()
static TCanvas * hypoTest(RooWorkspace &w, const xRooFit::Asymptotics::PLLType &pllType=xRooFit::Asymptotics::Unknown)
static std::shared_ptr< ROOT::Fit::FitConfig > createFitConfig()
static std::pair< double, double > matchPrecision(const std::pair< double, double > &in)
This xRooNLLVar object has several special methods, e.g.
xRooFitResult minimize(const std::shared_ptr< ROOT::Fit::FitConfig > &=nullptr)
Class describing the configuration of the fit, options and parameter settings using the ROOT::Fit::Pa...
void SetMinosErrors(bool on=true)
set Minos errors computation to be performed after fitting
const std::string & MinimizerAlgoType() const
return type of minimizer algorithms
bool ParabErrors() const
do analysis for parabolic errors
void SetUpdateAfterFit(bool on=true)
Update configuration after a fit using the FitResult.
void SetParabErrors(bool on=true)
set parabolic errors
const std::string & MinimizerType() const
return type of minimizer package
ROOT::Math::MinimizerOptions & MinimizerOptions()
access to the minimizer control parameter (non const method)
bool MinosErrors() const
do minos errors analysis on the parameters
bool IsValid() const
True if fit successful, otherwise false.
double Edm() const
Expected distance from minimum.
int Status() const
minimizer status code
const FitResult & Result() const
get fit result
const FitConfig & Config() const
access to the fit configuration (const method)
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
bool GetValue(const char *name, T &t) const
void SetMaxFunctionCalls(unsigned int maxfcn)
set maximum of function calls
void SetStrategy(int stra)
set the strategy
void SetMaxIterations(unsigned int maxiter)
set maximum iterations (one iteration can have many function calls)
int Strategy() const
strategy
const IOptions * ExtraOptions() const
return extra options (NULL pointer if they are not present)
double Tolerance() const
absolute tolerance
unsigned int MaxIterations() const
max iterations
unsigned int MaxFunctionCalls() const
max number of function calls
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
Prevent 'AlwaysDirty' mode for this node.
bool isConstant() const
Check if the "Constant" attribute is set.
const Text_t * getStringAttribute(const Text_t *key) const
Get string attribute mapped under key 'key'.
RooWorkspace * workspace() const
virtual void constOptimizeTestStatistic(ConstOpCode opcode, bool doAlsoTrackingOpt=true)
Interface function signaling a request to perform constant term optimization.
bool getAttribute(const Text_t *name) const
Check if a named attribute is set. By default, all attributes are unset.
RooFit::OwningPtr< RooArgSet > getVariables(bool stripDisconnected=true) const
Return RooArgSet with all variables (tree leaf nodes of expression tree)
RooAbsArg * findServer(const char *name) const
Return server of this with name name. Returns nullptr if not found.
RooAbsCollection * selectByAttrib(const char *name, bool value) const
Create a subset of the current collection, consisting only of those elements with the specified attri...
double getRealValue(const char *name, double defVal=0.0, bool verbose=false) const
Get value of a RooAbsReal stored in set with given name.
virtual bool remove(const RooAbsArg &var, bool silent=false, bool matchByNameOnly=false)
Remove the specified argument from our list.
Storage_t const & get() const
Const access to the underlying stl container.
void assignFast(const RooAbsCollection &other, bool setValDirty=true) const
Functional equivalent of assign() but assumes this and other collection have same layout.
virtual bool add(const RooAbsArg &var, bool silent=false)
Add the specified argument to list.
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 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.
RooAbsArg * find(const char *name) const
Find object with given name in list.
Abstract base class for binned and unbinned datasets.
Abstract interface for all probability density functions.
virtual double getMax(const char *name=nullptr) const
Get maximum of currently defined range.
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.
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.
Class RooBinning is an implements RooAbsBinning in terms of an array of boundary values,...
Named container for two doubles, two integers two object points and three string pointers that can be...
RooDataSet is a container class to hold unbinned data.
RooRealVar * weightVar() const
Returns a pointer to the weight variable (if set).
A one-time forward iterator working on RooLinkedList or RooAbsCollection.
RooAbsArg * next()
Return next element or nullptr if at end.
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.
RooLinkedList is an collection class for internal use, storing a collection of RooAbsArg pointers in ...
RooMinimizer is a wrapper class around ROOT::Fit:Fitter that provides a seamless interface between th...
void optimizeConst(int flag)
If flag is true, perform constant term optimization on function being minimized.
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.
ROOT::Fit::Fitter * fitter()
Return underlying ROOT fitter object.
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
Class RooObjCacheManager is an implementation of class RooCacheManager<RooAbsCacheElement> and specia...
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.
RooRealVar represents a variable that can be changed from the outside.
void setVal(double value) override
Set value of variable to 'value'.
void setError(double value)
bool hasBinning(const char *name) const override
Returns true if variable has a binning named 'name'.
Facilitates simultaneous fitting of multiple PDFs to subsets of a given dataset.
static RooAbsData * GenerateAsimovData(const RooAbsPdf &pdf, const RooArgSet &observables)
generate the asimov data for the observables (not the global ones) need to deal with the case of a si...
RooStringVar is 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.
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/...".
void SetName(const char *newname) override
Set the name for directory If the directory name is changed after the directory was written once,...
A TGraphErrors is a TGraph with error bars.
A TGraph is an object made of two arrays X and Y with npoints each.
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.
This class displays a legend box (TPaveText) containing several legend entries.
TMatrixTBase< Element > & ResizeTo(Int_t nrows, Int_t ncols, Int_t=-1) override
Set size of the matrix to nrows x ncols New dynamic elements are created, the overlapping part of the...
The TNamed class is the base class for all named ROOT classes.
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.
virtual const char * GetName() const
Returns name of object.
virtual TObject * DrawClone(Option_t *option="") const
Draw a clone of this object in the current selected pad with: gROOT->SetSelectedPad(c1).
virtual void Delete(Option_t *option="")
Delete this object.
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
virtual 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.
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 ].
Double_t RealTime()
Stop the stopwatch (if it is running) and return the realtime (in seconds) passed between the start a...
void Start(Bool_t reset=kTRUE)
Start the stopwatch.
void Continue()
Resume a stopped stopwatch.
Provides iteration through tokens of a given string.
Bool_t NextToken()
Get the next token, it is stored in this TString.
Double_t Atof() const
Return floating-point value contained in string.
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 Offset(std::string const &mode)
RooCmdArg Optimize(Int_t flag=2)
RooCmdArg Extended(bool flag=true)
RooCmdArg ExpectedData(bool flag=true)
MsgLevel
Verbosity level for RooMsgService::StreamConfig in RooMsgService.
void Sort(Index n, const Element *a, Index *index, Bool_t down=kTRUE)
Sort the n elements of the array a of generic templated type Element.
#define END_XROOFIT_NAMESPACE
double round_to_decimal(double value, int decimal_places)
double round_to_digits(double value, int digits)