ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/VHbb/python/tree_stack.py
Revision: 1.30
Committed: Tue Oct 16 12:28:03 2012 UTC (12 years, 7 months ago) by nmohr
Content type: text/x-python
Branch: MAIN
CVS Tags: hcpPreApp
Changes since 1.29: +27 -3 lines
Log Message:
Overwrite default binning

File Contents

# Content
1 #!/usr/bin/env python
2 from samplesclass import sample
3 from printcolor import printc
4 import pickle
5 import ROOT
6 from ROOT import TFile, TTree
7 import ROOT
8 from array import array
9 from BetterConfigParser import BetterConfigParser
10 import sys, os
11 from mvainfos import mvainfo
12 #from gethistofromtree import getHistoFromTree, orderandadd
13 from Ratio import getRatio
14 from optparse import OptionParser
15 from HistoMaker import HistoMaker, orderandadd
16 import TdrStyles
17 from copy import deepcopy
18
19 #CONFIGURE
20 argv = sys.argv
21 parser = OptionParser()
22 parser.add_option("-P", "--path", dest="path", default="",
23 help="path to samples")
24 parser.add_option("-R", "--reg", dest="region", default="",
25 help="region to plot")
26 parser.add_option("-C", "--config", dest="config", default=[], action="append",
27 help="configuration file")
28 (opts, args) = parser.parse_args(argv)
29 if opts.config =="":
30 opts.config = "config"
31 print opts.config
32 config = BetterConfigParser()
33 config.read(opts.config)
34 anaTag = config.get("Analysis","tag")
35
36
37 path = opts.path
38 region = opts.region
39
40 plotConfig = BetterConfigParser()
41 plotConfig.read('vhbbPlotDef.ini')
42
43 #get locations:
44 Wdir=config.get('Directories','Wdir')
45 samplesinfo=config.get('Directories','samplesinfo')
46
47 section='Plot:%s'%region
48
49 Normalize = eval(config.get(section,'Normalize'))
50 logPlot = eval(config.get(section,'log'))
51 blind = eval(config.get(section,'blind'))
52 rebin = 1
53 nBinsCfg = False
54 minCfg = False
55 maxCfg = False
56 if config.has_option(section,'rebin'):
57 rebin = eval(config.get(section,'rebin'))
58 if config.has_option(section,'nBins'):
59 nBinsCfg = eval(config.get(section,'nBins'))
60 if config.has_option(section,'min'):
61 minCfg = eval(config.get(section,'min'))
62 if config.has_option(section,'max'):
63 maxCfg = eval(config.get(section,'max'))
64
65 infofile = open(samplesinfo,'r')
66 info = pickle.load(infofile)
67 infofile.close()
68
69 #options = plot.split(',')
70
71 mass = config.get(section,'Signal')
72
73 vars = (config.get(section, 'vars')).split(',')
74
75 names = [plotConfig.get('plotDef:%s'%x,'relPath') for x in vars]
76 xAxis = [plotConfig.get('plotDef:%s'%x,'xAxis') for x in vars]
77 nBins = []
78 xMin = []
79 xMax = []
80 log = []
81 for x in vars:
82 if logPlot:
83 log.append(True)
84 elif plotConfig.has_option('plotDef:%s'%x,'log'):
85 log.append(eval(plotConfig.get('plotDef:%s'%x,'log')))
86 else:
87 log.append(False)
88 if nBinsCfg:
89 nBins.append(nBinsCfg)
90 else:
91 nBins.append(int(eval(plotConfig.get('plotDef:%s'%x,'nBins'))/rebin))
92 if minCfg:
93 xMin.append(minCfg)
94 else:
95 xMin.append(eval(plotConfig.get('plotDef:%s'%x,'min')))
96 if maxCfg:
97 xMax.append(maxCfg)
98 else:
99 xMax.append(eval(plotConfig.get('plotDef:%s'%x,'max')))
100
101 for p in range(0,len(names)):
102 if '<mass>' in names[p]:
103 newp= names[p].replace('<mass>',mass)
104 names[p]=newp
105 print names[p]
106
107 if 'ZLight' in region or 'TTbar' in region or 'Zbb' in region: SignalRegion = False
108 else:
109 SignalRegion = True
110 print 'You are in the Signal Region!'
111
112 data = config.get(section,'Datas')
113 if config.has_option(section, 'Datacut'):
114 datacut=config.get(section, 'Datacut')
115 else:
116 datacut = region
117
118 options=[]
119
120 if blind: blindopt='blind'
121 else: blindopt = 'noblind'
122
123 for i in range(0,len(vars)):
124 options.append([names[i],'',xAxis[i],nBins[i],xMin[i],xMax[i],'%s_%s.pdf'%(region,vars[i]),region,datacut,mass,data,blindopt])
125
126
127 setup=config.get('Plot_general','setup')
128 if logPlot:
129 setup=config.get('Plot_general','setupLog')
130 setup=setup.split(',')
131
132 samples=config.get('Plot_general','samples')
133 samples=samples.split(',')
134
135 colorDict=eval(config.get('Plot_general','colorDict'))
136 typLegendDict=eval(config.get('Plot_general','typLegendDict'))
137 #color=color.split(',')
138
139
140 weightF=config.get('Weights','weightF')
141 Group = eval(config.get('Plot_general','Group'))
142
143
144 #GETALL AT ONCE
145
146 Plotter=HistoMaker(path,config,region,options)
147
148 #print '\nProducing Plot of %s\n'%vars[v]
149 Lhistos = [[] for _ in range(0,len(vars))]
150 Ltyps = [[] for _ in range(0,len(vars))]
151 Ldatas = [[] for _ in range(0,len(vars))]
152 Ldatatyps = [[] for _ in range(0,len(vars))]
153 Ldatanames = [[] for _ in range(0,len(vars))]
154
155 def myText(txt="CMS Preliminary",ndcX=0,ndcY=0,size=0.8):
156 ROOT.gPad.Update()
157 text = ROOT.TLatex()
158 text.SetNDC()
159 text.SetTextColor(ROOT.kBlack)
160 text.SetTextSize(text.GetTextSize()*size)
161 text.DrawLatex(ndcX,ndcY,txt)
162 return text
163
164
165 #Find out Lumi:
166 lumicounter=0.
167 lumi=0.
168 for job in info:
169 if job.name in data:
170 lumi+=float(job.lumi)
171 lumicounter+=1.
172
173 if lumicounter > 0:
174 lumi=lumi/lumicounter
175
176 Plotter.lumi=lumi
177
178 for job in info:
179 if eval(job.active):
180 if job.subsamples:
181 for subsample in range(0,len(job.subnames)):
182
183 if job.subnames[subsample] in samples:
184 hTempList, typList = Plotter.getHistoFromTree(job,subsample)
185 for v in range(0,len(vars)):
186 Lhistos[v].append(hTempList[v])
187 Ltyps[v].append(Group[job.subnames[subsample]])
188 print job.subnames[subsample]
189
190 else:
191 if job.name in samples:
192 if job.name == mass:
193 print job.name
194 hTempList, typList = Plotter.getHistoFromTree(job)
195 for v in range(0,len(vars)):
196 if SignalRegion:
197 Lhistos[v].append(hTempList[v])
198 Ltyps[v].append(Group[job.name])
199 Overlaylist= deepcopy(hTempList)
200
201 else:
202 print job.name
203 hTempList, typList = Plotter.getHistoFromTree(job)
204 for v in range(0,len(vars)):
205 Lhistos[v].append(hTempList[v])
206 Ltyps[v].append(Group[job.name])
207
208 elif job.name in data:
209 #print 'DATA'
210 hTemp, typ = Plotter.getHistoFromTree(job)
211 for v in range(0,len(vars)):
212 Ldatas[v].append(hTemp[v])
213 Ldatatyps[v].append(typ[v])
214 Ldatanames[v].append(job.name)
215
216 if not SignalRegion: setup.remove('ZH')
217
218 print setup
219
220 for v in range(0,len(vars)):
221
222 histos = Lhistos[v]
223 typs = Ltyps[v]
224 datas = Ldatas[v]
225 datatyps = Ldatatyps[v]
226 datanames= Ldatanames[v]
227
228 Overlay = Overlaylist[v]
229
230 TdrStyles.tdrStyle()
231
232 c = ROOT.TCanvas(vars[v],'', 600, 600)
233 c.SetFillStyle(4000)
234 c.SetFrameFillStyle(1000)
235 c.SetFrameFillColor(0)
236
237 oben = ROOT.TPad('oben','oben',0,0.3 ,1.0,1.0)
238 oben.SetBottomMargin(0)
239 oben.SetFillStyle(4000)
240 oben.SetFrameFillStyle(1000)
241 oben.SetFrameFillColor(0)
242 unten = ROOT.TPad('unten','unten',0,0.0,1.0,0.3)
243 unten.SetTopMargin(0.)
244 unten.SetBottomMargin(0.35)
245 unten.SetFillStyle(4000)
246 unten.SetFrameFillStyle(1000)
247 unten.SetFrameFillColor(0)
248
249 oben.Draw()
250 unten.Draw()
251
252 oben.cd()
253
254
255
256 allStack = ROOT.THStack(vars[v],'')
257 l = ROOT.TLegend(0.63, 0.60,0.92,0.92)
258 l.SetLineWidth(2)
259 l.SetBorderSize(0)
260 l.SetFillColor(0)
261 l.SetFillStyle(4000)
262 l.SetTextFont(62)
263 l.SetTextSize(0.035)
264 MC_integral=0
265 MC_entries=0
266
267 for histo in histos:
268 MC_integral+=histo.Integral()
269 #MC_entries+=histo.GetEntries()
270 print "\033[1;32m\n\tMC integral = %s\033[1;m"%MC_integral
271
272 #ORDER AND ADD TOGETHER
273 #print typs
274 #print setup
275 histos, typs = orderandadd(histos,typs,setup)
276
277
278 k=len(histos)
279
280 for j in range(0,k):
281 #print histos[j].GetBinContent(1)
282 i=k-j-1
283 histos[i].SetFillColor(int(colorDict[setup[i]]))
284 histos[i].SetLineColor(1)
285 allStack.Add(histos[i])
286
287 d1 = ROOT.TH1F('noData','noData',nBins[v],xMin[v],xMax[v])
288 datatitle='Data'
289 addFlag = ''
290 if 'Zee' in datanames and 'Zmm' in datanames:
291 addFlag = 'Z(l^{-}l^{+})H(b#bar{b})'
292 elif 'Zee' in datanames:
293 addFlag = 'Z(e^{-}e^{+})H(b#bar{b})'
294 elif 'Zmm' in datanames:
295 addFlag = 'Z(#mu^{-}#mu^{+})H(b#bar{b})'
296 for i in range(0,len(datas)):
297 d1.Add(datas[i],1)
298 print "\033[1;32m\n\tDATA integral = %s\033[1;m"%d1.Integral()
299 flow = d1.GetEntries()-d1.Integral()
300 if flow > 0:
301 print "\033[1;31m\tU/O flow: %s\033[1;m"%flow
302
303 Overlay.SetLineColor(2)
304 Overlay.SetLineWidth(2)
305 Overlay.SetFillColor(0)
306 Overlay.SetFillStyle(4000)
307 Overlay.SetNameTitle('Overlay','Overlay')
308
309 l.AddEntry(d1,datatitle,'P')
310 for j in range(0,k):
311 l.AddEntry(histos[j],typLegendDict[typs[j]],'F')
312 l.AddEntry(Overlay,typLegendDict['Overlay'],'L')
313
314 if Normalize:
315 if MC_integral != 0: stackscale=d1.Integral()/MC_integral
316 Overlay.Scale(stackscale)
317 stackhists=allStack.GetHists()
318 for blabla in stackhists:
319 if MC_integral != 0: blabla.Scale(stackscale)
320
321 allMC=allStack.GetStack().Last().Clone()
322
323 allStack.SetTitle()
324 allStack.Draw("hist")
325 allStack.GetXaxis().SetTitle('')
326 yTitle = 'Entries'
327 if not '/' in yTitle:
328 yAppend = '%s' %(allStack.GetXaxis().GetBinWidth(1))
329 yTitle = '%s / %s' %(yTitle, yAppend)
330 allStack.GetYaxis().SetTitle(yTitle)
331 allStack.GetXaxis().SetRangeUser(xMin[v],xMax[v])
332 allStack.GetYaxis().SetRangeUser(0,20000)
333 theErrorGraph = ROOT.TGraphErrors(allMC)
334 theErrorGraph.SetFillColor(ROOT.kGray+3)
335 theErrorGraph.SetFillStyle(3013)
336 theErrorGraph.Draw('SAME2')
337 l.AddEntry(theErrorGraph,"MC uncert. (stat.)","fl")
338 Ymax = max(allStack.GetMaximum(),d1.GetMaximum())*1.7
339 if log[v]:
340 allStack.SetMinimum(0.05)
341 Ymax = Ymax*ROOT.TMath.Power(10,1.6*(ROOT.TMath.Log(1.6*(Ymax/0.1))/ROOT.TMath.Log(10)))*(0.6*0.1)
342 ROOT.gPad.SetLogy()
343 allStack.SetMaximum(Ymax)
344 c.Update()
345 ROOT.gPad.SetTicks(1,1)
346 #allStack.Draw("hist")
347 d1.Draw("E,same")
348 l.SetFillColor(0)
349 l.SetBorderSize(0)
350 l.Draw()
351
352 Overlay.Draw('hist,same')
353
354 tPrel = myText("CMS Preliminary",0.17,0.88,1.04)
355 tLumi = myText("#sqrt{s} = %s, L = %s fb^{-1}"%(anaTag,(float(lumi)/1000.)),0.17,0.83)
356 tAddFlag = myText(addFlag,0.17,0.78)
357
358 unten.cd()
359 ROOT.gPad.SetTicks(1,1)
360
361 ratio, error = getRatio(d1,allMC,xMin[v],xMax[v])
362 ksScore = d1.KolmogorovTest( allMC )
363 chiScore = d1.Chi2Test( allMC , "UWCHI2/NDF")
364 print ksScore
365 print chiScore
366 ratio.SetStats(0)
367 ratio.GetXaxis().SetTitle(xAxis[v])
368 ratioError = ROOT.TGraphErrors(error)
369 ratioError.SetFillColor(ROOT.kGray+3)
370 ratioError.SetFillStyle(3013)
371 ratio.Draw("E1")
372 ratioError.Draw('SAME2')
373 ratio.Draw("E1SAME")
374 ratio.SetTitle("")
375 m_one_line = ROOT.TLine(xMin[v],1,xMax[v],1)
376 m_one_line.SetLineStyle(ROOT.kDashed)
377 m_one_line.Draw("Same")
378
379 if not blind:
380 tKsChi = myText("#chi_{#nu}^{2} = %.3f K_{s} = %.3f"%(chiScore,ksScore),0.17,0.9,1.5)
381 t0 = ROOT.TText()
382 t0.SetTextSize(ROOT.gStyle.GetLabelSize()*2.4)
383 t0.SetTextFont(ROOT.gStyle.GetLabelFont())
384 if not log[v]:
385 t0.DrawTextNDC(0.1059,0.96, "0")
386
387 name = '%s/%s' %(config.get('Directories','plotpath'),options[v][6])
388 c.Print(name)
389
390 print 'i am done!\n'
391
392 sys.exit(0)