def plotHistograms( histogram_files, var_to_plot, output_folder): ''' ''' global measurement_config weightBranchSignalRegion = 'EventWeight * PUWeight * BJetWeight' weightBranchControlRegion = 'EventWeight' # Names of QCD regions to use qcd_data_region = '' qcd_data_region_electron = 'QCD non iso e+jets' qcd_data_region_muon = 'QCD non iso mu+jets 1p5to3' sr_e_tree = 'TTbar_plus_X_analysis/EPlusJets/Ref selection/AnalysisVariables' sr_mu_tree = 'TTbar_plus_X_analysis/MuPlusJets/Ref selection/AnalysisVariables' cr_e_tree = 'TTbar_plus_X_analysis/EPlusJets/{}/AnalysisVariables'.format(qcd_data_region_electron) cr_mu_tree = 'TTbar_plus_X_analysis/MuPlusJets/{}/AnalysisVariables'.format(qcd_data_region_muon) print "Trees : " print "\t {}".format(sr_e_tree) print "\t {}".format(sr_mu_tree) print "\t {}".format(cr_e_tree) print "\t {}".format(cr_mu_tree) histogram_files_electron = dict(histogram_files) histogram_files_electron['data'] = measurement_config.data_file_electron histogram_files_electron['QCD'] = measurement_config.electron_QCD_MC_trees histogram_files_muon = dict(histogram_files) histogram_files_muon['data'] = measurement_config.data_file_muon histogram_files_muon['QCD'] = measurement_config.muon_QCD_MC_trees signal_region_hists = {} control_region_hists = {} for var in var_to_plot: selectionSignalRegion = '{} >= 0'.format(var) # Print all the weights applied to this plot print "Variable : {}".format(var) print "Weight applied : {}".format(weightBranchSignalRegion) print "Selection applied : {}".format(selectionSignalRegion) histograms_electron = get_histograms_from_trees( trees = [sr_e_tree], branch = var, weightBranch = weightBranchSignalRegion + ' * ElectronEfficiencyCorrection', files = histogram_files_electron, nBins = 20, xMin = control_plots_bins[var][0], xMax = control_plots_bins[var][-1], selection = selectionSignalRegion ) histograms_muon = get_histograms_from_trees( trees = [sr_mu_tree], branch = var, weightBranch = weightBranchSignalRegion + ' * MuonEfficiencyCorrection', files = histogram_files_muon, nBins = 20, xMin = control_plots_bins[var][0], xMax = control_plots_bins[var][-1], selection = selectionSignalRegion ) histograms_electron_QCDControlRegion = get_histograms_from_trees( trees = [cr_e_tree], branch = var, weightBranch = weightBranchControlRegion, files = histogram_files_electron, nBins = 20, xMin = control_plots_bins[var][0], xMax = control_plots_bins[var][-1], selection = selectionSignalRegion ) histograms_muon_QCDControlRegion = get_histograms_from_trees( trees = [cr_mu_tree], branch = var, weightBranch = weightBranchControlRegion, files = histogram_files_muon, nBins = 20, xMin = control_plots_bins[var][0], xMax = control_plots_bins[var][-1], selection = selectionSignalRegion ) # Combine the electron and muon histograms for sample in histograms_electron: h_electron = histograms_electron[sample][sr_e_tree] h_muon = histograms_muon[sample][sr_mu_tree] h_qcd_electron = histograms_electron_QCDControlRegion[sample][cr_e_tree] h_qcd_muon = histograms_muon_QCDControlRegion[sample][cr_mu_tree] signal_region_hists[sample] = h_electron + h_muon control_region_hists[sample] = h_qcd_electron + h_qcd_muon # NORMALISE TO LUMI prepare_histograms( signal_region_hists, scale_factor = measurement_config.luminosity_scale ) prepare_histograms( control_region_hists, scale_factor = measurement_config.luminosity_scale ) # BACKGROUND SUBTRACTION FOR QCD qcd_from_data = None qcd_from_data = clean_control_region( control_region_hists, subtract = ['TTJet', 'V+Jets', 'SingleTop'] ) # DATA DRIVEN QCD nBins = signal_region_hists['QCD'].GetNbinsX() n, error = signal_region_hists['QCD'].integral(0,nBins+1,error=True) n_qcd_predicted_mc_signal = ufloat( n, error) n, error = control_region_hists['QCD'].integral(0,nBins+1,error=True) n_qcd_predicted_mc_control = ufloat( n, error) n, error = qcd_from_data.integral(0,nBins+1,error=True) n_qcd_control_region = ufloat( n, error) dataDrivenQCDScale = n_qcd_predicted_mc_signal / n_qcd_predicted_mc_control qcd_from_data.Scale( dataDrivenQCDScale.nominal_value ) signal_region_hists['QCD'] = qcd_from_data # PLOTTING histograms_to_draw = [] histogram_lables = [] histogram_colors = [] histograms_to_draw = [ # signal_region_hists['data'], # qcd_from_data, # signal_region_hists['V+Jets'], signal_region_hists['SingleTop'], signal_region_hists['ST_s'], signal_region_hists['ST_t'], signal_region_hists['ST_tW'], signal_region_hists['STbar_t'], signal_region_hists['STbar_tW'], # signal_region_hists['TTJet'], ] histogram_lables = [ 'data', # 'QCD', # 'V+Jets', # 'Single-Top', 'ST-s', 'ST-t', 'ST-tW', 'STbar-t', 'STbar-tW', # samples_latex['TTJet'], ] histogram_colors = [ colours['data'], # colours['QCD'], # colours['V+Jets'], # colours['Single-Top'], colours['ST_s'], colours['ST_t'], colours['ST_tW'], colours['STbar_t'], colours['STbar_tW'], # colours['TTJet'], ] # Find maximum y of samples maxData = max( list(signal_region_hists['SingleTop'].y()) ) y_limits = [0, maxData * 1.5] log_y = False if log_y: y_limits = [0.1, maxData * 100 ] # Lumi title of plots title_template = '%.1f fb$^{-1}$ (%d TeV)' title = title_template % ( measurement_config.new_luminosity/1000., measurement_config.centre_of_mass_energy ) x_axis_title = '$%s$ [GeV]' % variables_latex[var] y_axis_title = 'Events/(%i GeV)' % binWidth(control_plots_bins[var]) # More histogram settings to look semi decent histogram_properties = Histogram_properties() histogram_properties.name = var + '_with_ratio' histogram_properties.title = title histogram_properties.x_axis_title = x_axis_title histogram_properties.y_axis_title = y_axis_title histogram_properties.x_limits = control_plots_bins[var] histogram_properties.y_limits = y_limits histogram_properties.y_max_scale = 1.4 histogram_properties.xerr = None histogram_properties.emptybins = True histogram_properties.additional_text = channel_latex['combined'] histogram_properties.legend_location = ( 0.9, 0.73 ) histogram_properties.cms_logo_location = 'left' histogram_properties.preliminary = True histogram_properties.set_log_y = log_y histogram_properties.legend_color = False histogram_properties.ratio_y_limits = [0.1,1.9] if log_y: histogram_properties.name += '_logy' loc = histogram_properties.legend_location histogram_properties.legend_location = ( loc[0], loc[1] + 0.05 ) make_data_mc_comparison_plot( histograms_to_draw, histogram_lables, histogram_colors, histogram_properties, save_folder = output_folder, show_ratio = True, ) histogram_properties.name = var + '_ST_TTJet_Shape' if log_y: histogram_properties.name += '_logy' histogram_properties.y_axis_title = 'Normalised Distribution' histogram_properties.y_limits = [0,0.5] make_shape_comparison_plot( shapes = [ signal_region_hists['TTJet'], signal_region_hists['ST_t'], signal_region_hists['ST_tW'], signal_region_hists['ST_s'], signal_region_hists['STbar_t'], signal_region_hists['STbar_tW'], ], names = [ samples_latex['TTJet'], 'Single-Top t channel', 'Single-Top tW channel', 'Single-Top s channel', 'Single-AntiTop t channel', 'Single-AntiTop tW channel', ], colours = [ colours['TTJet'], colours['ST_t'], colours['ST_tW'], colours['ST_s'], colours['STbar_t'], colours['STbar_tW'], ], histogram_properties = histogram_properties, save_folder = output_folder, fill_area = False, add_error_bars = False, save_as = ['pdf'], make_ratio = True, alpha = 1, ) print_output(signal_region_hists, output_folder, var, 'combined') return
def main(): config = XSectionConfig(13) file_for_powhegPythia = File(config.unfolding_central_firstHalf, 'read') file_for_ptReweight_up = File(config.unfolding_ptreweight_up_firstHalf, 'read') file_for_ptReweight_down = File(config.unfolding_ptreweight_down_firstHalf, 'read') file_for_amcatnlo_pythia8 = File(config.unfolding_amcatnlo_pythia8, 'read') file_for_powhegHerwig = File(config.unfolding_powheg_herwig, 'read') file_for_etaReweight_up = File(config.unfolding_etareweight_up, 'read') file_for_etaReweight_down = File(config.unfolding_etareweight_down, 'read') file_for_data_template = 'data/normalisation/background_subtraction/13TeV/{variable}/VisiblePS/central/normalisation_{channel}.txt' for channel in config.analysis_types.keys(): if channel is 'combined':continue for variable in config.variables: print variable # for variable in ['HT']: # Get the central powheg pythia distributions _, _, response_central, fakes_central = get_unfold_histogram_tuple( inputfile=file_for_powhegPythia, variable=variable, channel=channel, centre_of_mass=13, load_fakes=True, visiblePS=True ) measured_central = asrootpy(response_central.ProjectionX('px',1)) truth_central = asrootpy(response_central.ProjectionY()) # Get the reweighted powheg pythia distributions _, _, response_pt_reweighted_up, _ = get_unfold_histogram_tuple( inputfile=file_for_ptReweight_up, variable=variable, channel=channel, centre_of_mass=13, load_fakes=False, visiblePS=True ) measured_pt_reweighted_up = asrootpy(response_pt_reweighted_up.ProjectionX('px',1)) truth_pt_reweighted_up = asrootpy(response_pt_reweighted_up.ProjectionY()) _, _, response_pt_reweighted_down, _ = get_unfold_histogram_tuple( inputfile=file_for_ptReweight_down, variable=variable, channel=channel, centre_of_mass=13, load_fakes=False, visiblePS=True ) measured_pt_reweighted_down = asrootpy(response_pt_reweighted_down.ProjectionX('px',1)) truth_pt_reweighted_down = asrootpy(response_pt_reweighted_down.ProjectionY()) # _, _, response_eta_reweighted_up, _ = get_unfold_histogram_tuple( # inputfile=file_for_etaReweight_up, # variable=variable, # channel=channel, # centre_of_mass=13, # load_fakes=False, # visiblePS=True # ) # measured_eta_reweighted_up = asrootpy(response_eta_reweighted_up.ProjectionX('px',1)) # truth_eta_reweighted_up = asrootpy(response_eta_reweighted_up.ProjectionY()) # _, _, response_eta_reweighted_down, _ = get_unfold_histogram_tuple( # inputfile=file_for_etaReweight_down, # variable=variable, # channel=channel, # centre_of_mass=13, # load_fakes=False, # visiblePS=True # ) # measured_eta_reweighted_down = asrootpy(response_eta_reweighted_down.ProjectionX('px',1)) # truth_eta_reweighted_down = asrootpy(response_eta_reweighted_down.ProjectionY()) # Get the distributions for other MC models _, _, response_amcatnlo_pythia8, _ = get_unfold_histogram_tuple( inputfile=file_for_amcatnlo_pythia8, variable=variable, channel=channel, centre_of_mass=13, load_fakes=False, visiblePS=True ) measured_amcatnlo_pythia8 = asrootpy(response_amcatnlo_pythia8.ProjectionX('px',1)) truth_amcatnlo_pythia8 = asrootpy(response_amcatnlo_pythia8.ProjectionY()) _, _, response_powhegHerwig, _ = get_unfold_histogram_tuple( inputfile=file_for_powhegHerwig, variable=variable, channel=channel, centre_of_mass=13, load_fakes=False, visiblePS=True ) measured_powhegHerwig = asrootpy(response_powhegHerwig.ProjectionX('px',1)) truth_powhegHerwig = asrootpy(response_powhegHerwig.ProjectionY()) # Get the data input (data after background subtraction, and fake removal) file_for_data = file_for_data_template.format( variable = variable, channel = channel ) data = read_tuple_from_file(file_for_data)['TTJet'] data = value_error_tuplelist_to_hist( data, reco_bin_edges_vis[variable] ) data = removeFakes( measured_central, fakes_central, data ) # Plot all three hp = Histogram_properties() hp.name = 'Reweighting_check_{channel}_{variable}_at_{com}TeV'.format( channel=channel, variable=variable, com='13', ) v_latex = latex_labels.variables_latex[variable] unit = '' if variable in ['HT', 'ST', 'MET', 'WPT', 'lepton_pt']: unit = ' [GeV]' hp.x_axis_title = v_latex + unit hp.x_limits = [ reco_bin_edges_vis[variable][0], reco_bin_edges_vis[variable][-1]] hp.ratio_y_limits = [0.1,1.9] hp.ratio_y_title = 'Reweighted / Central' hp.y_axis_title = 'Number of events' hp.title = 'Reweighting check for {variable}'.format(variable=v_latex) measured_central.Rebin(2) measured_pt_reweighted_up.Rebin(2) measured_pt_reweighted_down.Rebin(2) # measured_eta_reweighted_up.Rebin(2) # measured_eta_reweighted_down.Rebin(2) measured_amcatnlo_pythia8.Rebin(2) measured_powhegHerwig.Rebin(2) data.Rebin(2) measured_central.Scale( 1 / measured_central.Integral() ) measured_pt_reweighted_up.Scale( 1 / measured_pt_reweighted_up.Integral() ) measured_pt_reweighted_down.Scale( 1 / measured_pt_reweighted_down.Integral() ) measured_amcatnlo_pythia8.Scale( 1 / measured_amcatnlo_pythia8.Integral() ) measured_powhegHerwig.Scale( 1 / measured_powhegHerwig.Integral() ) # measured_eta_reweighted_up.Scale( 1 / measured_eta_reweighted_up.Integral() ) # measured_eta_reweighted_down.Scale( 1/ measured_eta_reweighted_down.Integral() ) data.Scale( 1 / data.Integral() ) print list(measured_central.y()) print list(measured_amcatnlo_pythia8.y()) print list(measured_powhegHerwig.y()) print list(data.y()) compare_measurements( # models = {'Central' : measured_central, 'PtReweighted Up' : measured_pt_reweighted_up, 'PtReweighted Down' : measured_pt_reweighted_down, 'EtaReweighted Up' : measured_eta_reweighted_up, 'EtaReweighted Down' : measured_eta_reweighted_down}, models = OrderedDict([('Central' , measured_central), ('PtReweighted Up' , measured_pt_reweighted_up), ('PtReweighted Down' , measured_pt_reweighted_down), ('amc@nlo' , measured_amcatnlo_pythia8), ('powhegHerwig' , measured_powhegHerwig) ] ), measurements = {'Data' : data}, show_measurement_errors=True, histogram_properties=hp, save_folder='plots/unfolding/reweighting_check', save_as=['pdf'], line_styles_for_models = ['solid','solid','solid','dashed','dashed'], show_ratio_for_pairs = OrderedDict( [ ('PtUpVsCentral' , [ measured_pt_reweighted_up, measured_central ] ), ('PtDownVsCentral' , [ measured_pt_reweighted_down, measured_central ] ), ('amcatnloVsCentral' , [ measured_amcatnlo_pythia8, measured_central ] ), ('powhegHerwigVsCentral' , [ measured_powhegHerwig, measured_central ] ), ('DataVsCentral' , [data, measured_central] ) ]), )
def plotHistograms(histogram_files, var_to_plot, output_folder): ''' ''' global measurement_config weightBranchSignalRegion = 'EventWeight * PUWeight * BJetWeight' weightBranchControlRegion = 'EventWeight' # Names of QCD regions to use qcd_data_region = '' qcd_data_region_electron = 'QCD non iso e+jets' qcd_data_region_muon = 'QCD non iso mu+jets 1p5to3' sr_e_tree = 'TTbar_plus_X_analysis/EPlusJets/Ref selection/AnalysisVariables' sr_mu_tree = 'TTbar_plus_X_analysis/MuPlusJets/Ref selection/AnalysisVariables' cr_e_tree = 'TTbar_plus_X_analysis/EPlusJets/{}/AnalysisVariables'.format( qcd_data_region_electron) cr_mu_tree = 'TTbar_plus_X_analysis/MuPlusJets/{}/AnalysisVariables'.format( qcd_data_region_muon) print "Trees : " print "\t {}".format(sr_e_tree) print "\t {}".format(sr_mu_tree) print "\t {}".format(cr_e_tree) print "\t {}".format(cr_mu_tree) histogram_files_electron = dict(histogram_files) histogram_files_electron['data'] = measurement_config.data_file_electron histogram_files_electron['QCD'] = measurement_config.electron_QCD_MC_trees histogram_files_muon = dict(histogram_files) histogram_files_muon['data'] = measurement_config.data_file_muon histogram_files_muon['QCD'] = measurement_config.muon_QCD_MC_trees signal_region_hists = {} control_region_hists = {} for var in var_to_plot: selectionSignalRegion = '{} >= 0'.format(var) # Print all the weights applied to this plot print "Variable : {}".format(var) print "Weight applied : {}".format(weightBranchSignalRegion) print "Selection applied : {}".format(selectionSignalRegion) histograms_electron = get_histograms_from_trees( trees=[sr_e_tree], branch=var, weightBranch=weightBranchSignalRegion + ' * ElectronEfficiencyCorrection', files=histogram_files_electron, nBins=20, xMin=control_plots_bins[var][0], xMax=control_plots_bins[var][-1], selection=selectionSignalRegion) histograms_muon = get_histograms_from_trees( trees=[sr_mu_tree], branch=var, weightBranch=weightBranchSignalRegion + ' * MuonEfficiencyCorrection', files=histogram_files_muon, nBins=20, xMin=control_plots_bins[var][0], xMax=control_plots_bins[var][-1], selection=selectionSignalRegion) histograms_electron_QCDControlRegion = get_histograms_from_trees( trees=[cr_e_tree], branch=var, weightBranch=weightBranchControlRegion, files=histogram_files_electron, nBins=20, xMin=control_plots_bins[var][0], xMax=control_plots_bins[var][-1], selection=selectionSignalRegion) histograms_muon_QCDControlRegion = get_histograms_from_trees( trees=[cr_mu_tree], branch=var, weightBranch=weightBranchControlRegion, files=histogram_files_muon, nBins=20, xMin=control_plots_bins[var][0], xMax=control_plots_bins[var][-1], selection=selectionSignalRegion) # Combine the electron and muon histograms for sample in histograms_electron: h_electron = histograms_electron[sample][sr_e_tree] h_muon = histograms_muon[sample][sr_mu_tree] h_qcd_electron = histograms_electron_QCDControlRegion[sample][ cr_e_tree] h_qcd_muon = histograms_muon_QCDControlRegion[sample][cr_mu_tree] signal_region_hists[sample] = h_electron + h_muon control_region_hists[sample] = h_qcd_electron + h_qcd_muon # NORMALISE TO LUMI prepare_histograms(signal_region_hists, scale_factor=measurement_config.luminosity_scale) prepare_histograms(control_region_hists, scale_factor=measurement_config.luminosity_scale) # BACKGROUND SUBTRACTION FOR QCD qcd_from_data = None qcd_from_data = clean_control_region( control_region_hists, subtract=['TTJet', 'V+Jets', 'SingleTop']) # DATA DRIVEN QCD nBins = signal_region_hists['QCD'].GetNbinsX() n, error = signal_region_hists['QCD'].integral(0, nBins + 1, error=True) n_qcd_predicted_mc_signal = ufloat(n, error) n, error = control_region_hists['QCD'].integral(0, nBins + 1, error=True) n_qcd_predicted_mc_control = ufloat(n, error) n, error = qcd_from_data.integral(0, nBins + 1, error=True) n_qcd_control_region = ufloat(n, error) dataDrivenQCDScale = n_qcd_predicted_mc_signal / n_qcd_predicted_mc_control qcd_from_data.Scale(dataDrivenQCDScale.nominal_value) signal_region_hists['QCD'] = qcd_from_data # PLOTTING histograms_to_draw = [] histogram_lables = [] histogram_colors = [] histograms_to_draw = [ # signal_region_hists['data'], # qcd_from_data, # signal_region_hists['V+Jets'], signal_region_hists['SingleTop'], signal_region_hists['ST_s'], signal_region_hists['ST_t'], signal_region_hists['ST_tW'], signal_region_hists['STbar_t'], signal_region_hists['STbar_tW'], # signal_region_hists['TTJet'], ] histogram_lables = [ 'data', # 'QCD', # 'V+Jets', # 'Single-Top', 'ST-s', 'ST-t', 'ST-tW', 'STbar-t', 'STbar-tW', # samples_latex['TTJet'], ] histogram_colors = [ colours['data'], # colours['QCD'], # colours['V+Jets'], # colours['Single-Top'], colours['ST_s'], colours['ST_t'], colours['ST_tW'], colours['STbar_t'], colours['STbar_tW'], # colours['TTJet'], ] # Find maximum y of samples maxData = max(list(signal_region_hists['SingleTop'].y())) y_limits = [0, maxData * 1.5] log_y = False if log_y: y_limits = [0.1, maxData * 100] # Lumi title of plots title_template = '%.1f fb$^{-1}$ (%d TeV)' title = title_template % (measurement_config.new_luminosity / 1000., measurement_config.centre_of_mass_energy) x_axis_title = '$%s$ [GeV]' % variables_latex[var] y_axis_title = 'Events/(%i GeV)' % binWidth(control_plots_bins[var]) # More histogram settings to look semi decent histogram_properties = Histogram_properties() histogram_properties.name = var + '_with_ratio' histogram_properties.title = title histogram_properties.x_axis_title = x_axis_title histogram_properties.y_axis_title = y_axis_title histogram_properties.x_limits = control_plots_bins[var] histogram_properties.y_limits = y_limits histogram_properties.y_max_scale = 1.4 histogram_properties.xerr = None histogram_properties.emptybins = True histogram_properties.additional_text = channel_latex['combined'] histogram_properties.legend_location = (0.9, 0.73) histogram_properties.cms_logo_location = 'left' histogram_properties.preliminary = True histogram_properties.set_log_y = log_y histogram_properties.legend_color = False histogram_properties.ratio_y_limits = [0.1, 1.9] if log_y: histogram_properties.name += '_logy' loc = histogram_properties.legend_location histogram_properties.legend_location = (loc[0], loc[1] + 0.05) make_data_mc_comparison_plot( histograms_to_draw, histogram_lables, histogram_colors, histogram_properties, save_folder=output_folder, show_ratio=True, ) histogram_properties.name = var + '_ST_TTJet_Shape' if log_y: histogram_properties.name += '_logy' histogram_properties.y_axis_title = 'Normalised Distribution' histogram_properties.y_limits = [0, 0.5] make_shape_comparison_plot( shapes=[ signal_region_hists['TTJet'], signal_region_hists['ST_t'], signal_region_hists['ST_tW'], signal_region_hists['ST_s'], signal_region_hists['STbar_t'], signal_region_hists['STbar_tW'], ], names=[ samples_latex['TTJet'], 'Single-Top t channel', 'Single-Top tW channel', 'Single-Top s channel', 'Single-AntiTop t channel', 'Single-AntiTop tW channel', ], colours=[ colours['TTJet'], colours['ST_t'], colours['ST_tW'], colours['ST_s'], colours['STbar_t'], colours['STbar_tW'], ], histogram_properties=histogram_properties, save_folder=output_folder, fill_area=False, add_error_bars=False, save_as=['pdf'], make_ratio=True, alpha=1, ) print_output(signal_region_hists, output_folder, var, 'combined') return
def make_ttbarReco_plot( channel, x_axis_title, y_axis_title, signal_region_tree, control_region_tree, branchName, name_prefix, x_limits, nBins, use_qcd_data_region=False, y_limits=[], y_max_scale=1.2, rebin=1, legend_location=(0.98, 0.78), cms_logo_location='right', log_y=False, legend_color=False, ratio_y_limits=[0.3, 1.7], normalise=False, ): global output_folder, measurement_config, category, normalise_to_fit global preliminary, norm_variable, sum_bins, b_tag_bin, histogram_files # Input files, normalisations, tree/region names qcd_data_region = '' title = title_template % (measurement_config.new_luminosity / 1000., measurement_config.centre_of_mass_energy) normalisation = None if channel == 'electron': histogram_files['data'] = measurement_config.data_file_electron_trees histogram_files[ 'QCD'] = measurement_config.electron_QCD_MC_category_templates_trees[ category] if normalise_to_fit: normalisation = normalisations_electron[norm_variable] if use_qcd_data_region: qcd_data_region = 'QCDConversions' if channel == 'muon': histogram_files['data'] = measurement_config.data_file_muon_trees histogram_files[ 'QCD'] = measurement_config.muon_QCD_MC_category_templates_trees[ category] if normalise_to_fit: normalisation = normalisations_muon[norm_variable] if use_qcd_data_region: qcd_data_region = 'QCD non iso mu+jets ge3j' histograms = get_histograms_from_trees( trees=[signal_region_tree, control_region_tree], branch=branchName, weightBranch='1', files=histogram_files, nBins=nBins, xMin=x_limits[0], xMax=x_limits[-1]) selection = 'SolutionCategory == 0' histogramsNoSolution = get_histograms_from_trees( trees=[signal_region_tree], branch=branchName, weightBranch='1', selection=selection, files=histogram_files, nBins=nBins, xMin=x_limits[0], xMax=x_limits[-1]) selection = 'SolutionCategory == 1' histogramsCorrect = get_histograms_from_trees(trees=[signal_region_tree], branch=branchName, weightBranch='1', selection=selection, files=histogram_files, nBins=nBins, xMin=x_limits[0], xMax=x_limits[-1]) selection = 'SolutionCategory == 2' histogramsNotSL = get_histograms_from_trees(trees=[signal_region_tree], branch=branchName, weightBranch='1', selection=selection, files=histogram_files, nBins=nBins, xMin=x_limits[0], xMax=x_limits[-1]) selection = 'SolutionCategory == 3' histogramsNotReco = get_histograms_from_trees(trees=[signal_region_tree], branch=branchName, weightBranch='1', selection=selection, files=histogram_files, nBins=nBins, xMin=x_limits[0], xMax=x_limits[-1]) selection = 'SolutionCategory > 3' histogramsWrong = get_histograms_from_trees(trees=[signal_region_tree], branch=branchName, weightBranch='1', selection=selection, files=histogram_files, nBins=nBins, xMin=x_limits[0], xMax=x_limits[-1]) # Split histograms up into signal/control (?) signal_region_hists = {} inclusive_control_region_hists = {} for sample in histograms.keys(): signal_region_hists[sample] = histograms[sample][signal_region_tree] if use_qcd_data_region: inclusive_control_region_hists[sample] = histograms[sample][ control_region_tree] prepare_histograms(histograms, rebin=1, scale_factor=measurement_config.luminosity_scale) prepare_histograms(histogramsNoSolution, rebin=1, scale_factor=measurement_config.luminosity_scale) prepare_histograms(histogramsCorrect, rebin=1, scale_factor=measurement_config.luminosity_scale) prepare_histograms(histogramsNotSL, rebin=1, scale_factor=measurement_config.luminosity_scale) prepare_histograms(histogramsNotReco, rebin=1, scale_factor=measurement_config.luminosity_scale) prepare_histograms(histogramsWrong, rebin=1, scale_factor=measurement_config.luminosity_scale) qcd_from_data = signal_region_hists['QCD'] # Which histograms to draw, and properties histograms_to_draw = [ signal_region_hists['data'], qcd_from_data, signal_region_hists['V+Jets'], signal_region_hists['SingleTop'], histogramsNoSolution['TTJet'][signal_region_tree], histogramsNotSL['TTJet'][signal_region_tree], histogramsNotReco['TTJet'][signal_region_tree], histogramsWrong['TTJet'][signal_region_tree], histogramsCorrect['TTJet'][signal_region_tree] ] histogram_lables = [ 'data', 'QCD', 'V+Jets', 'Single-Top', samples_latex['TTJet'] + ' - no solution', samples_latex['TTJet'] + ' - not SL', samples_latex['TTJet'] + ' - not reconstructible', samples_latex['TTJet'] + ' - wrong reco', samples_latex['TTJet'] + ' - correct', ] histogram_colors = [ 'black', 'yellow', 'green', 'magenta', 'black', 'burlywood', 'chartreuse', 'blue', 'red' ] histogram_properties = Histogram_properties() histogram_properties.name = name_prefix + b_tag_bin if category != 'central': histogram_properties.name += '_' + category histogram_properties.title = title histogram_properties.x_axis_title = x_axis_title histogram_properties.y_axis_title = y_axis_title histogram_properties.x_limits = x_limits histogram_properties.y_limits = y_limits histogram_properties.y_max_scale = y_max_scale histogram_properties.xerr = None # workaround for rootpy issue #638 histogram_properties.emptybins = True if b_tag_bin: histogram_properties.additional_text = channel_latex[ channel] + ', ' + b_tag_bins_latex[b_tag_bin] else: histogram_properties.additional_text = channel_latex[channel] histogram_properties.legend_location = legend_location histogram_properties.cms_logo_location = cms_logo_location histogram_properties.preliminary = preliminary histogram_properties.set_log_y = log_y histogram_properties.legend_color = legend_color if ratio_y_limits: histogram_properties.ratio_y_limits = ratio_y_limits if normalise_to_fit: histogram_properties.mc_error = get_normalisation_error(normalisation) histogram_properties.mc_errors_label = 'fit uncertainty' else: histogram_properties.mc_error = mc_uncertainty histogram_properties.mc_errors_label = 'MC unc.' # Actually draw histograms make_data_mc_comparison_plot( histograms_to_draw, histogram_lables, histogram_colors, histogram_properties, save_folder=output_folder, show_ratio=False, normalise=normalise, ) histogram_properties.name += '_with_ratio' loc = histogram_properties.legend_location # adjust legend location as it is relative to canvas! histogram_properties.legend_location = (loc[0], loc[1] + 0.05) make_data_mc_comparison_plot( histograms_to_draw, histogram_lables, histogram_colors, histogram_properties, save_folder=output_folder, show_ratio=True, normalise=normalise, )
def drawHistograms( dictionaryOfHistograms, uncertaintyBand, config, channel, variable ) : histograms_to_draw = [ dictionaryOfHistograms['Data'], dictionaryOfHistograms['QCD'], dictionaryOfHistograms['V+Jets'], dictionaryOfHistograms['SingleTop'], dictionaryOfHistograms['TTJet'], ] histogram_lables = [ 'data', 'QCD', 'V+jets', 'single-top', samples_latex['TTJet'], ] histogram_colors = [ colours['data'], colours['QCD'], colours['V+Jets'], colours['Single-Top'], colours['TTJet'], ] # Find maximum y of samples maxData = max( list(histograms_to_draw[0].y()) ) y_limits = [0, maxData * 1.4] # More histogram settings to look semi decent histogram_properties = Histogram_properties() histogram_properties.name = '{channel}_{variable}'.format(channel = channel, variable=variable) histogram_properties.title = '$%.1f$ fb$^{-1}$ (%d TeV)' % ( config.new_luminosity/1000., config.centre_of_mass_energy ) histogram_properties.x_axis_title = variables_latex[variable] histogram_properties.y_axis_title = 'Events' if variable in ['HT', 'ST', 'MET', 'WPT', 'lepton_pt']: histogram_properties.y_axis_title = 'Events / {binWidth} GeV'.format( binWidth=binWidth ) histogram_properties.x_axis_title = '{variable} (GeV)'.format( variable = variables_latex[variable] ) histogram_properties.x_limits = [ reco_bin_edges[0], reco_bin_edges[-1] ] histogram_properties.y_limits = y_limits histogram_properties.y_max_scale = 1.3 histogram_properties.xerr = None # workaround for rootpy issue #638 histogram_properties.emptybins = True histogram_properties.additional_text = channel_latex[channel.lower()] histogram_properties.legend_location = ( 0.9, 0.73 ) histogram_properties.cms_logo_location = 'left' histogram_properties.preliminary = True # histogram_properties.preliminary = False histogram_properties.set_log_y = False histogram_properties.legend_color = False histogram_properties.ratio_y_limits = [0.5, 1.5] # Draw histogram with ratio plot histogram_properties.name += '_with_ratio' loc = histogram_properties.legend_location # adjust legend location as it is relative to canvas! histogram_properties.legend_location = ( loc[0], loc[1] + 0.05 ) make_data_mc_comparison_plot( histograms_to_draw, histogram_lables, histogram_colors, histogram_properties, save_folder = 'plots/control_plots_with_systematic/', show_ratio = True, normalise = False, systematics_for_ratio = uncertaintyBand, systematics_for_plot = uncertaintyBand, ) histogram_properties.set_log_y = True histogram_properties.y_limits = [0.1, y_limits[-1]*100 ] histogram_properties.legend_location = ( 0.9, 0.9 ) histogram_properties.name += '_logY' make_data_mc_comparison_plot( histograms_to_draw, histogram_lables, histogram_colors, histogram_properties, save_folder = 'plots/control_plots_with_systematic/logY/', show_ratio = True, normalise = False, systematics_for_ratio = uncertaintyBand, systematics_for_plot = uncertaintyBand, )
def make_plot( channel, x_axis_title, y_axis_title, signal_region_tree, control_region_tree, branchName, name_prefix, x_limits, nBins, use_qcd_data_region = False, compare_qcd_signal_with_data_control = False, y_limits = [], y_max_scale = 1.3, rebin = 1, legend_location = ( 0.98, 0.78 ), cms_logo_location = 'right', log_y = False, legend_color = False, ratio_y_limits = [0.3, 2.5], normalise = False, ): global output_folder, measurement_config, category, normalise_to_fit global preliminary, norm_variable, sum_bins, b_tag_bin, histogram_files controlToCompare = [] if 'electron' in channel : controlToCompare = ['QCDConversions', 'QCD non iso e+jets'] elif 'muon' in channel : controlToCompare = ['QCD iso > 0.3', 'QCD 0.12 < iso <= 0.3'] histogramsToCompare = {} for qcd_data_region in controlToCompare: print 'Doing ',qcd_data_region # Input files, normalisations, tree/region names title = title_template % ( measurement_config.new_luminosity, measurement_config.centre_of_mass_energy ) normalisation = None weightBranchSignalRegion = 'EventWeight' if 'electron' in channel: histogram_files['data'] = measurement_config.data_file_electron_trees histogram_files['QCD'] = measurement_config.electron_QCD_MC_category_templates_trees[category] if normalise_to_fit: normalisation = normalisations_electron[norm_variable] # if use_qcd_data_region: # qcd_data_region = 'QCDConversions' # # qcd_data_region = 'QCD non iso e+jets' if not 'QCD' in channel and not 'NPU' in branchName: weightBranchSignalRegion += ' * ElectronEfficiencyCorrection' if 'muon' in channel: histogram_files['data'] = measurement_config.data_file_muon_trees histogram_files['QCD'] = measurement_config.muon_QCD_MC_category_templates_trees[category] if normalise_to_fit: normalisation = normalisations_muon[norm_variable] # if use_qcd_data_region: # qcd_data_region = 'QCD iso > 0.3' if not 'QCD' in channel and not 'NPU' in branchName: weightBranchSignalRegion += ' * MuonEfficiencyCorrection' if not "_NPUNoWeight" in name_prefix: weightBranchSignalRegion += ' * PUWeight' if not "_NBJetsNoWeight" in name_prefix: weightBranchSignalRegion += ' * BJetWeight' selection = '1' if branchName == 'abs(lepton_eta)' : selection = 'lepton_eta > -10' else: selection = '%s >= 0' % branchName # if 'QCDConversions' in signal_region_tree: # selection += '&& isTightElectron' # print selection histograms = get_histograms_from_trees( trees = [signal_region_tree, control_region_tree], branch = branchName, weightBranch = weightBranchSignalRegion, files = histogram_files, nBins = nBins, xMin = x_limits[0], xMax = x_limits[-1], selection = selection ) histograms_QCDControlRegion = None if use_qcd_data_region: qcd_control_region = signal_region_tree.replace( 'Ref selection', qcd_data_region ) histograms_QCDControlRegion = get_histograms_from_trees( trees = [qcd_control_region], branch = branchName, weightBranch = 'EventWeight', files = histogram_files, nBins = nBins, xMin = x_limits[0], xMax = x_limits[-1], selection = selection ) # Split histograms up into signal/control (?) signal_region_hists = {} control_region_hists = {} for sample in histograms.keys(): signal_region_hists[sample] = histograms[sample][signal_region_tree] if compare_qcd_signal_with_data_control: if sample is 'data': signal_region_hists[sample] = histograms[sample][control_region_tree] elif sample is 'QCD' : signal_region_hists[sample] = histograms[sample][signal_region_tree] else: del signal_region_hists[sample] if use_qcd_data_region: control_region_hists[sample] = histograms_QCDControlRegion[sample][qcd_control_region] # Prepare histograms if normalise_to_fit: # only scale signal region to fit (results are invalid for control region) prepare_histograms( signal_region_hists, rebin = rebin, scale_factor = measurement_config.luminosity_scale, normalisation = normalisation ) elif normalise_to_data: totalMC = 0 for sample in signal_region_hists: if sample is 'data' : continue totalMC += signal_region_hists[sample].Integral() newScale = signal_region_hists['data'].Integral() / totalMC prepare_histograms( signal_region_hists, rebin = rebin, scale_factor = newScale, ) else: print measurement_config.luminosity_scale prepare_histograms( signal_region_hists, rebin = rebin, scale_factor = measurement_config.luminosity_scale ) prepare_histograms( control_region_hists, rebin = rebin, scale_factor = measurement_config.luminosity_scale ) # Use qcd from data control region or not qcd_from_data = None if use_qcd_data_region: qcd_from_data = clean_control_region( control_region_hists, subtract = ['TTJet', 'V+Jets', 'SingleTop'] ) # Normalise control region correctly nBins = signal_region_hists['QCD'].GetNbinsX() n, error = signal_region_hists['QCD'].integral(0,nBins+1,error=True) n_qcd_predicted_mc_signal = ufloat( n, error) n, error = control_region_hists['QCD'].integral(0,nBins+1,error=True) n_qcd_predicted_mc_control = ufloat( n, error) n, error = qcd_from_data.integral(0,nBins+1,error=True) n_qcd_control_region = ufloat( n, error) if not n_qcd_control_region == 0: dataDrivenQCDScale = n_qcd_predicted_mc_signal / n_qcd_predicted_mc_control print 'Overall scale : ',dataDrivenQCDScale qcd_from_data.Scale( dataDrivenQCDScale.nominal_value ) signalToControlScale = n_qcd_predicted_mc_signal / n_qcd_control_region dataToMCscale = n_qcd_control_region / n_qcd_predicted_mc_control print "Signal to control :",signalToControlScale print "QCD scale : ",dataToMCscale else: qcd_from_data = signal_region_hists['QCD'] # Which histograms to draw, and properties histograms_to_draw = [] histogram_lables = [] histogram_colors = [] if compare_qcd_signal_with_data_control : histograms_to_draw = [signal_region_hists['data'], qcd_from_data ] histogram_lables = ['data', 'QCD'] histogram_colors = ['black', 'yellow'] else : histograms_to_draw = [signal_region_hists['data'], qcd_from_data, signal_region_hists['V+Jets'], signal_region_hists['SingleTop'], signal_region_hists['TTJet']] histogram_lables = ['data', 'QCD', 'V+Jets', 'Single-Top', samples_latex['TTJet']] histogram_colors = [colours['data'], colours['QCD'], colours['V+Jets'], colours['Single-Top'], colours['TTJet'] ] print list(qcd_from_data.y()) histogramsToCompare[qcd_data_region] = qcd_from_data print histogramsToCompare histogram_properties = Histogram_properties() histogram_properties.name = 'QCD_control_region_comparison_' + channel + '_' + branchName histogram_properties.title = title histogram_properties.x_axis_title = x_axis_title histogram_properties.y_axis_title = y_axis_title histogram_properties.x_limits = x_limits histogram_properties.y_limits = y_limits histogram_properties.mc_error = 0.0 histogram_properties.legend_location = ( 0.98, 0.78 ) histogram_properties.ratio_y_limits = ratio_y_limits if 'electron' in channel: make_control_region_comparison(histogramsToCompare['QCDConversions'], histogramsToCompare['QCD non iso e+jets'], name_region_1='Conversions', name_region_2='Non Iso', histogram_properties=histogram_properties, save_folder=output_folder) elif 'muon' in channel: make_control_region_comparison(histogramsToCompare['QCD iso > 0.3'], histogramsToCompare['QCD 0.12 < iso <= 0.3'], name_region_1='QCD iso > 0.3', name_region_2='QCD 0.12 < iso <= 0.3', histogram_properties=histogram_properties, save_folder=output_folder)
def main(): config = XSectionConfig(13) file_for_powhegPythia = File(config.unfolding_central_firstHalf, 'read') file_for_ptReweight_up = File(config.unfolding_ptreweight_up_firstHalf, 'read') file_for_ptReweight_down = File(config.unfolding_ptreweight_down_firstHalf, 'read') file_for_amcatnlo_pythia8 = File(config.unfolding_amcatnlo_pythia8, 'read') file_for_powhegHerwig = File(config.unfolding_powheg_herwig, 'read') file_for_etaReweight_up = File(config.unfolding_etareweight_up, 'read') file_for_etaReweight_down = File(config.unfolding_etareweight_down, 'read') file_for_data_template = 'data/normalisation/background_subtraction/13TeV/{variable}/VisiblePS/central/normalisation_{channel}.txt' for channel in config.analysis_types.keys(): if channel is 'combined': continue for variable in config.variables: print variable # for variable in ['HT']: # Get the central powheg pythia distributions _, _, response_central, fakes_central = get_unfold_histogram_tuple( inputfile=file_for_powhegPythia, variable=variable, channel=channel, centre_of_mass=13, load_fakes=True, visiblePS=True) measured_central = asrootpy(response_central.ProjectionX('px', 1)) truth_central = asrootpy(response_central.ProjectionY()) # Get the reweighted powheg pythia distributions _, _, response_pt_reweighted_up, _ = get_unfold_histogram_tuple( inputfile=file_for_ptReweight_up, variable=variable, channel=channel, centre_of_mass=13, load_fakes=False, visiblePS=True) measured_pt_reweighted_up = asrootpy( response_pt_reweighted_up.ProjectionX('px', 1)) truth_pt_reweighted_up = asrootpy( response_pt_reweighted_up.ProjectionY()) _, _, response_pt_reweighted_down, _ = get_unfold_histogram_tuple( inputfile=file_for_ptReweight_down, variable=variable, channel=channel, centre_of_mass=13, load_fakes=False, visiblePS=True) measured_pt_reweighted_down = asrootpy( response_pt_reweighted_down.ProjectionX('px', 1)) truth_pt_reweighted_down = asrootpy( response_pt_reweighted_down.ProjectionY()) # _, _, response_eta_reweighted_up, _ = get_unfold_histogram_tuple( # inputfile=file_for_etaReweight_up, # variable=variable, # channel=channel, # centre_of_mass=13, # load_fakes=False, # visiblePS=True # ) # measured_eta_reweighted_up = asrootpy(response_eta_reweighted_up.ProjectionX('px',1)) # truth_eta_reweighted_up = asrootpy(response_eta_reweighted_up.ProjectionY()) # _, _, response_eta_reweighted_down, _ = get_unfold_histogram_tuple( # inputfile=file_for_etaReweight_down, # variable=variable, # channel=channel, # centre_of_mass=13, # load_fakes=False, # visiblePS=True # ) # measured_eta_reweighted_down = asrootpy(response_eta_reweighted_down.ProjectionX('px',1)) # truth_eta_reweighted_down = asrootpy(response_eta_reweighted_down.ProjectionY()) # Get the distributions for other MC models _, _, response_amcatnlo_pythia8, _ = get_unfold_histogram_tuple( inputfile=file_for_amcatnlo_pythia8, variable=variable, channel=channel, centre_of_mass=13, load_fakes=False, visiblePS=True) measured_amcatnlo_pythia8 = asrootpy( response_amcatnlo_pythia8.ProjectionX('px', 1)) truth_amcatnlo_pythia8 = asrootpy( response_amcatnlo_pythia8.ProjectionY()) _, _, response_powhegHerwig, _ = get_unfold_histogram_tuple( inputfile=file_for_powhegHerwig, variable=variable, channel=channel, centre_of_mass=13, load_fakes=False, visiblePS=True) measured_powhegHerwig = asrootpy( response_powhegHerwig.ProjectionX('px', 1)) truth_powhegHerwig = asrootpy(response_powhegHerwig.ProjectionY()) # Get the data input (data after background subtraction, and fake removal) file_for_data = file_for_data_template.format(variable=variable, channel=channel) data = read_tuple_from_file(file_for_data)['TTJet'] data = value_error_tuplelist_to_hist(data, reco_bin_edges_vis[variable]) data = removeFakes(measured_central, fakes_central, data) # Plot all three hp = Histogram_properties() hp.name = 'Reweighting_check_{channel}_{variable}_at_{com}TeV'.format( channel=channel, variable=variable, com='13', ) v_latex = latex_labels.variables_latex[variable] unit = '' if variable in ['HT', 'ST', 'MET', 'WPT', 'lepton_pt']: unit = ' [GeV]' hp.x_axis_title = v_latex + unit hp.x_limits = [ reco_bin_edges_vis[variable][0], reco_bin_edges_vis[variable][-1] ] hp.ratio_y_limits = [0.1, 1.9] hp.ratio_y_title = 'Reweighted / Central' hp.y_axis_title = 'Number of events' hp.title = 'Reweighting check for {variable}'.format( variable=v_latex) measured_central.Rebin(2) measured_pt_reweighted_up.Rebin(2) measured_pt_reweighted_down.Rebin(2) # measured_eta_reweighted_up.Rebin(2) # measured_eta_reweighted_down.Rebin(2) measured_amcatnlo_pythia8.Rebin(2) measured_powhegHerwig.Rebin(2) data.Rebin(2) measured_central.Scale(1 / measured_central.Integral()) measured_pt_reweighted_up.Scale( 1 / measured_pt_reweighted_up.Integral()) measured_pt_reweighted_down.Scale( 1 / measured_pt_reweighted_down.Integral()) measured_amcatnlo_pythia8.Scale( 1 / measured_amcatnlo_pythia8.Integral()) measured_powhegHerwig.Scale(1 / measured_powhegHerwig.Integral()) # measured_eta_reweighted_up.Scale( 1 / measured_eta_reweighted_up.Integral() ) # measured_eta_reweighted_down.Scale( 1/ measured_eta_reweighted_down.Integral() ) data.Scale(1 / data.Integral()) print list(measured_central.y()) print list(measured_amcatnlo_pythia8.y()) print list(measured_powhegHerwig.y()) print list(data.y()) compare_measurements( # models = {'Central' : measured_central, 'PtReweighted Up' : measured_pt_reweighted_up, 'PtReweighted Down' : measured_pt_reweighted_down, 'EtaReweighted Up' : measured_eta_reweighted_up, 'EtaReweighted Down' : measured_eta_reweighted_down}, models=OrderedDict([ ('Central', measured_central), ('PtReweighted Up', measured_pt_reweighted_up), ('PtReweighted Down', measured_pt_reweighted_down), ('amc@nlo', measured_amcatnlo_pythia8), ('powhegHerwig', measured_powhegHerwig) ]), measurements={'Data': data}, show_measurement_errors=True, histogram_properties=hp, save_folder='plots/unfolding/reweighting_check', save_as=['pdf'], line_styles_for_models=[ 'solid', 'solid', 'solid', 'dashed', 'dashed' ], show_ratio_for_pairs=OrderedDict([ ('PtUpVsCentral', [measured_pt_reweighted_up, measured_central]), ('PtDownVsCentral', [measured_pt_reweighted_down, measured_central]), ('amcatnloVsCentral', [measured_amcatnlo_pythia8, measured_central]), ('powhegHerwigVsCentral', [measured_powhegHerwig, measured_central]), ('DataVsCentral', [data, measured_central]) ]), )
def make_ttbarReco_plot( channel, x_axis_title, y_axis_title, signal_region_tree, control_region_tree, branchName, name_prefix, x_limits, nBins, use_qcd_data_region = False, y_limits = [], y_max_scale = 1.2, rebin = 1, legend_location = ( 0.98, 0.78 ), cms_logo_location = 'right', log_y = False, legend_color = False, ratio_y_limits = [0.3, 1.7], normalise = False, ): global output_folder, measurement_config, category, normalise_to_fit global preliminary, norm_variable, sum_bins, b_tag_bin, histogram_files # Input files, normalisations, tree/region names qcd_data_region = '' title = title_template % ( measurement_config.new_luminosity / 1000., measurement_config.centre_of_mass_energy ) normalisation = None if channel == 'electron': histogram_files['data'] = measurement_config.data_file_electron_trees histogram_files['QCD'] = measurement_config.electron_QCD_MC_category_templates_trees[category] if normalise_to_fit: normalisation = normalisations_electron[norm_variable] if use_qcd_data_region: qcd_data_region = 'QCDConversions' if channel == 'muon': histogram_files['data'] = measurement_config.data_file_muon_trees histogram_files['QCD'] = measurement_config.muon_QCD_MC_category_templates_trees[category] if normalise_to_fit: normalisation = normalisations_muon[norm_variable] if use_qcd_data_region: qcd_data_region = 'QCD non iso mu+jets ge3j' histograms = get_histograms_from_trees( trees = [signal_region_tree, control_region_tree], branch = branchName, weightBranch = '1', files = histogram_files, nBins = nBins, xMin = x_limits[0], xMax = x_limits[-1] ) selection = 'SolutionCategory == 0' histogramsNoSolution = get_histograms_from_trees( trees = [signal_region_tree], branch = branchName, weightBranch = '1', selection = selection, files = histogram_files, nBins = nBins, xMin = x_limits[0], xMax = x_limits[-1] ) selection = 'SolutionCategory == 1' histogramsCorrect = get_histograms_from_trees( trees = [signal_region_tree], branch = branchName, weightBranch = '1', selection = selection, files = histogram_files, nBins = nBins, xMin = x_limits[0], xMax = x_limits[-1] ) selection = 'SolutionCategory == 2' histogramsNotSL = get_histograms_from_trees( trees = [signal_region_tree], branch = branchName, weightBranch = '1', selection = selection, files = histogram_files, nBins = nBins, xMin = x_limits[0], xMax = x_limits[-1] ) selection = 'SolutionCategory == 3' histogramsNotReco = get_histograms_from_trees( trees = [signal_region_tree], branch = branchName, weightBranch = '1', selection = selection, files = histogram_files, nBins = nBins, xMin = x_limits[0], xMax = x_limits[-1] ) selection = 'SolutionCategory > 3' histogramsWrong = get_histograms_from_trees( trees = [signal_region_tree], branch = branchName, weightBranch = '1', selection = selection, files = histogram_files, nBins = nBins, xMin = x_limits[0], xMax = x_limits[-1] ) # Split histograms up into signal/control (?) signal_region_hists = {} inclusive_control_region_hists = {} for sample in histograms.keys(): signal_region_hists[sample] = histograms[sample][signal_region_tree] if use_qcd_data_region: inclusive_control_region_hists[sample] = histograms[sample][control_region_tree] prepare_histograms( histograms, rebin = 1, scale_factor = measurement_config.luminosity_scale ) prepare_histograms( histogramsNoSolution, rebin = 1, scale_factor = measurement_config.luminosity_scale ) prepare_histograms( histogramsCorrect, rebin = 1, scale_factor = measurement_config.luminosity_scale ) prepare_histograms( histogramsNotSL, rebin = 1, scale_factor = measurement_config.luminosity_scale ) prepare_histograms( histogramsNotReco, rebin = 1, scale_factor = measurement_config.luminosity_scale ) prepare_histograms( histogramsWrong, rebin = 1, scale_factor = measurement_config.luminosity_scale ) qcd_from_data = signal_region_hists['QCD'] # Which histograms to draw, and properties histograms_to_draw = [signal_region_hists['data'], qcd_from_data, signal_region_hists['V+Jets'], signal_region_hists['SingleTop'], histogramsNoSolution['TTJet'][signal_region_tree], histogramsNotSL['TTJet'][signal_region_tree], histogramsNotReco['TTJet'][signal_region_tree], histogramsWrong['TTJet'][signal_region_tree], histogramsCorrect['TTJet'][signal_region_tree] ] histogram_lables = ['data', 'QCD', 'V+Jets', 'Single-Top', samples_latex['TTJet'] + ' - no solution', samples_latex['TTJet'] + ' - not SL', samples_latex['TTJet'] + ' - not reconstructible', samples_latex['TTJet'] + ' - wrong reco', samples_latex['TTJet'] + ' - correct', ] histogram_colors = ['black', 'yellow', 'green', 'magenta', 'black', 'burlywood', 'chartreuse', 'blue', 'red' ] histogram_properties = Histogram_properties() histogram_properties.name = name_prefix + b_tag_bin if category != 'central': histogram_properties.name += '_' + category histogram_properties.title = title histogram_properties.x_axis_title = x_axis_title histogram_properties.y_axis_title = y_axis_title histogram_properties.x_limits = x_limits histogram_properties.y_limits = y_limits histogram_properties.y_max_scale = y_max_scale histogram_properties.xerr = None # workaround for rootpy issue #638 histogram_properties.emptybins = True if b_tag_bin: histogram_properties.additional_text = channel_latex[channel] + ', ' + b_tag_bins_latex[b_tag_bin] else: histogram_properties.additional_text = channel_latex[channel] histogram_properties.legend_location = legend_location histogram_properties.cms_logo_location = cms_logo_location histogram_properties.preliminary = preliminary histogram_properties.set_log_y = log_y histogram_properties.legend_color = legend_color if ratio_y_limits: histogram_properties.ratio_y_limits = ratio_y_limits if normalise_to_fit: histogram_properties.mc_error = get_normalisation_error( normalisation ) histogram_properties.mc_errors_label = 'fit uncertainty' else: histogram_properties.mc_error = mc_uncertainty histogram_properties.mc_errors_label = 'MC unc.' # Actually draw histograms make_data_mc_comparison_plot( histograms_to_draw, histogram_lables, histogram_colors, histogram_properties, save_folder = output_folder, show_ratio = False, normalise = normalise, ) histogram_properties.name += '_with_ratio' loc = histogram_properties.legend_location # adjust legend location as it is relative to canvas! histogram_properties.legend_location = ( loc[0], loc[1] + 0.05 ) make_data_mc_comparison_plot( histograms_to_draw, histogram_lables, histogram_colors, histogram_properties, save_folder = output_folder, show_ratio = True, normalise = normalise, )