def get_ele_single_fakefactors( base_dir_ele, file_bin_map, regions, eta_bins, el_selection ) : results_lead = { 'stat+syst' : {'result' : {} } } for file, ptbins in file_bin_map.iteritems() : # get root file print 'Get fake factors from ', '%s/%s/results.pickle' %(base_dir_ele, file) ff_man = FakeFactorManager( '%s/%s/results.pickle' %(base_dir_ele, file), ['fake_ratio'] ) data_samp = samplesInv.get_samples( name='Electron' )[0] # get data counts from inverted pixel seed for r1 in regions : #invert lead, draw lead count_var, idx_var = get_ph_cuts( 'single'+el_selection ) samplesInv.create_hist(data_samp, 'fabs(ph_eta[%s[0]]):ph_pt[%s[0]]'%(idx_var,idx_var), ' PUWeight * ( %s && ph_Is%s[%s[0]] )' %(get_draw_strs('single'+el_selection), r1,idx_var ), (20, 0, 100, 250, 0, 2.5) ) hist_lead = data_samp.hist.Clone('hist_lead__%s' %(r1)) for ptmin, ptmax in ptbins : results_lead['stat+syst']['result'][(r1, str(ptmin), str(ptmax))] = 0 for etamin, etamax in eta_bins[r1] : etabin = '%.2f-%.2f' %(etamin, etamax) results_lead['stat+syst']['result'][(etabin, str(ptmin), str(ptmax))] = 0 # get the bins. For the max bin subtract 1 because # you get the bin above the value ptbinmin = hist_lead.GetXaxis().FindBin( int(ptmin) ) if ptmax == 'max' : ptbinmax = hist_lead.GetNbinsX() else : ptbinmax = hist_lead.GetXaxis().FindBin( int(ptmax) )-1 etabinmin = hist_lead.GetYaxis().FindBin( etamin ) etabinmax = hist_lead.GetYaxis().FindBin( etamax )-1 nData = hist_lead.Integral( ptbinmin, ptbinmax, etabinmin, etabinmax ) ff = ff_man.get_pt_eta_ff( ptmin, ptmax, etamin, etamax ) print 'etamin = %.2f, etamax = %.2f, ptmin = %s, ptmax = %s, nData = %d, ff = %s' %( etamin, etamax, ptmin, ptmax, nData, ff ) #print 'ptmin = %s, ptmax = %s, etamin = %f, etamax = %f, ptbinmin = %d, ptbinmax = %d, etabinmin = %d, etabinmax = %d' %( ptmin, ptmax, etamin, etamax, ptbinmin, ptbinmax, etabinmin, etabinmax ) #print 'GetBinContent in %f < pt < %f, %f < eta < %f ' %( rhist.GetXaxis().GetBinLowEdge(ptbinmin), rhist.GetXaxis().GetBinUpEdge(ptbinmax), rhist.GetYaxis().GetBinLowEdge(etabinmin), rhist.GetYaxis().GetBinUpEdge(etabinmin) ) results_lead['stat+syst']['result'][(etabin, str(ptmin), str(ptmax))] = nData*ff results_lead['stat+syst']['result'][(r1, str(ptmin), str(ptmax))] = results_lead['stat+syst']['result'][(r1, str(ptmin), str(ptmax))] + nData*ff return results_lead
def MakeSingleEleBkgEstimate(base_dir_ele, base_dir_jet, file_bin_map, file_bin_map_syst, eta_bins, elffdir, el_selection='elw', outputDir=None) : el_acc = ['elw', 'elwzcr', 'elwzcrloose', 'elwsr', 'elwsrlowmt'] if el_selection not in el_acc : print 'Input region not recognized, must be %s' %(','.join(el_acc) ) return samplesLLG.deactivate_all_samples() samplesLLG.activate_sample('Data') regions = ['EB','EE'] results_nom = get_ele_single_fakefactors( base_dir_ele, file_bin_map, regions, eta_bins, el_selection ) # prevent killing from drawing too many plots #results_syst = get_ele_single_fakefactors( base_dir_ele, file_bin_map_syst, regions, eta_bins, el_selection ) file_key_lead_eta = 'results__%sinvpixlead__(\d\.\d\d-\d\.\d\d)__pt_(\d+)-(\d+|max).pickle' %el_selection file_key_lead_syst_eta = 'results__syst__%sinvpixlead__(\d\.\d\d-\d\.\d\d)__pt_(\d+)-(\d+|max).pickle' %el_selection file_key_lead = 'results__%sinvpixlead__(EB|EE)__pt_(\d+)-(\d+|max).pickle' %el_selection file_key_lead_syst = 'results__syst__%sinvpixlead__(EB|EE)__pt_(\d+)-(\d+|max).pickle' %el_selection #jet_dirs_key = 'JetFakeTemplateFitPlotsCorr(\d+)-(\d+)-(\d+)AsymIso' jet_dirs_key = 'JetSinglePhotonFakeNomIso' jet_dir_key_map = get_mapped_directory( base_dir_jet, jet_dirs_key ) jet_files_lead_eta = get_dirs_and_files( base_dir_jet, jet_dirs_key, file_key_lead_eta ) jet_files_lead_syst_eta = get_dirs_and_files( base_dir_jet, jet_dirs_key, file_key_lead_syst_eta ) jet_files_lead = get_dirs_and_files( base_dir_jet, jet_dirs_key, file_key_lead ) jet_files_lead_syst = get_dirs_and_files( base_dir_jet, jet_dirs_key, file_key_lead_syst ) update_jet_files_dict( jet_files_lead, jet_files_lead_eta ) update_jet_files_dict( jet_files_lead_syst, jet_files_lead_syst_eta ) print 'jet_files_lead' print jet_files_lead pt_bins_jetfile = [str(x) for x in _ptbins[:-1]] pt_bins_jetfile.append( 'max') pred_lead = get_jet_single_fake_results( jet_files_lead, jet_files_lead_syst, regions, pt_bins_jetfile, jet_dir_key_map, base_dir_jet, eta_bins=eta_bins) # get fake factors and binning from file ff_man_coarse = FakeFactorManager( '%s/%s/results.pickle' %(base_dir_ele, elffdir), ['fake_ratio'] ) #ff_man_coarse = FakeFactorManager( '%s/ElectronFakeFitsRatio/results.pickle' %base_dir_ele, ['fake_ratio'] ) #ff_man_coarse = FakeFactorManager( '%s/ElectronFakeFitsRatioTAndPMCTemplate/results.pickle' %base_dir_ele, ['fake_ratio'] ) #ff_man_coarse = FakeFactorManager( '%s/ElectronFakeManualWithOlap2/results.pickle' %base_dir_ele, ['fake_ratio'] ) # determine number of eta bins used # if only one eta bin is requested # per region, some different behavior occurrs eta_lens = [] for reg in regions : eta_lens.append( len(eta_bins[reg] ) ) eta_lens = list(set(eta_lens)) single_eta_bin = False if len(eta_lens) == 1 and eta_lens[0]==1 : single_eta_bin = True scaled_f = {} for r1 in regions : for idx, ptmin in enumerate(pt_bins_jetfile[:-1]) : ptmax = pt_bins_jetfile[idx+1] if r1 == 'EB' : ff_lead = ff_man_coarse.get_pt_eta_ff( ptmin, ptmax, 0.0, 1.44 ) if r1 == 'EE' : ff_lead = ff_man_coarse.get_pt_eta_ff( ptmin, ptmax, 1.57, 2.5 ) scaled_f[ (r1,ptmin,ptmax) ] = pred_lead['stat+syst']['f'][( r1,ptmin,ptmax)]*ff_lead if not single_eta_bin : for etamin, etamax in eta_bins[r1] : ff_lead = ff_man_coarse.get_pt_eta_ff( ptmin, ptmax, etamin, etamax) etabin = '%.2f-%.2f' %( etamin, etamax) scaled_f [(etabin, ptmin, ptmax) ] =pred_lead['stat+syst']['f'][( etabin,ptmin,ptmax)]*ff_lead for r1 in regions : for idx, ptmin in enumerate(pt_bins_jetfile[:-1]) : ptmax = pt_bins_jetfile[idx+1] print '%s, pt %s-%s' %( r1, ptmin, ptmax) print 'Pred f = %s, scaled f = %s' %( pred_lead['stat+syst']['f'][(r1,ptmin,ptmax)], scaled_f[(r1,ptmin,ptmax)] ) if not single_eta_bin : #if eta_bins : for etamin, etamax in eta_bins[r1] : etabin = '%.2f-%.2f' %( etamin, etamax) print '%s, pt %s-%s' %( etabin, ptmin, ptmax) print 'Pred f = %s, scaled f = %s' %( pred_lead['stat+syst']['f'][(etabin,ptmin,ptmax)], scaled_f[(etabin,ptmin,ptmax)] ) results_subtracted = {} results_subtracted['stat+syst'] = {} results_subtracted['stat+syst']['result'] = {} for reg_bin, val in results_nom['stat+syst']['result'].iteritems() : r1 = reg_bin[0] ptmin = reg_bin[1] ptmax = reg_bin[2] if reg_bin not in scaled_f : continue print 'Reg = %s, pt %s-%s, N Pix CR* ff = %s, N Jet Pix CR * ff = %s, pred = %s' %( r1, ptmin, ptmax, val, scaled_f[reg_bin], val- scaled_f[reg_bin] ) results_subtracted['stat+syst']['result'][reg_bin] = val-scaled_f[ reg_bin ] if not single_eta_bin : for r1 in regions : for etamin, etamax in eta_bins[r1] : etabin = '%.2f-%.2f' %( etamin, etamax) print 'Reg = %s, pt %s-%s, N Pix CR* ff = %s, N Jet Pix CR * ff = %s, pred = %s' %( etabin, ptmin, ptmax, val, scaled_f[(etabin, ptmin, ptmax)], val- scaled_f[(etabin, ptmin, ptmax)] ) results_subtracted['stat+syst']['result'][(etabin, ptmin, ptmax)] = val-scaled_f[ (etabin,ptmin,ptmax) ] if outputDir is not None : if not os.path.isdir( outputDir ) : os.makedirs( outputDir ) file_raw = open( outputDir + '/electron_fake_results%s__noJetFakeSubtraction.pickle' %el_selection, 'w' ) pickle.dump( results_nom, file_raw ) file_raw.close() file_sub = open( outputDir + '/electron_fake_results%s.pickle' %el_selection, 'w' ) pickle.dump( results_subtracted, file_sub ) file_sub.close()