Exemplo n.º 1
0
    def plot_final_f3_split(self, variable, rebin=1, xaxis='', maxy=None):
        ''' Plot the final F3 control region - with bkg. estimation '''
        sig_view = self.make_obj3_fail_cr_views(
            False, 0.5)
        sig_view = self.apply_to_dict( sig_view, RebinView, rebin ) #Rebin

        stack = views.StackView(
            sig_view['zz'],
            MedianView(highv=sig_view['charge_fakes']['sys_up'], centv=sig_view['charge_fakes']['central']),
            sig_view['wz'],
            sig_view['obj1'],
            sig_view['obj2'],
            sig_view['obj12'],
        )
        histo = stack.Get(variable)
        histo.Draw()
        histo.GetHistogram().GetXaxis().SetTitle(xaxis)

        # Add legend
        legend = self.add_legend(histo, leftside=False, entries=4)

        data = sig_view['data'].Get(variable)
        data.Draw('same')
        if maxy:
            histo.SetMaximum(maxy)
        else:
            histo.SetMaximum(
                1.2 * max(
                    histo.GetHistogram().GetMaximum(), data.GetMaximum()))
        self.keep.append(data)
        self.keep.append(histo)

        #legend.AddEntry(data)
        legend.Draw()
Exemplo n.º 2
0
 def make_stack(self,
                rebin=1,
                preprocess=None,
                folder='',
                sort=False,
                postprocess=None):
     ''' Make a stack of the MC histograms '''
     mc_views = self.mc_views(rebin, preprocess, folder)
     if postprocess:
         mc_views = [postprocess(i) for i in mc_views]
     return views.StackView(*mc_views, sorted=sort)
Exemplo n.º 3
0
    def make_stack(self, rebin=1, preprocess=None, folder='', sort=False):
        ''' Make a stack of the MC histograms '''

        mc_views = []
        for x in self.mc_samples:
            mc_view = self.get_view(x)
            if preprocess:
                mc_view = preprocess(mc_view)
            if folder:
                mc_view = self.get_wild_dir(mc_view, folder)
            mc_views.append(self.rebin_view(mc_view, rebin))

        return views.StackView(*mc_views, sorted=sort)
Exemplo n.º 4
0
    def plot_final(self,
                   variable,
                   rebin=1,
                   xaxis='',
                   maxy=10,
                   show_error=False,
                   magnifyHiggs=5):
        ''' Plot the final output - with bkg. estimation '''

        sig_view = self.make_signal_views(rebin)
        vh_nx = views.TitleView(
            views.StyleView(
                views.ScaleView(sig_view['signal120'], magnifyHiggs),
                **data_styles['VH*']), "(%s#times) m_{H} = 120" % magnifyHiggs)

        stack = views.StackView(
            sig_view['wz'],
            sig_view['zz'],
            sig_view['fakes'],
            vh_10x,
        )
        histo = stack.Get(variable)
        histo.Draw()
        histo.GetHistogram().GetXaxis().SetTitle(xaxis)
        histo.SetMaximum(maxy)
        self.keep.append(histo)

        # Add legend
        legend = self.add_legend(histo, leftside=False, entries=4)

        if show_error:
            bkg_error_view = BackgroundErrorView(
                sig_view['fakes'],
                sig_view['wz'],
                sig_view['zz'],
            )
            bkg_error = bkg_error_view.Get(variable)
            self.keep.append(bkg_error)
            bkg_error.Draw('pe2,same')
            legend.AddEntry(bkg_error)

        # Use poisson error bars on the data
        sig_view['data'] = PoissonView(sig_view['data'], x_err=False)

        data = sig_view['data'].Get(variable)
        data.Draw('pe,same')
        self.keep.append(data)

        #legend.AddEntry(data)
        legend.Draw()
