Esempio n. 1
0
def make_signal_fits( sampMan, sel_base, eta_cuts, plot_var, xvar, binning, workspace, suffix ) : 

    sampMan.clear_hists()

    for samp in sampMan.get_samples(isSignal=True ) :

        print 'Sample = ', samp.name


        res = re.match('(MadGraph|Pythia)ResonanceMass(\d+)_.*', samp.name )
        if res is None :
            print 'Could not interpret path ', samp.name
        else :

            mass = float(res.group(2))

            if samp.name.count( 'width0p01' ) :
                width = 0.0001
            else :
                res2 = re.match('(MadGraph|Pythia)ResonanceMass(\d+)_width(\d)', samp.name )
                width = float(res2.group(3))/100.

        if mass != 450 : 
            continue

        ph_selection_sr = '%s==1' %defs.get_phid_selection('all')
        ph_idx_sr =  defs.get_phid_idx( 'all' )
        print binning[mass]
        addtl_cuts_sr = 'ph_pt[%s] > 50  && %s > %f && %s < %f ' %(ph_idx_sr, plot_var, binning[mass][1], plot_var, binning[mass][2] )

        xvar.setBins(10000,'cache')
        xvar.setMin('cache',-100)
        xvar.setMax('cache',1500)

        for ieta in eta_cuts :

            full_suffix = '%s_%s_%s' %(samp.name, suffix, ieta)

            eta_str_sr = 'ph_Is%s[%s]' %( ieta, ph_idx_sr )

            full_sel_sr    = ' && '.join( [sel_base, ph_selection_sr, eta_str_sr, addtl_cuts_sr] )

            #hist_sr    = clone_sample_and_draw( sampMan, sampname, plot_var, full_sel_sr, binning )
            sampMan.create_hist( samp, plot_var, full_sel_sr, binning[mass] ) 

            hist_sr = samp.hist

            integral = hist_sr.Integral()

            #hist_sr.Scale( 1.0/integral )

            #datahist = ROOT.RooDataHist( 'srhist_%s' %full_suffix, 'srhist', ROOT.RooArgList(xvar), hist_sr)

            #histpdf = ROOT.RooHistPdf( 'srhistpdf_%s' %(full_suffix), 'srhistpdf' , ROOT.RooArgSet( xvar), datahist, 3 )

            fit_max = mass*1.1
            fit_min = mass/1.8
            if mass >= 1000 :
                fit_max = mass*1.05
                fit_min = mass*0.7

            xvar.setMin( fit_min )
            xvar.setMax( fit_max )


            fitManager = FitManager( 'bwxcb', 0, hist_sr, plot_var, ieta, xvar, full_suffix, True, 
                                    sample_params={'mass' : mass, 'width' : width}, )

            fit_distribution( fitManager)
            #save_fit( fitManager, sampMan, workspace, stats_pos='left' )

            iter_managers = []
            iter_managers.append( fitManager )

            saved_result = False
            for i in range( 0, 4 ) :
            #for i in [0.5, 0.3, 0.2, 0.1, 0.05] :

                print 'GOTHERE1'
                iter_managers.append(FitManager( 'bwxcb', 0, hist_sr, plot_var, ieta, xvar, full_suffix, True, 
                                        sample_params={'mass' : mass, 'width' : width}, ))

                print 'GOTHERE2'
                cv_sigma = iter_managers[-2].cb_sigma.getValV()
                lo_sigma = iter_managers[-2].cb_sigma.getErrorLo()
                hi_sigma = iter_managers[-2].cb_sigma.getErrorHi()
                cv_power = iter_managers[-2].cb_power.getValV()
                lo_power = iter_managers[-2].cb_power.getErrorLo()
                hi_power = iter_managers[-2].cb_power.getErrorHi()
                cv_mass  = iter_managers[-2].cb_mass.getValV()
                lo_mass  = iter_managers[-2].cb_mass.getErrorLo()
                hi_mass  = iter_managers[-2].cb_mass.getErrorHi()

                err_sigma = hi_sigma/cv_sigma
                err_power = hi_power/cv_power
                err_mass = hi_mass/cv_mass

                #new_lim_sigma = ( cv_sigma, cv_sigma*(1-i), cv_sigma*(1+i)) 
                #new_lim_power = ( cv_power, cv_power*(1-i), cv_power*(1+i) ) 
                #new_lim_mass  = ( cv_mass, cv_mass*(1-i), cv_mass*(1+i)    ) 

                new_lim_sigma = ( cv_sigma, cv_sigma+lo_sigma, cv_sigma+hi_sigma) 
                new_lim_power = ( cv_power, cv_power+lo_power, cv_power+hi_power ) 
                new_lim_mass  = ( cv_mass,  cv_mass+lo_mass, cv_mass+hi_mass    ) 

                #if cv_sigma < 0 :
                #    new_lim_sigma = ( new_lim_sigma[0], new_lim_sigma[2], new_lim_sigma[1]) 
                #if cv_power < 0 :
                #    new_lim_power = ( new_lim_power[0], new_lim_power[2], new_lim_power[1]) 
                #if cv_mass < 0 :
                #    new_lim_mass = ( new_lim_mass[0], new_lim_mass[2], new_lim_mass[1] ) 

                print 'NEW DEFAULTS'
                print new_lim_sigma
                print new_lim_power
                print new_lim_mass

                iter_managers[-1].set_vals('cb_sigma', mass, new_lim_sigma )
                iter_managers[-1].set_vals('cb_power', mass, new_lim_power )
                iter_managers[-1].set_vals('cb_mass',  mass, new_lim_mass  )

                print 'GOTHERE3'
                fit_distribution( iter_managers[-1] )
                print 'GOTHERE4'

                cv_sigma_new = iter_managers[-1].cb_sigma.getValV()
                lo_sigma_new = iter_managers[-1].cb_sigma.getErrorLo()
                hi_sigma_new = iter_managers[-1].cb_sigma.getErrorHi()
                cv_power_new = iter_managers[-1].cb_power.getValV()
                lo_power_new = iter_managers[-1].cb_power.getErrorLo()
                hi_power_new = iter_managers[-1].cb_power.getErrorHi()
                cv_mass_new  = iter_managers[-1].cb_mass.getValV()
                lo_mass_new  = iter_managers[-1].cb_mass.getErrorLo()
                hi_mass_new  = iter_managers[-1].cb_mass.getErrorHi()

                err_sigma_new = hi_sigma_new/cv_sigma_new
                err_power_new = hi_power_new/cv_power_new
                err_mass_new = hi_mass_new/cv_mass_new

                print 'Sigma : Previous error = %f, new error = %f' %( err_sigma, err_sigma_new )
                print 'Power : Previous error = %f, new error = %f' %( err_power, err_power_new )
                print 'Mass : Previous error = %f, new error = %f' %( err_mass, err_mass_new )

                print 'GOTHERE5'
                # if we get worse results with the new fit, then use the previous one
                if math.fabs(err_sigma_new) > math.fabs(err_sigma) or math.fabs(err_power_new) > math.fabs(err_power) or math.fabs(err_mass_new) > math.fabs(err_mass) :
                    print 'GOTHERE6'
                    save_fit( iter_managers[-2], sampMan, workspace, stats_pos='left' )
                    print 'GOTHERE7'
                    saved_result = True
                    break

            # if we haven't saved the fit yet, then the best
            # version is the latest
            if not saved_result :
                print 'GOTHERE8'
                save_fit( iter_managers[-1], sampMan, workspace, stats_pos='left' )
                print 'GOTHERE9'
