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,25 or run2,run3 or year1_year2_...')
 
   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])))
 
   43 elif year == 
"run3" or len(year.split(
"_")) > 1:
 
   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,#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"))
 
   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"))
 
   64 elif 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))
 
   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")
 
   76 outfile = 
"ZeeZmm_ratio_vs_mu_"+out_tag+
".pdf" 
   78 ymin, ymax = 0.94, 1.06
 
   83         livetime, zlumi, zerr, olumi, timestamp, dfz_small = pt.get_dfz(args.indir, year, run, channel)
 
   86         if livetime < pt.runlivetimecut:
 
   87             if livetime >= 0.: 
print(f
"Skip Run {run} because of live time {livetime/60:.1f} min")
 
   91         if (year == 
"16" and dfz_small[
'LBStart'].iloc[0] < 1463184000) 
or run == 
"310247": 
 
   94         dflist.append(dfz_small)
 
   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)
 
  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))
 
  106         df[
'ZLumiErr'] = np.sqrt(df[
'ZLumiErr'])
 
  107         df[
'Bin'] = pd.Series(bins)
 
  109         norm = df[
'ZLumi'].
sum() / df[
'OffLumi'].
sum()
 
  110         df[
'Ratio']    = df[
'ZLumi'] / df[
'OffLumi'] / norm
 
  111         df[
'RatioErr'] = df[
'ZLumiErr'] / df[
'OffLumi'] / norm
 
  113     h_total = R.TH1F(
"h_total", 
"", len(bins)-1, bins)
 
  115     nan_list = df[df[
'Ratio'].isnull()].index.tolist()
 
  119     for xbin 
in range(0, h_total.GetNbinsX()):
 
  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])
 
  130             print(
"Cannot do ratio for", xbin)
 
  132     arr_ratio = np.array(arr_ratio)
 
  134     median = np.median(arr_ratio)
 
  135     stdev = np.percentile(abs(arr_ratio - median), 68)
 
  138     h_total.GetXaxis().SetTitle(
"<#mu>")
 
  141     line = R.TLine(h_total.GetXaxis().GetXmin(), median, h_total.GetXaxis().GetXmax(), median)
 
  142     line.SetLineColor(R.kRed)
 
  146         h_total.GetYaxis().SetRangeUser(ymin, ymax)
 
  147         leg = R.TLegend(0.54, 0.72, 0.805, 0.92)
 
  149         leg.AddEntry(h_total, pt.Leemumuratiolabel, 
"ep")
 
  150         leg.AddEntry(line, f
"Median = {median:.3f}#pm{stdev:.3f}", 
"l")
 
  152         h_total.GetYaxis().SetRangeUser(0.95, 1.05)
 
  153         leg = R.TLegend(0.20, 0.18, 0.45, 0.35)
 
  155     print(f
"Year = {year} channel = {channel}: median +- 68% percentile = {median:.3f} +- {stdev:.3f}")
 
  157     line1 = pt.make_bands(bins, stdev, median)
 
  160     h_total.Draw(
'same E0')
 
  163     leg.SetTextSize(0.05)
 
  165         h_total.GetYaxis().SetTitle(pt.Leemumuratiolabel)
 
  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" 
  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)
 
  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)
 
  182     leg.AddEntry(line1, 
"68% band (#pm" + 
str(
round(stdev, 3)) + 
")", 
"f")
 
  186         c1.SaveAs(outdir + outfile)
 
  188         c1.SaveAs(outdir + channel + 
"ATLAS_ratio_vs_mu_"+out_tag+
".pdf")
 
  190 if __name__ == 
"__main__":
 
  192     R.gROOT.SetBatch(R.kTRUE)