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