170def zcounting_vs_atlas(channel, years):
171 """
172 Plot normalised comparison of Z-counting luminosity to ATLAS luminosity.
173 This can be done as a function of time and pileup.
174 """
175
176 zstring = pt.plotlabel[channel]+" counting"
177 ytitle = "L_{"+pt.plotlabel[channel]+"}/L_{ATLAS}"
178 if args.absolute:
179 leg_entry = "L_{"+pt.plotlabel[channel]+"}"
180 else:
181 leg_entry = "L_{"+pt.plotlabel[channel]+"}^{"+norm_type+"-normalised}/L_{ATLAS}"
182
183 print(
"Channel", channel,
"comparison to ATLAS vs time for years: ", years)
184
185 arr_date = []
186 arr_olumi = []
187 arr_zlumi = []
188 arr_zerr = []
189 run_num = []
190 fill_num = []
191
192 for year in years:
193
194 grl = pt.get_grl(year)
195
196 for run in grl:
197 livetime, zlumi, zerr, olumi, timestamp, dfz_small = pt.get_dfz(args.indir, year, run, channel)
198
199
200 if livetime < pt.runlivetimecut:
201 if livetime >= 0.:
print(f
"Skip Run {run} because of live time {livetime/60:.1f} min")
202 continue
203
204 prelratio = zlumi/olumi
205 if prelratio < ymin or prelratio > ymax:
206 print(
"WARNING: Run", run,
"has", channel,
"/ATLAS ratio %.2f +- %.2f, outside of y-axis range" % (prelratio, zerr/olumi) )
207
208
209 arr_date.append(timestamp)
210 arr_olumi.append(olumi)
211 arr_zlumi.append(zlumi)
212 arr_zerr.append(zerr)
213 run_num.append(run)
214 fill = dfz_small['FillNum'].median()
215 fill_num.append(int(fill))
216
217
218
219 arr_date =
array(
'd', arr_date)
220
221 arr_olumi = np.array(arr_olumi)
222 arr_zlumi = np.array(arr_zlumi)
223 arr_zerr = np.array(arr_zerr)
224 total_lumi = arr_olumi.sum()/1000000
225 total_lumi_string = "Official DQ "
226 if year == "25": total_lumi_string = "Preliminary DQ "
227 total_lumi_string += str(round(total_lumi, 1)) + " fb^{-1}"
228
229
230
231
232 if args.absolute:
233 normalisation = 1.0
234 else:
235 normalisation = np.sum(arr_zlumi) / np.sum(arr_olumi)
236
237
238 arr_zlumi /= normalisation
239 arr_zerr /= normalisation
240
241
242 arr_zlumi_ratio = arr_zlumi/arr_olumi
243 arr_zerr_ratio = arr_zerr/arr_olumi
244
245
246
247 tg = R.TGraphErrors(len(arr_date), arr_date,
array(
'd',arr_zlumi_ratio), R.nullptr,
array(
'd',arr_zerr_ratio))
248
249
250 if multiyear:
251 c1 = R.TCanvas("c1", "c1", 2000, 1000)
252 leg = R.TLegend(0.5, 0.18, 0.65, 0.4)
253 else:
254 c1 = R.TCanvas()
255 leg = R.TLegend(0.6, 0.18, 0.75, 0.4)
256
257 tg.Draw('ap e0')
258 tg.GetYaxis().SetRangeUser(ymin, ymax)
259 if args.absolute:
260 plot_title = "Absolute L_{"+ zstring +"} to ATLAS across " + norm_type
261 else:
262 plot_title = "Normalised L_{"+ zstring +"} to ATLAS across " + norm_type
263
264
265 stdev = np.percentile(abs(arr_zlumi_ratio - np.median(arr_zlumi_ratio)), 68)
266 print(
"68% band =", stdev)
267 tg.Fit('pol0', '0q')
268 mean = tg.GetFunction('pol0').GetParameter(0)
269 print(
"const of pol0 fit", mean)
270 print(
"median", np.median(arr_zlumi_ratio))
271 print(
"mean", np.mean(arr_zlumi_ratio))
272
273 line1 = pt.make_bands(arr_date, stdev, np.median(arr_zlumi_ratio))
274 line1.Draw("same 3")
275 tg.Draw('same ep')
276
277 leg.SetFillStyle(0)
278 leg.SetBorderSize(0)
279 leg.SetTextSize(0.05)
280 leg.AddEntry(tg, leg_entry, "ep")
281 leg.AddEntry(line1, "68%% band (#pm %.3f)" % stdev, "f")
282 leg.Draw()
283
284 pt.drawAtlasLabel(xval, yval-0.47, "Internal")
285 pt.drawText(xval, yval-0.53, date_tag, size=labelsize)
286 pt.drawText(xval, yval-0.59, zstring, size=labelsize)
287 pt.drawText(xval, yval-0.65, "OflLumi-Run3-006", size=labelsize)
288 pt.drawText(xval, yval-0.04, total_lumi_string, size=labelsize)
289
290 pt.drawText(xval, 0.88, plot_title, size=labelsize)
291
292 tg.GetXaxis().SetTitle(xtitle)
293 tg.GetYaxis().SetTitle(ytitle)
294 tg.GetYaxis().SetRangeUser(ymin, ymax)
295 tg.GetXaxis().SetTimeDisplay(2)
296 tg.GetXaxis().SetNdivisions(9,R.kFALSE)
297 tg.GetXaxis().SetTimeFormat(time_format)
298 tg.GetXaxis().SetTimeOffset(0,"gmt")
299
300 c1.Update()
301 c1.Modified()
302
303 filename = outdir + channel + "ATLAS_ratio_vs_time_"+out_tag
304 if args.absolute:
305 c1.SaveAs(filename+"_abs.pdf")
306 else:
307 c1.SaveAs(filename+".pdf")
308
309 if outcsv:
310 if args.absolute:
311 csvfile = open(filename+"_abs.csv", 'w')
312 else:
313 csvfile = open(filename+".csv", 'w')
314 csvwriter = csv.writer(csvfile, delimiter=',')
315 csvwriter.writerow(['FillNum','RunNum','Time','OffLumi','ZLumi','ZLumiErr','OffZlumi','OffZlumiErr'])
316 for i in range(len(run_num)):
317 csvwriter.writerow([fill_num[i], run_num[i], arr_date[i], arr_olumi[i], arr_zlumi[i], arr_zerr[i], arr_zlumi_ratio[i], arr_zerr_ratio[i]])
318 csvfile.close()
319
320
321