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