9"""Implements wirgain correction"""
13import matplotlib.pyplot
as plt
15from ROOT.Belle2
import CDCDedxValidationAlgorithm
16import process_cosgain
as cg
17from matplotlib.backends.backend_pdf
import PdfPages
18ROOT.gROOT.SetBatch(
True)
23 il = df.loc[(df.index < 1280) & (df[
'wiregain'] != 0)].copy()
26 ol = df.loc[(df.index >= 1280) & (df[
'wiregain'] != 0)].copy()
32 il = df[df.index < 8].copy()
33 ol = df[df.index >= 8].copy()
37def fetch_wiregain_pair(cal, exp, run, database_file, gt):
39 Fetch previous and new wiregain payloads once for a given exp/run.
46 prev_data = cal.getwiregain(exp, run)
51 cal.setTestingPayload(database_file)
52 new_data = cal.getwiregain(exp, run)
54 cal.setTestingPayload(
"")
56 return prev_data, new_data
59def process_wiregain_pair(prev_data, new_data, exp, run):
60 """Process wiregain for a given exp-run pair."""
63 prev_wg = prev_data.wiregain
if prev_data
else []
64 new_wg = new_data.wiregain
if new_data
else []
67 if not prev_wg
or not new_wg:
68 print(f
"[WARNING] Empty wiregain data for exp={exp}, run={run}. Skipping.")
69 return None,
None,
None,
None
72 df_prev = pd.DataFrame([[x]
for x
in prev_wg], columns=[
'wiregain'])
73 df_new = pd.DataFrame([[x]
for x
in new_wg], columns=[
'wiregain'])
76 il_prev, ol_prev = remove_nowg(df_prev)
77 il_new, ol_new = remove_nowg(df_new)
79 return il_prev, ol_prev, il_new, ol_new
82def process_layermean(prev_data, new_data, exp, run):
85 if prev_data
is None or new_data
is None:
86 print(f
"[WARNING] Missing layermean data for exp={exp}, run={run}. Skipping.")
87 return pd.Series(dtype=float), pd.Series(dtype=float)
89 prev_layermean = list(prev_data.layermean)
if hasattr(prev_data,
"layermean")
else []
90 new_layermean = list(new_data.layermean)
if hasattr(new_data,
"layermean")
else []
92 if len(prev_layermean) == 0
or len(new_layermean) == 0:
93 print(f
"[WARNING] Empty layermean data for exp={exp}, run={run}. Skipping.")
94 return pd.Series(dtype=float), pd.Series(dtype=float)
96 df_prev_lm = pd.DataFrame(prev_layermean, columns=[
"layergain"])
97 df_new_lm = pd.DataFrame(new_layermean, columns=[
"layergain"])
98 il_lm_prev, ol_lm_prev = sep_inout(df_prev_lm)
99 il_lm_new, ol_lm_new = sep_inout(df_new_lm)
101 return il_lm_prev, ol_lm_prev, il_lm_new, ol_lm_new
104def plot_wiregain_all(il_prev, ol_prev, il_new, ol_new, exp, run, pdf):
105 """Plot overlay, ratio and difference into a single PDF page."""
107 fig, ax = plt.subplots(2, 2, figsize=(20, 12))
111 (ax[0, 0], il_prev,
"wiregain",
"Inner previous Wiregain",
"o",
"Inner (prev)", 0., 4, 100),
112 (ax[0, 1], ol_prev,
"wiregain",
"Outer previous Wiregain",
"^",
"Outer (prev)", 0., 3, 1000),
113 (ax[1, 0], il_new,
"wiregain",
"Inner new Wiregain",
"s",
"Inner (new)", 0., 4, 100),
114 (ax[1, 1], ol_new,
"wiregain",
"Outer new Wiregain",
"D",
"Outer (new)", 0., 3, 1000),
117 for axi, df, col, title, marker, label, ymin, ymax, space
in raw_panels:
119 cg.hist(ymin, ymax, xlabel=
"#wire", ylabel=
"wg constant", space=space, ax=axi)
120 axi.plot(df[col], marker, label=label, markersize=5, alpha=0.7)
121 axi.legend(fontsize=12)
123 fig.suptitle(f
"WireGain Calibration - Experiment {exp}, Run {run}", fontsize=20)
128 fig, ax = plt.subplots(2, 2, figsize=(20, 12))
131 il_r = (il_new[
"wiregain"] / il_prev[
"wiregain"]).dropna()
132 ol_r = (ol_new[
"wiregain"] / ol_prev[
"wiregain"]).dropna()
135 (ax[0, 0], il_r,
"Inner Wiregain Ratio", 0.7, 1.5, 100,
"Inner Layer"),
136 (ax[0, 1], ol_r,
"Outer Wiregain Ratio", 0.7, 1.5, 1000,
"Outer Layer"),
137 (ax[1, 0], il_r,
"Inner Wiregain Ratio (zoom)", 0.92, 1.05, 100,
"Inner Layer"),
138 (ax[1, 1], ol_r,
"Outer Wiregain Ratio (zoom)", 0.92, 1.05, 1000,
"Outer Layer"),
141 for axi, series, title, ymin, ymax, space, label
in ratio_panels:
143 cg.hist(ymin, ymax, xlabel=
"#wire", ylabel=
"wiregain ratio", space=space, ax=axi)
144 axi.plot(series,
"*", rasterized=
True, label=label)
145 axi.legend(fontsize=12)
151 fig, ax = plt.subplots(1, 2, figsize=(20, 6))
155 ax[0].set_title(
"Wiregain Ratio histo")
156 cg.hist(x_min=0.7, x_max=1.5, xlabel=
r"$\Delta$ wiregains", ylabel=
"Normalized count", fs1=10, fs2=6, ax=ax[0])
158 scale1 = 1 / il_r.shape[0]
if il_r.shape[0] > 0
else 1
159 scale2 = 1 / ol_r.shape[0]
if ol_r.shape[0] > 0
else 1
161 ax[0].hist(il_r, bins=200, weights=np.ones_like(il_r) * scale1, histtype=
'stepfilled', alpha=0.5, label=
'Inner layer')
163 ax[0].hist(ol_r, bins=200, weights=np.ones_like(ol_r) * scale2, histtype=
'stepfilled', alpha=0.5, label=
'Outer Layer')
165 ax[0].legend(fontsize=12)
172def plot_layergain(il_lm_prev, ol_lm_prev, il_lm_new, ol_lm_new, exp, run, pdf):
173 """Compact combined plot with color separation."""
175 fig, ax = plt.subplots(1, 2, figsize=(20, 6))
178 (
"Inner prev", il_lm_prev,
"blue",
"o"),
179 (
"Inner new", il_lm_new,
"cyan",
"o"),
180 (
"Outer prev", ol_lm_prev,
"red",
"s"),
181 (
"Outer new", ol_lm_new,
"orange",
"s"),
185 cg.hist(0.5, 1.9, xlabel=
"#layer", ylabel=
"layer gain", fs1=10, fs2=6, space=2, ax=ax[0])
186 ax[0].set_title(
"Layer Mean")
188 for label, df, color, marker
in data:
189 ax[0].
plot(df[
"layergain"], marker, color=color, label=f
"{label}")
191 ax[0].legend(fontsize=10)
194 cg.hist(0.9, 1.1, xlabel=
"#layer", ylabel=
"ratio", fs1=10, fs2=6, space=2, ax=ax[1])
195 ax[1].set_title(
"Layer Ratio")
198 (
"Inner", il_lm_new, il_lm_prev,
"blue",
"o"),
199 (
"Outer", ol_lm_new, ol_lm_prev,
"red",
"s"),
201 for label, prev_df, new_df, color, marker
in ratios:
202 ratio = (new_df[
"layergain"] / prev_df[
"layergain"]).dropna()
203 ax[1].
plot(ratio, marker, color=color, label=f
"{label}")
205 ax[1].legend(fontsize=10)
207 fig.suptitle(f
"Exp {exp}, Run {run}", fontsize=16)
215 """Main function to process wiregain data and generate plots."""
217 os.makedirs(
'plots/constant', exist_ok=
True)
218 database_file = f
'{wgpath}/database.txt'
220 exp_run_dict = cg.parse_database(database_file,
"dbstore/CDCDedxWireGain")
222 for exp, run_list
in exp_run_dict.items():
224 print(f
"[INFO] Processing exp={exp}, run={run}")
225 cal = CDCDedxValidationAlgorithm()
227 prev_data, new_data = fetch_wiregain_pair(cal, exp, run, database_file, gt)
228 except Exception
as e:
229 print(f
"[ERROR] Failed to fetch wiregain for exp={exp}, run={run}: {e}")
232 il_prev, ol_prev, il_new, ol_new = process_wiregain_pair(prev_data, new_data, exp, run)
234 if il_prev
is None or ol_prev
is None or il_new
is None or ol_new
is None:
237 il_lm_prev, ol_lm_prev, il_lm_new, ol_lm_new = process_layermean(prev_data, new_data, exp, run)
239 pdf_path = f
'plots/constant/wiregain_e{exp}_r{run}.pdf'
240 with PdfPages(pdf_path)
as pdf:
241 plot_wiregain_all(il_prev, ol_prev, il_new, ol_new, exp, run, pdf)
242 plot_layergain(il_lm_prev, ol_lm_prev, il_lm_new, ol_lm_new, exp, run, pdf)