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()
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)
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)
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()
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()
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)
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)
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:
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
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)
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)
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()
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)
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)
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:
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()