Esempio n. 2
0
def make_wjets_fit( sampMan, sample, sel_base, eta_cut, plot_var, shape_var, num_var, binning, xvar, suffix='', closure=False, workspace=None) :

    ph_selection_sr = '%s==1' %defs.get_phid_selection('medium')
    ph_selection_den = '%s==1'%defs.get_phid_selection( num_var, shape_var )

    ph_selection_num = '%s==1' %defs.get_phid_selection( num_var )
    ph_selection_shape = '%s==1' %defs.get_phid_selection( shape_var )

    ph_idx_sr =  defs.get_phid_idx( 'medium' )
    ph_idx_den = defs.get_phid_idx( num_var, shape_var )
    ph_idx_num = defs.get_phid_idx( num_var )
    ph_idx_shape = defs.get_phid_idx( shape_var )

    xmin = xvar.getMin()
    xmax = xvar.getMax()

    addtl_cuts_sr = 'ph_pt[%s] > 50 && %s > %d && %s < %d '     %( ph_idx_sr, plot_var, xmin, plot_var, xmax )
    addtl_cuts_den = 'ph_pt[%s] > 50 && %s > %d && %s < %d  '   %( ph_idx_den, plot_var, xmin, plot_var, xmax )
    addtl_cuts_num = 'ph_pt[%s] > 50 && %s > %d && %s < %d  '   %( ph_idx_num, plot_var, xmin, plot_var, xmax )
    addtl_cuts_shape = 'ph_pt[%s] > 50 && %s > %d && %s < %d  ' %( ph_idx_shape, plot_var, xmin, plot_var, xmax )

    cut_var_shape = defs.get_phid_cut_var( shape_var )
    cut_var_num = defs.get_phid_cut_var( num_var )

    eta_str_shape = 'ph_Is%s[%s]' %( eta_cut, ph_idx_shape )
    eta_str_den = 'ph_Is%s[%s]' %( eta_cut, ph_idx_den)
    eta_str_num = 'ph_Is%s[%s]' %( eta_cut, ph_idx_num )
    eta_str_sr = 'ph_Is%s[%s]' %( eta_cut, ph_idx_sr )

    cut_vals_shape = get_cut_defaults( shape_var, eta_cut )
    cut_vals_num = get_cut_defaults( num_var, eta_cut )

    cut_str_base = ' {var}[{idx}] > {val_low} && {var}[{idx}] < {val_high}'

    cut_str_shape = cut_str_base.format(var=cut_var_shape, idx=ph_idx_shape, val_low=cut_vals_shape[0], val_high=cut_vals_shape[1] )
    cut_str_num = cut_str_base.format(var=cut_var_num, idx=ph_idx_num, val_low=cut_vals_num[0], val_high=cut_vals_num[1] )

    cut_str_den_1 = cut_str_base.format(var=cut_var_shape, idx=ph_idx_den, val_low=cut_vals_shape[0], val_high=cut_vals_shape[1] )
    cut_str_den_2 = cut_str_base.format(var=cut_var_num, idx=ph_idx_den, val_low=cut_vals_num[0], val_high=cut_vals_num[1] )

    cut_str_den = cut_str_den_1 + ' && ' + cut_str_den_2

    full_sel_shape = ' && '.join( [sel_base, ph_selection_shape, eta_str_shape, addtl_cuts_shape, cut_str_shape ] )
    full_sel_num   = ' && '.join( [sel_base, ph_selection_num, eta_str_num, addtl_cuts_num, cut_str_num] )
    full_sel_den   = ' && '.join( [sel_base, ph_selection_den, eta_str_den, addtl_cuts_den, cut_str_den] )
    full_sel_sr    = ' && '.join( [sel_base, ph_selection_sr, eta_str_sr, addtl_cuts_sr] )

    label_shape = 'shape_%s' %suffix
    label_num   = 'num_%s' %suffix
    label_den   = 'den_%s' %suffix
    label_sr    = 'sr_%s' %suffix

    if workspace is None :
        ws = ROOT.RooWorkspace( 'ws') 
    else :
        ws = workspace

    hist_shape = clone_sample_and_draw( sampMan, sample, plot_var, full_sel_shape, binning )
    result_shape= fit_distribution( 'dijet', 2, hist_shape, xvar, label_shape  , sampMan, ws  )
    hist_num   = clone_sample_and_draw( sampMan, sample, plot_var, full_sel_num  , binning )
    result_num = fit_distribution(  'dijet', 2, hist_num, xvar, label_num , sampMan, ws )
    hist_den   = clone_sample_and_draw( sampMan, sample, plot_var, full_sel_den  , binning )
    result_den = fit_distribution( 'dijet', 2,  hist_den, xvar, label_den , sampMan, ws )

    _integral_num =  ws.pdf( 'dijet_%s' %label_num ).getNormIntegral(ROOT.RooArgSet( xvar ) )
    func_integral_num  = _integral_num.getValV()
    _integral_den =  ws.pdf( 'dijet_%s' %label_den).getNormIntegral(ROOT.RooArgSet( xvar ) )
    func_integral_den  = _integral_den.getValV()
    _integral_shape =  ws.pdf( 'dijet_%s' %label_shape).getNormIntegral(ROOT.RooArgSet( xvar ) )
    func_integral_shape  = _integral_shape.getValV()

    hist_integral_num = result_num['integral'].n
    hist_integral_den = result_den['integral'].n
    hist_integral_shape = result_shape['integral'].n

    norm_num = hist_integral_num / func_integral_num
    norm_den = hist_integral_den / func_integral_den
    norm_shape = hist_integral_shape / func_integral_shape

    print 'func integral Num = ', func_integral_num
    print 'hist integral Num = ', hist_integral_num
    print 'normalization Num = ', norm_num

    print 'func integral Den = ', func_integral_den
    print 'hist integral Den = ', hist_integral_den
    print 'normalization Den = ', norm_den

    print 'func integral Shape = ', func_integral_shape
    print 'hist integral Shape = ', hist_integral_shape
    print 'normalization Shape = ', norm_shape

    power_pred_name    = 'power_pred_%s' %suffix
    logcoef_pred_name  = 'logcoef_pred_%s' %suffix
    #power_ratio_name   = 'power_ratio_%s' %suffix
    #logcoef_ratio_name = 'logcoef_ratio_%s' %suffix


    val_power_num   = ws.var( 'power_dijet_%s' %label_num   )
    val_power_den   = ws.var( 'power_dijet_%s' %label_den   )
    val_power_shape = ws.var( 'power_dijet_%s' %label_shape )

    val_logcoef_num   = ws.var( 'logcoef_dijet_%s' %label_num   )
    val_logcoef_den   = ws.var( 'logcoef_dijet_%s' %label_den   )
    val_logcoef_shape = ws.var( 'logcoef_dijet_%s' %label_shape )

    power_pred    = ROOT.RooRealVar( power_pred_name   , 'power'  , (val_power_num.getValV() + val_power_shape.getValV() - val_power_den.getValV()) , -100, 100)
    logcoef_pred  = ROOT.RooRealVar( logcoef_pred_name , 'logcoef', (val_logcoef_num.getValV() + val_logcoef_shape.getValV() - val_logcoef_den.getValV()), -10, 10 )
    #power_ratio   = ROOT.RooRealVar( power_ratio_name  , 'power'  , val_power_num - val_power_den , -100, 100)
    #logcoef_ratio = ROOT.RooRealVar( logcoef_ratio_name, 'logcoef', val_logcoef_num - val_logcoef_den, -10, 10 )

    can_ratio = ROOT.TCanvas( str(uuid.uuid4()), '' )

    func = 'TMath::Power(@0/13000, @1+@2*TMath::Log10(@0/13000))'  
    prediction = ROOT.RooGenericPdf('dijet_prediction_%s' %suffix , 'prediction', func, ROOT.RooArgList(xvar,power_pred, logcoef_pred))
    norm_pred = ROOT.RooRealVar( 'dijet_prediction_%s_norm' %(suffix), 'prediction normalization', (hist_integral_shape * hist_integral_num) / hist_integral_den )
    getattr( ws , 'import' ) ( norm_pred )
    getattr( ws , 'import' ) ( prediction )

    ratio_func = ROOT.TF1( 'ratio_func', '( [2]*TMath::Power(x/13000, [0] + [1]*TMath::Log10(x/13000) ) ) ', xmin, xmax )

    ratio_func.SetParameter(0, result_num['power'].n - result_den['power'].n)
    ratio_func.SetParameter(1, result_num['logcoef'].n  - result_den['logcoef'].n )
    ratio_func.SetParameter(2, norm_num / norm_den )

    ratiohist = hist_num.Clone( 'closure_ratio_%s' %(suffix) )
    ratiohist.Divide( hist_den )
    ratiohist.SetMarkerStyle(20)
    ratiohist.SetMarkerSize(1)
    ratiohist.GetXaxis().SetTitle( 'Transverse Mass [GeV]' )
    ratiohist.GetYaxis().SetTitle( 'ratio of passing to failing %s' %shape_var )
    ratiohist.Draw()
    ratiohist.SetStats(0)

    ratio_func.Draw('same')

    ratio_power_v = val_power_num.getValV() - val_power_den.getValV()
    ratio_power_e = math.sqrt(val_power_num.getErrorHi()*val_power_num.getErrorHi() + val_power_den.getErrorHi()*val_power_den.getErrorHi() )
    ratio_logcoef_v = val_logcoef_num.getValV() - val_logcoef_den.getValV()
    ratio_logcoef_e = math.sqrt(val_logcoef_num.getErrorHi()*val_logcoef_num.getErrorHi() + val_logcoef_den.getErrorHi()*val_logcoef_den.getErrorHi() )

    power_tex   = ROOT.TLatex(0, 0, 'power = %.01f #pm %.02f' %( ratio_power_v,  ratio_power_e ))
    logcoef_tex = ROOT.TLatex(0, 0, 'logcoef = %.01f #pm %.02f' %( ratio_logcoef_v,  ratio_logcoef_e ))

    power_tex.SetNDC()
    logcoef_tex.SetNDC()

    power_tex  .SetX( 0.6 )
    power_tex  .SetY( 0.84 )
    logcoef_tex.SetX( 0.6 )
    logcoef_tex.SetY( 0.78 )

    power_tex.Draw()
    logcoef_tex.Draw()

    if closure :
        sampMan.outputs['wjetsclosure_ratio_%s' %suffix] = can_ratio 
    else :
        sampMan.outputs['wjets_ratio_%s' %suffix] = can_ratio 
    
    if closure :

        hist_sr    = clone_sample_and_draw( sampMan, sample, plot_var, full_sel_sr   , binning )
        result_sr  = fit_distribution( 'dijet', 2, hist_sr, xvar, label_sr, sampMan, ws )

        can_sr = ROOT.TCanvas( str(uuid.uuid4()), '' )

        pred_val = (hist_integral_shape * hist_integral_num) / hist_integral_den 

        tot_sr = hist_sr.Integral( hist_sr.FindBin( xmin ), hist_sr.FindBin( xmax ) )
        print 'SR integral = ', tot_sr
        sr_func = ROOT.TF1( 'sr_func', '( [2]*TMath::Power(x/13000, [0] + [1]*TMath::Log10(x/13000) ) ) ', xmin, xmax )
        sr_func.SetParameter(0, result_num['power'].n + result_shape['power'].n - result_den['power'].n )
        sr_func.SetParameter(1, result_num['logcoef'].n + result_shape['logcoef'].n - result_den['logcoef'].n )
        sr_func.SetParameter(2, 1 )
        sr_int = sr_func.Integral( xmin, xmax )
        print 'Normalization = ',(norm_shape*norm_num) / norm_den
        print 'func Integral SR Before = ', sr_func.Integral( xmin, xmax )
        sr_func.SetParameter(2, pred_val/sr_int )

        hist_sr.Draw()
        sr_func.Draw('same')

        sampMan.outputs['wjetsclosure_pred_%s' %suffix] = can_sr


        tot_ratio = result_num['integral']/result_den['integral']