Exemplo n.º 5
0
    def plot_final_f3(self,
                      variable,
                      rebin=1,
                      xaxis='',
                      maxy=None,
                      show_error=False):
        ''' Plot the final F3 control region - with bkg. estimation '''
        sig_view = self.make_obj3_fail_cr_views(rebin)

        stack = views.StackView(
            sig_view['charge_fakes'],
            sig_view['fakes'],
            sig_view['wz'],
            sig_view['zz'],
        )
        histo = stack.Get(variable)
        histo.Draw()
        histo.GetHistogram().GetXaxis().SetTitle(xaxis)

        # Add legend
        legend = self.add_legend(histo, leftside=False, entries=4)

        if show_error:
            bkg_error_view = BackgroundErrorView(
                views.SumView(sig_view['fakes'], sig_view['charge_fakes']),
                sig_view['wz'],
                sig_view['zz'],
            )
            bkg_error = bkg_error_view.Get(variable)
            self.keep.append(bkg_error)
            bkg_error.Draw('pe2,same')
            legend.AddEntry(bkg_error)

        data = sig_view['data'].Get(variable)
        data.Draw('same')
        if maxy:
            histo.SetMaximum(maxy)
        else:
            histo.SetMaximum(
                1.2 *
                max(histo.GetHistogram().GetMaximum(), data.GetMaximum()))
        self.keep.append(data)
        self.keep.append(histo)

        #legend.AddEntry(data)
        legend.Draw()
Exemplo n.º 6
0
    def make_charge_flip_control_plot(self,
                                      variable,
                                      xaxis='',
                                      rebin=1,
                                      legend_on_the_left=False,
                                      data_type='data',
                                      x_range=None):
        ss_p1p2_view, ss_fakes_est, os_flip_est_nofake = self.get_flip_data(
            rebin, xaxis, data_type)
        events_estimate = views.StackView(ss_fakes_est, os_flip_est_nofake)

        obs_hist = ss_p1p2_view.Get(variable)
        estimate_hist = events_estimate.Get(variable)
        estimate_error = HistStackToTGRaphErrors(estimate_hist)
        estimate_error.SetFillStyle(3013)
        estimate_error.SetFillColor(ROOT.EColor.kBlack)
        estimate_error.SetTitle('Error on estimate')

        #from pdb import set_trace; set_trace()
        sum_stack = sum(estimate_hist.hists)
        print "variable %s: data integral: %.1f (%.1f/%.1f), estimate: %.1f (%.1f/%.1f) (under/overflow)" % (variable, \
            obs_hist.Integral(), obs_hist.GetBinContent(0), obs_hist.GetBinContent(obs_hist.GetNbinsX()+1), \
            sum_stack.Integral(), sum_stack.GetBinContent(0), sum_stack.GetBinContent(sum_stack.GetNbinsX()+1) )
        hmax = max([estimate_hist.GetMaximum(), max(list(obs_hist))])
        obs_hist.GetYaxis().SetRangeUser(0, hmax * 1.3)
        if x_range:
            obs_hist.GetXaxis().SetRangeUser(x_range[0], x_range[1])

        obs_hist.Draw()
        estimate_hist.Draw('same')
        self.canvas.Update()
        estimate_error.Draw('2 same')
        obs_hist.Draw('same')
        self.keep.extend([estimate_hist, estimate_error, obs_hist])

        legend = self.add_legend([obs_hist],
                                 leftside=legend_on_the_left,
                                 entries=4)
        legend.AddEntry(estimate_hist, 'f')
        #legend.AddEntry(estimate_error,'f')
        legend.Draw()
        self.add_cms_blurb(self.sqrts)
Exemplo n.º 7
0
    def plot_final_wz(self, variable, rebin=1, xaxis='', maxy=None):
        ''' Plot the final WZ control region - with bkg. estimation '''
        sig_view = self.make_wz_cr_views(rebin)

        stack = views.StackView(
            sig_view['fakes'],
            sig_view['wz'],
            sig_view['zz'],
        )
        histo = stack.Get(variable)
        histo.Draw()
        histo.GetHistogram().GetXaxis().SetTitle(xaxis)
        data = sig_view['data'].Get(variable)
        data.Draw('same')
        if maxy is not None:
            histo.SetMaximum(float(maxy))
        else:
            histo.SetMaximum(1.2 * max(histo.GetMaximum(), data.GetMaximum()))
        self.keep.append(data)
        self.keep.append(histo)

        # Add legend
        self.add_legend(histo, leftside=False, entries=4)
