From 1a8a4df0c8141c5805b6dbc52b54ba41ea1cd2c8 Mon Sep 17 00:00:00 2001 From: Dennis Roy Date: Wed, 22 Apr 2026 13:54:46 +0200 Subject: [PATCH 1/6] Make nicer GoF plots --- scripts/plotGof.py | 119 ++++++++++++++++++++++++--------------------- 1 file changed, 64 insertions(+), 55 deletions(-) diff --git a/scripts/plotGof.py b/scripts/plotGof.py index 67de15950c7..1e3c06efbef 100755 --- a/scripts/plotGof.py +++ b/scripts/plotGof.py @@ -42,6 +42,46 @@ def DrawAxisHists(pads, axis_hists, def_pad=None): if def_pad is not None: def_pad.cd() +def DrawWarning(arrowrange, underflow, overflow): + warningtext1 = ROOT.TPaveText(0.48, 0.73, 0.60, 0.77, "NDC") + warningtext1.SetBorderSize(0) + warningtext1.SetFillStyle(0) + warningtext1.SetTextAlign(22) + warningtext1.SetTextSize(0.04) + warningtext1.SetTextColor(2) + warningtext1.SetTextFont(62) + + if arrowrange and ((underflow != 0) or (overflow != 0)): + warningstrings = [] + if underflow != 0: + warningstrings.append("%d underflow" % underflow) + if overflow != 0: + warningstrings.append("%d overflow" % overflow) + warningtext1.AddText(", ".join(warningstrings)) + warningtext1.Draw() + + warningtext2 = ROOT.TPaveText(0.48, 0.73, 0.60, 0.77, "NDC") + warningtext2.SetBorderSize(0) + warningtext2.SetFillStyle(0) + warningtext2.SetTextAlign(22) + warningtext2.SetTextSize(0.04) + warningtext2.SetTextColor(2) + warningtext2.SetTextFont(62) + warningtext2.AddText(f"observed value not in range, at {obs.GetX()[0]:.2f}") + return warningtext2 + else: + if (underflow != 0) or (overflow != 0): + warningstrings = [] + if underflow != 0: + warningstrings.append("%d underflow" % underflow) + if overflow != 0: + warningstrings.append("%d overflow" % overflow) + warningtext1.AddText(", ".join(warningstrings)) + elif arrowrange: + warningtext1.AddText(f"observed value not in range, at {obs.GetX()[0]:.2f}") + return warningtext1 + return None + ## Boilerplate ROOT.PyConfig.IgnoreCommandLineOptions = True @@ -125,12 +165,14 @@ def DrawAxisHists(pads, axis_hists, def_pad=None): for i in range(toy_graph.GetN()): toy_hist.Fill(toy_graph.GetX()[i]) pValue = js[args.mass][key]["p"] + underflow_count = toy_hist.GetBinContent(0) + overflow_count = toy_hist.GetBinContent(args.bins + 1) obs = plot.ToyTGraphFromJSON(js, [args.mass, key, "obs"]) - arr = ROOT.TArrow(obs.GetX()[0], 0.001, obs.GetX()[0], toy_hist.GetMaximum() / 8, 0.02, "<|") + arr = ROOT.TArrow(obs.GetX()[0], 0.001, obs.GetX()[0], toy_hist.GetMaximum() / 6, 0.03, "<|") arr.SetLineColor(ROOT.kBlue) arr.SetFillColor(ROOT.kBlue) arr.SetFillStyle(1001) - arr.SetLineWidth(6) + arr.SetLineWidth(4) arr.SetLineStyle(1) arr.SetAngle(60) toy_hist.Draw() @@ -138,10 +180,9 @@ def DrawAxisHists(pads, axis_hists, def_pad=None): pads[0].RedrawAxis() pads[0].RedrawAxis("g") pads[0].GetFrame().Draw() - - # axis[0].GetYaxis().SetTitle(args.y_title) - # axis[0].GetXaxis().SetTitle(args.x_title) - # axis[0].GetXaxis().SetLabelOffset(axis[0].GetXaxis().GetLabelOffset()*2) + toy_hist.GetYaxis().SetTitle(args.y_title) + toy_hist.GetXaxis().SetTitle(args.x_title) + toy_hist.GetXaxis().SetLabelOffset(toy_hist.GetXaxis().GetLabelOffset()*2) y_min, y_max = (plot.GetPadYMin(pads[0]), plot.GetPadYMax(pads[0])) plot.FixBothRanges(pads[0], 0, 0, y_max, 0.25) @@ -159,11 +200,11 @@ def DrawAxisHists(pads, axis_hists, def_pad=None): legend.Draw() - plot.DrawCMSLogo(pads[0], "CMS", args.cms_sub, 11, 0.045, 0.035, 1.2, "", 0.8) + plot.DrawCMSLogo(pads[0], "CMS", args.cms_sub, 11, 0.095, 0.035, 1.2, "", 0.8) plot.DrawTitle(pads[0], args.title_right, 3) plot.DrawTitle(pads[0], title, 1) - textlabel = ROOT.TPaveText(0.68, 0.88, 0.80, 0.92, "NDC") + textlabel = ROOT.TPaveText(0.78, 0.88, 0.90, 0.92, "NDC") textlabel.SetBorderSize(0) textlabel.SetFillStyle(0) textlabel.SetTextAlign(32) @@ -173,7 +214,7 @@ def DrawAxisHists(pads, axis_hists, def_pad=None): textlabel.AddText(args.statistic + ", %s Toys" % (toy_graph.GetN())) textlabel.Draw() - pvalue = ROOT.TPaveText(0.68, 0.83, 0.80, 0.87, "NDC") + pvalue = ROOT.TPaveText(0.78, 0.83, 0.90, 0.87, "NDC") pvalue.SetBorderSize(0) pvalue.SetFillStyle(0) pvalue.SetTextAlign(32) @@ -183,6 +224,10 @@ def DrawAxisHists(pads, axis_hists, def_pad=None): pvalue.AddText("p-value = %0.3f" % pValue) pvalue.Draw() + arrow_not_in_range = (obs.GetX()[0] > toy_hist.GetBinLowEdge(args.bins + 1)) or (obs.GetX()[0] < toy_hist.GetBinLowEdge(0)) + warningtext = DrawWarning(arrow_not_in_range, underflow_count, overflow_count) + if warningtext: warningtext.Draw() + canv.Print(key + args.output + ".pdf") canv.Print(key + args.output + ".png") @@ -208,14 +253,14 @@ def DrawAxisHists(pads, axis_hists, def_pad=None): underflow_count = toy_hist.GetBinContent(0) overflow_count = toy_hist.GetBinContent(args.bins + 1) obs = plot.ToyTGraphFromJSON(js, [args.mass, "obs"]) - arr = ROOT.TArrow(obs.GetX()[0], 0.001, obs.GetX()[0], toy_hist.GetMaximum() / 8, 0.02, "<|") + arr = ROOT.TArrow(obs.GetX()[0], 0.001, obs.GetX()[0], toy_hist.GetMaximum() / 6, 0.03, "<|") # if axis is None: # axis = plot.CreateAxisHists(1, graph_sets[-1].values()[0], True) # DrawAxisHists(pads, axis, pads[0]) arr.SetLineColor(ROOT.kBlue) arr.SetFillColor(ROOT.kBlue) arr.SetFillStyle(1001) - arr.SetLineWidth(6) + arr.SetLineWidth(4) arr.SetLineStyle(1) arr.SetAngle(60) toy_hist.Draw() @@ -223,9 +268,9 @@ def DrawAxisHists(pads, axis_hists, def_pad=None): pads[0].RedrawAxis() pads[0].RedrawAxis("g") pads[0].GetFrame().Draw() - # axis[0].GetYaxis().SetTitle(args.y_title) - # axis[0].GetXaxis().SetTitle(args.x_title) - # axis[0].GetXaxis().SetLabelOffset(axis[0].GetXaxis().GetLabelOffset()*2) + toy_hist.GetYaxis().SetTitle(args.y_title) + toy_hist.GetXaxis().SetTitle(args.x_title) + toy_hist.GetXaxis().SetLabelOffset(toy_hist.GetXaxis().GetLabelOffset()*2) y_min, y_max = (plot.GetPadYMin(pads[0]), plot.GetPadYMax(pads[0])) plot.FixBothRanges(pads[0], 0, 0, y_max, 0.25) @@ -243,11 +288,11 @@ def DrawAxisHists(pads, axis_hists, def_pad=None): legend.Draw() - plot.DrawCMSLogo(pads[0], "CMS", args.cms_sub, 11, 0.045, 0.035, 1.2, "", 0.8) + plot.DrawCMSLogo(pads[0], "CMS", args.cms_sub, 11, 0.095, 0.035, 1.2, "", 0.8) plot.DrawTitle(pads[0], args.title_right, 3) plot.DrawTitle(pads[0], args.title_left, 1) - textlabel = ROOT.TPaveText(0.68, 0.88, 0.80, 0.92, "NDC") + textlabel = ROOT.TPaveText(0.78, 0.88, 0.90, 0.92, "NDC") textlabel.SetBorderSize(0) textlabel.SetFillStyle(0) textlabel.SetTextAlign(32) @@ -257,7 +302,7 @@ def DrawAxisHists(pads, axis_hists, def_pad=None): textlabel.AddText(args.statistic + ", %s Toys" % (toy_graph.GetN())) textlabel.Draw() - pvalue = ROOT.TPaveText(0.68, 0.83, 0.80, 0.87, "NDC") + pvalue = ROOT.TPaveText(0.78, 0.83, 0.90, 0.87, "NDC") pvalue.SetBorderSize(0) pvalue.SetFillStyle(0) pvalue.SetTextAlign(32) @@ -268,44 +313,8 @@ def DrawAxisHists(pads, axis_hists, def_pad=None): pvalue.Draw() arrow_not_in_range = (obs.GetX()[0] > toy_hist.GetBinLowEdge(args.bins + 1)) or (obs.GetX()[0] < toy_hist.GetBinLowEdge(0)) - - warningtext1 = ROOT.TPaveText(0.68, 0.78, 0.80, 0.82, "NDC") - warningtext1.SetBorderSize(0) - warningtext1.SetFillStyle(0) - warningtext1.SetTextAlign(32) - warningtext1.SetTextSize(0.04) - warningtext1.SetTextColor(2) - warningtext1.SetTextFont(62) - - if arrow_not_in_range and ((underflow_count != 0) or (overflow_count != 0)): - warningstrings = [] - if underflow_count != 0: - warningstrings.append("%d underflow" % underflow_count) - if overflow_count != 0: - warningstrings.append("%d overflow" % overflow_count) - warningtext1.AddText(", ".join(warningstrings)) - warningtext1.Draw() - - warningtext2 = ROOT.TPaveText(0.68, 0.73, 0.80, 0.77, "NDC") - warningtext2.SetBorderSize(0) - warningtext2.SetFillStyle(0) - warningtext2.SetTextAlign(32) - warningtext2.SetTextSize(0.04) - warningtext2.SetTextColor(2) - warningtext2.SetTextFont(62) - warningtext2.AddText("observed value not in range") - warningtext2.Draw() - else: - if (underflow_count != 0) or (overflow_count != 0): - warningstrings = [] - if underflow_count != 0: - warningstrings.append("%d underflow" % underflow_count) - if overflow_count != 0: - warningstrings.append("%d overflow" % overflow_count) - warningtext1.AddText(", ".join(warningstrings)) - elif arrow_not_in_range: - warningtext1.AddText("observed value not in range") - warningtext1.Draw() + warningtext = DrawWarning(arrow_not_in_range, underflow_count, overflow_count) + if warningtext: warningtext.Draw() canv.Print(".pdf") canv.Print(".png") From 4305ee0be0adda07782176ea2ef7ea836f049df6 Mon Sep 17 00:00:00 2001 From: Dennis Roy Date: Wed, 22 Apr 2026 13:55:02 +0200 Subject: [PATCH 2/6] Bugfixes for GoF --- src/GoodnessOfFit.cc | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/GoodnessOfFit.cc b/src/GoodnessOfFit.cc index 3aa9bde79e5..68a6ded3fe4 100644 --- a/src/GoodnessOfFit.cc +++ b/src/GoodnessOfFit.cc @@ -283,6 +283,7 @@ bool GoodnessOfFit::runKSandAD(RooWorkspace *w, RooStats::ModelConfig *mc_s, Roo for (int i = 0; i < datasetsList->GetSize(); ++i) { datasets.emplace_back(dynamic_cast(datasetsList->At(i))); } + datasetsList.reset(); #endif // Number of categories should always equal the number of datasets @@ -293,7 +294,7 @@ bool GoodnessOfFit::runKSandAD(RooWorkspace *w, RooStats::ModelConfig *mc_s, Roo for (unsigned i = 0; i < binNames_.size(); i++) { RooAbsData *cat_data = datasets[i].get(); - RooAbsPdf *cat_pdf = sim->getPdf(binNames_[i].c_str()); + RooAbsPdf *cat_pdf = sim->getPdf(cat_data->GetName()); std::unique_ptr observables(cat_pdf->getObservables(cat_data)); if (observables->getSize() > 1) { std::cout << "Warning, KS and AD statistics are not well defined for " @@ -402,9 +403,10 @@ Double_t GoodnessOfFit::EvaluateADDistance(RooAbsPdf& pdf, RooAbsData& data, Roo } }else{ bin_prob = current_cdf_val-last_cdf_val; - distance = s_data*pow((empirical_df-current_cdf_val), 2)/current_cdf_val/(1.-current_cdf_val)*bin_prob; - if (current_cdf_val >= 1.0) { + if (current_cdf_val >= 1.0 || current_cdf_val <= 0.0) { distance = 0.; + }else{ + distance = s_data*pow((empirical_df-current_cdf_val), 2)/current_cdf_val/(1.-current_cdf_val)*bin_prob; } if (verbose >= 3) { std::cout << "Observable: " << observableval << "\tdata: " << d->second << "\tedf: " << empirical_df << "\tcdf: " << current_cdf_val << "\tdistance: " << distance << "\n"; From 6bec4b14c0d3604b7d7e07fd6d3c6be34c9fde82 Mon Sep 17 00:00:00 2001 From: Dennis Roy Date: Wed, 22 Apr 2026 14:08:45 +0200 Subject: [PATCH 3/6] linting --- scripts/plotGof.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/scripts/plotGof.py b/scripts/plotGof.py index 1e3c06efbef..89838085b66 100755 --- a/scripts/plotGof.py +++ b/scripts/plotGof.py @@ -42,6 +42,7 @@ def DrawAxisHists(pads, axis_hists, def_pad=None): if def_pad is not None: def_pad.cd() + def DrawWarning(arrowrange, underflow, overflow): warningtext1 = ROOT.TPaveText(0.48, 0.73, 0.60, 0.77, "NDC") warningtext1.SetBorderSize(0) @@ -226,7 +227,8 @@ def DrawWarning(arrowrange, underflow, overflow): arrow_not_in_range = (obs.GetX()[0] > toy_hist.GetBinLowEdge(args.bins + 1)) or (obs.GetX()[0] < toy_hist.GetBinLowEdge(0)) warningtext = DrawWarning(arrow_not_in_range, underflow_count, overflow_count) - if warningtext: warningtext.Draw() + if warningtext: + warningtext.Draw() canv.Print(key + args.output + ".pdf") canv.Print(key + args.output + ".png") @@ -314,7 +316,8 @@ def DrawWarning(arrowrange, underflow, overflow): arrow_not_in_range = (obs.GetX()[0] > toy_hist.GetBinLowEdge(args.bins + 1)) or (obs.GetX()[0] < toy_hist.GetBinLowEdge(0)) warningtext = DrawWarning(arrow_not_in_range, underflow_count, overflow_count) - if warningtext: warningtext.Draw() + if warningtext: + warningtext.Draw() canv.Print(".pdf") canv.Print(".png") From 3c83a1ff5a84d5b577e619ec58a0a5cd37398fff Mon Sep 17 00:00:00 2001 From: Dennis Roy Date: Wed, 22 Apr 2026 15:29:38 +0200 Subject: [PATCH 4/6] Fixes in plotting text --- scripts/plotGof.py | 88 ++++++++++++++++++---------------------------- 1 file changed, 35 insertions(+), 53 deletions(-) diff --git a/scripts/plotGof.py b/scripts/plotGof.py index 89838085b66..aeae46d5797 100755 --- a/scripts/plotGof.py +++ b/scripts/plotGof.py @@ -43,8 +43,30 @@ def DrawAxisHists(pads, axis_hists, def_pad=None): def_pad.cd() -def DrawWarning(arrowrange, underflow, overflow): - warningtext1 = ROOT.TPaveText(0.48, 0.73, 0.60, 0.77, "NDC") +def DrawText(stat, ntoys, pval, arrowrange, underflow, overflow): + output = [] + + textlabel = ROOT.TPaveText(0.78, 0.88, 0.90, 0.92, "NDC") + textlabel.SetBorderSize(0) + textlabel.SetFillStyle(0) + textlabel.SetTextAlign(32) + textlabel.SetTextSize(0.04) + textlabel.SetTextColor(1) + textlabel.SetTextFont(62) + textlabel.AddText(stat + ", %s Toys" % ntoys) + output.append(textlabel) + + pvalue = ROOT.TPaveText(0.78, 0.83, 0.90, 0.87, "NDC") + pvalue.SetBorderSize(0) + pvalue.SetFillStyle(0) + pvalue.SetTextAlign(32) + pvalue.SetTextSize(0.04) + pvalue.SetTextColor(1) + pvalue.SetTextFont(62) + pvalue.AddText("p-value = %0.3f" % pval) + output.append(pvalue) + + warningtext1 = ROOT.TPaveText(0.48, 0.77, 0.60, 0.81, "NDC") warningtext1.SetBorderSize(0) warningtext1.SetFillStyle(0) warningtext1.SetTextAlign(22) @@ -59,9 +81,9 @@ def DrawWarning(arrowrange, underflow, overflow): if overflow != 0: warningstrings.append("%d overflow" % overflow) warningtext1.AddText(", ".join(warningstrings)) - warningtext1.Draw() + output.append(warningtext1) - warningtext2 = ROOT.TPaveText(0.48, 0.73, 0.60, 0.77, "NDC") + warningtext2 = ROOT.TPaveText(0.48, 0.72, 0.60, 0.76, "NDC") warningtext2.SetBorderSize(0) warningtext2.SetFillStyle(0) warningtext2.SetTextAlign(22) @@ -69,7 +91,7 @@ def DrawWarning(arrowrange, underflow, overflow): warningtext2.SetTextColor(2) warningtext2.SetTextFont(62) warningtext2.AddText(f"observed value not in range, at {obs.GetX()[0]:.2f}") - return warningtext2 + output.append(warningtext2) else: if (underflow != 0) or (overflow != 0): warningstrings = [] @@ -80,8 +102,8 @@ def DrawWarning(arrowrange, underflow, overflow): warningtext1.AddText(", ".join(warningstrings)) elif arrowrange: warningtext1.AddText(f"observed value not in range, at {obs.GetX()[0]:.2f}") - return warningtext1 - return None + output.append(warningtext1) + return output ## Boilerplate @@ -205,30 +227,10 @@ def DrawWarning(arrowrange, underflow, overflow): plot.DrawTitle(pads[0], args.title_right, 3) plot.DrawTitle(pads[0], title, 1) - textlabel = ROOT.TPaveText(0.78, 0.88, 0.90, 0.92, "NDC") - textlabel.SetBorderSize(0) - textlabel.SetFillStyle(0) - textlabel.SetTextAlign(32) - textlabel.SetTextSize(0.04) - textlabel.SetTextColor(1) - textlabel.SetTextFont(62) - textlabel.AddText(args.statistic + ", %s Toys" % (toy_graph.GetN())) - textlabel.Draw() - - pvalue = ROOT.TPaveText(0.78, 0.83, 0.90, 0.87, "NDC") - pvalue.SetBorderSize(0) - pvalue.SetFillStyle(0) - pvalue.SetTextAlign(32) - pvalue.SetTextSize(0.04) - pvalue.SetTextColor(1) - pvalue.SetTextFont(62) - pvalue.AddText("p-value = %0.3f" % pValue) - pvalue.Draw() - arrow_not_in_range = (obs.GetX()[0] > toy_hist.GetBinLowEdge(args.bins + 1)) or (obs.GetX()[0] < toy_hist.GetBinLowEdge(0)) - warningtext = DrawWarning(arrow_not_in_range, underflow_count, overflow_count) - if warningtext: - warningtext.Draw() + texts = DrawText(args.statistic, toy_graph.GetN(), pValue, arrow_not_in_range, underflow_count, overflow_count) + for text in texts: + text.Draw() canv.Print(key + args.output + ".pdf") canv.Print(key + args.output + ".png") @@ -294,30 +296,10 @@ def DrawWarning(arrowrange, underflow, overflow): plot.DrawTitle(pads[0], args.title_right, 3) plot.DrawTitle(pads[0], args.title_left, 1) - textlabel = ROOT.TPaveText(0.78, 0.88, 0.90, 0.92, "NDC") - textlabel.SetBorderSize(0) - textlabel.SetFillStyle(0) - textlabel.SetTextAlign(32) - textlabel.SetTextSize(0.04) - textlabel.SetTextColor(1) - textlabel.SetTextFont(62) - textlabel.AddText(args.statistic + ", %s Toys" % (toy_graph.GetN())) - textlabel.Draw() - - pvalue = ROOT.TPaveText(0.78, 0.83, 0.90, 0.87, "NDC") - pvalue.SetBorderSize(0) - pvalue.SetFillStyle(0) - pvalue.SetTextAlign(32) - pvalue.SetTextSize(0.04) - pvalue.SetTextColor(1) - pvalue.SetTextFont(62) - pvalue.AddText("p-value = %0.3f" % pValue) - pvalue.Draw() - arrow_not_in_range = (obs.GetX()[0] > toy_hist.GetBinLowEdge(args.bins + 1)) or (obs.GetX()[0] < toy_hist.GetBinLowEdge(0)) - warningtext = DrawWarning(arrow_not_in_range, underflow_count, overflow_count) - if warningtext: - warningtext.Draw() + texts = DrawText(args.statistic, toy_graph.GetN(), pValue, arrow_not_in_range, underflow_count, overflow_count) + for text in texts: + text.Draw() canv.Print(".pdf") canv.Print(".png") From c5565e25682a4b7b2b735a2e7c9dce87e4cd73ca Mon Sep 17 00:00:00 2001 From: Dennis Roy Date: Wed, 29 Apr 2026 10:44:03 +0200 Subject: [PATCH 5/6] Small formatting changes --- scripts/plotGof.py | 4 ++-- src/GoodnessOfFit.cc | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/scripts/plotGof.py b/scripts/plotGof.py index aeae46d5797..699b05ffb01 100755 --- a/scripts/plotGof.py +++ b/scripts/plotGof.py @@ -205,7 +205,7 @@ def DrawText(stat, ntoys, pval, arrowrange, underflow, overflow): pads[0].GetFrame().Draw() toy_hist.GetYaxis().SetTitle(args.y_title) toy_hist.GetXaxis().SetTitle(args.x_title) - toy_hist.GetXaxis().SetLabelOffset(toy_hist.GetXaxis().GetLabelOffset()*2) + toy_hist.GetXaxis().SetLabelOffset(toy_hist.GetXaxis().GetLabelOffset() * 2) y_min, y_max = (plot.GetPadYMin(pads[0]), plot.GetPadYMax(pads[0])) plot.FixBothRanges(pads[0], 0, 0, y_max, 0.25) @@ -274,7 +274,7 @@ def DrawText(stat, ntoys, pval, arrowrange, underflow, overflow): pads[0].GetFrame().Draw() toy_hist.GetYaxis().SetTitle(args.y_title) toy_hist.GetXaxis().SetTitle(args.x_title) - toy_hist.GetXaxis().SetLabelOffset(toy_hist.GetXaxis().GetLabelOffset()*2) + toy_hist.GetXaxis().SetLabelOffset(toy_hist.GetXaxis().GetLabelOffset() * 2) y_min, y_max = (plot.GetPadYMin(pads[0]), plot.GetPadYMax(pads[0])) plot.FixBothRanges(pads[0], 0, 0, y_max, 0.25) diff --git a/src/GoodnessOfFit.cc b/src/GoodnessOfFit.cc index 68a6ded3fe4..46fce6658e4 100644 --- a/src/GoodnessOfFit.cc +++ b/src/GoodnessOfFit.cc @@ -405,8 +405,9 @@ Double_t GoodnessOfFit::EvaluateADDistance(RooAbsPdf& pdf, RooAbsData& data, Roo bin_prob = current_cdf_val-last_cdf_val; if (current_cdf_val >= 1.0 || current_cdf_val <= 0.0) { distance = 0.; - }else{ - distance = s_data*pow((empirical_df-current_cdf_val), 2)/current_cdf_val/(1.-current_cdf_val)*bin_prob; + } else { + distance = s_data * pow((empirical_df - current_cdf_val), 2) / current_cdf_val / (1. - current_cdf_val) * + bin_prob; } if (verbose >= 3) { std::cout << "Observable: " << observableval << "\tdata: " << d->second << "\tedf: " << empirical_df << "\tcdf: " << current_cdf_val << "\tdistance: " << distance << "\n"; From cda4221eb5f4aa085d3588ed93994ebcff5e008c Mon Sep 17 00:00:00 2001 From: Dennis Roy Date: Wed, 29 Apr 2026 11:41:52 +0200 Subject: [PATCH 6/6] Fix for warning messages --- scripts/plotGof.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/scripts/plotGof.py b/scripts/plotGof.py index 699b05ffb01..40543a1dbe5 100755 --- a/scripts/plotGof.py +++ b/scripts/plotGof.py @@ -43,7 +43,7 @@ def DrawAxisHists(pads, axis_hists, def_pad=None): def_pad.cd() -def DrawText(stat, ntoys, pval, arrowrange, underflow, overflow): +def DrawText(stat, ntoys, pval, arrowrange, underflow, overflow, obs): output = [] textlabel = ROOT.TPaveText(0.78, 0.88, 0.90, 0.92, "NDC") @@ -90,7 +90,7 @@ def DrawText(stat, ntoys, pval, arrowrange, underflow, overflow): warningtext2.SetTextSize(0.04) warningtext2.SetTextColor(2) warningtext2.SetTextFont(62) - warningtext2.AddText(f"observed value not in range, at {obs.GetX()[0]:.2f}") + warningtext2.AddText(f"observed value not in range, at {obs:.2f}") output.append(warningtext2) else: if (underflow != 0) or (overflow != 0): @@ -101,7 +101,7 @@ def DrawText(stat, ntoys, pval, arrowrange, underflow, overflow): warningstrings.append("%d overflow" % overflow) warningtext1.AddText(", ".join(warningstrings)) elif arrowrange: - warningtext1.AddText(f"observed value not in range, at {obs.GetX()[0]:.2f}") + warningtext1.AddText(f"observed value not in range, at {obs:.2f}") output.append(warningtext1) return output @@ -227,8 +227,8 @@ def DrawText(stat, ntoys, pval, arrowrange, underflow, overflow): plot.DrawTitle(pads[0], args.title_right, 3) plot.DrawTitle(pads[0], title, 1) - arrow_not_in_range = (obs.GetX()[0] > toy_hist.GetBinLowEdge(args.bins + 1)) or (obs.GetX()[0] < toy_hist.GetBinLowEdge(0)) - texts = DrawText(args.statistic, toy_graph.GetN(), pValue, arrow_not_in_range, underflow_count, overflow_count) + arrow_not_in_range = (obs.GetX()[0] > toy_hist.GetBinLowEdge(args.bins + 1)) or (obs.GetX()[0] < toy_hist.GetBinLowEdge(1)) + texts = DrawText(args.statistic, toy_graph.GetN(), pValue, arrow_not_in_range, underflow_count, overflow_count, obs.GetX()[0]) for text in texts: text.Draw() @@ -296,8 +296,8 @@ def DrawText(stat, ntoys, pval, arrowrange, underflow, overflow): plot.DrawTitle(pads[0], args.title_right, 3) plot.DrawTitle(pads[0], args.title_left, 1) - arrow_not_in_range = (obs.GetX()[0] > toy_hist.GetBinLowEdge(args.bins + 1)) or (obs.GetX()[0] < toy_hist.GetBinLowEdge(0)) - texts = DrawText(args.statistic, toy_graph.GetN(), pValue, arrow_not_in_range, underflow_count, overflow_count) + arrow_not_in_range = (obs.GetX()[0] > toy_hist.GetBinLowEdge(args.bins + 1)) or (obs.GetX()[0] < toy_hist.GetBinLowEdge(1)) + texts = DrawText(args.statistic, toy_graph.GetN(), pValue, arrow_not_in_range, underflow_count, overflow_count, obs.GetX()[0]) for text in texts: text.Draw()