diff --git a/rdstar/studies/low_level_cut_study/utilities/plotting.py b/rdstar/studies/low_level_cut_study/utilities/plotting.py index 9de0860c3235d5e6446082cfdafcb7b8c4704c00..dce5a97fdd685d79dc5eafa1116a638a18c831a3 100644 --- a/rdstar/studies/low_level_cut_study/utilities/plotting.py +++ b/rdstar/studies/low_level_cut_study/utilities/plotting.py @@ -8,6 +8,7 @@ import matplotlib.pyplot as plt from typing import List, Tuple, Dict import pandas as pd import copy +import numpy as np import os from templatefitter.plotter.plot_style import set_matplotlibrc_params, KITColors @@ -88,28 +89,48 @@ class LowLevelCutPlotter: else: cuts = [new_cut_info.cut_limits] for cut in cuts: - ax.axvline(cut, color=KITColors.kit_red) + ax.axvline(cut, color=KITColors.kit_red, lw=3.) df_bkg = df.query("isSignal == 0") bkg_data = df_bkg[cut_var].abs() if new_cut_info.cut_abs else df_bkg[cut_var] df_sig = df.query("isSignal == 1") sig_data = df_sig[cut_var].abs() if new_cut_info.cut_abs else df_sig[cut_var] + + var_range = (min(bkg_data.min(), sig_data.min()), max(bkg_data.max(), sig_data.max())) + + sig_counts, sig_bins = np.histogram(sig_data, bins=50, range=var_range) + bkg_counts, bkg_bins = np.histogram(bkg_data, bins=50, range=var_range) + factor = sig_counts.max() / ((sig_counts + bkg_counts).max()) / 0.5 + ax.hist( [bkg_data, sig_data], bins=50, + range=var_range, histtype="stepfilled", stacked=True, lw=1., - color=[KITColors.kit_yellow, KITColors.kit_cyan], + color=[KITColors.kit_cyan, KITColors.kit_orange], label=["Background", "Signal"], edgecolor=KITColors.kit_black ) + ax.hist( + sig_bins[:-1], + sig_bins, + weights=sig_counts / factor, + range=var_range, + histtype="stepfilled", + lw=1., + color=KITColors.kit_black, + alpha=0.5, + edgecolor=KITColors.kit_black, + label=f"Signal Shape\nScaled with x{round(1 / factor, 2)}" + ) plt.grid(False) plt.xlabel(cut_info.cut_label) plt.ylabel("Entries") plt.title(combined_channel_dict[channel], loc="right") - plt.legend(loc="best") + plt.legend(loc=1, frameon=True, fancybox=True) save_path = os.path.join(self.target_path, f"{key}_{new_cut_info.cut_name}_evaluation.pdf") output.update({f"{key}_{new_cut_info.cut_name}_evaluation": save_path})