Exemplo n.º 8
0
                        metavar='file',
                        nargs='+',
                        help='Histogram files')
    args = parser.parse_args(args[1:])

    log.info("Building views")
    data_views = data_views(args.files, args.pd)

    data_view = data_views[args.pd]['view']

    mc_samples_to_stack = [
        'Zjets', 'QCDMu', 'Wjets', 'ttjets', 'WZ_pythia', 'ZZ'
    ]

    # Build the MC stack
    mc_view = views.StackView(
        *[data_views[x]['view'] for x in mc_samples_to_stack], sort=True)

    # We just need to figure out the directory structure from any old file
    layout_filename = data_views.values()[0]['subsamples'].values(
    )[0]['filename']
    log.info("Getting file layout from %s", layout_filename)

    canvas = Canvas()

    if not os.path.exists(args.output):
        log.info("Creating output directory: %s", args.output)
        os.makedirs(args.output)

    plots_written = []

    with io.open(layout_filename, 'r') as layout_file:
    meta_info = None
    log.info("Opening meta file: %s", args.meta)
    with open(args.meta) as meta_file:
        meta_info = json.load(meta_file)

    log.info("Building views")
    data_views = data_views.data_views(args.files, args.pd)
    data_view = views.FunctorView(data_views[args.pd]['view'],
                                  lambda x: x.Rebin(2))

    mc_samples_to_stack = ['Zjets', 'QCDMu', 'Wjets', 'ttjets']
    # Build the MC stack
    mc_view = views.StackView(*[
        views.FunctorView(data_views[x]['view'], lambda x: x.Rebin(2))
        for x in mc_samples_to_stack
    ],
                              sort=True)

    # We just need to figure out the directory structure from any old file
    layout_filename = data_views.values()[0]['subsamples'].values(
    )[0]['filename']
    log.info("Getting file layout from %s", layout_filename)

    canvas = Canvas()

    plot_list = open(os.path.join(args.output, 'plot_list.txt'), 'w')

    with io.open(layout_filename, 'r') as layout_file:
        for path, subdirs, histos in layout_file.walk(class_pattern='TH1F'):
            for histo in histos:
Exemplo n.º 10
0
 def make_stack(self, rebin=1):
     ''' Make a stack of the MC histograms '''
     all_mc_stack = views.StackView(*[
         self.rebin_view(self.get_view(x), rebin) for x in self.mc_samples
     ])
     return all_mc_stack
Exemplo n.º 11
0
 def make_stack(self, rebin=1, preprocess=None, folder='', sort=False):
     ''' Make a stack of the MC histograms '''
     mc_views = self.mc_views(rebin, preprocess, folder)
     return views.StackView(*mc_views, sorted=sort)
Exemplo n.º 12
0
    def plot_zee_control(self,
                         variable,
                         xaxis='',
                         rebin=1,
                         legend_on_the_left=False,
                         x_range=None,
                         show_ratio=False,
                         logscale=False):
        data_view = self.get_view('data')
        data_view = self.rebin_view(data_view,
                                    rebin) if rebin != 1 else data_view
        mc_views = [
            self.get_view(i)
            for i in ['ZZ*', 'WZ*', 'WW*', 'TT*', 'Zjets_M50']
        ]
        if rebin != 1:
            mc_views = [self.rebin_view(i, rebin) for i in mc_views]

        zee_data = views.SubdirectoryView(data_view, 'os/p1p2/')
        zee_mcs = [views.SubdirectoryView(i, 'os/p1p2/') for i in mc_views]

        #os_f1p2_qcd_view, os_p1f2_qcd_view, os_f1f2_qcd_view = self.make_fakes_view(data_view, 'os','qcd_w')
        os_f1p2_wje_view, os_p1f2_wje_view, os_f1f2_wje_view = self.make_fakes_view(
            data_view, 'os', 'wjet_w')
        os_fakes_1 = os_f1p2_wje_view  #MedianView(lowv=os_f1p2_qcd_view, highv=os_f1p2_wje_view)
        os_fakes_2 = os_p1f2_wje_view  #MedianView(lowv=os_p1f2_qcd_view, highv=os_p1f2_wje_view)
        os_fakes_12 = os_f1f2_wje_view  #MedianView(lowv=os_f1f2_qcd_view, highv=os_f1f2_wje_view)
        os_fakes_est = views.SumView(os_fakes_1, os_fakes_2, os_fakes_12)
        os_fakes_est = views.TitleView(
            views.StyleView(os_fakes_est, **data_styles['WplusJets*']),
            'Fakes;%s' % xaxis)

        zee_mcs = zee_mcs[:-1] + [os_fakes_est] + zee_mcs[-1:]
        events_estimate = views.StackView(*zee_mcs)
        estimate_hist = events_estimate.Get(variable)
        obs_hist = zee_data.Get(variable)
        hmax = max([estimate_hist.GetMaximum(), max(list(obs_hist))])
        if logscale:
            obs_hist.GetYaxis().SetRangeUser(10**-2, hmax * 10**4)
            self.pad.SetLogy(True)
        else:
            obs_hist.GetYaxis().SetRangeUser(0., hmax * 1.3)

        if x_range:
            obs_hist.GetXaxis().SetRangeUser(x_range[0], x_range[1])

        obs_hist.Draw()
        estimate_hist.Draw('same')
        obs_hist.Draw('same')
        self.canvas.Update()
        self.keep.extend([estimate_hist, obs_hist])

        legend = self.add_legend([obs_hist],
                                 leftside=legend_on_the_left,
                                 entries=len(zee_mcs) + 1)
        legend.AddEntry(estimate_hist, 'f')
        #legend.AddEntry(estimate_error,'f')
        legend.Draw()
        if show_ratio:
            self.add_ratio_plot(obs_hist,
                                estimate_hist,
                                x_range,
                                ratio_range=0.2)
        self.add_cms_blurb(self.sqrts)
