Skip to content
Snippets Groups Projects

Add changes from !69.

Merged Marcel Rieger requested to merge feature/multilpe_exclusion_scans into master
Files
2
+ 84
11
@@ -218,9 +218,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([])
continue
# preprocess values
@@ -234,23 +235,68 @@ def plot_exclusion_and_bestfit_1d(
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:
warn("{} 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 else -1e5 for scan in scans],
[n - i - 0.5 for i in range(n)],
[(f * scan.num_min.u(direction="down", default=0.0) if scan else 0) for scan in scans],
[(f * scan.num_min.u(direction="up", default=0.0) if scan else 0) for scan in scans],
[
f * scan[0].num_min.u(direction="down", default=0.0)
if scan
else 0.0
for scan in scans
],
[
f * scan[0].num_min.u(direction="up", default=0.0)
if scan
else 0.0
for scan in scans
],
0,
0,
)
@@ -259,6 +305,30 @@ 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.0)
if len(scan) > idx
else 0.0
for scan in scans
],
[
f * scan[idx].num_min.u(direction="up", default=0.0)
if len(scan) > idx else 0.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
@@ -287,7 +357,10 @@ def plot_exclusion_and_bestfit_1d(
args = (
label,
scan_label,
scan.num_min.str("%.2f", style="root", force_asymmetric=True, styles={"space": ""}),
" / ".join(
s.num_min.str("%.2f", style="root", force_asymmetric=True, styles={"space": ""})
for s in scan
),
)
if style.matches("summary") and d["name"] in hh_references:
tmpl = label_tmpl_summary
Loading