Skip to content
Snippets Groups Projects

Allow several 1-sigma bars in the best fit graph

Closed Florian Bury requested to merge fbury/inference:exclusion_bestfit_intervals into master
1 file
+ 50
11
Compare changes
  • Side-by-side
  • Inline
+ 50
11
@@ -179,9 +179,10 @@ def plot_exclusion_and_bestfit_1d(
# perform scans to extract best fit values
scans = []
n_intervals = 1
for d in data:
if not d or d.get("nll_values") is None:
scans.append(None)
scans.append([None])
continue
# preprocess values
@@ -190,18 +191,40 @@ def plot_exclusion_and_bestfit_1d(
(poi, d["nll_values"][scan_parameter]), shift_negative_values=True, remove_nans=True,
min_is_external=poi_min is not None, origin="entry '{}'".format(d["name"]))
# check for disjoint intervals
dnll2_below_1sigma = np.where(dnll2_values < 1)[0]
dnll2_below_1sigma_intervals = np.split(dnll2_below_1sigma, np.where(np.diff(dnll2_below_1sigma) != 1)[0]+1)
# evaluate the scan
scans.append(evaluate_likelihood_scan_1d(poi_values, dnll2_values, poi_min=poi_min,
origin="entry '{}'".format(d["name"])))
if len(dnll2_below_1sigma_intervals) <= 1:
scans.append([evaluate_likelihood_scan_1d(poi_values, dnll2_values, poi_min=poi_min,
origin="entry '{}'".format(d["name"]))])
else:
print '{} disjoint intervals of dnll2 values below 1 sigma'.format(len(dnll2_below_1sigma_intervals))
# perform scans
scan_intervals = []
for i in range(len(dnll2_below_1sigma_intervals)):
dnll2_values_tmp = dnll2_values.copy()
# exclude points of other intervals
for j in range(len(dnll2_below_1sigma_intervals)):
if i != j:
dnll2_values_tmp[dnll2_below_1sigma_intervals[j]] = 1.1
scan_intervals.append(evaluate_likelihood_scan_1d(poi_values, dnll2_values_tmp, poi_min=None,origin="entry '{}' (interval {})".format(d["name"],i)))
# Order them by minimum of dnll2
order_dnll2 = np.argsort([dnll2_values[idx].min() for idx in dnll2_below_1sigma_intervals])
scans.append([scan_intervals[i] for i in order_dnll2])
n_intervals = max(n_intervals,len(scan_intervals))
# draw best fit values
if any(scans):
f = int(show_best_fit_error)
g_bestfit = create_tgraph(n,
[(scan.num_min() if scan else -1e5) for scan in scans],
[(scan[0].num_min() if scan[0] else -1e5) for scan in scans],
[n - i - 0.5 for i in range(n)],
[(f * scan.num_min.u(direction="down", default=0.) if scan else 0) for scan in scans],
[(f * scan.num_min.u(direction="up", default=0.,) if scan else 0) for scan in scans],
[(f * scan[0].num_min.u(direction="down", default=0.) if scan[0] else 0) for scan in scans],
[(f * scan[0].num_min.u(direction="up", default=0.,) if scan[0] else 0) for scan in scans],
0,
0,
)
@@ -210,6 +233,22 @@ def plot_exclusion_and_bestfit_1d(
draw_objs.append((g_bestfit, "PZ" + opt("E")))
legend_entries.append((g_bestfit, "Best fit value", "P" + opt("L")))
# add potential additional intervals
if n_intervals > 1:
for idx in range(1,n_intervals):
g_interval = create_tgraph(n,
[(scan[idx].num_min() if len(scan)>idx else -1e5) for scan in scans],
[n - i - 0.5 for i in range(n)],
[(f * scan[idx].num_min.u(direction="down", default=0.) if len(scan)>idx else 0) for scan in scans],
[(f * scan[idx].num_min.u(direction="up", default=0.,) if len(scan)>idx else 0) for scan in scans],
0,
0,
)
r.setup_graph(g_interval, props={"MarkerSize": 0., "LineWidth": 1})
draw_objs.append((g_interval, "PZ" + opt("E")))
# theory prediction
if x_min < 1:
sm_value = poi_data[scan_parameter].sm_value
@@ -233,14 +272,14 @@ def plot_exclusion_and_bestfit_1d(
for i, (d, scan) in enumerate(zip(data, scans)):
# name labels
label = to_root_latex(br_hh_names.get(d["name"], d["name"]))
if scan:
if scan[0]:
if summary :
label_summary = to_root_latex(hh_references.get(d["name"], d["name"]))
label = label_tmpl_summary % (label, scan_label, scan.num_min.str("%.2f", style="root",
force_asymmetric=True, styles={"space": ""}), label_summary)
label = label_tmpl_summary % (label, scan_label, ' / '.join([s.num_min.str("%.2f", style="root",
force_asymmetric=True, styles={"space": ""}) for s in scan]), label_summary)
else :
label = label_tmpl_scan % (label, scan_label, scan.num_min.str("%.2f", style="root",
force_asymmetric=True, styles={"space": ""}))
label = label_tmpl_scan % (label, scan_label, ' / '.join([s.num_min.str("%.2f", style="root",
force_asymmetric=True, styles={"space": ""}) for s in scan]))
else:
label = label_tmpl % (label,)
Loading