ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/VHbb/python/StackMaker.py
Revision: 1.11
Committed: Mon Dec 3 12:19:49 2012 UTC (12 years, 5 months ago) by nmohr
Content type: text/x-python
Branch: MAIN
Changes since 1.10: +13 -9 lines
Log Message:
Overlay optional

File Contents

# User Rev Content
1 nmohr 1.1 import ROOT
2     import sys,os
3     from HistoMaker import orderandadd
4     from BetterConfigParser import BetterConfigParser
5     import TdrStyles
6     from Ratio import getRatio
7    
8     class StackMaker:
9     def __init__(self, config, var,region,SignalRegion):
10     section='Plot:%s'%region
11     self.var = var
12 peller 1.4 self.SignalRegion=SignalRegion
13 nmohr 1.1 self.normalize = eval(config.get(section,'Normalize'))
14     self.log = eval(config.get(section,'log'))
15 nmohr 1.7 if config.has_option('plotDef:%s'%var,'log') and not self.log:
16     self.log = eval(config.get('plotDef:%s'%var,'log'))
17 nmohr 1.1 self.blind = eval(config.get(section,'blind'))
18     if self.blind: blindopt='blind'
19     else: blindopt = 'noblind'
20     self.setup=config.get('Plot_general','setup')
21     if self.log:
22     self.setup=config.get('Plot_general','setupLog')
23     self.setup=self.setup.split(',')
24     if not SignalRegion: self.setup.remove('ZH')
25     self.rebin = 1
26     if config.has_option(section,'rebin'):
27     self.rebin = eval(config.get(section,'rebin'))
28     if config.has_option(section,'nBins'):
29     self.nBins = int(eval(config.get(section,'nBins'))/self.rebin)
30     else:
31 nmohr 1.7 self.nBins = int(eval(config.get('plotDef:%s'%var,'nBins'))/self.rebin)
32 nmohr 1.1 print self.nBins
33     if config.has_option(section,'min'):
34     self.xMin = eval(config.get(section,'min'))
35     else:
36 nmohr 1.7 self.xMin = eval(config.get('plotDef:%s'%var,'min'))
37 nmohr 1.1 if config.has_option(section,'max'):
38     self.xMax = eval(config.get(section,'max'))
39     else:
40 nmohr 1.7 self.xMax = eval(config.get('plotDef:%s'%var,'max'))
41     self.name = config.get('plotDef:%s'%var,'relPath')
42 nmohr 1.1 self.mass = config.get(section,'Signal')
43     data = config.get(section,'Datas')
44     if '<mass>' in self.name:
45     self.name = self.name.replace('<mass>',self.mass)
46     print self.name
47     if config.has_option(section, 'Datacut'):
48     datacut=config.get(section, 'Datacut')
49     else:
50     datacut = region
51     self.colorDict=eval(config.get('Plot_general','colorDict'))
52     self.typLegendDict=eval(config.get('Plot_general','typLegendDict'))
53     self.anaTag = config.get("Analysis","tag")
54 nmohr 1.7 self.xAxis = config.get('plotDef:%s'%var,'xAxis')
55 peller 1.9 self.options = [self.name,'',self.xAxis,self.nBins,self.xMin,self.xMax,'%s_%s_%s.pdf'%(region,var,self.mass),region,datacut,self.mass,data,blindopt]
56     #self.xAxis = config.get('plotDef:%s'%var,'xAxis')
57     #self.options = [self.name,'',self.xAxis,self.nBins,self.xMin,self.xMax,'%s_%s.pdf'%(region,var),region,datacut,self.mass,data,blindopt]
58 nmohr 1.8 self.plotDir = config.get('Directories','plotpath')
59 nmohr 1.6 self.maxRatioUncert = 0.5
60     if self.SignalRegion:
61     self.maxRatioUncert = 1000.
62 nmohr 1.1 self.config = config
63     self.datas = None
64     self.datatyps = None
65     self.overlay = None
66     self.lumi = None
67     self.histos = None
68     self.typs = None
69 peller 1.2 self.AddErrors = None
70 nmohr 1.1 print self.setup
71    
72     def myText(self,txt="CMS Preliminary",ndcX=0,ndcY=0,size=0.8):
73     ROOT.gPad.Update()
74     text = ROOT.TLatex()
75     text.SetNDC()
76     text.SetTextColor(ROOT.kBlack)
77     text.SetTextSize(text.GetTextSize()*size)
78     text.DrawLatex(ndcX,ndcY,txt)
79     return text
80    
81    
82     def doPlot(self):
83     TdrStyles.tdrStyle()
84     self.histos, self.typs = orderandadd(self.histos,self.typs,self.setup)
85    
86     c = ROOT.TCanvas(self.var,'', 600, 600)
87     c.SetFillStyle(4000)
88     c.SetFrameFillStyle(1000)
89     c.SetFrameFillColor(0)
90    
91     oben = ROOT.TPad('oben','oben',0,0.3 ,1.0,1.0)
92     oben.SetBottomMargin(0)
93     oben.SetFillStyle(4000)
94     oben.SetFrameFillStyle(1000)
95     oben.SetFrameFillColor(0)
96     unten = ROOT.TPad('unten','unten',0,0.0,1.0,0.3)
97     unten.SetTopMargin(0.)
98     unten.SetBottomMargin(0.35)
99     unten.SetFillStyle(4000)
100     unten.SetFrameFillStyle(1000)
101     unten.SetFrameFillColor(0)
102    
103     oben.Draw()
104     unten.Draw()
105    
106     oben.cd()
107     allStack = ROOT.THStack(self.var,'')
108 nmohr 1.10 l = ROOT.TLegend(0.63, 0.55,0.92,0.92)
109 nmohr 1.1 l.SetLineWidth(2)
110     l.SetBorderSize(0)
111     l.SetFillColor(0)
112     l.SetFillStyle(4000)
113     l.SetTextFont(62)
114     l.SetTextSize(0.035)
115     MC_integral=0
116     MC_entries=0
117    
118     for histo in self.histos:
119     MC_integral+=histo.Integral()
120     print "\033[1;32m\n\tMC integral = %s\033[1;m"%MC_integral
121    
122     #ORDER AND ADD TOGETHER
123     #print typs
124     #print setup
125    
126    
127 peller 1.2 if not 'DYc' in self.typs: self.typLegendDict.update({'DYlight':self.typLegendDict['DYlc']})
128     print self.typLegendDict
129    
130 nmohr 1.1 k=len(self.histos)
131    
132     for j in range(0,k):
133     #print histos[j].GetBinContent(1)
134     i=k-j-1
135 peller 1.2 self.histos[i].SetFillColor(int(self.colorDict[self.typs[i]]))
136 nmohr 1.1 self.histos[i].SetLineColor(1)
137     allStack.Add(self.histos[i])
138    
139     d1 = ROOT.TH1F('noData','noData',self.nBins,self.xMin,self.xMax)
140     datatitle='Data'
141     addFlag = ''
142     if 'Zee' in self.datanames and 'Zmm' in self.datanames:
143     addFlag = 'Z(l^{-}l^{+})H(b#bar{b})'
144     elif 'Zee' in self.datanames:
145     addFlag = 'Z(e^{-}e^{+})H(b#bar{b})'
146     elif 'Zmm' in self.datanames:
147     addFlag = 'Z(#mu^{-}#mu^{+})H(b#bar{b})'
148 nmohr 1.7 elif 'Znn' in self.datanames:
149     addFlag = 'Z(#nu#nu)H(b#bar{b})'
150     elif 'Wmn' in self.datanames:
151     addFlag = 'W(#mu#nu)H(b#bar{b})'
152     elif 'Wen' in self.datanames:
153     addFlag = 'W(e#nu)H(b#bar{b})'
154 nmohr 1.1 for i in range(0,len(self.datas)):
155     d1.Add(self.datas[i],1)
156     print "\033[1;32m\n\tDATA integral = %s\033[1;m"%d1.Integral()
157     flow = d1.GetEntries()-d1.Integral()
158     if flow > 0:
159     print "\033[1;31m\tU/O flow: %s\033[1;m"%flow
160    
161 nmohr 1.11 if self.overlay:
162     self.overlay.SetLineColor(2)
163     self.overlay.SetLineWidth(2)
164     self.overlay.SetFillColor(0)
165     self.overlay.SetFillStyle(4000)
166     self.overlay.SetNameTitle('Overlay','Overlay')
167 nmohr 1.1
168     l.AddEntry(d1,datatitle,'P')
169     for j in range(0,k):
170     l.AddEntry(self.histos[j],self.typLegendDict[self.typs[j]],'F')
171 nmohr 1.11 if self.overlay:
172     l.AddEntry(self.overlay,self.typLegendDict['Overlay'],'L')
173 nmohr 1.1
174     if self.normalize:
175     if MC_integral != 0: stackscale=d1.Integral()/MC_integral
176 nmohr 1.11 if self.overlay:
177     self.overlay.Scale(stackscale)
178 nmohr 1.1 stackhists=allStack.GetHists()
179     for blabla in stackhists:
180     if MC_integral != 0: blabla.Scale(stackscale)
181 peller 1.4
182 peller 1.9 #if self.SignalRegion:
183     # allMC=allStack.GetStack().At(allStack.GetStack().GetLast()-1).Clone()
184     #else:
185     allMC=allStack.GetStack().Last().Clone()
186 nmohr 1.1
187     allStack.SetTitle()
188     allStack.Draw("hist")
189     allStack.GetXaxis().SetTitle('')
190     yTitle = 'Entries'
191     if not '/' in yTitle:
192 peller 1.5 yAppend = '%.2f' %(allStack.GetXaxis().GetBinWidth(1))
193 nmohr 1.1 yTitle = '%s / %s' %(yTitle, yAppend)
194     allStack.GetYaxis().SetTitle(yTitle)
195     allStack.GetXaxis().SetRangeUser(self.xMin,self.xMax)
196     allStack.GetYaxis().SetRangeUser(0,20000)
197     theErrorGraph = ROOT.TGraphErrors(allMC)
198     theErrorGraph.SetFillColor(ROOT.kGray+3)
199     theErrorGraph.SetFillStyle(3013)
200     theErrorGraph.Draw('SAME2')
201     l.AddEntry(theErrorGraph,"MC uncert. (stat.)","fl")
202     Ymax = max(allStack.GetMaximum(),d1.GetMaximum())*1.7
203     if self.log:
204 nmohr 1.10 allStack.SetMinimum(0.1)
205     Ymax = Ymax*ROOT.TMath.Power(10,1.2*(ROOT.TMath.Log(1.2*(Ymax/0.1))/ROOT.TMath.Log(10)))*(0.2*0.1)
206 nmohr 1.1 ROOT.gPad.SetLogy()
207     allStack.SetMaximum(Ymax)
208     c.Update()
209     ROOT.gPad.SetTicks(1,1)
210     #allStack.Draw("hist")
211     l.SetFillColor(0)
212     l.SetBorderSize(0)
213 nmohr 1.11
214     if self.overlay:
215     self.overlay.Draw('hist,same')
216 nmohr 1.1 d1.Draw("E,same")
217     l.Draw()
218    
219     tPrel = self.myText("CMS Preliminary",0.17,0.88,1.04)
220     tLumi = self.myText("#sqrt{s} = %s, L = %s fb^{-1}"%(self.anaTag,(float(self.lumi)/1000.)),0.17,0.83)
221     tAddFlag = self.myText(addFlag,0.17,0.78)
222    
223     unten.cd()
224     ROOT.gPad.SetTicks(1,1)
225    
226 peller 1.3 l2 = ROOT.TLegend(0.5, 0.82,0.92,0.95)
227 peller 1.2 l2.SetLineWidth(2)
228     l2.SetBorderSize(0)
229     l2.SetFillColor(0)
230     l2.SetFillStyle(4000)
231     l2.SetTextFont(62)
232     #l2.SetTextSize(0.035)
233     l2.SetNColumns(2)
234    
235 nmohr 1.6
236     ratio, error = getRatio(d1,allMC,self.xMin,self.xMax,"",self.maxRatioUncert)
237 nmohr 1.1 ksScore = d1.KolmogorovTest( allMC )
238     chiScore = d1.Chi2Test( allMC , "UWCHI2/NDF")
239     print ksScore
240     print chiScore
241     ratio.SetStats(0)
242     ratio.GetXaxis().SetTitle(self.xAxis)
243     ratioError = ROOT.TGraphErrors(error)
244     ratioError.SetFillColor(ROOT.kGray+3)
245     ratioError.SetFillStyle(3013)
246     ratio.Draw("E1")
247 peller 1.2
248    
249    
250     if not self.AddErrors == None:
251     self.AddErrors.SetFillColor(5)
252     self.AddErrors.SetFillStyle(1001)
253     self.AddErrors.Draw('SAME2')
254    
255     l2.AddEntry(self.AddErrors,"MC uncert. (stat. + syst.)","f")
256    
257 peller 1.9 #ksScore = d1.KolmogorovTest( self.AddErrors )
258     #chiScore = d1.Chi2Test( self.AddErrors , "UWCHI2/NDF")
259    
260    
261 peller 1.2 l2.AddEntry(ratioError,"MC uncert. (stat.)","f")
262    
263     l2.Draw()
264    
265 nmohr 1.1 ratioError.Draw('SAME2')
266     ratio.Draw("E1SAME")
267     ratio.SetTitle("")
268     m_one_line = ROOT.TLine(self.xMin,1,self.xMax,1)
269     m_one_line.SetLineStyle(ROOT.kDashed)
270     m_one_line.Draw("Same")
271    
272     if not self.blind:
273     tKsChi = self.myText("#chi_{#nu}^{2} = %.3f K_{s} = %.3f"%(chiScore,ksScore),0.17,0.9,1.5)
274     t0 = ROOT.TText()
275     t0.SetTextSize(ROOT.gStyle.GetLabelSize()*2.4)
276     t0.SetTextFont(ROOT.gStyle.GetLabelFont())
277     if not self.log:
278     t0.DrawTextNDC(0.1059,0.96, "0")
279 nmohr 1.8 if not os.path.exists(self.plotDir):
280     os.makedirs(os.path.dirname(self.plotDir))
281     name = '%s/%s' %(self.plotDir,self.options[6])
282 nmohr 1.1 c.Print(name)