This is an old revision of the document!
import ROOT from ROOT import TFile, TTree, TCanvas, TGraph, TMultiGraph, TGraphErrors, TLegend import CMS_lumi, tdrstyle import subprocess # to execute shell command ROOT.gROOT.SetBatch(ROOT.kTRUE) # CMS style CMS_lumi.cmsText = "CMS" CMS_lumi.extraText = "Preliminary" CMS_lumi.cmsTextSize = 0.65 CMS_lumi.outOfFrame = True tdrstyle.setTDRStyle() # CREATE datacards def createDataCardsThetaB(labels,values): datacard_lines = [ "# automatic generated counting experiment", "imax 1 number of channels", "jmax 1 number of backgrounds", "kmax 2 number of nuisance parameters (sources of systematical uncertainties)", "------------", "bin 1", "observation 0", "------------", "bin 1 1 ", "process HH ttbar ", "process 0 1 ", "rate 107 52861 ", "------------", #"lumi lnN 1.10 1.10 luminosity", "xs_HH lnN 1.10 - cross section + signal efficiency + other minor ones", #"ttbar lnN - 1.02 ", ] # make datacards for differents values of theta_B for label, theta_B in zip(labels,values): datacard = open("datacard_"+label+".txt", 'w') for line in datacard_lines: datacard.write(line+"\n") theta_B_formatted = ("%.3f" % (1+theta_B/100)).rstrip('0').rstrip('.') # format datacard.write("ttbar lnN - %s " % theta_B_formatted) datacard.close() print ">>> datacard_"+label+".txt created" return labels # EXECUTE datacards def executeDataCards(labels): for label in labels: file_name = "datacard_"+label+".txt" combine_command = "combine -M Asymptotic -m 125 -n %s %s" % (label,file_name) print "" print ">>> " + combine_command p = subprocess.Popen(combine_command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) for line in p.stdout.readlines(): print line.rstrip("\n") print ">>> higgsCombine"+label+".Asymptotic.mH125.root created" retval = p.wait() # GET limits from root file def getLimits(file_name): file = TFile(file_name) tree = file.Get("limit") limits = [ ] for quantile in tree: limits.append(tree.limit) print ">>> %.2f" % limits[-1] return limits[:6] # PLOT upper limits def plotUpperLimits(labels,values): # see CMA plot guidelines: https://ghm.web.cern.ch/ghm/plots/ N = len(labels) yellow = TGraph(2*N) # yellow band green = TGraph(2*N) # green band median = TGraph(N) # median line up2s = [ ] for i in range(N): file_name = "higgsCombine"+labels[i]+"Asymptotic.mH125.root" limit = getLimits(file_name) up2s.append(limit[4]) yellow.SetPoint( i, values[i], limit[4] ) # + 2 sigma green.SetPoint( i, values[i], limit[3] ) # + 1 sigma median.SetPoint( i, values[i], limit[2] ) # median green.SetPoint( 2*N-1-i, values[i], limit[1] ) # - 1 sigma yellow.SetPoint( 2*N-1-i, values[i], limit[0] ) # - 2 sigma W = 800 H = 600 T = 0.08*H B = 0.12*H L = 0.12*W*scaleleftmargin R = 0.04*W*scalerightmargin c = TCanvas("c","c",100,100,W,H) c.SetFillColor(0) c.SetBorderMode(0) c.SetFrameFillStyle(0) c.SetFrameBorderMode(0) c.SetLeftMargin( L/W ) c.SetRightMargin( R/W ) c.SetTopMargin( T/H ) c.SetBottomMargin( B/H ) c.SetTickx(0) c.SetTicky(0) c.SetGrid() c.cd() frame = c.DrawFrame(1.4,0.001, 4.1, 10) frame.GetYaxis().CenterTitle() frame.GetYaxis().SetTitleSize(0.05) frame.GetXaxis().SetTitleSize(0.05) frame.GetXaxis().SetLabelSize(0.04) frame.GetYaxis().SetLabelSize(0.04) frame.GetYaxis().SetTitleOffset(0.9) frame.GetXaxis().SetNdivisions(508) frame.GetYaxis().CenterTitle(True) frame.GetYaxis().SetTitle("95% upper limit on #sigma / #sigma_{SM}") # frame.GetYaxis().SetTitle("95% upper limit on #sigma #times BR / (#sigma #times BR)_{SM}") frame.GetXaxis().SetTitle("background systematic uncertainty [%]") frame.SetMinimum(0) frame.SetMaximum(max(up2s)*1.05) frame.GetXaxis().SetLimits(min(values),max(values)) yellow.SetFillColor(ROOT.kOrange) yellow.SetLineColor(ROOT.kOrange) yellow.SetFillStyle(1001) yellow.Draw('F') green.SetFillColor(ROOT.kGreen+1) green.SetLineColor(ROOT.kGreen+1) green.SetFillStyle(1001) green.Draw('Fsame') median.SetLineColor(1) median.SetLineWidth(2) median.SetLineStyle(2) median.Draw('Lsame') CMS_lumi.CMS_lumi(c,14,11) ROOT.gPad.SetTicks(1,1) frame.Draw('sameaxis') x1 = 0.15 x2 = x1 + 0.24 y2 = 0.76 y1 = 0.60 legend = TLegend(x1,y1,x2,y2) legend.SetFillStyle(0) legend.SetBorderSize(0) legend.SetTextSize(0.041) legend.SetTextFont(42) legend.AddEntry(median, "Asymptotic CL_{s} expected",'L') legend.AddEntry(green, "#pm 1 std. deviation",'f') # legend.AddEntry(green, "Asymptotic CL_{s} #pm 1 std. deviation",'f') legend.AddEntry(yellow,"#pm 2 std. deviation",'f') # legend.AddEntry(green, "Asymptotic CL_{s} #pm 2 std. deviation",'f') legend.Draw() print " " c.SaveAs("UpperLimit.png") c.Close() # RANGE of floats def frange(start, stop, step): i = start while i <= stop: yield i i += step # MAIN def main(): labels = [ ] values = [ ] for theta_B in frange(0.0,5.0,1): values.append(theta_B) label = "%d" % (theta_B*10) labels.append(label) createDataCardsThetaB(labels,values) executeDataCards(labels) plotUpperLimits(labels,values) if __name__ == '__main__': main()
import ROOT as rt # CMS_lumi # Initiated by: Gautier Hamel de Monchenault (Saclay) # Translated in Python by: Joshua Hardenbrook (Princeton) # Updated by: Dinko Ferencek (Rutgers) # cmsText = "CMS"; cmsTextFont = 61 writeExtraText = True extraText = "Preliminary" extraTextFont = 52 lumiTextSize = 0.8 lumiTextOffset = 0.2 cmsTextSize = 0.85 cmsTextOffset = 0.1 relPosX = 0.045 relPosY = 0.035 relExtraDY = 1.2 extraOverCmsTextSize = 0.76 lumi_13TeV = "40.2 fb^{-1}" lumi_8TeV = "19.7 fb^{-1}" lumi_7TeV = "5.1 fb^{-1}" lumi_sqrtS = "" drawLogo = False def CMS_lumi(pad, iPeriod, iPosX ): outOfFrame = False if(iPosX/10==0 ): outOfFrame = True alignY_=3 alignX_=2 if( iPosX/10==0 ): alignX_=1 if( iPosX==0 ): alignY_=1 if( iPosX/10==1 ): alignX_=1 if( iPosX/10==2 ): alignX_=2 if( iPosX/10==3 ): alignX_=3 align_ = 10*alignX_ + alignY_ H = pad.GetWh() W = pad.GetWw() l = pad.GetLeftMargin() t = pad.GetTopMargin() r = pad.GetRightMargin() b = pad.GetBottomMargin() e = 0.025 pad.cd() lumiText = "" if( iPeriod==1 ): lumiText += lumi_7TeV lumiText += " (7 TeV)" elif ( iPeriod==2 ): lumiText += lumi_8TeV lumiText += " (8 TeV)" elif( iPeriod==3 ): lumiText = lumi_8TeV lumiText += " (8 TeV)" lumiText += " + " lumiText += lumi_7TeV lumiText += " (7 TeV)" elif ( iPeriod==4 ): lumiText += lumi_13TeV lumiText += " (13 TeV)" elif ( iPeriod==7 ): if( outOfFrame ):lumiText += "#scale[0.85]{" lumiText += lumi_13TeV lumiText += " (13 TeV)" lumiText += " + " lumiText += lumi_8TeV lumiText += " (8 TeV)" lumiText += " + " lumiText += lumi_7TeV lumiText += " (7 TeV)" if( outOfFrame): lumiText += "}" elif ( iPeriod==12 ): lumiText += "8 TeV" elif ( iPeriod==0 ): lumiText += lumi_sqrtS print lumiText latex = rt.TLatex() latex.SetNDC() latex.SetTextAngle(0) latex.SetTextColor(rt.kBlack) extraTextSize = extraOverCmsTextSize*cmsTextSize latex.SetTextFont(42) latex.SetTextAlign(31) latex.SetTextSize(lumiTextSize*t) latex.DrawLatex(1-r,1-t+lumiTextOffset*t,lumiText) if( outOfFrame ): latex.SetTextFont(cmsTextFont) latex.SetTextAlign(11) latex.SetTextSize(cmsTextSize*t) latex.DrawLatex(l,1-t+lumiTextOffset*t,cmsText) pad.cd() posX_ = 0 if( iPosX%10<=1 ): posX_ = l + relPosX*(1-l-r) elif( iPosX%10==2 ): posX_ = l + 0.5*(1-l-r) elif( iPosX%10==3 ): posX_ = 1-r - relPosX*(1-l-r) posY_ = 1-t - relPosY*(1-t-b) if( not outOfFrame ): if( drawLogo ): posX_ = l + 0.045*(1-l-r)*W/H posY_ = 1-t - 0.045*(1-t-b) xl_0 = posX_ yl_0 = posY_ - 0.15 xl_1 = posX_ + 0.15*H/W yl_1 = posY_ CMS_logo = rt.TASImage("CMS-BW-label.png") pad_logo = rt.TPad("logo","logo", xl_0, yl_0, xl_1, yl_1 ) pad_logo.Draw() pad_logo.cd() CMS_logo.Draw("X") pad_logo.Modified() pad.cd() else: latex.SetTextFont(cmsTextFont) latex.SetTextSize(cmsTextSize*t) latex.SetTextAlign(align_) latex.DrawLatex(posX_, posY_, cmsText) if( writeExtraText ) : latex.SetTextFont(extraTextFont) latex.SetTextAlign(align_) latex.SetTextSize(extraTextSize*t) latex.DrawLatex(posX_, posY_- relExtraDY*cmsTextSize*t, extraText) elif( writeExtraText ): if( iPosX==0): posX_ = l + relPosX*(1-l-r) posY_ = 1-t+lumiTextOffset*t latex.SetTextFont(extraTextFont) latex.SetTextSize(extraTextSize*t) latex.SetTextAlign(align_) latex.DrawLatex(posX_, posY_, extraText) pad.Update()