Exemplo n.º 13
0
    def plot_final_f3(self, variable, rebin=1, xaxis='', maxy=None,
                      show_error=True, qcd_correction=False,
                      qcd_weight_fraction=0., x_range=None, #):
                      show_chi2=False,project=None, 
                      project_axis=None, differential=False, 
                      yaxis='Events', tau_charge='tau_os', show_ratio=False,
                      ratio_range=None, fit=None, **kwargs):
        ''' Plot the final F3 control region - with bkg. estimation '''
        show_chi2 = False #broken
        sig_view = self.make_obj3_fail_cr_views(
            qcd_correction, qcd_weight_fraction, tau_charge)
        if project and project_axis:
            sig_view = self.apply_to_dict( sig_view, ProjectionView, project_axis, project ) 
        sig_view = self.apply_to_dict( sig_view, RebinView, rebin ) #Rebin
        if differential:
            sig_view = self.apply_to_dict(sig_view, DifferentialView)

        charge_fakes_view = MedianView(highv=sig_view['charge_fakes']['sys_up'], centv=sig_view['charge_fakes']['central'])

        stack = views.StackView(
            sig_view['zz'],
            charge_fakes_view,
            sig_view['wz_3l'],
            sig_view['wz'],
            sig_view['fakes'],
        )
        histo = stack.Get(variable)
        histo.Draw()
        histo.GetHistogram().GetXaxis().SetTitle(xaxis)
        histo.GetHistogram().GetYaxis().SetTitle(yaxis)

        if x_range:
            histo.GetHistogram().GetXaxis().SetRangeUser(x_range[0], x_range[1])

        data = sig_view['data'].Get(variable)

        # Add legend
        legend  = self.add_legend(histo, leftside=False, entries=4)
        #latex   = ROOT.TLatex(0.01, 0.9, "")
        #pad     = ROOT.TPad('da','fuq',0.1,0.8,0.5,0.9)
        #self.canvas.cd()
        #latexit = ''
        bkg_error = None
        if show_error:
            #correct_qcd_view = None
            #if qcd_weight_fraction == 0:
            #    fakes05 = sig_view['weighted_fakes'][1.]
            #    correct_qcd_view = MedianView(lowv=fakes05, centv=sig_view['fakes'])
            #
            #elif qcd_weight_fraction == 0.5:
            #    fakes1 = sig_view['weighted_fakes'][1.]
            #    correct_qcd_view = MedianView(highv=fakes1, centv=sig_view['fakes'])
            #
            #elif qcd_weight_fraction == 1:
            #    fakes05 = sig_view['weighted_fakes'][0.5]
            #    correct_qcd_view = MedianView(lowv=fakes05, centv=sig_view['fakes'])

            bkg_error_view = BackgroundErrorView(
                sig_view['fakes'], #correct_qcd_view, 
                views.SumView(sig_view['wz'], sig_view['wz_3l']),
                sig_view['zz'],
                charge_fakes_view,
                fake_error=0.3,
                **kwargs
            )
            bkg_error = bkg_error_view.Get(variable)
            self.keep.append(bkg_error)
            bkg_error.Draw('pe2,same')
            legend.AddEntry(bkg_error)
            #if show_chi2:
            #    chival  = get_chi_square(data, bkg_error)
            #    latexit = '#chi^{2}/#bins = %.2f / %i' % chival 
                
        data.Draw('same')
        if isinstance(maxy, (int, long, float)):
            histo.SetMaximum(maxy)
        else:
            #histo.SetMaximum(
                #1.2*max(histo.GetHistogram().GetMaximum(), data.GetMaximum()))
            histo.SetMaximum(2 * max(data.GetMaximum(), histo.GetMaximum()))
        self.keep.append(data)
        self.keep.append(histo)
        legend.Draw()
        if show_ratio:
            ratio_plot = self.add_ratio_plot(data, bkg_error, x_range, ratio_range=ratio_range)
            if fit:
                #set_trace()
                fitrange = fit.get('range', False)
                if not fitrange:
                    nbins = ratio_plot.GetNbinsX()
                    fitrange = x_range if x_range else [ ratio_plot.GetBinLowEdge(1), 
                       ratio_plot.GetBinLowEdge(nbins)+ratio_plot.GetBinWidth(nbins)]
                self.lower_pad.cd()
                function = self.fit_shape(ratio_plot, fit['model'], fitrange, fit.get('options','IRMENS'))
                toprint  = '#chi^{2} / DoF = %.2f / %i\n' % (function.GetChisquare() , function.GetNDF())
                for i in range(function.GetNpar()):
                    name  = function.GetParName(i) 
                    value = function.GetParameter(i)
                    error = function.GetParError(i)
                    toprint += '%s = %s\n' % (name, smart_float_format((value, error))) #%f #pm %f
            
                stat_box = self.make_text_box(toprint[:-1],fit.get('stat position','bottom-left'))
                stat_box.Draw()
                self.keep.append(stat_box)
                #print toprint
                self.pad.cd()
