ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/VHbb/python/tree_stack.py
Revision: 1.25
Committed: Thu Oct 11 08:39:52 2012 UTC (12 years, 7 months ago) by peller
Content type: text/x-python
Branch: MAIN
Changes since 1.24: +49 -11 lines
Log Message:
plotting

File Contents

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