def buildRatioAndScaleIt(histoPrefix='', inputFile=None, scaleFactor=1.0, verbose=False) :
    ratioHisto = buildRatio(inputFile, histoPrefix)
    def lf2s(l) : return ', '.join(["%.3f"%e for e in l])
    if verbose: print ratioHisto.GetName()," before scaling: ",lf2s(getBinContents(ratioHisto))
    if   type(scaleFactor)==float : ratioHisto.Scale(scaleFactor)
    elif type(scaleFactor)==r.TH1F : ratioHisto.Multiply(scaleFactor)
    elif type(scaleFactor)==r.TH2F : ratioHisto.Multiply(scaleFactor)
    else : raise TypeError("unknown SF type %s, %s"%(type(scaleFactor), str(scaleFactor)))
    if verbose: print ratioHisto.GetName()," after scaling: ",lf2s(getBinContents(ratioHisto))
    return ratioHisto
def buildEtaSyst(inputFileTotMc, inputHistoBaseName='(elec|muon)_qcdMC_all', outputHistoName='', verbose=False) :
    """
    Take the eta distribution and normalize it to the average fake
    rate (taken from one bin rate); use the differences from 1 as the
    fractional uncertainty.
    """
    rate = buildRatio(inputFileTotMc, inputHistoBaseName+'_l_eta_coarse').Clone(outputHistoName)
    norm = buildRatio(inputFileTotMc, inputHistoBaseName+'_onebin').GetBinContent(1)
    rate.Scale(1.0/norm if norm else 1.0)
    bins = range(1, 1+rate.GetNbinsX())
    for b in bins : rate.AddBinContent(b, -1.0) # DG there must be a better way to do this
    scaleUpForward, fwFact, maxCentralEta = True, 2.0, 1.5
    if scaleUpForward :
        for b in bins :
            bCon, bCen = rate.GetBinContent(b), rate.GetBinCenter(b)
            rate.SetBinContent(b, bCon*(fwFact if abs(bCen)>maxCentralEta else 1.0))
    if inputHistoBaseName.startswith('mu') : rate.Reset() # mu consistent with 0.
    if verbose : print "eta syst ",inputHistoBaseName," : ",["%.2f"%rate.GetBinContent(b) for b in range(1, 1+rate.GetNbinsX())]
    return rate
def getRealEff(lepton='electron|muon', inputFile=None, scaleFactor=1.0) :
    histoName = lepton+'_realMC_all_l_pt_coarse'
    effHisto = buildRatio(inputFile, histoName)
    effHisto.Scale(scaleFactor)
    return effHisto