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