예제 #1
0
                 FillColor=plot.CreateTransparentColor(ROOT.kAzure + 6, 0.5))
        if args.hist is not None:
            plot.Set(gr, LineWidth=2)
        gr.Draw(fillstyle)
        gr.Draw('LSAME')

# We just want the top pad to look like a box, so set all the text and tick
# sizes to zero
pads[0].cd()
h_top = h_axis.Clone()
plot.Set(h_top.GetXaxis(), LabelSize=0, TitleSize=0, TickLength=0)
plot.Set(h_top.GetYaxis(), LabelSize=0, TitleSize=0, TickLength=0)
h_top.Draw()

# Draw the legend in the top TPad
legend = plot.PositionedLegend(0.4, 0.11, 3, 0.015)
plot.Set(legend,
         NColumns=2,
         Header='#bf{%.0f%% CL Excluded:}' % (args.CL * 100.))
if 'obs' in contours:
    legend.AddEntry(contours['obs'][0], "Observed", "F")
if 'exp-1' in contours and 'exp+1' in contours:
    legend.AddEntry(contours['exp-1'][0], "#pm 1#sigma Expected", "F")
if 'exp0' in contours:
    if 'obs' in contours:
        legend.AddEntry(contours['exp0'][0], "Expected", "L")
    else:
        legend.AddEntry(contours['exp0'][0], "Expected", "F")
if 'exp-2' in contours and 'exp+2' in contours:
    legend.AddEntry(contours['exp-2'][0], "#pm 2#sigma Expected", "F")
legend.Draw()
예제 #2
0
for padx in pads:
    # Use tick marks on oppsite axis edges
    plot.Set(padx, Tickx=1, Ticky=1, Logx=args.logx)
    if args.pad_style is not None:
        settings = {
            x.split('=')[0]: eval(x.split('=')[1])
            for x in args.pad_style.split(',')
        }
        print 'Applying style options to the TPad(s):'
        print settings
        plot.Set(padx, **settings)

graphs = []
graph_sets = []

legend = plot.PositionedLegend(0.45, 0.10, 3, 0.015)
plot.Set(legend, NColumns=2)

axis = None

defcols = [
    ROOT.kGreen + 3, ROOT.kRed, ROOT.kBlue, ROOT.kBlack, ROOT.kYellow + 2,
    ROOT.kOrange + 10, ROOT.kCyan + 3, ROOT.kMagenta + 2, ROOT.kViolet - 5,
    ROOT.kGray
]

deflines = [1, 2, 3]

if args.auto_style is not None:
    icol = {x: 0 for x in args.auto_style.split(',')}
    icol['default'] = 0
예제 #3
0
    gr2 = ROOT.TGraph(len(arr_x), arr_x, array('d', y2))
    canv = ROOT.TCanvas('wg_M_cutoff_quantiles_%s' % year,
                        'wg_M_cutoff_quantiles_%s' % year)
    pads = plot.OnePad()
    plot.Set(gr0, LineWidth=2, LineColor=1, MarkerColor=1)
    plot.Set(gr1, LineWidth=2, LineColor=2, MarkerColor=2)
    plot.Set(gr2, LineWidth=2, LineColor=4, MarkerColor=4)
    gr0.Print()
    gr0.Draw('ALP')
    gr1.Draw('LPSAME')
    gr2.Draw('LPSAME')
    axis = plot.GetAxisHist(pads[0])
    axis.SetMaximum(4000)
    axis.GetXaxis().SetTitle('p_{T}^{#gamma} cut-off [GeV]')
    axis.GetYaxis().SetTitle('M_{W#gamma} [GeV]')
    legend = plot.PositionedLegend(0.30, 0.20, 3, 0.015)
    legend.AddEntry(gr0, '68% quantile')
    legend.AddEntry(gr1, '95% quantile')
    legend.AddEntry(gr2, '99.7% quantile')
    legend.Draw()
    canv.Print('.png')
    canv.Print('.pdf')

