def createSamples(mode, analysis_dir, total_weight, qcd_from_same_sign, w_qcd_mssm_method, r_qcd_os_ss): hist_dict = {} sample_dict = {} samples_mc, samples_data, samples, all_samples, sampleDict = createSampleLists(analysis_dir=analysis_dir, mode=mode) if mode == 'mssm_control' or not 'mssm' in mode: all_samples = [s for s in all_samples if not 'ggH' in s.name and not 'bbH' in s.name] sample_dict['all_samples'] = all_samples if qcd_from_same_sign and not w_qcd_mssm_method: samples_qcdfromss = [s for s in all_samples if s.name != 'QCD'] samples_ss = copy.deepcopy(samples_qcdfromss) samples_ss = [s for s in samples_ss if not s.is_signal] for sample in samples_ss: if sample.name != 'data_obs': # Subtract background from data sample.scale = -1. qcd = HistogramCfg(name='QCD', var=None, cfgs=samples_ss, cut=None, total_scale=r_qcd_os_ss, lumi=int_lumi, weight=total_weight) samples_qcdfromss.append(qcd) sample_dict['samples_qcdfromss'] = samples_qcdfromss if w_qcd_mssm_method: sample_dict['samples_mssm_method'] = createQCDWHistograms(samples, hist_dict, int_lumi, weight=total_weight, r_qcd_os_ss=r_qcd_os_ss) return sample_dict, hist_dict
def qcd_estimation(B_cut, C_cut, D_cut, all_samples, int_lumi, total_weight, scale=1., verbose=True, friend_func=None): '''ABCD method. A | B ------- C | D A is the signal region B is where the shape is taken from C/D gives the scale factor to be applied to the shape in B Returns an updated list of samples that includes the QCD HistgramCfg. ''' norm_var = dict_all_vars['_norm_'] QCD_C_region_cut = C_cut QCD_D_region_cut = D_cut QCD_B_region_cut = B_cut samples_qcd_copy = copy.deepcopy( [s for s in all_samples if s.name != 'QCD' and not s.is_signal]) samples_qcd_copy = [s for s in samples_qcd_copy if not s.is_signal] for sample in samples_qcd_copy: sample.scale = scale if sample.name == 'data_obs' else -scale qcd_c_region = HistogramCfg(name='QCD_C_region', var=norm_var, cfgs=samples_qcd_copy, cut=str(QCD_C_region_cut), lumi=int_lumi, weight=total_weight) qcd_d_region = HistogramCfg(name='QCD_D_region', var=norm_var, cfgs=samples_qcd_copy, cut=str(QCD_D_region_cut), lumi=int_lumi, weight=total_weight) # samples_qcd = [qcd_c_region, qcd_d_region] # cfg_qcd = HistogramCfg(name='QCD_aux', var=None, cfgs=samples_qcd, cut=None, lumi=int_lumi, weight=total_weight) plot_qcd_c = createHistogram(qcd_c_region, all_stack=True, friend_func=friend_func) plot_qcd_d = createHistogram(qcd_d_region, all_stack=True, friend_func=friend_func) if verbose: print 'Histogram C region' print plot_qcd_c print 'Histogram D region' print plot_qcd_d yield_c = plot_qcd_c.GetStack().totalHist.Yield() yield_d = plot_qcd_d.GetStack().totalHist.Yield() if yield_d == 0.: print 'WARNING: no events left for the QCD estimation. Set to 0' qcd_scale = 0. else: qcd_scale = yield_c / yield_d if qcd_scale < 0.: print 'WARNING: negative QCD scaling; set it to zero' qcd_scale = 0. verbose = True if verbose: print 'QCD estimation: ' print ' Yield C:', yield_c, ' yield D:', yield_d print ' Ratio C/D', qcd_scale qcd_b_region_hist = HistogramCfg(name='QCD', var=None, cfgs=samples_qcd_copy, cut=str(QCD_B_region_cut), lumi=int_lumi, weight=total_weight, total_scale=qcd_scale) all_samples_qcd = copy.deepcopy(all_samples) all_samples_qcd = [qcd_b_region_hist] + all_samples_qcd return all_samples_qcd
analysis_dir = '/data/clange/ntuples/FixNeutrino/' tree_prod_name = '' samples_mc, samples_data, samples, all_samples, sampleDict = createSampleLists(analysis_dir, channel='WV', weight=weight_MC) # Taken from Variables.py, can get subset with e.g. getVars(['mt', 'mvis']) variables = generic_vars + lnujj_vars + lnujj_vbf_vars # variables = [lnujj_vars[0]] # variables = getVars(['l1_reliso05', 'l2_reliso05']) # variables = [ # VariableCfg(name='mvis', binning={'nbinsx':35, 'xmin':0, 'xmax':350}, unit='GeV', xtitle='m_{vis}') # ] for cut_name in cuts: cfg_example = HistogramCfg(name='example', var=None, cfgs=samples, cut='', lumi=int_lumi, weight=total_weight) cfg_example.cut = cuts[cut_name].replace("||HLT_MET120", "") cfg_example.vars = variables channel = "l#nujj" if cut_name.find("_mu") >= 0: channel = "#mu#nujj" elif cut_name.find("_e") >= 0: channel = "e#nujj" if cut_name.find("HP") >= 0: channel += " HP" elif cut_name.find("LP") >= 0: channel += " LP" plots = createHistograms(cfg_example, verbose=False)
'cut': '&& abs(l2_gen_pdgId) == 21 ', 'colour': 1, 'style': 1 }, ] for set_name, sample_defs in sample_def_sets.items(): for cut_name in cuts: for variable in variables: plot_inputs = [] for sample_def in sample_defs: cut_extra = sample_def['cut'] cfg_tight = HistogramCfg(name='tight', var=None, cfgs=samples_mc_w, cut=inc_cut, lumi=int_lumi, weight=total_weight + ' * ((l2_gen_match == 6))') cfg_loose = HistogramCfg(name='loose', var=None, cfgs=samples_mc_w, cut=inc_cut, lumi=int_lumi, weight=total_weight + ' * ((l2_gen_match == 6))') tight_cut = inc_cut + cuts[cut_name] + cut_extra loose_cut = tight_cut.replace( 'l2_byIsolationMVArun2v1DBoldDMwLT>2.5', '1.') loose_cut = tight_cut.replace(
def makePlots(variables, cuts, total_weight, sample_dict, hist_dict, qcd_from_same_sign, w_qcd_mssm_method, mt_cut, friend_func, dc_postfix, make_plots=True): for cut in cuts: if qcd_from_same_sign and not 'SS' in cut.name and not w_qcd_mssm_method: cfg_main = HistogramCfg(name=cut.name, var=None, cfgs=sample_dict['samples_qcdfromss'], cut=cut.cut, lumi=int_lumi, weight=total_weight) elif w_qcd_mssm_method: cfg_main = HistogramCfg(name=cut.name, var=None, cfgs=sample_dict['samples_mssm_method'], cut=cut.cut, lumi=int_lumi, weight=total_weight) hist_dict[ 'wjets'].cut = cut.cut # since wjets is a sub-HistogramCfg else: cfg_main = HistogramCfg(name=cut.name, var=None, cfgs=sample_dict['all_samples'], cut=cut.cut, lumi=int_lumi, weight=total_weight) if qcd_from_same_sign and not 'SS' in cut.name: hist_dict['qcd'].cut = cut.cut.replace('l1_charge != l2_charge', 'l1_charge == l2_charge') if w_qcd_mssm_method: hist_dict['stacknow_highmt_os'].name = 'HighMTOS' + cut.name hist_dict['stacknow_highmt_ss'].name = 'HighMTSS' + cut.name hist_dict['wjets_incl_os'].name = 'WInclOS' + cut.name hist_dict['wjets_incl_ss'].name = 'WInclSS' + cut.name hist_dict['wjets_highmt_os'].name = 'WHighMTOS' + cut.name hist_dict['wjets_ss'].name = 'WJetsSS' + cut.name hist_dict['qcd'].cut = cut.cut.replace('l1_charge != l2_charge', 'l1_charge == l2_charge') hist_dict['wjets_ss'].cut = cut.cut.replace( 'l1_charge != l2_charge', 'l1_charge == l2_charge') hist_dict['stacknow_highmt_os'].cut = cut.cut.replace( mt_cut, 'mt>70') + '&& mt>70' hist_dict['stacknow_highmt_ss'].cut = cut.cut.replace( 'l1_charge != l2_charge', 'l1_charge == l2_charge').replace( mt_cut, 'mt>70') + '&& mt>70' hist_dict['wjets_incl_os'].cut = cut.cut.replace(mt_cut, '1.') hist_dict['wjets_incl_ss'].cut = cut.cut.replace( 'l1_charge != l2_charge', 'l1_charge == l2_charge').replace(mt_cut, '1.') hist_dict['wjets_highmt_os'].cut = cut.cut.replace( mt_cut, 'mt>70') + '&& mt>70' plot_w_os = createHistogram(hist_dict['wjets_incl_os'], verbose=False, friend_func=friend_func) plot_w_ss = createHistogram(hist_dict['wjets_incl_ss'], verbose=False, friend_func=friend_func) r_w_os_ss = plot_w_os.GetStack().totalHist.Yield( ) / plot_w_ss.GetStack().totalHist.Yield() print 'Inclusive W OS/SS ratio:', r_w_os_ss plot_highmt_os = createHistogram(hist_dict['stacknow_highmt_os'], all_stack=True, verbose=False, friend_func=friend_func) plot_highmt_ss = createHistogram(hist_dict['stacknow_highmt_ss'], all_stack=True, verbose=False, friend_func=friend_func) createDefaultGroups(plot_highmt_os) createDefaultGroups(plot_highmt_ss) yield_highmt_os = plot_highmt_os.GetStack().totalHist.Yield() yield_highmt_ss = plot_highmt_ss.GetStack().totalHist.Yield() plot_w_highmt_os = createHistogram(hist_dict['wjets_highmt_os'], verbose=False, friend_func=friend_func) yield_w_highmt_os = plot_w_highmt_os.GetStack().totalHist.Yield() if r_w_os_ss < r_qcd_os_ss: print 'WARNING, OS/SS ratio larger for QCD than for W+jets!', r_w_os_ss, r_qcd_os_ss yield_estimation = r_w_os_ss * (yield_highmt_os - r_qcd_os_ss * yield_highmt_ss) / ( r_w_os_ss - r_qcd_os_ss) print 'High MT W+jets estimated yield', yield_estimation print 'High MT W+jets MC yield', yield_w_highmt_os w_sf = 0. if yield_w_highmt_os: w_sf = yield_estimation / yield_w_highmt_os else: print 'Warning: no MC events in high MT W+jets' print 'W+jets scale factor:', w_sf, '\n' if cut.name == 'vbf_highmva0': print 'VBF very tight category, fixing W+jets SF to 1' w_sf = 1. hist_dict['wjets'].total_scale = w_sf hist_dict['wjets_ss'].total_scale = -w_sf cfg_main.vars = variables if qcd_from_same_sign: hist_dict[ 'qcd'].vars = variables # Can put into function but we will not want it by default if we take normalisations from e.g. high MT if w_qcd_mssm_method: hist_dict[ 'wjets'].vars = variables # Can put into function but we will not want it by default if we take normalisations from e.g. high MT hist_dict['qcd'].vars = variables hist_dict['wjets_ss'].vars = variables for variable in variables: if variable.name in [ 'svfit_mass', 'svfit_transverse_mass', 'mvis' ] and 'mssm' in mode: if cut.name in ['inclusive', 'nobtag']: variable.binning = binning_mssm elif cut.name in ['btag']: variable.binning = binning_mssm_btag plots = createHistograms(cfg_main, verbose=False, friend_func=friend_func) for variable in variables: # for plot in plots.itervalues(): plot = plots[variable.name] createDefaultGroups(plot) if not w_qcd_mssm_method: plot.Group('W', ['W', 'W1Jets', 'W2Jets', 'W3Jets', 'W4Jets']) # plot.Group('Electroweak', ['Diboson', 'W']) # plot.Group('Single t', ['T_tWch', 'TBar_tWch', 'TToLeptons_sch', 'TToLeptons_tch']) # plot.Group('ZLL', ['Ztt_ZL', 'Ztt_ZJ'], style=plot.Hist('Ztt_ZL').style) if make_plots: HistDrawer.draw(plot, plot_dir='plots/' + cut.name) if variable.name in [ 'mvis', 'svfit_transverse_mass', 'svfit_mass', 'mva', 'mva2div1', 'mva1', 'mva2', 'l2_nc_ratio' ]: plot.WriteDataCard( filename='datacard_{mode}_{var}.root'.format( mode=mode, var=variable.name), dir='mt_' + cut.name, mode='UPDATE', postfix=dc_postfix) #mt = mu-tau
def createQCDWHistograms(samples, hist_dict, int_lumi, weight, r_qcd_os_ss=1.17): w_names = ['W', 'W1Jets', 'W2Jets', 'W3Jets', 'W4Jets'] samples_non_w = [ s for s in samples if s.name != 'QCD' and s.name not in w_names and not s.is_signal ] samples_non_w_ss = deepcopy(samples_non_w) samples_signal = [s for s in samples if s.is_signal] samples_w = deepcopy([s for s in samples if s.name in w_names]) samples_w_ss = deepcopy(samples_w) # To calculate OS/SS ratio in inclusive W selection samples_w_incl_os = deepcopy(samples_w) samples_w_incl_ss = deepcopy(samples_w) # To calculate W scale factor samples_w_highmt_os = deepcopy(samples_w) # Build a high MT region: OS - non-W/QCD OS - (SS - non-W/QCD SS) samples_non_w_highmt_os = deepcopy(samples_non_w) samples_non_w_highmt_ss = deepcopy(samples_non_w) for sample in samples_non_w_highmt_os: if sample.name != 'data_obs': # Subtract background from data sample.scale = -1. for sample in samples_non_w_highmt_ss: if sample.name != 'data_obs': sample.scale = -1. for sample in samples_non_w_ss: if sample.name != 'data_obs': sample.scale = -1. var_norm = VariableCfg(name='_norm_', drawname='1.', binning={ 'nbinsx': 5, 'xmin': -1.5, 'xmax': 3.5 }, unit='', xtitle='Normalisation') hist_dict['stacknow_highmt_os'] = HistogramCfg( name='HighMTOS', var=var_norm, cfgs=samples_non_w_highmt_os, cut=None, lumi=int_lumi, weight=weight) hist_dict['stacknow_highmt_ss'] = HistogramCfg( name='HighMTSS', var=var_norm, cfgs=samples_non_w_highmt_ss, cut=None, lumi=int_lumi, weight=weight) hist_dict['wjets_incl_os'] = HistogramCfg(name='WInclOS', var=var_norm, cfgs=samples_w_incl_os, cut=None, lumi=int_lumi, weight=weight) hist_dict['wjets_incl_ss'] = HistogramCfg(name='WInclSS', var=var_norm, cfgs=samples_w_incl_ss, cut=None, lumi=int_lumi, weight=weight) hist_dict['wjets_highmt_os'] = HistogramCfg(name='WHighMTOS', var=var_norm, cfgs=samples_w_highmt_os, cut=None, lumi=int_lumi, weight=weight) hist_dict['wjets'] = HistogramCfg(name='W', var=None, cfgs=samples_w, cut=None, lumi=int_lumi, weight=weight) hist_dict['wjets_ss'] = HistogramCfg(name='WSS', var=None, cfgs=samples_w_ss, cut=None, lumi=int_lumi, weight=weight) hist_dict['qcd'] = HistogramCfg(name='QCD', var=None, cfgs=samples_non_w_ss + [hist_dict['wjets_ss']], cut=None, total_scale=r_qcd_os_ss, lumi=int_lumi, weight=weight) return samples_non_w + [hist_dict['wjets'], hist_dict['qcd'] ] + samples_signal
if qcd_from_same_sign and not w_qcd_mssm_method: samples_qcdfromss = [s for s in all_samples if s.name != 'QCD'] samples_ss = copy.deepcopy(samples_qcdfromss) samples_ss = [s for s in samples_ss if not s.is_signal] for sample in samples_ss: if sample.name != 'data_obs': # Subtract background from data sample.scale = -1. qcd = HistogramCfg(name='QCD', var=None, cfgs=samples_ss, cut=inc_cut, total_scale=r_qcd_os_ss, lumi=int_lumi, weight=total_weight) samples_qcdfromss.append(qcd) if w_qcd_mssm_method: w_names = ['W', 'W1Jets', 'W2Jets', 'W3Jets', 'W4Jets'] samples_non_w = [ s for s in all_samples if s.name != 'QCD' and s.name not in w_names and not s.is_signal ] samples_non_w_ss = copy.deepcopy(samples_non_w) samples_w = copy.deepcopy([s for s in all_samples if s.name in w_names])
# -> Can add cross sections for samples either explicitly, or from file, or from cfg for sample in samples: setSumWeights(sample) if qcd_from_same_sign: samples_ss = copy.deepcopy(samples) samples = [s for s in samples if sample.name != 'QCD'] for sample in samples_ss: if sample.name != 'Data': # Subtract background from data sample.scale = -1. qcd = HistogramCfg(name='QCD', var=None, cfgs=samples_ss, cut=inc_cut, lumi=40.0) samples.append(qcd) # Taken from Variables.py, can get subset with e.g. getVars(['mt', 'mvis']) variables = all_vars cfg_example = HistogramCfg(name='example', var=None, cfgs=samples, cut=inc_cut, lumi=40.0) for cut_name in cuts: cfg_example.cut = cuts[cut_name] if qcd_from_same_sign and 'OS' in cut_name: qcd.cut = cuts[cut_name].replace('l1_charge != l2_charge', 'l1_charge == l2_charge') for variable in variables:
'l1_pt', 'l2_pt', 'l1_gen_pdgId', 'l2_gen_pdgId', 'l1_reliso05_04', 'l1_reliso05', 'l2_byCombinedIsolationDeltaBetaCorrRaw3Hits' ]) variables += [v for v in all_vars if 'dxy' in v.name or 'dz' in v.name] variables = getVars([ '_norm_', 'l2_pt', 'l2_eta', 'l2_mass', 'l2_decayMode', 'mvis', 'mt', 'delta_r_l1_l2', 'l2_gen_pdgId', 'l2_mt' ]) # variables = all_vars for cut_name in cuts: cfg_tight = HistogramCfg(name='tight', var=None, cfgs=samples, cut=inc_cut, lumi=int_lumi, weight=total_weight + ' * ((l2_gen_match != 5) - (l2_gen_match == 5))') cfg_loose = HistogramCfg(name='loose', var=None, cfgs=samples, cut=inc_cut, lumi=int_lumi, weight=total_weight + ' * ((l2_gen_match != 5) - (l2_gen_match == 5))') cfg_data_tight = HistogramCfg( name='tight_data', var=None, cfgs=samples,
SampleCfg(name='WJetsToLNu', ana_dir=analysis_dir, tree_prod_name=tree_prod_name, xsec=WJetsToLNu.xSection, sumweights=WJetsToLNu.nGenEvents), SampleCfg(name='TTJets', dir_name='TTLep_pow', ana_dir=analysis_dir, tree_prod_name=tree_prod_name, xsec=TT_pow.xSection, sumweights=TT_pow.nGenEvents), SampleCfg(name='T_tWch', dir_name='T_tWch', ana_dir=analysis_dir, tree_prod_name=tree_prod_name, xsec=T_tWch.xSection, sumweights=T_tWch.nGenEvents), SampleCfg(name='TBar_tWch', dir_name='TBar_tWch', ana_dir=analysis_dir, tree_prod_name=tree_prod_name, xsec=TBar_tWch.xSection, sumweights=TBar_tWch.nGenEvents), SampleCfg(name='TToLeptons_tch', dir_name='TToLeptons_tch', ana_dir=analysis_dir, tree_prod_name=tree_prod_name, xsec=TToLeptons_tch.xSection, sumweights=TBar_tWch.nGenEvents), SampleCfg(name='TToLeptons_sch', dir_name='TToLeptons_sch', ana_dir=analysis_dir, tree_prod_name=tree_prod_name, xsec=TToLeptons_sch.xSection, sumweights=TToLeptons_sch.nGenEvents), SampleCfg(name='ZZ', dir_name='ZZp8', ana_dir=analysis_dir, tree_prod_name=tree_prod_name, xsec=ZZp8.xSection, sumweights=ZZp8.nGenEvents), SampleCfg(name='WZ', dir_name='WZp8', ana_dir=analysis_dir, tree_prod_name=tree_prod_name, xsec=WZp8.xSection, sumweights=WZp8.nGenEvents), SampleCfg(name='WW', dir_name='WWTo2L2Nu', ana_dir=analysis_dir, tree_prod_name=tree_prod_name, xsec=WWTo2L2Nu.xSection, sumweights=WWTo2L2Nu.nGenEvents), SampleCfg(name='QCD', dir_name='QCD_Mu15', ana_dir=analysis_dir, tree_prod_name=tree_prod_name, xsec=QCD_Mu15.xSection), SampleCfg(name='Data', dir_name='SingleMuon_Run2015B', ana_dir=data_dir, tree_prod_name=tree_prod_name, is_data=True), ] # -> Can add cross sections for samples either explicitly, or from file, or from cfg for sample in samples: setSumWeights(sample) # Taken from Variables.py, can get subset with e.g. getVars(['mt', 'mvis']) variables = all_vars cfg_example = HistogramCfg(name='example', var=None, cfgs=samples, cut=example_cut, lumi=40.0) for variable in variables: cfg_example.var = variable plot = createHistogram(cfg_example) plot.Group('Diboson', ['ZZ', 'WZ', 'WW']) plot.Group('Single t', ['T_tWch', 'TBar_tWch', 'TToLeptons_sch', 'TToLeptons_tch']) HistDrawer.draw(plot) # HistDrawer.drawRatio(plot)
# cuts.append(myCut('baseline_btd', 'abs(cand_refit_charge) == 1 & cand_refit_tau_mass > 1.6 & cand_refit_tau_mass < 2.0 ')) # cuts.append(myCut('tight' , 'tau_sv_prob > 0.10 & cand_refit_tau_dBetaIsoCone0p8strength0p2_rel < 0.2 & cand_refit_dRtauMuonMax < 0.2 & cand_refit_mttau > 40 & abs(cand_refit_charge)==1')) # cuts.append(myCut('final' , 'tau_sv_prob > 0.10 & cand_refit_tau_dBetaIsoCone0p8strength0p2_rel < 0.2 & cand_refit_dRtauMuonMax < 0.2 & cand_refit_mttau > 40 & mu1_muonid_tight & mu2_muonid_tight & mu3_muonid_tight & abs(cand_refit_charge)==1 & cand_refit_tau_pt>10 & mu1_refit_reliso05<0.2 & mu2_refit_reliso05<0.2 & mu3_refit_reliso05<0.2')) # cuts.append(myCut('bdt0p5' , 'bdt_score > 0.5')) # cuts.append(myCut('bdt0p7' , 'bdt_score > 0.7')) # cuts.append(myCut('bdt0p8' , 'bdt_score > 0.8')) # cuts.append(myCut('bdt0p9' , 'bdt_score > 0.9')) cuts.append(myCut('mauro_bdt', '1.')) variables = generic_vars sample_names = set() for cut in cuts: cfg_total = HistogramCfg(name=cut.name, vars=variables, cfgs=all_samples, cut=str(cut.cut), lumi=int_lumi, weight=total_weight) plots = createHistograms( cfg_total, verbose=True, ) for variable in variables: if variable.name == 'cand_refit_tau_mass' or variable.name == 'cand_tau_mass': blindxmin = 1.777 - 0.040 blindxmax = 1.777 + 0.040 else: blindxmin = None blindxmax = None
xtitle='PUPPI ave cone 0.3'), ] VarSet = namedtuple('VariableSet', ['name', 'vars', 'cut_s', 'cut_b']) var_sets = [ VarSet('tau_iso', vars_tau, '&& l2_gen_match == 5', '&& l2_gen_match == 6'), # VarSet('muon_iso', vars_mu, '&& (l2_gen_match == 2 || l2_gen_match == 4)', '&& l2_gen_match == 6') ] # samples = [sampleDict['TTJets']]#, sampleDict['QCD']] cfg_signal = HistogramCfg(name='signal', var=None, cfgs=samples, cut=inc_cut, lumi=int_lumi, weight='1.') cfg_bg = HistogramCfg(name='bg', var=None, cfgs=samples, cut=inc_cut, lumi=int_lumi, weight='1.') for var_set in var_sets: print 'Variable set', var_set.name cfg_signal.cut += var_set.cut_s cfg_bg.cut += var_set.cut_b
if qcd_from_same_sign and not w_qcd_mssm_method: samples_qcdfromss = [s for s in all_samples if s.name != 'QCD'] samples_ss = copy.deepcopy(samples_qcdfromss) samples_ss = [s for s in samples_ss if not s.is_signal] for sample in samples_ss: if sample.name != 'data_obs': # Subtract background from data sample.scale = -1. qcd = HistogramCfg(name='QCD', var=None, cfgs=samples_ss, cut=inc_cut, total_scale=r_qcd_os_ss, lumi=int_lumi, weight=total_weight) samples_qcdfromss.append(qcd) if w_qcd_mssm_method: w_names = ['W', 'W1Jets', 'W2Jets', 'W3Jets', 'W4Jets'] samples_non_w = [ s for s in all_samples if s.name != 'QCD' and s.name not in w_names and not s.is_signal ] samples_non_w_ss = copy.deepcopy(samples_non_w) samples_signal = [s for s in all_samples if s.is_signal]
xsec=sample.get(XSection, 1), sumweights=sample.get(SumWeights, 1)) if sample[Name] == 'data_obs': config_qcd.scale = 1. else: config_qcd.scale = -1. # shift also background subtraction in QCD if config_qcd.name in shift: config_qcd.scale *= shift[config.name] if 'QCD' in shift: config_qcd.scale *= shift['QCD'] qcd.append(config_qcd) ## Discard non fake MC if not sample[HistoDir] in non_fakes: samples_tmp.append(config) # Add QCD component config_qcd_total = HistogramCfg(name='QCD', var=variable, cfgs=qcd, lumi=int_lumi) samples_tmp.append(config_qcd_total) config = HistogramCfg(name='config', var=variable, cfgs=samples_tmp, lumi=int_lumi) histos = createHistograms(config) for histo in histos.histos.values(): removeNegativeValues2D(histo) if 'Stat' in shiftname: ## Fluctuate up/down each bin for sign in [-1, 1]: for bx in xrange(1, histos.histos['QCD'].GetNbinsX() + 1): for by in xrange(1,
def makePlots(variables, cuts, total_weight, all_samples, samples, friend_func, mode='control', dc_postfix='', make_plots=True, optimisation=False): sample_names = set() ams_dict = {} from CMGTools.H2TauTau.proto.plotter.cut import Cut # def_iso_cut = inc_sig_tau1_iso & inc_sig_tau2_iso iso_cuts = { # 'vvtight':(Cut('l1_byIsolationMVArun2v1DBoldDMwLT>5.5') & Cut('l2_byIsolationMVArun2v1DBoldDMwLT>5.5'), Cut('l1_byIsolationMVArun2v1DBoldDMwLT>3.5') & Cut('l2_byIsolationMVArun2v1DBoldDMwLT>3.5')), 'vtight_relax2nd': (Cut('l1_byIsolationMVArun2v1DBoldDMwLT>4.5') & Cut('l2_byIsolationMVArun2v1DBoldDMwLT>4.5'), Cut('l1_byIsolationMVArun2v1DBoldDMwLT>4.5') & Cut('l2_byIsolationMVArun2v1DBoldDMwLT>2.5')), 'loose_not_vtight': (Cut( 'l1_byIsolationMVArun2v1DBoldDMwLT>1.5 && l1_byIsolationMVArun2v1DBoldDMwLT<4.5' ) & Cut( 'l2_byIsolationMVArun2v1DBoldDMwLT>1.5&&l2_byIsolationMVArun2v1DBoldDMwLT<4.5' ), Cut('l1_byIsolationMVArun2v1DBoldDMwLT<1.5 && l1_byIsolationMVArun2v1DBoldDMwLT>0.5' ) & Cut('l2_byIsolationMVArun2v1DBoldDMwLT<1.5 && l2_byIsolationMVArun2v1DBoldDMwLT>0.5' )), 'one_loose_other_vtight': (Cut( '(l1_byIsolationMVArun2v1DBoldDMwLT>4.5 && (l2_byIsolationMVArun2v1DBoldDMwLT>1.5&&l2_byIsolationMVArun2v1DBoldDMwLT<4.5)) || (l2_byIsolationMVArun2v1DBoldDMwLT>4.5 && (l1_byIsolationMVArun2v1DBoldDMwLT>1.5&&l1_byIsolationMVArun2v1DBoldDMwLT<4.5)) ' ), Cut('l1_byIsolationMVArun2v1DBoldDMwLT<1.5 && l1_byIsolationMVArun2v1DBoldDMwLT>0.5' ) & Cut('l2_byIsolationMVArun2v1DBoldDMwLT<1.5 && l2_byIsolationMVArun2v1DBoldDMwLT>0.5' )), # 'vtight':(Cut('l1_byIsolationMVArun2v1DBoldDMwLT>4.5') & Cut('l2_byIsolationMVArun2v1DBoldDMwLT>4.5'), Cut('l1_byIsolationMVArun2v1DBoldDMwLT>2.5') & Cut('l2_byIsolationMVArun2v1DBoldDMwLT>2.5')), # 'tight':(Cut('l1_byIsolationMVArun2v1DBoldDMwLT>3.5') & Cut('l2_byIsolationMVArun2v1DBoldDMwLT>3.5'), Cut('l1_byIsolationMVArun2v1DBoldDMwLT>3.5') & Cut('l2_byIsolationMVArun2v1DBoldDMwLT>1.5')), # 'medium':(Cut('l1_byIsolationMVArun2v1DBoldDMwLT>2.5') & Cut('l2_byIsolationMVArun2v1DBoldDMwLT>2.5'), Cut('l1_byIsolationMVArun2v1DBoldDMwLT>0.5') & Cut('l2_byIsolationMVArun2v1DBoldDMwLT>0.5')), # 'loose':(Cut('l1_byIsolationMVArun2v1DBoldDMwLT>1.5') & Cut('l2_byIsolationMVArun2v1DBoldDMwLT>1.5'), Cut('1')), # 'vloose':(Cut('l1_byIsolationMVArun2v1DBoldDMwLT>0.5') & Cut('l2_byIsolationMVArun2v1DBoldDMwLT>0.5'), Cut('1')), } # iso_cuts = { # 'l1_vvtight':(Cut('l1_byIsolationMVArun2v1DBoldDMwLT>5.5') & Cut('l2_byIsolationMVArun2v1DBoldDMwLT>4.5'), Cut('l1_byIsolationMVArun2v1DBoldDMwLT>5.5') & Cut('l2_byIsolationMVArun2v1DBoldDMwLT>3.5')), # 'l1_vtight':(Cut('l1_byIsolationMVArun2v1DBoldDMwLT>4.5') & Cut('l2_byIsolationMVArun2v1DBoldDMwLT>4.5'), Cut('l1_byIsolationMVArun2v1DBoldDMwLT>4.5') & Cut('l2_byIsolationMVArun2v1DBoldDMwLT>2.5')), # 'l1_tight':(Cut('l1_byIsolationMVArun2v1DBoldDMwLT>3.5') & Cut('l2_byIsolationMVArun2v1DBoldDMwLT>4.5'), Cut('l1_byIsolationMVArun2v1DBoldDMwLT>3.5') & Cut('l2_byIsolationMVArun2v1DBoldDMwLT>1.5')), # 'l1_medium':(Cut('l1_byIsolationMVArun2v1DBoldDMwLT>2.5') & Cut('l2_byIsolationMVArun2v1DBoldDMwLT>4.5'), Cut('l1_byIsolationMVArun2v1DBoldDMwLT>2.5') & Cut('l2_byIsolationMVArun2v1DBoldDMwLT>0.5')), # 'l1_loose':(Cut('l1_byIsolationMVArun2v1DBoldDMwLT>1.5') & Cut('l2_byIsolationMVArun2v1DBoldDMwLT>4.5'), Cut('l1_byIsolationMVArun2v1DBoldDMwLT>1.5') & Cut('l2_byIsolationMVArun2v1DBoldDMwLT>0.5')), # 'l1_vloose':(Cut('l1_byIsolationMVArun2v1DBoldDMwLT>0.5') & Cut('l2_byIsolationMVArun2v1DBoldDMwLT>4.5'),Cut('l1_byIsolationMVArun2v1DBoldDMwLT>0.5') & Cut('1')), # } for cut in cuts: for iso_cut_name, (iso_cut, max_iso_cut) in iso_cuts.items(): # iso and charge cuts, need to have them explicitly for the QCD estimation # max_iso_cut = Cut('l1_byIsolationMVArun2v1DBoldDMwLT > 2.5 && l2_byIsolationMVArun2v1DBoldDMwLT > 2.5') iso_sideband_cut = (~iso_cut) & max_iso_cut charge_cut = Cut('l1_charge != l2_charge') isSS = 'SS' in cut.name all_samples_qcd = qcd_estimation( cut.cut & iso_sideband_cut & (charge_cut if not isSS else ~charge_cut), # shape sideband cut.cut & iso_cut & (~charge_cut), # norm sideband 1 cut.cut & iso_sideband_cut & (~charge_cut), # norm sideband 2 all_samples if mode in ['mssm'] else samples, int_lumi, total_weight, verbose=verbose, friend_func=friend_func) # now include charge and isolation too the_cut = MyCut( cut.name + iso_cut_name, cut.cut & iso_cut & (charge_cut if not isSS else ~charge_cut)) # for variable in variables: cfg_total = HistogramCfg(name=the_cut.name, vars=variables, cfgs=all_samples_qcd, cut=str(the_cut.cut), lumi=int_lumi, weight=total_weight) # all_samples_qcd[-1].vars = variables if mode == 'mva_train': createTrees(cfg_total, '/data1/steggema/tt/MVATrees', verbose=True) continue plots = createHistograms(cfg_total, verbose=True, friend_func=friend_func) for variable in variables: plot = plots[variable.name] plot.Group('Single t', [ 'T_tWch', 'TBar_tWch', 'TToLeptons_tch_powheg', 'TBarToLeptons_tch_powheg' ]) # 'TToLeptons_sch', plot.Group('VV', [ 'VVTo2L2Nu', 'ZZTo2L2Q', 'WWTo1L1Nu2Q', 'WZTo1L3Nu', 'ZZTo4L', 'WZTo2L2Q', 'WZTo1L1Nu2Q', 'Single t' ]) # 'WZTo3L', plot.Group( 'ZTT', ['ZTT', 'ZTT1Jets', 'ZTT2Jets', 'ZTT3Jets', 'ZTT4Jets']) plot.Group('ZJ', ['ZJ', 'ZJ1Jets', 'ZJ2Jets', 'ZJ3Jets', 'ZJ4Jets']) plot.Group('ZL', ['ZL', 'ZL1Jets', 'ZL2Jets', 'ZL3Jets', 'ZL4Jets']) plot.Group( 'W', ['WJetsToLNu', 'W1Jets', 'W2Jets', 'W3Jets', 'W4Jets']) plot.Group('Electroweak', ['W', 'VV', 'Single t', 'ZJ']) if optimisation: plot.DrawStack('HIST') print plot for signal_hist in plot.SignalHists(): sample_names.add(signal_hist.name) ams = ams_hists_rebin(signal_hist.weighted, plot.BGHist().weighted) if variable.name == 'mt_total_mssm' and signal_hist.name == 'ggH1800': print ams_hists_rebin(signal_hist.weighted, plot.BGHist().weighted, debug=True) # import pdb; pdb.set_trace() ams_dict[variable.name + '__' + the_cut.name + '__' + signal_hist.name + '_'] = ams if not make_plots: continue blindxmin = 0.7 if 'mva' in variable.name else None blindxmax = 1.00001 if 'mva' in variable.name else None if variable.name == 'mt2': blindxmin = 60. blindxmax = variable.binning['xmax'] if variable.name == 'mt_sum': blindxmin = 250. blindxmax = variable.binning['xmax'] if variable.name == 'mt_total': blindxmin = 200. blindxmax = variable.binning['xmax'] plot_dir = 'plot_' + the_cut.name HistDrawer.draw(plot, channel='#tau_{h}#tau_{h}', plot_dir=plot_dir, blindxmin=blindxmin, blindxmax=blindxmax) # HistDrawer.drawRatio(plot, channel='#tau_{h}#tau_{h}') plot.UnGroup('Electroweak') #, ['W', 'VV', 'Single t', 'ZJ']) plot.Group('VV', ['VV', 'Single t']) if variable.name in [ 'mt_total', 'svfit_mass', 'mt_total_mssm', 'mt_total_mssm_fine' ]: plot.WriteDataCard( filename=plot_dir + '/htt_tt.inputs-sm-13TeV_{var}{postfix}.root'.format( var=variable.name, postfix=dc_postfix), dir='tt_' + cut.name, mode='UPDATE') # Save AMS dict import pickle pickle.dump(ams_dict, open('opt.pkl', 'wb')) if optimisation: print '\nOptimisation results:' all_vals = ams_dict.items() for sample_name in sample_names: vals = [v for v in all_vals if sample_name + '_' in v[0]] vals.sort(key=itemgetter(1)) for key, item in vals: print item, key print '\nBy variable' for variable in variables: name = variable.name print '\nResults for variable', name for key, item in vals: if key.startswith(name + '__'): print item, key
'nbinsx': 25, 'xmin': -2.5, 'xmax': 2.5 }, unit='', xtitle='jet #eta'), ] # variables = [ # VariableCfg(name='mvis', binning={'nbinsx':35, 'xmin':0, 'xmax':350}, unit='GeV', xtitle='m_{vis}') # ] for cut_name in cuts: cfg_tight = HistogramCfg( name='tight', var=None, cfgs=samples, cut=inc_cut, lumi=int_lumi, weight=total_weight + '*( (abs(tau1_gen_pdgId)!=15) - (abs(tau1_gen_pdgId)==15))') cfg_loose = HistogramCfg( name='loose', var=None, cfgs=samples, cut=inc_cut, lumi=int_lumi, weight=total_weight + '*( (abs(tau1_gen_pdgId)!=15) - (abs(tau1_gen_pdgId)==15))') cfg_tight_data = HistogramCfg( name='tight_data', var=None, cfgs=samples,
def makePlots(variables, cuts, total_weight, sample_dict, hist_dict, qcd_from_same_sign, w_qcd_mssm_method, mt_cut, friend_func, dc_postfix, make_plots=True, create_trees=False): ams_dict = {} sample_names = set() for cut in cuts: if qcd_from_same_sign and not 'SS' in cut.name and not w_qcd_mssm_method: cfg_main = HistogramCfg(name=cut.name, var=None, cfgs=sample_dict['samples_qcdfromss'], cut=cut.cut, lumi=int_lumi, weight=total_weight) elif w_qcd_mssm_method: cfg_main = HistogramCfg(name=cut.name, var=None, cfgs=sample_dict['samples_mssm_method'], cut=cut.cut, lumi=int_lumi, weight=total_weight) hist_dict[ 'wjets'].cut = cut.cut # since wjets is a sub-HistogramCfg else: cfg_main = HistogramCfg(name=cut.name, var=None, cfgs=sample_dict['all_samples'], cut=cut.cut, lumi=int_lumi, weight=total_weight) if qcd_from_same_sign and not 'SS' in cut.name: hist_dict['qcd'].cut = cut.cut.replace('l1_charge != l2_charge', 'l1_charge == l2_charge') if w_qcd_mssm_method: estimateQCDWMSSM(hist_dict, cut, mt_cut, friend_func=friend_func, r_qcd_os_ss=r_qcd_os_ss) cfg_main.vars = variables if qcd_from_same_sign: hist_dict[ 'qcd'].vars = variables # Can put into function but we will not want it by default if we take normalisations from e.g. high MT if w_qcd_mssm_method: hist_dict[ 'wjets'].vars = variables # Can put into function but we will not want it by default if we take normalisations from e.g. high MT hist_dict['qcd'].vars = variables hist_dict['wjets_ss'].vars = variables for variable in variables: if variable.name in [ 'svfit_mass', 'svfit_transverse_mass', 'mvis' ] and 'mssm' in mode: if cut.name in ['inclusive', 'nobtag']: variable.binning = binning_mssm elif cut.name in ['btag']: variable.binning = binning_mssm_btag if create_trees: createTrees(cfg_main, '/data1/steggema/mt/MVATrees', verbose=True) continue plots = createHistograms(cfg_main, verbose=False, friend_func=friend_func) for variable in variables: # for plot in plots.itervalues(): plot = plots[variable.name] createDefaultGroups(plot) if not w_qcd_mssm_method: plot.Group('W', ['W', 'W1Jets', 'W2Jets', 'W3Jets', 'W4Jets']) plot.Group('Electroweak', ['VV', 'W']) # plot.Group('Single t', ['T_tWch', 'TBar_tWch', 'TToLeptons_sch', 'TToLeptons_tch']) plot.Group('ZTT', ['ZTT', 'ZJ'], style=plot.Hist('ZTT').style) if make_plots: HistDrawer.draw(plot, plot_dir='plots/' + cut.name) if variable.name in [ 'mvis', 'svfit_transverse_mass', 'svfit_mass', 'mva', 'mva2div1', 'mva1', 'mva2', 'l2_nc_ratio' ]: plot.WriteDataCard( filename='datacard_{mode}_{var}.root'.format( mode=mode, var=variable.name), dir='mt_' + cut.name, mode='UPDATE', postfix=dc_postfix) #mt = mu-tau for signal_hist in plot.SignalHists(): sample_names.add(signal_hist.name) ams_dict[variable.name + '__' + cut.name + '__' + signal_hist.name + '_'] = ams_hists( signal_hist.weighted, plot.BGHist().weighted) print '\nOptimisation results:' all_vals = ams_dict.items() for sample_name in sample_names: vals = [v for v in all_vals if sample_name + '_' in v[0]] vals.sort(key=itemgetter(1)) for key, item in vals: print item, key print '\nBy variable' for variable in variables: name = variable.name print '\nResults for variable', name for key, item in vals: if key.startswith(name + '__'): print item, key
samples_mc, samples_data, samples, all_samples, sampleDict = createSampleLists(analysis_dir, channel='em', ztt_cut='(l1_gen_match>2 && l2_gen_match>3)', zl_cut='l2_gen_match==99',zj_cut='l2_gen_match==99', data2016G=data2016G) if qcd_from_same_sign: samples_qcdfromss = [s for s in samples if s.name != 'QCD'] samples_ss = copy.deepcopy(samples_qcdfromss) scale = 2.0 for sample in samples_ss: sample.scale = scale if sample.name != 'data_obs': # Subtract background from data sample.scale = -scale qcd = HistogramCfg(name='QCD', var=None, cfgs=samples_ss, cut=inc_cut, lumi=lumi) samples_qcdfromss.append(qcd) # Taken from Variables.py, can get subset with e.g. getVars(['mt', 'mvis']) variables = emu_vars # variables = getVars(['n_vertices']) # variables = getVars(['l1_reliso05', 'l2_reliso05']) # variables = [ # VariableCfg(name='mvis', binning={'nbinsx':35, 'xmin':0, 'xmax':350}, unit='GeV', xtitle='m_{vis}') # ] for cut_name in cuts: if qcd_from_same_sign and not 'SS' in cut_name : cfg_example = HistogramCfg(name='example', var=None, cfgs=samples_qcdfromss, cut=inc_cut, lumi=lumi, weight=total_weight) else:
def createSamples(mode, analysis_dir, total_weight, qcd_from_same_sign, w_qcd_mssm_method, r_qcd_os_ss): hist_dict = {} sample_dict = {} samples_mc, samples_data, samples, all_samples, sampleDict = createSampleLists( analysis_dir=analysis_dir) if mode == 'mssm_control' or not 'mssm' in mode: all_samples = [ s for s in all_samples if not 'ggH' in s.name and not 'bbH' in s.name ] sample_dict['all_samples'] = all_samples if qcd_from_same_sign and not w_qcd_mssm_method: samples_qcdfromss = [s for s in all_samples if s.name != 'QCD'] samples_ss = copy.deepcopy(samples_qcdfromss) samples_ss = [s for s in samples_ss if not s.is_signal] for sample in samples_ss: if sample.name != 'data_obs': # Subtract background from data sample.scale = -1. qcd = HistogramCfg(name='QCD', var=None, cfgs=samples_ss, cut=None, total_scale=r_qcd_os_ss, lumi=int_lumi, weight=total_weight) samples_qcdfromss.append(qcd) sample_dict['samples_qcdfromss'] = samples_qcdfromss if w_qcd_mssm_method: w_names = ['W', 'W1Jets', 'W2Jets', 'W3Jets', 'W4Jets'] samples_non_w = [ s for s in all_samples if s.name != 'QCD' and s.name not in w_names and not s.is_signal ] samples_non_w_ss = copy.deepcopy(samples_non_w) samples_signal = [s for s in all_samples if s.is_signal] samples_w = copy.deepcopy( [s for s in all_samples if s.name in w_names]) samples_w_ss = copy.deepcopy(samples_w) # To calculate OS/SS ratio in inclusive W selection samples_w_incl_os = copy.deepcopy(samples_w) samples_w_incl_ss = copy.deepcopy(samples_w) # To calculate W scale factor samples_w_highmt_os = copy.deepcopy(samples_w) # Build a high MT region: OS - non-W/QCD OS - (SS - non-W/QCD SS) samples_non_w_highmt_os = copy.deepcopy(samples_non_w) samples_non_w_highmt_ss = copy.deepcopy(samples_non_w) for sample in samples_non_w_highmt_os: if sample.name != 'data_obs': # Subtract background from data sample.scale = -1. for sample in samples_non_w_highmt_ss: if sample.name != 'data_obs': sample.scale = -1. for sample in samples_non_w_ss: if sample.name != 'data_obs': sample.scale = -1. var_norm = VariableCfg(name='_norm_', drawname='1.', binning={ 'nbinsx': 5, 'xmin': -1.5, 'xmax': 3.5 }, unit='', xtitle='Normalisation') hist_dict['stacknow_highmt_os'] = HistogramCfg( name='HighMTOS', var=var_norm, cfgs=samples_non_w_highmt_os, cut=None, lumi=int_lumi, weight=total_weight) hist_dict['stacknow_highmt_ss'] = HistogramCfg( name='HighMTSS', var=var_norm, cfgs=samples_non_w_highmt_ss, cut=None, lumi=int_lumi, weight=total_weight) hist_dict['wjets_incl_os'] = HistogramCfg(name='WInclOS', var=var_norm, cfgs=samples_w_incl_os, cut=None, lumi=int_lumi, weight=total_weight) hist_dict['wjets_incl_ss'] = HistogramCfg(name='WInclSS', var=var_norm, cfgs=samples_w_incl_ss, cut=None, lumi=int_lumi, weight=total_weight) hist_dict['wjets_highmt_os'] = HistogramCfg(name='WHighMTOS', var=var_norm, cfgs=samples_w_highmt_os, cut=None, lumi=int_lumi, weight=total_weight) hist_dict['wjets'] = HistogramCfg(name='W', var=None, cfgs=samples_w, cut=None, lumi=int_lumi, weight=total_weight) hist_dict['wjets_ss'] = HistogramCfg(name='WSS', var=None, cfgs=samples_w_ss, cut=None, lumi=int_lumi, weight=total_weight) hist_dict['qcd'] = HistogramCfg(name='QCD', var=None, cfgs=samples_non_w_ss + [hist_dict['wjets_ss']], cut=None, total_scale=r_qcd_os_ss, lumi=int_lumi, weight=total_weight) sample_dict['samples_mssm_method'] = samples_non_w + [ hist_dict['wjets'], hist_dict['qcd'] ] + samples_signal return sample_dict, hist_dict
samples_mc, samples_data, samples, all_samples, sampleDict = createSampleLists( analysis_dir, channel='WV', weight=weight_MC, reweightVJets=False) # Taken from Variables.py, can get subset with e.g. getVars(['mt', 'mvis']) variables = generic_vars + lnujj_vars + lnujj_vbf_vars # variables = [lnujj_vars[0]] # variables = getVars(['l1_reliso05', 'l2_reliso05']) # variables = [ # VariableCfg(name='mvis', binning={'nbinsx':35, 'xmin':0, 'xmax':350}, unit='GeV', xtitle='m_{vis}') # ] for cut_name in cuts: cfg_example = HistogramCfg(name='example', var=None, cfgs=samples, cut='', lumi=int_lumi, weight=total_weight) cfg_example.cut = cuts[cut_name] cfg_example.vars = variables channel = "l#nujj" if cut_name.find("_mu") >= 0: channel = "#mu#nujj" elif cut_name.find("_e") >= 0: channel = "e#nujj" if cut_name.find("HP") >= 0: channel += " HP" elif cut_name.find("LP") >= 0: channel += " LP"
'&& tau_decayModeFinding>0.5&& tau_byCombinedIsolationDeltaBetaCorr3Hits>1.5 && tau_againstMuon3>0.5 && tau_pt>20.', # 'dbetamedium_antimuloose_antietight_20':'&& tau_decayModeFinding>0.5&& tau_byCombinedIsolationDeltaBetaCorr3Hits>1.5 && tau_againstMuon3>0.5 && tau_pt>20. && tau_againstElectronMVA6>2.5', # 'dbetaloose_antimuloose':'&& tau_decayModeFinding>0.5&& tau_byCombinedIsolationDeltaBetaCorr3Hits>0.5 && tau_againstMuon3>0.5', # 'mvaolddmvloose_antimuloose':'&& tau_decayModeFinding>0.5&& tau_byIsolationMVA3oldDMwLT>0.5 && tau_againstMuon3>0.5', # 'mvaolddmloose_antimuloose':'&& tau_decayModeFinding>0.5&& tau_byIsolationMVA3oldDMwLT>1.5 && tau_againstMuon3>0.5', # 'mvaolddmmedium_antimuloose':'&& tau_decayModeFinding>0.5&& tau_byIsolationMVA3oldDMwLT>2.5 && tau_againstMuon3>0.5', # 'mvaolddmtight_antimuloose':'&& tau_decayModeFinding>0.5&& tau_byIsolationMVA3oldDMwLT>3.5 && tau_againstMuon3>0.5', # 'mvaolddmvtight_antimuloose':'&& tau_decayModeFinding>0.5&& tau_byIsolationMVA3oldDMwLT>4.5 && tau_againstMuon3>0.5', } for cut_name in cuts: for signal_cut_name, signal_cut in signal_cuts.items(): cfg_tight = HistogramCfg( name='tight' + cut_name + signal_cut_name, var=None, cfgs=samples_mc, cut=inc_cut, lumi=int_lumi, weight=total_weight + ' * ((tau_gen_match != 5) - (tau_gen_match == 5))') cfg_loose = HistogramCfg( name='loose' + cut_name + signal_cut_name, var=None, cfgs=samples_mc, cut=inc_cut, lumi=int_lumi, weight=total_weight + ' * ((tau_gen_match != 5) - (tau_gen_match == 5))') cfg_data_tight = HistogramCfg( name='tight_data' + cut_name + signal_cut_name, var=None,