Exemplo n.º 14
0
    def make_closure_plots(self, var, testDir, refDir, rebin=1, xaxis=''):
        '''helper function to make comparison between data and data (closure test for fakerates etc.)'''
        self.canvas.cd()
        data_view = self.rebin_view(self.data, rebin)
        test_view = views.StyleView(views.TitleView(
            views.SubdirectoryView(data_view, testDir), 'Weighted data'),
                                    fillcolor=ROOT.EColor.kRed,
                                    drawstyle='hist')  #.Get(var)
        refData = views.SubdirectoryView(data_view, refDir).Get(var)

        testSampleName = '_'.join(testDir.split('/')[1:]).replace(
            'IsoFailed', 'fail').replace('_weight', 'w')
        refSampleName = refDir.split('/')[1].replace('IsoFailed',
                                                     'fail').replace(
                                                         '_weight', 'w')
        #testData.SetTitle(testSampleName)
        refData.SetTitle(refSampleName)

        diboson_views = [
            InflateErrorView(
                views.SubdirectoryView(
                    self.rebin_view(self.get_view(pattern), rebin), refDir),
                0.16) for pattern in ['WZ*']
        ]  #, 'ZZ*', 'WW*'] ]
        to_stack_views = diboson_views + [test_view]  #+
        stack_hist = views.StackView(*to_stack_views).Get(var)
        refData.drawstyle = "ep"
        stack_hist.drawstyle = "HIST same"  # same" #"HISTe same "

        hmax = max([
            max([(b.content + b.error) for b in zipBins(refData)]),
            stack_hist.GetMaximum()
        ])
        refData.GetYaxis().SetRangeUser(0, hmax * 1.3)
        refData.GetXaxis().SetTitle(xaxis)

        tgTest = HistStackToTGRaphErrors(stack_hist)
        tgTest.SetFillStyle(3013)
        tgTest.GetXaxis().SetTitle(xaxis)
        tgTest.GetYaxis().SetRangeUser(0, hmax * 1.3)
        self.keep.append(tgTest)

        refData.SetMarkerStyle(20)
        refData.SetMarkerSize(1)
        self.keep.append(refData)
        self.keep.append(stack_hist)
        refData.Draw()
        stack_hist.Draw('same')
        stack_hist.GetXaxis().SetTitle(xaxis)
        stack_hist.GetYaxis().SetRangeUser(0, hmax * 1.3)
        refData.Draw('same')
        tgTest.Draw('2 same')
        #stack_hist.Draw()
        #self.canvas.SetLogy()

        legend = self.add_legend([refData],
                                 leftside=False,
                                 entries=len(to_stack_views) + 1)
        legend.AddEntry(stack_hist, 'f')
        legend.Draw()
        self.add_cms_blurb(self.sqrts)
