20#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00) 
   21#define protected public 
   70std::shared_ptr<RooLinkedList> xRooFit::sDefaultNLLOptions = 
nullptr;
 
   71std::shared_ptr<ROOT::Fit::FitConfig> xRooFit::sDefaultFitConfig = 
nullptr;
 
   73const char *xRooFit::GetVersion()
 
 
   77const char *xRooFit::GetVersionDate()
 
 
   84   return RooCmdArg(
"ReuseNLL", 
flag, 0, 0, 0, 
nullptr, 
nullptr, 
nullptr, 
nullptr);
 
 
   94   return RooCmdArg(
"StrategySequence", 0, 0, 0, 0, val);
 
 
   97xRooNLLVar xRooFit::createNLL(
const std::shared_ptr<RooAbsPdf> pdf, 
const std::shared_ptr<RooAbsData> 
data,
 
 
  105   return createNLL(std::shared_ptr<RooAbsPdf>(&pdf, [](
RooAbsPdf *) {}),
 
 
  123   return createNLL(pdf, 
data, 
l);
 
 
  126std::shared_ptr<const RooFitResult>
 
  128               const std::pair<std::shared_ptr<RooAbsData>, std::shared_ptr<const RooAbsCollection>> &
data,
 
 
  136std::shared_ptr<const RooFitResult> xRooFit::fitTo(
RooAbsPdf &pdf,
 
  137                                                   const std::pair<RooAbsData *, const RooAbsCollection *> &
data,
 
 
  145std::pair<std::shared_ptr<RooAbsData>, std::shared_ptr<const RooAbsCollection>>
 
  149   std::pair<std::shared_ptr<RooAbsData>, std::shared_ptr<const RooAbsCollection>> out;
 
  155   auto _allVars = std::unique_ptr<RooAbsCollection>(pdf.
getVariables());
 
  156   auto _snap = std::unique_ptr<RooAbsCollection>(_allVars->snapshot());
 
  157   *_allVars = fr->constPars();
 
  158   *_allVars = fr->floatParsFinal();
 
  161   auto _globs = std::unique_ptr<RooAbsCollection>(fr->constPars().selectByAttrib(
"global", 
true));
 
  172   std::function<std::pair<std::shared_ptr<RooAbsData>, std::shared_ptr<const RooArgSet>>(
RooAbsPdf *)> 
genSubPdf;
 
  175      std::pair<std::shared_ptr<RooAbsData>, std::shared_ptr<const RooArgSet>> 
_out;
 
  178      std::unique_ptr<RooArgSet> _obs(_pdf->getVariables());
 
  179      _obs->remove(fr->constPars(), 
true, 
true);
 
  180      _obs->remove(fr->floatParsFinal(), 
true, 
true); 
 
  187         std::unique_ptr<RooArgSet> globs(_pdf->getObservables(t));
 
  193               *
toy_gobs = *std::unique_ptr<RooDataSet>(_pdf->generate(*globs, 1))->get();
 
  198                  for (
auto thePdf : pp->pdfList()) {
 
  199                     auto gob = std::unique_ptr<RooArgSet>(
thePdf->getObservables(*globs));
 
  202                     if (
gob->size() > 1) {
 
  203                        Warning(
"generate", 
"%s contains multiple global obs: %s", 
thePdf->GetName(),
 
  204                                gob->contentsString().c_str());
 
  208                     std::unique_ptr<RooArgSet> 
cpars(
thePdf->getParameters(*globs));
 
  221                           << 
"AsymptoticCalculator::MakeAsimovData:constraint term " << 
thePdf->GetName()
 
  222                           << 
" of type " << className << 
" is a non-supported type - result might be not correct " 
  230                        pois->setNoRounding(
true);
 
  241                              << 
"AsymptoticCalculator::MakeAsimovData:constraint term " << 
thePdf->GetName()
 
  242                              << 
" has no direct dependence on global observable- cannot generate it " << std::endl;
 
  262                              << 
"AsymptoticCalculator::MakeAsimovData:constraint term " << 
thePdf->GetName()
 
  263                              << 
" is a Gamma distribution and no server named theta is found. Assume that the Gamma " 
  271                            (!
rrv2->isConstant() || !
rrv2->InheritsFrom(
"RooConstVar"))) {
 
  276                                 << 
"AsymptoticCalculator::MakeAsimovData:constraint term " << 
thePdf->GetName()
 
  277                                 << 
" constraint term has more server depending on nuisance- cannot generate it " 
  293                           << 
"AsymptoticCalculator::MakeAsimovData - can't find nuisance for constraint term - global " 
  294                              "observables will not be set to Asimov value " 
  295                           << 
thePdf->GetName() << std::endl;
 
  296                        std::cerr << 
"Parameters: " << std::endl;
 
  298                        std::cerr << 
"Observables: " << std::endl;
 
  303                  Error(
"generate", 
"Cannot generate global observables, pdf is: %s::%s", _pdf->ClassName(),
 
  316         _out.first = std::make_unique<RooDataSet>(
 
  320         for (
auto &
c : s->indexCat()) {
 
  321#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 22, 00) 
  324            std::string 
cLabel = 
c->GetName();
 
  326            auto p = s->getPdf(
cLabel.c_str());
 
  332            _obs->setCatLabel(s->indexCat().GetName(), 
cLabel.c_str());
 
  333            for (
int i = 0; i < 
toy.first->numEntries(); i++) {
 
  334               *_obs = *
toy.first->get(i);
 
  335               _out.first->add(*_obs, 
toy.first->weight());
 
  341      std::map<RooRealVar *, std::shared_ptr<RooAbsBinning>> 
binnings;
 
  343      for (
auto &o : *_obs) {
 
  347         if (
auto res = _pdf->binBoundaries(*
r, -std::numeric_limits<double>::infinity(),
 
  348                                            std::numeric_limits<double>::infinity())) {
 
  349            binnings[
r] = std::shared_ptr<RooAbsBinning>(
r->getBinning().clone(
r->getBinning().GetName()));
 
  351            std::vector<double> boundaries;
 
  352            boundaries.reserve(res->size());
 
  353            for (
auto &
rr : *res) {
 
  354               if (boundaries.empty() || std::abs(boundaries.back() - 
rr) > 1
e-3 ||
 
  355                   std::abs(boundaries.back() - 
rr) > 1
e-5 * boundaries.back())
 
  356                  boundaries.push_back(
rr);
 
  358            r->setBinning(
RooBinning(boundaries.size() - 1, &boundaries[0]));
 
  360         } 
else if (
r->numBins(
r->getBinning().GetName()) == 0 && 
expected) {
 
  362            binnings[
r] = std::shared_ptr<RooAbsBinning>(
r->getBinning().clone(
r->getBinning().GetName()));
 
  376         if (_pdf->canBeExtended()) {
 
  394         auto binning = 
b.second;
 
  395         v->setBinning(*binning);
 
  399         auto r = 
x->getRange();
 
  400         if (
r.first > binning->lowBound())
 
  401            x->setMin(binning->lowBound());
 
  402         if (
r.second < binning->highBound())
 
  403            x->setMax(binning->highBound());
 
  409   out.first->SetName(
expected ? (
TString(fr->GetName()) + 
"_asimov") : uuid);
 
  413      out.first->setGlobalObservables(*out.second);
 
  417#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 26, 00) 
  420      w->setStringAttribute(
"fitResult", fr->GetName());
 
  431#if ROOT_VERSION_CODE < ROOT_VERSION(6, 27, 00) 
  432   auto _ws = pdf.
_myws;
 
  439      for (
auto obj : _ws->components()) {
 
  440         for (
int i = 0; i < obj->numCaches(); i++) {
 
  446            p->setNormRange(
p->normRange());
 
  448         obj->setValueDirty();
 
 
  456std::shared_ptr<RooLinkedList> xRooFit::createNLLOptions()
 
  462   for (
auto opt : *defaultNLLOptions()) {
 
  463      out->Add(opt->Clone(
nullptr)); 
 
 
  469std::shared_ptr<RooLinkedList> xRooFit::defaultNLLOptions()
 
  471   if (sDefaultNLLOptions)
 
  472      return sDefaultNLLOptions;
 
  480   return sDefaultNLLOptions;
 
 
  483std::shared_ptr<ROOT::Fit::FitConfig> xRooFit::createFitConfig()
 
  485   return std::make_shared<ROOT::Fit::FitConfig>(*defaultFitConfig());
 
 
  488std::shared_ptr<ROOT::Fit::FitConfig> xRooFit::defaultFitConfig()
 
  490   if (sDefaultFitConfig)
 
  491      return sDefaultFitConfig;
 
  492   sDefaultFitConfig = std::make_shared<ROOT::Fit::FitConfig>();
 
  493   auto &fitConfig = *sDefaultFitConfig;
 
  494   fitConfig.SetParabErrors(
true); 
 
  495   fitConfig.MinimizerOptions().SetMinimizerType(
"Minuit2");
 
  496   fitConfig.MinimizerOptions().SetErrorDef(0.5); 
 
  497   fitConfig.SetParabErrors(
true);                
 
  498   fitConfig.SetMinosErrors(
true); 
 
  499   fitConfig.MinimizerOptions().SetMaxFunctionCalls(
 
  501   fitConfig.MinimizerOptions().SetMaxIterations(-1); 
 
  502   fitConfig.MinimizerOptions().SetStrategy(-1);      
 
  506   fitConfig.MinimizerOptions().SetPrintLevel(-2);
 
  512#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 29, 00) 
  513   extraOpts->SetValue(
"StrategySequence", 
"0s01s12s2s3m");
 
  514   extraOpts->SetValue(
"HesseStrategySequence", 
"23");
 
  516   extraOpts->SetValue(
"StrategySequence", 
"0s01s12s2m");
 
  517   extraOpts->SetValue(
"HesseStrategySequence", 
"2");
 
  525   extraOpts->SetValue(
"TrackProgress", 30);               
 
  532   return sDefaultFitConfig;
 
 
  537   return const_cast<ROOT::Math::IOptions *
>(defaultFitConfig()->MinimizerOptions().ExtraOptions());
 
 
  548         std::cout << 
"Minimization interrupted ... will exit as soon as possible" << std::endl;
 
 
  565      vars.reset(std::unique_ptr<RooAbsCollection>(
f.getVariables())->selectByAttrib(
"Constant", 
false));
 
 
  602         throw std::runtime_error(
"Keyboard interrupt");
 
  603         return std::numeric_limits<double>::quiet_NaN();
 
  606      if (
prevMin == std::numeric_limits<double>::infinity()) {
 
  610      if (!std::isnan(out)) {
 
  622         std::stringstream 
sout;
 
  642            std::vector<std::pair<double, std::string>> 
parDeltas;
 
  645               parDeltas.emplace_back(std::pair<double, std::string>(
 
  649                      [](
auto &left, 
auto &right) { return std::abs(left.first) > std::abs(right.first); });
 
  651            for (i = 0; i < std::min(3, 
int(
parDeltas.size())); i++) {
 
  665         if (
gROOT->FromPopUp() && 
gROOT->GetListOfBrowsers()->At(0)) {
 
  667            std::string status = 
sout.str();
 
  671               if (status.find(
" : ") != std::string::npos) {
 
  672                  status_part = status.substr(0, status.find(
" : "));
 
  673                  status = status.substr(status.find(
" : ") + 3);
 
  683         std::cerr << 
sout.str() << std::endl;
 
 
  699   mutable double minVal = std::numeric_limits<double>::infinity();
 
  700   mutable double prevMin = std::numeric_limits<double>::infinity();
 
  706   std::shared_ptr<RooAbsCollection> 
vars;
 
 
  719                                                      const std::shared_ptr<ROOT::Fit::FitConfig> &
_fitConfig,
 
  720                                                      const std::shared_ptr<RooLinkedList> &
nllOpts)
 
  735   if (nll.getStringAttribute(
"userPars")) {
 
  737      while (
st.NextToken()) {
 
  748   auto _nllVars = std::unique_ptr<RooAbsCollection>(_nll->getVariables());
 
  750   std::unique_ptr<RooAbsCollection> constPars(
_nllVars->selectByAttrib(
"Constant", 
true));
 
  752   std::unique_ptr<RooAbsCollection> 
floatPars(
_nllVars->selectByAttrib(
"Constant", 
false));
 
  759#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 29, 00) 
  764   if (fitConfig.MinimizerOptions().ExtraOptions()) {
 
  765      fitConfig.MinimizerOptions().ExtraOptions()->GetNamedValue(
"StrategySequence", s);
 
  766      fitConfig.MinimizerOptions().ExtraOptions()->GetIntValue(
"TrackProgress", 
_progress);
 
  767      fitConfig.MinimizerOptions().ExtraOptions()->GetRealValue(
"BoundaryCheck", 
boundaryCheck);
 
  768      fitConfig.MinimizerOptions().ExtraOptions()->GetIntValue(
"LogSize", 
logSize);
 
  769      fitConfig.MinimizerOptions().ExtraOptions()->GetIntValue(
"HesseStrategy", 
hesseStrategy);
 
  770      fitConfig.MinimizerOptions().ExtraOptions()->GetNamedValue(
"HesseStrategySequence", 
hs);
 
  781         if (
auto keys = 
nllDir->GetListOfKeys(); keys) {
 
  782            for (
auto &&k : *keys) {
 
  784               if (cl->InheritsFrom(
"RooFitResult")) {
 
  801                        for (
auto &
p : *constPars) {
 
  808                                     _p->getCurrentIndex() != 
c->getCurrentIndex()) {
 
  820                              if (!_p->getAttribute(
"global") && std::abs(_p->getVal() - 
v->getVal()) > 1
e-12) {
 
  843   if (nll.getAttribute(
"readOnly"))
 
  846   int printLevel = fitConfig.MinimizerOptions().PrintLevel();
 
  852   if (
floatPars->empty() || fitConfig.MinimizerOptions().MaxFunctionCalls() == 1) {
 
  853      std::shared_ptr<RooFitResult> 
result;
 
  857      result = std::make_shared<RooFitResult>(); 
 
  865      result->setCovarianceMatrix(
d);
 
  867      result->setMinNLL(_nll->getVal());
 
  877         if (!
cacheDir->GetDirectory(nll.GetName()))
 
  898   std::shared_ptr<RooFitResult> out;
 
  903      if (
p->isCategory()) {
 
  912      std::shared_ptr<const RooFitResult> 
bestFr;
 
  913      for (
auto c : allCats) {
 
  915         Info(
"minimize", 
"Minimizing with discrete %s", 
c.first.c_str());
 
  918            Warning(
"minimize", 
"Minimization with discrete %s failed", 
c.first.c_str());
 
  926      floatCats.setAttribAll(
"Constant", 
false);
 
  932      out = std::make_shared<RooFitResult>(*
bestFr);
 
  933      const_cast<RooArgList &
>(out->floatParsFinal())
 
  934         .addClone(*std::unique_ptr<RooAbsCollection>(out->constPars().selectCommon(
floatCats)));
 
  940   bool restore = !fitConfig.UpdateAfterFit();
 
  943      int strategy = fitConfig.MinimizerOptions().Strategy();
 
  965         _minimizer.
fitter()->
Config().MinimizerOptions().SetMaxFunctionCalls(
 
  968      if (_minimizer.
fitter()->
Config().MinimizerOptions().MaxIterations() == 0) {
 
  972      bool hesse = _minimizer.
fitter()->
Config().ParabErrors();
 
 1011      if (
minim == 
"Minuit2") {
 
 1018            Warning(
"minimize", 
"Strategy %d not specified in StrategySequence %s ... defaulting to start of sequence",
 
 1022      } 
else if (
minim == 
"Minuit")
 
 1031            algo = 
"migradImproved";
 
 1047         } 
catch (
const std::exception &
e) {
 
 1048            std::cerr << 
"Exception while minimizing: " << 
e.what() << std::endl;
 
 1057            throw std::runtime_error(
"Keyboard interrupt while minimizing");
 
 1061         status = _minimizer.
fitter()
 
 1067                                       std::to_string(_minimizer.
fitter()->
Config().MinimizerOptions().Strategy()),
 
 1069         if (status % 1000 == 0)
 
 1072         if (status == 4 && 
minim != 
"Minuit") {
 
 1074               Warning(
"fitTo", 
"%s Hit max function calls of %d", 
fitName.Data(),
 
 1075                       _minimizer.
fitter()->
Config().MinimizerOptions().MaxFunctionCalls());
 
 1079                  Warning(
"fitTo", 
"will try doubling this");
 
 1080               _minimizer.
fitter()->
Config().MinimizerOptions().SetMaxFunctionCalls(
 
 1081                  _minimizer.
fitter()->
Config().MinimizerOptions().MaxFunctionCalls() * 2);
 
 1082               _minimizer.
fitter()->
Config().MinimizerOptions().SetMaxIterations(
 
 1083                  _minimizer.
fitter()->
Config().MinimizerOptions().MaxIterations() * 2);
 
 1092            Warning(
"fitTo", 
"%s %s%s Status=%d (edm=%f, tol=%f, strat=%d), tries=#%d...", 
fitName.Data(),
 
 1094                    _minimizer.
fitter()->
Config().MinimizerAlgoType().c_str(), status,
 
 1120         Warning(
"fitTo", 
"%s final status is %d", 
fitName.Data(), status);
 
 1129      double dCovar = std::numeric_limits<double>::quiet_NaN();
 
 1168                    "HesseStrategy %d not specified in HesseStrategySequence %s ... defaulting to start of sequence",
 
 1172         while (
sIdx != -1) {
 
 1180               fff->counter2 = 
fff->counter;
 
 1188            auto _status = _minimizer.
hesse(); 
 
 1216               throw std::runtime_error(
"Keyboard interrupt while hesse calculating");
 
 1220               Warning(
"fitTo", 
"%s hesse status is %d, covQual=%d", 
fitName.Data(), _status,
 
 1231            } 
else if (_status == 0) {
 
 1240      if (status == 0 && 
minos) {
 
 1241         if (std::unique_ptr<RooAbsCollection> 
mpars(
floatPars->selectByAttrib(
"minos", 
true)); !
mpars->empty()) {
 
 1243               fff->fState = 
"Minos";
 
 1259      if (out->status() == 0 && out->covQual() != 3 && hesse) {
 
 1260         if (out->covQual() == 2) { 
 
 1273      if (!std::isnan(
dCovar)) {
 
 1275            .addClone(
RooRealVar(
".dCovar", 
"dCovar from minimization", 
dCovar), 
true);
 
 1286            double vRange = 
v->getMax() - 
v->getMin();
 
 1292               auto tmp = 
v->getVal();
 
 1293               v->setVal(
v->getMin());
 
 1296                  static_cast<RooRealVar *
>(out->floatParsFinal().find(
v->GetName()))->
setVal(
v->getMin());
 
 1305               if (
v->hasRange(
"physical"))
 
 1310                       (
v->getMin() > 
v->getVal() - 
v->getError() || 
v->getMax() < 
v->getVal() + 
v->getError())) {
 
 1312                  Info(
"minimize", 
"PARLIM: %s (%f +/- %f) range (%f - %f)", 
v->GetName(), 
v->getVal(), 
v->getError(),
 
 1313                       v->getMin(), 
v->getMax());
 
 1320               Warning(
"minimize", 
"BOUNDCHK: Parameters within %g%% limit in fit result: %s", 
boundaryCheck * 100,
 
 1325               Warning(
"minimize", 
"BOUNDCHK: Parameters near limit in fit result");
 
 1357      out->setMinNLL(_nll->getVal());
 
 1360      for (
auto o : out->floatParsFinal()) {
 
 1362             v && !
v->
getAttribute(
"minos") && !
v->getAttribute(
"xminos") && !
v->getAttribute(
"xMinos"))
 
 1363            v->removeAsymError();
 
 1376      if (status == 0 && 
minos) {
 
 1377         for (
auto label : {
"xminos", 
"xMinos"}) {
 
 1378            std::unique_ptr<RooAbsCollection> pars(
floatPars->selectByAttrib(label, 
true));
 
 1379            for (
auto p : *pars) {
 
 1380               Info(
"minimize", 
"Computing xminos error for %s", 
p->GetName());
 
 1393   if (out && !
logs.empty()) {
 
 1395#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 28, 00) 
 1396      const_cast<RooArgList &
>(out->constPars()).addOwned(std::make_unique<RooStringVar>(
".log", 
"log", 
logs.c_str()));
 
 1405      if (!
cacheDir->GetDirectory(nll.GetName()))
 
 1420         if (!fitConfig.MinimizerOptions().ExtraOptions()->GetValue(
"Name", 
configName)) {
 
 1429#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 28, 00) 
 1431            .addOwned(std::make_unique<RooStringVar>(
".fitConfigName", 
"fitConfigName", 
configName.c_str()));
 
 1436         dir->WriteObject(out.get(), out->GetName());
 
 
 1450                   const std::shared_ptr<ROOT::Fit::FitConfig> &
_fitConfig)
 
 1453   auto par = 
dynamic_cast<RooRealVar *
>(std::unique_ptr<RooArgSet>(nll.getVariables())->find(
parName));
 
 1464   bool pErrs = fitConfig.ParabErrors();
 
 1465   fitConfig.SetParabErrors(
false);
 
 1466   double mErrs = fitConfig.MinosErrors();
 
 1467   fitConfig.SetMinosErrors(
false);
 
 1476   bool isConst = par->isConstant();
 
 1477   par->setConstant(
true);
 
 1499            return std::numeric_limits<double>::quiet_NaN();
 
 1502         status += 
result->status() * 10;
 
 1508            std::cout << 
"Warning: Alternative best-fit of " << par->GetName() << 
" @ " << 
val_guess << 
" vs " 
 1509                      << 
val_best << 
" (delta=" << tmu / 2. << 
")" << std::endl;
 
 1515            status = (status / 10) * 10 + 1;
 
 1528            std::cout << 
"NLL min: " << 
nll_min << std::endl;
 
 1529            std::cout << 
"N_sigma*sigma(pre):   " << std::abs(
val_pre - 
val_best) << std::endl;
 
 1530            std::cout << 
"sigma(guess):   " << 
sigma_guess << std::endl;
 
 1531            std::cout << 
"par(guess):     " << 
val_guess + 
corr << std::endl;
 
 1532            std::cout << 
"true val:       " << 
val_best << std::endl;
 
 1533            std::cout << 
"tmu:            " << tmu << std::endl;
 
 1534            std::cout << 
"Precision:      " << 
sigma_guess * precision << std::endl;
 
 1535            std::cout << 
"Correction:     " << (-
corr < 0 ? 
" " : 
"") << -
corr << std::endl;
 
 1536            std::cout << 
"N_sigma*sigma(guess): " << std::abs(
val_guess - 
val_best) << std::endl;
 
 1537            std::cout << std::endl;
 
 1562            status = (status / 10) * 10 + 3;
 
 1570         status = (status / 10) * 10 + 2;
 
 1574         status = (status / 10) * 10 + 2;
 
 1580         std::cout << 
"Finished in " << 
nrItr << 
" iterations." << std::endl;
 
 1582         std::cout << std::endl;
 
 1588   par_hat->setError(std::numeric_limits<double>::quiet_NaN());
 
 1589   double lo = 
par_hat->getErrorLo();
 
 1591   if (std::isnan(
hi)) {
 
 1597   if (std::isnan(lo)) {
 
 1604   fitConfig.SetParabErrors(
pErrs);
 
 1605   fitConfig.SetMinosErrors(
mErrs);
 
 
 1626   std::deque<RooAbsArg *> 
topPdfs;
 
 1628   for (
auto p : 
w.allPdfs()) {
 
 1629      if (
p->hasClients())
 
 1632      if (
p->getAttribute(
"hypoTest")) {
 
 1639      Error(
"hypoTest", 
"Cannot find top-level pdf in workspace");
 
 1641   } 
else if (
topPdfs.size() > 1) {
 
 1644         Error(
"hypoTest", 
"Multiple top-level pdfs. Flag which one to test with " 
 1645                           "w->pdf(\"pdfName\")->setAttribute(\"hypoTest\",true)");
 
 1648         Error(
"hypoTest", 
"Multiple top-level pdfs flagged for hypoTest -- pick one.");
 
 1654   Info(
"hypoTest", 
"Using PDF: %s", model->
GetName());
 
 1660   std::shared_ptr<RooArgSet> 
obsGlobs = 
nullptr;
 
 1662   for (
auto p : 
w.allData()) {
 
 1664         Error(
"hypoTest", 
"Multiple datasets in workspace. Flag which one to test with " 
 1665                           "w->data(\"dataName\")->setAttribute(\"hypoTest\",true)");
 
 1672      Error(
"hypoTest", 
"No data -- cannot determine observables");
 
 1676   Info(
"hypoTest", 
"Using Dataset: %s", 
obsData->GetName());
 
 1679      auto _globs = xRooNode(
w).datasets()[
obsData->GetName()]->globs(); 
 
 1680      obsGlobs = std::make_shared<RooArgSet>();
 
 1682      Info(
"hypoTest", 
"Using Globs: %s", (
obsGlobs->empty()) ? 
" <NONE>" : 
obsGlobs->contentsString().c_str());
 
 1687   auto _vars = std::unique_ptr<RooArgSet>(model->
getVariables());
 
 1690   for (
auto _v : *_vars) {
 
 1695   if (poi.
size() > 1) {
 
 1700   if (!args.
empty()) {
 
 1704      Error(
"hypoTest", 
"No POI detected: add the hypoPoints binning to at least one non-const model parameter e.g.:\n " 
 1705                        "w->var(\"mu\")->setBinning(RooUniformBinning(0.5,10.5,10),\"hypoPoints\"))");
 
 1718   nll.SetFitConfig(fitConfig);
 
 1720   if (poi.
size() == 1) {
 
 1723      double altVal = (mu->getStringAttribute(
"altVal")) ? 
TString(mu->getStringAttribute(
"altVal")).Atof()
 
 1724                                                         : std::numeric_limits<double>::quiet_NaN();
 
 1726      if (std::isnan(
altVal) && mu->hasRange(
"physical")) {
 
 1728         altVal = mu->getMin(
"physical");
 
 1729         Info(
"hypoTest", 
"No altVal specified - using min of given physical range = %g", 
altVal);
 
 1731         if (!std::isnan(
altVal)) {
 
 1732            Info(
"hypoTest", 
"alt hypo: %g - CLs activated", 
altVal);
 
 1734            Info(
"hypoTest", 
"No altVal found - to specify setStringAttribute(\"altVal\",\"<value>\") on POI or set " 
 1735                             "the physical range");
 
 1738      bool doCLs = !std::isnan(
altVal) && std::abs(mu->getMin(
"hypoPoints")) > 
altVal &&
 
 1739                   std::abs(mu->getMax(
"hypoPoints")) > 
altVal;
 
 1741      const char *
sCL = (
doCLs) ? 
"CLs" : 
"null";
 
 1742      Info(
"hypoTest", 
"%s testing active", 
sCL);
 
 1752      std::vector<int> 
expSig = {-2, -1, 0, 1, 2};
 
 1755      std::map<int, TGraphErrors> 
exp_pcls;
 
 1756      std::map<int, TGraphErrors> 
exp_cls;
 
 1765         double _out = std::numeric_limits<double>::quiet_NaN();
 
 1767         for (
int i = 0; i < 
pValues.GetN(); i++) {
 
 1773                                                    ((1. - 
CL) - 
pValues.GetPointY(i - 1)) /
 
 1793                                 (
doCLs) ? 
hp.pCLs_asymp(s).first : 
hp.pNull_asymp(s).first);
 
 1796            Info(
"hypoTest", 
"%s=%g: %s=%g sigma_mu=%g %s=%g", mu->GetName(), 
testVal, 
obs_ts->GetName(),
 
 1800            Info(
"hypoTest", 
"%s=%g: %s=%g %s=%g", mu->GetName(), 
testVal, 
obs_ts->GetName(),
 
 1805      if (mu->getBins(
"hypoPoints") <= 0) {
 
 1810         testPoint((mu->getMax(
"hypoPoints") + mu->getMin(
"hypoPoints")) / 2.);
 
 1834         for (
int i = 0; i <= mu->getBins(
"hypoPoints"); i++) {
 
 1835            testPoint((i == mu->getBins(
"hypoPoints")) ? mu->getBinning(
"hypoPoints").binHigh(i - 1)
 
 1836                                                       : mu->getBinning(
"hypoPoints").binLow(i));
 
 1848         band2->SetNameTitle(
".pCLs_2sigma", 
"2 sigma band");
 
 1850         band2up->SetNameTitle(
".pCLs_2sigma_upUncert", 
"");
 
 1852         band2down->SetNameTitle(
".pCLs_2sigma_downUncert", 
"");
 
 1858         for (
int i = 0; i < 
exp_pcls[2].GetN(); i++) {
 
 1864         for (
int i = 
exp_pcls[2].GetN() - 1; i >= 0; i--) {
 
 1868         for (
int i = 0; i < 
exp_pcls[-2].GetN(); i++) {
 
 1872         for (
int i = 
exp_pcls[-2].GetN() - 1; i >= 0; i--) {
 
 1891         band2->SetNameTitle(
".pCLs_1sigma", 
"1 sigma band");
 
 1893         band2up->SetNameTitle(
".pCLs_1sigma_upUncert", 
"");
 
 1895         band2down->SetNameTitle(
".pCLs_1sigma_downUncert", 
"");
 
 1901         for (
int i = 0; i < 
exp_pcls[1].GetN(); i++) {
 
 1907         for (
int i = 
exp_pcls[1].GetN() - 1; i >= 0; i--) {
 
 1911         for (
int i = 0; i < 
exp_pcls[-1].GetN(); i++) {
 
 1915         for (
int i = 
exp_pcls[-1].GetN() - 1; i >= 0; i--) {
 
 1937      obs_pcls->Draw(
gPad->GetListOfPrimitives()->IsEmpty() ? 
"ALP" : 
"LP");
 
 1944      auto l = 
new TLegend(0.5, 0.6, 1. - 
gPad->GetRightMargin(), 1. - 
gPad->GetTopMargin());
 
 1945      l->SetName(
"legend");
 
 1949         l->AddEntry(
expPlot, 
"Expected", 
"LFE");
 
 1957         exp_cls[s].SetMarkerStyle(29);
 
 1958         exp_cls[s].SetEditable(
false);
 
 1973   double factor = pow(10.0, 
digits - ceil(log10(std::abs(
value))));
 
 1974   return std::round(
value * factor) / factor;
 
 
 1986   if (!std::isinf(out.second)) {
 
 1987      auto tmp = out.second;
 
 1989      int expo = (out.second == 0) ? 0 : (
int)std::floor(std::log10(std::abs(out.second)));
 
 1993      } 
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...
ROOT::Math::Minimizer * GetMinimizer() const
return pointer to last used minimizer (is NULL in case fit is not yet done) This pointer is guarantee...
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.
virtual int CovMatrixStatus() const
return status of covariance matrix using Minuit convention {0 not calculated 1 approximated 2 made po...
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.
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.
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.
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::Fit:Fitter that provides a seamless interface between the minimizer functi...
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.
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.
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.
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)