def do_pt_plot(pythia_dir, herwig_dir, selection, hist_name, output_name, title=""): h_pythia = grab_obj( "%s/uhh2.AnalysisModuleRunner.MC.MC_%s_.root" % (pythia_dir, selection), hist_name) h_herwig = grab_obj( "%s/uhh2.AnalysisModuleRunner.MC.MC_%s_.root" % (herwig_dir, selection), hist_name) c_pythia = Contribution(h_pythia, label="MG+Pythia", line_color=ROOT.kBlue, marker_color=ROOT.kBlue, fill_color=ROOT.kBlue, normalise_hist=True) # c_herwig = Contribution(h_herwig, label="Herwig", line_color=ROOT.kRed, normalise_hist=True) c_herwig = Contribution(h_herwig, label="Pythia only", line_color=ROOT.kRed, marker_color=ROOT.kRed, fill_color=ROOT.kRed, normalise_hist=True) p = Plot([c_pythia, c_herwig], what="hist", legend=True, subplot_type='ratio', subplot=c_pythia, title=title) p.plot("NOSTACK HISTE") p.main_pad.SetLogy() p.container.SetMinimum(1E-12) p.subplot_container.SetMaximum(1.5) p.subplot_container.SetMinimum(0) p.canvas.Update() p.save(output_name)
def get_flavour_efficiencies(input_file, hist_name, bins): """Get dict of flav : [TEfficiency for specified bins] for a given input file & hist name.""" h2d_flav = grab_obj(input_file, hist_name) flav_dict = { 'd': [], 'u': [], 's': [], 'c': [], 'b': [], 't': [], 'g': [], 'unknown': [], 'total': [] } for (pt_min, pt_max) in bins: h_flav = get_projection_plot(h2d_flav, pt_min, pt_max, cut_axis='y') total_err = array('d', [-1.]) total2 = h_flav.IntegralAndError(1, h_flav.GetNbinsX() + 1, total_err) total_err = total_err[0] unknown_num = h_flav.GetBinContent(1) d_num = h_flav.GetBinContent(2) u_num = h_flav.GetBinContent(3) s_num = h_flav.GetBinContent(4) c_num = h_flav.GetBinContent(5) b_num = h_flav.GetBinContent(6) t_num = h_flav.GetBinContent(7) g_num = h_flav.GetBinContent(22) total = d_num + u_num + s_num + c_num + b_num + t_num + g_num + unknown_num # print(total, total2) if not cu.same_floats(total, total2): # raise RuntimeError("totals dont match: %.9g vs %.9g" % (total, total2)) warnings.warn("totals dont match: %.9g vs %.9g" % (total, total2)) if total <= 0: warnings.warn("Total = 0") if total2 <= 0: warnings.warn("Total2 = 0") unknown_err = h_flav.GetBinError(1) d_err = h_flav.GetBinError(2) u_err = h_flav.GetBinError(3) s_err = h_flav.GetBinError(4) c_err = h_flav.GetBinError(5) b_err = h_flav.GetBinError(6) t_err = h_flav.GetBinError(7) g_err = h_flav.GetBinError(22) # print(pt_min, pt_max, b_num, b_err, total2, total_err) # print(pt_min, pt_max, g_num, g_err, total2, total_err) flav_dict['unknown'].append([unknown_num, unknown_err]) flav_dict['d'].append([d_num, d_err]) flav_dict['u'].append([u_num, u_err]) flav_dict['s'].append([s_num, s_err]) flav_dict['c'].append([c_num, c_err]) flav_dict['b'].append([b_num, b_err]) flav_dict['t'].append([t_num, t_err]) flav_dict['g'].append([g_num, g_err]) flav_dict['total'].append([total, total_err]) flav_eff_dict = { 'd': None, 'u': None, 's': None, 'c': None, 'b': None, 't': None, 'g': None, 'unknown': None, } bin_edges = [p[0] for p in bins] bin_edges += bins[-1][1:] bin_edges = array('d', bin_edges) h_total = ROOT.TH1D("h_total", ";p_{T} [GeV];N", len(bins), bin_edges) for ind, val in enumerate(flav_dict['total'], 1): h_total.SetBinContent(ind, val[0]) h_total.SetBinError(ind, val[1]) for flav_key in [k for k in flav_dict.keys() if k != 'total']: h_flav = ROOT.TH1D("h_%s" % flav_key, ";p_{T} [GeV];N", len(bins), bin_edges) for ind, val in enumerate(flav_dict[flav_key], 1): h_flav.SetBinContent(ind, val[0]) h_flav.SetBinError(ind, val[1]) if (h_flav.GetNbinsX() != h_total.GetNbinsX()): raise ValueError( "flav %s has diff # bins to total (%d vs %d)" % flav_key, h_flav.GetNbinsX(), h_total.GetNbinsX()) eff_flav = ROOT.TEfficiency(h_flav, h_total) eff_flav.SetStatisticOption(1) # normal approx flav_eff_dict[flav_key] = eff_flav return flav_eff_dict
def do_projection_plots(root_dirs, plot_dir="response_plots", zpj_dirname="ZPlusJets_QG", dj_dirname="Dijet_QG", flav_matched=False, do_fits=False): """Plot both/either q and g jet repsonse, for various genjet pt bins. Contributions from all root_dirs are shown on same plot. flav_matched : If True, use hists with explicit gen-parton flavour matching plot_dir : output dir for plots do_fits : If Ture, try and do a Gaussian fit to each 1D hist """ pt_bins = [(20, 40), (40, 60), (60, 80), (80, 100), (100, 120), (120, 140), (160, 200), (200, 240), (240, 300), (300, 400), (400, 500), (500, 600), (600, 800), (800, 1000), (1000, 2000)] print_pt_bins = [(20, 40), (40, 60), (60, 80), (100, 120), (160, 200), (240, 300), (400, 500), (500, 600), (800, 1000), (1000, 2000)] print_pt_bins = pt_bins zpj_fits = [] dj_fits = [] for (pt_min, pt_max) in pt_bins: print pt_min, pt_max if pt_min > pt_max: raise RuntimeError("pt_min < pt_max!") lw = 2 if len(root_dirs) == 1 else 1 plot_entries = [] do_plot = (pt_min, pt_max) in print_pt_bins rebin = 1 for ind, root_dir in enumerate(root_dirs): if zpj_dirname: flav_str = "q" if flav_matched else "" h2d_dyj = grab_obj( os.path.join(root_dir, qgc.DY_FILENAME), "%s/%s" % (zpj_dirname, "%sjet_response_vs_genjet_pt" % (flav_str))) obj = qgg.get_projection_plot(h2d_dyj, pt_min, pt_max) if obj.Integral() > 0: obj.Rebin(rebin) obj.Scale(1. / obj.Integral()) col = qgc.DY_COLOURS[ind] dy_reco_kwargs = dict(line_color=col, fill_color=col, line_width=lw, marker_color=col, marker_style=qgc.DY_MARKER, label=qgc.DY_ZpJ_QFLAV_LABEL if flav_matched else qgc.DY_ZpJ_LABEL) if len(root_dirs) > 1: dy_reco_kwargs['label'] += " [" + root_dir + "]" if do_fits: do_gaus_fit(obj) fit = obj.GetFunction("gausFit") dy_reco_kwargs['label'] += "\n" dy_reco_kwargs['label'] += fit_results_to_str(fit) zpj_fits.append(fit) if do_plot: plot_entries.append((obj, dy_reco_kwargs)) if dj_dirname: flav_str = "g" if flav_matched else "" h2d_qcd = grab_obj( os.path.join(root_dir, qgc.QCD_FILENAME), "%s/%s" % (dj_dirname, "%sjet_response_vs_genjet_pt" % (flav_str))) obj = qgg.get_projection_plot(h2d_qcd, pt_min, pt_max) if obj.Integral() > 0: obj.Rebin(rebin) obj.Scale(1. / obj.Integral()) col = qgc.QCD_COLOURS[ind] qcd_reco_kwargs = dict( line_color=col, fill_color=col, line_width=lw, marker_color=col, marker_style=qgc.QCD_MARKER, label=qgc.QCD_Dijet_GFLAV_LABEL if flav_matched else qgc.QCD_Dijet_LABEL) if len(root_dirs) > 1: qcd_reco_kwargs['label'] += " [" + root_dir + "]" if do_fits: do_gaus_fit(obj) fit = obj.GetFunction("gausFit") qcd_reco_kwargs['label'] += "\n" qcd_reco_kwargs['label'] += fit_results_to_str(fit) dj_fits.append(fit) if do_plot: plot_entries.append((obj, qcd_reco_kwargs)) flav_str = "_flavMatched" if flav_matched else "" if do_plot and len(plot_entries) > 0: output_filename = os.path.join( plot_dir, "jet_response_ptGen%dto%d%s.%s" % (pt_min, pt_max, flav_str, OUTPUT_FMT)) plot = qgg.make_comparison_plot_ingredients( plot_entries, rebin=1, normalise_hist=False, title="%d < p_{T}^{GenJet} < %d GeV" % (pt_min, pt_max), xtitle="Response (p_{T}^{Reco} / p_{T}^{Gen})", xlim=(0.25, 1.75)) if plot.legend: plot.legend.SetX1(0.65) plot.legend.SetX2(0.95) plot.legend.SetY1(0.5) plot.legend.SetY2(0.89) plot.plot("E NOSTACK") max_y = plot.container.GetHistogram().GetMaximum() line = ROOT.TLine(1, 0, 1, max_y) line.SetLineWidth(2) line.SetLineStyle(2) line.SetLineColor(13) line.Draw() plot.save(output_filename) do_response_graph( pt_bins, zpj_fits, dj_fits, title="Flav Matched" if flav_matched else "Not flav matched", output_filename=os.path.join( plot_dir, "gr_jet_response%s.%s" % (flav_str, OUTPUT_FMT)))
def do_all_2D_plots(root_dir, plot_dir="plots_2d", zpj_dirname="ZPlusJets_QG", dj_dirname="Dijet_QG"): """Do 2D plots of response vs pt, with various normalisations, etc plot_dir : output dir for plots """ line = ROOT.TLine(1, 0, 1, 2000) line.SetLineStyle(2) line.SetLineWidth(2) line.SetLineColor(13) for flav_matched in [True, False]: for renorm, logz in product(['Y', None], [True, False]): log_append = "_logZ" if logz else "" if zpj_dirname: flav_str = "q" if flav_matched else "" h2d_dyj = grab_obj( os.path.join(root_dir, qgc.DY_FILENAME), "%s/%s" % (zpj_dirname, "%sjet_response_vs_genjet_pt" % (flav_str))) flav_append = "_%sflavMatched" % flav_str if flav_matched else "" output_filename = os.path.join( plot_dir, "response_vs_genjet_pt_zpj%s_norm%s%s.%s" % (flav_append, renorm, log_append, OUTPUT_FMT)) title = qgc.DY_ZpJ_LABEL if flav_matched: title += " (%s-matched)" % flav_str zlim = [1E-5, 1] if logz and renorm else None qgg.do_2D_plot(h2d_dyj, output_filename, renorm_axis=renorm, title=title, rebin=None, recolour=True, xlim=None, ylim=None, zlim=zlim, logz=logz, other_things_to_draw=[line]) # output_filename = os.path.join(plot_dir, "response_vs_genjet_pt_zpj%s_norm%s%s_box.%s" % (flav_append, renorm, log_append, OUTPUT_FMT)) # qgg.do_2D_plot(h2d_dyj, output_filename, draw_opt="CANDLEY1", renorm_axis=renorm, title=title, rebin=None, recolour=True, xlim=None, ylim=None, zlim=zlim, logz=logz, other_things_to_draw=[line]) if dj_dirname: flav_str = "g" if flav_matched else "" h2d_qcd = grab_obj( os.path.join(root_dir, qgc.QCD_FILENAME), "%s/%s" % (dj_dirname, "%sjet_response_vs_genjet_pt" % (flav_str))) flav_append = "_%sflavMatched" % flav_str if flav_matched else "" output_filename = os.path.join( plot_dir, "response_vs_genjet_pt_dj%s_norm%s%s.%s" % (flav_append, renorm, log_append, OUTPUT_FMT)) title = qgc.QCD_Dijet_LABEL if flav_matched: title += " (%s-matched)" % flav_str zlim = [1E-5, 1] if logz and renorm else None qgg.do_2D_plot(h2d_qcd, output_filename, renorm_axis=renorm, title=title, rebin=None, recolour=True, xlim=None, ylim=None, zlim=zlim, logz=logz, other_things_to_draw=[line]) # output_filename = os.path.join(plot_dir, "response_vs_genjet_pt_dj%s_norm%s%s_box.%s" % (flav_append, renorm, log_append, OUTPUT_FMT)) # qgg.do_2D_plot(h2d_qcd, output_filename, draw_opt="CANDLEY1", renorm_axis=renorm, title=title, rebin=None, recolour=True, xlim=None, ylim=None, zlim=zlim, logz=logz, other_things_to_draw=[line]) # Do box plot comparing them both canvas = ROOT.TCanvas(ROOT.TUUID().AsString(), "", 800, 800) canvas.SetTicks(1, 1) canvas.SetLeftMargin(0.13) canvas.SetBottomMargin(0.11) h2d_qcd.SetTitle("Dijet & Z+Jets%s" % (" (flav matched)" if flav_matched else "")) h2d_qcd.SetLineColor(qgc.QCD_COLOUR) h2d_qcd.SetFillStyle(0) draw_opt = "CANDLEY(00000311)" h2d_qcd.Draw(draw_opt) h2d_qcd.GetXaxis().SetRangeUser(0.7, 2.5) h2d_dyj.SetTitle("Dijet & Z+Jets%s" % (" (flav matched)" if flav_matched else "")) h2d_dyj.SetLineColor(qgc.DY_COLOUR) h2d_dyj.SetFillStyle(0) h2d_dyj.Draw(draw_opt + " SAME") h2d_qcd.GetYaxis().SetTitleOffset(1.7) h2d_qcd.GetXaxis().SetTitleOffset(1.2) leg = ROOT.TLegend(0.5, 0.6, 0.88, 0.88) leg.AddEntry( h2d_dyj, qgc.DY_ZpJ_QFLAV_LABEL if flav_matched else qgc.DY_ZpJ_LABEL, "L") leg.AddEntry( h2d_qcd, qgc.QCD_Dijet_GFLAV_LABEL if flav_matched else qgc.QCD_Dijet_LABEL, "L") leg.Draw() line.SetLineStyle(1) line.Draw() output_filename = os.path.join( plot_dir, "response_vs_genjet_pt_both%s_box.%s" % ("_flavMatched" if flav_matched else "", OUTPUT_FMT)) canvas.SaveAs(output_filename)
def make_1d_plot(root_dir, histname, jet_str, gen_only=False): entries = [] lw = 2 data_line_width = lw msize = 1.1 dijet_cen_data_hist = None if not gen_only: # JETHT/ZEROBIAS DATA dijet_cen_data_hist = grab_obj( os.path.join(root_dir, qgc.JETHT_ZB_FILENAME), histname) # use already merged jetht+zb qcd_cen_kwargs_data = dict(line_color=qgc.JETHT_COLOUR, line_width=data_line_width, fill_color=qgc.JETHT_COLOUR, marker_color=qgc.JETHT_COLOUR, marker_style=cu.Marker.get(qgc.QCD_MARKER), marker_size=msize, label="Data") entries.append((dijet_cen_data_hist, qcd_cen_kwargs_data)) # MG+PYTHIA QCD MC dijet_mgpy_hist = grab_obj(os.path.join(root_dir, qgc.QCD_FILENAME), histname) qcd_cen_kwargs_mc = dict(line_color=qgc.QCD_COLOUR, line_width=lw, fill_color=qgc.QCD_COLOUR, marker_color=qgc.QCD_COLOUR, marker_style=cu.Marker.get(qgc.QCD_MARKER), marker_size=0, label="MG+PY8", subplot=dijet_cen_data_hist) entries.append((dijet_mgpy_hist, qcd_cen_kwargs_mc)) # HERWIG++ QCD col2 = qgc.QCD_COLOURS[3] dijet_hpp_hist = grab_obj(os.path.join(root_dir, qgc.QCD_HERWIG_FILENAME), histname) qcd_cen_kwargs_mc3 = dict(line_color=col2, line_width=lw, fill_color=col2, marker_color=col2, marker_style=cu.Marker.get(qgc.QCD_MARKER), marker_size=0, label="H++", subplot=dijet_cen_data_hist) dijet_hpp_hist.Scale(TOTAL_LUMI) entries.append((dijet_hpp_hist, qcd_cen_kwargs_mc3)) # HERWIG++ QCD WITH PT REWEIGHT col3 = ROOT.kRed dijet_hpp_hist_reweight = grab_obj( os.path.join( root_dir, "uhh2.AnalysisModuleRunner.MC.MC_HERWIG_QCD_PtReweight.root"), histname) qcd_cen_kwargs_mc4 = dict(line_color=col3, line_width=lw, fill_color=col3, line_style=2, marker_color=col3, marker_style=cu.Marker.get(qgc.QCD_MARKER), marker_size=0, label="H++ (p_{T} reweighted)", subplot=dijet_cen_data_hist) dijet_hpp_hist_reweight.Scale(TOTAL_LUMI) entries.append((dijet_hpp_hist_reweight, qcd_cen_kwargs_mc4)) # Must do un normed first, since it manipulates original objects rebin = 1 p = qgp.make_comparison_plot_ingredients(entries, rebin=rebin, normalise_hist=False, mean_rel_error=0.4, title="%s\n%s" % (jet_str, qgc.Dijet_LABEL), xlim=[0, 4000], ylim=[1E-1, 1E8], subplot_type='ratio', subplot_title="MC / Data", subplot_limits=(0.5, 1.5)) output_filename = os.path.join( root_dir, "plots_dijet_vs_qcd_mc_vs_data_pt_reweight", "dj_%s.%s" % (histname.replace("/", "_"), OUTPUT_FMT)) draw_opt = "NOSTACK HISTE" p.plot(draw_opt) p.set_logx() p.set_logy() dirname = os.path.dirname(output_filename) if not os.path.isdir(dirname): os.makedirs(dirname) p.save(output_filename) p = qgp.make_comparison_plot_ingredients(entries, rebin=rebin, normalise_hist=True, mean_rel_error=0.4, title="%s\n%s" % (jet_str, qgc.Dijet_LABEL), xlim=[10, 4000], ylim=[1E-10, 50], subplot_type='ratio', subplot_title="MC / Data", subplot_limits=(0.5, 1.5)) output_filename = os.path.join( root_dir, "plots_dijet_vs_qcd_mc_vs_data_pt_reweight", "dj_%s_normed.%s" % (histname.replace("/", "_"), OUTPUT_FMT)) p.plot(draw_opt) p.set_logx() p.set_logy() p.save(output_filename)
def do_plots(root_dir): # QG variable plots pt_bins = qgc.PT_BINS[:] var_list = qgc.COMMON_VARS var_prepend = "" radius, pus = cu.get_jet_config_from_dirname(root_dir) jet_str = "AK%s PF %s" % (radius.upper(), pus.upper()) for gr_append in ["", "_groomed"]: if gr_append == "_groomed": print("Doing groomed plots...") else: print("Doing ungroomed plots...") if gr_append == "": make_1d_plot(root_dir, "Dijet_gen/pt_dijet_ave", jet_str, gen_only=True) make_1d_plot(root_dir, "Dijet_tighter/pt_jet", jet_str) dj_cen_dirname = "Dijet_QG_central_tighter%s" % (gr_append) dj_fwd_dirname = "Dijet_QG_forward_tighter%s" % (gr_append) for ang in var_list[:]: print("...Doing", ang.name) v = "%s%s_vs_pt" % (var_prepend, ang.var) dijet_cen_2d_entries = [] dijet_fwd_2d_entries = [] dijet_cen_1d_entries = [] dijet_fwd_1d_entries = [] for pt_ind, (start_val, end_val) in enumerate(pt_bins): entries = [] dijet_cen_entries = [] dijet_fwd_entries = [] # Get all plots lw = 2 msize = 1.1 data_line_width = lw #################### # DIJET CENTRAL REGION #################### # JETHT/ZEROBIAS DATA h2d_qcd_cen_data = grab_obj( os.path.join(root_dir, qgc.JETHT_ZB_FILENAME), "%s/%s" % (dj_cen_dirname, v)) # use already merged jetht+zb qcd_cen_kwargs_data = dict(line_color=qgc.JETHT_COLOUR, line_width=data_line_width, fill_color=qgc.JETHT_COLOUR, marker_color=qgc.JETHT_COLOUR, marker_style=cu.Marker.get( qgc.QCD_MARKER), marker_size=msize, label="Data") dijet_cen_data_hist = qgp.get_projection_plot( h2d_qcd_cen_data, start_val, end_val) entries.append((dijet_cen_data_hist, qcd_cen_kwargs_data)) dijet_cen_entries.append( (dijet_cen_data_hist, qcd_cen_kwargs_data)) if pt_ind == 0: dijet_cen_2d_entries.append( (h2d_qcd_cen_data, qcd_cen_kwargs_data)) # MG+PYTHIA QCD MC h2d_qcd_cen_mc = grab_obj( os.path.join(root_dir, qgc.QCD_FILENAME), "%s/%s" % (dj_cen_dirname, v)) qcd_cen_kwargs_mc = dict(line_color=qgc.QCD_COLOUR, line_width=lw, fill_color=qgc.QCD_COLOUR, marker_color=qgc.QCD_COLOUR, marker_style=cu.Marker.get( qgc.QCD_MARKER), marker_size=0, label="MG+PY8", subplot=dijet_cen_data_hist) # h2d_qcd_cen_mc.Scale(35860) dijet_mgpy_hist = qgp.get_projection_plot( h2d_qcd_cen_mc, start_val, end_val) entries.append((dijet_mgpy_hist, qcd_cen_kwargs_mc)) dijet_cen_entries.append((dijet_mgpy_hist, qcd_cen_kwargs_mc)) if pt_ind == 0: dijet_cen_2d_entries.append( (h2d_qcd_cen_mc, qcd_cen_kwargs_mc)) # PYTHIA ONLY # col = qgc.QCD_COLOURS[2] # h2d_qcd_cen_mc2 = grab_obj(os.path.join(root_dir, qgc.QCD_PYTHIA_ONLY_FILENAME), "%s/%s" % (dj_cen_dirname, v)) # qcd_cen_kwargs_mc2 = dict(line_color=col, line_width=lw, fill_color=col, # marker_color=col, marker_style=cu.Marker.get(qgc.QCD_MARKER), marker_size=0, # label="PY8", # subplot=dijet_cen_data_hist) # # h2d_qcd_cen_mc2.Scale(35860) # entries.append((qgp.get_projection_plot(h2d_qcd_cen_mc2, start_val, end_val), qcd_cen_kwargs_mc2)) # dijet_cen_entries.append((qgp.get_projection_plot(h2d_qcd_cen_mc2, start_val, end_val), qcd_cen_kwargs_mc2)) # if pt_ind == 0: # dijet_cen_2d_entries.append((h2d_qcd_cen_mc2, qcd_cen_kwargs_mc2)) # HERWIG++ QCD col2 = qgc.QCD_COLOURS[3] h2d_qcd_cen_mc3 = grab_obj( os.path.join(root_dir, qgc.QCD_HERWIG_FILENAME), "%s/%s" % (dj_cen_dirname, v)) qcd_cen_kwargs_mc3 = dict(line_color=col2, line_width=lw, fill_color=col2, marker_color=col2, marker_style=cu.Marker.get( qgc.QCD_MARKER), marker_size=0, label="H++", subplot=dijet_cen_data_hist) h2d_qcd_cen_mc3.Scale(TOTAL_LUMI) dijet_hpp_hist = qgp.get_projection_plot( h2d_qcd_cen_mc3, start_val, end_val) entries.append((dijet_hpp_hist, qcd_cen_kwargs_mc3)) dijet_cen_entries.append((dijet_hpp_hist, qcd_cen_kwargs_mc3)) if pt_ind == 0: dijet_cen_2d_entries.append( (h2d_qcd_cen_mc3, qcd_cen_kwargs_mc3)) # HERWIG++ QCD WITH PT REWEIGHT col3 = ROOT.kRed h2d_qcd_cen_mc4 = grab_obj( os.path.join( root_dir, "uhh2.AnalysisModuleRunner.MC.MC_HERWIG_QCD_PtReweight.root" ), "%s/%s" % (dj_cen_dirname, v)) qcd_cen_kwargs_mc4 = dict(line_color=col3, line_width=lw, fill_color=col3, marker_color=col3, marker_style=cu.Marker.get( qgc.QCD_MARKER), marker_size=0, label="H++ (p_{T} reweighted)", subplot=dijet_cen_data_hist) h2d_qcd_cen_mc4.Scale(TOTAL_LUMI) dijet_hpp_hist_reweight = qgp.get_projection_plot( h2d_qcd_cen_mc4, start_val, end_val) entries.append((dijet_hpp_hist_reweight, qcd_cen_kwargs_mc4)) dijet_cen_entries.append( (dijet_hpp_hist_reweight, qcd_cen_kwargs_mc4)) if pt_ind == 0: dijet_cen_2d_entries.append( (h2d_qcd_cen_mc4, qcd_cen_kwargs_mc4)) #################### # DIJET FORWARD REGION #################### # JETHT/ZEROBIAS DATA h2d_qcd_fwd_data = grab_obj( os.path.join(root_dir, qgc.JETHT_ZB_FILENAME), "%s/%s" % (dj_fwd_dirname, v)) # use already merged jetht+zb # h2d_zb_data = grab_obj(os.path.join(root_dir, qgc.ZB_FILENAME), "%s/%s" % (dj_cen_dirname, v)) # h2d_zb_data.Scale(1235009.27580634) # h2d_qcd_cen_data.Add(h2d_zb_data) qcd_fwd_kwargs_data = dict(line_color=qgc.JETHT_COLOUR, line_width=data_line_width, fill_color=qgc.JETHT_COLOUR, marker_color=qgc.JETHT_COLOUR, marker_style=cu.Marker.get( qgc.QCD_MARKER), marker_size=msize, label="Data") dijet_fwd_data_hist = qgp.get_projection_plot( h2d_qcd_fwd_data, start_val, end_val) entries.append((dijet_fwd_data_hist, qcd_fwd_kwargs_data)) dijet_fwd_entries.append( (dijet_fwd_data_hist, qcd_fwd_kwargs_data)) if pt_ind == 0: dijet_fwd_2d_entries.append( (h2d_qcd_fwd_data, qcd_fwd_kwargs_data)) # MG+PYTHIA QCD MC h2d_qcd_fwd_mc = grab_obj( os.path.join(root_dir, qgc.QCD_FILENAME), "%s/%s" % (dj_fwd_dirname, v)) qcd_fwd_kwargs_mc = dict(line_color=qgc.QCD_COLOUR, line_width=lw, fill_color=qgc.QCD_COLOUR, marker_color=qgc.QCD_COLOUR, marker_style=cu.Marker.get( qgc.QCD_MARKER), marker_size=0, label="MG+PY8", subplot=dijet_fwd_data_hist) # h2d_qcd_fwd_mc.Scale(35860) dijet_mgpy_hist = qgp.get_projection_plot( h2d_qcd_fwd_mc, start_val, end_val) entries.append((dijet_mgpy_hist, qcd_fwd_kwargs_mc)) dijet_fwd_entries.append((dijet_mgpy_hist, qcd_fwd_kwargs_mc)) if pt_ind == 0: dijet_fwd_2d_entries.append( (h2d_qcd_fwd_mc, qcd_fwd_kwargs_mc)) # PYTHIA ONLY # col = qgc.QCD_COLOURS[2] # h2d_qcd_fwd_mc2 = grab_obj(os.path.join(root_dir, qgc.QCD_PYTHIA_ONLY_FILENAME), "%s/%s" % (dj_fwd_dirname, v)) # qcd_fwd_kwargs_mc2 = dict(line_color=col, line_width=lw, fill_color=col, # marker_color=col, marker_style=cu.Marker.get(qgc.QCD_MARKER), marker_size=0, # label="PY8", # subplot=dijet_fwd_data_hist) # # h2d_qcd_fwd_mc2.Scale(35860) # entries.append((qgp.get_projection_plot(h2d_qcd_fwd_mc2, start_val, end_val), qcd_fwd_kwargs_mc2)) # dijet_fwd_entries.append((qgp.get_projection_plot(h2d_qcd_fwd_mc2, start_val, end_val), qcd_fwd_kwargs_mc2)) # if pt_ind == 0: # dijet_fwd_2d_entries.append((h2d_qcd_fwd_mc2, qcd_fwd_kwargs_mc2)) # HERWIG++ QCD col2 = qgc.QCD_COLOURS[3] h2d_qcd_fwd_mc3 = grab_obj( os.path.join(root_dir, qgc.QCD_HERWIG_FILENAME), "%s/%s" % (dj_fwd_dirname, v)) qcd_fwd_kwargs_mc3 = dict(line_color=col2, line_width=lw, fill_color=col2, marker_color=col2, marker_style=cu.Marker.get( qgc.QCD_MARKER), marker_size=0, label="H++", subplot=dijet_fwd_data_hist) h2d_qcd_fwd_mc3.Scale(TOTAL_LUMI) dijet_hpp_hist = qgp.get_projection_plot( h2d_qcd_fwd_mc3, start_val, end_val) entries.append((dijet_hpp_hist, qcd_fwd_kwargs_mc3)) dijet_fwd_entries.append((dijet_hpp_hist, qcd_fwd_kwargs_mc3)) if pt_ind == 0: dijet_fwd_2d_entries.append( (h2d_qcd_fwd_mc3, qcd_fwd_kwargs_mc3)) col3 = ROOT.kRed h2d_qcd_fwd_mc4 = grab_obj( os.path.join( root_dir, "uhh2.AnalysisModuleRunner.MC.MC_HERWIG_QCD_PtReweight.root" ), "%s/%s" % (dj_fwd_dirname, v)) qcd_fwd_kwargs_mc4 = dict(line_color=col3, line_width=lw, fill_color=col3, marker_color=col3, marker_style=cu.Marker.get( qgc.QCD_MARKER), marker_size=0, label="H++ (p_{T} reweighted)", subplot=dijet_fwd_data_hist) h2d_qcd_fwd_mc4.Scale(TOTAL_LUMI) dijet_hpp_hist_reweight = qgp.get_projection_plot( h2d_qcd_fwd_mc4, start_val, end_val) entries.append((dijet_hpp_hist_reweight, qcd_fwd_kwargs_mc4)) dijet_fwd_entries.append( (dijet_hpp_hist_reweight, qcd_fwd_kwargs_mc4)) if pt_ind == 0: dijet_fwd_2d_entries.append( (h2d_qcd_fwd_mc4, qcd_fwd_kwargs_mc4)) dijet_cen_1d_entries.append(dijet_cen_entries) dijet_fwd_1d_entries.append(dijet_fwd_entries) ################# # SETUP PLOTTING ################# rebin = 2 v_lower = v.lower() if "multiplicity" in v_lower: rebin = 2 elif "flavour" in v_lower or "thrust" in v_lower: rebin = 1 elif 'ptd' in v_lower: rebin = 2 xlim = None if "width" in v_lower or "ptd" in v_lower: xlim = (0, 1) elif "thrust" in v_lower: xlim = (0, 0.5) elif "multiplicity" in v_lower and "ak4" in root_dir.lower(): if end_val <= 150: xlim = (0, 50) else: xlim = (0, 80) ylim = None if "flavour" in v_lower: ylim = (0, 1) # elif "lha" in v_lower: # ylim = (0, 5) plot_dir = os.path.join( root_dir, "plots_dijet_vs_qcd_mc_vs_data%s_pt_reweight" % (gr_append)) subplot_title = "MC / Data" subplot_limits = (0.5, 1.5) xlabel = ang.name + " (" + ang.lambda_str + ")" if gr_append is not "": xlabel = "Groomed " + ang.name + " (" + ang.lambda_str + ")" # dj+zpj # qgp.do_comparison_plot(entries, # "%s/ptBinned/%s_pt%dto%d.%s" % (plot_dir, v, start_val, end_val, OUTPUT_FMT), # rebin=rebin, # title="%d < p_{T}^{jet} < %d GeV\n%s" % (start_val, end_val, jet_str), # xtitle=ang.name + " (" + ang.lambda_str + ")", # xlim=xlim, ylim=ylim, # subplot_type='ratio', # subplot_title=subplot_title, # subplot_limits=subplot_limits) # dj central only qgp.do_comparison_plot( dijet_cen_entries, "%s/ptBinned/%s_pt%dto%d_dijet_central.%s" % (plot_dir, v, start_val, end_val, OUTPUT_FMT), rebin=rebin, title="%d < p_{T}^{jet} < %d GeV\n%s\n%s" % (start_val, end_val, jet_str, qgc.Dijet_CEN_LABEL), xtitle=xlabel, xlim=xlim, ylim=ylim, subplot_type='ratio', subplot_title=subplot_title, subplot_limits=subplot_limits) # dj forward only qgp.do_comparison_plot( dijet_fwd_entries, "%s/ptBinned/%s_pt%dto%d_dijet_forward.%s" % (plot_dir, v, start_val, end_val, OUTPUT_FMT), rebin=rebin, title="%d < p_{T}^{jet} < %d GeV\n%s\n%s" % (start_val, end_val, jet_str, qgc.Dijet_FWD_LABEL), xtitle=xlabel, xlim=xlim, ylim=ylim, subplot_type='ratio', subplot_title=subplot_title, subplot_limits=subplot_limits) # Do overall summary plots across all pt bins # ------------------------------------------------------------------ ylim_mean = None if "width" in v_lower or "ptd" in v_lower: ylim_mean = (0, 0.4) elif "thrust" in v_lower: ylim_mean = (0, 0.5) elif "multiplicity" in v_lower and "ak4" in root_dir.lower(): ylim_mean = (0, 100) ylim_mean = (0, 80) if end_val < 150: ylim_mean = (0, 50) ylim_mean = None ylim_rms = None # Setup variable names for MPL marker = "" if "_" in ang.name or "^" in ang.name: marker = "$" var_label = marker + ang.name + marker + " ($%s$)" % ang.lambda_str if gr_append != "": var_label = "Groomed " + marker + ang.name + marker + " ($%s$)" % ang.lambda_str qgp.do_mean_rms_summary_plot( dijet_cen_1d_entries[:], pt_bins[:], "%s/ptBinned/%s_box_dijet_cen_mpl.%s" % (plot_dir, v, OUTPUT_FMT), var_label=var_label, xlim=(50, 2000), ylim_mean=ylim_mean, ylim_rms=ylim_rms, region_title="%s jets in dijet (central)" % (jet_str)) qgp.do_mean_rms_summary_plot( dijet_fwd_1d_entries[:], pt_bins[:], "%s/ptBinned/%s_box_dijet_fwd_mpl.%s" % (plot_dir, v, OUTPUT_FMT), var_label=var_label, xlim=(50, 2000), ylim_mean=ylim_mean, ylim_rms=ylim_rms, region_title="%s jets in dijet (forward)" % (jet_str))
def do_pt_min_delta_plots(sources, plot_dir="deltas_ptmin", zpj_dirname="ZPlusJets_QG", dj_dirname="Dijet_QG", var_list=None, var_prepend="", flavour_tag=False, save_component_hists=False, ofmt="pdf"): """Do plots comparing power of different ptMin cuts""" var_list = var_list or COMMON_VARS ptmin_bins = [50, 100, 200, 400, 800][:-1] zpj_flav = "q" if flavour_tag else "" dj_flav = "g" if flavour_tag else "" output_append = "_flavMatched" if flavour_tag else "" for ang in var_list: v = "%s%s_vs_pt" % (var_prepend, ang.var) graph_contribs, bin_labels = [], [] for source_ind, source in enumerate(sources): deltas, components = [], [] # for the component comparison plot colours = [ ROOT.kBlue, ROOT.kRed, ROOT.kGreen + 2, ROOT.kOrange - 3, ROOT.kMagenta, ROOT.kAzure + 1 ] for pt_min, this_colour in zip(ptmin_bins, colours): h2d_dyj = grab_obj( os.path.join(source['root_dir'], qgc.DY_FILENAME), "%s_ptMin_%d/%s%s" % (source.get( 'zpj_dirname', zpj_dirname), pt_min, zpj_flav, v)) h2d_qcd = grab_obj( os.path.join(source['root_dir'], qgc.QCD_FILENAME), "%s_ptMin_%d/%s%s" % (source.get('dj_dirname', dj_dirname), pt_min, dj_flav, v)) start_val, end_val = 80, 2000 h_dy = get_projection_plot(h2d_dyj, start_val, end_val) if (h_dy.Integral() > 0): h_dy.Scale(1. / (h_dy.GetBinWidth(1) * h_dy.Integral())) h_qcd = get_projection_plot(h2d_qcd, start_val, end_val) if (h_qcd.Integral() > 0): h_qcd.Scale(1. / (h_qcd.GetBinWidth(1) * h_qcd.Integral())) ddelta_hist = get_ddelta_plot(h_dy, h_qcd) c = Contribution(ddelta_hist, line_width=1, marker_color=this_colour, line_color=this_colour, fill_color=this_colour, label="p_{T}^{Min} = %d GeV" % pt_min, rebin_hist=1) components.append(c) deltas.append(calculate_delta(ddelta_hist)) if source_ind == 0: bin_labels.append("%d" % pt_min) if save_component_hists: # need to clone here otherwise the colour will be set inside # plot_delta, which in turn will nullify whatever colours we chose above. plot_ddelta( ddelta_hist.Clone(ROOT.TUUID().AsString()), "%s/delta_ptmin_components/%s_ddelta_ptMin_%d%s.%s" % (plot_dir, ang.var, pt_min, output_append, ofmt), xtitle=ang.name + " (" + ang.lambda_str + ")", ytitle="d#Delta/d" + ang.lambda_str) if save_component_hists: # plot all differential distributions for this pt bin on one plot p = Plot(components, what="hist", xtitle=ang.name, ytitle="p.d.f") p.plot("NOSTACK HISTE") p.save( "%s/delta_ptmin_components/%s_ddelta_ptMin_comparison%s.%s" % (plot_dir, ang.var, output_append, ofmt)) gr = construct_deltas_graph(deltas) gr.SetName(source.get("label", "")) if 'style' in source and 'line_width' not in source['style']: source['style']['line_width'] = 2 c = Contribution(gr, label=source.get("label", "").lstrip(", "), marker_style=0, **source.get("style", {})) graph_contribs.append(c) do_deltas_plot(graph_contribs, "%s/ptMins_%s%s.%s" % (plot_dir, ang.var, output_append, ofmt), bin_labels=bin_labels, title="%s [%s]" % (ang.name, ang.lambda_str), xtitle="p_{T}^{min} [GeV]")
def do_plots(root_dir, title): # QG variable plots pt_bins = qgc.PT_BINS[:] var_list = qgc.COMMON_VARS var_prepend = "" radius, pus = cu.get_jet_config_from_dirname(root_dir) jet_str = "AK%s PF %s" % (radius.upper(), pus.upper()) for gr_append in ["", "_groomed"][:1]: if gr_append == "_groomed": print("Doing groomed plots...") else: print("Doing ungroomed plots...") zpj_dirname = "ZPlusJets_QG%s" % (gr_append) dj_cen_dirname = "Dijet_QG_central_tighter%s" % (gr_append) dj_fwd_dirname = "Dijet_QG_forward_tighter%s" % (gr_append) for ang in var_list[:]: print("...Doing", ang.name) v = "%s%s_vs_pt" % (var_prepend, ang.var) zpj_2d_entries = [] dijet_cen_2d_entries = [] dijet_fwd_2d_entries = [] zpj_1d_entries = [] dijet_cen_1d_entries = [] dijet_fwd_1d_entries = [] for pt_ind, (start_val, end_val) in enumerate(pt_bins): entries = [] zpj_entries = [] dijet_cen_entries = [] dijet_fwd_entries = [] # Get all plots lw = 2 msize = 1.1 data_line_width = lw mc_msize = 1E-3 # small enough to not be seen but not 0 - otherwise the horizontal lines on error bars don't get drawn mgpy_label = "MG5+Pythia8" hpp_label = "Herwig++" #################### # Z+JETS REGION #################### # TODO: add these # SINGLE MU DATA # if os.path.isfile(os.path.join(root_dir, qgc.SINGLE_MU_FILENAME)): # h2d_dyj_data = grab_obj(os.path.join(root_dir, qgc.SINGLE_MU_FILENAME), "%s/%s" % (zpj_dirname, v)) # dy_kwargs_data = dict(line_color=qgc.SINGLE_MU_COLOUR, line_width=data_line_width, fill_color=qgc.SINGLE_MU_COLOUR, # marker_color=qgc.SINGLE_MU_COLOUR, marker_style=cu.Marker.get(qgc.DY_MARKER), marker_size=msize*0.7, # label="Data") # zpj_data_hist = qgp.get_projection_plot(h2d_dyj_data, start_val, end_val) # entries.append((zpj_data_hist, dy_kwargs_data)) # zpj_entries.append((zpj_data_hist, dy_kwargs_data)) # if pt_ind == 0: # zpj_2d_entries.append((h2d_dyj_data, dy_kwargs_data)) # # PYTHIA DY MC # if os.path.isfile(os.path.join(root_dir, qgc.DY_FILENAME)): # h2d_dyj_mc = grab_obj(os.path.join(root_dir, qgc.DY_FILENAME), "%s/%s" % (zpj_dirname, v)) # dy_kwargs_mc = dict(line_color=qgc.DY_COLOUR, line_width=lw, fill_color=qgc.DY_COLOUR, # marker_color=qgc.DY_COLOUR, marker_style=cu.Marker.get(qgc.DY_MARKER), marker_size=mc_msize, # label=mgpy_label, # subplot=zpj_data_hist) # entries.append((qgp.get_projection_plot(h2d_dyj_mc, start_val, end_val), dy_kwargs_mc)) # zpj_entries.append((qgp.get_projection_plot(h2d_dyj_mc, start_val, end_val), dy_kwargs_mc)) # if pt_ind == 0: # zpj_2d_entries.append((h2d_dyj_mc, dy_kwargs_mc)) # # HERWIG++ DY # if os.path.isfile(os.path.join(root_dir, qgc.DY_HERWIG_FILENAME)): # h2d_dyj_mc_hpp = grab_obj(os.path.join(root_dir, qgc.DY_HERWIG_FILENAME), "%s/%s" % (zpj_dirname, v)) # col_hpp = qgc.DY_COLOURS[2] # dy_kwargs_mc_hpp = dict(line_color=col_hpp, line_width=lw, fill_color=col_hpp, # marker_color=col_hpp, marker_style=cu.Marker.get(qgc.DY_MARKER), marker_size=mc_msize, # label=hpp_label, # subplot=zpj_data_hist) # entries.append((qgp.get_projection_plot(h2d_dyj_mc_hpp, start_val, end_val), dy_kwargs_mc_hpp)) # zpj_entries.append((qgp.get_projection_plot(h2d_dyj_mc_hpp, start_val, end_val), dy_kwargs_mc_hpp)) # if pt_ind == 0: # zpj_2d_entries.append((h2d_dyj_mc_hpp, dy_kwargs_mc_hpp)) # MG+HERWIG++ DY # if end_val < 151: # h2d_dyj_mc3 = grab_obj(os.path.join(root_dir, qgc.DY_MG_HERWIG_FILENAME), "%s/%s" % (zpj_dirname, v)) # col4 = qgc.DY_COLOURS[3] # dy_kwargs_mc3 = dict(line_color=col4, line_width=lw, fill_color=col4, # marker_color=col4, marker_style=cu.Marker.get(qgc.DY_MARKER), marker_size=0, # label="MG+Herwig++", # subplot=zpj_data_hist) # entries.append((qgp.get_projection_plot(h2d_dyj_mc3, start_val, end_val), dy_kwargs_mc3)) # zpj_entries.append((qgp.get_projection_plot(h2d_dyj_mc3, start_val, end_val), dy_kwargs_mc3)) # if pt_ind == 0: # zpj_2d_entries.append((h2d_dyj_mc3, dy_kwargs_mc3)) # else: # zpj_entries.append(None) #################### # DIJET CENTRAL REGION #################### # JETHT/ZEROBIAS DATA if os.path.isfile(os.path.join(root_dir, qgc.JETHT_ZB_FILENAME)): h2d_qcd_cen_data = grab_obj( os.path.join(root_dir, qgc.JETHT_ZB_FILENAME), "%s/%s" % (dj_cen_dirname, v)) # use already merged jetht+zb qcd_cen_kwargs_data = dict(line_color=qgc.JETHT_COLOUR, line_width=data_line_width, fill_color=qgc.JETHT_COLOUR, marker_color=qgc.JETHT_COLOUR, marker_style=cu.Marker.get( qgc.QCD_MARKER), marker_size=msize, label="Data") dijet_cen_data_hist = qgp.get_projection_plot( h2d_qcd_cen_data, start_val, end_val) entries.append((dijet_cen_data_hist, qcd_cen_kwargs_data)) dijet_cen_entries.append( (dijet_cen_data_hist, qcd_cen_kwargs_data)) if pt_ind == 0: dijet_cen_2d_entries.append( (h2d_qcd_cen_data, qcd_cen_kwargs_data)) # MG+PYTHIA QCD MC if os.path.isfile(os.path.join(root_dir, qgc.QCD_FILENAME)): h2d_qcd_cen_mc = grab_obj( os.path.join(root_dir, qgc.QCD_FILENAME), "%s/%s" % (dj_cen_dirname, v)) qcd_cen_kwargs_mc = dict( line_color=qgc.QCD_COLOUR, line_width=lw, fill_color=qgc.QCD_COLOUR, marker_color=qgc.QCD_COLOUR, marker_style=cu.Marker.get(qgc.QCD_MARKER), marker_size=mc_msize, label=mgpy_label + "\n[NNPDF30_lo_as_0130, default]", subplot=dijet_cen_data_hist) dijet_mgpy_hist = qgp.get_projection_plot( h2d_qcd_cen_mc, start_val, end_val) entries.append((dijet_mgpy_hist, qcd_cen_kwargs_mc)) dijet_cen_entries.append( (dijet_mgpy_hist, qcd_cen_kwargs_mc)) if pt_ind == 0: dijet_cen_2d_entries.append( (h2d_qcd_cen_mc, qcd_cen_kwargs_mc)) # Add NNPDF30_lo_as_0118 fname = "uhh2.AnalysisModuleRunner.MC.MC_QCD_NNPDF30_lo_as_0118.root" if os.path.isfile(os.path.join(root_dir, fname)): h2d_qcd_cen_mc_pdf2 = grab_obj( os.path.join(root_dir, fname), "%s/%s" % (dj_cen_dirname, v)) col = qgc.QCD_COLOURS[4] qcd_cen_kwargs_mc2 = dict( line_color=col, line_width=lw, fill_color=col, marker_color=col, marker_style=cu.Marker.get(qgc.QCD_MARKER), marker_size=mc_msize, label=mgpy_label + "\n[NNPDF30_lo_as_0118]", subplot=dijet_cen_data_hist) dijet_mgpy_hist2 = qgp.get_projection_plot( h2d_qcd_cen_mc_pdf2, start_val, end_val) entries.append((dijet_mgpy_hist2, qcd_cen_kwargs_mc2)) dijet_cen_entries.append( (dijet_mgpy_hist2, qcd_cen_kwargs_mc2)) if pt_ind == 0: dijet_cen_2d_entries.append( (h2d_qcd_cen_mc_pdf2, qcd_cen_kwargs_mc2)) # Add HERAPDF20_LO_EIG fname = "uhh2.AnalysisModuleRunner.MC.MC_QCD_HERAPDF20_LO_EIG.root" if os.path.isfile(os.path.join(root_dir, fname)): h2d_qcd_cen_mc_pdf3 = grab_obj( os.path.join(root_dir, fname), "%s/%s" % (dj_cen_dirname, v)) col = qgc.QCD_COLOURS[5] qcd_cen_kwargs_mc3 = dict( line_color=col, line_width=lw, fill_color=col, marker_color=col, marker_style=cu.Marker.get(qgc.QCD_MARKER), marker_size=mc_msize, label=mgpy_label + "\n[HERAPDF20_LO_EIG]", subplot=dijet_cen_data_hist) dijet_mgpy_hist3 = qgp.get_projection_plot( h2d_qcd_cen_mc_pdf3, start_val, end_val) entries.append((dijet_mgpy_hist3, qcd_cen_kwargs_mc3)) dijet_cen_entries.append( (dijet_mgpy_hist3, qcd_cen_kwargs_mc3)) if pt_ind == 0: dijet_cen_2d_entries.append( (h2d_qcd_cen_mc_pdf3, qcd_cen_kwargs_mc3)) # Add CT14lo fname = "uhh2.AnalysisModuleRunner.MC.MC_QCD_CT14lo.root" if os.path.isfile(os.path.join(root_dir, fname)): h2d_qcd_cen_mc_pdf4 = grab_obj( os.path.join(root_dir, fname), "%s/%s" % (dj_cen_dirname, v)) col = qgc.QCD_COLOURS[6] qcd_cen_kwargs_mc4 = dict(line_color=col, line_width=lw, fill_color=col, marker_color=col, marker_style=cu.Marker.get( qgc.QCD_MARKER), marker_size=mc_msize, label=mgpy_label + "\n[CT14lo]", subplot=dijet_cen_data_hist) dijet_mgpy_hist4 = qgp.get_projection_plot( h2d_qcd_cen_mc_pdf4, start_val, end_val) entries.append((dijet_mgpy_hist4, qcd_cen_kwargs_mc4)) dijet_cen_entries.append( (dijet_mgpy_hist4, qcd_cen_kwargs_mc4)) if pt_ind == 0: dijet_cen_2d_entries.append( (h2d_qcd_cen_mc_pdf4, qcd_cen_kwargs_mc4)) # PYTHIA ONLY # if os.path.isfile(os.path.join(root_dir, qgc.QCD_PYTHIA_ONLY_FILENAME)): # col = qgc.QCD_COLOURS[2] # h2d_qcd_cen_mc2 = grab_obj(os.path.join(root_dir, qgc.QCD_PYTHIA_ONLY_FILENAME), "%s/%s" % (dj_cen_dirname, v)) # qcd_cen_kwargs_mc2 = dict(line_color=col, line_width=lw, fill_color=col, # marker_color=col, marker_style=cu.Marker.get(qgc.QCD_MARKER), marker_size=mc_msize, # label="Pythia8", # subplot=dijet_cen_data_hist) # entries.append((qgp.get_projection_plot(h2d_qcd_cen_mc2, start_val, end_val), qcd_cen_kwargs_mc2)) # dijet_cen_entries.append((qgp.get_projection_plot(h2d_qcd_cen_mc2, start_val, end_val), qcd_cen_kwargs_mc2)) # if pt_ind == 0: # dijet_cen_2d_entries.append((h2d_qcd_cen_mc2, qcd_cen_kwargs_mc2)) # HERWIG++ QCD if os.path.isfile( os.path.join(root_dir, qgc.QCD_HERWIG_FILENAME)): col_hpp = qgc.QCD_COLOURS[3] h2d_qcd_cen_mc_hpp = grab_obj( os.path.join(root_dir, qgc.QCD_HERWIG_FILENAME), "%s/%s" % (dj_cen_dirname, v)) qcd_cen_kwargs_mc_hpp = dict(line_color=col_hpp, line_width=lw, fill_color=col_hpp, marker_color=col_hpp, marker_style=cu.Marker.get( qgc.QCD_MARKER), marker_size=mc_msize, label=hpp_label, subplot=dijet_cen_data_hist) dijet_hpp_hist = qgp.get_projection_plot( h2d_qcd_cen_mc_hpp, start_val, end_val) entries.append((dijet_hpp_hist, qcd_cen_kwargs_mc_hpp)) dijet_cen_entries.append( (dijet_hpp_hist, qcd_cen_kwargs_mc_hpp)) if pt_ind == 0: dijet_cen_2d_entries.append( (h2d_qcd_cen_mc_hpp, qcd_cen_kwargs_mc_hpp)) #################### # DIJET FORWARD REGION #################### # JETHT/ZEROBIAS DATA if os.path.isfile(os.path.join(root_dir, qgc.JETHT_ZB_FILENAME)): h2d_qcd_fwd_data = grab_obj( os.path.join(root_dir, qgc.JETHT_ZB_FILENAME), "%s/%s" % (dj_fwd_dirname, v)) # use already merged jetht+zb qcd_fwd_kwargs_data = dict( line_color=qgc.JETHT_COLOUR, line_width=data_line_width, fill_color=qgc.JETHT_COLOUR, marker_color=qgc.JETHT_COLOUR, marker_style=cu.Marker.get('triangleDown'), marker_size=msize, label="Data") dijet_fwd_data_hist = qgp.get_projection_plot( h2d_qcd_fwd_data, start_val, end_val) entries.append((dijet_fwd_data_hist, qcd_fwd_kwargs_data)) dijet_fwd_entries.append( (dijet_fwd_data_hist, qcd_fwd_kwargs_data)) if pt_ind == 0: dijet_fwd_2d_entries.append( (h2d_qcd_fwd_data, qcd_fwd_kwargs_data)) # MG+PYTHIA QCD MC if os.path.isfile(os.path.join(root_dir, qgc.QCD_FILENAME)): h2d_qcd_fwd_mc = grab_obj( os.path.join(root_dir, qgc.QCD_FILENAME), "%s/%s" % (dj_fwd_dirname, v)) qcd_fwd_kwargs_mc = dict( line_color=qgc.QCD_COLOUR, line_width=lw, fill_color=qgc.QCD_COLOUR, marker_color=qgc.QCD_COLOUR, marker_style=cu.Marker.get(qgc.QCD_MARKER), marker_size=mc_msize, label=mgpy_label + "\n[NNPDF30_lo_as_0130, default]", subplot=dijet_fwd_data_hist) dijet_mgpy_hist = qgp.get_projection_plot( h2d_qcd_fwd_mc, start_val, end_val) entries.append((dijet_mgpy_hist, qcd_fwd_kwargs_mc)) dijet_fwd_entries.append( (dijet_mgpy_hist, qcd_fwd_kwargs_mc)) if pt_ind == 0: dijet_fwd_2d_entries.append( (h2d_qcd_fwd_mc, qcd_fwd_kwargs_mc)) # Add NNPDF30_lo_as_0118 fname = "uhh2.AnalysisModuleRunner.MC.MC_QCD_NNPDF30_lo_as_0118.root" if os.path.isfile(os.path.join(root_dir, fname)): h2d_qcd_fwd_mc_pdf2 = grab_obj( os.path.join(root_dir, fname), "%s/%s" % (dj_fwd_dirname, v)) col = qgc.QCD_COLOURS[4] qcd_fwd_kwargs_mc2 = dict( line_color=col, line_width=lw, fill_color=col, marker_color=col, marker_style=cu.Marker.get(qgc.QCD_MARKER), marker_size=mc_msize, label=mgpy_label + "\n[NNPDF30_lo_as_0118]", subplot=dijet_fwd_data_hist) dijet_mgpy_hist2 = qgp.get_projection_plot( h2d_qcd_fwd_mc_pdf2, start_val, end_val) entries.append((dijet_mgpy_hist2, qcd_fwd_kwargs_mc2)) dijet_fwd_entries.append( (dijet_mgpy_hist2, qcd_fwd_kwargs_mc2)) if pt_ind == 0: dijet_fwd_2d_entries.append( (h2d_qcd_fwd_mc_pdf2, qcd_fwd_kwargs_mc2)) # Add HERAPDF20_LO_EIG fname = "uhh2.AnalysisModuleRunner.MC.MC_QCD_HERAPDF20_LO_EIG.root" if os.path.isfile(os.path.join(root_dir, fname)): h2d_qcd_fwd_mc_pdf3 = grab_obj( os.path.join(root_dir, fname), "%s/%s" % (dj_fwd_dirname, v)) col = qgc.QCD_COLOURS[5] qcd_fwd_kwargs_mc3 = dict( line_color=col, line_width=lw, fill_color=col, marker_color=col, marker_style=cu.Marker.get(qgc.QCD_MARKER), marker_size=mc_msize, label=mgpy_label + "\n[HERAPDF20_LO_EIG]", subplot=dijet_fwd_data_hist) dijet_mgpy_hist3 = qgp.get_projection_plot( h2d_qcd_fwd_mc_pdf3, start_val, end_val) entries.append((dijet_mgpy_hist3, qcd_fwd_kwargs_mc3)) dijet_fwd_entries.append( (dijet_mgpy_hist3, qcd_fwd_kwargs_mc3)) if pt_ind == 0: dijet_fwd_2d_entries.append( (h2d_qcd_fwd_mc_pdf3, qcd_fwd_kwargs_mc3)) # Add CT14lo fname = "uhh2.AnalysisModuleRunner.MC.MC_QCD_CT14lo.root" if os.path.isfile(os.path.join(root_dir, fname)): h2d_qcd_fwd_mc_pdf4 = grab_obj( os.path.join(root_dir, fname), "%s/%s" % (dj_fwd_dirname, v)) col = qgc.QCD_COLOURS[6] qcd_fwd_kwargs_mc4 = dict(line_color=col, line_width=lw, fill_color=col, marker_color=col, marker_style=cu.Marker.get( qgc.QCD_MARKER), marker_size=mc_msize, label=mgpy_label + "\n[CT14lo]", subplot=dijet_fwd_data_hist) dijet_mgpy_hist4 = qgp.get_projection_plot( h2d_qcd_fwd_mc_pdf4, start_val, end_val) entries.append((dijet_mgpy_hist4, qcd_fwd_kwargs_mc4)) dijet_fwd_entries.append( (dijet_mgpy_hist4, qcd_fwd_kwargs_mc4)) if pt_ind == 0: dijet_fwd_2d_entries.append( (h2d_qcd_fwd_mc_pdf4, qcd_fwd_kwargs_mc4)) # PYTHIA ONLY # if os.path.isfile(os.path.join(root_dir, qgc.QCD_PYTHIA_ONLY_FILENAME)): # col = qgc.QCD_COLOURS[2] # h2d_qcd_fwd_mc2 = grab_obj(os.path.join(root_dir, qgc.QCD_PYTHIA_ONLY_FILENAME), "%s/%s" % (dj_fwd_dirname, v)) # qcd_fwd_kwargs_mc2 = dict(line_color=col, line_width=lw, fill_color=col, # marker_color=col, marker_style=cu.Marker.get(qgc.QCD_MARKER), marker_size=mc_msize, # label="Pythia8", # subplot=dijet_fwd_data_hist) # entries.append((qgp.get_projection_plot(h2d_qcd_fwd_mc2, start_val, end_val), qcd_fwd_kwargs_mc2)) # dijet_fwd_entries.append((qgp.get_projection_plot(h2d_qcd_fwd_mc2, start_val, end_val), qcd_fwd_kwargs_mc2)) # if pt_ind == 0: # dijet_fwd_2d_entries.append((h2d_qcd_fwd_mc2, qcd_fwd_kwargs_mc2)) # HERWIG++ QCD if os.path.isfile( os.path.join(root_dir, qgc.QCD_HERWIG_FILENAME)): col_hpp = qgc.QCD_COLOURS[3] h2d_qcd_fwd_mc_hpp = grab_obj( os.path.join(root_dir, qgc.QCD_HERWIG_FILENAME), "%s/%s" % (dj_fwd_dirname, v)) qcd_fwd_kwargs_mc_hpp = dict(line_color=col_hpp, line_width=lw, fill_color=col_hpp, marker_color=col_hpp, marker_style=cu.Marker.get( qgc.QCD_MARKER), marker_size=mc_msize, label=hpp_label, subplot=dijet_fwd_data_hist) dijet_hpp_hist = qgp.get_projection_plot( h2d_qcd_fwd_mc_hpp, start_val, end_val) entries.append((dijet_hpp_hist, qcd_fwd_kwargs_mc_hpp)) dijet_fwd_entries.append( (dijet_hpp_hist, qcd_fwd_kwargs_mc_hpp)) if pt_ind == 0: dijet_fwd_2d_entries.append( (h2d_qcd_fwd_mc_hpp, qcd_fwd_kwargs_mc_hpp)) zpj_1d_entries.append(zpj_entries) dijet_cen_1d_entries.append(dijet_cen_entries) dijet_fwd_1d_entries.append(dijet_fwd_entries) ################# # SETUP PLOTTING ################# rebin = 2 v_lower = v.lower() # if "multiplicity" in v_lower: # rebin = 1 # elif "flavour" in v_lower or "thrust" in v_lower: # rebin = 1 # elif 'ptd' in v_lower: # rebin = 4 # elif 'lha_charged' in v_lower: # rebin = 4 # rebin = 1 xlim = None if "width" in v_lower or "ptd" in v_lower: xlim = (0, 1) elif "thrust" in v_lower: xlim = (0, 0.5) elif "multiplicity" in v_lower and "ak4" in root_dir.lower(): if end_val <= 150: xlim = (0, 50) else: xlim = (0, 80) auto_xlim = False if "multiplicity" in v_lower or "thrust" in v_lower: auto_xlim = True ylim = [0, None] if "flavour" in v_lower: ylim = (0, 1) # elif "lha" in v_lower: # ylim = (0, 5) plot_dir = os.path.join( root_dir, "plots_lambda_mc_vs_data%s_pdf_compare" % (gr_append)) subplot_title = "Simulation / Data" subplot_limits = (0, 2) xlabel = ang.name + " (" + ang.lambda_str + ")" if gr_append is not "": xlabel = "Groomed " + ang.name + " (" + ang.lambda_str + ")" def _title(region_str, start_val, end_val): pt_var_str = "p_{T}^{jet}" s = (("{jet_algo}\n" "{region_label}\n" "{bin_edge_low:g} < {pt_str} < {bin_edge_high:g} GeV" ).format(jet_algo=jet_str, region_label=region_str, pt_str=pt_var_str, bin_edge_low=start_val, bin_edge_high=end_val)) if title is not None: s = "%s\n%s" % (s, title) return s has_data = True draw_opt = "NOSTACK HIST E1" # dj central only # dont' try to do multiple signal regions per plot, it looks rubbish if len(dijet_cen_entries) > 0: qgp.do_comparison_plot( dijet_cen_entries, "%s/ptBinned/%s_pt%dto%d_dijet_central.%s" % (plot_dir, v, start_val, end_val, OUTPUT_FMT), rebin=rebin, draw_opt=draw_opt, title=_title(qgc.Dijet_CEN_LABEL, start_val, end_val), xtitle=xlabel, xlim=qgp.calc_auto_xlim([ d[0] for d in dijet_cen_entries ]) if auto_xlim else xlim, ylim=ylim, data_first=has_data, mean_rel_error=0.4, subplot_type='ratio', subplot_title=subplot_title, subplot_limits=subplot_limits) # dj forward only if len(dijet_fwd_entries) > 0: qgp.do_comparison_plot( dijet_fwd_entries, "%s/ptBinned/%s_pt%dto%d_dijet_forward.%s" % (plot_dir, v, start_val, end_val, OUTPUT_FMT), rebin=rebin, draw_opt=draw_opt, title=_title(qgc.Dijet_FWD_LABEL, start_val, end_val), xtitle=xlabel, xlim=qgp.calc_auto_xlim([ d[0] for d in dijet_fwd_entries ]) if auto_xlim else xlim, ylim=ylim, data_first=has_data, mean_rel_error=0.4, subplot_type='ratio', subplot_title=subplot_title, subplot_limits=subplot_limits) # zpj only if len(zpj_entries) > 0: if start_val > 149: # rebin *= 2 rebin += 1 # find nearest divisor while (zpj_entries[0][0].GetNbinsX() % rebin != 0): rebin += 1 if "multiplicity" in v_lower: if start_val > 300: rebin += 1 # find nearest divisor while (zpj_entries[0][0].GetNbinsX() % rebin != 0): rebin += 1 qgp.do_comparison_plot( zpj_entries, "%s/ptBinned/%s_pt%dto%d_zpj.%s" % (plot_dir, v, start_val, end_val, OUTPUT_FMT), rebin=rebin, draw_opt=draw_opt, title=_title(qgc.ZpJ_LABEL, start_val, end_val), xtitle=xlabel, xlim=qgp.calc_auto_xlim([d[0] for d in zpj_entries]) if auto_xlim else xlim, ylim=ylim, data_first=has_data, mean_rel_error=0.4, subplot_type='ratio', subplot_title=subplot_title, subplot_limits=subplot_limits) # Do overall summary plots across all pt bins # ------------------------------------------------------------------ ylim_mean = None if "width" in v_lower or "ptd" in v_lower: ylim_mean = (0, 0.4) elif "thrust" in v_lower: ylim_mean = (0, 0.5) elif "multiplicity" in v_lower and "ak4" in root_dir.lower(): ylim_mean = (0, 100) ylim_mean = (0, 80) if end_val < 150: ylim_mean = (0, 50) ylim_mean = None ylim_rms = None # Setup variable names for MPL marker = "" if "_" in ang.name or "^" in ang.name: marker = "$" var_label = marker + ang.name + marker + " ($%s$)" % ang.lambda_str if gr_append != "": var_label = "Groomed " + marker + ang.name + marker + " ($%s$)" % ang.lambda_str
def do_angularity_delta_plots(sources, plot_dir="delta_angularities", zpj_dirname="ZPlusJets_QG", dj_dirname="Dijet_QG", var_list=None, var_prepend="", pt_bins=None, flavour_tag=False, save_component_hists=False, ofmt="pdf"): """Do plots comparing power of different angularities""" var_list = var_list or COMMON_VARS pt_bins = pt_bins or PT_BINS h2d_dyj = None h2d_qcd = None zpj_flav = "q" if flavour_tag else "" dj_flav = "g" if flavour_tag else "" output_append = "_flavMatched" if flavour_tag else "" for (start_val, end_val) in pt_bins: graph_contribs, bin_labels = [], [] for source_ind, source in enumerate(sources): deltas, components = [], [] # construct a graph of angularities for this source for ang in var_list: v = "%s%s_vs_pt" % (var_prepend, ang.var) h2d_dyj = grab_obj( os.path.join(source['root_dir'], qgc.DY_FILENAME), "%s/%s%s" % (source.get('zpj_dirname', zpj_dirname), zpj_flav, v)) h2d_qcd = grab_obj( os.path.join(source['root_dir'], qgc.QCD_FILENAME), "%s/%s%s" % (source.get('dj_dirname', dj_dirname), dj_flav, v)) h_dy = get_projection_plot(h2d_dyj, start_val, end_val) if (h_dy.Integral() > 0): h_dy.Scale(1. / (h_dy.GetBinWidth(1) * h_dy.Integral())) h_qcd = get_projection_plot(h2d_qcd, start_val, end_val) if (h_qcd.Integral() > 0): h_qcd.Scale(1. / (h_qcd.GetBinWidth(1) * h_qcd.Integral())) ddelta_hist = get_ddelta_plot(h_dy, h_qcd) deltas.append(calculate_delta(ddelta_hist)) if source_ind == 0: bin_labels.append("#splitline{%s}{%s}" % (ang.name, ang.lambda_str)) if save_component_hists: plot_ddelta( ddelta_hist.Clone(ddelta_hist.GetName() + "x"), "%s/delta_angularities_components/angularities_pt%dto%d_ddelta_%s_source%d%s.%s" % (plot_dir, start_val, end_val, ang.var, source_ind, output_append, ofmt), xtitle=ang.name + " (" + ang.lambda_str + ")", ytitle="d#Delta/d" + ang.lambda_str) if ang.var != "jet_multiplicity": c = Contribution(ddelta_hist, line_width=1, marker_color=ang.colour, line_color=ang.colour, fill_color=ang.colour, label=ang.name + " (" + ang.lambda_str + ")", rebin_hist=1) components.append(c) if save_component_hists: # plot all differential distributions for this pt bin on one plot p = Plot(components, what="hist", xtitle="#lambda^{#kappa}_{#beta}", ytitle="d#Delta/d#lambda", title="%d < p_{T}^{jet} < %d GeV" % (start_val, end_val)) p.plot("NOSTACK HISTE") prefix = "pt%dto%d" % (start_val, end_val) p.save( "%s/delta_angularities_components/%s_ddelta_angularity_comparison_source%d%s.%s" % (plot_dir, prefix, source_ind, output_append, ofmt)) gr = construct_deltas_graph(deltas) gr.SetName(source.get("label", "")) if 'style' in source and 'line_width' not in source['style']: source['style']['line_width'] = 2 c = Contribution(gr, label=source.get("label", "").lstrip(", "), marker_style=0, **source.get("style", {})) graph_contribs.append(c) do_deltas_plot(graph_contribs, "%s/angularities_pt%dto%d%s.%s" % (plot_dir, start_val, end_val, output_append, ofmt), bin_labels=bin_labels, title="%d < p_{T}^{jet} < %d GeV" % (start_val, end_val), xtitle="Angularity: (#kappa, #beta)")
def do_wrong_plots(root_dir, var_prepend="", plot_dir="wrong_flavs", zpj_dirname="ZPlusJets_QG", dj_dirname="Dijet_QG", pt_bins=None, title=""): """Plot all the sample/selection/flavour combinations to check distributions indep of sample""" pt_bins = pt_bins or qgc.THEORY_PT_BINS plot_vars = [ 'jet_LHA', 'jet_pTD', 'jet_width', 'jet_thrust', 'jet_multiplicity' ] if "puppi" in root_dir.lower(): plot_vars.append('jet_puppiMultiplicity') for v in plot_vars: v = "%s%s_vs_pt" % (var_prepend, v) h2d_dyj_chs = grab_obj(os.path.join(root_dir, qgc.DY_FILENAME), "%s/q%s" % (zpj_dirname, v)) h2d_dyj_wrong_chs = grab_obj(os.path.join(root_dir, qgc.DY_FILENAME), "%s/g%s" % (zpj_dirname, v)) h2d_dyj_qcd_chs = grab_obj(os.path.join(root_dir, qgc.DY_FILENAME), "%s/q%s" % (dj_dirname, v)) h2d_dyj_qcd_wrong_chs = grab_obj( os.path.join(root_dir, qgc.DY_FILENAME), "%s/g%s" % (dj_dirname, v)) h2d_qcd_chs = grab_obj(os.path.join(root_dir, qgc.QCD_FILENAME), "%s/g%s" % (dj_dirname, v)) h2d_qcd_wrong_chs = grab_obj(os.path.join(root_dir, qgc.QCD_FILENAME), "%s/q%s" % (dj_dirname, v)) lw = 1 dy_kwargs_chs = dict(line_color=qgc.DY_COLOUR, fill_color=qgc.DY_COLOUR, label=qgc.DY_ZpJ_QFLAV_LABEL, line_width=lw, marker_style=20, marker_color=qgc.DY_COLOUR) dy_kwargs_wrong_chs = dict(line_color=qgc.DY_COLOUR + 4, fill_color=qgc.DY_COLOUR + 4, label=qgc.DY_ZpJ_GFLAV_LABEL, line_width=lw, line_style=1, marker_style=21, marker_color=qgc.DY_COLOUR + 4) dy_kwargs_qcd_chs = dict(line_color=ROOT.kGreen + 2, fill_color=ROOT.kGreen + 2, label=qgc.DY_Dijet_QFLAV_LABEL, line_width=lw, line_style=1, marker_style=22, marker_color=ROOT.kGreen + 2) dy_kwargs_qcd_wrong_chs = dict(line_color=ROOT.kOrange - 1, fill_color=ROOT.kOrange - 1, label=qgc.DY_Dijet_GFLAV_LABEL, line_width=lw, line_style=1, marker_style=23, marker_color=ROOT.kOrange - 1) qcd_kwargs_chs = dict(line_color=qgc.QCD_COLOUR, fill_color=qgc.QCD_COLOUR, label=qgc.QCD_Dijet_GFLAV_LABEL, line_width=lw, marker_style=25, marker_color=qgc.QCD_COLOUR) qcd_kwargs_wrong_chs = dict(line_color=ROOT.kRed, fill_color=ROOT.kRed, label=qgc.QCD_Dijet_QFLAV_LABEL, line_width=lw, line_style=1, marker_style=24, marker_color=ROOT.kRed) rebin = 2 xlim = None if "thrust" in v: rebin = 1 xlim = (0, 0.5) if "multiplicity" in v.lower(): rebin = 2 xlim = (0, 100) for (start_val, end_val) in pt_bins: entries = [ (qgg.get_projection_plot(h2d_dyj_chs, start_val, end_val), dy_kwargs_chs), (qgg.get_projection_plot(h2d_dyj_wrong_chs, start_val, end_val), dy_kwargs_wrong_chs), # (qgg.get_projection_plot(h2d_dyj_qcd_chs, start_val, end_val), dy_kwargs_qcd_chs), # (qgg.get_projection_plot(h2d_dyj_qcd_wrong_chs, start_val, end_val), dy_kwargs_qcd_wrong_chs), (qgg.get_projection_plot(h2d_qcd_wrong_chs, start_val, end_val), qcd_kwargs_wrong_chs), (qgg.get_projection_plot(h2d_qcd_chs, start_val, end_val), qcd_kwargs_chs), ] this_title = "%d < p_{T}^{jet} < %d GeV" % (start_val, end_val) if title != "": this_title += ", %s" % title qgg.do_comparison_plot( entries, "%s/%s/%s_pt%dto%d_flavMatched.%s" % (root_dir, plot_dir, v, start_val, end_val, OUTPUT_FMT), rebin=rebin, title=this_title, xlim=xlim)
def do_component_plots(mgpythia_dir, pythia_only_dir, plot_dir): # Do 2D plots for diff ptMin folders jet_flavs = ["", "g", "q"] ptmin_vals = [50, 100, 200, 400, 800] ptmin_vals = [100, 800] # first the pt vs ones: plotnames = [ "genjet_pt_vs_constituent_pt", "genjet_pt_vs_constituent_zi", "genjet_pt_vs_constituent_deta", "genjet_pt_vs_constituent_dphi", "genjet_pt_vs_constituent_dr" ] for plotname, ptmin, renorm, logz, flav in product(plotnames, ptmin_vals, ['Y', None], [True, False], jet_flavs): rebin = [1, 1] ylim = [ptmin, 2000] dirname = "Dijet_genjet_ptMin_%d" % ptmin this_hist = os.path.join(dirname, flav + plotname) log_append = "_logZ" if logz else "" qgg.do_2D_plot( grab_obj(os.path.join(mgpythia_dir, qgc.QCD_FILENAME), this_hist), output_filename= "%s/constituent_plots/ptMin_%d/%s_mgpythia_norm%s%s.%s" % (plot_dir, ptmin, flav + plotname, renorm, log_append, OUTPUT_FMT), renorm_axis=renorm, title="MG+Pythia", rebin=rebin, recolour=True, ylim=ylim, logz=logz) qgg.do_2D_plot( grab_obj(os.path.join(pythia_only_dir, qgc.QCD_FILENAME), this_hist), output_filename= "%s/constituent_plots/ptMin_%d/%s_pythiaOnly_norm%s%s.%s" % (plot_dir, ptmin, flav + plotname, renorm, log_append, OUTPUT_FMT), renorm_axis=renorm, title="Pythia only", rebin=rebin, recolour=True, ylim=ylim, logz=logz) # Now LHA vs X ones plotnames = ["genjet_LHA_vs_zi", "genjet_LHA_vs_thetai"] for plotname, ptmin, renorm, logz, flav in product(plotnames, ptmin_vals, ['X', 'Y', None], [True, False], jet_flavs): rebin = [4, 4] xlim = [0, 0.5] if ("zi" in plotname and renorm != "X") else None ylim = None dirname = "Dijet_genjet_ptMin_%d" % ptmin this_hist = os.path.join(dirname, flav + plotname) log_append = "_logZ" if logz else "" qgg.do_2D_plot( grab_obj(os.path.join(mgpythia_dir, qgc.QCD_FILENAME), this_hist), output_filename= "%s/constituent_plots/ptMin_%d/%s_mgpythia_norm%s%s.%s" % (plot_dir, ptmin, flav + plotname, renorm, log_append, OUTPUT_FMT), renorm_axis=renorm, title="MG+Pythia, %s-jet, ptMin = %d GeV" % (flav, ptmin), rebin=rebin, recolour=True, xlim=xlim, ylim=ylim, logz=logz) qgg.do_2D_plot( grab_obj(os.path.join(pythia_only_dir, qgc.QCD_FILENAME), this_hist), output_filename= "%s/constituent_plots/ptMin_%d/%s_pythiaOnly_norm%s%s.%s" % (plot_dir, ptmin, flav + plotname, renorm, log_append, OUTPUT_FMT), renorm_axis=renorm, title="Pythia only, %s-jet, ptMin = %d GeV" % (flav, ptmin), rebin=rebin, recolour=True, xlim=xlim, ylim=ylim, logz=logz) def do_2D_plot_with_contours(obj, contour_obj, output_filename, renorm_axis=None, title=None, rebin=None, recolour=True, xlim=None, ylim=None, logx=False, logy=False, logz=False): """Like normal 2D plotter but contour_obj will be plotted using contours""" if rebin: obj.Rebin2D(*rebin) if renorm_axis: obj_renorm = cu.make_normalised_TH2(obj, renorm_axis, recolour) else: obj_renorm = obj if title: obj_renorm.SetTitle(title) canvas = ROOT.TCanvas(ROOT.TUUID().AsString(), "", 800, 800) canvas.SetTicks(1, 1) canvas.SetLeftMargin(0.13) canvas.SetBottomMargin(0.11) if logx: canvas.SetLogx(1) if logy: canvas.SetLogy(1) if logz: canvas.SetLogz(1) obj_renorm.Draw("COLZ") if xlim is not None: obj_renorm.GetXaxis().SetRangeUser(*xlim) if ylim is not None: obj_renorm.GetYaxis().SetRangeUser(*ylim) obj_renorm.GetYaxis().SetTitleOffset(1.7) obj_renorm.GetXaxis().SetTitleOffset(1.2) if contour_obj: contour_obj.Draw("CONT3 SAME") output_filename = os.path.abspath(output_filename) odir = os.path.dirname(output_filename) if not os.path.isdir(odir): os.makedirs(odir) canvas.SaveAs(output_filename) # Do 2D plots for premade jet pt cut objs jet_pt_vals = [(100, 200), (800, 1000)] for (jet_pt_min, jet_pt_max), renorm, logz in product(jet_pt_vals, ['X', 'Y', None][2:], [True, False]): rebin = [1, 1] xlim = [0, 1] ylim = [0, 0.05] dirname = "Dijet_genjet" jet_type = "g" plotname = jet_type + "genjet_constituent_zi_vs_constituent_thetai_pt%dto%d" % ( jet_pt_min, jet_pt_max) this_hist = os.path.join(dirname, plotname) log_append = "_logZ" if logz else "" contour_hist = grab_obj(os.path.join(mgpythia_dir, qgc.QCD_FILENAME), this_hist).Clone("contours") for xbin in range(1, contour_hist.GetNbinsX() + 1): for ybin in range(1, contour_hist.GetNbinsY() + 1): xval = 0.5 * (contour_hist.GetXaxis().GetBinCenter(xbin) + contour_hist.GetXaxis().GetBinCenter(xbin + 1)) yval = 0.5 * (contour_hist.GetYaxis().GetBinCenter(ybin) + contour_hist.GetYaxis().GetBinCenter(ybin + 1)) contour_hist.SetBinContent(xbin, ybin, math.sqrt(xval / 0.4) * yval) levels = array('d', [0.001, 0.002, 0.005, 0.01, 0.02, 0.05, 0.1, 0.2, 0.5]) contour_hist.SetContour(len(levels), levels) contour_hist.SetLineColor(ROOT.kRed) do_2D_plot_with_contours( grab_obj(os.path.join(mgpythia_dir, qgc.QCD_FILENAME), this_hist), contour_hist, output_filename="%s/constituent_plots/%s_mgpythia_norm%s%s.%s" % (plot_dir, plotname, renorm, log_append, OUTPUT_FMT), renorm_axis=renorm, title="MG+Pythia, %d < p_{T}^{j} < %d GeV" % (jet_pt_min, jet_pt_max), rebin=rebin, recolour=True, xlim=xlim, ylim=ylim, logz=logz) do_2D_plot_with_contours( grab_obj(os.path.join(pythia_only_dir, qgc.QCD_FILENAME), this_hist), contour_hist, output_filename="%s/constituent_plots/%s_pythiaOnly_norm%s%s.%s" % (plot_dir, plotname, renorm, log_append, OUTPUT_FMT), renorm_axis=renorm, title="Pythia only, %d < p_{T}^{j} < %d GeV" % (jet_pt_min, jet_pt_max), rebin=rebin, recolour=True, xlim=xlim, ylim=ylim, logz=logz) # Do 1D projection plots for (jet_pt_min, jet_pt_max) in jet_pt_vals: lw = 2 dirname = "Dijet_genjet" jet_type = "g" plotname = jet_type + "genjet_constituent_zi_vs_constituent_thetai_pt%dto%d" % ( jet_pt_min, jet_pt_max) this_hist = os.path.join(dirname, plotname) # Do projection plots for various zi bins cut_zi_bins = [(0, 0.001), (0, 0.005), (0, 0.01), (0, 0.05), (0.05, 0.1), (0, 0.1), (0.1, 0.2), (0.3, 0.4), (0.4, 0.5), (0.8, 1.0), (0, 1)] for i, (start_val, end_val) in enumerate(cut_zi_bins): entries_normal = [] h2d_mgpythia = grab_obj( os.path.join(mgpythia_dir, qgc.QCD_FILENAME), this_hist) mgpythia_kwargs = dict(line_color=qgc.QCD_COLOUR, fill_color=qgc.QCD_COLOUR, label="MG+Pythia", line_width=lw) entries_normal.append( (qgg.get_projection_plot(h2d_mgpythia, start_val, end_val, 'y'), mgpythia_kwargs)) h2d_pythiaonly = grab_obj( os.path.join(pythia_only_dir, qgc.QCD_FILENAME), this_hist) pythiaonly_kwargs = dict(line_color=ROOT.kRed, fill_color=ROOT.kRed, label="Pythia only", line_width=lw) entries_normal.append( (qgg.get_projection_plot(h2d_pythiaonly, start_val, end_val, 'y'), pythiaonly_kwargs)) ofilename = jet_type + "genjet_constituent_thetai_binned_zi%gto%g_jetPt%dto%d" % ( start_val, end_val, jet_pt_min, jet_pt_max) rebin = 5 if end_val <= 0.1 else 2 xlim = None if end_val <= 0.1 else [0, 0.6] if end_val >= 1: rebin = 4 xlim = [0, 1.2] qgg.do_comparison_plot( entries_normal, "%s/constituent_plots/%s.%s" % (plot_dir, ofilename, OUTPUT_FMT), rebin=rebin, title="%g < z_{i} < %g, %d < p_{T}^{jet} < %d GeV" % (start_val, end_val, jet_pt_min, jet_pt_max), xtitle="#theta_{i}", xlim=xlim, ylim=None, subplot_type="ratio", subplot_title="#splitline{Ratio wrt}{MG+Pythia}") # Do projections hists for various theta_i bins cut_thetai_bins = [(0, 0.01), (0.01, 0.02), (0.02, 0.05), (0.05, 0.10), (0.1, 0.15), (0.15, 0.2), (0.2, 0.3), (0.3, 0.4), (0.4, 0.6), (0.6, 0.8), (0.8, 1), (1, 1.5), (0, 2)][-1:] deltas = [] delta_components = [] colours = [ ROOT.kBlue, ROOT.kRed, ROOT.kGreen + 2, ROOT.kOrange - 3, ROOT.kMagenta, ROOT.kAzure + 1 ] for i, (start_val, end_val) in enumerate(cut_thetai_bins[::]): entries_normal = [] h2d_mgpythia = grab_obj( os.path.join(mgpythia_dir, qgc.QCD_FILENAME), this_hist) mgpythia_kwargs = dict(line_color=qgc.QCD_COLOUR, fill_color=qgc.QCD_COLOUR, label="MG+Pythia", line_width=lw) h_mgpythia = qgg.get_projection_plot(h2d_mgpythia, start_val, end_val, 'x') h_mgpythia.Rebin(4) entries_normal.append( (h_mgpythia.Clone(ROOT.TUUID().AsString()), mgpythia_kwargs)) h2d_pythiaonly = grab_obj( os.path.join(pythia_only_dir, qgc.QCD_FILENAME), this_hist) pythiaonly_kwargs = dict(line_color=ROOT.kRed, fill_color=ROOT.kRed, label="Pythia only", line_width=lw) h_pythiaonly = qgg.get_projection_plot(h2d_pythiaonly, start_val, end_val, 'x') h_pythiaonly.Rebin(4) entries_normal.append((h_pythiaonly.Clone(ROOT.TUUID().AsString()), pythiaonly_kwargs)) # rebin = 5 if end_val <= 0.1 else 2 rebin = None xlim = [0, 0.5] if end_val <= 0.1 else [0, 0.2] if end_val == 2: xlim = [0, 0.2] ofilename = jet_type + "genjet_constituent_zi_binned_thetai%gto%g_jetPt%dto%d" % ( start_val, end_val, jet_pt_min, jet_pt_max) qgg.do_comparison_plot( entries_normal, "%s/constituent_plots/%s.%s" % (plot_dir, ofilename, OUTPUT_FMT), rebin=rebin, title="%g < #theta_{i} < %g, %d < p_{T}^{jet} < %d GeV" % (start_val, end_val, jet_pt_min, jet_pt_max), xtitle="z_{i}", xlim=xlim, subplot_type="ratio", subplot_title="#splitline{Ratio wrt}{MG+Pythia}") ddelta_hist = qgd.get_ddelta_plot(h_mgpythia, h_pythiaonly) this_colour = colours[i % len(colours)] line_style = 1 + i // len(colours) c = Contribution(ddelta_hist, label="%g-%g" % (start_val, end_val), line_width=1, line_style=line_style, marker_color=this_colour, line_color=this_colour, fill_color=this_colour) delta_components.append(c) deltas.append(qgd.calculate_delta(ddelta_hist)) p = Plot(delta_components, what="hist", ytitle="p.d.f", xlim=[0, 0.2], title="%d < p_{T}^{jet} < %d GeV" % (jet_pt_min, jet_pt_max)) p.plot("NOSTACK HISTE") p.save("%s/constituent_plots/ddelta_thetai_jetPt%dto%d.%s" % (plot_dir, jet_pt_min, jet_pt_max, OUTPUT_FMT)) gr = qgd.construct_deltas_graph(deltas[::]) c = Contribution(gr, label="BLAH", marker_style=0) graph_contribs = [] graph_contribs.append(c) bin_labels = ["{:g} - {:g}".format(*b) for b in cut_thetai_bins] qgd.do_deltas_plot(graph_contribs, "%s/constituent_plots/delta_thetai_jetPt%dto%d.%s" % (plot_dir, jet_pt_min, jet_pt_max, OUTPUT_FMT), bin_labels=bin_labels, title="%d < p_{T}^{jet} < %d GeV" % (jet_pt_min, jet_pt_max), xtitle="#theta_{i}")
def make_1d_plot(root_dir, histname, jet_str, gen_only=False): entries = [] lw = 2 data_line_width = lw msize = 1.1 zpj_data_hist = None if not gen_only: zpj_data_hist = grab_obj(os.path.join(root_dir, qgc.SINGLE_MU_FILENAME), histname) SINGLE_MU_COLOUR = ROOT.kBlack dy_kwargs_data = dict(line_color=SINGLE_MU_COLOUR, line_width=2, fill_color=SINGLE_MU_COLOUR, marker_color=SINGLE_MU_COLOUR, marker_style=cu.Marker.get(qgc.DY_MARKER), marker_size=msize, label="Data") entries.append((zpj_data_hist, dy_kwargs_data)) # PYTHIA DY MC WITH k FACTORS h_dyj_mc = grab_obj(os.path.join(root_dir, qgc.DY_FILENAME), histname) dy_kwargs_mc = dict(line_color=qgc.DY_COLOUR, line_width=lw, fill_color=qgc.DY_COLOUR, marker_color=qgc.DY_COLOUR, marker_style=cu.Marker.get(qgc.DY_MARKER), marker_size=0, label="MG+PY8 (with k-factor)", subplot=zpj_data_hist) entries.append((h_dyj_mc, dy_kwargs_mc)) # WITHOUT K FACTORS h_dyj_mc_noWeight = grab_obj(os.path.join(root_dir, "uhh2.AnalysisModuleRunner.MC.MC_DYJetsToLL_noZReweight.root"), histname) dy_kwargs_mc = dict(line_color=qgc.QCD_COLOURS[0], line_width=lw, fill_color=qgc.QCD_COLOURS[0], marker_color=qgc.QCD_COLOURS[0], marker_style=cu.Marker.get(qgc.DY_MARKER), marker_size=0, label="MG+PY8 (without k-factor)", subplot=zpj_data_hist) entries.append((h_dyj_mc_noWeight, dy_kwargs_mc)) # Must do un normed first, since it manipulates original objects rebin = 10 p = qgp.make_comparison_plot_ingredients(entries, rebin=rebin, normalise_hist=False, mean_rel_error=0.4, title="%s\n%s" % (jet_str, qgc.ZpJ_LABEL), xlim=[30, 4000], ylim=[1E-1, 1E8], subplot_type='ratio', subplot_title="MC / Data", subplot_limits=(0.5, 1.5)) output_filename = os.path.join(root_dir, "plots_dy_vs_qcd_mc_vs_data_z_reweight", "zpj_%s.%s" % (histname.replace("/", "_"), OUTPUT_FMT)) draw_opt = "NOSTACK HISTE" p.plot(draw_opt) p.set_logx() p.set_logy(do_more_labels=False) dirname = os.path.dirname(output_filename) if not os.path.isdir(dirname): os.makedirs(dirname) p.save(output_filename) p = qgp.make_comparison_plot_ingredients(entries, rebin=1, normalise_hist=True, mean_rel_error=0.4, title="%s\n%s" % (jet_str, qgc.ZpJ_LABEL), xlim=[30, 4000], ylim=[1E-6, 50], subplot_type='ratio', subplot_title="MC / Data", subplot_limits=(0.5, 1.5)) output_filename = os.path.join(root_dir, "plots_dy_vs_qcd_mc_vs_data_z_reweight", "zpj_%s_normed.%s" % (histname.replace("/", "_"), OUTPUT_FMT)) p.plot(draw_opt) p.set_logx() p.set_logy(do_more_labels=False) p.save(output_filename)
def do_plots(root_dir): # QG variable plots pt_bins = qgc.PT_BINS[:] var_list = qgc.COMMON_VARS var_prepend = "" radius, pus = cu.get_jet_config_from_dirname(root_dir) jet_str = "AK%s PF %s" % (radius.upper(), pus.upper()) for gr_append in ["", "_groomed"]: if gr_append == "_groomed": print("Doing groomed plots...") else: print("Doing ungroomed plots...") # do a pt plot just for sanity if gr_append == "": make_1d_plot(root_dir, "ZPlusJets_gen/pt_jet1", jet_str, gen_only=True) make_1d_plot(root_dir, "ZPlusJets_gen/pt_mumu", jet_str, gen_only=True) make_1d_plot(root_dir, "ZPlusJets/pt_jet1", jet_str) make_1d_plot(root_dir, "ZPlusJets/pt_mumu", jet_str) continue zpj_dirname = "ZPlusJets_QG%s" % (gr_append) for ang in var_list[:]: print("...Doing", ang.name) v = "%s%s_vs_pt" % (var_prepend, ang.var) zpj_2d_entries = [] zpj_1d_entries = [] for pt_ind, (start_val, end_val) in enumerate(pt_bins): entries = [] zpj_entries = [] # Get all plots lw = 2 msize = 1.1 data_line_width = 0 #################### # Z+JETS REGION #################### # SINGLE MU DATA h2d_dyj_data = grab_obj(os.path.join(root_dir, qgc.SINGLE_MU_FILENAME), "%s/%s" % (zpj_dirname, v)) dy_kwargs_data = dict(line_color=qgc.SINGLE_MU_COLOUR, line_width=data_line_width, fill_color=qgc.SINGLE_MU_COLOUR, marker_color=qgc.SINGLE_MU_COLOUR, marker_style=cu.Marker.get(qgc.DY_MARKER), marker_size=msize, label="Data") zpj_data_hist = qgp.get_projection_plot(h2d_dyj_data, start_val, end_val) entries.append((zpj_data_hist, dy_kwargs_data)) zpj_entries.append((zpj_data_hist, dy_kwargs_data)) if pt_ind == 0: zpj_2d_entries.append((h2d_dyj_data, dy_kwargs_data)) # PYTHIA DY MC WITH k FACTORS h2d_dyj_mc = grab_obj(os.path.join(root_dir, qgc.DY_FILENAME), "%s/%s" % (zpj_dirname, v)) dy_kwargs_mc = dict(line_color=qgc.DY_COLOUR, line_width=lw, fill_color=qgc.DY_COLOUR, marker_color=qgc.DY_COLOUR, marker_style=cu.Marker.get(qgc.DY_MARKER), marker_size=0, label="MG+PY8 (w/ k-factor)", subplot=zpj_data_hist) entries.append((qgp.get_projection_plot(h2d_dyj_mc, start_val, end_val), dy_kwargs_mc)) zpj_entries.append((qgp.get_projection_plot(h2d_dyj_mc, start_val, end_val), dy_kwargs_mc)) if pt_ind == 0: zpj_2d_entries.append((h2d_dyj_mc, dy_kwargs_mc)) # WIHTOUT K FACTORS h2d_dyj_mc_noWeight = grab_obj(os.path.join(root_dir, "uhh2.AnalysisModuleRunner.MC.MC_DYJetsToLL_noZReweight.root"), "%s/%s" % (zpj_dirname, v)) dy_kwargs_mc_noWeight = dict(line_color=qgc.DY_COLOURS[0], line_width=lw, fill_color=qgc.DY_COLOURS[0], line_style=2, marker_color=qgc.DY_COLOURS[0], marker_style=cu.Marker.get(qgc.DY_MARKER), marker_size=0, label="MG+PY8 (w/out k-factor)", subplot=zpj_data_hist) entries.append((qgp.get_projection_plot(h2d_dyj_mc_noWeight, start_val, end_val), dy_kwargs_mc_noWeight)) zpj_entries.append((qgp.get_projection_plot(h2d_dyj_mc_noWeight, start_val, end_val), dy_kwargs_mc_noWeight)) if pt_ind == 0: zpj_2d_entries.append((h2d_dyj_mc_noWeight, dy_kwargs_mc_noWeight)) # HERWIG++ DY # if end_val < 255: # h2d_dyj_mc2 = grab_obj(os.path.join(root_dir, qgc.DY_HERWIG_FILENAME), "%s/%s" % (zpj_dirname, v)) # col3 = qgc.DY_COLOURS[2] # dy_kwargs_mc2 = dict(line_color=col3, line_width=lw, fill_color=col3, # marker_color=col3, marker_style=cu.Marker.get(qgc.DY_MARKER), marker_size=0, # label="H++", # subplot=zpj_data_hist) # entries.append((qgp.get_projection_plot(h2d_dyj_mc2, start_val, end_val), dy_kwargs_mc2)) # zpj_entries.append((qgp.get_projection_plot(h2d_dyj_mc2, start_val, end_val), dy_kwargs_mc2)) # if pt_ind == 0: # zpj_2d_entries.append((h2d_dyj_mc2, dy_kwargs_mc2)) # else: # zpj_entries.append(None) # MG+HERWIG++ DY # if end_val < 151: # h2d_dyj_mc3 = grab_obj(os.path.join(root_dir, qgc.DY_MG_HERWIG_FILENAME), "%s/%s" % (zpj_dirname, v)) # col4 = qgc.DY_COLOURS[3] # dy_kwargs_mc3 = dict(line_color=col4, line_width=lw, fill_color=col4, # marker_color=col4, marker_style=cu.Marker.get(qgc.DY_MARKER), marker_size=0, # label="MG+H++", # subplot=zpj_data_hist) # entries.append((qgp.get_projection_plot(h2d_dyj_mc3, start_val, end_val), dy_kwargs_mc3)) # zpj_entries.append((qgp.get_projection_plot(h2d_dyj_mc3, start_val, end_val), dy_kwargs_mc3)) # if pt_ind == 0: # zpj_2d_entries.append((h2d_dyj_mc3, dy_kwargs_mc3)) # else: # zpj_entries.append(None) zpj_1d_entries.append(zpj_entries) ################# # SETUP PLOTTING ################# rebin = 2 v_lower = v.lower() if "multiplicity" in v_lower: rebin = 2 elif "flavour" in v_lower or "thrust" in v_lower: rebin = 1 elif 'ptd' in v_lower: rebin = 2 xlim = None if "width" in v_lower or "ptd" in v_lower: xlim = (0, 1) elif"thrust" in v_lower: xlim = (0, 0.5) elif "multiplicity" in v_lower and "ak4" in root_dir.lower(): if end_val <= 150: xlim = (0, 50) else: xlim = (0, 80) ylim = None if "flavour" in v_lower: ylim = (0, 1) # elif "lha" in v_lower: # ylim = (0, 5) plot_dir = os.path.join(root_dir, "plots_dy_vs_qcd_mc_vs_data%s_z_reweight" % (gr_append)) subplot_title = "MC / Data" subplot_limits = (0.5, 1.5) xlabel = ang.name + " (" + ang.lambda_str + ")" if gr_append is not "": xlabel = "Groomed " + ang.name + " (" + ang.lambda_str + ")" # zpj only qgp.do_comparison_plot(zpj_entries, "%s/ptBinned/%s_pt%dto%d_zpj.%s" % (plot_dir, v, start_val, end_val, OUTPUT_FMT), rebin=rebin, title="%d < p_{T}^{jet} < %d GeV\n%s\n%s" % (start_val, end_val, jet_str, qgc.ZpJ_LABEL), xtitle=xlabel, xlim=xlim, ylim=ylim, subplot_type='ratio', subplot_title=subplot_title, subplot_limits=subplot_limits) # Do overall summary plots across all pt bins # ------------------------------------------------------------------ ylim_mean = None if "width" in v_lower or "ptd" in v_lower: ylim_mean = (0, 0.4) elif"thrust" in v_lower: ylim_mean = (0, 0.5) elif "multiplicity" in v_lower and "ak4" in root_dir.lower(): ylim_mean = (0, 100) ylim_mean = (0, 80) if end_val < 150: ylim_mean = (0, 50) ylim_mean=None ylim_rms=None # Setup variable names for MPL marker = "" if "_" in ang.name or "^" in ang.name: marker = "$" var_label = marker + ang.name + marker + " ($%s$)" % ang.lambda_str if gr_append != "": var_label = "Groomed " + marker + ang.name + marker + " ($%s$)" % ang.lambda_str # zpj_1d_entries[i][j] is the jth sample in the ith pt bin qgp.do_mean_rms_summary_plot(zpj_1d_entries[:], pt_bins[:], "%s/ptBinned/%s_box_zpj_mpl.%s" % (plot_dir, v, OUTPUT_FMT), var_label=var_label, xlim=(50, 614), ylim_mean=ylim_mean, ylim_rms=ylim_rms, region_title="%s jets in %s" % (jet_str, qgc.ZpJ_LABEL))
def do_angularity_roc_plots(sources, plot_dir="roc_angularities_roc", zpj_dirname="ZPlusJets_QG", dj_dirname="Dijet_QG", pt_bins=None, var_list=None, var_prepend="", flavour_tag=False): """Do roc plots, with different angularities on the same plot""" var_list = var_list or COMMON_VARS pt_bins = pt_bins or PT_BINS zpj_flav = "q" if flavour_tag else "" dj_flav = "g" if flavour_tag else "" output_append = "_flavMatched" if flavour_tag else "" for (start_val, end_val) in pt_bins: graph_contribs = [] for source_ind, source in enumerate(sources): # construct a graph of angularities for this source for ind, ang in enumerate(var_list, 1): v = "%s%s_vs_pt" % (var_prepend, ang.var) h2d_dyj = grab_obj( os.path.join(source['root_dir'], qgc.DY_FILENAME), "%s/%s%s" % (source.get('zpj_dirname', zpj_dirname), zpj_flav, v)) h2d_qcd = grab_obj( os.path.join(source['root_dir'], qgc.QCD_FILENAME), "%s/%s%s" % (source.get('dj_dirname', dj_dirname), dj_flav, v)) h_dy = get_projection_plot(h2d_dyj, start_val, end_val) if (h_dy.Integral() > 0): h_dy.Scale(1. / (h_dy.GetBinWidth(1) * h_dy.Integral())) h_qcd = get_projection_plot(h2d_qcd, start_val, end_val) if (h_qcd.Integral() > 0): h_qcd.Scale(1. / (h_qcd.GetBinWidth(1) * h_qcd.Integral())) roc_gr = make_roc_graph(h_dy, h_qcd) ang_label = "%s [%s]" % (ang.name, ang.lambda_str) roc_gr.SetName(source.get("label", "")) # if 'line_color' not in source.get('style', {}): source['style']['line_color'] = ang.colour c = Contribution(roc_gr, label=source.get("label", "") + " " + ang_label, marker_style=0, marker_color=ang.colour, **source.get("style", {})) graph_contribs.append(c) basic_gr = ROOT.TGraph(2, array('d', [0, 1]), array('d', [0, 1])) graph_contribs.insert( 0, Contribution(basic_gr, line_color=ROOT.kBlack, marker_color=ROOT.kBlack, line_style=2, label="y=x")) p = Plot(graph_contribs, what='graph', xtitle="#epsilon_{ g}", ytitle="#epsilon_{ q}", title="%d < p_{T}^{jet} < %d GeV" % (start_val, end_val), xlim=[1E-1, 1], ylim=[0, 1], legend=True) p.legend.SetY1(0.15) p.legend.SetY2(0.4) p.plot("AL") p.save("%s/angularities_roc_pt%dto%d%s.pdf" % (plot_dir, start_val, end_val, output_append))
def do_all_2D_plots(root_dir, plot_dir="plots_2d", zpj_dirname="ZPlusJets_QG", dj_dirname="Dijet_QG", var_list=None, var_prepend=""): """Do 2D distributions""" var_list = var_list or qgc.COMMON_VARS_WITH_FLAV for ang in var_list: v = "%s%s_vs_pt" % (var_prepend, ang.var) rebin = [2, 4] xlim = None if "multiplicity" in v: rebin = [2, 4] elif "thrust" in v or "width" in v: rebin = [1, 4] xlim = [0, 0.5] elif "flavour" in v: rebin = [1, 4] recolour = False if "flavour" in v else True for rn in ['Y', None]: # different renormalisation axes qgg.do_2D_plot(grab_obj(os.path.join(root_dir, qgc.DY_FILENAME), "%s/%s" % (zpj_dirname, v)), output_filename="%s/%s/dy_zpj_%s_norm%s.%s" % (root_dir, plot_dir, v, rn, OUTPUT_FMT), renorm_axis=rn, title=qgc.DY_ZpJ_LABEL, rebin=rebin, recolour=recolour, xlim=xlim) qgg.do_2D_plot(grab_obj(os.path.join(root_dir, qgc.DY_FILENAME), "%s/%s" % (dj_dirname, v)), output_filename="%s/%s/dy_dijet_%s_norm%s.%s" % (root_dir, plot_dir, v, rn, OUTPUT_FMT), renorm_axis=rn, title=qgc.DY_Dijet_LABEL, rebin=rebin, recolour=recolour, xlim=xlim) qgg.do_2D_plot(grab_obj(os.path.join(root_dir, qgc.QCD_FILENAME), "%s/%s" % (dj_dirname, v)), output_filename="%s/%s/qcd_dijet_%s_norm%s.%s" % (root_dir, plot_dir, v, rn, OUTPUT_FMT), renorm_axis=rn, title=qgc.QCD_Dijet_LABEL, rebin=rebin, recolour=recolour, xlim=xlim) if "flavour" in v: continue # Flavour matched reco qgg.do_2D_plot( grab_obj(os.path.join(root_dir, qgc.DY_FILENAME), "%s/q%s" % (zpj_dirname, v)), output_filename="%s/%s/dy_zpj_%s_norm%s_qflavMatched.%s" % (root_dir, plot_dir, v, rn, OUTPUT_FMT), renorm_axis=rn, title=qgc.DY_ZpJ_QFLAV_LABEL, rebin=rebin, xlim=xlim) qgg.do_2D_plot( grab_obj(os.path.join(root_dir, qgc.DY_FILENAME), "%s/g%s" % (zpj_dirname, v)), output_filename="%s/%s/dy_zpj_%s_norm%s_gflavMatched.%s" % (root_dir, plot_dir, v, rn, OUTPUT_FMT), renorm_axis=rn, title=qgc.DY_ZpJ_GFLAV_LABEL, rebin=rebin, xlim=xlim) qgg.do_2D_plot( grab_obj(os.path.join(root_dir, qgc.DY_FILENAME), "%s/g%s" % (dj_dirname, v)), output_filename="%s/%s/dy_dijet_%s_norm%s_gflavMatched.%s" % (root_dir, plot_dir, v, rn, OUTPUT_FMT), renorm_axis=rn, title=qgc.DY_Dijet_GFLAV_LABEL, rebin=rebin, xlim=xlim) qgg.do_2D_plot( grab_obj(os.path.join(root_dir, qgc.DY_FILENAME), "%s/q%s" % (dj_dirname, v)), output_filename="%s/%s/dy_dijet_%s_norm%s_qflavMatched.%s" % (root_dir, plot_dir, v, rn, OUTPUT_FMT), renorm_axis=rn, title=qgc.DY_Dijet_QFLAV_LABEL, rebin=rebin, xlim=xlim) qgg.do_2D_plot( grab_obj(os.path.join(root_dir, qgc.QCD_FILENAME), "%s/g%s" % (dj_dirname, v)), output_filename="%s/%s/qcd_dijet_%s_norm%s_gflavMatched.%s" % (root_dir, plot_dir, v, rn, OUTPUT_FMT), renorm_axis=rn, title=qgc.QCD_Dijet_GFLAV_LABEL, rebin=rebin, xlim=xlim) qgg.do_2D_plot( grab_obj(os.path.join(root_dir, qgc.QCD_FILENAME), "%s/q%s" % (dj_dirname, v)), output_filename="%s/%s/qcd_dijet_%s_norm%s_qflavMatched.%s" % (root_dir, plot_dir, v, rn, OUTPUT_FMT), renorm_axis=rn, title=qgc.QCD_Dijet_QFLAV_LABEL, rebin=rebin, xlim=xlim)
def do_gen_reco_comparison_plots(root_dir, var_list=None, gen_var_prepend="gen", reco_var_prepend="", plot_dir="plot_reco_gen", zpj_reco_dirname=qgc.ZPJ_RECOJET_RDIR, dj_reco_dirname=qgc.DJ_RECOJET_RDIR, zpj_gen_dirname=qgc.ZPJ_GENJET_RDIR, dj_gen_dirname=qgc.DJ_GENJET_RDIR, pt_bins=qgc.THEORY_PT_BINS, subplot_type=None): var_list = var_list or qgc.COMMON_VARS for ang in var_list: v_reco = "%s%s_vs_pt" % (reco_var_prepend, ang.var) v_gen = "%s%s_vs_pt" % (gen_var_prepend, ang.var) h2d_dyj_reco = grab_obj(os.path.join(root_dir, qgc.DY_FILENAME), "%s/%s" % (zpj_reco_dirname, v_reco)) h2d_qcd_reco = grab_obj(os.path.join(root_dir, qgc.QCD_FILENAME), "%s/%s" % (dj_reco_dirname, v_reco)) h2d_dyj_gen = grab_obj(os.path.join(root_dir, qgc.DY_FILENAME), "%s/%s" % (zpj_gen_dirname, v_gen)) h2d_qcd_gen = grab_obj(os.path.join(root_dir, qgc.QCD_FILENAME), "%s/%s" % (dj_gen_dirname, v_gen)) if "flavour" not in v_reco: h2d_dyj_reco_q = grab_obj(os.path.join(root_dir, qgc.DY_FILENAME), "%s/q%s" % (zpj_reco_dirname, v_reco)) h2d_qcd_reco_g = grab_obj(os.path.join(root_dir, qgc.QCD_FILENAME), "%s/g%s" % (dj_reco_dirname, v_reco)) h2d_dyj_gen_q = grab_obj(os.path.join(root_dir, qgc.DY_FILENAME), "%s/q%s" % (zpj_gen_dirname, v_gen)) h2d_qcd_gen_g = grab_obj(os.path.join(root_dir, qgc.QCD_FILENAME), "%s/g%s" % (dj_gen_dirname, v_gen)) for (start_val, end_val) in pt_bins: lw = 2 dy_reco_kwargs = dict(line_color=qgc.DY_COLOUR, fill_color=qgc.DY_COLOUR, label=qgc.DY_ZpJ_LABEL + " [RecoJet]", line_width=lw) qcd_reco_kwargs = dict(line_color=qgc.QCD_COLOUR, fill_color=qgc.QCD_COLOUR, label=qgc.QCD_Dijet_LABEL + " [RecoJet]", line_width=lw) dy_gen_kwargs = dict(line_color=qgc.DY_COLOUR, fill_color=qgc.DY_COLOUR, label=qgc.DY_ZpJ_LABEL + " [GenJet]", line_width=lw, line_style=2) qcd_gen_kwargs = dict(line_color=qgc.QCD_COLOUR, fill_color=qgc.QCD_COLOUR, label=qgc.QCD_Dijet_LABEL + " [GenJet]", line_width=lw, line_style=2) entries = [(qgg.get_projection_plot(h2d_dyj_reco, start_val, end_val), dy_reco_kwargs), (qgg.get_projection_plot(h2d_qcd_reco, start_val, end_val), qcd_reco_kwargs), (qgg.get_projection_plot(h2d_dyj_gen, start_val, end_val), dy_gen_kwargs), (qgg.get_projection_plot(h2d_qcd_gen, start_val, end_val), qcd_gen_kwargs)] rebin = 2 xlim = None ylim = None if "flavour" in v_reco: rebin = 1 ylim = (0, 1) if "thrust" in v_reco: xlim = (0, 0.5) qgg.do_comparison_plot( entries, "%s/%s/%s_pt%dto%d.%s" % (root_dir, plot_dir, ang.var, start_val, end_val, OUTPUT_FMT), rebin=rebin, title="%d < p_{T}^{jet} < %d GeV" % (start_val, end_val), xtitle=ang.name + " (" + ang.lambda_str + ")", xlim=xlim, ylim=ylim, subplot_type=subplot_type) # Do flavour-tagged comparison if "flavour" in v_reco: continue dy_reco_kwargs['label'] = qgc.DY_ZpJ_QFLAV_LABEL + " [RecoJet]" qcd_reco_kwargs['label'] = qgc.QCD_Dijet_GFLAV_LABEL + " [RecoJet]" dy_gen_kwargs['label'] = qgc.DY_ZpJ_QFLAV_LABEL + " [GenJet]" qcd_gen_kwargs['label'] = qgc.QCD_Dijet_GFLAV_LABEL + " [GenJet]" entries = [(qgg.get_projection_plot(h2d_dyj_reco_q, start_val, end_val), dy_reco_kwargs), (qgg.get_projection_plot(h2d_qcd_reco_g, start_val, end_val), qcd_reco_kwargs), (qgg.get_projection_plot(h2d_dyj_gen_q, start_val, end_val), dy_gen_kwargs), (qgg.get_projection_plot(h2d_qcd_gen_g, start_val, end_val), qcd_gen_kwargs)] qgg.do_comparison_plot( entries, "%s/%s/%s_flavMatched_pt%dto%d.%s" % (root_dir, plot_dir, ang.var, start_val, end_val, OUTPUT_FMT), rebin=rebin, title="%d < p_{T}^{jet} < %d GeV" % (start_val, end_val), xtitle=ang.name + " (" + ang.lambda_str + ")", xlim=xlim, ylim=ylim, subplot_type=subplot_type)