Exemplo n.º 15
0
        channels['zh']['fakes'] = Style(Getter(zh_combined, 'Zjets', 'Non-prompt'), **fakes)
        channels['zh']['signal'] = Title(ScaleView(Style(
            Sum(
                Getter(zh_combined, 'ZH_htt125'),
                Getter(zh_combined, 'ZH_hww125'),
            ), **signal), sigscale),
            signal_label)
        channels['zh']['obs'] = Style(Getter(zh_combined, 'data_obs', "Observed"), **data)

        #print "ZH overflow check"
        zh_fakes = channels['zh']['fakes'].Get(None)
        #print zh_fakes.GetBinContent(zh_fakes.GetNbinsX())
        #print zh_fakes.GetBinContent(0)
        #print zh_fakes.Integral()

        llt_stack = views.StackView(
            *[channels['llt'][x] for x in ['zz', 'wz', 'fakes', 'signal']])

        #ltt_stack = views.StackView(
            #*[channels['ltt'][x] for x in ['zz', 'wz', 'fakes', 'signal']])

        zh_stack = views.StackView(
            *[channels['zh'][x] for x in ['zz', 'fakes', 'signal']])

        canvas = ROOT.TCanvas("asdf", "asdf", 800, 800)


        def make_a_legend(entries=5):
            vh_legend = Legend(
                entries, rightmargin=0.26, topmargin=0.05, leftmargin=0.375)
            vh_legend.SetEntrySeparation(0.0)
            vh_legend.SetMargin(0.35)
Exemplo n.º 16
0
        if rebin > 1:
            rebinner = lambda x: x.Rebin(rebin)
            output = views.FunctorView(x, rebinner)
            return output
        else:
            return x

    def get_view(sample_pattern):
        for sample, sample_info in the_views.iteritems():
            if fnmatch.fnmatch(sample, sample_pattern):
                return rebin_view(sample_info['view'], args.rebin)
        raise KeyError("I can't find a view that matches %s, I have: %s" %
                       (sample_pattern, " ".join(the_views.keys())))

    # Build data and MC views
    mc_stack = views.StackView(*[get_view(x) for x in args.mclist])
    data = rebin_view(the_views['data']['view'], args.rebin)

    canvas = plotting.Canvas(name='adsf', title='asdf')
    keep = []

    def save(name):
        canvas.SetLogy(False)
        canvas.SaveAs(os.path.join(outputdir, name) + '.png')
        canvas.SetLogy(True)
        canvas.SaveAs(os.path.join(outputdir, name) + '_log.png')
        keep = []

    # Walk the histogram layout
    for path, subdirs, histos in io.open(files[0]).walk(class_pattern='TH1F'):
        for histo in histos:
