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 && 
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", std::min(low, high), std::max(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) 
  370      if (
auto myDb = 
dynamic_cast<TMemFile *
>(fFitDb.get())) {
 
  372         myDb->SetWritable(
true);
 
  388      fFitDb = std::shared_ptr<TDirectory>(
 
  400   if (!
gROOT->IsBatch() && !
sType.Contains(
"visualize"))
 
  401      sType += 
" visualize";
 
  405      if (
sType.Contains(
"cls")) {
 
  416            if (std::isnan(res.first) || std::isnan(res.second)) {
 
  418            } 
else if (std::isinf(res.second)) {
 
  423         throw std::runtime_error(
TString::Format(
"Automatic scanning not yet supported for %s", 
type));
 
  428         AddPoint(
TString::Format(
"%s=%g", poi().first()->GetName(), (high + low) / 2.));
 
  430         if (back().status() != 0)
 
  433         double step = (high - low) / (
nPoints - 1);
 
  434         for (
size_t i = 0; i < 
nPoints; i++) {
 
  435            AddPoint(
TString::Format(
"%s=%g", poi().first()->GetName(), low + step * i));
 
  437            if (back().status() != 0)
 
  446   if (
auto myDb = 
dynamic_cast<TMemFile *
>(fFitDb.get())) {
 
  448      myDb->SetWritable(
false);
 
 
  453std::map<std::string, xRooNLLVar::xValueWithError>
 
  460      relUncert = std::numeric_limits<double>::infinity(); 
 
  465   std::map<std::string, xRooNLLVar::xValueWithError> out;
 
 
  487      auto _idx = s.
Index(
'=');
 
  492      auto _v = 
dynamic_cast<RooRealVar *
>(fPars->find(_name));
 
  496      if (
_val.IsFloat()) {
 
  505      throw std::runtime_error(
"no model at coordinates");
 
  512   if (fNlls.find(_pdf) == fNlls.end()) {
 
  513      fNlls[_pdf] = std::make_shared<xRooNLLVar>(_pdf->nll(
"" , {}));
 
  518   out.nllVar = fNlls[_pdf];
 
  519   out.fData = fNlls[_pdf]->getData();
 
  520   out.isExpected = 
dynamic_cast<RooDataSet *
>(out.fData.first.get()) &&
 
  521                    dynamic_cast<RooDataSet *
>(out.fData.first.get())->weightVar()->getAttribute(
"expected");
 
  524   out.coords.reset(fPars->snapshot()); 
 
  526   out.poi().setAttribAll(
"Constant");
 
  533      ->remove(*std::unique_ptr<RooAbsCollection>(out.coords->selectByAttrib(
"Constant", 
false)), 
true, 
true);
 
  535   double value = out.fNullVal();
 
  538   auto _type = fTestStatType;
 
  550   out.fPllType = _type;
 
  553   for (
auto &
p : *
this) {
 
  554      if (
p.nllVar != out.nllVar)
 
  556      if (
p.fData != out.fData)
 
  558      if (!
p.alt_poi().equals(out.alt_poi()))
 
  561      for (
auto c : 
p.alt_poi()) {
 
  563             v && std::abs(
v->getVal() - out.alt_poi().getRealValue(
v->GetName())) > 1
e-12) {
 
  568                              out.alt_poi().getCatIndex(cat->GetName(), std::numeric_limits<int>().max())) {
 
  575      if (!
p.coords->equals(*out.coords))
 
  577      for (
auto c : *
p.coords) {
 
  578         if (
c->getAttribute(
"poi")) {
 
  582             v && std::abs(
v->getVal() - out.coords->getRealValue(
v->GetName())) > 1
e-12) {
 
  587                              out.alt_poi().getCatIndex(cat->GetName(), std::numeric_limits<int>().max())) {
 
  596      if (
auto cfit = 
p.cfit_alt(
true)) {
 
  597         out.fAlt_cfit = cfit;
 
  599      if (
p.asimov(
true) && 
p.asimov(
true)->fData.first && (!out.asimov(
true) || !out.asimov(
true)->fData.first)) {
 
  600         out.asimov()->fData = 
p.asimov(
true)->fData;
 
  602      if (!
p.poi().equals(out.poi()))
 
  604      for (
auto c : 
p.poi()) {
 
  606             v && std::abs(
v->getVal() - out.poi().getRealValue(
v->GetName())) > 1
e-12) {
 
  618   for (
auto a : axes()) {
 
  625   return emplace_back(out);
 
 
  632      throw std::runtime_error(
"Not a pdf");
 
  644      throw std::runtime_error(std::string(
"Clashing model: ") + 
existing->GetName());
 
  650   pars.remove(*fPars, 
true, 
true);
 
  652   fPars->addClone(
pars);
 
  654   fPdfs.insert(std::make_pair(
myPars, std::make_shared<xRooNode>(_pdf)));
 
 
  665   out.add(*std::unique_ptr<RooAbsCollection>(
 
  666      fPars->selectByAttrib(
"axis", 
true))); 
 
  672      std::set<std::vector<double>> coords;
 
  673      for (
auto &
p : *
this) {
 
  676            auto _v = 
dynamic_cast<RooRealVar *
>(
p.coords->find(o->GetName()));
 
  678               (
_v && 
_v->isConstant())
 
  680                  : std::numeric_limits<double>::infinity()); 
 
  683         if (coords.find(
p_coords) != coords.end()) {
 
  692         std::map<std::string, std::unordered_set<double>> values;
 
  693         for (
auto &par : *
pars()) {
 
  696            for (
auto p : *
this) {
 
  697               auto _v = 
dynamic_cast<RooRealVar *
>(
p.coords->find(par->GetName()));
 
  698               values[par->GetName()].insert(
 
  699                  (
_v && 
_v->isConstant())
 
  701                     : std::numeric_limits<double>::infinity()); 
 
  710         for (
auto &[k, 
v] : values) {
 
  713               isPOI = 
pars()->find(k.c_str())->getAttribute(
"poi");
 
  726   std::unique_ptr<RooAbsCollection> poi(out.selectByAttrib(
"poi", 
true));
 
 
  737   out.add(*std::unique_ptr<RooAbsCollection>(
pars()->selectByAttrib(
"poi", 
true)));
 
 
  748   for (
size_t i = 0; i < 
size(); i++) {
 
  749      std::cout << i << 
") ";
 
  753         std::cout << 
a->GetName() << 
"=" 
  754                   << at(i).coords->getRealValue(
a->GetName(), std::numeric_limits<double>::quiet_NaN());
 
  756      std::cout << 
" status=[ufit:";
 
  761         std::cout << ufit->
status();
 
  764      std::cout << 
",cfit_null:";
 
  765      auto cfit = 
const_cast<xRooHypoPoint &
>(at(i)).cfit_null(
true);
 
  769         std::cout << cfit->
status();
 
  772      std::cout << 
",cfit_alt:";
 
  777         std::cout << 
afit->status();
 
  781         std::cout << 
",asimov.ufit:";
 
  789         std::cout << 
",asimov.cfit_null:";
 
  797         auto cfit_lbound = 
const_cast<xRooHypoPoint &
>(at(i)).cfit_lbound(
true);
 
  800            std::cout << 
",cfit_lbound:" << cfit_lbound->
status();
 
  805      auto sigma_mu = 
const_cast<xRooHypoPoint &
>(at(i)).sigma_mu(
true);
 
  806      if (!std::isnan(sigma_mu.first)) {
 
  807         std::cout << 
" sigma_mu=" << sigma_mu.first;
 
  809            std::cout << 
" +/- " << sigma_mu.second;
 
  811      std::cout << std::endl;
 
  813   std::cout << 
"--------------------------" << std::endl;
 
  814   std::cout << 
"Number of bad fits: " << 
badFits << std::endl;
 
 
  818   const char *opt )
 const 
  829      (
sOpt.Contains(
"exp"))
 
  833         : std::numeric_limits<double>::quiet_NaN();
 
  838   if (
_axes.size() != 1)
 
  841   auto out = std::make_shared<TGraphErrors>();
 
  842   out->SetName(GetName());
 
  843   out->SetEditable(
false);
 
  844   const char *
sCL = (
doCLs) ? 
"CLs" : 
"null";
 
  858      out->SetMarkerStyle(20);
 
  859      out->SetMarkerSize(0.5);
 
  860      if (
sOpt.Contains(
"ts")) {
 
  862                                                     (empty() ? 
"" : front().tsTitle(
true).Data())));
 
  866      out->SetMarkerStyle(0);
 
  867      out->SetMarkerSize(0);
 
  868      out->SetLineStyle(2 + 
int(
nSigma));
 
  872         out->SetLineStyle(0);
 
  873         out->SetLineWidth(0);
 
  874         auto x = out->Clone(
"up");
 
  878         out->GetListOfFunctions()->Add(
x, 
"F");
 
  879         x = out->Clone(
"down");
 
  883         out->GetListOfFunctions()->Add(
x, 
"F");
 
  885      if (
sOpt.Contains(
"ts")) {
 
  892      auto badPoints2 = 
dynamic_cast<TGraph *
>(out->GetListOfFunctions()->FindObject(
"badPoints"));
 
  900         out->GetListOfFunctions()->Add(
badPoints2, 
"P");
 
  909   for (
auto &
p : *
this) {
 
  913            auto gra = graph(
sOpt + 
" readOnly");
 
  916                  gROOT->GetSelectedPad()->cd();
 
  920#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 30, 00) 
  921               if (
auto pad = 
gROOT->GetSelectedPad()) {
 
  922                  pad->GetCanvas()->ResetUpdated(); 
 
  928            ::Info(
"xRooHypoSpace::graph", 
"Completed %d/%d points for %s", 
int(
nDone), 
int(
size()), 
sOpt.Data());
 
  934      double _x = 
p.coords->getRealValue(
_axes.at(0)->GetName(), std::numeric_limits<double>::quiet_NaN());
 
  938      if (std::isnan(
pval.first)) {
 
  939         if (
p.status() != 0) { 
 
  943         out->InsertPointBefore(idx, _x, 
pval.first);
 
  944         out->SetPointError(idx, 0, 
pval.second);
 
  949         sOpt2.ReplaceAll(
"exp", 
"exp-");
 
  951         if (std::isnan(
pval.first)) {
 
  952            if (
p.status() != 0) { 
 
  956            out->InsertPointBefore(idx + 1, _x, 
pval.first);
 
  957            out->SetPointError(idx + 1, 0, 
pval.second);
 
  959            if (out->GetPointY(idx) < 
pval.first)
 
  966   if (out->GetN() == 0)
 
  971      if (out->GetListOfFunctions()->FindObject(
"badPoints")) {
 
  973         for (
int i = 0; i < 
badPoints()->GetN(); i++) {
 
  982      auto up = 
dynamic_cast<TGraph *
>(out->GetListOfFunctions()->FindObject(
"up"));
 
  983      auto down = 
dynamic_cast<TGraph *
>(out->GetListOfFunctions()->FindObject(
"down"));
 
  985      for (
int i = 0; i < out->GetN(); i++) {
 
  987            up->SetPoint(
up->GetN(), out->GetPointX(i), out->GetPointY(i) + out->GetErrorY(i) * (
above ? 1. : -1.));
 
  988            down->SetPoint(
down->GetN(), out->GetPointX(i), out->GetPointY(i) - out->GetErrorY(i) * (
above ? 1. : -1.));
 
  990            up->SetPoint(
up->GetN(), out->GetPointX(i), out->GetPointY(i) - out->GetErrorY(i) * (
above ? 1. : -1.));
 
  991            down->SetPoint(
down->GetN(), out->GetPointX(i), out->GetPointY(i) + out->GetErrorY(i) * (
above ? 1. : -1.));
 
  999         gROOT->GetSelectedPad()->cd();
 
 1003#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 30, 00) 
 1004      if (
auto pad = 
gROOT->GetSelectedPad()) {
 
 1005         pad->GetCanvas()->ResetUpdated(); 
 
 
 1018   std::shared_ptr<TMultiGraph> out;
 
 1019   if (
sOpt.Contains(
"pcls") || 
sOpt.Contains(
"pnull") || 
sOpt.Contains(
"ts")) {
 
 1022      sOpt.ReplaceAll(
"visualize", 
"");
 
 1024      auto exp2 = graph(
sOpt + 
" exp2");
 
 1026      auto exp = graph(
sOpt + 
" exp");
 
 1029      auto obs = (
doObs) ? graph(
sOpt) : 
nullptr;
 
 1031      out = std::make_shared<TMultiGraph>(GetName(), GetTitle());
 
 1032      if (exp2 && exp2->GetN() > 1)
 
 1033         out->Add(
static_cast<TGraph *
>(exp2->Clone()), 
"FP");
 
 1035         out->Add(
static_cast<TGraph *
>(
exp1->Clone()), 
"FP");
 
 1036      if (exp && exp->GetN() > 1)
 
 1037         out->Add(
static_cast<TGraph *
>(exp->Clone()), 
"LP");
 
 1038      if (obs && obs->GetN() > 1)
 
 1039         out->Add(
static_cast<TGraph *
>(obs->Clone()), 
"LP");
 
 1041      if (!out->GetListOfGraphs()) {
 
 1046      if (
sOpt.Contains(
"pcls")) {
 
 1048         line->SetName(
"alpha");
 
 1050         line->SetEditable(
false);
 
 1051         line->SetPoint(
line->GetN(), out->GetHistogram()->GetXaxis()->GetXmin() - 10, 0.05);
 
 1058            for (
int i = 0; i < exp->GetN(); i++) {
 
 1062         line->SetPoint(
line->GetN(), out->GetHistogram()->GetXaxis()->GetXmax() + 10, 0.05);
 
 1064         out->GetListOfFunctions()->Add(
line, 
"L");
 
 1067         out->GetHistogram()->GetXaxis()->SetTitle(exp->GetHistogram()->GetXaxis()->GetTitle());
 
 1068         out->GetHistogram()->GetYaxis()->SetTitle(exp->GetHistogram()->GetYaxis()->GetTitle());
 
 1071      if (out->GetListOfGraphs()->GetEntries() > 1) {
 
 1074         leg->SetName(
"legend");
 
 1077         out->GetListOfFunctions()->Add(
leg);
 
 1080         for (
auto g : *out->GetListOfGraphs()) {
 
 1082               leg->AddEntry(o, 
"", 
"F");
 
 1084               leg->AddEntry(
g, 
"", 
"LPE");
 
 1089      auto addToLegend = [](
TLegend *
l, 
const char *label, 
const std::pair<double, double> val) {
 
 1092                        TString::Format(
"%s%s: %g #pm %g%s", std::isfinite(val.second) ? 
"" : 
"#color[2]{", label,
 
 1093                                        val.first, val.second, std::isfinite(val.second) ? 
"" : 
"}"),
 
 1098      if (
sOpt.Contains(
"pcls")) {
 
 1100         if (exp2 && exp2->GetN() > 1) {
 
 1108         if (exp && exp->GetN() > 1) {
 
 1116         if (exp2 && exp2->GetN() > 1) {
 
 1120         if (obs && obs->GetN() > 1) {
 
 1130            gROOT->GetSelectedPad()->cd();
 
 1135         if (
sOpt.Contains(
"pcls") || 
sOpt.Contains(
"pnull")) {
 
 1136            gra2->GetHistogram()->SetMinimum(1
e-6);
 
 1140            gPad->GetCanvas()->Paint();
 
 1141            gPad->GetCanvas()->Update();
 
 1142#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 30, 00) 
 1143            gPad->GetCanvas()->ResetUpdated(); 
 
 
 1156   if (std::isnan(
target)) {
 
 1160   auto gr = std::make_shared<TGraph>(
pValues);
 
 1181      return std::pair<double, double>(std::numeric_limits<double>::quiet_NaN(), 0);
 
 1184   double alpha = log(
target);
 
 1198         return std::pair(
lim, err);
 
 1213         return std::pair(std::numeric_limits<double>::infinity(), std::numeric_limits<double>::infinity());
 
 1214      return std::pair((alpha - 
y1) / 
m + 
x1, std::numeric_limits<double>::infinity());
 
 1221         return std::pair(-std::numeric_limits<double>::infinity(), -std::numeric_limits<double>::infinity());
 
 1222      return std::pair((alpha - 
y1) / 
m + 
x1, -std::numeric_limits<double>::infinity());
 
 
 1229   if (std::isnan(
nSigma)) {
 
 1234   return GetLimit(*graph(
sOpt + 
" readonly"));
 
 
 1242   sOpt.ReplaceAll(
"visualize", 
"");
 
 1243   std::shared_ptr<TGraphErrors> 
gr = graph(
sOpt + 
" readonly");
 
 1245      auto gra = graphs(
sOpt.Contains(
"toys") ? 
"pcls readonly toys" : 
"pcls readonly");
 
 1252         gra->GetHistogram()->SetMinimum(1
e-9);
 
 1253         gra->GetHistogram()->GetYaxis()->SetRangeUser(1
e-9, 1);
 
 1255#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 30, 00) 
 1256         gPad->GetCanvas()->ResetUpdated(); 
 
 1263   for (
auto p : axes()) {
 
 1264      for (
auto &[
pdf, nll] : fNlls) {
 
 1265         if (
auto _v = 
dynamic_cast<RooRealVar *
>(nll->pars()->find(*
p))) {
 
 1272      auto v = (axes().empty()) ? 
nullptr : 
dynamic_cast<RooRealVar *
>(*axes().rbegin());
 
 1274         return std::pair(std::numeric_limits<double>::quiet_NaN(), 0.);
 
 1275      double muMax = std::min(std::min(
v->getMax(
"physical"), 
v->getMax()), 
v->getMax(
"scan"));
 
 1276      double muMin = std::max(std::max(
v->getMin(
"physical"), 
v->getMin()), 
v->getMin(
"scan"));
 
 1280            ::Error(
"findlimit", 
"Problem evaluating %s @ %s=%g", 
sOpt.Data(), 
v->GetName(), 
muMin);
 
 1281            return std::pair(std::numeric_limits<double>::quiet_NaN(), 0.);
 
 1294      if (
sOpt.Contains(
"obs")) {
 
 1296         sOpt2.ReplaceAll(
"obs", 
"exp");
 
 1297         auto expLim = findlimit(
sOpt2, std::numeric_limits<double>::infinity(), 0);
 
 1303         (
sOpt.Contains(
"exp")) ? back().asimov() : std::shared_ptr<xRooHypoPoint>(&back(), [](
xRooHypoPoint *) {});
 
 1305      if (point && point->ufit()) {
 
 1316         ::Error(
"xRooHypoSpace::findlimit", 
"Problem evaluating %s @ %s=%g", 
sOpt.Data(), 
v->GetName(), 
nextPoint);
 
 1317         return std::pair(std::numeric_limits<double>::quiet_NaN(), 0.);
 
 1323   auto lim = GetLimit(*
gr);
 
 1325   if (std::isnan(
lim.first)) {
 
 1329   auto v = 
dynamic_cast<RooRealVar *
>(*axes().rbegin());
 
 1330   double maxMu = std::min(std::min(
v->getMax(
"physical"), 
v->getMax()), 
v->getMax(
"scan"));
 
 1331   double minMu = std::max(std::max(
v->getMin(
"physical"), 
v->getMin()), 
v->getMin(
"scan"));
 
 1334   if (
lim.first > -std::numeric_limits<double>::infinity() && 
lim.first < std::numeric_limits<double>::infinity() &&
 
 1340   if (
lim.second == std::numeric_limits<double>::infinity()) {
 
 1350         (
sOpt.Contains(
"exp")) ? back().asimov() : std::shared_ptr<xRooHypoPoint>(&back(), [](
xRooHypoPoint *) {});
 
 1352      if (point && point->ufit()) {
 
 1364   } 
else if (
lim.second == -std::numeric_limits<double>::infinity()) {
 
 1378   ::Info(
"xRooHypoSpace::findlimit", 
"%s -- Testing new point @ %s=%g (delta=%g)", 
sOpt.Data(), 
v->GetName(),
 
 1382         ::Warning(
"xRooHypoSpace::findlimit", 
"Reached max number of point evaluations");
 
 1384         ::Error(
"xRooHypoSpace::findlimit", 
"Problem evaluating %s @ %s=%g", 
sOpt.Data(), 
v->GetName(), 
nextPoint);
 
 
 1398   if ((
sOpt == 
"" || 
sOpt == 
"same") && !empty()) {
 
 1401         for (
auto &
hp : *
this) {
 
 1402            if (!
hp.nullToys.empty() || !
hp.altToys.empty()) {
 
 1413   auto _axes = axes();
 
 1417   if (
sOpt == 
"status") {
 
 1419      if (
_axes.size() <= 2) {
 
 1422         out->SetName(
"points");
 
 1423         out->SetMarkerSize(0.5);
 
 1432         expAvail->SetMarkerSize(out->GetMarkerSize() * 1.5);
 
 1438         badPoints->SetMarkerSize(out->GetMarkerSize());
 
 1444         badPoints2->SetMarkerSize(out->GetMarkerSize());
 
 1447                                       (
_axes.size() == 1) ? 
"" : 
_axes.at(1)->GetTitle()));
 
 1448         for (
auto &
p : *
this) {
 
 1449            bool _readOnly = 
p.nllVar ? 
p.nllVar->get()->getAttribute(
"readOnly") : 
false;
 
 1451               p.nllVar->get()->setAttribute(
"readOnly", 
true);
 
 1452            double x = 
p.coords->getRealValue(
_axes.at(0)->GetName());
 
 1453            double y = 
_axes.size() == 1 ? 
p.ts_asymp().first : 
p.coords->getRealValue(
_axes.at(1)->GetName());
 
 1454            out->SetPoint(out->GetN(), 
x, 
y);
 
 1455            if (!std::isnan(
p.ts_asymp().first)) {
 
 1456               if (
_axes.size() == 1)
 
 1457                  out->SetPointError(out->GetN() - 1, 0, 
p.ts_asymp().second);
 
 1459            } 
else if (
p.fUfit && (std::isnan(
p.fUfit->minNll()) ||
 
 1463            } 
else if (
p.fNull_cfit && (std::isnan(
p.fNull_cfit->minNll()) ||
 
 1468            if (!std::isnan(
p.ts_asymp(0).first)) {
 
 1470            } 
else if (
p.asimov() && 
p.asimov()->fUfit &&
 
 1471                       (std::isnan(
p.asimov()->fUfit->minNll()) ||
 
 1475            } 
else if (
p.asimov() && 
p.asimov()->fNull_cfit &&
 
 1476                       (std::isnan(
p.asimov()->fNull_cfit->minNll()) ||
 
 1481               p.nllVar->get()->setAttribute(
"readOnly", 
_readOnly);
 
 1484         if (
_axes.size() == 1) {
 
 1486            for (
int i = 0; i < out->GetN(); i++) {
 
 1487               if (!std::isnan(out->GetPointY(i)))
 
 1488                  tmp.SetPoint(tmp.GetN(), out->GetPointX(i), out->GetPointY(i));
 
 1491               for (
int i = 0; i < 
g->GetN(); i++) {
 
 1492                  if (std::isnan(
g->GetPointY(i)))
 
 1493                     g->SetPointY(i, std::isnan(tmp.Eval(
g->GetPointX(i))) ? 0. : tmp.Eval(
g->GetPointX(i)));
 
 1503         out->SetMarkerStyle(4);
 
 1505         auto leg = 
new TLegend(1. - 
gPad->GetRightMargin() - 0.3, 1. - 
gPad->GetTopMargin() - 0.35,
 
 1506                                1. - 
gPad->GetRightMargin() - 0.05, 1. - 
gPad->GetTopMargin() - 0.05);
 
 1507         leg->SetName(
"legend");
 
 1508         leg->AddEntry(out, 
"Uncomputed", 
"P");
 
 1511            out->GetListOfFunctions()->Add(
tsAvail, 
"P");
 
 1517            out->GetListOfFunctions()->Add(
expAvail, 
"P");
 
 1518            leg->AddEntry(
expAvail, 
"Expected computed", 
"P");
 
 1523            out->GetListOfFunctions()->Add(
badPoints, 
"P");
 
 1529            out->GetListOfFunctions()->Add(
badPoints2, 
"P");
 
 1538         if (
_axes.size() == 1)
 
 1539            gPad->SetLogy(
false);
 
 1547   if (
sOpt.Contains(
"pcls") || 
sOpt.Contains(
"pnull") || 
sOpt.Contains(
"ts")) {
 
 1548      auto gra = graphs(
sOpt + 
" readonly");
 
 1550         gROOT->GetSelectedPad()->cd();
 
 1551      if (!
sOpt.Contains(
"same") && 
gPad) {
 
 1559         if (
sOpt.Contains(
"pcls") || 
sOpt.Contains(
"pnull")) {
 
 1560            gra2->GetHistogram()->SetMinimum(1
e-6);
 
 1564            gPad->GetCanvas()->Paint();
 
 1565            gPad->GetCanvas()->Update();
 
 1566#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 30, 00) 
 1567            gPad->GetCanvas()->ResetUpdated(); 
 
 1572      if (!
sOpt.Contains(
"same") && 
gPad) {
 
 1588   out->SetName(GetName());
 
 1593   if (!empty() && axes().
size() == 1) {
 
 1594      for (
auto &
p : *
this) {
 
 1600      title += front().tsTitle(
true);
 
 1603   out->SetTitle(title);
 
 1604   *
dynamic_cast<TAttFill *
>(out) = *
this;
 
 1605   *
dynamic_cast<TAttLine *
>(out) = *
this;
 
 1612   if (!
sOpt.Contains(
"same"))
 
 1616   if (
sOpt.Contains(
"fits")) {
 
 1618      sOpt.ReplaceAll(
"fits", 
"");
 
 1623   out->SetEditable(
false);
 
 1628      gPad->SetBottomMargin(
gPad->GetBottomMargin() * 2.); 
 
 1638   std::pair<double, double> 
minMax(std::numeric_limits<double>::infinity(), -std::numeric_limits<double>::infinity());
 
 1639   for (
auto &
p : *
this) {
 
 1642      auto val = 
p.pll(
true).first;
 
 1643      if (std::isnan(val))
 
 1648   if (
minMax.first < std::numeric_limits<double>::infinity())
 
 1649      out->GetHistogram()->SetMinimum(
minMax.first);
 
 1650   if (
minMax.second > -std::numeric_limits<double>::infinity())
 
 1651      out->GetHistogram()->SetMaximum(
minMax.second);
 
 1657   std::shared_ptr<const RooFitResult> 
ufr;
 
 1658   for (
auto &
p : *
this) {
 
 1661      auto val = 
p.pll().first;
 
 1664      if (out->GetN() == 0 && 
ufr && 
ufr->status() == 0) {
 
 1665         out->SetPoint(out->GetN(),
 
 1666                       ufr->floatParsFinal().getRealValue(axes().first()->GetName(),
 
 1667                                                          ufr->constPars().getRealValue(axes().first()->GetName())),
 
 1669         out->SetPointError(out->GetN() - 1, 0, 
ufr->edm());
 
 1671      if (
auto fr = 
p.fNull_cfit;
 
 1676            new TPad(fr->GetName(), 
TString::Format(
"%s = %g", poi().first()->GetTitle(), 
p.fNullVal()), 0, 0, 1., 1);
 
 1677         pad->SetNumber(out->GetN() + 1); 
 
 1684      if (std::isnan(val) && 
p.status() != 0) {
 
 1692            out->GetListOfFunctions()->Add(
badPoints, 
"P");
 
 1696      } 
else if (!std::isnan(val)) {
 
 1697         out->SetPoint(out->GetN(), 
p.coords->getRealValue(axes().first()->GetName()), 
p.pll().first);
 
 1698         out->SetPointError(out->GetN() - 1, 0, 
p.pll().second);
 
 1703            for (
int i = 0; i < 
badPoints->GetN(); i++)
 
 1710         basePad->GetCanvas()->Paint();
 
 1711         basePad->GetCanvas()->Update();
 
 1718   basePad->GetCanvas()->Paint();
 
 1719   basePad->GetCanvas()->Update();
 
 1720#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 30, 00) 
 1721   basePad->GetCanvas()->ResetUpdated(); 
 
 1728      auto pad = 
new TPad(
ufr->GetName(), 
"unconditional fit", 0, 0, 1., 1.);
 
 1736      pad = 
new TPad(
"selected", 
"selected", 0, 0, 1, 1);
 
 1739      basePad->GetPad(2)->GetPad(-1)->AppendPad();
 
 1751      gPad->GetCanvas()->
Connect(
"Highlighted(TVirtualPad*,TObject*,Int_t,Int_t)", 
"xRooNode::InteractiveObject",
 
 
 1763   auto _axes = axes();
 
 1768   out->SetTitle(GetTitle());
 
 1770   for (
auto &
p : *
this) {
 
 1771      double _x = 
p.coords->getRealValue(
_axes.at(0)->GetName(), std::numeric_limits<double>::quiet_NaN());
 
 1772      out->Add(_x, 
p.result());
 
 
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
 
const char Option_t
Option string (const char)
 
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 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.
 
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 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.
 
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.
 
Describe directory structure in memory.
 
virtual Int_t GetValue(const char *name, Int_t dflt) const
Returns the integer value for a resource.
 
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.
 
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.
 
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