def ttbarcheck(): indir = "input/21Aug_newsf" acc = acc_from_dir(indir) outdir = f'./output/{os.path.basename(indir)}/ttbar/fxfx_vs_mlm' for year in [2017, 2018]: data = re.compile(f'TTJets.*FXFX.*{year}') mc = re.compile(f'TTJets.*MLM.*{year}') region = 'cr_2m_j' for distribution in ['recoil', 'ak4_pt0']: make_plot(acc, region=region, distribution=distribution, year=year, data=data, mc=mc, ylim=(1e-3, 1e3), outdir=outdir) outdir = f'./output/{os.path.basename(indir)}/ttbar/fxfx_vs_pow' for year in [2017, 2018]: data = re.compile(f'TTJets.*FXFX.*{year}') mc = re.compile(f'TT.*pow.*{year}') region = 'cr_2m_j' for distribution in ['recoil', 'ak4_pt0']: make_plot(acc, region=region, distribution=distribution, year=year, data=data, mc=mc, ylim=(1e-3, 1e3), outdir=outdir)
def data_mc_after_kfac(): indir = "input/21Aug_newsf" acc = acc_from_dir(indir) outdir = f'./output/{os.path.basename(indir)}' for year in [2017, 2018]: data = re.compile(f'MET_{year}') mc = re.compile( f'(EW.*|TTJets.*FXFX.*|Diboson.*|ST.*|QCD_HT.*|.*DYJetsToLL_M-50_HT_MLM.*){year}' ) region = 'cr_2m_j' for distribution in ['recoil', 'ak4_pt0']: make_plot(acc, region=region, distribution=distribution, year=year, data=data, mc=mc, ylim=(1e-3, 1e3), outdir=outdir) data = re.compile(f'MET_{year}') mc = re.compile( f'(TTJets.*FXFX.*|Diboson.*|ST.*|QCD_HT.*|.*DYJetsToLL_M-50_HT_MLM.*|W.*HT.*).*{year}' ) region = 'cr_1m_j' for distribution in ['recoil', 'ak4_pt0']: make_plot(acc, region=region, distribution=distribution, year=year, data=data, mc=mc, ylim=(1e-3, 1e5), outdir=outdir)
def main(): indir = "input/2019-09-06_hem/" acc = acc_from_dir(indir) # for year in [2018]: # data = re.compile(f'EGamma_{year}') # mc = re.compile(f'(EW.*|TTJets.*|ZZ.*|ST.*|QCD_HT.*|WW.*|WZ.*|.*DYJetsToLL_M-50_HT_MLM.*|WJet.*HT.*){year}') # for region in ['cr_1e_j','cr_1e_j_nohem', 'cr_2e_j','cr_1e_j_nohem']: # for distribution in ['recoil','ak4_phi','electron_phi','ak4_pt0']: # make_plot(acc, region=region,distribution=distribution, year=year, data=data, mc=mc, outdir=f'./output/{os.path.basename(indir)}') for year in [2018]: data = re.compile(f'MET_{year}') mc = re.compile( f'(EW.*|TTJets.*|ZZ.*|ST.*|QCD_HT.*|WW.*|WZ.*|.*DYJetsToLL_M-50_HT_MLM.*|WJet.*HT.*){year}' ) for region in ['cr_1m_j', 'cr_1m_j_nohem']: for distribution in ['ak4_phi', 'recoil', 'ak4_pt0']: make_plot(acc, region=region, distribution=distribution, year=year, data=data, mc=mc, outdir=f'./output/{os.path.basename(indir)}')
def cr_ratio(): indir=os.path.abspath('input/2019-09-09_gen_dilep_sf/') acc = acc_from_dir(indir) for year in [2017,2018]: data = { 'cr_1m_j' : f'MET_{year}', 'cr_2m_j' : f'MET_{year}', 'cr_1e_j' : f'EGamma_{year}', 'cr_2e_j' : f'EGamma_{year}', 'cr_g_j' : f'EGamma_{year}', } mc_lo = { 'cr_1m_j' : re.compile(f'(TTJets.*FXFX.*|Diboson.*|ST.*|QCD_HT.*|.*DYJetsToLL_M-50_HT_MLM.*|W.*HT.*).*{year}'), 'cr_1e_j' : re.compile(f'(TTJets.*FXFX.*|Diboson.*|ST.*|QCD_HT.*|.*DYJetsToLL_M-50_HT_MLM.*|W.*HT.*).*{year}'), 'cr_2m_j' : re.compile(f'(EW.*|TTJets.*FXFX.*|Diboson.*|ST.*|QCD_HT.*|.*DYJetsToLL_M-50_HT_MLM.*).*{year}'), 'cr_2e_j' : re.compile(f'(EW.*|TTJets.*FXFX.*|Diboson.*|ST.*|QCD_HT.*|.*DYJetsToLL_M-50_HT_MLM.*).*{year}'), 'cr_g_j' : re.compile(f'(GJets.*|QCD_HT.*|W.*HT.*).*{year}'), } mc_nlo = { 'cr_1m_j' : re.compile(f'(TTJets.*FXFX.*|Diboson.*|ST.*|QCD_HT.*|.*DY.*FXFX.*|W.*FXFX.*).*{year}'), 'cr_1e_j' : re.compile(f'(TTJets.*FXFX.*|Diboson.*|ST.*|QCD_HT.*|.*DY.*FXFX.*|W.*FXFX.*).*{year}'), 'cr_2m_j' : re.compile(f'(EW.*|TTJets.*FXFX.*|Diboson.*|ST.*|QCD_HT.*|.*DY.*FXFX.*).*{year}'), 'cr_2e_j' : re.compile(f'(EW.*|TTJets.*FXFX.*|Diboson.*|ST.*|QCD_HT.*|.*DY.*FXFX.*).*{year}'), 'cr_g_j' : re.compile(f'(GJets.*|QCD_HT.*|W.*FXFX.*).*{year}'), } outdir = f'./output/{os.path.basename(indir)}/ratios' cr_ratio_plot(acc, year=year,tag='losf',outdir=outdir, mc=mc_lo) cr_ratio_plot(acc, year=year,tag='nlo',outdir=outdir, mc=mc_nlo) for region in mc_lo.keys(): outdir = f'./output/{os.path.basename(indir)}/{region}' plotset = plot_settings[region] for distribution in plotset.keys(): make_plot(acc, region=region, distribution=distribution, year=year, data=data[region], mc=mc_lo[region], ylim=plot_settings['ylim'], tag = 'losf', outdir=f'./output/{os.path.basename(indir)}/{region}') make_plot(acc, region=region, distribution=distribution, year=year, data=data[region], mc=mc_nlo[region], ylim=plot_settings['ylim'], tag = 'nlo', outdir=f'./output/{os.path.basename(indir)}/{region}')
def single_electron_plots(): for year in [2017, 2018]: data = re.compile(f'EGamma_{year}') mc = re.compile(f'(TTJets.*FXFX.*|ST.*|QCD_HT.*|Diboson.*|W.*HT.*).*{year}') region='cr_1e_j' for distribution in ['recoil','ak4_pt0','electron_pt','met']: make_plot(acc, region=region,distribution=distribution, year=year, data=data, mc=mc, ylim=(1e-3,1e5), outdir=f'./output/{os.path.basename(indir)}/{region}') for distribution in ['ak4_phi0','electron_phi']: make_plot(acc, region=region,distribution=distribution, year=year, data=data, mc=mc, ylim=(1e4,1e5), outdir=f'./output/{os.path.basename(indir)}/{region}') for distribution in ['ak4_eta0', 'electron_eta']: make_plot(acc, region=region,distribution=distribution, year=year, data=data, mc=mc, xlim=(-3,3),ylim=(1e4,1e6), outdir=f'./output/{os.path.basename(indir)}/{region}') for distribution in ['ak4_chf0','ak4_nhf0']: make_plot(acc, region=region,distribution=distribution, year=year, data=data, mc=mc, xlim=(0,1),ylim=(1e3,1e8), outdir=f'./output/{os.path.basename(indir)}/{region}') for distribution in ['electron_mt']: make_plot(acc, region=region,distribution=distribution, year=year, data=data, mc=mc, xlim=(0,180),ylim=(1e1,1e5), outdir=f'./output/{os.path.basename(indir)}/{region}')
def main(): # indir = "../input/21Aug19_v4_pdfwgt" # acc = acc_from_dir(indir) # for year in [2017]: # data = re.compile(f'MET_{year}') # mc = re.compile(f'(EW.*|TTJets.*|ZZ.*|ST.*|QCD_HT.*|WW.*|WZ.*|.*DYJetsToLL_M-50_HT_MLM.*){year}') # region='cr_2m_j' # for distribution in ['recoil']: # make_plot(acc, region=region,distribution=distribution, year=year, data=data, mc=mc, ylim=(1e-3,1e3), outdir=f'./output/{os.path.basename(indir)}') indir = "../../input/21Aug19_v2_newpu" acc = acc_from_dir(indir) for year in [2017]: data = re.compile(f'MET_{year}') mc = re.compile( f'(EW.*|TTJets.*|ZZ.*|ST.*|QCD_HT.*|WW.*|WZ.*|.*DYJetsToLL_M-50_HT_MLM.*){year}' ) region = 'cr_2m_j' for distribution in ['recoil', 'ak4_pt0']: make_plot(acc, region=region, distribution=distribution, year=year, data=data, mc=mc, ylim=(1e-3, 1e3), outdir=f'./output/{os.path.basename(indir)}') for year in [2017]: data = re.compile(f'MET_{year}') mc = re.compile( f'(EW.*|TTJets.*|ZZ.*|ST.*|QCD_HT.*|WW.*|WZ.*|.*DYJetsToLL_M-50_HT_MLM.*){year}' ) region = 'cr_2m_j' for distribution in ['recoil', 'ak4_pt0']: make_plot(acc, region=region, distribution=distribution, year=year, data=data, mc=mc, ylim=(1e-3, 1e3), outdir=f'./output/{os.path.basename(indir)}/ttbarcheck')
def photon_plots(): for year in [2017, 2018]: data = re.compile(f'EGamma_{year}') mc = re.compile(f'(GJets.*|QCD_HT.*|W.*HT.*).*{year}') region='cr_g_j' for distribution in ['recoil','ak4_pt0','photon_pt0','met']: make_plot(acc, region=region,distribution=distribution, year=year, data=data, mc=mc, ylim=(1e-3,1e5), outdir=f'./output/{os.path.basename(indir)}/{region}') for distribution in ['ak4_phi0','photon_phi0']: make_plot(acc, region=region,distribution=distribution, year=year, data=data, mc=mc, ylim=(4e4,5e5), outdir=f'./output/{os.path.basename(indir)}/{region}') for distribution in ['ak4_eta0', 'photon_eta0']: make_plot(acc, region=region,distribution=distribution, year=year, data=data, mc=mc, xlim=(-3,3),ylim=(1e4,1e6), outdir=f'./output/{os.path.basename(indir)}/{region}') for distribution in ['ak4_chf0','ak4_nhf0']: make_plot(acc, region=region,distribution=distribution, year=year, data=data, mc=mc, xlim=(0,1),ylim=(1e3,1e8), outdir=f'./output/{os.path.basename(indir)}/{region}')
def dielectron_plots(): for year in [2017,2018]: data = re.compile(f'EGamma_{year}') mc = re.compile(f'(EW.*|TTJets.*FXFX.*|ST.*|QCD_HT.*|Diboson.*|.*DYJetsToLL_M-50_HT_MLM.*){year}') region='cr_2e_j' for distribution in ['recoil','ak4_pt0','dielectron_mass','electron_pt', 'dielectron_pt','met']: make_plot(acc, region=region,distribution=distribution, year=year, data=data, mc=mc, ylim=(1e-3,1e3), outdir=f'./output/{os.path.basename(indir)}/{region}') for distribution in ['ak4_phi0','electron_phi','dielectron_mass']: make_plot(acc, region=region,distribution=distribution, year=year, data=data, mc=mc, ylim=(1e1,1e5), outdir=f'./output/{os.path.basename(indir)}/{region}') for distribution in ['ak4_eta0', 'electron_eta','dielectron_eta']: make_plot(acc, region=region,distribution=distribution, year=year, data=data, mc=mc, xlim=(-3,3),ylim=(1e3,1e5), outdir=f'./output/{os.path.basename(indir)}/{region}') for distribution in ['ak4_chf0','ak4_nhf0']: make_plot(acc, region=region,distribution=distribution, year=year, data=data, mc=mc, xlim=(0,1),ylim=(1e2,1e6), outdir=f'./output/{os.path.basename(indir)}/{region}')
def plot(args): indir = os.path.abspath(args.inpath) # The processor output is stored in an # 'accumulator', which in our case is # just a dictionary holding all the histograms # Put all your *coffea files into 'indir' and # pass the directory as an argument here. # All input files in the directory will # automatically be found, merged and read. # The merging only happens the first time # you run over a specific set of inputs. acc = dir_archive(args.inpath, serialized=True, compression=0, memsize=1e3) # Get a settings dictionary that details # which plots to make for each region, # what the axis limits are, etc # Can add plots by extending the dictionary # Or modify axes ranges, etc settings = plot_settings() merged = set() # Separate plots per year for year in [2017, 2018]: # The data to be used for each region # Muon regions use MET, # electron+photon regions use EGamma # ( EGamma = SingleElectron+SinglePhoton for 2017) data = { 'sr_vbf': f'MET_{year}', 'cr_1m_vbf': f'MET_{year}', 'cr_2m_vbf': f'MET_{year}', 'cr_1e_vbf': f'EGamma_{year}', 'cr_2e_vbf': f'EGamma_{year}', 'cr_g_vbf': f'EGamma_{year}', } # Same for MC selection # Match datasets by regular expressions # Here for LO V samples (HT binned) mc_lo = { 'sr_vbf': re.compile( f'(ZJetsToNuNu.*|EW.*|Top_FXFX.*|Diboson.*|.*DYJetsToLL_M-50_HT_MLM.*|.*WJetsToLNu.*HT.*).*{year}' ), 'cr_1m_vbf': re.compile( f'(EWKW.*|Top_FXFX.*|Diboson.*|.*DYJetsToLL_M-50_HT_MLM.*|.*WJetsToLNu.*HT.*).*{year}' ), 'cr_1e_vbf': re.compile( f'(EWKW.*|Top_FXFX.*|Diboson.*|.*DYJetsToLL_M-50_HT_MLM.*|.*WJetsToLNu.*HT.*).*{year}' ), 'cr_2m_vbf': re.compile( f'(EWKZ.*ZToLL.*|Top_FXFX.*|Diboson.*|.*DYJetsToLL_M-50_HT_MLM.*).*{year}' ), 'cr_2e_vbf': re.compile( f'(EWKZ.*ZToLL.*|Top_FXFX.*|Diboson.*|.*DYJetsToLL_M-50_HT_MLM.*).*{year}' ), 'cr_g_vbf': re.compile( f'(GJets_(DR-0p4|SM).*|QCD_data.*|WJetsToLNu.*HT.*).*{year}'), } # Load ingredients from cache acc.load('sumw') acc.load('sumw_pileup') acc.load('nevents') # Data / MC plots are made here # Loop over all regions for region in mc_lo.keys(): if not re.match(args.region, region): continue # Plot ratio pads for all regions (now that we're unblinded) ratio = True # Make separate output direcotry for each region outdir = f'./output/{os.path.basename(indir)}/{region}' # Settings for this region plotset = settings[region] # Loop over the distributions for distribution in plotset.keys(): if not re.match(args.distribution, distribution): continue # Load from cache if not distribution in merged: acc.load(distribution) if not distribution in acc.keys(): print( f"WARNING: Distribution {distribution} not found in input files." ) continue acc[distribution] = merge_extensions( acc[distribution], acc, reweight_pu=not ('nopu' in distribution)) scale_xs_lumi(acc[distribution]) acc[distribution] = merge_datasets(acc[distribution]) acc[distribution].axis('dataset').sorting = 'integral' merged.add(distribution) try: # The heavy lifting of making a plot is hidden # in make_plot. We call it once using the LO MC imc = mc_lo[region] if "cr_g" in region and distribution != "recoil": imc = re.compile( imc.pattern.replace('QCD_data', 'QCD.*HT')) make_plot( acc, region=region, distribution=distribution, year=year, data=data[region], mc=imc, ylim=plotset[distribution].get('ylim', None), xlim=plotset[distribution].get('xlim', None), tag='losf', outdir=f'./output/{os.path.basename(indir)}/{region}', output_format='pdf', ratio=ratio) except KeyError: continue
def plot(inpath): indir = os.path.abspath(inpath) # The processor output is stored in an # 'accumulator', which in our case is # just a dictionary holding all the histograms # Put all your *coffea files into 'indir' and # pass the directory as an argument here. # All input files in the directory will # automatically be found, merged and read. # The merging only happens the first time # you run over a specific set of inputs. acc = dir_archive(inpath, serialized=True, compression=0, memsize=1e3) # Get a settings dictionary that details # which plots to make for each region, # what the axis limits are, etc # Can add plots by extending the dictionary # Or modify axes ranges, etc settings = plot_settings() merged = set() # Separate plots per year for year in [2017, 2018]: # The data to be used for each region # Muon regions use MET, # electron+photon regions use EGamma # ( EGamma = SingleElectron+SinglePhoton for 2017) data = { 'sr_vbf': None, 'cr_1m_vbf': f'MET_{year}', 'cr_2m_vbf': f'MET_{year}', 'cr_1e_vbf': f'EGamma_{year}', 'cr_2e_vbf': f'EGamma_{year}', 'cr_g_vbf': f'EGamma_{year}', } # Same for MC selection # Match datasets by regular expressions # Here for LO V samples (HT binned) mc_lo = { 'sr_vbf': re.compile( f'(ZJetsToNuNu.*|EW.*|TTJets.*FXFX.*|Diboson.*|ST.*|QCD_HT.*|.*DYJetsToLL_M-50_HT_MLM.*|.*WJetsToLNu.*HT.*).*{year}' ), 'cr_1m_vbf': re.compile( f'(EW.*|TTJets.*FXFX.*|Diboson.*|ST.*|QCD_HT.*|.*DYJetsToLL_M-50_HT_MLM.*|.*WJetsToLNu.*HT.*).*{year}' ), 'cr_1e_vbf': re.compile( f'(EW.*|TTJets.*FXFX.*|Diboson.*|ST.*|QCD_HT.*|.*DYJetsToLL_M-50_HT_MLM.*|.*WJetsToLNu.*HT.*).*{year}' ), 'cr_2m_vbf': re.compile( f'(EW.*|TTJets.*FXFX.*|Diboson.*|ST.*|QCD_HT.*|.*DYJetsToLL_M-50_HT_MLM.*).*{year}' ), 'cr_2e_vbf': re.compile( f'(EW.*|TTJets.*FXFX.*|Diboson.*|ST.*|QCD_HT.*|.*DYJetsToLL_M-50_HT_MLM.*).*{year}' ), 'cr_g_vbf': re.compile(f'(GJets_(HT|SM).*|QCD_HT.*|WJetsToLNu.*HT.*).*{year}'), } # Want to compare LO and NLO, # so do same thing for NLO V samples # All non-V samples remain the same mc_nlo = { 'sr_vbf': re.compile( f'(ZJetsToNuNu.*|EW.*|TTJets.*FXFX.*|Diboson.*|ST.*|QCD_HT.*|.*DYJetsToLL_M-50_HT_MLM.*|.*WJetsToLNu.*FXFX.*).*{year}' ), 'cr_1m_vbf': re.compile( f'(EW.*|TTJets.*FXFX.*|Diboson.*|ST.*|QCD_HT.*|.*DY.*FXFX.*|.*WJetsToLNu.*FXFX.*).*{year}' ), 'cr_1e_vbf': re.compile( f'(EW.*|TTJets.*FXFX.*|Diboson.*|ST.*|QCD_HT.*|.*DY.*FXFX.*|.*WJetsToLNu.*FXFX.*).*{year}' ), 'cr_2m_vbf': re.compile( f'(EW.*|TTJets.*FXFX.*|Diboson.*|ST.*|QCD_HT.*|.*DY.*FXFX.*).*{year}' ), 'cr_2e_vbf': re.compile( f'(EW.*|TTJets.*FXFX.*|Diboson.*|ST.*|QCD_HT.*|.*DY.*FXFX.*).*{year}' ), 'cr_g_vbf': re.compile(f'(GJets_(HT|SM).*|QCD_HT.*|W.*FXFX.*).*{year}'), } regions = list(mc_lo.keys()) # Remove signal region, no need in ratio plots regions.remove('sr_vbf') # Make control region ratio plots for both # LO and NLO. Can be skipped if you only # want data / MC agreement plots. outdir = f'./output/{os.path.basename(indir)}/ratios' # Load ingredients from cache acc.load('mjj') acc.load('sumw') acc.load('sumw_pileup') acc.load('nevents') cr_ratio_plot(acc, year=year, tag='losf', outdir=outdir, mc=mc_lo, regions=regions, distribution='mjj') cr_ratio_plot(acc, year=year, tag='nlo', outdir=outdir, mc=mc_nlo, regions=regions, distribution='mjj') # Data / MC plots are made here # Loop over all regions for region in mc_lo.keys(): ratio = True if region != 'sr_vbf' else False # Make separate output direcotry for each region outdir = f'./output/{os.path.basename(indir)}/{region}' # Settings for this region plotset = settings[region] # Loop over the distributions for distribution in plotset.keys(): # Load from cache if not distribution in merged: acc.load(distribution) if not distribution in acc.keys(): print( f"WARNING: Distribution {distribution} not found in input files." ) continue acc[distribution] = merge_extensions( acc[distribution], acc, reweight_pu=not ('nopu' in distribution)) scale_xs_lumi(acc[distribution]) acc[distribution] = merge_datasets(acc[distribution]) acc[distribution].axis('dataset').sorting = 'integral' merged.add(distribution) try: # The heavy lifting of making a plot is hidden # in make_plot. We call it once using the LO MC make_plot( acc, region=region, distribution=distribution, year=year, data=data[region], mc=mc_lo[region], ylim=plotset[distribution].get('ylim', None), xlim=plotset[distribution].get('xlim', None), tag='losf', outdir=f'./output/{os.path.basename(indir)}/{region}', output_format='pdf', ratio=ratio) # And then we also call it for the NLO MC # The output files will be named according to the 'tag' # argument, so we will be able to tell them apart. make_plot( acc, region=region, distribution=distribution, year=year, data=data[region], mc=mc_nlo[region], ylim=plotset[distribution].get('ylim', None), xlim=plotset[distribution].get('xlim', None), tag='nlo', outdir=f'./output/{os.path.basename(indir)}/{region}', output_format='pdf', ratio=ratio) except KeyError: continue