6 from .
import python_tools
as pt
10 from array
import array
14 parser = argparse.ArgumentParser()
15 parser.add_argument(
'--infile', type=str, help=
'input file')
16 parser.add_argument(
'--outdir', type=str, help=
'output directory')
17 parser.add_argument(
'--usemu', action=
'store_true', help=
'Plot vs. mu. Default == LB')
18 parser.add_argument(
'--absolute', action=
'store_true', help=
'Use for official lumi absolute comparison')
19 parser.add_argument(
'--t0', action=
'store_true', help=
'Modifications for t0 operation')
20 parser.add_argument(
'--dropzero', action=
'store_true', help=
'Drop LBs with zero Z counting lumi in either channel')
22 args = parser.parse_args()
23 infilename = args.infile
33 dfz = pd.read_csv(infilename, delimiter=
',')
35 print(
'No data in file', infilename,
', exiting.')
38 run_number = dfz.RunNum[0]
39 lhc_fill = dfz.FillNum[0]
42 rfo = R.TFile.Open(os.path.join(outdir,
'zlumi.root'),
'RECREATE')
45 LumiErr = channel+
'LumiErr'
46 LumiString = pt.plotlabel[channel]
51 dfz = dfz.drop(dfz[(dfz[Lumi] == 0)].index)
52 dfz = dfz.drop(dfz[(dfz[
'LBLive']<pt.lblivetimecut) | (dfz[
'PassGRL']==0)].index)
54 print(
"No valid LBs found. Exiting")
57 dfz[
'OffDelLumi'] = dfz[
'OffLumi']*dfz[
'LBFull']
61 for entry
in [Lumi, LumiErr,
'OffLumi']:
62 dfz[entry] *= dfz[
'LBLive']
63 normalisation = dfz[Lumi].
sum() / dfz[
'OffLumi'].
sum()
64 dfz[LumiErr] *= dfz[LumiErr]
66 dfz[
'OffMu'] = dfz[
'OffMu'].astype(int)
67 dfz = dfz.groupby([
'OffMu']).
sum()
69 dfz[
'LBNum'] = (dfz[
'LBNum']//20)*20
70 dfz = dfz.groupby([
'LBNum']).
sum()
71 dfz[LumiErr] = np.sqrt(dfz[LumiErr])
72 for entry
in [Lumi, LumiErr,
'OffLumi']:
73 dfz[entry] /= dfz[
'LBLive']
75 print(f
"{Lumi}/OffLumi mean ratio = {normalisation:.3f}")
79 timeformat =
'%y/%m/%d %H:%M:%S'
81 for k
in range(len(dfz)):
84 lbselector = (lb <= dfz0[
'LBNum']) & (dfz0[
'LBNum'] < lb+20)
85 translist.append({
'FillNum' : dfz0[lbselector][
'FillNum'].iloc[0],
86 'beginTime' : time.strftime(timeformat,
87 time.gmtime(dfz0[lbselector][
'LBStart'].iloc[0])),
88 'endTime': time.strftime(timeformat,
89 time.gmtime(dfz0[(dfz0[
'LBNum']//20)*20 == lb][
'LBEnd'].iloc[-1])),
90 'ZmumuRate': thisrow[
'ZmumuRate']/thisrow[
'LBLive'],
91 'instDelLumi': thisrow[
'OffDelLumi']/thisrow[
'LBFull']/1e3,
92 'delLumi': thisrow[
'OffLumi']/1e3,
93 'ZDel': thisrow[
'ZmumuRate']
95 pdn = pd.DataFrame.from_records(translist)
96 pdn.to_csv(os.path.join(args.outdir,
'zrate.csv'), header=
False, index=
False)
99 leg = R.TLegend(0.6, 0.33, 0.75, 0.5)
101 outfile = channel+
"ATLAS_vs_mu"
103 leg = R.TLegend(0.62, 0.75, 0.75, 0.9)
104 xtitle =
"Luminosity Block Number"
105 outfile = channel+
"ATLAS_vs_lb"
111 arr_bins =
array(
'd', dfz.index)
112 arr_zlumi =
array(
'd', dfz[Lumi] / normalisation)
113 arr_zlumi_err =
array(
'd', dfz[LumiErr] / normalisation)
114 arr_rat =
array(
'd', dfz[Lumi] / dfz[
'OffLumi'] / normalisation)
115 arr_rat_err =
array(
'd', dfz[LumiErr] / dfz[
'OffLumi'] / normalisation)
116 arr_olumi =
array(
'd', dfz[
'OffLumi'])
118 hz = R.TGraphErrors(len(arr_bins), arr_bins, arr_zlumi, R.nullptr, arr_zlumi_err)
119 ho = R.TGraphErrors(len(arr_bins), arr_bins, arr_olumi, R.nullptr, R.nullptr)
120 hr = R.TGraphErrors(len(arr_bins), arr_bins, arr_rat, R.nullptr, arr_rat_err)
122 ho.SetLineColor(R.kAzure)
127 pad1 = R.TPad(
"pad1",
"pad1", 0, 0, 1, 1)
128 pad1.SetBottomMargin(0.3)
129 pad1.SetFillStyle(4000)
133 hz.GetXaxis().SetLabelSize(0)
135 xmin = hz.GetXaxis().GetXmin()
136 xmax = hz.GetXaxis().GetXmax()
142 hz.GetYaxis().SetTitle(
"Luminosity [10^{33} cm^{-2}s^{-1}]")
143 hz.GetXaxis().SetTitle(xtitle)
144 hz.GetXaxis().SetTitleOffset(0.8)
145 ymax = hz.GetHistogram().GetMaximum()
146 ymin = hz.GetHistogram().GetMinimum()
148 hz.GetYaxis().SetRangeUser(ymin*0.8, ymax*1.4)
151 leg.SetTextSize(0.055)
153 leg.AddEntry(hz,
"L_{"+LumiString+
"}",
"ep")
155 leg.AddEntry(hz,
"L_{"+LumiString+
"}^{normalised to L_{ATLAS}^{fill}}",
"ep")
156 leg.AddEntry(ho,
"L_{ATLAS}",
"l")
159 pad2 = R.TPad(
"pad2",
"pad2", 0, 0, 1, 1)
160 pad2.SetTopMargin(0.72)
161 pad2.SetBottomMargin(0.1)
162 pad2.SetFillStyle(4000)
167 hr.GetYaxis().SetTitle(
"Ratio")
168 hr.GetXaxis().SetTitle(xtitle)
169 hr.GetXaxis().SetTitleOffset(0.865)
171 ymin, ymax = 0.95, 1.05
172 median = np.median(arr_rat)
173 spread = np.percentile(abs(arr_rat - median), 68)
174 if spread > 0.03: ymin, ymax = 0.9, 1.1
175 if args.absolute
and args.t0: ymin, ymax = 0.9, 1.1
176 hr.GetYaxis().SetRangeUser(ymin, ymax)
178 line0 = R.TLine(xmin, 1.0, xmax, 1.0)
179 line0.SetLineStyle(2)
182 line1 = R.TLine(xmin, (ymin+1.)/2., xmax, (ymin+1.)/2.)
183 line1.SetLineStyle(2)
186 line2 = R.TLine(xmin, (ymax+1.)/2., xmax, (ymax+1.)/2.)
187 line2.SetLineStyle(2)
190 hr.GetYaxis().SetNdivisions(3)
192 pt.drawAtlasLabel(0.2, 0.88,
"Internal")
194 pt.drawText(0.2, 0.82, pt.get_yearsqrtstxt(run_number), size=22)
195 pt.drawText(0.2, 0.77,
"LHC Fill " +
str(lhc_fill), size=22)
196 pt.drawText(0.2, 0.72, LumiString +
" counting", size=22)
198 line4 = pt.make_bands(arr_bins, spread, median)
203 c1.SaveAs(os.path.join(outdir, outfile +
".pdf"))
205 rfo.WriteTObject(c1, outfile)
206 if channel ==
'Zmumu':
207 rfo.WriteTObject(hz,
'z_lumi')
208 rfo.WriteTObject(hr,
'z_lumi_ratio')
214 hr.GetXaxis().SetTitleOffset(1)
218 hr.GetFunction(
'pol0').SetLineColor(R.kRed)
220 hr.GetYaxis().SetTitle(
"Ratio")
221 hr.GetXaxis().SetTitle(xtitle)
222 hr.GetYaxis().SetRangeUser(0.9, 1.1)
223 hr.GetYaxis().SetNdivisions()
225 mean = hr.GetFunction(
"pol0").GetParameter(0)
226 line0 = pt.make_bands(arr_bins, spread, median)
229 hr.GetFunction(
'pol0').Draw(
'same l')
231 pt.drawAtlasLabel(0.2, 0.88,
"Internal")
233 pt.drawText(0.2, 0.82, pt.get_yearsqrtstxt(run_number), size=22)
234 pt.drawText(0.2, 0.77,
"LHC Fill " +
str(lhc_fill), size=22)
235 pt.drawText(0.2, 0.72, LumiString +
" counting", size=22)
237 leg = R.TLegend(0.17, 0.2, 0.90, 0.3)
239 leg.SetTextSize(0.05)
241 leg.AddEntry(hr,
"L_{"+LumiString+
"}/L_{ATLAS}",
"ep")
242 leg.AddEntry(hr.GetFunction(
"pol0"), f
"Mean = {mean:.3f}",
"l")
243 leg.AddEntry(line0,
"68% band",
"f")
247 c2.SaveAs(os.path.join(outdir, outfile+
"_ratio.pdf"))
249 rfo.WriteTObject(c2, f
'{outfile}_ratio')
254 dfz = pd.read_csv(infilename, delimiter=
',')
256 print(
'No data in file', infilename,
', exiting.')
259 run_number = dfz.RunNum[0]
260 lhc_fill = dfz.FillNum[0]
263 rfo = R.TFile.Open(os.path.join(outdir,
'zlumi.root'),
'RECREATE')
265 dfz = dfz.drop(dfz[(dfz.ZeeLumi == 0) | (dfz.ZmumuLumi == 0)].index)
266 dfz = dfz.drop(dfz[(dfz[
'LBLive']<pt.lblivetimecut) | (dfz[
'PassGRL']==0)].index)
268 print(
"No valid LBs found. Exiting")
272 for entry
in [
'ZeeLumi',
'ZmumuLumi',
'ZeeLumiErr',
'ZmumuLumiErr']:
273 dfz[entry] *= dfz[
'LBLive']
274 for entry
in [
'ZeeLumiErr',
'ZmumuLumiErr']:
275 dfz[entry] *= dfz[entry]
277 dfz[
'OffMu'] = dfz[
'OffMu'].astype(int)
278 dfz = dfz.groupby([
'OffMu']).
sum()
280 dfz[
'LBNum'] = (dfz[
'LBNum']//20)*20
281 dfz = dfz.groupby([
'LBNum']).
sum()
282 for entry
in [
'ZeeLumiErr',
'ZmumuLumiErr']:
283 dfz[entry] = np.sqrt(dfz[entry])
284 for entry
in [
'ZeeLumi',
'ZmumuLumi',
'ZeeLumiErr',
'ZmumuLumiErr']:
285 dfz[entry] /= dfz[
'LBLive']
287 arr_bins =
array(
'd', dfz.index)
288 arr_rat =
array(
'd', dfz[
'ZeeLumi'] / dfz[
'ZmumuLumi'])
289 arr_rat_err =
array(
'd', (dfz[
'ZeeLumi'] / dfz[
'ZmumuLumi']) * np.sqrt(
pow(dfz[
'ZeeLumiErr']/dfz[
'ZeeLumi'], 2) +
pow(dfz[
'ZmumuLumiErr']/dfz[
'ZmumuLumi'], 2)))
291 gr = R.TGraphErrors(len(arr_rat), arr_bins, arr_rat, R.nullptr, arr_rat_err)
299 outfile =
"ZeeZmm_ratio_vs_mu.pdf"
301 xtitle =
"Luminosity Block Number"
302 outfile =
"ZeeZmm_ratio_vs_lb.pdf"
304 gr.GetXaxis().SetTitle(xtitle)
306 gr.GetYaxis().SetTitle(pt.Leemumuratiolabel)
308 ymin, ymax = 0.85, 1.15
309 median = np.median(arr_rat)
310 spread = np.percentile(abs(arr_rat - median), 68)
311 if spread > 0.05: ymin, ymax = 0.75, 1.25
312 gr.GetYaxis().SetRangeUser(ymin, ymax)
315 gr.GetFunction(
"pol0").SetLineColor(R.kRed)
317 mean = gr.GetFunction(
"pol0").GetParameter(0)
318 line1 = pt.make_bands(arr_bins, spread, median)
320 gr.GetFunction(
"pol0").Draw(
"same l")
323 pt.drawAtlasLabel(0.2, 0.88,
"Internal")
325 pt.drawText(0.2, 0.82, pt.get_yearsqrtstxt(run_number), size=22)
326 pt.drawText(0.2, 0.77,
"LHC Fill " +
str(lhc_fill), size=22)
328 leg = R.TLegend(0.17, 0.2, 0.90, 0.3)
330 leg.SetTextSize(0.05)
332 leg.AddEntry(gr, pt.Leemumuratiolabel,
"ep")
333 leg.AddEntry(gr.GetFunction(
"pol0"), f
"Mean = {mean:.3f}",
"l")
334 leg.AddEntry(line1,
"68% band",
"f")
338 c1.SaveAs(os.path.join(outdir, outfile))
340 rfo.WriteTObject(c1,
'zeezmmratio')
342 if __name__ ==
"__main__":
344 R.gStyle.SetTitleOffset(1,
'xy')
345 R.gStyle.SetLabelSize(0.045,
'xy')
346 R.gStyle.SetTitleSize(0.052,
'xy')
347 R.gROOT.SetBatch(R.kTRUE)