def optimizeMetBinning(bkgSet, signalSet, name, minHt, maxHt): style.defaultStyle() bkgHist = bkgSet.getHist("tr/met_vs_emht") sigHist = signalSet.getHist("tr/met_vs_emht") lumiScale = 40.00 / 27.22 bkgHist.Scale(lumiScale) sigHist.Scale(lumiScale) minHtBin = bkgHist.GetYaxis().FindFixBin(minHt) maxHtBin = bkgHist.GetYaxis().FindFixBin(maxHt - 1e6) bkg1d = bkgHist.ProjectionX(aux.randomName(), minHtBin, maxHt) sig1d = sigHist.ProjectionX(aux.randomName(), minHtBin, maxHt) signifHist = sig1d.Clone(aux.randomName()) binning = [sig1d.GetNbinsX() + 2] while binning[-1] > 1: maxSig = 0 maxSigBin = 0 for bin in range(binning[-1], -1, -1): b = bkg1d.Integral(bin, binning[-1]) s = sig1d.Integral(bin, binning[-1]) signif = asimovSig(s, b) if signif > maxSig: maxSig = signif maxSigBin = bin if maxSigBin == binning[-1]: break binning.append(maxSigBin) binning = binning[-1:1:-1] print[sig1d.GetBinLowEdge(b) for b in binning]
def __init__( self, title, numerator, denominator, sysHisto=None ): # convcert TProfiles to histograms if isinstance( numerator, ROOT.TProfile ): numerator = convertToTH1( numerator ) if isinstance( denominator, ROOT.TProfile ): denominator = convertToTH1( denominator ) self.title = title self.numerator = numerator self.denominator = denominator self.sysHisto = sysHisto self.ratio = numerator.Clone( aux.randomName() ) self.ratioStat = denominator.Clone( aux.randomName() ) self.ratioSys = denominator.Clone( aux.randomName() ) self.totalUncert = denominator.Clone( aux.randomName() ) self.allowUnsymmetricYaxis = False
def __init__(self, title, numerator, denominator, sysHisto=None): # convcert TProfiles to histograms if isinstance(numerator, ROOT.TProfile): numerator = convertToTH1(numerator) if isinstance(denominator, ROOT.TProfile): denominator = convertToTH1(denominator) self.title = title self.numerator = numerator self.denominator = denominator.Clone(aux.randomName()) self.sysHisto = sysHisto self.ratio = numerator.Clone(aux.randomName()) self.ratioStat = denominator.Clone(aux.randomName()) self.ratioSys = sysHisto.Clone( aux.randomName()) if sysHisto else denominator.Clone( aux.randomName()) self.totalUncert = denominator.Clone(aux.randomName()) self.allowUnsymmetricYaxis = False self.ratio.drawOption_ = "e0" # Set ratio properties for hist in [ self.ratio, self.ratioSys, self.ratioStat, self.totalUncert ]: hist.GetYaxis().SetNdivisions(2, 5, 2) hist.SetTitleOffset(1.2, "Y") hist.SetYTitle(self.title) aux.drawOpt(self.totalUncert, "totUnc") aux.drawOpt(self.ratioSys, "sysUnc") aux.drawOpt(self.ratioStat, "statUnc")
def optimizeBinnigs2d(bkgSet, name, signalSet): style.style2d() bkgHist = bkgSet.getHist("tr/met_vs_emht") sigHist = signalSet.getHist("tr/met_vs_emht") lumiScale = 40.00 / 27.22 bkgHist.Scale(lumiScale) sigHist.Scale(lumiScale) xmax = 800 ymax = 4000 xmaxBin = bkgHist.GetXaxis().FindBin(xmax) ymaxBin = bkgHist.GetYaxis().FindBin(ymax) signifHist = sigHist.Clone(aux.randomName()) for xbin, ybin in aux.loopH(sigHist): if xbin > xmaxBin or ybin > ymaxBin: continue b = bkgHist.Integral(xbin, -1, ybin, -1) s = sigHist.Integral(xbin, -1, ybin, -1) signif = asimovSig(s, b) signifHist.SetBinContent(xbin, ybin, signif) signifHist.GetXaxis().SetRange(0, xmaxBin) signifHist.GetYaxis().SetRange(0, ymaxBin) signifHist.SetXTitle("minimum " + signifHist.GetXaxis().GetTitle()) signifHist.SetYTitle("minimum " + signifHist.GetYaxis().GetTitle()) signifHist.SetZTitle("Asimov significance") signifHist.Draw("colz") l = aux.Label(info=signalSet.label, drawAll=False) l.lum = ROOT.TLatex( .63, .95, "%.2f fb^{-1} (%s TeV)" % (aux.intLumi / 1000. * lumiScale, 13)) l.draw() aux.save("optimizeBinning2d_{}_{}".format(name, signalSet.names[0]), log=False)
def convertToTH1(profile): h = profile.ProjectionX(aux.randomName()) h.SetLineColor(profile.GetLineColor()) return h