Exemplo n.º 17
0
    def plot_final(self, variable, rebin=1, xaxis='', maxy=24,
                   show_error=False, qcd_correction=False, stack_higgs=True, 
                   qcd_weight_fraction=0., x_range=None, show_charge_fakes=False,
                   leftside_legend=False, higgs_xsec_multiplier=1, project=None, 
                   project_axis=None, differential=False, yaxis='Events', tau_charge='tau_os', **kwargs):
        ''' Plot the final output - with bkg. estimation '''        
        show_charge_fakes = show_charge_fakes if 'show_charge_fakes' not in self.defaults else self.defaults['show_charge_fakes']
        sig_view = self.make_signal_views(unblinded=(not self.blind), 
                                          qcd_weight_fraction=qcd_weight_fraction,
                                          rebin=rebin, project=project, 
                                          project_axis=project_axis, tau_charge=tau_charge)

        if differential:
            sig_view = self.apply_to_dict(sig_view, DifferentialView)

        vh_10x = views.TitleView(
            views.StyleView(
                views.ScaleView(sig_view['vh125'], higgs_xsec_multiplier),
                **remove_name_entry(data_styles['VH*'])
            ),
            "(%i#times) m_{H} = 125" % higgs_xsec_multiplier
        )
        charge_fakes_view = MedianView(highv=sig_view['charge_fakes']['sys_up'], centv=sig_view['charge_fakes']['central'])

        # Fudge factor to go from 120->125 - change in xsec*BR
        #vh_10x = views.ScaleView(vh_10x), .783)
        tostack = [sig_view['wz_3l'], sig_view['zz'], sig_view['wz'], sig_view['fakes'], vh_10x] if stack_higgs else \
            [sig_view['wz_3l'], sig_view['zz'], sig_view['wz'], sig_view['fakes']]
        if show_charge_fakes:
            tostack = tostack[:2]+[charge_fakes_view]+tostack[2:]

        vh_hww = views.ScaleView(sig_view['vh120_hww'], .783) if 'vh120_hww' in sig_view else None
        if vh_hww:
            tostack = tostack[:-1] + [vh_hww] + tostack[-1:]

        stack = views.StackView( *tostack )
        histo = stack.Get(variable)
        
        histo.Draw()
        histo.GetHistogram().GetXaxis().SetTitle(xaxis)
        histo.GetHistogram().GetYaxis().SetTitle(yaxis)

        if x_range:
            histo.GetHistogram().GetXaxis().SetRangeUser(x_range[0], x_range[1])
        self.keep.append(histo)

        # Add legend
        entries = len(tostack)+1
        if show_error:
            entries += 1
        legend  = self.add_legend(histo, leftside=leftside_legend, entries=entries)

        if show_error:
            #correct_qcd_view = None
            #if qcd_weight_fraction == 0:
            #    fakes05 = sig_view['weighted_fakes'][1.]
            #    correct_qcd_view = MedianView(lowv=fakes05, centv=sig_view['fakes'])
            #
            #elif qcd_weight_fraction == 0.5:
            #    fakes1 = sig_view['weighted_fakes'][1.]
            #    correct_qcd_view = MedianView(highv=fakes1, centv=sig_view['fakes'])
            #
            #elif qcd_weight_fraction == 1:
            #    fakes05 = sig_view['weighted_fakes'][0.5]
            #    correct_qcd_view = MedianView(lowv=fakes05, centv=sig_view['fakes'])

            bkg_error_view = BackgroundErrorView(
                sig_view['fakes'], #correct_qcd_view, #sig_view['fakes'],
                views.SumView( sig_view['wz'], sig_view['wz_3l']),
                sig_view['zz'],
                charge_fakes_view,
                fake_error=0.3,
                **kwargs
            )
            bkg_error = bkg_error_view.Get(variable)
            self.keep.append(bkg_error)
            bkg_error.Draw('pe2,same')
            legend.AddEntry(bkg_error)

        # Use poisson error bars on the data
        sig_view['data'] = PoissonView(sig_view['data'], x_err=False, is_scaled=differential) #PoissonView(, x_err=False)

        data = sig_view['data'].Get(variable)
        ymax = histo.GetMaximum()
        if not self.blind or tau_charge != 'tau_os':
            #print "drawing", data.Integral()
            data.Draw('pe,same')
            legend.AddEntry(data)
            ymax = max(ymax, data.GetMaximum())
        self.keep.append(data)

        if isinstance(maxy, (int, long, float)):
            #print "setting maxy to %s" % maxy
            histo.SetMaximum(maxy)
            self.canvas.Update()
        else:
            histo.SetMaximum(ymax*1.2)

        if not stack_higgs:
            higgs_plot = vh_10x.Get(variable)
            higgs_plot.Draw('same')
            self.keep.append(higgs_plot)
            
        legend.Draw()