42xRooNLLVar::xRooHypoSpace::xRooHypoSpace(
const char *
name, 
const char *title)
 
 
   74         ssize /= (
v->getMax() - 
v->getMin());
 
   82   for (
auto &
p : *
this) {
 
   83      for (
auto a : *
p.coords) {
 
   84         if (!
fPars->find(
a->GetName()))
 
 
  101   std::shared_ptr<xRooNode> out = 
nullptr;
 
  103   for (
auto &[_range, _pdf] : fPdfs) {
 
  107      for (
auto &
_lhs : *_range) {
 
  113               if (!(
v->getMin() <= 
v2->getMax() && 
v2->getMin() <= 
v->getMax())) {
 
  118               if (!(
v->getMin() <= 
c2->getVal() && 
c2->getVal() <= 
v->getMax())) {
 
  125               if (!(
c->getVal() <= 
v2->getMax() && 
v2->getMin() <= 
c->getVal())) {
 
  130               if (!(
c->getVal() == 
c2->getVal())) {
 
  139            throw std::runtime_error(
"Multiple pdf possibilities");
 
 
  157      auto _idx = s.
Index(
'=');
 
  163      if (
_val.IsFloat()) {
 
  165      } 
else if (
_val.BeginsWith(
'[')) {
 
  166         _idx = 
_val.Index(
',');
 
 
  185      throw std::runtime_error(
"Unknown parameter");
 
  186   _par->setAttribute(
"axis");
 
  189      Warning(
"AddPoints", 
"low edge of hypoSpace %g below lower bound of parameter: %g. Changing to lower bound", low,
 
  191      low = _par->getMin();
 
  193   if (high > _par->getMax()) {
 
  194      Warning(
"AddPoints", 
"high edge of hypoSpace %g above upper bound of parameter: %g. Changing to upper bound",
 
  195              high, _par->getMax());
 
  196      high = _par->getMax();
 
  200      _par->setVal((high + low) * 0.5);
 
  205   double step = (high - low) / (
nPoints - 1);
 
  207      throw std::runtime_error(
"Invalid steps");
 
  209   for (
size_t i = 0; i < 
nPoints; i++) {
 
  210      _par->setVal((i == 
nPoints - 1) ? high : (low + step * i));
 
 
  218   if (axes().empty()) {
 
  221         throw std::runtime_error(
"No POI to scan");
 
  223         poi().first()->setAttribute(
"axis");
 
  229      poi().setAttribAll(
"poi", 
false);
 
  230      axes().setAttribAll(
"poi");
 
 
  242   if (
sType.Contains(
"cls") && !
sType.Contains(
"pcls"))
 
  243      sType.ReplaceAll(
"cls", 
"pcls");
 
  244   if (!
sType.Contains(
"pcls") && !
sType.Contains(
"ts") && !
sType.Contains(
"pnull") && !
sType.Contains(
"plr")) {
 
  245      throw std::runtime_error(
"scan type must be equal to one of: plr, cls, ts, pnull");
 
  249   if (axes().empty()) {
 
  252         throw std::runtime_error(
"No POI to scan");
 
  254         poi().first()->setAttribute(
"axis");
 
  259   poi().setAttribAll(
"poi", 
false);
 
  260   axes().setAttribAll(
"poi");
 
  262   auto p = 
dynamic_cast<RooRealVar *
>(axes().first());
 
  264      throw std::runtime_error(
TString::Format(
"%s not scannable", axes().first()->GetName()));
 
  267   if (
sType.Contains(
"cls")) {
 
  268      if (empty() && 
relUncert == std::numeric_limits<double>::infinity()) {
 
  270         ::Info(
"xRooHypoSpace::scan", 
"Using default precision of 10%% for auto-scan");
 
  273      for (
auto a : axes()) {
 
  274         if (!
a->hasRange(
"physical")) {
 
  275            ::Info(
"xRooHypoSpace::scan", 
"No physical range set for %s, setting to [0,inf]", 
p->GetName());
 
  276            dynamic_cast<RooRealVar *
>(
a)->setRange(
"physical", 0, std::numeric_limits<double>::infinity());
 
  278         if (!
a->getStringAttribute(
"altVal") || !
strlen(
p->getStringAttribute(
"altVal"))) {
 
  279            ::Info(
"xRooHypoSpace::scan", 
"No altVal set for %s, setting to 0", 
a->GetName());
 
  280            a->setStringAttribute(
"altVal", 
"0");
 
  286            ::Info(
"xRooHypoSpace::scan", 
"range of POI does not straddle alt value, adjusting minimum to %g",
 
  291            ::Info(
"xRooHypoSpace::scan", 
"range of POI does not straddle alt value, adjusting maximum to %g",
 
  295         for (
auto &[
pdf, nll] : fNlls) {
 
  296            if (
auto _v = 
dynamic_cast<RooRealVar *
>(nll->pars()->find(*
a))) {
 
  297               _v->setRange(
v->getMin(), 
v->getMax());
 
  301   } 
else if (
sType.Contains(
"plr")) {
 
  304      sType.ReplaceAll(
"plr", 
"ts");
 
  310      for (
auto a : axes()) {
 
  311         if (!
a->getStringAttribute(
"altVal") || !
strlen(
p->getStringAttribute(
"altVal"))) {
 
  312            ::Info(
"xRooHypoSpace::scan", 
"No altVal set for %s, setting to 1", 
a->GetName());
 
  313            a->setStringAttribute(
"altVal", 
"1");
 
  318   if (high < low || (high == low && 
nPoints != 1)) {
 
  320      low = 
p->getMin(
"scan");
 
  321      high = 
p->getMax(
"scan");
 
  323   if (!std::isnan(low) && !std::isnan(high) && !(std::isinf(low) && std::isinf(high))) {
 
  324      p->setRange(
"scan", low, high);
 
  326   if (
p->hasRange(
"scan")) {
 
  327      ::Info(
"xRooHypoSpace::scan", 
"Using %s scan range: %g - %g", 
p->GetName(), 
p->getMin(
"scan"), 
p->getMax(
"scan"));
 
  341      relUncert = std::numeric_limits<double>::infinity(); 
 
  350#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 26, 00) 
  391      if (
sType.Contains(
"cls")) {
 
  402            if (std::isnan(res.first) || std::isnan(res.second)) {
 
  404            } 
else if (std::isinf(res.second)) {
 
  409         throw std::runtime_error(
TString::Format(
"Automatic scanning not yet supported for %s", 
type));
 
  414         AddPoint(
TString::Format(
"%s=%g", poi().first()->GetName(), (high + low) / 2.));
 
  417         double step = (high - low) / (
nPoints - 1);
 
  418         for (
size_t i = 0; i < 
nPoints; i++) {
 
  419            AddPoint(
TString::Format(
"%s=%g", poi().first()->GetName(), low + step * i));
 
 
  431std::map<std::string, xRooNLLVar::xValueWithError>
 
  438      relUncert = std::numeric_limits<double>::infinity(); 
 
  443   std::map<std::string, xRooNLLVar::xValueWithError> out;
 
 
  465      auto _idx = s.
Index(
'=');
 
  470      auto _v = 
dynamic_cast<RooRealVar *
>(fPars->find(_name));
 
  474      if (
_val.IsFloat()) {
 
  483      throw std::runtime_error(
"no model at coordinates");
 
  490   if (fNlls.find(_pdf) == fNlls.end()) {
 
  491      fNlls[_pdf] = std::make_shared<xRooNLLVar>(_pdf->nll(
"" , {}));
 
  496   out.nllVar = fNlls[_pdf];
 
  497   out.fData = fNlls[_pdf]->getData();
 
  498   out.isExpected = 
dynamic_cast<RooDataSet *
>(out.fData.first.get()) &&
 
  499                    dynamic_cast<RooDataSet *
>(out.fData.first.get())->weightVar()->getAttribute(
"expected");
 
  502   out.coords.reset(fPars->snapshot()); 
 
  504   out.poi().setAttribAll(
"Constant");
 
  511      ->remove(*std::unique_ptr<RooAbsCollection>(out.coords->selectByAttrib(
"Constant", 
false)), 
true, 
true);
 
  513   double value = out.fNullVal();
 
  516   auto _type = fTestStatType;
 
  528   out.fPllType = _type;
 
  531   for (
auto &
p : *
this) {
 
  532      if (
p.nllVar != out.nllVar)
 
  534      if (
p.fData != out.fData)
 
  536      if (!
p.alt_poi().equals(out.alt_poi()))
 
  539      for (
auto c : 
p.alt_poi()) {
 
  541             v && std::abs(
v->getVal() - out.alt_poi().getRealValue(
v->GetName())) > 1
e-12) {
 
  546                              out.alt_poi().getCatIndex(cat->GetName(), std::numeric_limits<int>().max())) {
 
  553      if (!
p.coords->equals(*out.coords))
 
  555      for (
auto c : *
p.coords) {
 
  556         if (
c->getAttribute(
"poi")) {
 
  560             v && std::abs(
v->getVal() - out.coords->getRealValue(
v->GetName())) > 1
e-12) {
 
  565                              out.alt_poi().getCatIndex(cat->GetName(), std::numeric_limits<int>().max())) {
 
  574      if (
auto cfit = 
p.cfit_alt(
true)) {
 
  575         out.fAlt_cfit = cfit;
 
  577      if (
p.asimov(
true) && 
p.asimov(
true)->fData.first && (!out.asimov(
true) || !out.asimov(
true)->fData.first)) {
 
  578         out.asimov()->fData = 
p.asimov(
true)->fData;
 
  580      if (!
p.poi().equals(out.poi()))
 
  582      for (
auto c : 
p.poi()) {
 
  584             v && std::abs(
v->getVal() - out.poi().getRealValue(
v->GetName())) > 1
e-12) {
 
  596   for (
auto a : axes()) {
 
  603   return emplace_back(out);
 
 
  610      throw std::runtime_error(
"Not a pdf");
 
  622      throw std::runtime_error(std::string(
"Clashing model: ") + 
existing->GetName());
 
  628   pars.remove(*fPars, 
true, 
true);
 
  630   fPars->addClone(
pars);
 
  632   fPdfs.insert(std::make_pair(
myPars, std::make_shared<xRooNode>(_pdf)));
 
 
  643   out.add(*std::unique_ptr<RooAbsCollection>(
 
  644      fPars->selectByAttrib(
"axis", 
true))); 
 
  650      std::set<std::vector<double>> coords;
 
  651      for (
auto &
p : *
this) {
 
  654            auto _v = 
dynamic_cast<RooRealVar *
>(
p.coords->find(o->GetName()));
 
  656               (
_v && 
_v->isConstant())
 
  658                  : std::numeric_limits<double>::infinity()); 
 
  661         if (coords.find(
p_coords) != coords.end()) {
 
  670         std::map<std::string, std::unordered_set<double>> values;
 
  671         for (
auto &par : *
pars()) {
 
  674            for (
auto p : *
this) {
 
  675               auto _v = 
dynamic_cast<RooRealVar *
>(
p.coords->find(par->GetName()));
 
  676               values[par->GetName()].insert(
 
  677                  (
_v && 
_v->isConstant())
 
  679                     : std::numeric_limits<double>::infinity()); 
 
  688         for (
auto &[k, 
v] : values) {
 
  691               isPOI = 
pars()->find(k.c_str())->getAttribute(
"poi");
 
  704   std::unique_ptr<RooAbsCollection> poi(out.selectByAttrib(
"poi", 
true));
 
 
  715   out.add(*std::unique_ptr<RooAbsCollection>(
pars()->selectByAttrib(
"poi", 
true)));
 
 
  739         Error(
"LoadFits", 
"Path not found %s", 
apath);
 
  749   std::map<std::set<std::tuple<std::string, double, std::string>>, std::set<std::set<std::string>>> 
cfits;
 
  755      std::cout << 
"Processing " << _dir->GetName() << std::endl;
 
  756      if (
auto keys = _dir->GetListOfKeys(); keys) {
 
  760         for (
auto &&k : *keys) {
 
  761            TKey *key = 
dynamic_cast<TKey *
>(k);
 
  768         for (
auto &&k : *keys) {
 
  769            if (
auto subdir = _dir->GetDirectory(k->GetName()); 
subdir) {
 
  771                  LoadFits(
subdir->GetPath());
 
  778            if (cl->InheritsFrom(
"RooFitResult")) {
 
  783                     std::unique_ptr<RooAbsCollection> 
snap(
cachedFit->floatParsFinal().snapshot());
 
  784                     snap->remove(*fPars, 
true, 
true);
 
  785                     fPars->addClone(*
snap);
 
  788                        if (
p->getAttribute(
"global"))
 
  794                        if (!fPars->contains(*
v))
 
  805                  std::set<std::tuple<std::string, double, std::string>> constPars;
 
  807                     if (
p->getAttribute(
"global"))
 
  814                        std::make_tuple(
v->GetName(), 
v->getVal(),
 
  815                                        v->getStringAttribute(
"altVal") ? 
v->getStringAttribute(
"altVal") : 
""));
 
  819                     if (constPars == key)
 
  821                     if (std::includes(constPars.begin(), constPars.end(), key.begin(), key.end())) {
 
  825                        std::set<std::string> 
pois;
 
  826                        for (
auto &&par : constPars) {
 
  827                           if (key.find(par) == key.end()) {
 
  828                              pois.insert(std::get<0>(par));
 
  829                              allpois.insert(std::get<0>(par));
 
  868   ::Info(
"xRooHypoSpace::xRooHypoSpace", 
"%s - Loaded %d fits", 
apath, 
nFits);
 
  873      auto nll = std::make_shared<xRooNLLVar>(
nullptr, 
nullptr);
 
  874      auto dummyNll = std::make_shared<RooRealVar>(
apath, 
"Dummy NLL", std::numeric_limits<double>::quiet_NaN());
 
  879         for (
auto &&
p : *fPars) {
 
  885            fPars->find(
p.c_str())->setAttribute(
"poi", 
true);
 
  893            auto _coords = std::make_shared<RooArgSet>();
 
  894            for (
auto &k : key) {
 
  895               auto v = 
_coords->addClone(
RooRealVar(std::get<0>(k).c_str(), std::get<0>(k).c_str(), std::get<1>(k)));
 
  897               if (!std::get<2>(k).empty()) {
 
  898                  v->setStringAttribute(
"altVal", std::get<2>(k).c_str());
 
  913            if (std::isnan(
hp.fAltVal())) {
 
  915            } 
else if (
hp.fNullVal() >= 
hp.fAltVal()) {
 
  924   } 
else if (
nFits > 0) {
 
  925      std::cout << 
"possible POI: ";
 
  927         std::cout << 
p << 
",";
 
  928      std::cout << std::endl;
 
 
  939   for (
size_t i = 0; i < 
size(); i++) {
 
  940      std::cout << i << 
") ";
 
  944         std::cout << 
a->GetName() << 
"=" 
  945                   << at(i).coords->getRealValue(
a->GetName(), std::numeric_limits<double>::quiet_NaN());
 
  947      std::cout << 
" status=[ufit:";
 
  952         std::cout << ufit->
status();
 
  955      std::cout << 
",cfit_null:";
 
  956      auto cfit = 
const_cast<xRooHypoPoint &
>(at(i)).cfit_null(
true);
 
  960         std::cout << cfit->
status();
 
  963      std::cout << 
",cfit_alt:";
 
  968         std::cout << 
afit->status();
 
  972         std::cout << 
",asimov.ufit:";
 
  980         std::cout << 
",asimov.cfit_null:";
 
  990      auto sigma_mu = 
const_cast<xRooHypoPoint &
>(at(i)).sigma_mu(
true);
 
  991      if (!std::isnan(sigma_mu.first)) {
 
  992         std::cout << 
" sigma_mu=" << sigma_mu.first;
 
  994            std::cout << 
" +/- " << sigma_mu.second;
 
  996      std::cout << std::endl;
 
  998   std::cout << 
"--------------------------" << std::endl;
 
  999   std::cout << 
"Number of bad fits: " << 
badFits << std::endl;
 
 
 1003   const char *opt )
 const 
 1014      (
sOpt.Contains(
"exp"))
 
 1016                         sOpt.Index(
" ", 
sOpt.Index(
"exp")) == -1 ? 
sOpt.Length() : 
sOpt.Index(
" ", 
sOpt.Index(
"exp"))))
 
 1018         : std::numeric_limits<double>::quiet_NaN();
 
 1022   auto _axes = axes();
 
 1023   if (
_axes.size() != 1)
 
 1026   auto out = std::make_shared<TGraphErrors>();
 
 1027   out->SetName(GetName());
 
 1028   out->SetEditable(
false);
 
 1029   const char *
sCL = (
doCLs) ? 
"CLs" : 
"null";
 
 1041   if (std::isnan(
nSigma)) {
 
 1043      out->SetMarkerStyle(20);
 
 1044      out->SetMarkerSize(0.5);
 
 1045      if (
sOpt.Contains(
"ts")) {
 
 1047                                                     (empty() ? 
"" : front().tsTitle(
true).Data())));
 
 1051      out->SetMarkerStyle(0);
 
 1052      out->SetMarkerSize(0);
 
 1053      out->SetLineStyle(2 + 
int(
nSigma));
 
 1057         out->SetLineStyle(0);
 
 1058         out->SetLineWidth(0);
 
 1059         auto x = out->Clone(
"up");
 
 1063         out->GetListOfFunctions()->Add(
x, 
"F");
 
 1064         x = out->Clone(
"down");
 
 1068         out->GetListOfFunctions()->Add(
x, 
"F");
 
 1070      if (
sOpt.Contains(
"ts")) {
 
 1077      auto badPoints2 = 
dynamic_cast<TGraph *
>(out->GetListOfFunctions()->FindObject(
"badPoints"));
 
 1085         out->GetListOfFunctions()->Add(
badPoints2, 
"P");
 
 1094   for (
auto &
p : *
this) {
 
 1098            auto gra = graph(
sOpt + 
" readOnly");
 
 1099            if (
gra && 
gra->GetN()) {
 
 1101                  gROOT->GetSelectedPad()->cd();
 
 1105#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 30, 00) 
 1106               if (
auto pad = 
gROOT->GetSelectedPad()) {
 
 1107                  pad->GetCanvas()->ResetUpdated(); 
 
 1113            ::Info(
"xRooHypoSpace::graph", 
"Completed %d/%d points for %s", 
int(
nDone), 
int(
size()), 
sOpt.Data());
 
 1119      double _x = 
p.coords->getRealValue(
_axes.at(0)->GetName(), std::numeric_limits<double>::quiet_NaN());
 
 1123      if (std::isnan(
pval.first)) {
 
 1124         if (
p.status() != 0) { 
 
 1128         out->InsertPointBefore(idx, _x, 
pval.first);
 
 1129         out->SetPointError(idx, 0, 
pval.second);
 
 1134         sOpt2.ReplaceAll(
"exp", 
"exp-");
 
 1136         if (std::isnan(
pval.first)) {
 
 1137            if (
p.status() != 0) { 
 
 1141            out->InsertPointBefore(idx + 1, _x, 
pval.first);
 
 1142            out->SetPointError(idx + 1, 0, 
pval.second);
 
 1144            if (out->GetPointY(idx) < 
pval.first)
 
 1151   if (out->GetN() == 0)
 
 1156      if (out->GetListOfFunctions()->FindObject(
"badPoints")) {
 
 1158         for (
int i = 0; i < 
badPoints()->GetN(); i++) {
 
 1167      auto up = 
dynamic_cast<TGraph *
>(out->GetListOfFunctions()->FindObject(
"up"));
 
 1168      auto down = 
dynamic_cast<TGraph *
>(out->GetListOfFunctions()->FindObject(
"down"));
 
 1170      for (
int i = 0; i < out->GetN(); i++) {
 
 1172            up->SetPoint(
up->GetN(), out->GetPointX(i), out->GetPointY(i) + out->GetErrorY(i) * (
above ? 1. : -1.));
 
 1173            down->SetPoint(
down->GetN(), out->GetPointX(i), out->GetPointY(i) - out->GetErrorY(i) * (
above ? 1. : -1.));
 
 1175            up->SetPoint(
up->GetN(), out->GetPointX(i), out->GetPointY(i) - out->GetErrorY(i) * (
above ? 1. : -1.));
 
 1176            down->SetPoint(
down->GetN(), out->GetPointX(i), out->GetPointY(i) + out->GetErrorY(i) * (
above ? 1. : -1.));
 
 1184         gROOT->GetSelectedPad()->cd();
 
 1188#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 30, 00) 
 1189      if (
auto pad = 
gROOT->GetSelectedPad()) {
 
 1190         pad->GetCanvas()->ResetUpdated(); 
 
 
 1203   std::shared_ptr<TMultiGraph> out;
 
 1204   if (
sOpt.Contains(
"pcls") || 
sOpt.Contains(
"pnull") || 
sOpt.Contains(
"ts")) {
 
 1207      sOpt.ReplaceAll(
"visualize", 
"");
 
 1209      auto exp2 = graph(
sOpt + 
" exp2");
 
 1211      auto exp = graph(
sOpt + 
" exp");
 
 1214      auto obs = (
doObs) ? graph(
sOpt) : 
nullptr;
 
 1216      out = std::make_shared<TMultiGraph>(GetName(), GetTitle());
 
 1217      if (exp2 && exp2->GetN() > 1)
 
 1218         out->Add(
static_cast<TGraph *
>(exp2->Clone()), 
"FP");
 
 1220         out->Add(
static_cast<TGraph *
>(
exp1->Clone()), 
"FP");
 
 1221      if (exp && exp->GetN() > 1)
 
 1222         out->Add(
static_cast<TGraph *
>(exp->Clone()), 
"LP");
 
 1223      if (obs && obs->GetN() > 1)
 
 1224         out->Add(
static_cast<TGraph *
>(obs->Clone()), 
"LP");
 
 1226      if (!out->GetListOfGraphs()) {
 
 1231      if (
sOpt.Contains(
"pcls")) {
 
 1233         line->SetName(
"alpha");
 
 1235         line->SetEditable(
false);
 
 1236         line->SetPoint(
line->GetN(), out->GetHistogram()->GetXaxis()->GetXmin() - 10, 0.05);
 
 1243            for (
int i = 0; i < exp->GetN(); i++) {
 
 1247         line->SetPoint(
line->GetN(), out->GetHistogram()->GetXaxis()->GetXmax() + 10, 0.05);
 
 1249         out->GetListOfFunctions()->Add(
line, 
"L");
 
 1252         out->GetHistogram()->GetXaxis()->SetTitle(exp->GetHistogram()->GetXaxis()->GetTitle());
 
 1253         out->GetHistogram()->GetYaxis()->SetTitle(exp->GetHistogram()->GetYaxis()->GetTitle());
 
 1257      leg->SetName(
"legend");
 
 1260      out->GetListOfFunctions()->Add(
leg);
 
 1263      for (
auto g : *out->GetListOfGraphs()) {
 
 1265            leg->AddEntry(o, 
"", 
"F");
 
 1267            leg->AddEntry(
g, 
"", 
"LPE");
 
 1271      if (
sOpt.Contains(
"pcls")) {
 
 1273         if (exp2 && exp2->GetN() > 1) {
 
 1281         if (exp && exp->GetN() > 1) {
 
 1289         if (exp2 && exp2->GetN() > 1) {
 
 1293         if (obs && obs->GetN() > 1) {
 
 1303            gROOT->GetSelectedPad()->cd();
 
 1308         if (
sOpt.Contains(
"pcls") || 
sOpt.Contains(
"pnull")) {
 
 1309            gra2->GetHistogram()->SetMinimum(1
e-6);
 
 1313            gPad->GetCanvas()->Paint();
 
 1314            gPad->GetCanvas()->Update();
 
 1315#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 30, 00) 
 1316            gPad->GetCanvas()->ResetUpdated(); 
 
 
 1329   if (std::isnan(
target)) {
 
 1333   auto gr = std::make_shared<TGraph>(
pValues);
 
 1354      return std::pair<double, double>(std::numeric_limits<double>::quiet_NaN(), 0);
 
 1357   double alpha = log(
target);
 
 1371         return std::pair(
lim, err);
 
 1386         return std::pair(std::numeric_limits<double>::infinity(), std::numeric_limits<double>::infinity());
 
 1387      return std::pair((alpha - 
y1) / 
m + 
x1, std::numeric_limits<double>::infinity());
 
 1394         return std::pair(-std::numeric_limits<double>::infinity(), -std::numeric_limits<double>::infinity());
 
 1395      return std::pair((alpha - 
y1) / 
m + 
x1, -std::numeric_limits<double>::infinity());
 
 
 1402   if (std::isnan(
nSigma)) {
 
 1407   return GetLimit(*graph(
sOpt + 
" readonly"));
 
 
 1415   sOpt.ReplaceAll(
"visualize", 
"");
 
 1416   std::shared_ptr<TGraphErrors> 
gr = graph(
sOpt + 
" readonly");
 
 1418      auto gra = graphs(
sOpt.Contains(
"toys") ? 
"pcls readonly toys" : 
"pcls readonly");
 
 1425         gra->GetHistogram()->SetMinimum(1
e-9);
 
 1426         gra->GetHistogram()->GetYaxis()->SetRangeUser(1
e-9, 1);
 
 1428#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 30, 00) 
 1429         gPad->GetCanvas()->ResetUpdated(); 
 
 1436   for (
auto p : axes()) {
 
 1437      for (
auto &[
pdf, nll] : fNlls) {
 
 1438         if (
auto _v = 
dynamic_cast<RooRealVar *
>(nll->pars()->find(*
p))) {
 
 1445      auto v = (axes().empty()) ? 
nullptr : 
dynamic_cast<RooRealVar *
>(*axes().rbegin());
 
 1447         return std::pair(std::numeric_limits<double>::quiet_NaN(), 0.);
 
 1448      double muMax = std::min(std::min(
v->getMax(
"physical"), 
v->getMax()), 
v->getMax(
"scan"));
 
 1449      double muMin = std::max(std::max(
v->getMin(
"physical"), 
v->getMin()), 
v->getMin(
"scan"));
 
 1453            Error(
"findlimit", 
"Problem evaluating %s @ %s=%g", 
sOpt.Data(), 
v->GetName(), 
muMin);
 
 1454            return std::pair(std::numeric_limits<double>::quiet_NaN(), 0.);
 
 1467      if (
sOpt.Contains(
"obs")) {
 
 1469         sOpt2.ReplaceAll(
"obs", 
"exp");
 
 1470         auto expLim = findlimit(
sOpt2, std::numeric_limits<double>::infinity(), 0);
 
 1476         (
sOpt.Contains(
"exp")) ? back().asimov() : std::shared_ptr<xRooHypoPoint>(&back(), [](
xRooHypoPoint *) {});
 
 1478      if (point && point->ufit()) {
 
 1489         Error(
"findlimit", 
"Problem evaluating %s @ %s=%g", 
sOpt.Data(), 
v->GetName(), 
nextPoint);
 
 1490         return std::pair(std::numeric_limits<double>::quiet_NaN(), 0.);
 
 1496   auto lim = GetLimit(*
gr);
 
 1498   if (std::isnan(
lim.first)) {
 
 1502   auto v = 
dynamic_cast<RooRealVar *
>(*axes().rbegin());
 
 1503   double maxMu = std::min(std::min(
v->getMax(
"physical"), 
v->getMax()), 
v->getMax(
"scan"));
 
 1504   double minMu = std::max(std::max(
v->getMin(
"physical"), 
v->getMin()), 
v->getMin(
"scan"));
 
 1507   if (
lim.first > -std::numeric_limits<double>::infinity() && 
lim.first < std::numeric_limits<double>::infinity() &&
 
 1513   if (
lim.second == std::numeric_limits<double>::infinity()) {
 
 1523         (
sOpt.Contains(
"exp")) ? back().asimov() : std::shared_ptr<xRooHypoPoint>(&back(), [](
xRooHypoPoint *) {});
 
 1525      if (point && point->ufit()) {
 
 1537   } 
else if (
lim.second == -std::numeric_limits<double>::infinity()) {
 
 1551   ::Info(
"xRooHypoSpace::findlimit", 
"%s -- Testing new point @ %s=%g (delta=%g)", 
sOpt.Data(), 
v->GetName(),
 
 1555         Warning(
"findlimit", 
"Reached max number of point evaluations");
 
 1557         Error(
"findlimit", 
"Problem evaluating %s @ %s=%g", 
sOpt.Data(), 
v->GetName(), 
nextPoint);
 
 
 1571   if ((
sOpt == 
"" || 
sOpt == 
"same") && !empty()) {
 
 1574         for (
auto &
hp : *
this) {
 
 1575            if (!
hp.nullToys.empty() || !
hp.altToys.empty()) {
 
 1586   auto _axes = axes();
 
 1590   if (
sOpt == 
"status") {
 
 1592      if (
_axes.size() <= 2) {
 
 1595         out->SetName(
"points");
 
 1596         out->SetMarkerSize(0.5);
 
 1605         expAvail->SetMarkerSize(out->GetMarkerSize() * 1.5);
 
 1611         badPoints->SetMarkerSize(out->GetMarkerSize());
 
 1617         badPoints2->SetMarkerSize(out->GetMarkerSize());
 
 1620                                       (
_axes.size() == 1) ? 
"" : 
_axes.at(1)->GetTitle()));
 
 1621         for (
auto &
p : *
this) {
 
 1622            bool _readOnly = 
p.nllVar ? 
p.nllVar->get()->getAttribute(
"readOnly") : 
false;
 
 1624               p.nllVar->get()->setAttribute(
"readOnly", 
true);
 
 1625            double x = 
p.coords->getRealValue(
_axes.at(0)->GetName());
 
 1626            double y = 
_axes.size() == 1 ? 
p.ts_asymp().first : 
p.coords->getRealValue(
_axes.at(1)->GetName());
 
 1627            out->SetPoint(out->GetN(), 
x, 
y);
 
 1628            if (!std::isnan(
p.ts_asymp().first)) {
 
 1629               if (
_axes.size() == 1)
 
 1630                  out->SetPointError(out->GetN() - 1, 0, 
p.ts_asymp().second);
 
 1632            } 
else if (
p.fUfit && (std::isnan(
p.fUfit->minNll()) ||
 
 1636            } 
else if (
p.fNull_cfit && (std::isnan(
p.fNull_cfit->minNll()) ||
 
 1641            if (!std::isnan(
p.ts_asymp(0).first)) {
 
 1643            } 
else if (
p.asimov() && 
p.asimov()->fUfit &&
 
 1644                       (std::isnan(
p.asimov()->fUfit->minNll()) ||
 
 1648            } 
else if (
p.asimov() && 
p.asimov()->fNull_cfit &&
 
 1649                       (std::isnan(
p.asimov()->fNull_cfit->minNll()) ||
 
 1654               p.nllVar->get()->setAttribute(
"readOnly", 
_readOnly);
 
 1657         if (
_axes.size() == 1) {
 
 1659            for (
int i = 0; i < out->GetN(); i++) {
 
 1660               if (!std::isnan(out->GetPointY(i)))
 
 1661                  tmp.SetPoint(tmp.GetN(), out->GetPointX(i), out->GetPointY(i));
 
 1664               for (
int i = 0; i < 
g->GetN(); i++) {
 
 1665                  if (std::isnan(
g->GetPointY(i)))
 
 1666                     g->SetPointY(i, std::isnan(tmp.Eval(
g->GetPointX(i))) ? 0. : tmp.Eval(
g->GetPointX(i)));
 
 1676         out->SetMarkerStyle(4);
 
 1678         auto leg = 
new TLegend(1. - 
gPad->GetRightMargin() - 0.3, 1. - 
gPad->GetTopMargin() - 0.35,
 
 1679                                1. - 
gPad->GetRightMargin() - 0.05, 1. - 
gPad->GetTopMargin() - 0.05);
 
 1680         leg->SetName(
"legend");
 
 1681         leg->AddEntry(out, 
"Uncomputed", 
"P");
 
 1684            out->GetListOfFunctions()->Add(
tsAvail, 
"P");
 
 1690            out->GetListOfFunctions()->Add(
expAvail, 
"P");
 
 1691            leg->AddEntry(
expAvail, 
"Expected computed", 
"P");
 
 1696            out->GetListOfFunctions()->Add(
badPoints, 
"P");
 
 1702            out->GetListOfFunctions()->Add(
badPoints2, 
"P");
 
 1711         if (
_axes.size() == 1)
 
 1712            gPad->SetLogy(
false);
 
 1720   if (
sOpt.Contains(
"pcls") || 
sOpt.Contains(
"pnull") || 
sOpt.Contains(
"ts")) {
 
 1721      auto gra = graphs(
sOpt + 
" readonly");
 
 1723         gROOT->GetSelectedPad()->cd();
 
 1724      if (!
sOpt.Contains(
"same") && 
gPad) {
 
 1730         if (
sOpt.Contains(
"pcls") || 
sOpt.Contains(
"pnull")) {
 
 1731            gra2->GetHistogram()->SetMinimum(1
e-6);
 
 1735            gPad->GetCanvas()->Paint();
 
 1736            gPad->GetCanvas()->Update();
 
 1737#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 30, 00) 
 1738            gPad->GetCanvas()->ResetUpdated(); 
 
 1743      if (!
sOpt.Contains(
"same") && 
gPad) {
 
 1759   out->SetName(GetName());
 
 1764   if (!empty() && axes().
size() == 1) {
 
 1765      for (
auto &
p : *
this) {
 
 1771      title += front().tsTitle(
true);
 
 1774   out->SetTitle(title);
 
 1775   *
dynamic_cast<TAttFill *
>(out) = *
this;
 
 1776   *
dynamic_cast<TAttLine *
>(out) = *
this;
 
 1783   if (!
sOpt.Contains(
"same"))
 
 1787   if (
sOpt.Contains(
"fits")) {
 
 1789      sOpt.ReplaceAll(
"fits", 
"");
 
 1794   out->SetEditable(
false);
 
 1799      gPad->SetBottomMargin(
gPad->GetBottomMargin() * 2.); 
 
 1809   std::pair<double, double> 
minMax(std::numeric_limits<double>::infinity(), -std::numeric_limits<double>::infinity());
 
 1810   for (
auto &
p : *
this) {
 
 1813      auto val = 
p.pll(
true).first;
 
 1814      if (std::isnan(val))
 
 1819   if (
minMax.first < std::numeric_limits<double>::infinity())
 
 1820      out->GetHistogram()->SetMinimum(
minMax.first);
 
 1821   if (
minMax.second > -std::numeric_limits<double>::infinity())
 
 1822      out->GetHistogram()->SetMaximum(
minMax.second);
 
 1828   std::shared_ptr<const RooFitResult> 
ufr;
 
 1829   for (
auto &
p : *
this) {
 
 1832      auto val = 
p.pll().first;
 
 1835      if (out->GetN() == 0 && 
ufr && 
ufr->status() == 0) {
 
 1836         out->SetPoint(out->GetN(),
 
 1837                       ufr->floatParsFinal().getRealValue(axes().first()->GetName(),
 
 1838                                                          ufr->constPars().getRealValue(axes().first()->GetName())),
 
 1840         out->SetPointError(out->GetN() - 1, 0, 
ufr->edm());
 
 1842      if (
auto fr = 
p.fNull_cfit;
 
 1847            new TPad(fr->GetName(), 
TString::Format(
"%s = %g", poi().first()->GetTitle(), 
p.fNullVal()), 0, 0, 1., 1);
 
 1848         pad->SetNumber(out->GetN() + 1); 
 
 1855      if (std::isnan(val) && 
p.status() != 0) {
 
 1863            out->GetListOfFunctions()->Add(
badPoints, 
"P");
 
 1867      } 
else if (!std::isnan(val)) {
 
 1868         out->SetPoint(out->GetN(), 
p.coords->getRealValue(axes().first()->GetName()), 
p.pll().first);
 
 1869         out->SetPointError(out->GetN() - 1, 0, 
p.pll().second);
 
 1874            for (
int i = 0; i < 
badPoints->GetN(); i++)
 
 1881         basePad->GetCanvas()->Paint();
 
 1882         basePad->GetCanvas()->Update();
 
 1889   basePad->GetCanvas()->Paint();
 
 1890   basePad->GetCanvas()->Update();
 
 1891#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 30, 00) 
 1892   basePad->GetCanvas()->ResetUpdated(); 
 
 1899      auto pad = 
new TPad(
ufr->GetName(), 
"unconditional fit", 0, 0, 1., 1.);
 
 1907      pad = 
new TPad(
"selected", 
"selected", 0, 0, 1, 1);
 
 1910      basePad->GetPad(2)->GetPad(-1)->AppendPad();
 
 1922      gPad->GetCanvas()->
Connect(
"Highlighted(TVirtualPad*,TObject*,Int_t,Int_t)", 
"xRooNode::InteractiveObject",
 
 
 1934   auto _axes = axes();
 
 1939   out->SetTitle(GetTitle());
 
 1941   for (
auto &
p : *
this) {
 
 1942      double _x = 
p.coords->getRealValue(
_axes.at(0)->GetName(), std::numeric_limits<double>::quiet_NaN());
 
 1943      out->Add(_x, 
p.result());
 
 
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
 
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
 
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 SetFillStyle
 
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 Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h offset
 
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 Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t target
 
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
 
Option_t Option_t TPoint TPoint const char x1
 
Option_t Option_t SetFillColor
 
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 Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t type
 
Option_t Option_t TPoint TPoint const char y1
 
R__EXTERN TStyle * gStyle
 
R__EXTERN TSystem * gSystem
 
static std::pair< double, double > matchPrecision(const std::pair< double, double > &in)
 
static std::set< int > allowedStatusCodes
 
xValueWithError limit(const char *type="cls", double nSigma=std::numeric_limits< double >::quiet_NaN()) const
 
xRooHypoPoint & point(size_t i)
 
RooStats::HypoTestInverterResult * result()
 
static xValueWithError GetLimit(const TGraph &pValues, double target=std::numeric_limits< double >::quiet_NaN())
 
std::map< std::string, xValueWithError > limits(const char *opt="cls", const std::vector< double > &nSigmas={0, 1, 2, -1, -2, std::numeric_limits< double >::quiet_NaN()}, double relUncert=std::numeric_limits< double >::infinity())
 
bool AddModel(const xRooNode &pdf, const char *validity="")
 
std::shared_ptr< TMultiGraph > graphs(const char *opt)
 
static RooArgList toArgs(const char *str)
 
xValueWithError findlimit(const char *opt, double relUncert=std::numeric_limits< double >::infinity(), unsigned int maxTries=20)
 
int AddPoints(const char *parName, size_t nPoints, double low, double high)
 
std::shared_ptr< TGraphErrors > graph(const char *opt) const
 
std::shared_ptr< RooArgSet > fPars
 
void Print(Option_t *opt="") const override
Print TNamed name and title.
 
xRooHypoSpace(const char *name="", const char *title="")
 
xRooHypoPoint & AddPoint(double value)
 
int scan(const char *type, size_t nPoints, double low=std::numeric_limits< double >::quiet_NaN(), double high=std::numeric_limits< double >::quiet_NaN(), const std::vector< double > &nSigmas={0, 1, 2, -1, -2, std::numeric_limits< double >::quiet_NaN()}, double relUncert=0.1)
 
std::shared_ptr< xRooNode > pdf(const RooAbsCollection &parValues) const
 
void Draw(Option_t *opt="") override
Default Draw method for all objects.
 
void LoadFits(const char *apath)
 
std::shared_ptr< RooAbsPdf > pdf() const
 
std::shared_ptr< RooArgSet > pars(bool stripGlobalObs=true) const
 
The xRooNode class is designed to wrap over a TObject and provide functionality to aid with interacti...
 
void Draw(Option_t *opt="") override
Default Draw method for all objects.
 
RooArgList argList() const
 
static InteractiveObject * gIntObj
 
xRooNode pars() const
List of parameters (non-observables) of this node.
 
const_iterator begin() const
 
const_iterator end() const
 
A space to attach TBranches.
 
virtual value_type getCurrentIndex() const
Return index number of current state.
 
Abstract container object that can hold multiple RooAbsArg objects.
 
Abstract interface for all probability density functions.
 
Abstract base class for objects that represent a real value that may appear on the left hand side of ...
 
Abstract base class for objects that represent a real value and implements functionality common to al...
 
RooArgList is a container object that can hold multiple RooAbsArg objects.
 
RooArgSet is a container object that can hold multiple RooAbsArg objects.
 
Represents a constant real-valued object.
 
Container class to hold unbinned data.
 
RooFitResult is a container class to hold the input and output of a PDF fit to a dataset.
 
Variable that can be changed from the outside.
 
HypoTestInverterResult class holds the array of hypothesis test results and compute a confidence inte...
 
HypoTestResult * GetResult(int index) const
return a pointer to the i^th result object
 
int ArraySize() const
number of entries in the results array
 
double GetXValue(int index) const
function to return the value of the parameter of interest for the i^th entry in the results
 
RooArgSet * GetParameters() const override
return a cloned list with the parameter of interest
 
Fill Area Attributes class.
 
virtual void SetLineStyle(Style_t lstyle)
Set the line style.
 
static TCanvas * MakeDefCanvas()
Static function to build a default canvas.
 
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.
 
Describe directory structure in memory.
 
virtual Int_t GetValue(const char *name, Int_t dflt) const
Returns the integer value for a resource.
 
A ROOT file is an on-disk file, usually with extension .root, that stores objects in a file-system-li...
 
static TFile * Open(const char *name, Option_t *option="", const char *ftitle="", Int_t compress=ROOT::RCompressionSetting::EDefaults::kUseCompiledDefault, Int_t netopt=0)
Create / open a file.
 
A TGraphErrors is a TGraph with error bars.
 
A TGraph is an object made of two arrays X and Y with npoints each.
 
virtual Double_t GetPointX(Int_t i) const
Get x value for point i.
 
static Bool_t CompareX(const TGraph *gr, Int_t left, Int_t right)
Return kTRUE if fX[left] > fX[right]. Can be used by Sort.
 
virtual void Sort(Bool_t(*greater)(const TGraph *, Int_t, Int_t)=&TGraph::CompareX, Bool_t ascending=kTRUE, Int_t low=0, Int_t high=-1111)
Sorts the points of this TGraph using in-place quicksort (see e.g.
 
TList * GetListOfFunctions() const
 
virtual Int_t RemovePoint()
Delete point close to the mouse position Returns index of removed point (or -1 if nothing was changed...
 
virtual Double_t GetPointY(Int_t i) const
Get y value for point i.
 
virtual void SetPointY(Int_t i, Double_t y)
Set y value for point i.
 
Book space in a file, create I/O buffers, to fill them, (un)compress them.
 
virtual const char * GetClassName() const
 
This class displays a legend box (TPaveText) containing several legend entries.
 
TObject * FindObject(const char *name) const override
Find an object in this list using its name.
 
A TMemFile is like a normal TFile except that it reads and writes only from memory.
 
A TMultiGraph is a collection of TGraph (or derived) objects.
 
The TNamed class is the base class for all named ROOT classes.
 
const char * GetName() const override
Returns name of object.
 
const char * GetTitle() const override
Returns title of object.
 
virtual void SetName(const char *name)
Set the name of the TNamed.
 
virtual void SetNameTitle(const char *name, const char *title)
Set all the TNamed parameters (name and title).
 
Mother of all ROOT objects.
 
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
 
The most important graphics class in the ROOT system.
 
Bool_t Connect(const char *signal, const char *receiver_class, void *receiver, const char *slot)
Non-static method is used to connect from the signal of this object to the receiver slot.
 
Double_t RealTime()
Stop the stopwatch (if it is running) and return the realtime (in seconds) passed between the start a...
 
void Start(Bool_t reset=kTRUE)
Start the stopwatch.
 
void Continue()
Resume a stopped stopwatch.
 
Provides iteration through tokens of a given string.
 
Bool_t NextToken()
Get the next token, it is stored in this TString.
 
Double_t Atof() const
Return floating-point value contained in string.
 
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
 
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
 
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
 
Float_t GetPadRightMargin() const
 
Float_t GetPadTopMargin() 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...
 
TVirtualPad is an abstract base class for the Pad and Canvas classes.
 
double gaussian_quantile(double z, double sigma)
Inverse ( ) of the cumulative distribution function of the lower tail of the normal (Gaussian) distri...
 
#define BEGIN_XROOFIT_NAMESPACE
 
#define END_XROOFIT_NAMESPACE