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()