1 |
jstupak |
1.1 |
from ROOT import *
|
2 |
|
|
gROOT.SetBatch(1)
|
3 |
|
|
from LJMet.Com.Sample import samplesForPlotting as samples
|
4 |
|
|
from tdrStyle import *
|
5 |
jstupak |
1.4 |
from sys import argv
|
6 |
|
|
import os
|
7 |
|
|
|
8 |
jstupak |
1.1 |
setTDRStyle()
|
9 |
|
|
gStyle.SetOptStat(False)
|
10 |
|
|
|
11 |
|
|
DEBUG=False
|
12 |
|
|
|
13 |
jstupak |
1.4 |
if len(argv)>1:
|
14 |
|
|
inputDir=argv[1]
|
15 |
|
|
else:
|
16 |
|
|
inputDir='/uscms_data/d1/jstupak/chargedHiggs/2013_2_8/test'
|
17 |
jstupak |
1.1 |
|
18 |
|
|
bJetRequirements=['0p','0','1','1p','2p']
|
19 |
|
|
|
20 |
|
|
channels=['el','mu']
|
21 |
|
|
|
22 |
jstupak |
1.4 |
doCutTable=True #produce selection yield table
|
23 |
|
|
|
24 |
|
|
#These currently do nothing, just thinking ahead
|
25 |
|
|
doJES=False
|
26 |
|
|
doJER=False
|
27 |
|
|
doBTS=False
|
28 |
jstupak |
1.1 |
|
29 |
jstupak |
1.4 |
outputDir=inputDir+'/plots'
|
30 |
|
|
|
31 |
|
|
sharedSelectionCuts='jet_0_pt_ChargedHiggsCalc >= 120 && jet_1_pt_ChargedHiggsCalc >= 40'
|
32 |
jstupak |
1.5 |
elSelectionCuts='elec_1_pt_ChargedHiggsCalc > 50 && abs(elec_1_eta_ChargedHiggsCalc) < 2.5 && elec_1_RelIso_ChargedHiggsCalc < 0.1 && corr_met_ChargedHiggsCalc > 20 && Muon_DeltaR_LjetsTopoCalcNew > 0.3'
|
33 |
|
|
muSelectionCuts='muon_1_pt_ChargedHiggsCalc > 50 && abs(muon_1_eta_ChargedHiggsCalc) < 2.1 && muon_1_RelIso_ChargedHiggsCalc < 0.12 && corr_met_ChargedHiggsCalc > 20 && Muon_DeltaR_LjetsTopoCalcNew > 0.3'
|
34 |
jstupak |
1.4 |
|
35 |
|
|
finalCuts='BestTop_Pt_LjetsTopoCalcNew > 85 && Jet1Jet2_Pt_LjetsTopoCalcNew > 140 && 130 < BestTop_LjetsTopoCalcNew && BestTop_LjetsTopoCalcNew < 210'
|
36 |
jstupak |
1.1 |
|
37 |
|
|
#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
38 |
|
|
|
39 |
jstupak |
1.4 |
elLumi=19624
|
40 |
|
|
muLumi=19624
|
41 |
jstupak |
1.1 |
|
42 |
|
|
treeName='ljmet'
|
43 |
|
|
|
44 |
jstupak |
1.4 |
SFWj = 0.82
|
45 |
|
|
SFWc = 0.93*1.66
|
46 |
|
|
SFWb = 0.93*1.21
|
47 |
jstupak |
1.1 |
|
48 |
|
|
lumiFracUnc = 0.022
|
49 |
|
|
ttbarSigmaFracUnc = 0.15
|
50 |
|
|
wJetsSigmaFracUnc = 0.20
|
51 |
|
|
otherSigmaFracUnc = 0.20
|
52 |
|
|
|
53 |
|
|
#---------------------------------------------------------------------------------------------------------------------------------------------
|
54 |
|
|
|
55 |
jstupak |
1.4 |
if not os.path.isdir(outputDir): os.system("mkdir -p "+outputDir)
|
56 |
|
|
output=TFile(outputDir+'/plots.root',"RECREATE")
|
57 |
jstupak |
1.1 |
|
58 |
jstupak |
1.4 |
class ChargedHiggsPlot:
|
59 |
jstupak |
1.1 |
|
60 |
|
|
def __init__(self,name,distribution,nBins=100,xMin=0,xMax=100,xTitle='',yLog=True,nB="0",otherCuts='',channel='el'):
|
61 |
|
|
self.name=name; self.distribution=distribution; self.nBins=nBins; self.xMin=xMin; self.xMax=xMax; self.xTitle=xTitle; self.yLog=yLog; self.nB=nB; self.otherCuts=otherCuts; self.channel=channel;
|
62 |
|
|
|
63 |
|
|
def Prepare(self):
|
64 |
|
|
result={}
|
65 |
|
|
|
66 |
|
|
cuts=sharedSelectionCuts
|
67 |
|
|
if self.channel=='el': cuts+='&&'+elSelectionCuts
|
68 |
|
|
elif self.channel=='mu': cuts+='&&'+muSelectionCuts
|
69 |
|
|
|
70 |
|
|
if self.nB=="0":
|
71 |
jstupak |
1.4 |
bTagCut='((jet_0_tag_ChargedHiggsCalc + jet_1_tag_ChargedHiggsCalc)==0)'
|
72 |
jstupak |
1.1 |
elif self.nB=="0p":
|
73 |
|
|
bTagCut='1'
|
74 |
|
|
elif self.nB=="1":
|
75 |
jstupak |
1.4 |
bTagCut='((jet_0_tag_ChargedHiggsCalc + jet_1_tag_ChargedHiggsCalc)==1)'
|
76 |
jstupak |
1.1 |
elif self.nB=="1p":
|
77 |
jstupak |
1.4 |
bTagCut='((jet_0_tag_ChargedHiggsCalc + jet_1_tag_ChargedHiggsCalc)>=1)'
|
78 |
jstupak |
1.1 |
elif self.nB=="2":
|
79 |
jstupak |
1.4 |
bTagCut='((jet_0_tag_ChargedHiggsCalc + jet_1_tag_ChargedHiggsCalc)==2)'
|
80 |
jstupak |
1.1 |
elif self.nB=="2p":
|
81 |
jstupak |
1.4 |
#bTagCut='((jet_0_tag_ChargedHiggsCalc + jet_1_tag_ChargedHiggsCalc)>=2)'
|
82 |
|
|
bTagCut='((jet_0_tag_ChargedHiggsCalc==1 && (jet_1_tag_ChargedHiggsCalc + jet_2_tag_ChargedHiggsCalc + jet_3_tag_ChargedHiggsCalc + jet_4_tag_ChargedHiggsCalc + jet_5_tag_ChargedHiggsCalc + jet_6_tag_ChargedHiggsCalc + jet_7_tag_ChargedHiggsCalc + jet_8_tag_ChargedHiggsCalc + jet_9_tag_ChargedHiggsCalc) >= 1 ) || (jet_1_tag_ChargedHiggsCalc==1 && (jet_0_tag_ChargedHiggsCalc + jet_2_tag_ChargedHiggsCalc + jet_3_tag_ChargedHiggsCalc + jet_4_tag_ChargedHiggsCalc + jet_5_tag_ChargedHiggsCalc + jet_6_tag_ChargedHiggsCalc + jet_7_tag_ChargedHiggsCalc + jet_8_tag_ChargedHiggsCalc + jet_9_tag_ChargedHiggsCalc) >= 1))'
|
83 |
jstupak |
1.2 |
|
84 |
|
|
#make name unique
|
85 |
jstupak |
1.1 |
self.name+='_nB'+self.nB+'_'+self.channel
|
86 |
|
|
|
87 |
|
|
if (self.channel == 'el'): lumi=elLumi
|
88 |
|
|
elif (self.channel == 'mu'): lumi=muLumi
|
89 |
jstupak |
1.2 |
|
90 |
|
|
#get histograms with proper normalization
|
91 |
jstupak |
1.1 |
for sample in samples:
|
92 |
jstupak |
1.2 |
#skip electron (muon) data for muon (electron) channel
|
93 |
jstupak |
1.1 |
if (self.channel=='el' and 'SingleMu' in sample.name) or (self.channel=='mu' and 'SingleEl' in sample.name): continue
|
94 |
|
|
|
95 |
|
|
sample.file=TFile(inputDir+'/'+sample.name+'.root')
|
96 |
|
|
sample.tree=sample.file.Get(treeName)
|
97 |
|
|
hName=self.name+'_'+sample.name
|
98 |
|
|
sample.h=TH1F(hName,";"+self.xTitle,self.nBins,self.xMin,self.xMax)
|
99 |
|
|
|
100 |
jstupak |
1.5 |
weight='1'
|
101 |
jstupak |
1.1 |
if sample.isMC:
|
102 |
jstupak |
1.5 |
weight+='* weight_PU_ABCD_PileUpCalc'
|
103 |
|
|
if (self.channel == 'el'):
|
104 |
|
|
weight+='* weight_ElectronEff_53x_ChargedHiggsCalc'
|
105 |
|
|
weight+='* (0.973*(abs(elec_1_eta_ChargedHiggsCalc)<1.5) + 1.02*(abs(elec_1_eta_ChargedHiggsCalc)>1.5&&abs(elec_1_eta_ChargedHiggsCalc)<2.5))'
|
106 |
|
|
elif (self.channel == 'mu'): weight+='* weight_MuonEff_ChargedHiggsCalc'
|
107 |
jstupak |
1.1 |
|
108 |
|
|
if sample.name=='WJets':
|
109 |
jstupak |
1.4 |
sample.tree.Draw(self.distribution+">>"+hName,weight+'*'+str(SFWj)+'*('+cuts+'&&'+bTagCut+'&& n_Bjets_ChargedHiggsCalc==0 && n_Cjets_ChargedHiggsCalc==0)','goff')
|
110 |
|
|
sample.tree.Draw(self.distribution+">>+"+hName,weight+'*'+str(SFWc)+'*('+cuts+'&&'+bTagCut+'&& n_Bjets_ChargedHiggsCalc==0 && n_Cjets_ChargedHiggsCalc>0)','goff')
|
111 |
|
|
sample.tree.Draw(self.distribution+">>+"+hName,weight+'*'+str(SFWb)+'*('+cuts+'&&'+bTagCut+'&& n_Bjets_ChargedHiggsCalc>0)','goff')
|
112 |
jstupak |
1.1 |
bTagEff=sample.h.Integral(0,self.nBins+1)
|
113 |
jstupak |
1.2 |
|
114 |
|
|
#get shape from untagged sample
|
115 |
jstupak |
1.4 |
sample.tree.Draw(self.distribution+">>"+hName,weight+'*'+str(SFWj)+'*('+cuts+'&& n_Bjets_ChargedHiggsCalc==0 && n_Cjets_ChargedHiggsCalc==0)','goff')
|
116 |
jstupak |
1.1 |
result['W+light']=sample.h.Integral(0,self.nBins+1)
|
117 |
jstupak |
1.4 |
sample.tree.Draw(self.distribution+">>+"+hName,weight+'*'+str(SFWc)+'*('+cuts+'&& n_Bjets_ChargedHiggsCalc==0 && n_Cjets_ChargedHiggsCalc>0)','goff')
|
118 |
jstupak |
1.1 |
result['W+c']=sample.h.Integral(0,self.nBins+1)-result['W+light']
|
119 |
jstupak |
1.4 |
sample.tree.Draw(self.distribution+">>+"+hName,weight+'*'+str(SFWb)+'*('+cuts+'&& n_Bjets_ChargedHiggsCalc>0)','goff')
|
120 |
jstupak |
1.1 |
result['W+b']=sample.h.Integral(0,self.nBins+1)-result['W+light']-result['W+c']
|
121 |
|
|
bTagEff/=sample.h.Integral(0,self.nBins+1)
|
122 |
jstupak |
1.2 |
|
123 |
|
|
sample.h.Scale(bTagEff) #get proper normalization
|
124 |
jstupak |
1.5 |
result['W+b']*=bTagEff*lumi*sample.crossSection/sample.nEvents
|
125 |
|
|
result['W+c']*=bTagEff*lumi*sample.crossSection/sample.nEvents
|
126 |
|
|
result['W+b']*=bTagEff*lumi*sample.crossSection/sample.nEvents
|
127 |
jstupak |
1.1 |
|
128 |
|
|
else:
|
129 |
|
|
nSelectedRaw=sample.tree.Draw(self.distribution+">>"+hName,weight+'*('+cuts+'&&'+bTagCut+')','goff')
|
130 |
|
|
|
131 |
jstupak |
1.5 |
if sample.isMC and sample.h.Integral(0,self.nBins+1)!=0: sample.h.Scale(lumi*sample.crossSection/sample.nEvents)
|
132 |
jstupak |
1.1 |
|
133 |
jstupak |
1.2 |
if DEBUG: #for event comparison
|
134 |
jstupak |
1.1 |
if 'TTbar_Powheg' in sample.name and self.channel=='el':
|
135 |
|
|
sample.tree.SetScanField(0)
|
136 |
jstupak |
1.2 |
print '\n',sample.name,' ',self.channel
|
137 |
jstupak |
1.4 |
sample.tree.Scan('run_CommonCalc:lumi_CommonCalc:event_CommonCalc:corr_met_ChargedHiggsCalc:jet_0_pt_ChargedHiggsCalc:jet_1_pt_ChargedHiggsCalc:elec_1_pt_ChargedHiggsCalc:elec_1_eta_ChargedHiggsCalc:elec_1_RelIso_ChargedHiggsCalc:muon_1_pt_ChargedHiggsCalc:muon_1_eta_ChargedHiggsCalc:muon_1_RelIso_ChargedHiggsCalc','('+cuts+'&&'+bTagCut+')')
|
138 |
jstupak |
1.1 |
|
139 |
jstupak |
1.2 |
result[sample.name]=sample.h.Integral(0,self.nBins+1) #for cutflow table
|
140 |
jstupak |
1.1 |
|
141 |
jstupak |
1.2 |
#format histograms and draw plots
|
142 |
jstupak |
1.1 |
output.cd()
|
143 |
|
|
self.signals=[]
|
144 |
|
|
self.backgroundStack=THStack()
|
145 |
|
|
self.ewk=TH1F(self.name+'_ewk',';'+self.xTitle,self.nBins,self.xMin,self.xMax)
|
146 |
|
|
self.top=TH1F(self.name+'_top',';'+self.xTitle,self.nBins,self.xMin,self.xMax)
|
147 |
|
|
self.data=TH1F(self.name+'_data',';'+self.xTitle,self.nBins,self.xMin,self.xMax)
|
148 |
|
|
self.data.SetMarkerStyle(20)
|
149 |
|
|
for sample in samples:
|
150 |
|
|
if (self.channel=='el' and 'SingleMu' in sample.name) or (self.channel=='mu' and 'SingleEl' in sample.name): continue
|
151 |
|
|
elif sample.isSignal:
|
152 |
|
|
sample.h.Scale(20)
|
153 |
|
|
sample.h.SetLineColor(1)
|
154 |
|
|
sample.h.SetLineStyle(6+len(self.signals))
|
155 |
|
|
self.signals+=[sample.h]
|
156 |
|
|
elif sample.isBackground:
|
157 |
|
|
if sample.name[0]=='T': self.top.Add(sample.h)
|
158 |
|
|
else: self.ewk.Add(sample.h)
|
159 |
|
|
elif sample.isData: self.data.Add(sample.h)
|
160 |
|
|
sample.h.SetLineWidth(2)
|
161 |
|
|
|
162 |
|
|
self.ewk.SetFillColor(ROOT.kGreen-3)
|
163 |
|
|
self.ewk.SetLineColor(ROOT.kGreen-2)
|
164 |
|
|
self.top.SetFillColor(ROOT.kRed-7)
|
165 |
|
|
self.top.SetLineColor(ROOT.kRed-4)
|
166 |
|
|
|
167 |
|
|
self.backgroundStack.Add(self.ewk)
|
168 |
|
|
self.backgroundStack.Add(self.top)
|
169 |
|
|
|
170 |
|
|
self.background=self.backgroundStack.GetStack().Last().Clone(self.name+'_background')
|
171 |
|
|
result['Total Background']=self.background.Integral(0,self.nBins+1)
|
172 |
|
|
result['Data']=self.data.Integral(0,self.nBins+1)
|
173 |
|
|
|
174 |
|
|
return result
|
175 |
|
|
|
176 |
|
|
|
177 |
|
|
def Draw(self):
|
178 |
|
|
|
179 |
|
|
self.canvas=TCanvas(self.name,"",1000,800)
|
180 |
|
|
|
181 |
|
|
yDiv=0.35
|
182 |
jstupak |
1.2 |
self.uPad=TPad("uPad","",0,yDiv,1,1) #for actual plots
|
183 |
jstupak |
1.1 |
self.uPad.SetBottomMargin(0)
|
184 |
|
|
self.uPad.SetRightMargin(.05)
|
185 |
|
|
self.uPad.SetLeftMargin(.18)
|
186 |
|
|
self.uPad.Draw()
|
187 |
|
|
|
188 |
jstupak |
1.2 |
self.lPad=TPad("lPad","",0,0,1,yDiv) #for sigma runner
|
189 |
jstupak |
1.1 |
self.lPad.SetTopMargin(0)
|
190 |
jstupak |
1.2 |
self.lPad.SetBottomMargin(.4)
|
191 |
jstupak |
1.1 |
self.lPad.SetRightMargin(.05)
|
192 |
|
|
self.lPad.SetLeftMargin(.18)
|
193 |
|
|
self.lPad.SetGridy()
|
194 |
|
|
self.lPad.Draw()
|
195 |
|
|
|
196 |
|
|
self.data.SetMaximum(2*self.data.GetMaximum())
|
197 |
|
|
self.data.SetMinimum(0.025)
|
198 |
|
|
self.data.GetYaxis().CenterTitle()
|
199 |
|
|
self.data.GetXaxis().SetLabelSize(0)
|
200 |
|
|
self.data.GetYaxis().SetLabelSize(0.08)
|
201 |
|
|
self.data.GetYaxis().SetTitleSize(0.12)
|
202 |
|
|
self.data.GetYaxis().SetTitleOffset(.75)
|
203 |
|
|
|
204 |
|
|
if self.yLog:
|
205 |
|
|
self.uPad.SetLogy()
|
206 |
|
|
self.data.SetMaximum(500*self.data.GetMaximum())
|
207 |
|
|
|
208 |
|
|
binWidth=round(self.data.GetBinWidth(1),5)
|
209 |
|
|
if binWidth-round(binWidth)<.001*binWidth: binWidth=int(round(binWidth))
|
210 |
|
|
yTitle="Events / "+str(binWidth)
|
211 |
jstupak |
1.2 |
if '[' in self.xTitle and ']' in self.xTitle: #get units from x axis title
|
212 |
jstupak |
1.1 |
begin=self.xTitle.find('[')+1
|
213 |
|
|
end=self.xTitle.find(']')
|
214 |
|
|
yTitle+=' '+self.xTitle[begin:end]
|
215 |
|
|
self.data.GetYaxis().SetTitle(yTitle)
|
216 |
|
|
|
217 |
|
|
self.uPad.cd()
|
218 |
jstupak |
1.2 |
self.data.Draw("E1") #draw data first because its easier to format a TH1 than a THStack
|
219 |
jstupak |
1.1 |
self.backgroundStack.Draw("SAME HIST")
|
220 |
|
|
for signal in self.signals: signal.Draw("SAME HIST")
|
221 |
jstupak |
1.2 |
self.data.Draw("SAME E1") #redraw data so its not hidden
|
222 |
jstupak |
1.1 |
self.uPad.RedrawAxis()
|
223 |
|
|
|
224 |
jstupak |
1.2 |
#calculate stat+sys uncertainty
|
225 |
jstupak |
1.1 |
self.uncBand=self.background.Clone("unc")
|
226 |
|
|
for binNo in range(0,self.nBins+1):
|
227 |
|
|
lumiUnc=0
|
228 |
|
|
sigmaUnc=0
|
229 |
|
|
statUnc=0
|
230 |
|
|
for sample in samples:
|
231 |
|
|
if sample.isBackground:
|
232 |
|
|
lumiUnc+=(sample.h.GetBinContent(binNo)*lumiFracUnc)**2
|
233 |
|
|
if sample.name=='WJets': sigmaFracUnc=wJetsSigmaFracUnc
|
234 |
|
|
elif sample.name[0]=='T': sigmaFracUnc=ttbarSigmaFracUnc
|
235 |
jstupak |
1.2 |
else: sigmaFracUnc=otherSigmaFracUnc #WW, Z+Jets
|
236 |
jstupak |
1.1 |
sigmaUnc+=(sample.h.GetBinContent(binNo)*sigmaFracUnc)**2
|
237 |
|
|
statUnc+=sample.h.GetBinError(binNo)**2
|
238 |
|
|
totalUnc=sqrt(lumiUnc+sigmaUnc+statUnc)
|
239 |
|
|
self.uncBand.SetBinError(binNo,totalUnc)
|
240 |
|
|
self.background.SetBinError(binNo,totalUnc)
|
241 |
|
|
self.uncBand.SetFillStyle(3344)
|
242 |
|
|
self.uncBand.SetFillColor(1)
|
243 |
|
|
self.uncBand.SetLineColor(1)
|
244 |
|
|
gStyle.SetHatchesLineWidth(1)
|
245 |
|
|
self.uncBand.Draw("SAME E2")
|
246 |
|
|
|
247 |
|
|
legend=TLegend(0.60,0.60,0.90,0.90)
|
248 |
|
|
legend.SetShadowColor(0);
|
249 |
|
|
legend.SetFillColor(0);
|
250 |
|
|
legend.SetLineColor(0);
|
251 |
|
|
legend.AddEntry(self.data,"Data")
|
252 |
|
|
legend.AddEntry(self.top,"t#bar{t} + Single-Top", "f")
|
253 |
|
|
legend.AddEntry(self.ewk,"W#rightarrowl#nu + Z/#gamma*#rightarrowl^{+}l^{-} + VV" , "f")
|
254 |
|
|
for signal in self.signals:
|
255 |
|
|
name=signal.GetName()
|
256 |
|
|
begin=name.find("Wprime")+6
|
257 |
|
|
end=name.find("Right")-2
|
258 |
|
|
dot=end-1
|
259 |
|
|
mass=name[begin:dot]+'.'+name[dot:end]
|
260 |
|
|
legend.AddEntry(signal, "W'_{R} x 20, m="+mass+" TeV", "l")
|
261 |
|
|
legend.AddEntry(self.uncBand , "Uncertainty" , "f")
|
262 |
|
|
legend.Draw("SAME")
|
263 |
|
|
|
264 |
|
|
prelimTex=TLatex()
|
265 |
|
|
prelimTex.SetNDC()
|
266 |
|
|
prelimTex.SetTextSize(0.04)
|
267 |
|
|
prelimTex.SetTextAlign(31) # align right
|
268 |
|
|
if self.channel=='el': lumi=elLumi
|
269 |
|
|
elif self.channel=='mu': lumi=muLumi
|
270 |
|
|
lumi/=1000.
|
271 |
|
|
lumi=round(lumi,2)
|
272 |
|
|
prelimTex.DrawLatex(0.87, 0.95, "CMS Preliminary, "+str(lumi)+" fb^{-1} at #sqrt{s} = 8 TeV");
|
273 |
|
|
|
274 |
|
|
if self.nB=="0":
|
275 |
|
|
bTagLabel="N_{b tags} = 0"
|
276 |
|
|
elif self.nB=="0p":
|
277 |
|
|
bTagLabel="N_{b tags} #geq 0"
|
278 |
|
|
elif self.nB=="1":
|
279 |
|
|
bTagLabel="N_{b tags} = 1"
|
280 |
|
|
elif self.nB=="1p":
|
281 |
|
|
bTagLabel="N_{b tags} #geq 1"
|
282 |
|
|
elif self.nB=="2":
|
283 |
|
|
bTagLabel="N_{b tags} = 2"
|
284 |
|
|
elif self.nB=="2p":
|
285 |
|
|
bTagLabel="N_{b tags} #geq 2"
|
286 |
|
|
channelTex = TLatex()
|
287 |
|
|
channelTex.SetNDC()
|
288 |
|
|
channelTex.SetTextSize(0.08)
|
289 |
|
|
channelTex.SetTextAlign(31) # align right
|
290 |
|
|
if self.channel=='el': text='e'
|
291 |
|
|
elif self.channel=='mu': text='#mu'
|
292 |
|
|
text+="+jets "+bTagLabel
|
293 |
|
|
channelTex.DrawLatex(0.5, 0.83, text);
|
294 |
|
|
|
295 |
|
|
self.lPad.cd()
|
296 |
|
|
self.pull=self.data.Clone("pull")
|
297 |
|
|
for binNo in range(0,self.nBins+1):
|
298 |
|
|
if self.background.GetBinError(binNo)!=0:
|
299 |
|
|
self.pull.SetBinContent(binNo,(self.data.GetBinContent(binNo)-self.background.GetBinContent(binNo))/self.background.GetBinError(binNo))
|
300 |
|
|
self.pull.SetMaximum(3)
|
301 |
|
|
self.pull.SetMinimum(-3)
|
302 |
|
|
self.pull.SetFillColor(2)
|
303 |
|
|
self.pull.SetLineColor(2)
|
304 |
|
|
self.pull.GetXaxis().SetLabelSize(.15)
|
305 |
|
|
self.pull.GetXaxis().SetTitleSize(0.18)
|
306 |
|
|
self.pull.GetXaxis().SetTitle(self.xTitle)
|
307 |
|
|
self.pull.GetXaxis().SetTitleOffset(.95) #1.15
|
308 |
|
|
self.pull.GetYaxis().SetLabelSize(0.125)
|
309 |
|
|
self.pull.GetYaxis().SetTitleSize(0.1)
|
310 |
|
|
self.pull.GetYaxis().SetTitle('#sigma(Data-MC)')
|
311 |
|
|
self.pull.GetYaxis().SetTitleOffset(.35)
|
312 |
|
|
self.pull.GetYaxis().SetNdivisions(5);
|
313 |
|
|
self.pull.Draw("HIST")
|
314 |
|
|
|
315 |
|
|
output.cd()
|
316 |
jstupak |
1.2 |
self.canvas.Write()
|
317 |
jstupak |
1.1 |
self.data.Write()
|
318 |
|
|
self.ewk.Write()
|
319 |
|
|
self.top.Write()
|
320 |
jstupak |
1.4 |
self.canvas.SaveAs(outputDir+'/'+self.name+'.pdf')
|
321 |
|
|
#self.canvas.SaveAs(outputDir+'/'+self.name+'.eps')
|
322 |
|
|
#self.canvas.SaveAs(outputDir+'/'+self.name+'.C')
|
323 |
jstupak |
1.1 |
|
324 |
|
|
##################################################################################################################################################################
|
325 |
|
|
|
326 |
|
|
if __name__=='__main__':
|
327 |
|
|
|
328 |
|
|
yields={}
|
329 |
|
|
plots=[]
|
330 |
|
|
for n in bJetRequirements:
|
331 |
|
|
yields[n]={}
|
332 |
jstupak |
1.2 |
|
333 |
jstupak |
1.1 |
if doCutTable:
|
334 |
jstupak |
1.4 |
plots+=[ChargedHiggsPlot(name='electron0_pt',distribution='elec_1_pt_ChargedHiggsCalc',nBins=100,xMin=0,xMax=7000,xTitle='electron p_{T} [GeV]',yLog=True,nB=n,channel='el'),
|
335 |
|
|
ChargedHiggsPlot(name='muon0_pt',distribution='muon_1_pt_ChargedHiggsCalc',nBins=100,xMin=0,xMax=7000,xTitle='muon p_{T} [GeV]',yLog=True,nB=n,channel='mu')
|
336 |
jstupak |
1.1 |
]
|
337 |
|
|
|
338 |
|
|
else:
|
339 |
jstupak |
1.4 |
plots+=[ChargedHiggsPlot(name='electron0_pt',distribution='elec_1_pt_ChargedHiggsCalc',nBins=100,xMin=0,xMax=1000,xTitle='electron p_{T} [GeV]',yLog=True,nB=n,channel='el'),
|
340 |
|
|
ChargedHiggsPlot(name='electron0_eta',distribution='elec_1_eta_ChargedHiggsCalc',nBins=50,xMin=-2.5,xMax=2.5,xTitle='electron #eta',yLog=False,nB=n,channel='el'),
|
341 |
|
|
ChargedHiggsPlot(name='electron0_RelIso',distribution='elec_1_RelIso_ChargedHiggsCalc',nBins=30,xMin=0,xMax=0.15,xTitle='electron Rel. Isolation',yLog=True,nB=n,channel='el'),
|
342 |
jstupak |
1.1 |
|
343 |
jstupak |
1.4 |
#ChargedHiggsPlot(name='muon0_pt',distribution='muon_1_pt_ChargedHiggsCalc',nBins=100,xMin=0,xMax=1000,xTitle='muon p_{T} [GeV]',yLog=True,nB=n,channel='mu'),
|
344 |
|
|
#ChargedHiggsPlot(name='muon0_eta',distribution='muon_1_eta_ChargedHiggsCalc',nBins=50,xMin=-2.5,xMax=2.5,xTitle='muon #eta',yLog=False,nB=n,channel='mu'),
|
345 |
|
|
#ChargedHiggsPlot(name='muon0_RelIso',distribution='muon_1_RelIso_ChargedHiggsCalc',nBins=30,xMin=0,xMax=0.15,xTitle='muon Rel. Isolation',yLog=True,nB=n,channel='mu')
|
346 |
jstupak |
1.1 |
]
|
347 |
|
|
for c in channels:
|
348 |
jstupak |
1.4 |
plots+=[ChargedHiggsPlot(name='BestJetJet2W_M',distribution='BestJetJet2W_M_LjetsTopoCalcNew',nBins=68,xMin=100,xMax=3500,xTitle='M(tb) [GeV]',yLog=True,nB=n,channel=c),
|
349 |
|
|
#ChargedHiggsPlot(name='Jet1Jet2W_M',distribution='Jet1Jet2W_M_LjetsTopoCalcNew',nBins=68,xMin=100,xMax=3500,xTitle='M(tb) [GeV]',yLog=True,nB=n,channel=c),
|
350 |
|
|
ChargedHiggsPlot(name='corr_met',distribution='corr_met_ChargedHiggsCalc',nBins=100,xMin=0,xMax=1000,xTitle='E_{T}^{miss} [GeV]',yLog=True,nB=n,channel=c),
|
351 |
|
|
#ChargedHiggsPlot(name='PFjet0_pt',distribution='jet_0_pt_ChargedHiggsCalc',nBins=130,xMin=0,xMax=1300,xTitle='p_{T} (jet1) [GeV]',yLog=True,nB=n,channel=c),
|
352 |
|
|
#ChargedHiggsPlot(name='PFjet0_eta',distribution='jet_0_eta_ChargedHiggsCalc',nBins=50,xMin=-2.5,xMax=2.5,xTitle='#eta (jet1)',yLog=False,nB=n,channel=c),
|
353 |
|
|
#ChargedHiggsPlot(name='PFjet1_pt',distribution='jet_1_pt_ChargedHiggsCalc',nBins=120,xMin=0,xMax=1200,xTitle='p_{T} (jet2) [GeV]',yLog=True,nB=n,channel=c),
|
354 |
|
|
#ChargedHiggsPlot(name='PFjet1_eta',distribution='jet_1_eta_ChargedHiggsCalc',nBins=50,xMin=-2.5,xMax=2.5,xTitle='#eta (jet2)',yLog=False,nB=n,channel=c),
|
355 |
|
|
#ChargedHiggsPlot(name='PFjet2_pt',distribution='jet_2_pt_ChargedHiggsCalc',nBins=80,xMin=0,xMax=800,xTitle='p_{T} (jet3) [GeV]',yLog=True,nB=n,channel=c),
|
356 |
|
|
#ChargedHiggsPlot(name='PFjet2_eta',distribution='jet_2_eta_ChargedHiggsCalc',nBins=50,xMin=-2.5,xMax=2.5,xTitle='#eta (jet3)',yLog=False,nB=n,channel=c),
|
357 |
|
|
ChargedHiggsPlot(name='TopMass_Best',distribution='BestTop_LjetsTopoCalcNew',nBins=100,xMin=0,xMax=1000,xTitle='M(best jet,W) [GeV]',yLog=True,nB=n,channel=c),
|
358 |
|
|
#ChargedHiggsPlot(name='TopPt_Best',distribution='BestTop_Pt_LjetsTopoCalcNew',nBins=150,xMin=0,xMax=1500,xTitle='p_{T}(best jet,W) [GeV]',yLog=True,nB=n,channel=c),
|
359 |
|
|
#ChargedHiggsPlot(name='Pt_Jet1Jet2',distribution='Jet1Jet2_Pt_LjetsTopoCalcNew',nBins=150,xMin=0,xMax=1500,xTitle='p_{T}(jet1,jet2) [GeV]',yLog=True,nB=n,channel=c),
|
360 |
|
|
#ChargedHiggsPlot(name='HT',distribution='Ht_LjetsTopoCalcNew',nBins=125,xMin=0,xMax=2500,xTitle='H_{T} [GeV]',yLog=True,nB=n,channel=c),
|
361 |
|
|
ChargedHiggsPlot(name='nPV',distribution='nPV_ChargedHiggsCalc',nBins=50,xMin=0,xMax=50,xTitle='# Vertices',yLog=True,nB=n,channel=c)
|
362 |
jstupak |
1.1 |
]
|
363 |
|
|
|
364 |
|
|
for plot in plots:
|
365 |
|
|
yields[plot.nB][plot.channel]=plot.Prepare()
|
366 |
|
|
plot.Draw()
|
367 |
|
|
|
368 |
|
|
cWidth=15; nameWidth=35
|
369 |
|
|
for c in channels:
|
370 |
jstupak |
1.2 |
print ("CHANNEL:"+c).ljust(nameWidth+(2*cWidth+1)),"N_b"
|
371 |
jstupak |
1.1 |
print "".ljust(nameWidth),
|
372 |
|
|
for n in bJetRequirements: print n.ljust(cWidth),
|
373 |
|
|
print
|
374 |
jstupak |
1.5 |
for sample in ['Data']: #,'W+light','W+c','W+b']:
|
375 |
jstupak |
1.1 |
print sample.ljust(nameWidth),
|
376 |
|
|
for n in bJetRequirements:
|
377 |
|
|
try: print str(int(round(yields[n][c][sample]))).ljust(cWidth),
|
378 |
|
|
except: pass
|
379 |
|
|
print
|
380 |
|
|
for sample in samples:
|
381 |
jstupak |
1.5 |
if (c=='el' and 'SingleMu' in sample.name) or (c=='mu' and 'SingleEl' in sample.name): continue
|
382 |
jstupak |
1.1 |
if sample.isData: continue
|
383 |
|
|
print sample.name.ljust(nameWidth),
|
384 |
|
|
for n in bJetRequirements:
|
385 |
|
|
print str(int(round(yields[n][c][sample.name]))).ljust(cWidth),
|
386 |
|
|
print
|
387 |
|
|
for sample in ['Total Background']:
|
388 |
|
|
print sample.ljust(nameWidth),
|
389 |
|
|
for n in bJetRequirements:
|
390 |
|
|
print str(int(round(yields[n][c][sample]))).ljust(cWidth),
|
391 |
|
|
print
|
392 |
|
|
print 'Background/Data'.ljust(nameWidth),
|
393 |
|
|
for n in bJetRequirements:
|
394 |
|
|
print str(round(yields[n][c]['Total Background']/yields[n][c]['Data'],3)).ljust(cWidth),
|
395 |
|
|
print 3*'\n'
|
396 |
|
|
|