1 import matplotlib
as mpl
3 import matplotlib.pyplot
as plt
15 from concurrent.futures
import ThreadPoolExecutor
17 plt.style.use(hep.style.ATLAS)
19 plt.rcParams.update({
'font.sans-serif':
"Arial",
20 'font.family':
"sans-serif",
22 'mathtext.fontset':
'custom',
23 'mathtext.rm':
'Arial',
26 import EICAnalysisTools
as eat
30 parser = argparse.ArgumentParser()
32 parser.add_argument(
"-n",
"--input", type=str,
33 help=
"Directory containing input files")
34 parser.add_argument(
"-x",
"--xvar", type=str, default=
'pt',
35 help=
"pt, eta, bjorken_x")
37 args = parser.parse_args()
41 branchlist=[
"Jet.PT",
"Jet.Eta",
"Jet.Flavor",
"Jet.BTag",
"Particle.Px",
"Particle.Py",
"Particle.Pz",
"Particle.E"]
43 print(
"Loading data...")
45 df = eat.UprootLoad([f
"../{args.input}/*/out.root"],
"Delphes", branches=branchlist)
50 print(f
"n_gen = {n_gen}")
54 if args.xvar ==
'bjorken_x':
55 aux_data[
'bjorken_x'] = eat.DISBjorkenX
57 for aux_var
in aux_data:
58 print(f
"Appending auxiliary data {aux_var}")
59 df[aux_var] = df.apply(aux_data[aux_var], axis=1)
61 var_array = np.concatenate(df[aux_var].to_numpy()).ravel()
63 print(f
"Min. and max. {aux_var}: ", np.min(var_array),
" - ", np.max(var_array))
67 xvar=draw_config[
'xvar']
68 xrange=draw_config[
'xrange']
69 xbins=draw_config[
'xbins']
70 ylimits=draw_config[
'ylimits']
71 xlimits=draw_config[
'xlimits']
72 yunits=draw_config[
'yunits']
73 xunits=draw_config[
'xunits']
76 fig, ax = plt.subplots(figsize=(12,8))
80 gridspec = fig.add_gridspec(ncols=1, nrows=1, width_ratios=[1], height_ratios=[1])
84 ax1 = fig.add_subplot(gridspec[0, 0])
86 ax1.grid(which=
'both', axis=
'both')
88 (bins, bin_widths, eff, eff_error) = eat.DifferentialTaggingEfficiency(df, x=xvar, xrange=xrange, xbins=xbins, which=
'light')
89 ax1.errorbar(bins, eff, xerr = bin_widths/2, yerr=eff_error, label=
'light jets (CT18NNLO)', marker=
'o', ms=10, ls=
'none', linewidth=2, color=
'red')
92 (bins, bin_widths, eff, eff_error) = eat.DifferentialTaggingEfficiency(df, x=xvar, xrange=xrange, xbins=xbins, which=
'charm')
93 ax1.errorbar(bins, eff, xerr = bin_widths/2, yerr=eff_error, label=
'charm jets (CT18NNLO)', marker=
'D', ms=10, ls=
'none', linewidth=2, color=
'blue')
98 if xvar.find(
'Eta') != -1:
101 plt.ylabel(f
'$\\varepsilon_{{tag}}$ {yunits}')
102 plt.xlabel(f
'Reconstructed Jet ${xvar_symbol}$ {xunits}')
104 beamconfig =
"10x100"
106 plt.title(f
"CC-DIS, {beamconfig}GeV, $Q^2>100\\mathrm{{GeV^2}}$", fontsize=20)
108 ax1.set_ylim(ylimits)
109 ax1.set_xlim(xlimits)
111 if xvar ==
'bjorken_x':
112 plt.xlabel(f
'Bjorken x')
114 plt.xlabel(f
'Reconstructed Jet ${xvar_symbol}$ {xunits}')
116 if xvar ==
'bjorken_x':
119 ax1.legend(fontsize=18)
125 plt.savefig(f
"jet_differential_tagefficiency_{xvar}_{args.input}.png")
126 plt.savefig(f
"jet_differential_tagefficiency_{xvar}_{args.input}.pdf")
130 xvar=draw_config[
'xvar']
131 xrange=draw_config[
'xrange']
132 xbins=draw_config[
'xbins']
133 ylimits=draw_config[
'ylimits']
134 xlimits=draw_config[
'xlimits']
135 yunits=draw_config[
'yunits']
136 xunits=draw_config[
'xunits']
138 fig, ax = plt.subplots(figsize=(12,8))
142 gridspec = fig.add_gridspec(ncols=1, nrows=1, width_ratios=[1], height_ratios=[1])
146 ax1 = fig.add_subplot(gridspec[0, 0])
148 ax1.grid(which=
'both', axis=
'both')
150 (bins, bin_widths, xs, xs_error) = eat.DifferentialTaggingYield(df, x=xvar, xrange=xrange, xbins=xbins, which=
'light', process=process, target_lumi=100)
151 ax1.errorbar(bins, xs, xerr = bin_widths/2, yerr=xs_error, label=
'light jets (CT18NNLO)', marker=
'o', ms=10, ls=
'none', linewidth=2, color=
'red')
154 charm_ct18nnlo = eat.DifferentialTaggingYield(df, x=xvar, xrange=xrange, xbins=xbins, which=
'charm', process=process, target_lumi=100)
155 (bins, bin_widths, xs, xs_error) = charm_ct18nnlo
156 ax1.errorbar(bins, xs, xerr = bin_widths/2, yerr=xs_error, label=
'charm jets (CT18NNLO)', marker=
'D', ms=10, ls=
'none', linewidth=2, fillstyle=
'none', color=
'blue')
161 if xvar.find(
'Eta') != -1:
164 plt.ylabel(f
'$\\varepsilon_{{tag}} \\times \\sigma_{{\\mathrm{{CC-DIS}}}} \\times 100\\mathrm{{fb^{{-1}}}}$')
165 plt.xlabel(f
'Reconstructed Jet ${xvar_symbol}$ {xunits}')
168 beamconfig =
"10x100"
169 process_name =
'CC-DIS'
171 if process.find(
'NC') != -1:
172 process_name =
'NC-DIS'
173 plt.title(f
"{process_name}, {beamconfig}GeV, $Q^2>100\\mathrm{{GeV^2}}$", fontsize=20)
175 ax1.set_ylim(ylimits)
176 ax1.set_xlim(xlimits)
178 if xvar ==
'bjorken_x':
179 plt.xlabel(f
'Bjorken x')
181 plt.xlabel(f
'Reconstructed Jet ${xvar_symbol}$ {xunits}')
183 if xvar ==
'bjorken_x':
186 ax1.legend(fontsize=18)
191 plt.savefig(f
"jet_differential_tagyield_{xvar}_{args.input}.png")
192 plt.savefig(f
"jet_differential_tagyield_{xvar}_{args.input}.pdf")
198 if args.xvar ==
'eta':
199 draw_config[
'xvar'] =
'Jet.Eta'
200 draw_config[
'xrange'] = [-4.0, 4.0]
201 draw_config[
'xbins'] = [-4.0, -3.5, -2.5, -1.0, 1.0, 2.5, 3.5, 4.0]
202 draw_config[
'ylimits'] = [1e-5, 1]
203 draw_config[
'xlimits'] = [-5,5]
204 draw_config[
'yunits'] =
''
205 draw_config[
'xunits'] =
''
206 elif args.xvar ==
'pt':
207 draw_config[
'xvar'] =
'Jet.PT'
208 draw_config[
'xrange'] = [10,50]
209 draw_config[
'xbins'] = [10,12.5,15,20,25,30,40,50]
210 draw_config[
'ylimits'] = [1e-5, 1]
211 draw_config[
'xlimits'] = [0,60]
212 draw_config[
'yunits'] =
'[$\\mathrm{GeV^{-1}}$]'
213 draw_config[
'xunits'] =
'[GeV]'
214 elif args.xvar ==
'bjorken_x':
215 draw_config[
'xvar'] =
'bjorken_x'
216 draw_config[
'xrange'] = [5e-3,1]
217 draw_config[
'xbins'] = np.concatenate([np.arange(5e-3,1e-2,1e-3),np.arange(1e-2,1e-1,1e-2),np.arange(1e-1,1.1,1e-1)])
219 draw_config[
'ylimits'] = [1e-5, 1]
220 draw_config[
'xlimits'] = [5e-3,1]
221 draw_config[
'yunits'] =
''
222 draw_config[
'xunits'] =
''
229 if args.xvar ==
'eta':
230 draw_config[
'xvar'] =
'Jet.Eta'
231 draw_config[
'xrange'] = [-4.0, 4.0]
232 draw_config[
'xbins'] = [-4.0, -3.5, -2.5, -1.0, 1.0, 2.5, 3.5, 4.0]
233 draw_config[
'ylimits'] = [1, 1e3]
234 draw_config[
'xlimits'] = [-5,5]
235 draw_config[
'yunits'] =
''
236 draw_config[
'xunits'] =
''
237 elif args.xvar ==
'pt':
238 draw_config[
'xvar'] =
'Jet.PT'
239 draw_config[
'xrange'] = [10,50]
240 draw_config[
'xbins'] = [10,12.5,15,20,25,30,40,50]
241 draw_config[
'ylimits'] = [1, 1e3]
242 draw_config[
'xlimits'] = [0,60]
243 draw_config[
'yunits'] =
'[$\\mathrm{GeV^{-1}}$]'
244 draw_config[
'xunits'] =
'[GeV]'
245 elif args.xvar ==
'bjorken_x':
246 draw_config[
'xvar'] =
'bjorken_x'
247 draw_config[
'xrange'] = [5e-3,1]
248 draw_config[
'xbins'] = np.concatenate([np.arange(5e-3,1e-2,1e-3),np.arange(1e-2,1e-1,1e-2),np.arange(1e-1,1.1,1e-1)])
250 draw_config[
'ylimits'] = [1, 1e3]
251 draw_config[
'xlimits'] = [5e-3,1]
252 draw_config[
'yunits'] =
''
253 draw_config[
'xunits'] =
''
258 if args.xvar ==
"bjorken_x":
264 df_20rs2 = eat.UprootLoad([f
"../CC_DIS_e10_p100_B15_dR5_maxIP3mm_trkpt10_22sigmin_lha_20Rs2/*/out.root"],
"Delphes", branches=branchlist)
265 df_21rs2 = eat.UprootLoad([f
"../CC_DIS_e10_p100_B15_dR5_maxIP3mm_trkpt10_22sigmin_lha_21Rs2/*/out.root"],
"Delphes", branches=branchlist)
270 xvar=draw_config[
'xvar']
271 xrange=draw_config[
'xrange']
272 xbins=draw_config[
'xbins']
273 ylimits=draw_config[
'ylimits']
274 xlimits=draw_config[
'xlimits']
275 yunits=draw_config[
'yunits']
276 xunits=draw_config[
'xunits']
278 charm_ct18nnlo = eat.DifferentialTaggingYield(df, x=xvar, xrange=xrange, xbins=xbins, which=
'charm', process=
'CC_DIS_e10_p100_CT18NNLO')
279 charm_ct18nnlo_20rs2 = eat.DifferentialTaggingYield(df_20rs2, x=xvar, xrange=xrange, xbins=xbins, which=
'charm', process=
'CC_DIS_e10_p100_CT1820Rs2')
280 charm_ct18nnlo_21rs2 = eat.DifferentialTaggingYield(df_21rs2, x=xvar, xrange=xrange, xbins=xbins, which=
'charm', process=
'CC_DIS_e10_p100_CT1821Rs2')
286 print(charm_ct18nnlo[2])
287 print(charm_ct18nnlo[3])
291 N_20 = charm_ct18nnlo_20rs2[2]
292 errN_20 = np.zeros(len(N_20))
294 for index
in range(len(errN_20)):
295 errN_20[index] = np.sqrt(N_20[index])
297 R_N_20 = np.ones(len(N_20)) + errN_20/N_20
299 N_21 = charm_ct18nnlo_21rs2[2]
301 diff_20_21 = N_21 - N_20
303 R_N_diff = np.ones(len(N_20)) + diff_20_21/N_20
306 fig, ax = plt.subplots(figsize=(12,8))
310 gridspec = fig.add_gridspec(ncols=1, nrows=1, width_ratios=[1], height_ratios=[1])
312 bins = charm_ct18nnlo[0]
313 bin_widths = charm_ct18nnlo[1]
315 one_line = np.ones(len(bins))
318 ax1 = fig.add_subplot(gridspec[0, 0])
320 ax1.grid(which=
'both', axis=
'both')
322 R_N_20_label =
"Stat. Uncertainty [CT18NNLO, $R_s=2s/(\overline{u}+\overline{d})=0.325$ (suppressed)]"
324 ax1.axhline(1.0, color=
'k', linestyle=
'-', linewidth=2)
325 errorboxes = [mpl.patches.Rectangle((x - xe, y - ye), 2*xe, 2*ye, facecolor=
'#7A6E67', alpha=0.35,
327 for x, y, xe, ye
in zip(bins, one_line, (bin_widths/2), errN_20/N_20)]
330 pc = mpl.collections.PatchCollection(errorboxes, facecolor=
'#7A6E67', alpha=0.35, label=R_N_20_label)
333 ax1.add_collection(pc)
335 enhanced = ax1.errorbar(bins, R_N_diff, xerr = bin_widths/2, marker=
's', ms=10, ls=
'none', linewidth=2, fillstyle=
'none', color=
'#003066', label=
'CT18ZNNLO with enhanced strangeness, $R_s=2s/(\overline{u}+\overline{d})=0.863$')
339 ax1.set_ylim([0.0, 2.00])
340 ax1.set_xlim(xlimits)
344 if xvar.find(
'Eta') != -1:
347 plt.xlabel(f
'Reconstructed Jet ${xvar_symbol}$ {xunits}')
349 if xvar ==
'bjorken_x':
350 plt.xlabel(f
'Bjorken x')
352 plt.xlabel(f
'Reconstructed Jet ${xvar_symbol}$ {xunits}')
354 if xvar ==
'bjorken_x':
357 ax1.legend(handles=[errorboxes[0],enhanced], fontsize=18)
362 plt.savefig(f
"jet_differential_tagyield_100fb_{xvar}_{args.input}.png")
363 plt.savefig(f
"jet_differential_tagyield_100fb_{xvar}_{args.input}.pdf")