ATLAS Offline Software
Loading...
Searching...
No Matches
yearwise_luminosity_vs_mu.py
Go to the documentation of this file.
1#!/usr/bin/env python
2# Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3
4import numpy as np
5import pandas as pd
6import ROOT as R
7import python_tools as pt
8import argparse
9
10pd.set_option('display.max_rows', None)
11
12parser = argparse.ArgumentParser()
13parser.add_argument('--year', type=str, help='15,16,17,18,22,23,24,25 or run2,run3 or year1_year2_...')
14parser.add_argument('--channel', type=str, help='Zee or Zmumu or Zll')
15parser.add_argument('--comp', action='store_true', help='Compare Zee and Zmumu?')
16parser.add_argument('--indir', type=str, help='Input CSV file directory')
17parser.add_argument('--outdir', type=str, help='Output plot directory')
18
19args = parser.parse_args()
20year = args.year
21channel = args.channel
22
23comp = args.comp
24indir = args.indir
25outdir = args.outdir
26print("Begin Yearwise Lumi vs Mu")
27
28if year == "15":
29 xmin = 0.2
30 bins = np.concatenate((np.array([0, 10]), np.linspace(11, 17, 7), np.array([18, 22])))
31elif year == "16":
32 xmin = 0.4
33 bins = np.concatenate((np.array([0, 10]), np.linspace(11, 39, 29), np.array([40, 45])))
34elif year == "17":
35 xmin = 0.4
36 bins = np.concatenate((np.array([0, 15]), np.linspace(16, 59, 44), np.array([60, 70])))
37elif year == "18":
38 xmin = 0.2
39 bins = np.concatenate((np.array([0, 15]), np.linspace(16, 55, 40), np.array([56, 70])))
40elif year == "22":
41 xmin = 0.5
42 bins = np.concatenate((np.array([0, 20]), np.linspace(21, 53, 33), np.array([54, 70])))
43elif year == "run3" or len(year.split("_")) > 1:
44 xmin = 0.5
45 bins = np.concatenate((np.array([0, 20]), np.linspace(21, 61, 41), np.array([62, 80])))
46else:
47 xmin = 0.2
48 bins = np.concatenate((np.array([0, 26]), np.linspace(27, 61, 35), np.array([62, 80])))
49
50if year == "run2":
51 date_string = "Run 2,#kern[-0.5]{ }#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"))
56 out_tag = "run2"
57elif year == "run3":
58 date_string = "Run 3,#kern[-0.5]{ }#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"))
62 grl.extend(pt.get_grl("25"))
63 out_tag = "run3"
64elif len(year.split("_")) > 1:
65 date_string = "Run 3,#kern[-0.5]{ }#sqrt{s} = 13.6 TeV"
66 grl = pt.get_grl(year.split("_")[0])
67 for i in year.split("_")[1:]:
68 grl.extend(pt.get_grl(i))
69 out_tag = "data"+year
70else:
71 out_tag = "data"+year
72 date_string = "Data 20"+year+",#kern[-0.5]{ }#sqrt{s} = 13 TeV"
73 grl = pt.get_grl(year)
74 if int(year) >= 22: date_string = date_string.replace("13 TeV", "13.6 TeV")
75
76outfile = "ZeeZmm_ratio_vs_mu_"+out_tag+".pdf"
77
78ymin, ymax = 0.94, 1.06
79
80def main():
81 dflist = []
82 for run in grl:
83 livetime, zlumi, zerr, olumi, timestamp, dfz_small = pt.get_dfz(args.indir, year, run, channel)
84
85 # Cut out short runs
86 if livetime < pt.runlivetimecut:
87 if livetime >= 0.: print(f"Skip Run {run} because of live time {livetime/60:.1f} min")
88 continue
89
90 # Cut out early 2016 runs with "strange" bunch structure
91 if (year == "16" and dfz_small['LBStart'].iloc[0] < 1463184000) or run == "310247":
92 continue
93
94 dflist.append(dfz_small)
95
96 df = pd.concat(dflist)
97 df['OffMu'] = df['OffMu'].round(0)
98 df = df.groupby(pd.cut(df.OffMu, bins, right=False), observed=False).sum()
99 df.reset_index(drop=True, inplace=True)
100 if comp:
101 df['ZeeLumiErr'] = np.sqrt(df['ZeeLumiErr'])
102 df['ZmumuLumiErr'] = np.sqrt(df['ZmumuLumiErr'])
103 df['Ratio'] = df['ZeeLumi'] / df['ZmumuLumi']
104 df['RatioErr'] = df['Ratio'] * np.sqrt(pow(df['ZeeLumiErr'] / df['ZeeLumi'], 2) + pow(df['ZmumuLumiErr'] / df['ZmumuLumi'], 2))
105 else:
106 df['ZLumiErr'] = np.sqrt(df['ZLumiErr'])
107 df['Bin'] = pd.Series(bins)
108
109 norm = df['ZLumi'].sum() / df['OffLumi'].sum()
110 df['Ratio'] = df['ZLumi'] / df['OffLumi'] / norm
111 df['RatioErr'] = df['ZLumiErr'] / df['OffLumi'] / norm
112
113 h_total = R.TH1F("h_total", "", len(bins)-1, bins)
114
115 nan_list = df[df['Ratio'].isnull()].index.tolist()
116
117 arr_ratio = []
118
119 for xbin in range(0, h_total.GetNbinsX()):
120
121 if xbin in nan_list:
122 continue
123
124 try:
125 h_total.SetBinContent(xbin+1, df['Ratio'][xbin])
126 h_total.SetBinError(xbin+1, df['RatioErr'][xbin])
127 arr_ratio.append(df['Ratio'][xbin])
128
129 except KeyError:
130 print("Cannot do ratio for", xbin)
131
132 arr_ratio = np.array(arr_ratio)
133
134 median = np.median(arr_ratio)
135 stdev = np.percentile(abs(arr_ratio - median), 68)
136
137 c1 = R.TCanvas()
138 h_total.GetXaxis().SetTitle("<#mu>")
139 h_total.Draw("E0")
140 R.gStyle.SetErrorX()
141 line = R.TLine(h_total.GetXaxis().GetXmin(), median, h_total.GetXaxis().GetXmax(), median)
142 line.SetLineColor(R.kRed)
143 line.Draw()
144
145 if comp:
146 h_total.GetYaxis().SetRangeUser(ymin, ymax)
147 leg = R.TLegend(0.54, 0.72, 0.805, 0.92)
148 leg.SetTextSize(18)
149 leg.AddEntry(h_total, pt.Leemumuratiolabel, "ep")
150 leg.AddEntry(line, f"Median = {median:.3f}#pm{stdev:.3f}", "l")
151 else:
152 h_total.GetYaxis().SetRangeUser(0.95, 1.05)
153 leg = R.TLegend(0.20, 0.18, 0.45, 0.35)
154
155 print(f"Year = {year} channel = {channel}: median +- 68% percentile = {median:.3f} +- {stdev:.3f}")
156
157 line1 = pt.make_bands(bins, stdev, median)
158 line1.Draw("same 3")
159 if comp: line.Draw()
160 h_total.Draw('same E0')
161
162 leg.SetBorderSize(0)
163 leg.SetTextSize(0.05)
164 if comp:
165 h_total.GetYaxis().SetTitle(pt.Leemumuratiolabel)
166 zstring = ""
167 else:
168 h_total.GetYaxis().SetTitle("L_{"+pt.plotlabel[channel]+"} / L_{ATLAS}")
169 leg.AddEntry(h_total, "L_{"+pt.plotlabel[channel]+"}^{year-normalised}/L_{ATLAS}", "ep")
170 zstring = pt.plotlabel[channel]+" counting"
171
172 if comp:
173 pt.drawAtlasLabel(0.2, 0.88, "Internal")
174 pt.drawText(0.2, 0.83, date_string, size=22)
175 pt.drawText(0.2, 0.78, zstring, size=22)
176 else:
177 pt.drawAtlasLabel(xmin, 0.88, "Internal")
178 pt.drawText(xmin, 0.83, date_string, size=22)
179 pt.drawText(xmin, 0.78, zstring, size=22)
180 pt.drawText(xmin, 0.71, "OflLumi-Run3-006", size=22)
181
182 leg.AddEntry(line1, "68% band (#pm" + str(round(stdev, 3)) + ")", "f")
183 leg.Draw()
184
185 if comp:
186 c1.SaveAs(outdir + outfile)
187 else:
188 c1.SaveAs(outdir + channel + "ATLAS_ratio_vs_mu_"+out_tag+".pdf")
189
190if __name__ == "__main__":
191 pt.setAtlasStyle()
192 R.gROOT.SetBatch(R.kTRUE)
193 main()
void print(char *figname, TCanvas *c1)
constexpr int pow(int base, int exp) noexcept