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                           << 
"AsymptoticCalculator::MakeAsimovData:constraint term " << 
thePdf->GetName()
 
  226                           << 
" of type " << className << 
" is a non-supported type - result might be not correct " 
  234                        pois->setNoRounding(
true);
 
  245                              << 
"AsymptoticCalculator::MakeAsimovData:constraint term " << 
thePdf->GetName()
 
  246                              << 
" has no direct dependence on global observable- cannot generate it " << std::endl;
 
  266                              << 
"AsymptoticCalculator::MakeAsimovData: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                                 << 
"AsymptoticCalculator::MakeAsimovData:constraint term " << 
thePdf->GetName()
 
  281                                 << 
" constraint term has more server depending on nuisance- cannot generate it " 
  297                           << 
"AsymptoticCalculator::MakeAsimovData - can't find nuisance for constraint term - global " 
  298                              "observables will not be set to Asimov value " 
  299                           << 
thePdf->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>(
 
  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());
 
  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;
 
  646            std::vector<std::pair<double, std::string>> 
parDeltas;
 
  649               parDeltas.emplace_back(std::pair<double, std::string>(
 
  653                      [](
auto &left, 
auto &right) { return std::abs(left.first) > std::abs(right.first); });
 
  655            for (i = 0; i < std::min(3, 
int(
parDeltas.size())); i++) {
 
  669         if (
gROOT->FromPopUp() && 
gROOT->GetListOfBrowsers()->At(0)) {
 
  671            std::string status = 
sout.str();
 
  675               if (status.find(
" : ") != std::string::npos) {
 
  676                  status_part = status.substr(0, status.find(
" : "));
 
  677                  status = status.substr(status.find(
" : ") + 3);
 
  687         std::cerr << 
sout.str() << std::endl;
 
 
  703   mutable double minVal = std::numeric_limits<double>::infinity();
 
  704   mutable double prevMin = std::numeric_limits<double>::infinity();
 
  710   std::shared_ptr<RooAbsCollection> 
vars;
 
 
  723                                                      const std::shared_ptr<ROOT::Fit::FitConfig> &
_fitConfig,
 
  724                                                      const std::shared_ptr<RooLinkedList> &
nllOpts)
 
  739   if (nll.getStringAttribute(
"userPars")) {
 
  741      while (
st.NextToken()) {
 
  752   auto _nllVars = std::unique_ptr<RooAbsCollection>(_nll->getVariables());
 
  754   std::unique_ptr<RooAbsCollection> constPars(
_nllVars->selectByAttrib(
"Constant", 
true));
 
  756   std::unique_ptr<RooAbsCollection> 
floatPars(
_nllVars->selectByAttrib(
"Constant", 
false));
 
  763#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 29, 00) 
  768   if (fitConfig.MinimizerOptions().ExtraOptions()) {
 
  769      fitConfig.MinimizerOptions().ExtraOptions()->GetNamedValue(
"StrategySequence", s);
 
  770      fitConfig.MinimizerOptions().ExtraOptions()->GetIntValue(
"TrackProgress", 
_progress);
 
  771      fitConfig.MinimizerOptions().ExtraOptions()->GetRealValue(
"BoundaryCheck", 
boundaryCheck);
 
  772      fitConfig.MinimizerOptions().ExtraOptions()->GetIntValue(
"LogSize", 
logSize);
 
  773      fitConfig.MinimizerOptions().ExtraOptions()->GetIntValue(
"HesseStrategy", 
hesseStrategy);
 
  774      fitConfig.MinimizerOptions().ExtraOptions()->GetNamedValue(
"HesseStrategySequence", 
hs);
 
  785         if (
auto keys = 
nllDir->GetListOfKeys(); keys) {
 
  786            for (
auto &&k : *keys) {
 
  788               if (cl->InheritsFrom(
"RooFitResult")) {
 
  805                        for (
auto &
p : *constPars) {
 
  812                                     _p->getCurrentIndex() != 
c->getCurrentIndex()) {
 
  824                              if (!_p->getAttribute(
"global") && std::abs(_p->getVal() - 
v->getVal()) > 1
e-12) {
 
  847   if (nll.getAttribute(
"readOnly"))
 
  850   int printLevel = fitConfig.MinimizerOptions().PrintLevel();
 
  856   if (
floatPars->empty() || fitConfig.MinimizerOptions().MaxFunctionCalls() == 1) {
 
  857      std::shared_ptr<RooFitResult> 
result;
 
  861      result = std::make_shared<RooFitResult>(); 
 
  869      result->setCovarianceMatrix(
d);
 
  871      result->setMinNLL(_nll->getVal());
 
  881         if (!
cacheDir->GetDirectory(nll.GetName()))
 
  883         if (
auto dir = 
cacheDir->GetDirectory(nll.GetName()); dir) {
 
  889               if (!dir->FindKey(
nllOpts->GetName())) {
 
  902   std::shared_ptr<RooFitResult> out;
 
  907      if (
p->isCategory()) {
 
  916      std::shared_ptr<const RooFitResult> 
bestFr;
 
  917      for (
auto c : allCats) {
 
  919         Info(
"minimize", 
"Minimizing with discrete %s", 
c.first.c_str());
 
  922            Warning(
"minimize", 
"Minimization with discrete %s failed", 
c.first.c_str());
 
  930      floatCats.setAttribAll(
"Constant", 
false);
 
  936      out = std::make_shared<RooFitResult>(*
bestFr);
 
  937      const_cast<RooArgList &
>(out->floatParsFinal())
 
  938         .addClone(*std::unique_ptr<RooAbsCollection>(out->constPars().selectCommon(
floatCats)));
 
  944   bool restore = !fitConfig.UpdateAfterFit();
 
  945   bool minos = fitConfig.MinosErrors();
 
  948      int strategy = fitConfig.MinimizerOptions().Strategy();
 
  956      _minimizer.
fitter()->Config() = fitConfig;
 
  968      bool autoMaxCalls = (_minimizer.
fitter()->Config().MinimizerOptions().MaxFunctionCalls() == 0);
 
  970         _minimizer.
fitter()->Config().MinimizerOptions().SetMaxFunctionCalls(
 
  973      if (_minimizer.
fitter()->Config().MinimizerOptions().MaxIterations() == 0) {
 
  974         _minimizer.
fitter()->Config().MinimizerOptions().SetMaxIterations(500 * 
floatPars->size());
 
  977      bool hesse = _minimizer.
fitter()->Config().ParabErrors();
 
  978      _minimizer.
fitter()->Config().SetParabErrors(
 
  980      _minimizer.
fitter()->Config().SetMinosErrors(
false);
 
  981      _minimizer.
fitter()->Config().SetUpdateAfterFit(
true); 
 
  993      _minimizer.
fitter()->Config().MinimizerOptions().ExtraOptions()->GetValue(
"OptimizeConst", 
constOptimize);
 
 1015      if (
minim == 
"Minuit2") {
 
 1022            Warning(
"minimize", 
"Strategy %d not specified in StrategySequence %s ... defaulting to start of sequence",
 
 1026      } 
else if (
minim == 
"Minuit")
 
 1035            algo = 
"migradImproved";
 
 1047            fff->fState = 
minim + 
algo + std::to_string(_minimizer.
fitter()->Config().MinimizerOptions().Strategy());
 
 1051         } 
catch (
const std::exception &
e) {
 
 1052            std::cerr << 
"Exception while minimizing: " << 
e.what() << std::endl;
 
 1061            throw std::runtime_error(
"Keyboard interrupt while minimizing");
 
 1065         status = _minimizer.
fitter()
 
 1068         minim = _minimizer.
fitter()->Config().MinimizerType(); 
 
 1070                                       _minimizer.
fitter()->Config().MinimizerAlgoType() +
 
 1071                                       std::to_string(_minimizer.
fitter()->Config().MinimizerOptions().Strategy()),
 
 1073         if (status % 1000 == 0)
 
 1076         if (status == 4 && 
minim != 
"Minuit") {
 
 1078               Warning(
"fitTo", 
"%s Hit max function calls of %d", 
fitName.Data(),
 
 1079                       _minimizer.
fitter()->Config().MinimizerOptions().MaxFunctionCalls());
 
 1083                  Warning(
"fitTo", 
"will try doubling this");
 
 1084               _minimizer.
fitter()->Config().MinimizerOptions().SetMaxFunctionCalls(
 
 1085                  _minimizer.
fitter()->Config().MinimizerOptions().MaxFunctionCalls() * 2);
 
 1086               _minimizer.
fitter()->Config().MinimizerOptions().SetMaxIterations(
 
 1087                  _minimizer.
fitter()->Config().MinimizerOptions().MaxIterations() * 2);
 
 1096            Warning(
"fitTo", 
"%s %s%s Status=%d (edm=%f, tol=%f, strat=%d), tries=#%d...", 
fitName.Data(),
 
 1097                    _minimizer.
fitter()->Config().MinimizerType().c_str(),
 
 1098                    _minimizer.
fitter()->Config().MinimizerAlgoType().c_str(), status,
 
 1099                    _minimizer.
fitter()->Result().Edm(), _minimizer.
fitter()->Config().MinimizerOptions().Tolerance(),
 
 1100                    _minimizer.
fitter()->Config().MinimizerOptions().Strategy(), 
tries);
 
 1124         Warning(
"fitTo", 
"%s final status is %d", 
fitName.Data(), status);
 
 1133      int miniStrat = _minimizer.
fitter()->Config().MinimizerOptions().Strategy();
 
 1134      double dCovar = std::numeric_limits<double>::quiet_NaN();
 
 1172                    "HesseStrategy %d not specified in HesseStrategySequence %s ... defaulting to start of sequence",
 
 1176         while (
sIdx != -1) {
 
 1181               if (_minimizer.
fitter()->GetMinimizer()->CovMatrixStatus() == 3) {
 
 1197               fff->counter2 = 
fff->counter;
 
 1205            auto _status = _minimizer.
hesse(); 
 
 1233               throw std::runtime_error(
"Keyboard interrupt while hesse calculating");
 
 1235            if ((_status != 0 || _minimizer.
fitter()->GetMinimizer()->CovMatrixStatus() != 3) && status == 0 &&
 
 1237               Warning(
"fitTo", 
"%s hesse status is %d, covQual=%d", 
fitName.Data(), _status,
 
 1238                       _minimizer.
fitter()->GetMinimizer()->CovMatrixStatus());
 
 1245            if (_status == 0 && _minimizer.
fitter()->GetMinimizer()->CovMatrixStatus() == 3) {
 
 1248            } 
else if (_status == 0) {
 
 1257      if (status == 0 && 
minos) {
 
 1258         if (std::unique_ptr<RooAbsCollection> 
mpars(
floatPars->selectByAttrib(
"minos", 
true)); !
mpars->empty()) {
 
 1260               fff->fState = 
"Minos";
 
 1277      if (out->status() == 0 && out->covQual() != 3 && hesse) {
 
 1278         if (out->covQual() == 2) { 
 
 1286      if (
miniStrat < _minimizer.
fitter()->Config().MinimizerOptions().Strategy() && hesse &&
 
 1287          out->edm() > _minimizer.
fitter()->Config().MinimizerOptions().Tolerance() * 1
e-3 && out->status() != 3) {
 
 1290         std::cerr << 
"Warning: post-Hesse edm " << out->edm() << 
" greater than allowed by tolerance " 
 1291                   << _minimizer.
fitter()->Config().MinimizerOptions().Tolerance() * 1
e-3
 
 1292                   << 
", consider increasing minimization strategy" << std::endl;
 
 1303      if (!std::isnan(
dCovar)) {
 
 1305            .addClone(
RooRealVar(
".dCovar", 
"dCovar from minimization", 
dCovar), 
true);
 
 1316            double vRange = 
v->getMax() - 
v->getMin();
 
 1322               auto tmp = 
v->getVal();
 
 1323               v->setVal(
v->getMin());
 
 1326                  static_cast<RooRealVar *
>(out->floatParsFinal().find(
v->GetName()))->
setVal(
v->getMin());
 
 1335               if (
v->hasRange(
"physical"))
 
 1340                       (
v->getMin() > 
v->getVal() - 
v->getError() || 
v->getMax() < 
v->getVal() + 
v->getError())) {
 
 1342                  Info(
"minimize", 
"PARLIM: %s (%f +/- %f) range (%f - %f)", 
v->GetName(), 
v->getVal(), 
v->getError(),
 
 1343                       v->getMin(), 
v->getMax());
 
 1350               Warning(
"minimize", 
"BOUNDCHK: Parameters within %g%% limit in fit result: %s", 
boundaryCheck * 100,
 
 1355               Warning(
"minimize", 
"BOUNDCHK: Parameters near limit in fit result");
 
 1387      out->setMinNLL(_nll->getVal());
 
 1390      for (
auto o : out->floatParsFinal()) {
 
 1392             v && !
v->
getAttribute(
"minos") && !
v->getAttribute(
"xminos") && !
v->getAttribute(
"xMinos"))
 
 1393            v->removeAsymError();
 
 1406   if (out && out->status() == 0 && 
minos) {
 
 1408      for (
auto label : {
"xminos", 
"xMinos"}) {
 
 1409         std::unique_ptr<RooAbsCollection> pars(
floatPars->selectByAttrib(label, 
true));
 
 1410         for (
auto p : *pars) {
 
 1411            Info(
"minimize", 
"Computing xminos error for %s", 
p->GetName());
 
 1423   if (out && !
logs.empty()) {
 
 1425#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 28, 00) 
 1426      const_cast<RooArgList &
>(out->constPars()).addOwned(std::make_unique<RooStringVar>(
".log", 
"log", 
logs.c_str()));
 
 1435      if (!
cacheDir->GetDirectory(nll.GetName()))
 
 1437      if (
auto dir = 
cacheDir->GetDirectory(nll.GetName()); dir) {
 
 1443            if (!dir->FindKey(
nllOpts->GetName())) {
 
 1450         if (!fitConfig.MinimizerOptions().ExtraOptions()->GetValue(
"Name", 
configName)) {
 
 1456            dir->WriteObject(&fitConfig, 
configName.data());
 
 1459#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 28, 00) 
 1461            .addOwned(std::make_unique<RooStringVar>(
".fitConfigName", 
"fitConfigName", 
configName.c_str()));
 
 1466         dir->WriteObject(out.get(), out->GetName());
 
 
 1480                   const std::shared_ptr<ROOT::Fit::FitConfig> &
_fitConfig)
 
 1483   auto par = 
dynamic_cast<RooRealVar *
>(std::unique_ptr<RooArgSet>(nll.getVariables())->find(
parName));
 
 1494   bool pErrs = fitConfig.ParabErrors();
 
 1495   fitConfig.SetParabErrors(
false);
 
 1496   double mErrs = fitConfig.MinosErrors();
 
 1497   fitConfig.SetMinosErrors(
false);
 
 1506   bool isConst = par->isConstant();
 
 1507   par->setConstant(
true);
 
 1529            return std::numeric_limits<double>::quiet_NaN();
 
 1532         status += 
result->status() * 10;
 
 1538            std::cout << 
"Warning: Alternative best-fit of " << par->GetName() << 
" @ " << 
val_guess << 
" vs " 
 1539                      << 
val_best << 
" (delta=" << tmu / 2. << 
")" << std::endl;
 
 1545            status = (status / 10) * 10 + 1;
 
 1558            std::cout << 
"NLL min: " << 
nll_min << std::endl;
 
 1559            std::cout << 
"N_sigma*sigma(pre):   " << std::abs(
val_pre - 
val_best) << std::endl;
 
 1560            std::cout << 
"sigma(guess):   " << 
sigma_guess << std::endl;
 
 1561            std::cout << 
"par(guess):     " << 
val_guess + corr << std::endl;
 
 1562            std::cout << 
"true val:       " << 
val_best << std::endl;
 
 1563            std::cout << 
"tmu:            " << tmu << std::endl;
 
 1564            std::cout << 
"Precision:      " << 
sigma_guess * precision << std::endl;
 
 1565            std::cout << 
"Correction:     " << (-corr < 0 ? 
" " : 
"") << -corr << std::endl;
 
 1566            std::cout << 
"N_sigma*sigma(guess): " << std::abs(
val_guess - 
val_best) << std::endl;
 
 1567            std::cout << std::endl;
 
 1592            status = (status / 10) * 10 + 3;
 
 1600         status = (status / 10) * 10 + 2;
 
 1604         status = (status / 10) * 10 + 2;
 
 1610         std::cout << 
"Finished in " << 
nrItr << 
" iterations." << std::endl;
 
 1612         std::cout << std::endl;
 
 1618   par_hat->setError(std::numeric_limits<double>::quiet_NaN());
 
 1619   double lo = 
par_hat->getErrorLo();
 
 1621   if (std::isnan(
hi)) {
 
 1627   if (std::isnan(lo)) {
 
 1634   fitConfig.SetParabErrors(
pErrs);
 
 1635   fitConfig.SetMinosErrors(
mErrs);
 
 
 1656   std::deque<RooAbsArg *> 
topPdfs;
 
 1658   for (
auto p : 
w.allPdfs()) {
 
 1659      if (
p->hasClients())
 
 1662      if (
p->getAttribute(
"hypoTest")) {
 
 1669      Error(
"hypoTest", 
"Cannot find top-level pdf in workspace");
 
 1671   } 
else if (
topPdfs.size() > 1) {
 
 1674         Error(
"hypoTest", 
"Multiple top-level pdfs. Flag which one to test with " 
 1675                           "w->pdf(\"pdfName\")->setAttribute(\"hypoTest\",true)");
 
 1678         Error(
"hypoTest", 
"Multiple top-level pdfs flagged for hypoTest -- pick one.");
 
 1684   Info(
"hypoTest", 
"Using PDF: %s", model->
GetName());
 
 1690   std::shared_ptr<RooArgSet> 
obsGlobs = 
nullptr;
 
 1692   for (
auto p : 
w.allData()) {
 
 1694         Error(
"hypoTest", 
"Multiple datasets in workspace. Flag which one to test with " 
 1695                           "w->data(\"dataName\")->setAttribute(\"hypoTest\",true)");
 
 1702      Error(
"hypoTest", 
"No data -- cannot determine observables");
 
 1706   Info(
"hypoTest", 
"Using Dataset: %s", 
obsData->GetName());
 
 1709      auto _globs = xRooNode(
w).datasets()[
obsData->GetName()]->globs(); 
 
 1710      obsGlobs = std::make_shared<RooArgSet>();
 
 1712      Info(
"hypoTest", 
"Using Globs: %s", (
obsGlobs->empty()) ? 
" <NONE>" : 
obsGlobs->contentsString().c_str());
 
 1717   auto _vars = std::unique_ptr<RooArgSet>(model->
getVariables());
 
 1720   for (
auto _v : *_vars) {
 
 1725   if (poi.
size() > 1) {
 
 1730   if (!args.
empty()) {
 
 1734      Error(
"hypoTest", 
"No POI detected: add the hypoPoints binning to at least one non-const model parameter e.g.:\n " 
 1735                        "w->var(\"mu\")->setBinning(RooUniformBinning(0.5,10.5,10),\"hypoPoints\"))");
 
 1748   nll.SetFitConfig(fitConfig);
 
 1750   if (poi.
size() == 1) {
 
 1753      double altVal = (mu->getStringAttribute(
"altVal")) ? 
TString(mu->getStringAttribute(
"altVal")).Atof()
 
 1754                                                         : std::numeric_limits<double>::quiet_NaN();
 
 1756      if (std::isnan(
altVal) && mu->hasRange(
"physical")) {
 
 1758         altVal = mu->getMin(
"physical");
 
 1759         Info(
"hypoTest", 
"No altVal specified - using min of given physical range = %g", 
altVal);
 
 1761         if (!std::isnan(
altVal)) {
 
 1762            Info(
"hypoTest", 
"alt hypo: %g - CLs activated", 
altVal);
 
 1764            Info(
"hypoTest", 
"No altVal found - to specify setStringAttribute(\"altVal\",\"<value>\") on POI or set " 
 1765                             "the physical range");
 
 1768      bool doCLs = !std::isnan(
altVal) && std::abs(mu->getMin(
"hypoPoints")) > 
altVal &&
 
 1769                   std::abs(mu->getMax(
"hypoPoints")) > 
altVal;
 
 1771      const char *
sCL = (
doCLs) ? 
"CLs" : 
"null";
 
 1772      Info(
"hypoTest", 
"%s testing active", 
sCL);
 
 1782      std::vector<int> 
expSig = {-2, -1, 0, 1, 2};
 
 1785      std::map<int, TGraphErrors> 
exp_pcls;
 
 1786      std::map<int, TGraphErrors> 
exp_cls;
 
 1795         double _out = std::numeric_limits<double>::quiet_NaN();
 
 1797         for (
int i = 0; i < 
pValues.GetN(); i++) {
 
 1803                                                    ((1. - 
CL) - 
pValues.GetPointY(i - 1)) /
 
 1813         obs_ts->SetPoint(obs_ts->GetN(), 
testVal, 
hp.pll().first);
 
 1814         obs_ts->SetPointError(obs_ts->GetN() - 1, 0, 
hp.pll().second);
 
 1823                                 (
doCLs) ? 
hp.pCLs_asymp(s).first : 
hp.pNull_asymp(s).first);
 
 1826            Info(
"hypoTest", 
"%s=%g: %s=%g sigma_mu=%g %s=%g", mu->GetName(), 
testVal, obs_ts->GetName(),
 
 1827                 obs_ts->GetPointY(obs_ts->GetN() - 1), 
hp.sigma_mu().first, 
obs_pcls->GetName(),
 
 1830            Info(
"hypoTest", 
"%s=%g: %s=%g %s=%g", mu->GetName(), 
testVal, obs_ts->GetName(),
 
 1835      if (mu->getBins(
"hypoPoints") <= 0) {
 
 1840         testPoint((mu->getMax(
"hypoPoints") + mu->getMin(
"hypoPoints")) / 2.);
 
 1864         for (
int i = 0; i <= mu->getBins(
"hypoPoints"); i++) {
 
 1865            testPoint((i == mu->getBins(
"hypoPoints")) ? mu->getBinning(
"hypoPoints").binHigh(i - 1)
 
 1866                                                       : mu->getBinning(
"hypoPoints").binLow(i));
 
 1878         band2->SetNameTitle(
".pCLs_2sigma", 
"2 sigma band");
 
 1880         band2up->SetNameTitle(
".pCLs_2sigma_upUncert", 
"");
 
 1882         band2down->SetNameTitle(
".pCLs_2sigma_downUncert", 
"");
 
 1888         for (
int i = 0; i < 
exp_pcls[2].GetN(); i++) {
 
 1894         for (
int i = 
exp_pcls[2].GetN() - 1; i >= 0; i--) {
 
 1898         for (
int i = 0; i < 
exp_pcls[-2].GetN(); i++) {
 
 1902         for (
int i = 
exp_pcls[-2].GetN() - 1; i >= 0; i--) {
 
 1921         band2->SetNameTitle(
".pCLs_1sigma", 
"1 sigma band");
 
 1923         band2up->SetNameTitle(
".pCLs_1sigma_upUncert", 
"");
 
 1925         band2down->SetNameTitle(
".pCLs_1sigma_downUncert", 
"");
 
 1931         for (
int i = 0; i < 
exp_pcls[1].GetN(); i++) {
 
 1937         for (
int i = 
exp_pcls[1].GetN() - 1; i >= 0; i--) {
 
 1941         for (
int i = 0; i < 
exp_pcls[-1].GetN(); i++) {
 
 1945         for (
int i = 
exp_pcls[-1].GetN() - 1; i >= 0; i--) {
 
 1967      obs_pcls->Draw(
gPad->GetListOfPrimitives()->IsEmpty() ? 
"ALP" : 
"LP");
 
 1969      obs_ts->SetLineColor(
kRed);
 
 1970      obs_ts->SetMarkerColor(
kRed);
 
 1974      auto l = 
new TLegend(0.5, 0.6, 1. - 
gPad->GetRightMargin(), 1. - 
gPad->GetTopMargin());
 
 1975      l->SetName(
"legend");
 
 1976      l->AddEntry(obs_ts, obs_ts->GetTitle(), 
"LPE");
 
 1979         l->AddEntry(
expPlot, 
"Expected", 
"LFE");
 
 1987         exp_cls[s].SetMarkerStyle(29);
 
 1988         exp_cls[s].SetEditable(
false);
 
 2003   double factor = pow(10.0, 
digits - ceil(log10(std::abs(
value))));
 
 2004   return std::round(
value * factor) / factor;
 
 
 2016   if (!std::isinf(out.second)) {
 
 2017      auto tmp = out.second;
 
 2019      int expo = (out.second == 0) ? 0 : (
int)std::floor(std::log10(std::abs(out.second)));
 
 2023      } 
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
Prevent 'AlwaysDirty' mode for this node.
 
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...
 
void optimizeConst(int flag)
If flag is true, perform constant term optimization on function being minimized.
 
auto fitter()
Return underlying ROOT fitter object.
 
RooFit::OwningPtr< RooFitResult > save(const char *name=nullptr, const char *title=nullptr)
Save and return a RooFitResult snapshot of current minimizer status.
 
int minos()
Execute MINOS.
 
int hesse()
Execute HESSE.
 
int minimize(const char *type, const char *alg=nullptr)
Minimise the function passed in the constructor.
 
void setStrategy(int istrat)
Change MINUIT strategy to istrat.
 
static RooMsgService & instance()
Return reference to singleton instance.
 
Implementation of a RooCacheManager<RooAbsCacheElement> that specializes in the storage of cache elem...
 
Efficient implementation of a product of PDFs of the form.
 
static TRandom * randomGenerator()
Return a pointer to a singleton random-number generator implementation.
 
Variable that can be changed from the outside.
 
void setVal(double value) override
Set value of variable to 'value'.
 
bool hasBinning(const char *name) const override
Returns true if variable has a binning named 'name'.
 
Facilitates simultaneous fitting of multiple PDFs to subsets of a given dataset.
 
static RooAbsData * GenerateAsimovData(const RooAbsPdf &pdf, const RooArgSet &observables)
generate the asimov data for the observables (not the global ones) need to deal with the case of a si...
 
A RooAbsArg implementing string values.
 
Joins several RooAbsCategoryLValue objects into a single category.
 
bool setIndex(value_type index, bool printError=true) override
Set the value of the super category to the specified index.
 
Persistable container for RooFit projects.
 
Using a TBrowser one can browse all ROOT objects.
 
static TCanvas * MakeDefCanvas()
Static function to build a default canvas.
 
TClass instances represent classes, structs and namespaces in the ROOT type system.
 
static TClass * GetClass(const char *name, Bool_t load=kTRUE, Bool_t silent=kFALSE)
Static method returning pointer to TClass of the specified class name.
 
This class stores the date and time with a precision of one second in an unsigned 32 bit word (950130...
 
const char * AsString() const
Return the date & time as a string (ctime() format).
 
Describe directory structure in memory.
 
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.
 
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)
 
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.
 
#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)