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;
72const char *xRooFit::GetVersion()
76const char *xRooFit::GetVersionDate()
83 return RooCmdArg(
"ReuseNLL",
flag, 0, 0, 0,
nullptr,
nullptr,
nullptr,
nullptr);
93 return RooCmdArg(
"StrategySequence", 0, 0, 0, 0, val);
101xRooNLLVar xRooFit::createNLL(
const std::shared_ptr<RooAbsPdf> pdf,
const std::shared_ptr<RooAbsData>
data,
109 return createNLL(std::shared_ptr<RooAbsPdf>(&pdf, [](
RooAbsPdf *) {}),
127 return createNLL(pdf,
data,
l);
130std::shared_ptr<const RooFitResult>
132 const std::pair<std::shared_ptr<RooAbsData>, std::shared_ptr<const RooAbsCollection>> &
data,
140std::shared_ptr<const RooFitResult> xRooFit::fitTo(
RooAbsPdf &pdf,
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);
191 std::unique_ptr<RooArgSet> globs(_pdf->getObservables(t));
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));
225 <<
"xRooFit::generateFrom : constraint term " <<
thePdf->GetName()
226 <<
" of type " << className <<
" is a non-supported type - result might be not correct "
234 pois->setNoRounding(
true);
245 <<
"xRooFit::generateFrom : constraint term " <<
thePdf->GetName()
246 <<
" has no direct dependence on global observable- cannot generate it " << std::endl;
266 <<
"xRooFit::generateFrom : constraint term " <<
thePdf->GetName()
267 <<
" is a Gamma distribution and no server named theta is found. Assume that the Gamma "
275 (!
rrv2->isConstant() || !
rrv2->InheritsFrom(
"RooConstVar"))) {
280 <<
"xRooFit::generateFrom : constraint term " <<
thePdf->GetName()
281 <<
" constraint term has more server depending on nuisance- cannot generate it "
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(),
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)
328 std::string
cLabel =
c->GetName();
330 auto p = s->getPdf(
cLabel.c_str());
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()));
380 if (_pdf->canBeExtended()) {
398 auto binning =
b.second;
399 v->setBinning(*binning);
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());
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();
460std::shared_ptr<RooLinkedList> xRooFit::createNLLOptions()
466 for (
auto opt : *defaultNLLOptions()) {
467 out->Add(opt->Clone(
nullptr));
473std::shared_ptr<RooLinkedList> xRooFit::defaultNLLOptions()
475 if (sDefaultNLLOptions)
476 return sDefaultNLLOptions;
484 return sDefaultNLLOptions;
487std::shared_ptr<ROOT::Fit::FitConfig> xRooFit::createFitConfig()
489 return std::make_shared<ROOT::Fit::FitConfig>(*defaultFitConfig());
492std::shared_ptr<ROOT::Fit::FitConfig> xRooFit::defaultFitConfig()
494 if (sDefaultFitConfig)
495 return sDefaultFitConfig;
496 sDefaultFitConfig = std::make_shared<ROOT::Fit::FitConfig>();
497 auto &fitConfig = *sDefaultFitConfig;
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);
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");
529 extraOpts->SetValue(
"TrackProgress", 30);
536 return sDefaultFitConfig;
541 return const_cast<ROOT::Math::IOptions *
>(defaultFitConfig()->MinimizerOptions().ExtraOptions());
552 std::cout <<
"Minimization interrupted ... will exit as soon as possible" << std::endl;
569 vars.reset(std::unique_ptr<RooAbsCollection>(
f.getVariables())->selectByAttrib(
"Constant",
false));
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;
647 std::vector<std::pair<double, std::string>>
parDeltas;
650 parDeltas.emplace_back(std::pair<double, std::string>(
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++) {
670 if (
gROOT->FromPopUp() &&
gROOT->GetListOfBrowsers()->At(0)) {
672 std::string status =
sout.str();
676 if (status.find(
" : ") != std::string::npos) {
677 status_part = status.substr(0, status.find(
" : "));
678 status = status.substr(status.find(
" : ") + 3);
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)
740 if (nll.getStringAttribute(
"userPars")) {
742 while (
st.NextToken()) {
753 auto _nllVars = std::unique_ptr<RooAbsCollection>(_nll->getVariables());
755 std::unique_ptr<RooAbsCollection> constPars(
_nllVars->selectByAttrib(
"Constant",
true));
757 std::unique_ptr<RooAbsCollection>
floatPars(
_nllVars->selectByAttrib(
"Constant",
false));
764#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 29, 00)
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);
786 if (
auto keys =
nllDir->GetListOfKeys(); keys) {
787 for (
auto &&k : *keys) {
789 if (cl->InheritsFrom(
"RooFitResult")) {
806 for (
auto &
p : *constPars) {
813 _p->getCurrentIndex() !=
c->getCurrentIndex()) {
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;
862 result = std::make_shared<RooFitResult>();
870 result->setCovarianceMatrix(
d);
872 result->setMinNLL(_nll->getVal());
882 if (!
cacheDir->GetDirectory(nll.GetName()))
884 if (
auto dir =
cacheDir->GetDirectory(nll.GetName()); dir) {
890 if (!dir->FindKey(
nllOpts->GetName())) {
903 std::shared_ptr<RooFitResult> out;
908 if (
p->isCategory()) {
917 std::shared_ptr<const RooFitResult>
bestFr;
918 for (
auto c : allCats) {
920 Info(
"minimize",
"Minimizing with discrete %s",
c.first.c_str());
923 Warning(
"minimize",
"Minimization with discrete %s failed",
c.first.c_str());
931 floatCats.setAttribAll(
"Constant",
false);
937 out = std::make_shared<RooFitResult>(*
bestFr);
938 const_cast<RooArgList &
>(out->floatParsFinal())
939 .addClone(*std::unique_ptr<RooAbsCollection>(out->constPars().selectCommon(
floatCats)));
945 bool restore = !fitConfig.UpdateAfterFit();
946 bool minos = fitConfig.MinosErrors();
949 int strategy = fitConfig.MinimizerOptions().Strategy();
957 _minimizer.
fitter()->Config() = fitConfig;
969 bool autoMaxCalls = (_minimizer.
fitter()->Config().MinimizerOptions().MaxFunctionCalls() == 0);
971 _minimizer.
fitter()->Config().MinimizerOptions().SetMaxFunctionCalls(
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);
994 _minimizer.
fitter()->Config().MinimizerOptions().ExtraOptions()->GetValue(
"OptimizeConst",
constOptimize);
1016 if (
minim ==
"Minuit2") {
1023 Warning(
"minimize",
"Strategy %d not specified in StrategySequence %s ... defaulting to start of sequence",
1027 }
else if (
minim ==
"Minuit")
1036 algo =
"migradImproved";
1048 fff->fState =
minim +
algo + std::to_string(_minimizer.
fitter()->Config().MinimizerOptions().Strategy());
1052 }
catch (
const std::exception &
e) {
1053 std::cerr <<
"Exception while minimizing: " <<
e.what() << std::endl;
1062 throw std::runtime_error(
"Keyboard interrupt while minimizing");
1066 status = _minimizer.
fitter()
1069 minim = _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") {
1079 Warning(
"fitTo",
"%s Hit max function calls of %d",
fitName.Data(),
1080 _minimizer.
fitter()->Config().MinimizerOptions().MaxFunctionCalls());
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);
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);
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();
1173 "HesseStrategy %d not specified in HesseStrategySequence %s ... defaulting to start of sequence",
1177 while (
sIdx != -1) {
1182 if (_minimizer.
fitter()->GetMinimizer()->CovMatrixStatus() == 3) {
1198 fff->counter2 =
fff->counter;
1206 auto _status = _minimizer.
hesse();
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());
1246 if (_status == 0 && _minimizer.
fitter()->GetMinimizer()->CovMatrixStatus() == 3) {
1249 }
else if (_status == 0) {
1258 if (status == 0 &&
minos) {
1259 if (std::unique_ptr<RooAbsCollection>
mpars(
floatPars->selectByAttrib(
"minos",
true)); !
mpars->empty()) {
1261 fff->fState =
"Minos";
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;
1304 if (!std::isnan(
dCovar)) {
1306 .addClone(
RooRealVar(
".dCovar",
"dCovar from minimization",
dCovar),
true);
1317 double vRange =
v->getMax() -
v->getMin();
1323 auto tmp =
v->getVal();
1324 v->setVal(
v->getMin());
1327 static_cast<RooRealVar *
>(out->floatParsFinal().find(
v->GetName()))->
setVal(
v->getMin());
1336 if (
v->hasRange(
"physical"))
1341 (
v->getMin() >
v->getVal() -
v->getError() ||
v->getMax() <
v->getVal() +
v->getError())) {
1343 Info(
"minimize",
"PARLIM: %s (%f +/- %f) range (%f - %f)",
v->GetName(),
v->getVal(),
v->getError(),
1344 v->getMin(),
v->getMax());
1351 Warning(
"minimize",
"BOUNDCHK: Parameters within %g%% limit in fit result: %s",
boundaryCheck * 100,
1356 Warning(
"minimize",
"BOUNDCHK: Parameters near limit in fit result");
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();
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());
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()));
1436 if (!
cacheDir->GetDirectory(nll.GetName()))
1438 if (
auto dir =
cacheDir->GetDirectory(nll.GetName()); dir) {
1444 if (!dir->FindKey(
nllOpts->GetName())) {
1451 if (!fitConfig.MinimizerOptions().ExtraOptions()->GetValue(
"Name",
configName)) {
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));
1495 bool pErrs = fitConfig.ParabErrors();
1496 fitConfig.SetParabErrors(
false);
1497 double mErrs = fitConfig.MinosErrors();
1498 fitConfig.SetMinosErrors(
false);
1507 bool isConst = par->isConstant();
1508 par->setConstant(
true);
1530 return std::numeric_limits<double>::quiet_NaN();
1533 status +=
result->status() * 10;
1539 std::cout <<
"Warning: Alternative best-fit of " << par->GetName() <<
" @ " <<
val_guess <<
" vs "
1540 <<
val_best <<
" (delta=" << tmu / 2. <<
")" << std::endl;
1546 status = (status / 10) * 10 + 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;
1593 status = (status / 10) * 10 + 3;
1601 status = (status / 10) * 10 + 2;
1605 status = (status / 10) * 10 + 2;
1611 std::cout <<
"Finished in " <<
nrItr <<
" iterations." << std::endl;
1613 std::cout << std::endl;
1619 par_hat->setError(std::numeric_limits<double>::quiet_NaN());
1620 double lo =
par_hat->getErrorLo();
1622 if (std::isnan(
hi)) {
1628 if (std::isnan(lo)) {
1635 fitConfig.SetParabErrors(
pErrs);
1636 fitConfig.SetMinosErrors(
mErrs);
1657 std::deque<RooAbsArg *>
topPdfs;
1659 for (
auto p :
w.allPdfs()) {
1660 if (
p->hasClients())
1663 if (
p->getAttribute(
"hypoTest")) {
1670 Error(
"hypoTest",
"Cannot find top-level pdf in workspace");
1672 }
else if (
topPdfs.size() > 1) {
1675 Error(
"hypoTest",
"Multiple top-level pdfs. Flag which one to test with "
1676 "w->pdf(\"pdfName\")->setAttribute(\"hypoTest\",true)");
1679 Error(
"hypoTest",
"Multiple top-level pdfs flagged for hypoTest -- pick one.");
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());
1710 auto _globs = xRooNode(
w).datasets()[
obsData->GetName()]->globs();
1711 obsGlobs = std::make_shared<RooArgSet>();
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) {
1726 if (poi.
size() > 1) {
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\"))");
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};
1786 std::map<int, TGraphErrors>
exp_pcls;
1787 std::map<int, TGraphErrors>
exp_cls;
1796 double _out = std::numeric_limits<double>::quiet_NaN();
1798 for (
int i = 0; i <
pValues.GetN(); i++) {
1804 ((1. -
CL) -
pValues.GetPointY(i - 1)) /
1814 obs_ts->SetPoint(obs_ts->GetN(),
testVal,
hp.pll().first);
1815 obs_ts->SetPointError(obs_ts->GetN() - 1, 0,
hp.pll().second);
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(),
1831 Info(
"hypoTest",
"%s=%g: %s=%g %s=%g", mu->GetName(),
testVal, obs_ts->GetName(),
1836 if (mu->getBins(
"hypoPoints") <= 0) {
1841 testPoint((mu->getMax(
"hypoPoints") + mu->getMin(
"hypoPoints")) / 2.);
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));
1879 band2->SetNameTitle(
".pCLs_2sigma",
"2 sigma band");
1881 band2up->SetNameTitle(
".pCLs_2sigma_upUncert",
"");
1883 band2down->SetNameTitle(
".pCLs_2sigma_downUncert",
"");
1889 for (
int i = 0; i <
exp_pcls[2].GetN(); i++) {
1895 for (
int i =
exp_pcls[2].GetN() - 1; i >= 0; i--) {
1899 for (
int i = 0; i <
exp_pcls[-2].GetN(); i++) {
1903 for (
int i =
exp_pcls[-2].GetN() - 1; i >= 0; i--) {
1922 band2->SetNameTitle(
".pCLs_1sigma",
"1 sigma band");
1924 band2up->SetNameTitle(
".pCLs_1sigma_upUncert",
"");
1926 band2down->SetNameTitle(
".pCLs_1sigma_downUncert",
"");
1932 for (
int i = 0; i <
exp_pcls[1].GetN(); i++) {
1938 for (
int i =
exp_pcls[1].GetN() - 1; i >= 0; i--) {
1942 for (
int i = 0; i <
exp_pcls[-1].GetN(); i++) {
1946 for (
int i =
exp_pcls[-1].GetN() - 1; i >= 0; i--) {
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");
1980 l->AddEntry(
expPlot,
"Expected",
"LFE");
1988 exp_cls[s].SetMarkerStyle(29);
1989 exp_cls[s].SetEditable(
false);
2004 double factor = pow(10.0,
digits - ceil(log10(std::abs(
value))));
2005 return std::round(
value * factor) / factor;
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)));
2024 }
else if (out.second != 0) {
static void indent(ostringstream &buf, int indent_level)
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
void Info(const char *location, const char *msgfmt,...)
Use this function for informational messages.
void Error(const char *location, const char *msgfmt,...)
Use this function in case an error occurred.
void Warning(const char *location, const char *msgfmt,...)
Use this function in warning situations.
winID h TVirtualViewer3D TVirtualGLPainter p
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void data
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t r
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t result
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void value
char * Form(const char *fmt,...)
Formats a string in a circular formatting buffer.
R__EXTERN TSystem * gSystem
double getValV(const RooArgSet *) const override
Return value of object.
double evaluate() const override
Evaluate this PDF / function / constant. Needs to be overridden by all derived classes.
bool setData(RooAbsData &data, bool cloneData) override
ProgressMonitor(const ProgressMonitor &other, const char *name=nullptr)
~ProgressMonitor() override
void printMultiline(std::ostream &os, Int_t contents, bool verbose=false, TString indent="") const override
Interface for detailed printing of object.
TObject * clone(const char *newname) const override
std::shared_ptr< RooAbsCollection > vars
bool getParameters(const RooArgSet *observables, RooArgSet &outputSet, bool stripDisconnected) const override
Fills a list with leaf nodes in the arg tree starting with ourself as top node that don't match any o...
void applyWeightSquared(bool flag) override
Disables or enables the usage of squared weights.
void constOptimizeTestStatistic(ConstOpCode opcode, bool doAlsoTrackingOpt) override
Interface function signaling a request to perform constant term optimization.
ProgressMonitor(RooAbsReal &f, int interval=30)
static ProgressMonitor * me
double defaultErrorLevel() const override
static void interruptHandler(int signum)
StoredFitResult(RooFitResult *_fr)
std::shared_ptr< RooFitResult > fr
!
static int minos(RooAbsReal &nll, const RooFitResult &ufit, const char *parName="", const std::shared_ptr< ROOT::Fit::FitConfig > &_fitConfig=nullptr)
static std::shared_ptr< const RooFitResult > minimize(RooAbsReal &nll, const std::shared_ptr< ROOT::Fit::FitConfig > &fitConfig=nullptr, const std::shared_ptr< RooLinkedList > &nllOpts=nullptr)
static std::shared_ptr< RooLinkedList > createNLLOptions()
static TCanvas * hypoTest(RooWorkspace &w, const xRooFit::Asymptotics::PLLType &pllType=xRooFit::Asymptotics::Unknown)
static std::shared_ptr< ROOT::Fit::FitConfig > createFitConfig()
static std::pair< double, double > matchPrecision(const std::pair< double, double > &in)
This xRooNLLVar object has several special methods, e.g.
xRooFitResult minimize(const std::shared_ptr< ROOT::Fit::FitConfig > &=nullptr)
Class describing the configuration of the fit, options and parameter settings using the ROOT::Fit::Pa...
class implementing generic options for a numerical algorithm Just store the options in a map of strin...
Generic interface for defining configuration options of a numerical algorithm.
const_iterator begin() const
const_iterator end() const
Common abstract base class for objects that represent a value and a "shape" in RooFit.
RooWorkspace * _myws
! In which workspace do I live, if any
RooFit::OwningPtr< RooArgSet > getParameters(const RooAbsData *data, bool stripDisconnected=true) const
Create a list of leaf nodes in the arg tree starting with ourself as top node that don't match any of...
RooWorkspace * workspace() const
virtual void constOptimizeTestStatistic(ConstOpCode opcode, bool doAlsoTrackingOpt=true)
Interface function signaling a request to perform constant term optimization.
bool getAttribute(const Text_t *name) const
Check if a named attribute is set. By default, all attributes are unset.
RooFit::OwningPtr< RooArgSet > getVariables(bool stripDisconnected=true) const
Return RooArgSet with all variables (tree leaf nodes of expression tree)
virtual void applyWeightSquared(bool flag)
Disables or enables the usage of squared weights.
A space to attach TBranches.
double getRealValue(const char *name, double defVal=0.0, bool verbose=false) const
Get value of a RooAbsReal stored in set with given name.
virtual bool remove(const RooAbsArg &var, bool silent=false, bool matchByNameOnly=false)
Remove the specified argument from our list.
void assignFast(const RooAbsCollection &other, bool setValDirty=true) const
Functional equivalent of assign() but assumes this and other collection have same layout.
virtual bool add(const RooAbsArg &var, bool silent=false)
Add the specified argument to list.
Storage_t::size_type size() const
RooAbsArg * first() const
virtual RooAbsArg * addClone(const RooAbsArg &var, bool silent=false)
Add a clone of the specified argument to list.
std::string contentsString() const
Return comma separated list of contained object names as STL string.
Abstract base class for binned and unbinned datasets.
Abstract interface for all probability density functions.
Abstract base class for objects that represent a real value and implements functionality common to al...
double getVal(const RooArgSet *normalisationSet=nullptr) const
Evaluate object.
virtual double defaultErrorLevel() const
virtual bool setData(RooAbsData &, bool=true)
void printMultiline(std::ostream &os, Int_t contents, bool verbose=false, TString indent="") const override
Structure printing.
RooArgList is a container object that can hold multiple RooAbsArg objects.
RooArgSet is a container object that can hold multiple RooAbsArg objects.
RooArgSet * selectByAttrib(const char *name, bool value) const
Use RooAbsCollection::selectByAttrib(), but return as RooArgSet.
Implements a RooAbsBinning in terms of an array of boundary values, posing no constraints on the choi...
Named container for two doubles, two integers two object points and three string pointers that can be...
Container class to hold unbinned data.
RooRealVar * weightVar() const
Returns a pointer to the weight variable (if set).
RooFitResult is a container class to hold the input and output of a PDF fit to a dataset.
Int_t statusCodeHistory(UInt_t icycle) const
const char * statusLabelHistory(UInt_t icycle) const
const RooArgList & floatParsFinal() const
Return list of floating parameters after fit.
Int_t status() const
Return MINUIT status code.
UInt_t numStatusHistory() const
double minNll() const
Return minimized -log(L) value.
Collection class for internal use, storing a collection of RooAbsArg pointers in a doubly linked list...
Wrapper class around ROOT::Math::Minimizer that provides a seamless interface between the minimizer f...
auto fitter()
Return underlying ROOT fitter object.
RooFit::OwningPtr< RooFitResult > save(const char *name=nullptr, const char *title=nullptr)
Save and return a RooFitResult snapshot of current minimizer status.
int minos()
Execute MINOS.
int hesse()
Execute HESSE.
void optimizeConst(int flag) R__DEPRECATED(6
If flag is true, perform constant term optimization on function being minimized.
int minimize(const char *type, const char *alg=nullptr)
Minimise the function passed in the constructor.
void setStrategy(int istrat)
Change MINUIT strategy to istrat.
static RooMsgService & instance()
Return reference to singleton instance.
Implementation of a RooCacheManager<RooAbsCacheElement> that specializes in the storage of cache elem...
Efficient implementation of a product of PDFs of the form.
static TRandom * randomGenerator()
Return a pointer to a singleton random-number generator implementation.
Variable that can be changed from the outside.
void setVal(double value) override
Set value of variable to 'value'.
bool hasBinning(const char *name) const override
Returns true if variable has a binning named 'name'.
Facilitates simultaneous fitting of multiple PDFs to subsets of a given dataset.
static RooAbsData * GenerateAsimovData(const RooAbsPdf &pdf, const RooArgSet &observables)
generate the asimov data for the observables (not the global ones) need to deal with the case of a si...
A RooAbsArg implementing string values.
Joins several RooAbsCategoryLValue objects into a single category.
bool setIndex(value_type index, bool printError=true) override
Set the value of the super category to the specified index.
Persistable container for RooFit projects.
Using a TBrowser one can browse all ROOT objects.
static TCanvas * MakeDefCanvas()
Static function to build a default canvas.
TClass instances represent classes, structs and namespaces in the ROOT type system.
static TClass * GetClass(const char *name, Bool_t load=kTRUE, Bool_t silent=kFALSE)
Static method returning pointer to TClass of the specified class name.
This class stores the date and time with a precision of one second in an unsigned 32 bit word (950130...
const char * AsString() const
Return the date & time as a string (ctime() format).
Describe directory structure in memory.
A TGraphErrors is a TGraph with error bars.
A TGraph is an object made of two arrays X and Y with npoints each.
void SetNameTitle(const char *name="", const char *title="") override
Set graph name and title.
Book space in a file, create I/O buffers, to fill them, (un)compress them.
This class displays a legend box (TPaveText) containing several legend entries.
TMatrixTBase< Element > & ResizeTo(Int_t nrows, Int_t ncols, Int_t=-1) override
Set size of the matrix to nrows x ncols New dynamic elements are created, the overlapping part of the...
The TNamed class is the base class for all named ROOT classes.
const char * GetName() const override
Returns name of object.
Mother of all ROOT objects.
virtual void Delete(Option_t *option="")
Delete this object.
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
virtual void Draw(Option_t *option="")
Default Draw method for all objects.
void RedrawAxis(Option_t *option="") override
Redraw the frame axis.
Double_t RealTime()
Stop the stopwatch (if it is running) and return the realtime (in seconds) passed between the start a...
void Start(Bool_t reset=kTRUE)
Start the stopwatch.
void Continue()
Resume a stopped stopwatch.
Provides iteration through tokens of a given string.
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
virtual Bool_t ProcessEvents()
Process pending events (GUI, timers, sockets).
This class defines a UUID (Universally Unique IDentifier), also known as GUIDs (Globally Unique IDent...
TDatime GetTime() const
Get time from UUID.
const char * AsString() const
Return UUID as string. Copy string immediately since it will be reused.
RooCmdArg WeightVar(const char *name="weight", bool reinterpretAsWeight=false)
RooCmdArg Offset(std::string const &mode)
RooCmdArg Optimize(Int_t flag=2) R__DEPRECATED(6
RooCmdArg Extended(bool flag=true)
RooCmdArg ExpectedData(bool flag=true)
double nll(double pdf, double weight, int binnedL, int doBinOffset)
MsgLevel
Verbosity level for RooMsgService::StreamConfig in RooMsgService.
void Sort(Index n, const Element *a, Index *index, Bool_t down=kTRUE)
Sort the n elements of the array a of generic templated type Element.
#define BEGIN_XROOFIT_NAMESPACE
#define END_XROOFIT_NAMESPACE
double round_to_decimal(double value, int decimal_places)
double round_to_digits(double value, int digits)