7 import python_tools
as pt
10 pd.set_option(
'display.max_rows',
None)
12 parser = argparse.ArgumentParser()
13 parser.add_argument(
'--year', type=str, help=
'15,16,17,18,22,23,24 or run2,run3')
14 parser.add_argument(
'--channel', type=str, help=
'Zee or Zmumu or Zll')
15 parser.add_argument(
'--comp', action=
'store_true', help=
'Compare Zee and Zmumu?')
16 parser.add_argument(
'--indir', type=str, help=
'Input CSV file directory')
17 parser.add_argument(
'--outdir', type=str, help=
'Output plot directory')
19 args = parser.parse_args()
21 channel = args.channel
26 print(
"Begin Yearwise Lumi vs Mu")
30 bins = np.concatenate((np.array([0, 10]), np.linspace(11, 17, 7), np.array([18, 22])))
33 bins = np.concatenate((np.array([0, 10]), np.linspace(11, 39, 29), np.array([40, 45])))
36 bins = np.concatenate((np.array([0, 15]), np.linspace(16, 59, 44), np.array([60, 70])))
39 bins = np.concatenate((np.array([0, 15]), np.linspace(16, 55, 40), np.array([56, 70])))
42 bins = np.concatenate((np.array([0, 20]), np.linspace(21, 53, 33), np.array([54, 70])))
45 bins = np.concatenate((np.array([0, 20]), np.linspace(21, 61, 41), np.array([62, 80])))
48 bins = np.concatenate((np.array([0, 26]), np.linspace(27, 61, 35), np.array([62, 80])))
51 date_string =
"Run 2, #sqrt{s} = 13 TeV"
52 grl = pt.get_grl(
"15")
53 grl.extend(pt.get_grl(
"16"))
54 grl.extend(pt.get_grl(
"17"))
55 grl.extend(pt.get_grl(
"18"))
58 date_string =
"Run 3, #sqrt{s} = 13.6 TeV"
59 grl = pt.get_grl(
"22")
60 grl.extend(pt.get_grl(
"23"))
61 grl.extend(pt.get_grl(
"24"))
65 date_string =
"Data 20"+year+
", #sqrt{s} = 13 TeV"
66 grl = pt.get_grl(year)
67 if int(year) >= 22: date_string = date_string.replace(
"13 TeV",
"13.6 TeV")
69 outfile =
"ZeeZmm_ratio_vs_mu_"+out_tag+
".pdf"
71 ymin, ymax = 0.94, 1.06
76 livetime, zlumi, zerr, olumi, timestamp, dfz_small = pt.get_dfz(args.indir, year, run, channel)
79 if livetime < pt.runlivetimecut:
80 if livetime >= 0.:
print(f
"Skip Run {run} because of live time {livetime/60:.1f} min")
84 if (year ==
"16" and dfz_small[
'LBStart'].iloc[0] < 1463184000)
or run ==
"310247":
87 dflist.append(dfz_small)
89 df = pd.concat(dflist)
90 df[
'OffMu'] = df[
'OffMu'].
round(0)
91 df = df.groupby(pd.cut(df.OffMu, bins, right=
False)).
sum()
92 df.reset_index(drop=
True, inplace=
True)
94 df[
'ZeeLumiErr'] = np.sqrt(df[
'ZeeLumiErr'])
95 df[
'ZmumuLumiErr'] = np.sqrt(df[
'ZmumuLumiErr'])
96 df[
'Ratio'] = df[
'ZeeLumi'] / df[
'ZmumuLumi']
97 df[
'RatioErr'] = df[
'Ratio'] * np.sqrt(
pow(df[
'ZeeLumiErr'] / df[
'ZeeLumi'], 2) +
pow(df[
'ZmumuLumiErr'] / df[
'ZmumuLumi'], 2))
99 df[
'ZLumiErr'] = np.sqrt(df[
'ZLumiErr'])
100 df[
'Bin'] = pd.Series(bins)
102 norm = df[
'ZLumi'].
sum() / df[
'OffLumi'].
sum()
103 df[
'Ratio'] = df[
'ZLumi'] / df[
'OffLumi'] / norm
104 df[
'RatioErr'] = df[
'ZLumiErr'] / df[
'OffLumi'] / norm
106 h_total = R.TH1F(
"h_total",
"", len(bins)-1, bins)
108 nan_list = df[df[
'Ratio'].isnull()].index.tolist()
112 for xbin
in range(0, h_total.GetNbinsX()):
118 h_total.SetBinContent(xbin+1, df[
'Ratio'][xbin])
119 h_total.SetBinError(xbin+1, df[
'RatioErr'][xbin])
120 arr_ratio.append(df[
'Ratio'][xbin])
123 print(
"Cannot do ratio for", xbin)
125 arr_ratio = np.array(arr_ratio)
127 median = np.median(arr_ratio)
128 stdev = np.percentile(abs(arr_ratio - median), 68)
131 h_total.GetXaxis().SetTitle(
"<#mu>")
134 line = R.TLine(h_total.GetXaxis().GetXmin(), median, h_total.GetXaxis().GetXmax(), median)
135 line.SetLineColor(R.kRed)
139 h_total.GetYaxis().SetRangeUser(ymin, ymax)
140 leg = R.TLegend(0.54, 0.72, 0.805, 0.92)
142 leg.AddEntry(h_total,
"L_{Z #rightarrow ee}/L_{Z #rightarrow #mu#mu}",
"ep")
143 leg.AddEntry(line, f
"Median = {median:.3f} #pm {stdev:.3f}",
"l")
145 h_total.GetYaxis().SetRangeUser(0.95, 1.05)
146 leg = R.TLegend(0.20, 0.18, 0.45, 0.35)
148 print(f
"Year = {year} channel = {channel}: median +- 68% percentile = {median:.3f} +- {stdev:.3f}")
150 line1 = pt.make_bands(bins, stdev, median)
153 h_total.Draw(
'same E0')
156 leg.SetTextSize(0.05)
158 h_total.GetYaxis().SetTitle(
"L_{Z #rightarrow ee} / L_{Z #rightarrow #mu#mu}")
161 h_total.GetYaxis().SetTitle(
"L_{"+pt.plotlabel[channel]+
"} / L_{ATLAS}")
162 leg.AddEntry(h_total,
"L_{"+pt.plotlabel[channel]+
"}^{year-normalised}/L_{ATLAS}",
"ep")
163 zstring = pt.plotlabel[channel]+
" counting"
166 pt.drawAtlasLabel(0.2, 0.88,
"Internal")
167 pt.drawText(0.2, 0.83, date_string, size=22)
168 pt.drawText(0.2, 0.78, zstring, size=22)
170 pt.drawAtlasLabel(xmin, 0.88,
"Internal")
171 pt.drawText(xmin, 0.83, date_string, size=22)
172 pt.drawText(xmin, 0.78, zstring, size=22)
173 pt.drawText(xmin, 0.71,
"OflLumi-Run3-005", size=22)
175 leg.AddEntry(line1,
"68% band",
"f")
179 c1.SaveAs(outdir + outfile)
181 c1.SaveAs(outdir + channel +
"ATLAS_ratio_vs_mu_"+out_tag+
".pdf")
183 if __name__ ==
"__main__":
185 R.gROOT.SetBatch(R.kTRUE)