예제 #1
0
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)
예제 #2
0
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
예제 #3
0
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)))
예제 #4
0
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))
예제 #7
0
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
예제 #9
0
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)
예제 #11
0
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))
예제 #14
0
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)