ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/VHbb/python/tree_stack.py
Revision: 1.24
Committed: Tue Oct 9 19:18:10 2012 UTC (12 years, 7 months ago) by nmohr
Content type: text/x-python
Branch: MAIN
CVS Tags: hcpPreAppFreeze
Changes since 1.23: +1 -1 lines
Log Message:
Fix

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