# Draw efficiencies for the stitched sample
for year, var in itertools.product(years, ['l0_pt', 'p0_pt']):
    hist_dict = {}
    for opath, objname, obj in hists[year][var]['WG-NLO'].ListObjects(depth=0):
        hist_dict[objname] = obj

    # Draw N/N-1 efficiencies
    MakeMultiHistPlot('efficiencies_m_%s_%s' % (year, var),
예제 #4
0
axish[0].GetXaxis().SetTitleSize(0)
axish[0].GetXaxis().SetLabelSize(0)
axish[1].GetYaxis().SetRangeUser(0.8, 1.2)
axish[1].GetXaxis().SetTitle("m_{ee} [GeV]")
axish[0].GetYaxis().SetTitle("Events")
axish[1].GetYaxis().SetTitle("Obs/Exp")
ratio_mchist = plot.MakeRatioHist(LOMC_Z_mass_unc, LOMC_Z_mass_unc, True,
                                  False)
ratio_datahist = plot.MakeRatioHist(data_Z_mass, LOMC_Z_mass, True, False)

pads[0].cd()
axish[0].Draw()
LOMC_Z_mass.Draw("HISTSAME")
LOMC_Z_mass_unc.Draw("e2same")
data_Z_mass.Draw("PSAME")
legend = plot.PositionedLegend(0.2, 0.1, 3, 0.015)
legend.AddEntry(LOMC_Z_mass, "Z#rightarrow ee", "F")
legend.AddEntry(data_Z_mass, "Data", "P")
legend.Draw("SAME")
axish[0].Draw("axissame")
pads[1].cd()
axish[1].Draw("axis")
ratio_mchist.SetMarkerSize(0)
ratio_mchist.Draw("e2same")
ratio_datahist.Draw("e0same")
pads[1].RedrawAxis("G")
plot.DrawTitle(pads[0], "41.5 fb^{-1} (13 TeV-2017)", 3)

canvas.SaveAs("mee_inclusive_nlo_weight_2017.pdf")
#canvas.SaveAs("mmumu_inclusive_weight.pdf")
예제 #5
0
old2 = ROOT.TFile('hig-16-043_2sigma.root', 'r')
cont_2sigma2 = old2.Get('Graph')

print cont_1sigma2
print cont_2sigma2

if debug is not None:
    debug.WriteTObject(hists, 'hist')
    for i, cont in enumerate(cont_1sigma):
        debug.WriteTObject(cont, 'cont_1sigma_%i' % i)
    for i, cont in enumerate(cont_2sigma):
        debug.WriteTObject(cont, 'cont_2sigma_%i' % i)

if args.sm_exp or args.bg_exp:
    #legend = plot.PositionedLegend(0.47, 0.20, 3, 0.015)
    legend = plot.PositionedLegend(0.47, 0.26, 4, 0.03)
else:
    legend = plot.PositionedLegend(0.3, 0.2, 3, 0.015)

pads[0].cd()
axis.Draw()
for i, p in enumerate(cont_2sigma):
    p.SetLineStyle(1)
    p.SetLineWidth(2)
    p.SetLineColor(ROOT.kBlack)
    p.SetFillColor(ROOT.kBlue - 10)
    p.SetFillStyle(1001)
    p.Draw("F SAME")
    p.Draw("L SAME")
    if i == 0: continue
    legend.AddEntry(cont_1sigma[0], "68% CL", "F")
예제 #6
0
def main(args):

    fitvars = 'm_sv_vs_pt_tt'
    fitvars = 'm_sv'

    if len(args.file_dir.split("_")) >= 4: era = args.file_dir.split("_")[3]
    else: era = 'all'
    if era == "2016":
        lumi = "36.3 fb^{-1} (13 TeV)"
    elif era == "2017":
        lumi = "41.5 fb^{-1} (13 TeV)"
    elif era == "2018":
        lumi = "59.7 fb^{-1} (13 TeV)"
    elif era == "all":
        lumi = "138 fb^{-1} (13 TeV)"

    plot.ModTDRStyle(width=1800, height=700, r=0.4, l=0.16, t=0.12, b=0.15)
    ROOT.TGaxis.SetExponentOffset(-0.06, 0.01, "y")
    # Channel & Category label

    if args.channel == '':
        args.channel = args.file_dir.split("_")[1]
    if args.channel == "tt":
        channel_label = "#tau_{h}#tau_{h}"
    if args.channel == "lt":
        channel_label = "#mu_{}#tau_{h}+e_{}#tau_{h}"
    if args.channel == "mt":
        channel_label = "#mu_{}#tau_{h}"
    if args.channel == "et":
        channel_label = "e_{}#tau_{h}"
    if args.channel == "em":
        channel_label = "e_{}#mu_{}"

    bin_number = args.file_dir.split("_")[2]
    #if args.ratio_range=="":
    #  args.ratio_range = "0.7,1.3"
    if bin_number in ["2", "35", "36", "37"]:
        if args.channel == 'tt': bin_label = "b tag"
        if args.channel in ['mt', 'et', 'lt']:
            bin_label = "b tag"
            if bin_number == "35": bin_label = "b tag, Tight-m_{T}"
            if bin_number == "36": bin_label = "b tag, Loose-m_{T}"
        if args.channel in ['em']:
            bin_label = "b tag"
            if bin_number == "2": bin_label = "t#bar{t} CR"
            if bin_number == "35": bin_label = "b tag, High D_{#zeta}"
            if bin_number == "36": bin_label = "b tag, Medium D_{#zeta}"
            if bin_number == "37": bin_label = "b tag, Low D_{#zeta}"
        plot.ModTDRStyle(r=0.04, l=0.18)
        if args.ratio_range == "":
            args.ratio_range = "0.85,1.15"
        bin_label = "b tag"  # no sub labels when combing all sub-categories
    if bin_number in ["32", "33", "34"]:
        if args.ratio_range == "":
            args.ratio_range = "0.4,1.6"
        if args.channel == 'tt': bin_label = "No b tag"
        if args.channel in ['mt', 'et', 'lt']:
            bin_label = "No b tag"
            if bin_number == "32": bin_label = "No b tag, Tight-m_{T}"
            if bin_number == "33": bin_label = "No b tag, Loose-m_{T}"
        if args.channel in ['em']:
            bin_label = "No b tag"
            if bin_number == "32": bin_label = "No b tag, High D_{#zeta}"
            if bin_number == "33": bin_label = "No b tag, Medium D_{#zeta}"
            if bin_number == "34": bin_label = "No b tag, Low D_{#zeta}"
        bin_label = "b tag"  # no sub labels when combing all sub-categories

    if bin_number in [
            "132", "232", "332", "432", "133", "233", "333", "433", "33", "34"
    ]:
        if args.ratio_range == "":
            args.ratio_range = "0.7,1.3"
        if args.channel == 'tt': bin_label = "No b tag"
        if args.channel in ['mt', 'et', 'lt']:
            bin_label = "No b tag"
            if bin_number[1:] == "32": bin_label = "No b tag, Tight-m_{T}"
            if bin_number[1:] == "33": bin_label = "No b tag, Loose-m_{T}"
        if args.channel in ['em']:
            bin_label = "No b tag"
            if bin_number[1:] == "32": bin_label = "No b tag, High D_{#zeta}"
            if bin_number[1:] == "33": bin_label = "No b tag, Medium D_{#zeta}"
            if bin_number[1:] == "34": bin_label = "No b tag, Low D_{#zeta}"

        bin_label = "No b tag"  # no sub labels when combing all sub-categories
        if bin_number[0] == '1': bin_label += ', p_{T}^{#tau#tau}<50 GeV'
        if bin_number[0] == '2': bin_label += ', 50< p_{T}^{#tau#tau}<100 GeV'
        if bin_number[0] == '3': bin_label += ', 100< p_{T}^{#tau#tau}<200 GeV'
        if bin_number[0] == '4': bin_label += ', p_{T}^{#tau#tau}> 200 GeV'
        plot.ModTDRStyle(r=0.04, l=0.18)

    ## Add bin labels
    bin_labels = {}
    with open("scripts/bin_labels.json") as jsonfile:
        full_bin_labels = json.load(jsonfile)
        if bin_number in ["32", "33", "34"]:
            bin_labels = full_bin_labels[fitvars]['nobtag']
        else:
            bin_labels = full_bin_labels[fitvars]['btag']

    is2D = False

    print fitvars, bin_number
    if fitvars == 'm_sv' or bin_number in [
            "2", "35", "36", "37", "132", "232", "332", "432", "133", "233",
            "333", "433"
    ]:
        x_title = "m_{#tau#tau} (GeV)"
        #x_bins = re.split("\[|\]",bin_labels)[1].split(",")
        #Nxbins = len(x_bins) - 1
    else:
        is2D = True
        x_title = "Bin number"
        x_bins = re.split("\[|\]", bin_labels)[3].split(",")
        Nxbins = len(x_bins) - 1

    if is2D:
        y_bin_var = re.split(",|\[|\]", bin_labels)[0]
        y_bin_labels = re.split("\[|\]", bin_labels)[1].split(",")
    else:
        y_bin_var = ""
        y_bin_labels = ""

    is2D = False  # we now split 2D histograms into 1D

    file_dir = args.file_dir
    mode = args.mode
    manual_blind = args.manual_blind
    x_blind_min = args.x_blind_min
    x_blind_max = args.x_blind_max
    cms_label = args.cms_label
    empty_bin_error = args.empty_bin_error
    extra_pad = float(args.extra_pad)
    custom_x_range = args.custom_x_range
    custom_y_range = args.custom_y_range
    x_axis_min = float(args.x_axis_min)
    x_axis_max = float(args.x_axis_max)
    y_axis_min = float(args.y_axis_min)
    y_axis_max = float(args.y_axis_max)
    log_y = args.log_y
    log_x = args.log_x
    if (args.outname != ''):
        outname = args.outname + '_'
    else:
        outname = ''

    if args.file_dir == "htt_tt_232": extra_pad = 0.45
    if args.file_dir == "htt_tt_35": extra_pad = 0.57
    if args.file_dir == "htt_tt_132": extra_pad = 0.65
    if args.file_dir == "htt_tt_232": extra_pad = 0.62
    if args.file_dir == "htt_em_35": extra_pad = 0.7
    if args.file_dir == "htt_lt_35": extra_pad = 0.45
    if args.file_dir == "htt_lt_232": extra_pad = 0.45
    if args.file_dir == "htt_em_232": extra_pad = 0.45
    if '_35' in args.file_dir or '_132' in args.file_dir or '_232' in args.file_dir or args.bOnly:
        cms_label = 'Supplementary'

    if args.file:
        print "Providing shape file: ", args.file, ", with specified subdir name: ", file_dir
        shape_file = args.file
        shape_file_name = args.file

    histo_file = ROOT.TFile(shape_file)

    #Store plotting information for different backgrounds
    background_schemes = {
        'mt': [
            backgroundComp("Others",
                           ["ZL", "VVL", "qqH125", "bbH125", "ggH125"],
                           ROOT.TColor.GetColor("#B0C4DE")),
            #backgroundComp("H(125 GeV)#rightarrow#tau#tau",["qqH125","bbH125","ggH125"],ROOT.TColor.GetColor(51,51,230)),
            #backgroundComp("Diboson",["VVL"],ROOT.TColor.GetColor("#6F2D35")),
            backgroundComp("t#bar{t}", ["TTL"],
                           ROOT.TColor.GetColor("#9999cc")),
            #backgroundComp("Z#rightarrowll",["ZL"],ROOT.TColor.GetColor("#4496c8")),
            backgroundComp("Jet#rightarrow#tau_{h}", ["jetFakes"],
                           ROOT.TColor.GetColor(192, 232, 100)),
            backgroundComp("#tau#tau Bkg.", ["EMB"],
                           ROOT.TColor.GetColor("#ffcc66")),
        ],
        'et': [
            backgroundComp("Others",
                           ["ZL", "VVL", "qqH125", "bbH125", "ggH125"],
                           ROOT.TColor.GetColor("#B0C4DE")),
            #backgroundComp("H(125 GeV)#rightarrow#tau#tau",["qqH125","bbH125","ggH125"],ROOT.TColor.GetColor(51,51,230)),
            #backgroundComp("Diboson",["VVL"],ROOT.TColor.GetColor("#6F2D35")),
            backgroundComp("t#bar{t}", ["TTL"],
                           ROOT.TColor.GetColor("#9999cc")),
            #backgroundComp("Z#rightarrowll",["ZL"],ROOT.TColor.GetColor("#4496c8")),
            backgroundComp("Jet#rightarrow#tau_{h}", ["jetFakes"],
                           ROOT.TColor.GetColor(192, 232, 100)),
            backgroundComp("#tau#tau Bkg.", ["EMB"],
                           ROOT.TColor.GetColor("#ffcc66")),
        ],
        'lt': [
            backgroundComp("Others",
                           ["ZL", "VVL", "qqH125", "bbH125", "ggH125"],
                           ROOT.TColor.GetColor("#B0C4DE")),
            #backgroundComp("H(125 GeV)#rightarrow#tau#tau",["qqH125","bbH125","ggH125"],ROOT.TColor.GetColor(51,51,230)),
            #backgroundComp("Diboson",["VVL"],ROOT.TColor.GetColor("#6F2D35")),
            backgroundComp("t#bar{t}", ["TTL"],
                           ROOT.TColor.GetColor("#9999cc")),
            #backgroundComp("Z#rightarrowll",["ZL"],ROOT.TColor.GetColor("#4496c8")),
            backgroundComp("Jet#rightarrow#tau_{h}", ["jetFakes"],
                           ROOT.TColor.GetColor(192, 232, 100)),
            backgroundComp("#tau#tau Bkg.", ["EMB"],
                           ROOT.TColor.GetColor("#ffcc66")),
        ],
        'tt': [
            backgroundComp("Others",
                           ["ZL", "VVL", "qqH125", "bbH125", "ggH125"],
                           ROOT.TColor.GetColor("#B0C4DE")),
            #backgroundComp("H(125 GeV)#rightarrow#tau#tau",["qqH125","bbH125","ggH125"],ROOT.TColor.GetColor(51,51,230)),
            #backgroundComp("Diboson",["VVL"],ROOT.TColor.GetColor("#6F2D35")),
            backgroundComp("t#bar{t}", ["TTL"],
                           ROOT.TColor.GetColor("#9999cc")),
            #backgroundComp("Z#rightarrowll",["ZL"],ROOT.TColor.GetColor("#4496c8")),
            backgroundComp("Jet#rightarrow#tau_{h}", ["jetFakes", "wFakes"],
                           ROOT.TColor.GetColor(192, 232, 100)),
            backgroundComp("#tau#tau Bkg.", ["EMB"],
                           ROOT.TColor.GetColor("#ffcc66")),
        ],
        'em': [
            backgroundComp("Others", [
                "ZL", "qqH125", "bbH125", "ggH125", 'WHWW125', 'ZHWW125',
                'ggHWW125', 'qqHWW125', "W", "VVL"
            ], ROOT.TColor.GetColor("#B0C4DE")),
            #backgroundComp("H(125 GeV)",["qqH125","bbH125","ggH125",'WHWW125','ZHWW125','ggHWW125','qqHWW125'],ROOT.TColor.GetColor(51,51,230)),
            backgroundComp("QCD", ["QCD"], ROOT.TColor.GetColor("#ffccff")),
            #backgroundComp("Electroweak",["W","VVL"],ROOT.TColor.GetColor(222, 90, 106)),
            backgroundComp("t#bar{t}", ["TTL"],
                           ROOT.TColor.GetColor("#9999cc")),
            #backgroundComp("Z#rightarrowll",["ZL"],ROOT.TColor.GetColor("#4496c8")),
            backgroundComp("#tau#tau Bkg.", ["EMB"],
                           ROOT.TColor.GetColor("#ffcc66")),
        ],
    }

    #Extract relevent histograms from shape file
    sighists = []

    #signal_names = 'TotalSig'
    signal_names = ['ggh_t', 'ggh_i', 'ggh_b']
    if args.no_signal: signal_names = []

    file_dir_list = []
    file_dir_list = [file_dir]

    if not args.no_signal:
        [sighist,
         binname] = getHistogram(histo_file, signal_names, file_dir_list, mode,
                                 args.no_signal, log_x)
        sighists.append(sighist)
    bkghist = getHistogram(histo_file, 'TotalBkg', file_dir, mode,
                           logx=log_x)[0]
    sbhist = bkghist.Clone()
    # can use this one for showing ggX as well as qqX
    sbhist_alt = bkghist.Clone()

    if not args.use_asimov:
        total_datahist = getHistogram(histo_file,
                                      "data_obs",
                                      file_dir,
                                      mode,
                                      logx=log_x)[0]
    else:
        total_datahist = getHistogram(histo_file,
                                      "TotalProcs",
                                      file_dir,
                                      mode,
                                      logx=log_x)[0].Clone()
        for bin_ in range(1, total_datahist.GetNbinsX() + 1):
            content = total_datahist.GetBinContent(bin_)
            total_datahist.SetBinError(bin_, np.sqrt(content))

    blind_datahist = total_datahist.Clone()
    total_datahist.SetMarkerStyle(20)
    blind_datahist.SetMarkerStyle(20)
    blind_datahist.SetLineColor(1)

    total_bkg = getHistogram(histo_file,
                             "TotalBkg",
                             file_dir,
                             mode,
                             logx=log_x)[0].Clone()
    azimov_datahist = blind_datahist.Clone()
    for i in range(0, azimov_datahist.GetNbinsX() + 1):
        azimov_datahist.SetBinContent(i, -0.1)
        azimov_datahist.SetBinError(i, 0)

    azimov_datahist.SetLineColor(ROOT.kRed)
    azimov_datahist.SetMarkerColor(ROOT.kRed)

    #Blinding by hand using requested range, set to 70-110 by default
    # for 0jet category
    if not is2D and manual_blind:
        for i in range(0, total_datahist.GetNbinsX()):
            low_edge = total_datahist.GetBinLowEdge(i + 1)
            high_edge = low_edge + total_datahist.GetBinWidth(i + 1)
            if ((low_edge > float(x_blind_min)
                 and low_edge < float(x_blind_max))
                    or (high_edge > float(x_blind_min)
                        and high_edge < float(x_blind_max))):
                blind_datahist.SetBinContent(i + 1, -0.1)
                blind_datahist.SetBinError(i + 1, 0)
                c = total_bkg.GetBinContent(i + 1)
                azimov_datahist.SetBinContent(i + 1, c)
                azimov_datahist.SetBinError(i + 1, c**.5)
    # for boosted category:
    if is2D and manual_blind:
        x_blind_ind = [
            ind for ind, x in enumerate(x_bins) if 120 >= int(x) >= 70
        ]
        x_blind_ind1 = []

        dummy_list = [
            int(x) for x in np.linspace(Nxbins, Nxbins * Nxbins, Nxbins)
        ]
        for i in range(0, total_datahist.GetNbinsX()):
            if i in dummy_list:
                x_blind_ind1 = [x + i for x in x_blind_ind]
            if i in x_blind_ind or i in x_blind_ind1:
                blind_datahist.SetBinContent(i + 1, -0.1)
                blind_datahist.SetBinError(i + 1, 0)
                c = total_bkg.GetBinContent(i + 1)
                azimov_datahist.SetBinContent(i + 1, c)
                azimov_datahist.SetBinError(i + 1, c**.5)

    #Set bin errors for empty bins if required:
    if empty_bin_error:
        for i in range(1, blind_datahist.GetNbinsX() + 1):
            if blind_datahist.GetBinContent(i) == 0:
                blind_datahist.SetBinError(i, 1.8)
    #Set uniform bin errors properly for Content < 10 bins
    if args.proper_errors_uniform:
        proper_errs_dict = {
            0: 1.29,
            1: 2.38,
            2: 3.51,
            3: 4.20,
            4: 4.44,
            5: 5.06,
            6: 5.46,
            7: 6.05,
            8: 6.02,
            9: 6.46
        }
        for i in range(1, blind_datahist.GetNbinsX() + 1):
            if blind_datahist.GetBinContent(
                    i) < 9.5 and blind_datahist.GetBinContent(i) >= 0:
                new_err = proper_errs_dict[round(
                    blind_datahist.GetBinContent(i))]
                blind_datahist.SetBinError(i, new_err)

    #Normalise by bin width
    scale = 1.0
    if is2D:
        scale = 1. / 10.  # if we have an unrolled plot then we need to account for the bins being in 10 GeV units
    bkghist.Scale(scale, "width")
    sbhist.Scale(scale, "width")

    for shist in sighists:
        if mode == 'prefit':
            shist.Scale(6.0 * scale,
                        "width")  # can scale up signals here if desired
        else:
            shist.Scale(scale, "width")  # can scale up signals here if desired

    for shist in sighists:
        sbhist.Add(shist)
    #sbhist.Scale(scale,"width")
    #sbhist_alt.Scale(scale,"width")
    blind_datahist.Scale(scale, "width")
    azimov_datahist.Scale(scale, "width")

    blind_datagraph = ROOT.TGraphAsymmErrors(blind_datahist)
    azimov_datagraph = ROOT.TGraphAsymmErrors(azimov_datahist)

    channel = args.channel

    #Create stacked plot for the backgrounds
    bkg_histos = []
    for i, t in enumerate(background_schemes[channel]):
        plots = t['plot_list']
        isHist = False
        h = ROOT.TH1F()
        for j, k in enumerate(plots):
            if h.GetEntries() == 0 and getHistogram(
                    histo_file, k, file_dir, mode, False,
                    logx=log_x) is not None:
                isHist = True
                h = getHistogram(histo_file, k, file_dir, mode, logx=log_x)[0]
                h.SetName(k)
            else:
                if getHistogram(histo_file,
                                k,
                                file_dir,
                                mode,
                                False,
                                logx=log_x) is not None:
                    isHist = True
                    h.Add(
                        getHistogram(histo_file, k, file_dir, mode,
                                     logx=log_x)[0])
        h.SetFillColor(t['colour'])
        h.SetLineColor(ROOT.kBlack)
        h.SetMarkerSize(0)

        h.Scale(scale, "width")
        if isHist:
            bkg_histos.append(h)

    stack = ROOT.THStack("hs", "")
    for hists in bkg_histos:
        stack.Add(hists)

    #Setup style related things
    c2 = ROOT.TCanvas()
    c2.cd()

    if args.ratio:
        pads = plot.TwoPadSplit(0.35, 0.01, 0.01)
    else:
        pads = plot.OnePad()

    for p in pads:
        p.SetFrameLineWidth(1)

    pads[0].cd()
    if (log_y):
        pads[0].SetLogy(1)
    if (log_x):
        pads[0].SetLogx(1)

    if custom_x_range:
        if x_axis_max > bkghist.GetXaxis().GetXmax():
            x_axis_max = bkghist.GetXaxis().GetXmax()
    if args.ratio:
        if (log_x):
            pads[1].SetLogx(1)
        axish = createAxisHists(2, bkghist,
                                bkghist.GetXaxis().GetXmin(),
                                bkghist.GetXaxis().GetXmax() - 0.01)
        axish[1].GetXaxis().SetTitle(x_title)
        if is2D:
            axish[1].GetXaxis().SetLabelSize(0.03)
        axish[1].GetYaxis().SetNdivisions(4)
        axish[1].GetYaxis().SetLabelSize(0.033)
        axish[1].GetXaxis().SetLabelSize(0.033)
        if is2D:
            axish[1].GetXaxis().SetNdivisions(bkghist.GetNbinsX() / Nxbins,
                                              Nxbins, 0, False)
        axish[0].GetYaxis().SetTitleSize(0.048)
        axish[0].GetYaxis().SetLabelSize(0.033)
        axish[0].GetYaxis().SetTitleOffset(0.5)
        axish[0].GetXaxis().SetTitleSize(0)
        axish[0].GetXaxis().SetLabelSize(0)
        if is2D:
            axish[0].GetXaxis().SetNdivisions(bkghist.GetNbinsX() / Nxbins,
                                              Nxbins, 0, False)
        axish[0].GetYaxis().SetTitleSize(axish[1].GetXaxis().GetTitleSize())
        axish[0].GetXaxis().SetRangeUser(x_axis_min,
                                         bkghist.GetXaxis().GetXmax() - 0.01)
        axish[1].GetXaxis().SetRangeUser(x_axis_min,
                                         bkghist.GetXaxis().GetXmax() - 0.01)
        axish[0].GetXaxis().SetMoreLogLabels()
        axish[0].GetXaxis().SetNoExponent()
        axish[1].GetXaxis().SetMoreLogLabels()
        axish[1].GetXaxis().SetNoExponent()
        axish[1].GetXaxis().SetTitleOffset(0.85)

        if not is2D:
            axish[0].GetXaxis().SetRangeUser(
                0.,
                bkghist.GetXaxis().GetXmax() - 0.01)
            axish[1].GetXaxis().SetRangeUser(
                0.,
                bkghist.GetXaxis().GetXmax() - 0.01)

        if custom_x_range:
            axish[0].GetXaxis().SetRangeUser(x_axis_min, x_axis_max - 0.01)
            axish[1].GetXaxis().SetRangeUser(x_axis_min, x_axis_max - 0.01)
        if custom_y_range:
            axish[0].GetYaxis().SetRangeUser(y_axis_min, y_axis_max)
            axish[1].GetYaxis().SetRangeUser(y_axis_min, y_axis_max)
    else:
        axish = createAxisHists(1, bkghist,
                                bkghist.GetXaxis().GetXmin(),
                                bkghist.GetXaxis().GetXmax() - 0.01)
        if custom_x_range:
            axish[0].GetXaxis().SetRangeUser(x_axis_min, x_axis_max - 0.01)
        if custom_y_range:
            axish[0].GetYaxis().SetRangeUser(y_axis_min, y_axis_max)
    axish[0].GetYaxis().SetTitleOffset(0.5)
    axish[1].GetYaxis().SetTitleOffset(0.5)
    axish[0].GetYaxis().SetTitle("dN/dm_{#tau#tau} (1/GeV)")
    if not is2D:
        axish[0].GetYaxis().SetTitle("dN/dm_{#tau#tau} (1/GeV)")
        #axish[0].GetYaxis().SetTitle("< Events / GeV >")
        axish[0].GetYaxis().SetTitleOffset(1.5)
        axish[1].GetYaxis().SetTitleOffset(1.5)

    axish[0].GetXaxis().SetTitle(x_title)

    if not custom_y_range:
        axish[0].SetMaximum(extra_pad * bkghist.GetMaximum())
    if not custom_y_range:
        if (log_y):
            ymin = 0.1
            axish[0].SetMinimum(ymin)
        else:
            axish[0].SetMinimum(0)

    hist_indices = [0]
    for i in hist_indices:
        pads[i].cd()
        axish[i].Draw("AXIS")

        bkghist.SetMarkerSize(0)
        bkghist.SetFillColor(2001)
        bkghist.SetLineColor(1)
        bkghist.SetLineWidth(1)
        bkghist.SetFillColor(plot.CreateTransparentColor(12, 0.4))
        bkghist.SetLineColor(0)

        #stack.Draw("histsame")
        #bkghist.Draw("e2same")
        #Add signal, either model dependent or independent
        if not args.no_signal:
            sighist.SetLineColor(ROOT.kRed)
            sighist.SetLineWidth(2)
            if not is2D:
                sighist.SetLineWidth(3)
            for shist in sighists:
                for j in range(1, shist.GetNbinsX() + 1):
                    entry = shist.GetBinContent(j)
                    if entry < axish[0].GetMinimum():
                        shist.SetBinContent(j, axish[0].GetMinimum() * 1.00001)

                shist_stack = shist.Clone()
                shist_stack.SetLineColor(ROOT.kBlack)
                shist_stack.SetLineWidth(1)
                #shist_stack.SetFillStyle(1)
                shist_stack.SetFillColor(ROOT.kRed)
                #stack.Add(shist_stack) # uncomment to add to the stack
        #        shist.Draw("histsame][") # removing vertical lines at the borders of the pad; possible with the trick above
        stack.Draw("histsame")
        shist.Draw("histsame ][")
        bkghist.Draw("e2same")
        blind_datagraph_extra = blind_datagraph.Clone()
        blind_datagraph_extra.Draw("P Z 0 same")
        blind_datagraph.SetMarkerSize(0.)
        blind_datagraph.Draw("P Z 0 same")

        azimov_datagraph_extra = azimov_datagraph.Clone()
        azimov_datagraph_extra.Draw("P Z 0 same")
        azimov_datagraph.SetMarkerSize(0.)
        azimov_datagraph.Draw("P Z 0 same")

        axish[i].Draw("axissame")

    pads[0].cd()
    pads[0].SetTicks(1)
    pads[1].SetTicks(1)
    #Setup legend
    if not is2D:
        legend = plot.PositionedLegend(0.42, 0.33, 3, 0.02, 0.02)
        #def PositionedLegend(width, height, pos, offset, horizontaloffset=None):
        legend.SetTextSize(0.028)
    else:
        legend = PositionedLegendUnrolled(0.13, 0.5, 7, 0.02)
        legend.SetTextSize(0.035)
    legend.SetTextFont(42)
    legend.SetFillStyle(0)

    legend.AddEntry(total_datahist, "Observed", "PEl")
    #Drawn on legend in reverse order looks better
    bkg_histos.reverse()

    background_schemes[channel].reverse()
    leg_hists = [None] * len(bkg_histos)
    for legi, hists in enumerate(bkg_histos):
        legend.AddEntry(hists, background_schemes[channel][legi]['leg_text'],
                        "f")
    #legend.AddEntry(bkghist,"Background uncertainty","f")
    bkghist.SetLineWidth(0)
    legend.AddEntry(bkghist, "Bkg. unc.", "f")
    if is2D:
        if not mode == 'prefit':
            if not args.no_signal:
                legend.AddEntry(sighist,
                                "gg#phi @ 5.8 pb (m_{#phi}= 100 GeV)" % vars(),
                                "l")
        else:
            if not args.no_signal:
                legend.AddEntry(sighist,
                                "gg#phi @ 5.8 pb (m_{#phi}= 100 GeV)" % vars(),
                                "l")

    else:
        #if not args.no_signal: legend.AddEntry(shist_stack,"gg#phi(100 GeV) @ 5.8 pb"%vars(),"f") # uncomment if showing in the stack
        if not args.no_signal:
            legend.AddEntry(sighist,
                            "gg#phi @ 5.8 pb (m_{#phi}= 100 GeV)" % vars(),
                            "l")
    legend.Draw("same")

    latex2 = ROOT.TLatex()
    latex2.SetNDC()
    latex2.SetTextAngle(0)
    latex2.SetTextColor(ROOT.kBlack)
    latex2.SetTextFont(42)
    if not is2D:
        #latex2.SetTextSize(0.032)
        #latex2.DrawLatex(0.21,0.89,"{}, {}".format(bin_label.split(',')[0], channel_label))
        #latex3 = ROOT.TLatex()
        #latex3.SetNDC()
        #latex3.SetTextSize(0.032)
        #latex3.SetTextAngle(0)
        #latex3.SetTextColor(ROOT.kBlack)
        #latex3.SetTextFont(42)
        #if len(bin_label.split(','))>1: latex3.DrawLatex(0.21,0.84,"{}".format(bin_label.split(',')[1]))
        textsize = 0.033  #0.027
        begin_left = None
        ypos = 0.960 if "_{" in bin_label else 0.955
        latex2 = ROOT.TLatex()
        latex2.SetNDC()
        latex2.SetTextAngle(0)
        latex2.SetTextColor(ROOT.kBlack)
        latex2.SetTextSize(textsize)
        if begin_left == None:
            #begin_left = 0.145
            begin_left = 0.180
        latex2.SetTextFont(42)
        latex2.DrawLatex(begin_left, 0.960, channel_label + ', ' + bin_label)
    else:
        latex2.SetTextAlign(23)
        latex2.SetTextSize(0.05)
        latex2.DrawLatex(0.46, 0.955, "{}, {}".format(bin_label,
                                                      channel_label))

    if args.bOnly:
        #pads[0].cd()
        latex2.DrawLatex(0.54, 0.55, "Bkg. only fit")

    #CMS and lumi labels
    plot.FixTopRange(pads[0], plot.GetPadYMax(pads[0]),
                     extra_pad if extra_pad > 0 else 0.3)
    extra = cms_label
    #extra='Preliminary'
    if not is2D:
        #DrawCMSLogo(pads[0], 'CMS', extra, 0, 0.07, -0.0, 2.0, '', 0.85, relExtraDX=0.05)
        cms_scale = 1.0
        DrawCMSLogo(pads[0], 'CMS', extra, 11, 0.045, 0.05, 1.0, '', cms_scale)

        plot.DrawTitle(pads[0], lumi, 3, textSize=0.6)
    else:
        DrawCMSLogo(pads[0],
                    'CMS',
                    extra,
                    0,
                    0.07,
                    -0.0,
                    2.0,
                    '',
                    0.6,
                    relExtraDX=0.005)
        DrawTitleUnrolled(pads[0], lumi, 3, scale=0.6)

    #Add ratio plot if required
    axish[1].GetYaxis().SetTitle("Obs./Exp.")
    if args.ratio:
        ratio_bkghist = plot.MakeRatioHist(bkghist, bkghist, True, False)
        sbhist.SetLineColor(ROOT.kRed)
        sbhist_alt.SetLineColor(ROOT.kBlue)
        sbhist.SetLineWidth(2)
        sbhist_alt.SetLineWidth(2)
        if not is2D:
            sbhist.SetLineWidth(3)
            sbhist_alt.SetLineWidth(3)

        bkghist_errors = bkghist.Clone()
        #for i in range(1,bkghist_errors.GetNbinsX()+1): bkghist_errors.SetBinContent(i,bkghist.GetBinError(i))
        for i in range(1, bkghist_errors.GetNbinsX() + 1):
            bkghist_errors.SetBinContent(i, 1.)
        ratio_sighist = plot.MakeRatioHist(sbhist, bkghist, True, False)
        ratio_datahist_ = plot.MakeRatioHist(blind_datahist, bkghist, True,
                                             False)
        azimov_ratio_datahist_ = plot.MakeRatioHist(azimov_datahist, bkghist,
                                                    True, False)

        ratio_datahist = ROOT.TGraphAsymmErrors(ratio_datahist_)
        azimov_ratio_datahist = ROOT.TGraphAsymmErrors(azimov_ratio_datahist_)

        pads[1].cd()
        #pads[1].SetGrid(0,1)
        axish[1].Draw("axis")
        axish[1].SetMinimum(float(args.ratio_range.split(',')[0]))
        axish[1].SetMaximum(float(args.ratio_range.split(',')[1]))
        ratio_bkghist.SetMarkerSize(0)

        ratio_bkghist.Draw("e2same")
        ratio_datahist.Draw("P Z 0 same")
        ratio_sighist.Draw('histsame')

        if args.f_bOnly:
            bonly_histo_file = ROOT.TFile(args.f_bOnly)
            bonlyhist = getHistogram(bonly_histo_file,
                                     'TotalBkg',
                                     file_dir,
                                     mode,
                                     logx=log_x)[0]
            bonlyhist.Scale(1, "width")
            bonlyhist.SetLineColor(ROOT.kBlue)
            bonlyhist.SetLineWidth(2)
            bonlyhist.SetLineStyle(2)
            ratio_bonlyhist = plot.MakeRatioHist(bonlyhist, bkghist, True,
                                                 False)
            ratio_bonlyhist.Draw("histsame")
            pads[0].cd()
            legend.AddEntry(bonlyhist, 'Bkg. only fit', 'l')
            legend.Draw()
            #bonlyhist.Draw('histsame')
            bonlyhist.SetMarkerSize(0)
            bonlyhist.Draw('lsame')
            stack.Draw("histsame")
            shist.Draw("histsame ][")
            bkghist.Draw("e2same")
            blind_datagraph.SetMarkerSize(1)
            blind_datagraph.Draw("P Z 0 same")
            pads[1].cd()

        if args.manual_blind: azimov_ratio_datahist.Draw("P Z 0 same")
        pads[1].RedrawAxis("G")
        if is2D:
            rlegend = ROOT.TLegend(0.85, 0.27, 0.98, 0.16, '', 'NBNDC')
            rlegend.SetTextFont(42)
            rlegend.SetTextSize(0.035)
            rlegend.SetFillStyle(0)
            rlegend.AddEntry(ratio_datahist, "Obs./Exp.", "PE")
            rlegend.AddEntry("", " ", "")
            #rlegend.AddEntry(ratio_sighist,"(Sig.+Bkg.)/Bkg.","L")
        #rlegend.Draw("same")
        # Draw extra axis for explanation (use "N" for no optimisation)
        if is2D:
            extra_axis = ROOT.TGaxis(0, -0.03, 30., -0.03, 0., 300., 403, "NS")
            extra_axis.SetLabelSize(0.03)
            extra_axis.SetLabelFont(42)
            extra_axis.SetMaxDigits(3)
            extra_axis.SetTitle("m_{#tau#tau} (GeV)")
            extra_axis.SetTitleFont(42)
            extra_axis.SetTitleSize(0.035)
            extra_axis.SetTitleOffset(1.1)
            extra_axis.SetTickSize(0.08)
            extra_axis.Draw()

    pads[0].cd()
    pads[0].GetFrame().Draw()
    pads[0].RedrawAxis()

    ## Add lines after every Nxbins
    #line = ROOT.TLine()
    #line.SetLineWidth(2)
    #line.SetLineStyle(3)
    #line.SetLineColor(1)
    #x = bkghist.GetNbinsX()/Nxbins
    #x_min=bkghist.GetXaxis().GetBinLowEdge(1)
    #x_max=bkghist.GetXaxis().GetBinLowEdge(bkghist.GetNbinsX()+1)
    #x_range=x_max-x_min

    ## for now we have to hard code x=4 otherwise we have issues when the auto rebinning has been used
    #x=4
    #if is2D:
    #    for l in range(1,x):
    #        pads[0].cd()
    #        ymax = axish[0].GetMaximum()
    #        ymin = axish[0].GetMinimum()
    #        line.DrawLine(l*x_range/x,ymin,l*x_range/x,ymax)
    #        if args.ratio:
    #            pads[1].cd()
    #            ymax = axish[1].GetMaximum()
    #            ymin = axish[1].GetMinimum()
    #            line.DrawLine(l*x_range/x,ymin,l*x_range/x,ymax)

    ## Add bin labels between lines
    pads[0].cd()
    latex_bin = ROOT.TLatex()
    latex_bin.SetNDC()
    latex_bin.SetTextAngle(0)
    latex_bin.SetTextColor(ROOT.kBlack)
    latex_bin.SetTextFont(42)
    latex_bin.SetTextSize(0.035)
    if len(y_bin_labels) > 6 or ('_2_' in file_dir and len(y_bin_labels) > 5):
        latex_bin.SetTextSize(0.027)

    for i in range(0, len(y_bin_labels)):
        if i < len(y_bin_labels) - 1:
            y_bin_label = "{} #leq {} < {} {}".format(y_bin_labels[i],
                                                      y_bin_var,
                                                      y_bin_labels[i + 1],
                                                      "GeV")
            l = ROOT.gPad.GetLeftMargin()
            r = ROOT.gPad.GetRightMargin()
            #xshift = ((1-r-l)/(axish[0].GetNbinsX()/Nxbins))*i + l
            # have to hard code 4 here other wise we have problems when the autorebinning has been used
            xshift = ((1 - r - l) / (4)) * i + l
            latex_bin.DrawLatex(xshift + 0.02, 0.82, y_bin_label)
        else:
            #xshift = ((1-r-l)/(axish[0].GetNbinsX()/Nxbins))*i + l
            # have to hard code 4 here other wise we have problems when the autorebinning has been used
            xshift = ((1 - r - l) / (4)) * i + l
            y_bin_label = "{} > {} {}".format(y_bin_var, y_bin_labels[i],
                                              "GeV")
            latex_bin.DrawLatex(xshift + 0.02, 0.82, y_bin_label)

    #Save as png and pdf with some semi sensible filename
    shape_file_name = shape_file_name.replace(".root", "_%(mode)s" % vars())
    shape_file_name = shape_file_name.replace("_shapes", "")
    outname += shape_file_name + "_" + file_dir.strip("htt").strip("_")
    if (log_x):
        outname += "_logx"
    c2.SaveAs("plots/%(outname)s.pdf" % vars())

    del c2
    histo_file.Close()
예제 #7
0
 def PlotTestStat(self, result, name, opts, poi_vals):
     null_vals = [
         x * -2.
         for x in result.GetNullDistribution().GetSamplingDistribution()
     ]
     alt_vals = [
         x * -2.
         for x in result.GetAltDistribution().GetSamplingDistribution()
     ]
     if len(null_vals) == 0 or len(alt_vals) == 0:
         print '>> Errror in PlotTestStat for %s, null and/or alt distributions are empty'
         return
     plot.ModTDRStyle()
     canv = ROOT.TCanvas(name, name)
     pad = plot.OnePad()[0]
     min_val = min(min(alt_vals), min(null_vals))
     max_val = max(max(alt_vals), max(null_vals))
     min_plot_range = min_val - 0.05 * (max_val - min_val)
     if opts['one_sided']:
         min_plot_range = 0.
         pad.SetLogy(True)
     max_plot_range = max_val + 0.05 * (max_val - min_val)
     hist_null = ROOT.TH1F('null', 'null', 40, min_plot_range,
                           max_plot_range)
     hist_alt = ROOT.TH1F('alt', 'alt', 40, min_plot_range, max_plot_range)
     for val in null_vals:
         hist_null.Fill(val)
     for val in alt_vals:
         hist_alt.Fill(val)
     hist_alt.SetLineColor(ROOT.TColor.GetColor(4, 4, 255))
     hist_alt.SetFillColor(
         plot.CreateTransparentColor(ROOT.TColor.GetColor(4, 4, 255), 0.4))
     hist_alt.GetXaxis().SetTitle('-2 #times ln(^{}L_{%s}/^{}L_{%s})' %
                                  (opts['alt_label'], opts['null_label']))
     hist_alt.GetYaxis().SetTitle('Pseudo-experiments')
     hist_alt.Draw()
     hist_null.SetLineColor(ROOT.TColor.GetColor(252, 86, 11))
     hist_null.SetFillColor(
         plot.CreateTransparentColor(ROOT.TColor.GetColor(254, 195, 40),
                                     0.4))
     hist_null.Draw('SAME')
     val_obs = result.GetTestStatisticData() * -2.
     obs = ROOT.TArrow(val_obs, 0, val_obs,
                       hist_alt.GetMaximum() * 0.3, 0.05, '<-|')
     obs.SetLineColor(ROOT.kRed)
     obs.SetLineWidth(3)
     obs.Draw()
     plot.FixTopRange(pad, plot.GetPadYMax(pad), 0.25)
     leg = plot.PositionedLegend(0.22, 0.2, 3, 0.02)
     leg.AddEntry(hist_alt, opts['alt_label'], 'F')
     leg.AddEntry(hist_null, opts['null_label'], 'F')
     leg.AddEntry(obs, 'Observed', 'L')
     leg.Draw()
     plot.DrawCMSLogo(pad, 'CMS', opts['cms_subtitle'], 0, 0.15, 0.035, 1.2)
     pt_l = ROOT.TPaveText(0.23, 0.75, 0.33, 0.9, 'NDCNB')
     pt_l.AddText('Model:')
     pt_l.AddText('Toys:')
     pt_l.AddText('CLs+b:')
     pt_l.AddText('CLb:')
     pt_l.AddText('CLs:')
     plot.Set(pt_l, TextAlign=11, TextFont=62, BorderSize=0)
     pt_l.Draw()
     pt_r = ROOT.TPaveText(0.33, 0.75, 0.63, 0.9, 'NDCNB')
     pt_r.AddText('%s [%s = %.1f, %s = %.1f]' %
                  (opts['model_label'], opts['poi_labels'][0], poi_vals[0],
                   opts['poi_labels'][1], poi_vals[1]))
     pt_r.AddText(
         '%i (%s) + %i (%s)' %
         (result.GetNullDistribution().GetSize(), opts['null_label'],
          result.GetAltDistribution().GetSize(), opts['alt_label']))
     pt_r.AddText('%.3f #pm %.3f' %
                  (result.CLsplusb(), result.CLsplusbError()))
     pt_r.AddText('%.3f #pm %.3f' % (result.CLb(), result.CLbError()))
     pt_r.AddText('%.3f #pm %.3f' % (result.CLs(), result.CLsError()))
     plot.Set(pt_r, TextAlign=11, TextFont=42, BorderSize=0)
     pt_r.Draw()
     pad.GetFrame().Draw()
     pad.RedrawAxis()
     for fmt in opts['formats']:
         canv.SaveAs(fmt)
print cont_1sigma
for item in cont_1sigma:
    print item
print cont_2sigma
for item in cont_2sigma:
    print item

if debug is not None:
    debug.WriteTObject(hists, 'hist')
    for i, cont in enumerate(cont_1sigma):
        debug.WriteTObject(cont, 'cont_1sigma_%i' % i)
    for i, cont in enumerate(cont_2sigma):
        debug.WriteTObject(cont, 'cont_2sigma_%i' % i)

if args.sm_exp or args.bg_exp:
    legend = plot.PositionedLegend(0.47, 0.20, 3, 0.015)
else:
    legend = plot.PositionedLegend(0.3, 0.2, 3, 0.015)

pads[0].cd()
axis.Draw()
for i, p in enumerate(cont_2sigma):
    p.SetLineStyle(1)
    p.SetLineWidth(2)
    p.SetLineColor(ROOT.kBlack)
    p.SetFillColor(ROOT.kBlue - 10)
    p.SetFillStyle(1001)
    p.Draw("F SAME")
    p.Draw("L SAME")
    legend.AddEntry(cont_1sigma[0], "68% CL", "F")
    #if (i==1):
예제 #9
0
graph_exp.SetLineStyle(1)
#  if(mssm_log){
#      expected->SetLineColor(kBlack);
#      expected->SetLineStyle(2);
#      }
graph_exp.Draw("L")

if not args.expected_only:
    graph_obs.SetMarkerColor(ROOT.kBlack)
    graph_obs.SetMarkerSize(1.0)
    graph_obs.SetMarkerStyle(20)
    graph_obs.SetLineWidth(3)
    graph_obs.Draw("PLsame")

pads[0].cd()
legend = plot.PositionedLegend(0.5, 0.9, 2, 0.03)
legend.SetNColumns(2)
legend.SetFillStyle(1001)
legend.SetTextSize(0.15)
legend.SetTextFont(62)
legend.SetHeader("95% CL Excluded:")
if not args.expected_only:
    legend.AddEntry(graph_obs, "Observed", "L")
legend.AddEntry(innerBand, "#pm 1#sigma Expected", "F")
legend.AddEntry(graph_exp, "Expected", "L")
legend.AddEntry(outerBand, "#pm 2#sigma Expected", "F")
legend.Draw("same")

plot.DrawCMSLogo(pads[1], '', '', 11, 0.045, 0.035, 1.2)
plot.DrawTitle(pads[1], '%s' % args.title, 3)
plot.FixOverlay()
예제 #10
0
        relative_obs_graph.SetLineColor(ROOT.kBlue)
        relative_obs_graph.SetMarkerColor(ROOT.kBlue)
        relative_obs_graph.SetLineWidth(3)
        relative_obs_graph.SetLineStyle(2)
        relative_obs_graph.SetMarkerStyle(20)
        relative_obs_graph.Draw("PL")

pads[0].cd()
h_top = axis.Clone()
#necessary in case chosen range surrounds 0 which will cause axis to contain a horizontal line at 0
h_top.GetYaxis().SetRangeUser(0.001, 100)
plot.Set(h_top.GetXaxis(), LabelSize=0, TitleSize=0, TickLength=0)
plot.Set(h_top.GetYaxis(), LabelSize=0, TitleSize=0, TickLength=0)
h_top.Draw()

legend = plot.PositionedLegend(0.5 if args.relative or args.absolute else 0.4,
                               0.11, 3, 0.015)
plot.Set(legend, NColumns=1, Header='#bf{%.0f%% CL Excluded:}' % 95)
if not (args.relative or args.absolute):
    for i in range(len(files)):
        legend.AddEntry(exp_graph_list[i], labels[i], "PL")
elif args.relative:
    legend.SetTextSize(0.025)
    legend.AddEntry(
        relative_exp_graph, "Exp 2*|" + labels[0] + "-" + labels[1] + "|/(" +
        labels[0] + "+" + labels[1] + ")", "PL")
    if not args.expected_only:
        legend.AddEntry(
            relative_obs_graph, "Obs 2*|" + labels[0] + "-" + labels[1] +
            "|/(" + labels[0] + "+" + labels[1] + ")", "PL")
elif args.absolute:
    legend.SetTextSize(0.025)
예제 #11
0
# Set the style options of the pads
for padx in pads:
    # Use tick marks on oppsite axis edges
    plot.Set(padx, Tickx=1, Ticky=1, Logx=args.logx)
    if args.pad_style is not None:
        settings = {x.split('=')[0]: eval(x.split('=')[1]) for x in args.pad_style.split(',')}
        print 'Applying style options to the TPad(s):'
        print settings
        plot.Set(padx, **settings)

graphs = []
graph_sets = []

if args.higgs_bg or args.higgs_injected:
    legend = plot.PositionedLegend(0.4, 0.25, 3, 0.015)
else:
    legend = plot.PositionedLegend(0.3, 0.2, 3, 0.015)
#legend = plot.PositionedLegend(0.45, 0.10, 3, 0.015)
#plot.Set(legend, NColumns=2)

axis = None

defcols = [
    ROOT.kGreen+3, ROOT.kRed, ROOT.kBlue, ROOT.kBlack, ROOT.kYellow+2,
    ROOT.kOrange+10, ROOT.kCyan+3, ROOT.kMagenta+2, ROOT.kViolet-5, ROOT.kGray
    ]

deflines = [1, 2, 3]

if args.auto_style is not None:
예제 #12
0
axish[1].GetYaxis().SetRangeUser(0.93, 1.07)

if doUncerts:
    ratio_up = plot.MakeRatioHist(histo_unc_up, histo_nominal, True, False)
    ratio_down = plot.MakeRatioHist(histo_unc_down, histo_nominal, True, False)
    ratio_up.SetLineColor(ROOT.kRed)
    ratio_down.SetLineColor(ROOT.kRed)

pads[0].cd()
axish[0].Draw()
histo_nominal.Draw("SAME")
if doUncerts:
    histo_unc_up.Draw("SAME")
    histo_unc_down.Draw("SAME")
#LHE_ht_ghost.Draw("SAME")
legend = plot.PositionedLegend(0.3, 0.15, 3, 0.015)
legend.AddEntry(histo_nominal, "Nominal")
if args.uncerts is not None:
    if 'nlo' in args.uncerts:
        legend.AddEntry(histo_unc_up, "LO to NLO wt Up/Down")
    elif 'wrew' in args.uncerts:
        legend.AddEntry(histo_unc_up, "W pT reweighting Up/Down")
    elif 'scale' in args.uncerts:
        legend.AddEntry(histo_unc_up, "MuRMuF Up/Down")
legend.Draw("SAME")

pads[1].cd()
axish[1].Draw()
if doUncerts:
    ratio_up.Draw("HISTSAME")
    ratio_down.Draw("HISTSAME")
예제 #13
0
splusbhist.SetMarkerSize(0)
splusbhist.SetFillStyle(3944)


stack.Draw("histsame")
splusbhist.Draw("e2same")
#Add signal
if not args.no_signal:
    sighist.SetLineColor(ROOT.kRed)
    sighist.SetLineWidth(3)
    sighist.Draw("histsame")
blind_datahist.DrawCopy("e0psame")
axish[0].Draw("axissame")

#Setup legend
legend = plot.PositionedLegend(0.48,0.30,3,0.03)
plot.Set(legend, NColumns=2)
legend.SetTextFont(42)
legend.SetTextSize(0.025)
legend.SetFillColor(0)
legend.AddEntry(total_datahist,"Observation","PE")
#Drawn on legend in reverse order looks better
bkg_histos.reverse()
plot_background_schemes[channel].reverse()
for legi,hists in enumerate(bkg_histos):
    legend.AddEntry(hists,plot_background_schemes[channel][legi]['leg_text'],"f")
legend.AddEntry(splusbhist,"S+B uncertainty","f")
if not args.no_signal:
    legend.AddEntry(sighist,"H(#mu#mu)","l")
latex = ROOT.TLatex()
latex.SetNDC()
예제 #14
0
def HTTMassPlot(cats=[432], infile=None, infile2=None, prefit_plot=None):

    ROOT.gROOT.SetBatch(ROOT.kTRUE)
    ROOT.TH1.AddDirectory(False)

    ModTDRStyle(r=0.04, l=0.14, height=700)

    sig_schemes = ("ggH(100 GeV)#rightarrow#tau#tau @ 5.7 pb", ["TotalSig"])

    background_schemes = [
        backgroundComp("H(125 GeV)", [
            "qqH125", "bbH125", "ggH125", "ggHWW125", "qqHWW125", "WHWW125",
            "ZHWW125"
        ], ROOT.TColor.GetColor(51, 51, 230)),
        backgroundComp("Diboson", ["VVL"], ROOT.TColor.GetColor("#6F2D35")),
        backgroundComp("t#bar{t}", ["TTL"], ROOT.TColor.GetColor("#9999cc")),
        backgroundComp("Z#rightarrowll", ["ZL"],
                       ROOT.TColor.GetColor("#4496c8")),
        backgroundComp("Jet#rightarrow#tau",
                       ["jetFakes", "wFakes", "QCD", "W"],
                       ROOT.TColor.GetColor(192, 232, 100)),
        backgroundComp("#mu#rightarrow#tau embedding", ["EMB"],
                       ROOT.TColor.GetColor("#ffcc66")),
    ]

    total_datahist = infile.Get('postfit/data_obs').Clone()
    total_bkg = infile.Get('postfit/TotalBkg').Clone()
    total_sig = infile.Get('postfit/TotalSig').Clone()
    if infile2: bkgonly = infile2.Get('postfit/TotalBkg').Clone()
    if prefit_plot: prefit = prefit_plot.Get('prefit/TotalBkg').Clone()

    total_datahist.Scale(1.0, "width")
    total_bkg.Scale(1.0, "width")
    total_sig.Scale(1.0, "width")

    #Create stacked plot for the backgrounds
    bkg_histos = []

    for i, t in enumerate(background_schemes):
        plots = t['plot_list']
        h = ROOT.TH1F()

        for j, k in enumerate(plots):
            for chan in ['et', 'mt', 'tt', 'em']:
                if chan == 'em':
                    cats_ = []
                    for c in cats:
                        cats_.append(c)
                        cats_.append(c + 1)
                else:
                    cats_ = cats
                for c in cats_:
                    for y in [2016, 2017, 2018]:
                        dirname = 'htt_%(chan)s_%(c)s_%(y)s_postfit' % vars()
                        if not (isinstance(infile.Get(dirname + '/' + k),
                                           ROOT.TH1D)
                                or isinstance(infile.Get(dirname + '/' + k),
                                              ROOT.TH1F)):
                            continue

                        if h.GetEntries() == 0:
                            h = infile.Get(dirname + '/' + k).Clone()
                            h.SetName(k)
                        else:
                            h.Add(infile.Get(dirname + '/' + k).Clone())

        h.SetFillColor(t['colour'])
        h.SetLineColor(ROOT.kBlack)
        h.SetMarkerSize(0)
        h.Scale(1.0, "width")
        if h.GetName() == '': continue
        bkg_histos.append(h)

    stack = ROOT.THStack("hs", "")
    for hists in bkg_histos:
        stack.Add(hists.Clone())

    total_sig.SetFillColor(0)
    total_sig.SetLineColor(ROOT.kRed)
    total_sig.SetLineWidth(2)
    stack.Add(total_sig)

    c1 = ROOT.TCanvas()
    c1.cd()

    pads = TwoPadSplit(0.39, 0.01, 0.01)
    pads[0].cd()

    x_title = 'm_{#tau#tau} (GeV)'
    y_title = 'S/(S+B) weighted events / GeV'
    extra_pad = 0.3
    axish = createAxisHists(2, total_bkg,
                            total_bkg.GetXaxis().GetXmin(),
                            total_bkg.GetXaxis().GetXmax() - 0.0001)
    axish[1].GetXaxis().SetTitle(x_title)
    axish[1].GetXaxis().SetLabelSize(0.03)
    axish[1].GetXaxis().SetTitleSize(0.04)
    axish[1].GetYaxis().SetNdivisions(4)
    axish[1].GetYaxis().SetTitle("Obs.-Bkg.")
    axish[1].GetYaxis().SetTitleOffset(1.6)
    axish[1].GetYaxis().SetTitleSize(0.04)
    axish[1].GetYaxis().SetLabelSize(0.03)
    axish[0].GetXaxis().SetTitleSize(0)
    axish[0].GetXaxis().SetLabelSize(0)
    axish[0].GetYaxis().SetTitle(y_title)
    axish[0].GetYaxis().SetTitleOffset(1.6)
    axish[0].GetYaxis().SetTitleSize(0.04)
    axish[0].GetYaxis().SetLabelSize(0.03)
    axish[0].SetMinimum(0)
    axish[0].SetMaximum(1.1 * (1 + extra_pad) * total_bkg.GetMaximum())
    axish[0].Draw()

    stack.Draw("histsame")

    #Draw uncertainty band
    error_hist = total_bkg.Clone()
    error_hist.SetFillColor(CreateTransparentColor(12, 0.4))
    error_hist.SetLineColor(CreateTransparentColor(12, 0.4))
    error_hist.SetMarkerSize(0)
    error_hist.SetMarkerColor(CreateTransparentColor(12, 0.4))
    error_hist.Draw("e2same")

    # draw data
    total_datahist.SetMarkerStyle(20)
    total_datahist.SetLineColor(1)
    #total_datahist.Draw("E same")
    total_datahist.Draw("Esame")
    total_datahist.SetFillStyle(1)

    axish[0].Draw("axissame")

    #Setup legend
    legend = plot.PositionedLegend(0.35, 0.30, 3, 0.03)
    legend.SetTextSize(0.025)
    legend.SetTextFont(42)
    legend.SetFillStyle(0)

    legend.AddEntry(total_datahist, "Observed", "PEl")
    #Drawn on legend in reverse order looks better
    bkg_histos.reverse()

    background_schemes.reverse()
    leg_hists = [None] * len(bkg_histos)
    for legi, hists in enumerate(bkg_histos):
        legend.AddEntry(hists, background_schemes[legi]['leg_text'], "f")
    total_bkg.SetLineWidth(0)
    legend.AddEntry(error_hist, "Bkg. Uncertainty", "f")
    legend.AddEntry(total_sig, "ggH(100 GeV) @ 5.4 pb" % vars(), "l")
    legend.Draw("same")

    # add pT bin label
    bin_label = ''
    if cats[0] == 132: bin_label = 'p_{T}^{#tau#tau} < 50 GeV'
    if cats[0] == 232: bin_label = '50 #leq p_{T}^{#tau#tau} < 100 GeV'
    if cats[0] == 332: bin_label = '100 #leq p_{T}^{#tau#tau} < 200 GeV'
    if cats[0] == 432: bin_label = 'p_{T}^{#tau#tau} #geq 200 GeV'
    if len(cats) == 4: bin_label = 'p_{T}^{#tau#tau} inclusive'

    latex = ROOT.TLatex()
    latex.SetNDC()
    latex.SetTextAngle(0)
    latex.SetTextColor(ROOT.kBlack)
    latex.SetTextFont(42)
    latex.SetTextSize(0.032)
    latex.DrawLatex(0.21, 0.89, "{}".format(bin_label))

    # draw cms and lumi lable
    DrawCMSLogo(pads[0],
                'CMS',
                'Preliminary',
                0,
                0.07,
                -0.0,
                2.0,
                '',
                0.85,
                relExtraDX=0.05)
    lumi = "138 fb^{-1} (13 TeV)"
    plot.DrawTitle(pads[0], lumi, 3, textSize=0.6)

    # draw lower plot with data-bkg

    bkg_sub = SubtractData(error_hist, error_hist)
    data_sub = SubtractData(error_hist, total_datahist)
    if infile2:
        bkgonly.Scale(1.0, "width")
        bkgonly_sub = SubtractData(error_hist, bkgonly)
    if prefit_plot:
        prefit.Scale(1.0, "width")
        prefit_sub = SubtractData(error_hist, prefit)
    pads[1].cd()
    pads[1].SetGrid(0, 1)

    maxy = 0
    miny = 100000
    for i in range(1, data_sub.GetNbinsX() + 1):
        hi = data_sub.GetBinContent(i) + data_sub.GetBinError(i) * 1.2
        lo = data_sub.GetBinContent(i) - data_sub.GetBinError(i) * 1.2
        maxy = max(maxy, hi)
        miny = min(miny, lo)
    for i in range(1, bkg_sub.GetNbinsX() + 1):
        hi = bkg_sub.GetBinContent(i) + bkg_sub.GetBinError(i) * 1.2
        lo = bkg_sub.GetBinContent(i) - bkg_sub.GetBinError(i) * 1.2
        maxy = max(maxy, hi)
        miny = min(miny, lo)
    axish[1].SetMinimum(miny)
    axish[1].SetMaximum(maxy)
    axish[1].Draw("axis")

    if infile2:
        bkgonly_sub.SetLineWidth(2)
        bkgonly_sub.SetLineColor(ROOT.kBlue)
        bkgonly_sub.SetMarkerSize(0)
        bkgonly_sub.SetLineStyle(2)
        bkgonly_sub.Draw("histsame")

        #Setup legend
        legend2 = plot.PositionedLegend(0.25, 0.10, 3, 0.01)
        legend2.SetTextSize(0.025)
        legend2.SetTextFont(42)
        legend2.SetFillStyle(0)

        legend2.AddEntry(bkgonly_sub, "Bkg. only fit", "l")
        legend2.AddEntry(total_sig, "Sig.+Bkg. fit", "l")
        legend2.Draw("same")

    if prefit_plot:
        prefit_sub.SetLineWidth(3)
        prefit_sub.SetLineColor(ROOT.kMagenta)
        prefit_sub.SetMarkerSize(0)
        prefit_sub.SetLineStyle(2)
        prefit_sub.Draw("histsame")

    total_sig.Draw("histsame")
    data_sub.DrawCopy("e0same")
    bkg_sub.SetMarkerSize(0)
    bkg_sub.SetLineColor(ROOT.kBlack)
    bkg_sub.Draw("e2samehist")

    pads[1].RedrawAxis()

    pads[0].cd()
    #pads[0].GetFrame().Draw()
    pads[0].RedrawAxis()

    plot_name = 'plot'
    if len(cats) == 4: plot_name += '_cmb'
    elif cats[0] == 432: plot_name += '_GT200'
    elif cats[0] == 332: plot_name += '_100to200'
    elif cats[0] == 232: plot_name += '_50to100'
    elif cats[0] == 132: plot_name += '_0to50'
    c1.SaveAs('prop_plots/%(plot_name)s.pdf' % vars())
예제 #15
0
    pads = plot.OnePad()

# Set the style options of the pads
for padx in pads:
    # Use tick marks on oppsite axis edges
    plot.Set(padx, Tickx=1, Ticky=1, Logx=args.logx)
    if args.pad_style is not None:
        settings = {x.split('=')[0]: eval(x.split('=')[1]) for x in args.pad_style.split(',')}
        print 'Applying style options to the TPad(s):'
        print settings
        plot.Set(padx, **settings)

graphs = []
graph_sets = []

legend = plot.PositionedLegend(0.48, 0.25, 3, 0.015)
legend.SetTextSize(0.03)

axis = None

defcols = [
    ROOT.kGreen+3, ROOT.kRed, ROOT.kBlue, ROOT.kBlack, ROOT.kYellow+2,
    ROOT.kOrange+10, ROOT.kCyan+3, ROOT.kMagenta+2, ROOT.kViolet-5, ROOT.kGray
    ]

deflines = [1, 2, 3]

if args.auto_style is not None:
    icol = {x: 0 for x in args.auto_style.split(',')}
    icol['default'] = 0
    iline = {}
예제 #16
0
                sighist.SetBinContent(j,axish[0].GetMinimum()*1.00001)
          sighist.Draw("histsame][") # removing vertical lines at the borders of the pad; possible with the trick above
        else: 
          sighist_ggH.SetLineColor(ROOT.kBlue)
          sighist_bbH.SetLineColor(ROOT.kBlue + 3)
          sighist_ggH.SetLineWidth(3)
          sighist_bbH.SetLineWidth(3)
          sighist_ggH.Draw("histsame")
          sighist_bbH.Draw("histsame")
    if not soverb_plot and not fractions: 
      blind_datahist.DrawCopy("e0x0same")
    axish[i].Draw("axissame")

pads[0].cd()
#Setup legend
legend = plot.PositionedLegend(0.30,0.30,3,0.03)
legend.SetTextFont(42)
legend.SetTextSize(0.025)
legend.SetFillStyle(0)

signal_legend = None
if not args.no_signal and model_dep:
    signal_legend = plot.PositionedLegend(0.16,0.04,2,0.03,0.07)
    signal_legend.SetTextFont(42)
    signal_legend.SetTextSize(0.025)
    signal_legend.SetFillStyle(0)

if not soverb_plot and not fractions: legend.AddEntry(total_datahist,"Observation","PE")
#Drawn on legend in reverse order looks better
bkg_histos.reverse()
background_schemes[channel].reverse()