示例#1
0
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
示例#2
0
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
示例#3
0
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)
示例#4
0
        '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(
示例#5
0
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
示例#7
0
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])
示例#8
0
# -> 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,
示例#10
0
    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)

示例#11
0
# 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
示例#12
0
        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
示例#13
0
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,
示例#15
0
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
示例#16
0
                    '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,
示例#17
0
    '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,
示例#18
0
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
示例#19
0
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:
示例#20
0
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
示例#21
0
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"
示例#22
0
    '&& 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,