ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/VHbb/python/myutils/StackMaker.py
Revision: 1.15
Committed: Fri Jul 19 10:05:41 2013 UTC (11 years, 10 months ago) by nmohr
Content type: text/x-python
Branch: MAIN
CVS Tags: HEAD
Changes since 1.14: +104 -57 lines
Log Message:
For git migration

File Contents

# User Rev Content
1 peller 1.1 import ROOT
2 nmohr 1.3 ROOT.gROOT.SetBatch(True)
3 peller 1.1 import sys,os
4     from BetterConfigParser import BetterConfigParser
5     import TdrStyles
6     from Ratio import getRatio
7 peller 1.4 from HistoMaker import HistoMaker
8 peller 1.1
9     class StackMaker:
10 peller 1.7 def __init__(self, config, var,region,SignalRegion,setup=None):
11 peller 1.1 section='Plot:%s'%region
12     self.var = var
13     self.SignalRegion=SignalRegion
14 nmohr 1.15 self.region = region
15 peller 1.1 self.normalize = eval(config.get(section,'Normalize'))
16     self.log = eval(config.get(section,'log'))
17     if config.has_option('plotDef:%s'%var,'log') and not self.log:
18     self.log = eval(config.get('plotDef:%s'%var,'log'))
19     self.blind = eval(config.get(section,'blind'))
20 peller 1.7 if setup is None:
21     self.setup=config.get('Plot_general','setup')
22     if self.log:
23     self.setup=config.get('Plot_general','setupLog')
24     self.setup=self.setup.split(',')
25     else:
26     self.setup=setup
27 nmohr 1.11 if not SignalRegion:
28 nmohr 1.12 if 'ZH' in self.setup:
29 nmohr 1.11 self.setup.remove('ZH')
30 nmohr 1.12 if 'WH' in self.setup:
31 nmohr 1.11 self.setup.remove('WH')
32 peller 1.1 self.rebin = 1
33     if config.has_option(section,'rebin'):
34     self.rebin = eval(config.get(section,'rebin'))
35     if config.has_option(section,'nBins'):
36     self.nBins = int(eval(config.get(section,'nBins'))/self.rebin)
37     else:
38     self.nBins = int(eval(config.get('plotDef:%s'%var,'nBins'))/self.rebin)
39     print self.nBins
40     if config.has_option(section,'min'):
41     self.xMin = eval(config.get(section,'min'))
42     else:
43     self.xMin = eval(config.get('plotDef:%s'%var,'min'))
44     if config.has_option(section,'max'):
45     self.xMax = eval(config.get(section,'max'))
46     else:
47     self.xMax = eval(config.get('plotDef:%s'%var,'max'))
48     self.name = config.get('plotDef:%s'%var,'relPath')
49     self.mass = config.get(section,'Signal')
50     data = config.get(section,'Datas')
51     if '<mass>' in self.name:
52     self.name = self.name.replace('<mass>',self.mass)
53     print self.name
54 peller 1.7 if config.has_option('Cuts',region):
55     cut = config.get('Cuts',region)
56     else:
57     cut = None
58 peller 1.1 if config.has_option(section, 'Datacut'):
59 nmohr 1.2 cut=config.get(section, 'Datacut')
60 nmohr 1.10 if config.has_option(section, 'doFit'):
61     self.doFit=eval(config.get(section, 'doFit'))
62     else:
63     self.doFit = False
64 nmohr 1.2
65 peller 1.1 self.colorDict=eval(config.get('Plot_general','colorDict'))
66     self.typLegendDict=eval(config.get('Plot_general','typLegendDict'))
67     self.anaTag = config.get("Analysis","tag")
68     self.xAxis = config.get('plotDef:%s'%var,'xAxis')
69 peller 1.9 self.options = {'var': self.name,'name':'','xAxis': self.xAxis, 'nBins': self.nBins, 'xMin': self.xMin, 'xMax': self.xMax,'pdfName': '%s_%s_%s.pdf'%(region,var,self.mass),'cut':cut,'mass': self.mass, 'data': data, 'blind': self.blind}
70 peller 1.7 if config.has_option('Weights','weightF'):
71     self.options['weight'] = config.get('Weights','weightF')
72     else:
73     self.options['weight'] = None
74 peller 1.1 self.plotDir = config.get('Directories','plotpath')
75     self.maxRatioUncert = 0.5
76     if self.SignalRegion:
77     self.maxRatioUncert = 1000.
78     self.config = config
79     self.datas = None
80     self.datatyps = None
81     self.overlay = None
82     self.lumi = None
83     self.histos = None
84     self.typs = None
85     self.AddErrors = None
86     print self.setup
87    
88 nmohr 1.2 @staticmethod
89     def myText(txt="CMS Preliminary",ndcX=0,ndcY=0,size=0.8):
90 peller 1.1 ROOT.gPad.Update()
91     text = ROOT.TLatex()
92     text.SetNDC()
93     text.SetTextColor(ROOT.kBlack)
94     text.SetTextSize(text.GetTextSize()*size)
95     text.DrawLatex(ndcX,ndcY,txt)
96     return text
97    
98 nmohr 1.6 def doCompPlot(self,aStack,l):
99     c = ROOT.TCanvas(self.var+'Comp','',600,600)
100     c.SetFillStyle(4000)
101     c.SetFrameFillStyle(1000)
102     c.SetFrameFillColor(0)
103     k=len(self.histos)
104     l.Clear()
105     maximum = 0.
106     for j in range(0,k):
107     #print histos[j].GetBinContent(1)
108     i=k-j-1
109     self.histos[i].SetLineColor(int(self.colorDict[self.typs[i]]))
110     self.histos[i].SetFillColor(0)
111     self.histos[i].SetLineWidth(3)
112     if self.histos[i].Integral() > 0.:
113     self.histos[i].Scale(1./self.histos[i].Integral())
114     if self.histos[i].GetMaximum() > maximum:
115     maximum = self.histos[i].GetMaximum()
116     l.AddEntry(self.histos[j],self.typLegendDict[self.typs[j]],'l')
117     aStack.SetMinimum(0.)
118     aStack.SetMaximum(maximum*1.5)
119     aStack.GetXaxis().SetTitle(self.xAxis)
120     aStack.Draw('HISTNOSTACK')
121     if self.overlay:
122     if self.overlay.Integral() > 0.:
123     self.overlay.Scale(1./self.overlay.Integral())
124     self.overlay.Draw('hist,same')
125     l.AddEntry(self.overlay,self.typLegendDict['Overlay'],'L')
126     l.Draw()
127     name = '%s/comp_%s' %(self.plotDir,self.options['pdfName'])
128     c.Print(name)
129 peller 1.1
130     def doPlot(self):
131     TdrStyles.tdrStyle()
132 peller 1.4 histo_dict = HistoMaker.orderandadd([{self.typs[i]:self.histos[i]} for i in range(len(self.histos))],self.setup)
133     #sort
134 bortigno 1.13 print histo_dict
135 peller 1.4 self.histos=[histo_dict[key] for key in self.setup]
136     self.typs=self.setup
137 peller 1.1
138     c = ROOT.TCanvas(self.var,'', 600, 600)
139     c.SetFillStyle(4000)
140     c.SetFrameFillStyle(1000)
141     c.SetFrameFillColor(0)
142    
143     oben = ROOT.TPad('oben','oben',0,0.3 ,1.0,1.0)
144     oben.SetBottomMargin(0)
145     oben.SetFillStyle(4000)
146     oben.SetFrameFillStyle(1000)
147     oben.SetFrameFillColor(0)
148     unten = ROOT.TPad('unten','unten',0,0.0,1.0,0.3)
149     unten.SetTopMargin(0.)
150     unten.SetBottomMargin(0.35)
151     unten.SetFillStyle(4000)
152     unten.SetFrameFillStyle(1000)
153     unten.SetFrameFillColor(0)
154    
155     oben.Draw()
156     unten.Draw()
157    
158     oben.cd()
159     allStack = ROOT.THStack(self.var,'')
160 nmohr 1.15 l = ROOT.TLegend(0.45, 0.6,0.75,0.92)
161 peller 1.1 l.SetLineWidth(2)
162     l.SetBorderSize(0)
163     l.SetFillColor(0)
164     l.SetFillStyle(4000)
165     l.SetTextFont(62)
166     l.SetTextSize(0.035)
167 nmohr 1.15 l_2 = ROOT.TLegend(0.68, 0.6,0.92,0.92)
168     l_2.SetLineWidth(2)
169     l_2.SetBorderSize(0)
170     l_2.SetFillColor(0)
171     l_2.SetFillStyle(4000)
172     l_2.SetTextFont(62)
173     l_2.SetTextSize(0.035)
174 peller 1.1 MC_integral=0
175     MC_entries=0
176    
177     for histo in self.histos:
178     MC_integral+=histo.Integral()
179     print "\033[1;32m\n\tMC integral = %s\033[1;m"%MC_integral
180    
181     #ORDER AND ADD TOGETHER
182    
183     if not 'DYc' in self.typs: self.typLegendDict.update({'DYlight':self.typLegendDict['DYlc']})
184     print self.typLegendDict
185    
186     k=len(self.histos)
187    
188     for j in range(0,k):
189     #print histos[j].GetBinContent(1)
190     i=k-j-1
191     self.histos[i].SetFillColor(int(self.colorDict[self.typs[i]]))
192     self.histos[i].SetLineColor(1)
193     allStack.Add(self.histos[i])
194    
195     d1 = ROOT.TH1F('noData','noData',self.nBins,self.xMin,self.xMax)
196     datatitle='Data'
197     addFlag = ''
198     if 'Zee' in self.datanames and 'Zmm' in self.datanames:
199     addFlag = 'Z(l^{-}l^{+})H(b#bar{b})'
200     elif 'Zee' in self.datanames:
201     addFlag = 'Z(e^{-}e^{+})H(b#bar{b})'
202     elif 'Zmm' in self.datanames:
203     addFlag = 'Z(#mu^{-}#mu^{+})H(b#bar{b})'
204     elif 'Znn' in self.datanames:
205     addFlag = 'Z(#nu#nu)H(b#bar{b})'
206     elif 'Wmn' in self.datanames:
207     addFlag = 'W(#mu#nu)H(b#bar{b})'
208     elif 'Wen' in self.datanames:
209 nmohr 1.15 addFlag = 'W(e#nu)H(b#bar{b})'
210     elif 'Wtn' in self.datanames:
211     addFlag = 'W(#tau#nu)H(b#bar{b})'
212     addFlag2 = ''
213     if 'TTbar' in self.region:
214     addFlag2 = 't#bar{t} enriched region'
215     elif 'ZLight' in self.region:
216     addFlag2 = 'Z+udscg enriched region'
217     elif 'Zbb' in self.region:
218     addFlag2 = 'Z+b#bar{b} enriched region'
219 bortigno 1.13 else:
220 nmohr 1.15 addFlag2 = 'pp #rightarrow VH; H #rightarrow b#bar{b}'
221    
222 peller 1.1 for i in range(0,len(self.datas)):
223 bortigno 1.13 print self.datas[i]
224 peller 1.1 d1.Add(self.datas[i],1)
225     print "\033[1;32m\n\tDATA integral = %s\033[1;m"%d1.Integral()
226     flow = d1.GetEntries()-d1.Integral()
227     if flow > 0:
228     print "\033[1;31m\tU/O flow: %s\033[1;m"%flow
229    
230 nmohr 1.15 if self.overlay and not isinstance(self.overlay,list):
231     self.overlay = [self.overlay]
232 peller 1.1 if self.overlay:
233 nmohr 1.15 for _overlay in self.overlay:
234     _overlay.SetLineColor(int(self.colorDict[_overlay.GetName()]))
235     _overlay.SetLineWidth(2)
236     _overlay.SetFillColor(0)
237     _overlay.SetFillStyle(4000)
238 peller 1.1
239 nmohr 1.15 numLegend = 2+k
240     if self.overlay:
241     numLegend += len(self.overlay)
242 peller 1.1 l.AddEntry(d1,datatitle,'P')
243     for j in range(0,k):
244 nmohr 1.15 if j < numLegend/2.-1:
245     l.AddEntry(self.histos[j],self.typLegendDict[self.typs[j]],'F')
246     else:
247     l_2.AddEntry(self.histos[j],self.typLegendDict[self.typs[j]],'F')
248 peller 1.1 if self.overlay:
249 nmohr 1.15 for _overlay in self.overlay:
250     l_2.AddEntry(_overlay,self.typLegendDict[_overlay.GetName()],'L')
251 peller 1.1
252     if self.normalize:
253     if MC_integral != 0: stackscale=d1.Integral()/MC_integral
254     if self.overlay:
255 nmohr 1.15 for _overlay in self.overlay:
256     _overlay.Scale(stackscale)
257 peller 1.1 stackhists=allStack.GetHists()
258     for blabla in stackhists:
259     if MC_integral != 0: blabla.Scale(stackscale)
260    
261     allMC=allStack.GetStack().Last().Clone()
262    
263     allStack.SetTitle()
264     allStack.Draw("hist")
265     allStack.GetXaxis().SetTitle('')
266 nmohr 1.15 #yTitle = 's/(s+b) weighted entries'
267     if not d1.GetSumOfWeights() % 1 == 0.0:
268     yTitle = 's/(s+b) weighted entries'
269     else:
270     yTitle = 'Entries'
271 peller 1.1 if not '/' in yTitle:
272 bortigno 1.14 yAppend = '%.0f' %(allStack.GetXaxis().GetBinWidth(1))
273 peller 1.1 yTitle = '%s / %s' %(yTitle, yAppend)
274     allStack.GetYaxis().SetTitle(yTitle)
275     allStack.GetXaxis().SetRangeUser(self.xMin,self.xMax)
276     allStack.GetYaxis().SetRangeUser(0,20000)
277     theErrorGraph = ROOT.TGraphErrors(allMC)
278     theErrorGraph.SetFillColor(ROOT.kGray+3)
279     theErrorGraph.SetFillStyle(3013)
280     theErrorGraph.Draw('SAME2')
281 nmohr 1.15 l_2.AddEntry(theErrorGraph,"MC uncert. (stat.)","fl")
282 peller 1.1 Ymax = max(allStack.GetMaximum(),d1.GetMaximum())*1.7
283     if self.log:
284     allStack.SetMinimum(0.1)
285     Ymax = Ymax*ROOT.TMath.Power(10,1.2*(ROOT.TMath.Log(1.2*(Ymax/0.1))/ROOT.TMath.Log(10)))*(0.2*0.1)
286 nmohr 1.15 #Ymax = Ymax*ROOT.TMath.Power(10,1.3*(ROOT.TMath.Log(1.3*(Ymax/0.1))/ROOT.TMath.Log(10)))*(0.3*0.1)
287 peller 1.1 ROOT.gPad.SetLogy()
288     allStack.SetMaximum(Ymax)
289     c.Update()
290     ROOT.gPad.SetTicks(1,1)
291     l.SetFillColor(0)
292     l.SetBorderSize(0)
293 nmohr 1.15 l_2.SetFillColor(0)
294     l_2.SetBorderSize(0)
295 peller 1.1
296     if self.overlay:
297 nmohr 1.15 for _overlay in self.overlay:
298     _overlay.Draw('hist,same')
299 peller 1.1 d1.Draw("E,same")
300     l.Draw()
301 nmohr 1.15 l_2.Draw()
302 peller 1.1
303 nmohr 1.15 tPrel = self.myText("CMS",0.17,0.88,1.04)
304     tLumi = self.myText("#sqrt{s} = %s, L = %.1f fb^{-1}"%('7TeV',(float(5000.)/1000.)),0.17,0.83)
305     tLumi1 = self.myText("#sqrt{s} = %s, L = %.1f fb^{-1}"%(self.anaTag,(float(self.lumi)/1000.)),0.17,0.78)
306     tAddFlag = self.myText(addFlag,0.17,0.78)
307     if addFlag2:
308     tAddFlag2 = self.myText(addFlag2,0.17,0.73)
309 peller 1.1
310     unten.cd()
311     ROOT.gPad.SetTicks(1,1)
312    
313 nmohr 1.15 l2 = ROOT.TLegend(0.50, 0.82,0.92,0.95)
314 peller 1.1 l2.SetLineWidth(2)
315     l2.SetBorderSize(0)
316     l2.SetFillColor(0)
317     l2.SetFillStyle(4000)
318     l2.SetTextFont(62)
319     l2.SetNColumns(2)
320    
321    
322     ratio, error = getRatio(d1,allMC,self.xMin,self.xMax,"",self.maxRatioUncert)
323     ksScore = d1.KolmogorovTest( allMC )
324     chiScore = d1.Chi2Test( allMC , "UWCHI2/NDF")
325     print ksScore
326     print chiScore
327     ratio.SetStats(0)
328     ratio.GetXaxis().SetTitle(self.xAxis)
329     ratioError = ROOT.TGraphErrors(error)
330     ratioError.SetFillColor(ROOT.kGray+3)
331     ratioError.SetFillStyle(3013)
332     ratio.Draw("E1")
333 nmohr 1.10 if self.doFit:
334     fitData = ROOT.TF1("fData", "gaus",0.7, 1.3)
335     fitMC = ROOT.TF1("fMC", "gaus",0.7, 1.3)
336     print 'Fit on data'
337     d1.Fit(fitData,"R")
338     print 'Fit on simulation'
339     allMC.Fit(fitMC,"R")
340 peller 1.1
341    
342     if not self.AddErrors == None:
343     self.AddErrors.SetFillColor(5)
344     self.AddErrors.SetFillStyle(1001)
345     self.AddErrors.Draw('SAME2')
346    
347     l2.AddEntry(self.AddErrors,"MC uncert. (stat. + syst.)","f")
348    
349    
350 nmohr 1.15 l2.AddEntry(ratioError,"MC total uncert.","f")
351 peller 1.1
352     l2.Draw()
353    
354     ratioError.Draw('SAME2')
355     ratio.Draw("E1SAME")
356     ratio.SetTitle("")
357     m_one_line = ROOT.TLine(self.xMin,1,self.xMax,1)
358     m_one_line.SetLineStyle(ROOT.kDashed)
359     m_one_line.Draw("Same")
360    
361     if not self.blind:
362 nmohr 1.15 #tKsChi = self.myText("#chi_{#nu}^{2} = %.3f K_{s} = %.3f"%(chiScore,ksScore),0.17,0.9,1.5)
363     tKsChi = self.myText("#chi_{#nu}^{2} = %.3f"%(chiScore),0.17,0.9,1.5)
364 peller 1.1 t0 = ROOT.TText()
365     t0.SetTextSize(ROOT.gStyle.GetLabelSize()*2.4)
366     t0.SetTextFont(ROOT.gStyle.GetLabelFont())
367     if not self.log:
368     t0.DrawTextNDC(0.1059,0.96, "0")
369     if not os.path.exists(self.plotDir):
370     os.makedirs(os.path.dirname(self.plotDir))
371 nmohr 1.2 name = '%s/%s' %(self.plotDir,self.options['pdfName'])
372 peller 1.1 c.Print(name)
373 nmohr 1.15 fOut = ROOT.TFile.Open(name.replace('.pdf','.root'),'RECREATE')
374     for theHist in allStack.GetHists():
375     if not self.AddErrors == None and not theHist.GetName() in ['ZH','WH','VH']:
376     #print theHist.GetNbinsX()
377     #print self.AddErrors.GetN()
378     #print error.GetNbinsX()
379     for bin in range(0,theHist.GetNbinsX()):
380     theRelativeTotalError = self.AddErrors.GetErrorY(bin)
381     if error.GetBinError(bin+1) > 0.:
382     theRelativeIncrease = theRelativeTotalError/error.GetBinError(bin+1)
383     else:
384     theRelativeIncrease = 1.
385     #print 'TheTotalRelativeIncrease is: %.2f' %theRelativeIncrease
386     #print 'TheTotalStatError is: %.2f' %error.GetBinError(bin+1)
387     #print 'TheTotalError is: %.2f' %theRelativeTotalError
388     theHist.SetBinError(bin,theHist.GetBinError(bin)*theRelativeIncrease)
389     theHist.SetDirectory(fOut)
390     if theHist.GetName() == 'ZH' or theHist.GetName() == 'WH':
391     theHist.SetName('VH')
392     theHist.Write()
393     d1.SetName('data_obs')
394     d1.SetDirectory(fOut)
395     d1.Write()
396     fOut.Close()
397     #self.doCompPlot(allStack,l)
398 bortigno 1.13
399     def doSubPlot(self,signal):
400    
401     TdrStyles.tdrStyle()
402     histo_dict = HistoMaker.orderandadd([{self.typs[i]:self.histos[i]} for i in range(len(self.histos))],self.setup)
403     #sort
404     print histo_dict
405     sig_histos=[]
406     sub_histos=[histo_dict[key] for key in self.setup]
407     self.typs=self.setup
408     for key in self.setup:
409     if key in signal:
410     sig_histos.append(histo_dict[key])
411    
412     c = ROOT.TCanvas(self.var,'', 600, 600)
413     c.SetFillStyle(4000)
414     c.SetFrameFillStyle(1000)
415     c.SetFrameFillColor(0)
416    
417     main_pad = ROOT.TPad('main_pad','main_pad',0,0.1 ,1.0,1.0)
418     # main_pad.SetBottomMargin(0)
419     main_pad.SetFillStyle(4000)
420     main_pad.SetFrameFillStyle(1000)
421     main_pad.SetFrameFillColor(0)
422    
423     main_pad.Draw()
424    
425     main_pad.cd()
426     allStack = ROOT.THStack(self.var,'')
427     bkgStack = ROOT.THStack(self.var,'')
428     sigStack = ROOT.THStack(self.var,'')
429    
430 nmohr 1.15 l = ROOT.TLegend(0.59, 0.55,0.88,0.92)
431 bortigno 1.13 l.SetLineWidth(2)
432     l.SetBorderSize(0)
433     l.SetFillColor(0)
434     l.SetFillStyle(4000)
435     l.SetTextFont(62)
436     l.SetTextSize(0.035)
437     MC_integral=0
438     MC_entries=0
439    
440     for histo in sub_histos:
441     MC_integral+=histo.Integral()
442     print "\033[1;32m\n\tMC integral = %s\033[1;m"%MC_integral
443    
444    
445    
446     if not 'DYc' in self.typs: self.typLegendDict.update({'DYlight':self.typLegendDict['DYlc']})
447     print self.typLegendDict
448    
449     k=len(sub_histos)
450    
451     # debug
452     print sub_histos
453     print sig_histos
454    
455     for j in range(0,k):
456     #print histos[j].GetBinContent(1)
457     i=k-j-1
458     sub_histos[i].SetFillColor(int(self.colorDict[self.typs[i]]))
459     sub_histos[i].SetLineColor(1)
460     allStack.Add(sub_histos[i])
461 bortigno 1.14 print sub_histos[i].GetName()
462     print sub_histos[i].Integral()
463 bortigno 1.13 if not sub_histos[i] in sig_histos:
464     bkgStack.Add(sub_histos[i])
465     if sub_histos[i] in sig_histos:
466     sigStack.Add(sub_histos[i])
467    
468    
469     sub_d1 = ROOT.TH1F('subData','subData',self.nBins,self.xMin,self.xMax)
470     sub_mc = ROOT.TH1F('subMC','subMC',self.nBins,self.xMin,self.xMax)
471    
472     d1 = ROOT.TH1F('noData','noData',self.nBins,self.xMin,self.xMax)
473     datatitle='Data'
474     addFlag = ''
475     if 'Zee' in self.datanames and 'Zmm' in self.datanames:
476     addFlag = 'Z(l^{-}l^{+})H(b#bar{b})'
477     elif 'Zee' in self.datanames:
478     addFlag = 'Z(e^{-}e^{+})H(b#bar{b})'
479     elif 'Zmm' in self.datanames:
480     addFlag = 'Z(#mu^{-}#mu^{+})H(b#bar{b})'
481     elif 'Znn' in self.datanames:
482     addFlag = 'Z(#nu#nu)H(b#bar{b})'
483     elif 'Wmn' in self.datanames:
484     addFlag = 'W(#mu#nu)H(b#bar{b})'
485     elif 'Wen' in self.datanames:
486     addFlag = 'W(e#nu)H(b#bar{b})'
487     else:
488 bortigno 1.14 addFlag = 'pp #rightarrow VH; H #rightarrow b#bar{b}'
489 bortigno 1.13 for i in range(0,len(self.datas)):
490     print self.datas[i]
491     d1.Add(self.datas[i],1)
492     print "\033[1;32m\n\tDATA integral = %s\033[1;m"%d1.Integral()
493     flow = d1.GetEntries()-d1.Integral()
494     if flow > 0:
495     print "\033[1;31m\tU/O flow: %s\033[1;m"%flow
496    
497 nmohr 1.15
498     numLegend = 1+k
499 bortigno 1.13 if self.overlay:
500 nmohr 1.15 numLegend += len(self.overlay)
501 bortigno 1.13 l.AddEntry(d1,datatitle,'P')
502     # l.AddEntry(sub_d1,datatitle,'P')
503     for j in range(0,k):
504     if self.typs[j] in signal:
505 nmohr 1.15 if j < numLegend/2.:
506     l.AddEntry(sub_histos[j],self.typLegendDict[self.typs[j]],'F')
507     else:
508     l_2.AddEntry(sub_histos[j],self.typLegendDict[self.typs[j]],'F')
509 bortigno 1.13 if self.overlay:
510 nmohr 1.15 for _overlay in self.overlay:
511     l_2.AddEntry(_overlay,self.typLegendDict['Overlay'+_overlay.GetName()],'L')
512 bortigno 1.13
513     if self.normalize:
514     if MC_integral != 0: stackscale=d1.Integral()/MC_integral
515     if self.overlay:
516 nmohr 1.15 for _overlay in self.overlay:
517     _overlay.Scale(stackscale)
518 bortigno 1.13 stackhists=allStack.GetHists()
519     for blabla in stackhists:
520     if MC_integral != 0: blabla.Scale(stackscale)
521    
522     allMC=allStack.GetStack().Last().Clone()
523     bkgMC=bkgStack.GetStack().Last().Clone()
524    
525 bortigno 1.14 bkgMC_noError = bkgMC.Clone()
526     for bin in range(0,bkgMC_noError.GetNbinsX()):
527     bkgMC_noError.SetBinError(bin,0.)
528 bortigno 1.13 sub_d1 = d1.Clone()
529 bortigno 1.14 sub_d1.Sumw2()
530     sub_d1.Add(bkgMC_noError,-1)
531 bortigno 1.13 sub_mc = allMC.Clone()
532 bortigno 1.14 sub_mc.Sumw2()
533     sub_mc.Add(bkgMC_noError,-1)
534 bortigno 1.13
535     sigStack.SetTitle()
536     sigStack.Draw("hist")
537     sigStack.GetXaxis().SetTitle('')
538 nmohr 1.15 yTitle = 's/(s+b) weighted entries'
539 bortigno 1.13 if not '/' in yTitle:
540 bortigno 1.14 yAppend = '%.0f' %(sigStack.GetXaxis().GetBinWidth(1))
541 bortigno 1.13 yTitle = '%s / %s' %(yTitle, yAppend)
542     sigStack.GetYaxis().SetTitle(yTitle)
543 nmohr 1.15 sigStack.GetYaxis().SetTitleOffset(1.3)
544 bortigno 1.13 sigStack.GetXaxis().SetRangeUser(self.xMin,self.xMax)
545     sigStack.GetYaxis().SetRangeUser(-2000,20000)
546     sigStack.GetXaxis().SetTitle(self.xAxis)
547    
548     theMCOutline = bkgMC.Clone()
549     for i in range(1,theMCOutline.GetNbinsX()+1):
550     theMCOutline.SetBinContent(i,theMCOutline.GetBinError(i))
551     theNegativeOutline = theMCOutline.Clone()
552     theNegativeOutline.Add(theNegativeOutline,-2.)
553    
554     theMCOutline.SetLineColor(4)
555     theNegativeOutline.SetLineColor(4)
556     theMCOutline.SetLineWidth(2)
557     theNegativeOutline.SetLineWidth(2)
558     theMCOutline.SetFillColor(0)
559     theNegativeOutline.SetFillColor(0)
560     theMCOutline.Draw("hist same")
561     theNegativeOutline.Draw("hist same")
562 bortigno 1.14 l.AddEntry(theMCOutline,"Sub. MC uncert.","fl")
563 bortigno 1.13
564     theErrorGraph = ROOT.TGraphErrors(sigStack.GetStack().Last().Clone())
565     theErrorGraph.SetFillColor(ROOT.kGray+3)
566     theErrorGraph.SetFillStyle(3013)
567     theErrorGraph.Draw('SAME2')
568 nmohr 1.15 l.AddEntry(theErrorGraph,"VH + VV MC uncert.","fl")
569 bortigno 1.13
570     Ymax = max(sigStack.GetMaximum(),sub_d1.GetMaximum())*1.7
571 bortigno 1.14 Ymin = max(-sub_mc.GetMinimum(),-sub_d1.GetMinimum())*2.7
572 bortigno 1.13 if self.log:
573     sigStack.SetMinimum(0.1)
574     Ymax = Ymax*ROOT.TMath.Power(10,1.2*(ROOT.TMath.Log(1.2*(Ymax/0.1))/ROOT.TMath.Log(10)))*(0.2*0.1)
575     ROOT.gPad.SetLogy()
576     sigStack.SetMaximum(Ymax)
577     sigStack.SetMinimum(-Ymin)
578     c.Update()
579     ROOT.gPad.SetTicks(1,1)
580     #sigStack.Draw("hist")
581     l.SetFillColor(0)
582     l.SetBorderSize(0)
583    
584     if self.overlay:
585 nmohr 1.15 for _overlay in self.overlay:
586     _overlay.Draw('hist,same')
587 bortigno 1.13 sub_d1.Draw("E,same")
588     l.Draw()
589    
590 nmohr 1.15 tPrel = self.myText("CMS",0.17,0.88,1.04)
591 bortigno 1.13 tLumi = self.myText("#sqrt{s} = %s, L = %.1f fb^{-1}"%(self.anaTag,(float(self.lumi)/1000.)),0.17,0.83)
592     tLumi = self.myText("#sqrt{s} = 7TeV, L = 5.0 fb^{-1}",0.17,0.78)
593     tAddFlag = self.myText(addFlag,0.17,0.73)
594    
595     ROOT.gPad.SetTicks(1,1)
596    
597     l2 = ROOT.TLegend(0.5, 0.82,0.92,0.95)
598     l2.SetLineWidth(2)
599     l2.SetBorderSize(0)
600     l2.SetFillColor(0)
601     l2.SetFillStyle(4000)
602     l2.SetTextFont(62)
603     #l2.SetTextSize(0.035)
604     l2.SetNColumns(2)
605    
606    
607    
608     if not self.AddErrors == None:
609     self.AddErrors.SetFillColor(5)
610     self.AddErrors.SetFillStyle(1001)
611     self.AddErrors.Draw('SAME2')
612    
613     l2.AddEntry(self.AddErrors,"MC uncert. (stat. + syst.)","f")
614    
615    
616     if not os.path.exists(self.plotDir):
617     os.makedirs(os.path.dirname(self.plotDir))
618     name = '%s/%s' %(self.plotDir,self.options['pdfName'])
619     c.Print(name)