Esempio n. 3
0
def make_wjets_fit( sampMan, sample, sel_base, eta_cut, plot_var, shape_var, num_var, binning, xvar, suffix='', closure=False, workspace=None) :

    #---------------------------------------
    # Get the base selection for each region
    #---------------------------------------
    ph_selection_sr    = '%s==1' %defs.get_phid_selection('medium')
    ph_selection_den   = '%s==1'%defs.get_phid_selection( num_var, shape_var )
    ph_selection_num   = '%s==1' %defs.get_phid_selection( num_var )
    ph_selection_shape = '%s==1' %defs.get_phid_selection( shape_var )
    #ph_selection_ABCD  = '%s==1' %defs.get_phid_selection('all')

    ph_idx_sr =  defs.get_phid_idx( 'medium' )
    ph_idx_den = defs.get_phid_idx( num_var, shape_var )
    ph_idx_num = defs.get_phid_idx( num_var )
    ph_idx_shape = defs.get_phid_idx( shape_var )
    #ph_idx_ABCD = defs.get_phid_idx('all')

    xmin = xvar.getMin()
    xmax = xvar.getMax()

    #---------------------------------------
    # Add eta cuts, (IsEB, IsEE)
    #---------------------------------------
    eta_str_shape = 'ph_Is%s[%s]' %( eta_cut, ph_idx_shape )
    eta_str_den = 'ph_Is%s[%s]' %( eta_cut, ph_idx_den)
    eta_str_num = 'ph_Is%s[%s]' %( eta_cut, ph_idx_num )
    eta_str_sr = 'ph_Is%s[%s]' %( eta_cut, ph_idx_sr )
    #eta_str_ABCD = 'ph_Is%s[%s]' %( eta_cut, ph_idx_ABCD )

    #---------------------------------------
    # Add additional cuts, mainly restricting
    # the fitted variable to the plotting limits
    #---------------------------------------
    addtl_cuts_sr = 'ph_pt[%s] > 50 && %s > %d && %s < %d '     %( ph_idx_sr, plot_var, xmin, plot_var, xmax )
    addtl_cuts_den = 'ph_pt[%s] > 50 && %s > %d && %s < %d  '   %( ph_idx_den, plot_var, xmin, plot_var, xmax )
    addtl_cuts_num = 'ph_pt[%s] > 50 && %s > %d && %s < %d  '   %( ph_idx_num, plot_var, xmin, plot_var, xmax )
    addtl_cuts_shape = 'ph_pt[%s] > 50 && %s > %d && %s < %d  ' %( ph_idx_shape, plot_var, xmin, plot_var, xmax )
    #addtl_cuts_ABCD = 'ph_pt[%s] > 50 && %s > %d && %s < %d  ' %( ph_idx_ABCD, plot_var, xmin, plot_var, xmax )


    #---------------------------------------
    # Get the cuts that define the photon
    # sideband regions
    #---------------------------------------
    cut_str_base = ' {var}[{idx}] > {val_low} && {var}[{idx}] < {val_high}'

    cut_var_shape = defs.get_phid_cut_var( shape_var )
    cut_var_num = defs.get_phid_cut_var( num_var )

    cut_vals_shape = get_cut_defaults( shape_var, eta_cut )
    cut_vals_num = get_cut_defaults( num_var, eta_cut )

    cut_str_shape = cut_str_base.format(var=cut_var_shape, idx=ph_idx_shape, val_low=cut_vals_shape[0], val_high=cut_vals_shape[1] )
    cut_str_num = cut_str_base.format(var=cut_var_num, idx=ph_idx_num, val_low=cut_vals_num[0], val_high=cut_vals_num[1] )

    cut_str_den_1 = cut_str_base.format(var=cut_var_shape, idx=ph_idx_den, val_low=cut_vals_shape[0], val_high=cut_vals_shape[1] )
    cut_str_den_2 = cut_str_base.format(var=cut_var_num, idx=ph_idx_den, val_low=cut_vals_num[0], val_high=cut_vals_num[1] )

    cut_str_den = cut_str_den_1 + ' && ' + cut_str_den_2

    #---------------------------------------
    # put the cuts together
    #---------------------------------------
    full_sel_shape = ' && '.join( [sel_base, ph_selection_shape, eta_str_shape, addtl_cuts_shape, cut_str_shape ] )
    full_sel_num   = ' && '.join( [sel_base, ph_selection_num, eta_str_num, addtl_cuts_num, cut_str_num] )
    full_sel_den   = ' && '.join( [sel_base, ph_selection_den, eta_str_den, addtl_cuts_den, cut_str_den] )
    full_sel_sr    = ' && '.join( [sel_base, ph_selection_sr, eta_str_sr, addtl_cuts_sr] )
    #full_sel_ABCD  = ' && '.join( [sel_base, ph_selection_ABCD, eta_str_ABCD, addtl_cuts_ABCD] )

    label_shape = 'shape_%s_%s' %(sample,suffix)
    label_num   = 'num_%s_%s' %(sample,suffix)
    label_den   = 'den_%s_%s' %(sample,suffix)
    label_sr    = 'sr_%s_%s' %(sample,suffix)

    if workspace is None :
        ws = ROOT.RooWorkspace( 'ws') 
    else :
        ws = workspace

    jet_var = 'leadjet_pt' # 0 to 640 in bins of 5
    jet_binning = (128,0.,640.)
    subjet_var = 'subljet_pt' # 0 to 380 in bins of 3.8
    subjet_binning = (100,0.,380.)
    ht_var = 'trueht' # 0 to 7000 in bins of 50
    ht_binning = (140,0.,7000.)

    ABCD_var = 'ph_sigmaIEIE:ph_chIsoCorr'
    ABCD_binning = (120,0.,12.,50,0.,0.05)

    #chIsovar   = 'ph_chIso'
    #sigIEIEvar = 'ph_sigmaIEIE'

    chIso_B_var     = 'ph_chIsoCorr[ptSorted_ph_mediumNoChIso_idx[0]]'
    sigIEIE_B_var = 'ph_sigmaIEIE[ptSorted_ph_mediumNoChIso_idx[0]]'
    chIso_C_var     = 'ph_chIsoCorr[ptSorted_ph_mediumNoSIEIE_idx[0]]'
    sigIEIE_C_var = 'ph_sigmaIEIE[ptSorted_ph_mediumNoSIEIE_idx[0]]'
    chIso_D_var     = 'ph_chIsoCorr[ptSorted_ph_mediumNoSIEIENoChIso_idx[0]]'
    sigIEIE_D_var = 'ph_sigmaIEIE[ptSorted_ph_mediumNoSIEIENoChIso_idx[0]]'

    twoD_B_var = 'ph_sigmaIEIE[ptSorted_ph_mediumNoChIso_idx[0]]:ph_chIsoCorr[ptSorted_ph_mediumNoChIso_idx[0]]'
    twoD_C_var = 'ph_sigmaIEIE[ptSorted_ph_mediumNoSIEIE_idx[0]]:ph_chIsoCorr[ptSorted_ph_mediumNoSIEIE_idx[0]]'
    twoD_D_var = 'ph_sigmaIEIE[ptSorted_ph_mediumNoSIEIENoChIso_idx[0]]:ph_chIsoCorr[ptSorted_ph_mediumNoSIEIENoChIso_idx[0]]'

    sigIEIE_binning = (50,0.,0.05)
    chIso_binning = (120,0.,12.)

    #---------------------------------------
    # draw the histograms
    #---------------------------------------
    hist_shape = clone_sample_and_draw( sampMan, sample, plot_var, full_sel_shape, binning )
    hist_num   = clone_sample_and_draw( sampMan, sample, plot_var, full_sel_num  , binning )
    hist_den   = clone_sample_and_draw( sampMan, sample, plot_var, full_sel_den  , binning )
    sampMan.outputs['%s_shapehist_%s' %(sample,suffix)] = hist_shape
    sampMan.outputs['%s_numhist_%s' %(sample,suffix)] = hist_num
    sampMan.outputs['%s_denhist_%s' %(sample,suffix)] = hist_den



    #hist_ABCD  = clone_sample_and_draw( sampMan, sample, ABCD_var, full_sel_ABCD, ABCD_binning )
    hist_B     = clone_sample_and_draw( sampMan, sample, twoD_B_var, full_sel_shape, ABCD_binning )
    hist_C     = clone_sample_and_draw( sampMan, sample, twoD_C_var, full_sel_num, ABCD_binning )
    hist_D     = clone_sample_and_draw( sampMan, sample, twoD_D_var, full_sel_den, ABCD_binning )

    hist_1d_sigmaIEIE_B  = clone_sample_and_draw( sampMan, sample, sigIEIE_B_var, full_sel_shape, sigIEIE_binning )
    hist_1d_chIso_B  = clone_sample_and_draw( sampMan, sample, chIso_B_var, full_sel_shape, chIso_binning )
    hist_1d_sigmaIEIE_C  = clone_sample_and_draw( sampMan, sample, sigIEIE_C_var, full_sel_num, sigIEIE_binning )
    hist_1d_chIso_C  = clone_sample_and_draw( sampMan, sample, chIso_C_var, full_sel_num, chIso_binning )
    hist_1d_sigmaIEIE_D  = clone_sample_and_draw( sampMan, sample, sigIEIE_D_var, full_sel_den, sigIEIE_binning )
    hist_1d_chIso_D  = clone_sample_and_draw( sampMan, sample, chIso_D_var, full_sel_den, chIso_binning )

    sampMan.outputs['%s_sigmaIEIE_B_%s' %(sample,suffix)] = hist_1d_sigmaIEIE_B
    sampMan.outputs['%s_sigmaIEIE_C_%s' %(sample,suffix)] = hist_1d_sigmaIEIE_C
    sampMan.outputs['%s_sigmaIEIE_D_%s' %(sample,suffix)] = hist_1d_sigmaIEIE_D
    sampMan.outputs['%s_chIso_B_%s' %(sample,suffix)] = hist_1d_chIso_B
    sampMan.outputs['%s_chIso_C_%s' %(sample,suffix)] = hist_1d_chIso_C
    sampMan.outputs['%s_chIso_D_%s' %(sample,suffix)] = hist_1d_chIso_D


    #---------------------------------------
    # make fit managers
    #---------------------------------------
    fitMan_shape = FitManager( 'dijet', 3, '%s_shape' %sample, hist_shape, plot_var, eta_cut, xvar, label_shape, useRooFit=False )
    fitMan_num   = FitManager( 'dijet', 3, '%s_num' %sample, hist_num, plot_var, eta_cut, xvar, label_num, useRooFit=False )
    fitMan_den   = FitManager( 'dijet', 3, '%s_den' %sample, hist_den, plot_var, eta_cut, xvar, label_den, useRooFit=False )

    #---------------------------------------
    # Do the fits
    #---------------------------------------
    result_shape= fitMan_shape.fit_histogram( ws )
    result_num = fitMan_num.fit_histogram( ws )
    result_den = fitMan_den.fit_histogram( ws )
    print 'DEBUG: results of fit manager (shape, num, den): ',result_shape,result_num,result_den

    #---------------------------------------
    # save the results
    #---------------------------------------
    fitMan_den.save_fit( sampMan, ws, logy=True )
    fitMan_shape.save_fit( sampMan, ws, logy=True )
    fitMan_num.save_fit( sampMan, ws, logy=True )

    #---------------------------------------
    # calculate the function that describes
    # the ratio of num/den
    #---------------------------------------
    _integral_num   =  ws.pdf( 'dijet_%s' %label_num ).getNormIntegral(ROOT.RooArgSet( xvar ) )
    _integral_den   =  ws.pdf( 'dijet_%s' %label_den).getNormIntegral(ROOT.RooArgSet( xvar ) )
    _integral_shape =  ws.pdf( 'dijet_%s' %label_shape).getNormIntegral(ROOT.RooArgSet( xvar ) )

    func_integral_num    = _integral_num.getValV()
    func_integral_den    = _integral_den.getValV()
    func_integral_shape  = _integral_shape.getValV()

    hist_integral_num = result_num['integral'].n
    hist_integral_den = result_den['integral'].n
    hist_integral_shape = result_shape['integral'].n

    norm_num = hist_integral_num / func_integral_num
    norm_den = hist_integral_den / func_integral_den
    norm_shape = hist_integral_shape / func_integral_shape

    print 'func integral Num = ', func_integral_num
    print 'hist integral Num = ', hist_integral_num
    print 'normalization Num = ', norm_num

    print 'func integral Den = ', func_integral_den
    print 'hist integral Den = ', hist_integral_den
    print 'normalization Den = ', norm_den

    print 'func integral Shape = ', func_integral_shape
    print 'hist integral Shape = ', hist_integral_shape
    print 'normalization Shape = ', norm_shape

    power_pred_name    = 'power_pred_%s' %suffix
    logcoef_pred_name  = 'logcoef_pred_%s' %suffix
    log2coef_pred_name  = 'log2coef_pred_%s' %suffix
    power_ratio_name   = 'power_ratio_%s' %suffix
    logcoef_ratio_name = 'logcoef_ratio_%s' %suffix


    #name_power_num     ='power' 
    #name_power_den     ='power' 
    #name_power_shape   ='power' 

    #name_logcoef_num   ='logcoef1' 
    #name_logcoef_den   ='logcoef1' 
    #name_logcoef_shape ='logcoef1' 

    name_power_num     ='dijet_order1_%s' %label_num  
    name_power_den     ='dijet_order1_%s' %label_den  
    name_power_shape   ='dijet_order1_%s' %label_shape

    name_logcoef_num   ='dijet_order2_%s' %label_num  
    name_logcoef_den   ='dijet_order2_%s' %label_den  
    name_logcoef_shape ='dijet_order2_%s' %label_shape

    name_log2coef_num   ='dijet_order3_%s' %label_num  
    name_log2coef_den   ='dijet_order3_%s' %label_den  
    name_log2coef_shape ='dijet_order3_%s' %label_shape


    val_power_num     = ws.var( name_power_num      )
    val_power_den     = ws.var( name_power_den      )
    val_power_shape   = ws.var( name_power_shape    )

    val_logcoef_num   = ws.var( name_logcoef_num    )
    val_logcoef_den   = ws.var( name_logcoef_den    )
    val_logcoef_shape = ws.var( name_logcoef_shape  )

    val_log2coef_num   = ws.var( name_log2coef_num    )
    val_log2coef_den   = ws.var( name_log2coef_den    )
    val_log2coef_shape = ws.var( name_log2coef_shape  )


    power_pred    = ROOT.RooRealVar( power_pred_name   , 'power'  , (val_power_num.getValV() + val_power_shape.getValV() - val_power_den.getValV()) , -100, 100)
    logcoef_pred  = ROOT.RooRealVar( logcoef_pred_name , 'logcoef', (val_logcoef_num.getValV() + val_logcoef_shape.getValV() - val_logcoef_den.getValV()), -10, 10 )
    log2coef_pred  = ROOT.RooRealVar( log2coef_pred_name , 'log2coef', (val_log2coef_num.getValV() + val_log2coef_shape.getValV() - val_log2coef_den.getValV()), -10, 10 )
    #power_ratio   = ROOT.RooRealVar( power_ratio_name  , 'power'  , val_power_num - val_power_den , -100, 100)
    #logcoef_ratio = ROOT.RooRealVar( logcoef_ratio_name, 'logcoef', val_logcoef_num - val_logcoef_den, -10, 10 )


    #func = 'TMath::Power(@0/13000, @1+@2*TMath::Log10(@0/13000))'  
    #prediction = ROOT.RooGenericPdf('dijet_prediction_%s' %suffix , 'prediction', func, ROOT.RooArgList(xvar,power_pred, logcoef_pred))
    func = 'TMath::Power(@0/13000, @1+@2*TMath::Log10(@0/13000)+@3*TMath::Log10(@0/13000)*TMath::Log10(@0/13000))'  
    prediction = ROOT.RooGenericPdf('dijet_prediction_%s' %suffix , 'prediction', func, ROOT.RooArgList(xvar,power_pred, logcoef_pred, log2coef_pred))
    norm_pred = ROOT.RooRealVar( 'dijet_prediction_%s_norm' %(suffix), 'prediction normalization', (hist_integral_shape * hist_integral_num) / hist_integral_den )
    getattr( ws , 'import' ) ( norm_pred )
    getattr( ws , 'import' ) ( prediction )


    #---------------------------------------
    # Save the ABCD plots
    #---------------------------------------

    #can_ABCD = ROOT.TCanvas( str(uuid.uuid4()), '' )
    #can_ABCD.SetLogz()
    #hist_ABCD.Scale(1./hist_ABCD.Integral())
    #hist_ABCD.Draw("colz")
    #print "DEBUG: ABCD integral = ",hist_ABCD.Integral()

    can_B = ROOT.TCanvas( str(uuid.uuid4()), '' )
    can_B.SetLogz()
    hist_B.Scale(1./hist_B.Integral())
    hist_B.Draw("colz")
    print "DEBUG: B integral = ",hist_B.Integral()

    can_C = ROOT.TCanvas( str(uuid.uuid4()), '' )
    hist_C.Scale(1./hist_C.Integral())
    can_C.SetLogz()
    hist_C.Draw("colz")
    print "DEBUG: C integral = ",hist_C.Integral()

    can_D = ROOT.TCanvas( str(uuid.uuid4()), '' )
    hist_D.Scale(1./hist_D.Integral())
    can_D.SetLogz()
    hist_D.Draw("colz")
    print "DEBUG: D integral = ",hist_D.Integral()

    can_1d_sig_B = ROOT.TCanvas( str(uuid.uuid4()), '' )
    can_1d_sig_B.SetLogy()
    hist_1d_sigmaIEIE_B.Draw('l')
    can_1d_iso_B = ROOT.TCanvas( str(uuid.uuid4()), '' )
    can_1d_iso_B.SetLogy()
    hist_1d_chIso_B.Draw('l')

    can_1d_sig_C = ROOT.TCanvas( str(uuid.uuid4()), '' )
    can_1d_sig_C.SetLogy()
    hist_1d_sigmaIEIE_C.Draw('l')
    can_1d_iso_C = ROOT.TCanvas( str(uuid.uuid4()), '' )
    can_1d_iso_C.SetLogy()
    hist_1d_chIso_C.Draw('l')

    can_1d_sig_D = ROOT.TCanvas( str(uuid.uuid4()), '' )
    can_1d_sig_D.SetLogy()
    hist_1d_sigmaIEIE_D.Draw('l')
    can_1d_iso_D = ROOT.TCanvas( str(uuid.uuid4()), '' )
    can_1d_iso_D.SetLogy()
    hist_1d_chIso_D.Draw('l')

    #plot sigmaIEIE in regions B, C, D
    can_1d_sig = ROOT.TCanvas( str(uuid.uuid4()), '' )
    can_1d_sig.SetLogy()

    hist_norm_1d_sigmaIEIE_B = ROOT.TH1F(str(uuid.uuid4()) , str(uuid.uuid4()), hist_1d_sigmaIEIE_B.GetNbinsX(), hist_1d_sigmaIEIE_B.GetXaxis().GetXmin(), hist_1d_sigmaIEIE_B.GetXaxis().GetXmax())
    hist_norm_1d_sigmaIEIE_C = ROOT.TH1F(str(uuid.uuid4()) , str(uuid.uuid4()), hist_1d_sigmaIEIE_C.GetNbinsX(), hist_1d_sigmaIEIE_C.GetXaxis().GetXmin(), hist_1d_sigmaIEIE_C.GetXaxis().GetXmax())
    hist_norm_1d_sigmaIEIE_D = ROOT.TH1F(str(uuid.uuid4()) , str(uuid.uuid4()), hist_1d_sigmaIEIE_D.GetNbinsX(), hist_1d_sigmaIEIE_D.GetXaxis().GetXmin(), hist_1d_sigmaIEIE_D.GetXaxis().GetXmax())

    hist_1d_sigmaIEIE_B.Copy(hist_norm_1d_sigmaIEIE_B)
    hist_1d_sigmaIEIE_C.Copy(hist_norm_1d_sigmaIEIE_C)
    hist_1d_sigmaIEIE_D.Copy(hist_norm_1d_sigmaIEIE_D)
    ROOT.SetOwnership( hist_norm_1d_sigmaIEIE_B, False )
    ROOT.SetOwnership( hist_norm_1d_sigmaIEIE_C, False )
    ROOT.SetOwnership( hist_norm_1d_sigmaIEIE_D, False )

    hist_norm_1d_sigmaIEIE_B.Scale(1./hist_norm_1d_sigmaIEIE_B.Integral())
    hist_norm_1d_sigmaIEIE_C.Scale(1./hist_norm_1d_sigmaIEIE_C.Integral())
    hist_norm_1d_sigmaIEIE_D.Scale(1./hist_norm_1d_sigmaIEIE_D.Integral())
    hist_norm_1d_sigmaIEIE_B.SetLineColor(2)
    hist_norm_1d_sigmaIEIE_C.SetLineColor(1)
    hist_norm_1d_sigmaIEIE_D.SetLineColor(4)
    hist_norm_1d_sigmaIEIE_B.SetMarkerColor(2)
    hist_norm_1d_sigmaIEIE_C.SetMarkerColor(1)
    hist_norm_1d_sigmaIEIE_D.SetMarkerColor(4)
    hist_norm_1d_sigmaIEIE_B.Draw('l')
    hist_norm_1d_sigmaIEIE_C.Draw('same')
    hist_norm_1d_sigmaIEIE_D.Draw('same')

    #plot chIso in regions B, C, D
    can_1d_iso = ROOT.TCanvas( str(uuid.uuid4()), '' )
    can_1d_iso.SetLogy()

    hist_norm_1d_chIso_B = ROOT.TH1F(str(uuid.uuid4()) , str(uuid.uuid4()), hist_1d_chIso_B.GetNbinsX(), hist_1d_chIso_B.GetXaxis().GetXmin(), hist_1d_chIso_B.GetXaxis().GetXmax())
    hist_norm_1d_chIso_C = ROOT.TH1F(str(uuid.uuid4()) , str(uuid.uuid4()), hist_1d_chIso_C.GetNbinsX(), hist_1d_chIso_C.GetXaxis().GetXmin(), hist_1d_chIso_C.GetXaxis().GetXmax())
    hist_norm_1d_chIso_D = ROOT.TH1F(str(uuid.uuid4()) , str(uuid.uuid4()), hist_1d_chIso_D.GetNbinsX(), hist_1d_chIso_D.GetXaxis().GetXmin(), hist_1d_chIso_D.GetXaxis().GetXmax())

    hist_1d_chIso_B.Copy(hist_norm_1d_chIso_B)
    hist_1d_chIso_C.Copy(hist_norm_1d_chIso_C)
    hist_1d_chIso_D.Copy(hist_norm_1d_chIso_D)
    ROOT.SetOwnership( hist_norm_1d_chIso_B, False )
    ROOT.SetOwnership( hist_norm_1d_chIso_C, False )
    ROOT.SetOwnership( hist_norm_1d_chIso_D, False )

    hist_norm_1d_chIso_B.Scale(1./hist_norm_1d_chIso_B.Integral())
    hist_norm_1d_chIso_C.Scale(1./hist_norm_1d_chIso_C.Integral())
    hist_norm_1d_chIso_D.Scale(1./hist_norm_1d_chIso_D.Integral())
    hist_norm_1d_chIso_B.SetLineColor(2)
    hist_norm_1d_chIso_C.SetLineColor(1)
    hist_norm_1d_chIso_D.SetLineColor(4)
    hist_norm_1d_chIso_B.SetMarkerColor(2)
    hist_norm_1d_chIso_C.SetMarkerColor(1)
    hist_norm_1d_chIso_D.SetMarkerColor(4)
    hist_norm_1d_chIso_C.Draw('l')
    hist_norm_1d_chIso_B.Draw('same')
    hist_norm_1d_chIso_D.Draw('same')


    #---------------------------------------
    # Save the ratio histogram
    #---------------------------------------

    # canvas for ratio histogram
    can_ratio = ROOT.TCanvas( 'canv_ratio_%s' %(plot_var), 'canv_ratio_%s' %(plot_var) )
    #ROOT.SetOwnership( can_ratio, False )

    # ratio histogram = numerator histogram/denominator histogram
    ratiohist = ROOT.TH1F( 'ratio_%s' %(plot_var), 'ratio_%s' %(plot_var), hist_num.GetNbinsX(), hist_num.GetXaxis().GetXmin(), hist_num.GetXaxis().GetXmax())
    hist_num.Copy( ratiohist)
    ROOT.SetOwnership( ratiohist, False )

    print "DEBUG: first bin of num before div = ",ratiohist.GetBinContent(1)
    print "DEBUG: first bin of den before div = ",hist_den.GetBinContent(1)

    ratiohist.Divide( hist_den )
    print "DEBUG: first bin of ratio after div = ",ratiohist.GetBinContent(1)

    ratiohist.SetMarkerStyle(20)
    ratiohist.SetMarkerSize(1)
    ratiohist.GetXaxis().SetTitle( 'Transverse Mass [GeV]' )
    ratiohist.GetYaxis().SetTitle( 'ratio of passing to failing %s' %shape_var )
    ratiohist.Draw()
    ratiohist.SetStats(0)
    ratiohist.SetMinimum( 0) 
    ratiohist.SetMaximum( 5) 

    #ratio_func = ROOT.TF1( 'ratio_func_%s'%(str(uuid.uuid4())), '( [2]*TMath::Power(x/13000, [0] + [1]*TMath::Log10(x/13000) ) ) ', xmin, xmax )
    ratio_func = ROOT.TF1( 'ratio_func', '[0]', xmin, xmax )
    print 'DEBUG: ratio function = ',ratio_func
    ROOT.SetOwnership( ratio_func, False )
    print 'DEBUG: ratio function value at 200 GeV = ',ratio_func.Eval(200.)
    print 'DEBUG: ratio of integrals = ',hist_num.Integral()/hist_den.Integral()
    ratio_func.SetParameter(0, hist_num.Integral()/hist_den.Integral())
    #ratio_func.SetParameter(0, result_num[name_power_num].n - result_den[name_power_den].n)
    #ratio_func.SetParameter(1, result_num[name_logcoef_num].n  - result_den[name_logcoef_den].n )
    #ratio_func.SetParameter(2, norm_num / norm_den )
    ratiohist.Fit("ratio_func","RL","",xmin,xmax)
    print 'xmin and xmax are ',xmin,xmax
    f = ratiohist.GetFunction("ratio_func")
    fitvalue = ratio_func.GetParameter(0)
    print 'DEBUG: fitted straight line at ',fitvalue
    print 'DEBUG: chisquare of fit = ',f.GetChisquare()
    print 'DEBUG: ndof of fit = ',f.GetNDF()
    print 'DEBUG: testing f->GetParameter(0) = ',f.GetParameter(0)
    print 'DEBUG: testing f->GetParError(0) = ',f.GetParError(0)
    ratio_func.Draw('same')

    print 'DEBUG: prediction in A from B*C/D histograms = ',hist_shape.Integral(hist_shape.FindBin( xmin ), hist_shape.FindBin( xmax ))*hist_num.Integral(hist_num.FindBin( xmin ), hist_num.FindBin( xmax ))/hist_den.Integral(hist_den.FindBin( xmin ), hist_den.FindBin( xmax ))

    #ratio_power_v = val_power_num.getValV() - val_power_den.getValV()
    #ratio_power_e = math.sqrt(val_power_num.getErrorHi()*val_power_num.getErrorHi() + val_power_den.getErrorHi()*val_power_den.getErrorHi() )
    #ratio_logcoef_v = val_logcoef_num.getValV() - val_logcoef_den.getValV()
    #ratio_logcoef_e = math.sqrt(val_logcoef_num.getErrorHi()*val_logcoef_num.getErrorHi() + val_logcoef_den.getErrorHi()*val_logcoef_den.getErrorHi() )

    #power_tex   = ROOT.TLatex(0, 0, 'power = %.01f #pm %.02f' %( ratio_power_v,  ratio_power_e ))
    #ROOT.SetOwnership( power_tex, False )
    #logcoef_tex = ROOT.TLatex(0, 0, 'logcoef = %.01f #pm %.02f' %( ratio_logcoef_v,  ratio_logcoef_e ))
    #ROOT.SetOwnership( logcoef_tex, False )

    #power_tex.SetNDC()
    #logcoef_tex.SetNDC()

    #power_tex  .SetX( 0.6 )
    #power_tex  .SetY( 0.84 )
    #logcoef_tex.SetX( 0.6 )
    #logcoef_tex.SetY( 0.78 )

    #power_tex.Draw('same')
    #logcoef_tex.Draw('same')

    #sampMan.outputs['wjets_ABCD_%s' %suffix] = can_ABCD
    sampMan.outputs['%s_B_%s' %(sample,suffix)] = can_B
    sampMan.outputs['%s_C_%s' %(sample,suffix)] = can_C
    sampMan.outputs['%s_D_%s' %(sample,suffix)] = can_D

    sampMan.outputs['%s_sigmaIEIE_B_%s' %(sample,suffix)] = can_1d_sig_B
    sampMan.outputs['%s_chIso_B_%s' %(sample,suffix)] = can_1d_iso_B
    sampMan.outputs['%s_sigmaIEIE_C_%s' %(sample,suffix)] = can_1d_sig_C
    sampMan.outputs['%s_chIso_C_%s' %(sample,suffix)] = can_1d_iso_C
    sampMan.outputs['%s_sigmaIEIE_D_%s' %(sample,suffix)] = can_1d_sig_D
    sampMan.outputs['%s_chIso_D_%s' %(sample,suffix)] = can_1d_iso_D
    sampMan.outputs['%s_sigmaIEIE_BCD_%s' %(sample,suffix)] = can_1d_sig
    sampMan.outputs['%s_chIso_BCD_%s' %(sample,suffix)] = can_1d_iso


    if closure :
 #       sampMan.outputs['wjetsclosure_ratio_%s' %suffix] = can_ratio 
        sampMan.outputs['%sclosure_ratio_hist_%s' %(sample,suffix)] = ratiohist 
        sampMan.outputs['%sclosure_ratio_func_%s' %(sample,suffix)] = ratio_func
        #sampMan.outputs['wjetsclosure_ratio_power_%s' %suffix] = power_tex
        #sampMan.outputs['wjetsclosure_ratio_logcoef_%s' %suffix] = logcoef_tex

    else :
 #       sampMan.outputs['wjets_ratio_%s' %suffix] = can_ratio 
        sampMan.outputs['%s_ratio_hist_%s' %(sample,suffix)] = ratiohist 
        sampMan.outputs['%s_ratio_func_%s' %(sample,suffix)] = ratio_func 
        #sampMan.outputs['wjets_ratio_power_%s' %suffix] = power_tex
        #sampMan.outputs['wjets_ratio_logcoef_%s' %suffix] = logcoef_tex
    
    if closure :

        # canvas for signal region predictions
        can_sr = ROOT.TCanvas( 'canv_sig_%s_%s' %(sample,plot_var), 'canv_sig_%s_%s' %(sample,plot_var) )
        ROOT.SetOwnership( can_sr, False )

        hist_sr    = clone_sample_and_draw( sampMan, sample, plot_var, full_sel_sr , binning )
        ROOT.SetOwnership( hist_sr, False )
        hist_sr.GetXaxis().SetTitle( 'Transverse Mass [GeV]' )
        #hist_sr.GetYaxis().SetTitle( 'ratio of passing to failing %s' %shape_var ) ##really?
        hist_sr.GetYaxis().SetTitle( 'Events in signal region' )

        # fit a dijet2 function to region A
        fitMan_sr = FitManager( 'dijet', 3, sample, hist_sr, plot_var, eta_cut, xvar, suffix, useRooFit=False )
        result_sr  = fitMan_sr.fit_histogram( ws )

        # from histograms in MC regions B, C, and D
        # predicted number of sr events
        pred_val = (hist_integral_shape * hist_integral_num) / hist_integral_den 

        # from histogram in MC region A
        # predicted number of sr events
        tot_sr = hist_sr.Integral( hist_sr.FindBin( xmin ), hist_sr.FindBin( xmax ) )
        print 'DEBUG: SR prediction from BCD MC = ',pred_val
        print 'DEBUG: SR MC events from A       = ',tot_sr
        print 'SR integral = ', tot_sr

        # from functions fitted to regions BCD
        # predicted number of sr events
        sr_func = ROOT.TF1( 'sr_func', '( [2]*TMath::Power(x/13000, [0] + [1]*TMath::Log10(x/13000) ) ) ', xmin, xmax )
        #sr_func = ROOT.TF1( 'sr_func', '[3]*TMath::Power(x/13000, [0]+[1]*TMath::Log10(x/13000)+[2]*TMath::Log10(x/13000)*TMath::Log10(x/13000))', xmin, xmax )

        ROOT.SetOwnership( sr_func, False )
        sr_func.SetParameter(0, result_num[name_power_num].n + result_shape[name_power_shape].n - result_den[name_power_den].n )
        sr_func.SetParameter(1, result_num[name_logcoef_num].n + result_shape[name_logcoef_shape].n - result_den[name_logcoef_den].n )
        #sr_func.SetParameter(2, result_num[name_log2coef_num].n + result_shape[name_log2coef_shape].n - result_den[name_log2coef_den].n  )
        sr_func.SetParameter(2, 1)
        sr_int = sr_func.Integral( xmin, xmax )
        print 'normalizations (shape, num, den) = ',norm_shape,norm_num,norm_den
        #print 'Normalization = ',(norm_shape*norm_num) / norm_den
        print 'func Integral SR Before = ', sr_func.Integral( xmin, xmax )
        sr_func.SetParameter(2, pred_val/sr_int )
        print 'func Integral SR After = ', sr_func.Integral( xmin, xmax )
        print 'DEBUG: closure SR fit function value at 200 GeV = ',sr_func.Eval(200.)
        hist_sr.Draw()
        sr_func.Draw('same')

        sampMan.outputs['%sclosure_sr_pred_%s' %(sample,suffix)] = can_sr
        sampMan.outputs['%sclosure_srhist_%s' %(sample,suffix)] = hist_sr

        tot_ratio = result_num['integral']/result_den['integral']
        print 'DEBUG: result_num[integral]/result_den[integral] = ',tot_ratio

        hist_jetpt        = clone_sample_and_draw( sampMan, sample, jet_var, sel_base, jet_binning )
        hist_subjetpt     = clone_sample_and_draw( sampMan, sample, subjet_var, sel_base, subjet_binning )
        hist_trueht       = clone_sample_and_draw( sampMan, sample, ht_var, sel_base, ht_binning )

        sampMan.outputs['%sclosure_jetpt_%s' %(sample,suffix)] = hist_jetpt
        sampMan.outputs['%sclosure_subjetpt_%s' %(sample,suffix)] = hist_subjetpt
        sampMan.outputs['%sclosure_trueht_%s' %(sample,suffix)] = hist_trueht