ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/VHbb/python/write_regression_systematics.py
Revision: 1.12
Committed: Fri Jul 13 09:11:56 2012 UTC (12 years, 10 months ago) by nmohr
Content type: text/x-python
Branch: MAIN
CVS Tags: ICHEP8TeV
Changes since 1.11: +27 -13 lines
Log Message:
7 and 8 TeV running

File Contents

# User Rev Content
1 nmohr 1.1 #!/usr/bin/env python
2     from samplesclass import sample
3     from printcolor import printc
4     import pickle
5     import sys
6     import os
7     import ROOT
8     import math
9     import shutil
10     from ROOT import TFile
11     import ROOT
12     from array import array
13     import warnings
14 nmohr 1.12 from optparse import OptionParser
15     from BetterConfigParser import BetterConfigParser
16 nmohr 1.1 warnings.filterwarnings( action='ignore', category=RuntimeWarning, message='creating converter.*' )
17    
18    
19     #usage: ./write_regression_systematic.py path
20    
21     path=sys.argv[1]
22 nmohr 1.10 namelistIN=sys.argv[2]
23     namelist=namelistIN.split(',')
24 nmohr 1.1
25     #load info
26     infofile = open(path+'/samples.info','r')
27     info = pickle.load(infofile)
28     infofile.close()
29     #os.mkdir(path+'/sys')
30 nmohr 1.12 argv = sys.argv[3:]
31     parser = OptionParser()
32     parser.add_option("-C", "--config", dest="config", default=[], action="append",
33     help="configuration defining the plots to make")
34     (opts, args) = parser.parse_args(argv)
35     if opts.config ==[]:
36     opts.config = "config"
37     print opts.config
38     config = BetterConfigParser()
39     config.read(opts.config)
40 nmohr 1.1
41     def deltaPhi(phi1, phi2):
42     result = phi1 - phi2
43     while (result > math.pi): result -= 2*math.pi
44     while (result <= -math.pi): result += 2*math.pi
45     return result
46    
47 nmohr 1.10 def resolutionBias(eta):
48     if(eta< 1.1): return 0.05
49     if(eta< 2.5): return 0.10
50     if(eta< 5): return 0.30
51     return 0
52    
53     def corrPt(pt,eta,mcPt):
54     return (pt+resolutionBias(math.fabs(eta))*(pt-mcPt))/pt
55    
56 nmohr 1.1 def corrCSV(btag, csv, flav):
57     if(csv < 0.): return csv
58     if(csv > 1.): return csv;
59     if(flav == 0): return csv;
60     if(math.fabs(flav) == 5): return btag.ib.Eval(csv)
61     if(math.fabs(flav) == 4): return btag.ic.Eval(csv)
62     if(math.fabs(flav) != 4 and math.fabs(flav) != 5): return btag.il.Eval(csv)
63     return -10000
64    
65    
66 nmohr 1.10 def csvReshape(sh, pt, eta, csv, flav):
67     return sh.reshape(float(eta), float(pt), float(csv), int(flav))
68    
69    
70 nmohr 1.1 for job in info:
71 nmohr 1.10 if not job.name in namelist: continue
72 nmohr 1.1 #print job.name
73 nmohr 1.10 #if job.name != 'ZH120': continue
74 nmohr 1.1 ROOT.gROOT.ProcessLine(
75     "struct H {\
76     int HiggsFlag;\
77     float mass;\
78     float pt;\
79     float eta;\
80     float phi;\
81     float dR;\
82     float dPhi;\
83     float dEta;\
84     } ;"
85     )
86 nmohr 1.10 #ROOT.gROOT.LoadMacro('../interface/btagshape.h+')
87     #from ROOT import BTagShape
88     #btagNom = BTagShape("../data/csvdiscr.root")
89     #btagNom.computeFunctions()
90     #btagUp = BTagShape("../data/csvdiscr.root")
91     #btagUp.computeFunctions(+1.,0.)
92     #btagDown = BTagShape("../data/csvdiscr.root")
93     #btagDown.computeFunctions(-1.,0.)
94     #btagFUp = BTagShape("../data/csvdiscr.root")
95     #btagFUp.computeFunctions(0.,+1.)
96     #btagFDown = BTagShape("../data/csvdiscr.root")
97     #btagFDown.computeFunctions(0.,-1.)
98 nmohr 1.11 ROOT.gSystem.Load('/shome/nmohr/CMSSW_5_2_4_patch4/src/UserCode/VHbb/interface/BTagReshaping_h.so')
99 nmohr 1.10 from ROOT import BTagShapeInterface
100     btagNom = BTagShapeInterface("../data/csvdiscr.root",0,0)
101     btagUp = BTagShapeInterface("../data/csvdiscr.root",+1,0)
102     btagDown = BTagShapeInterface("../data/csvdiscr.root",-1,0)
103     btagFUp = BTagShapeInterface("../data/csvdiscr.root",0,+1.)
104     btagFDown = BTagShapeInterface("../data/csvdiscr.root",0,-1.)
105 nmohr 1.1
106     print '\t - %s' %(job.name)
107     input = TFile.Open(job.getpath(),'read')
108     output = TFile.Open(job.path+'/sys/'+job.prefix+job.identifier+'.root','recreate')
109    
110     input.cd()
111     obj = ROOT.TObject
112     for key in ROOT.gDirectory.GetListOfKeys():
113     input.cd()
114     obj = key.ReadObj()
115     #print obj.GetName()
116     if obj.GetName() == job.tree:
117     continue
118     output.cd()
119     #print key.GetName()
120     obj.Write(key.GetName())
121    
122 nmohr 1.3 input.cd()
123 nmohr 1.1 tree = input.Get(job.tree)
124     nEntries = tree.GetEntries()
125    
126     job.addpath('/sys')
127     if job.type != 'DATA':
128     job.SYS = ['Nominal','JER_up','JER_down','JES_up','JES_down','beff_up','beff_down','bmis_up','bmis_down']
129    
130     H = ROOT.H()
131     HNoReg = ROOT.H()
132     tree.SetBranchStatus('H',0)
133     output.cd()
134     newtree = tree.CloneTree(0)
135    
136     hJ0 = ROOT.TLorentzVector()
137     hJ1 = ROOT.TLorentzVector()
138    
139 nmohr 1.12 regWeight = config.get("Regression","regWeight")
140     regDict = eval(config.get("Regression","regDict"))
141     regVars = eval(config.get("Regression","regVars"))
142     useMET = eval(config.get("Regression","useMET"))
143     usePtRaw = eval(config.get("Regression","usePtRaw"))
144     useRho25 = eval(config.get("Regression","useRho25"))
145 nmohr 1.1
146     #Regression branches
147     applyRegression = True
148     hJet_pt = array('f',[0]*2)
149     hJet_e = array('f',[0]*2)
150     newtree.Branch( 'H', H , 'HiggsFlag/I:mass/F:pt/F:eta:phi/F:dR/F:dPhi/F:dEta/F' )
151     newtree.Branch( 'HNoReg', HNoReg , 'HiggsFlag/I:mass/F:pt/F:eta:phi/F:dR/F:dPhi/F:dEta/F' )
152     Event = array('f',[0])
153     METet = array('f',[0])
154     rho25 = array('f',[0])
155     METphi = array('f',[0])
156     fRho25 = ROOT.TTreeFormula("rho25",'rho25',tree)
157     fEvent = ROOT.TTreeFormula("Event",'EVENT.event',tree)
158     fMETet = ROOT.TTreeFormula("METet",'METnoPU.et',tree)
159     fMETphi = ROOT.TTreeFormula("METphi",'METnoPU.phi',tree)
160     hJet_MET_dPhi = array('f',[0]*2)
161     hJet_regWeight = array('f',[0]*2)
162     hJet_MET_dPhiArray = [array('f',[0]),array('f',[0])]
163     newtree.Branch('hJet_MET_dPhi',hJet_MET_dPhi,'hJet_MET_dPhi[2]/F')
164     newtree.Branch('hJet_regWeight',hJet_regWeight,'hJet_regWeight[2]/F')
165     readerJet0 = ROOT.TMVA.Reader("!Color:!Silent" )
166     readerJet1 = ROOT.TMVA.Reader("!Color:!Silent" )
167    
168     theForms = {}
169     theVars0 = {}
170     for var in regVars:
171     theVars0[var] = array( 'f', [ 0 ] )
172     readerJet0.AddVariable(var,theVars0[var])
173     theForms['form_reg_%s_0'%(regDict[var])] = ROOT.TTreeFormula("form_reg_%s_0"%(regDict[var]),'%s[0]' %(regDict[var]),tree)
174 nmohr 1.12 if useMET:
175     readerJet0.AddVariable( "Jet_MET_dPhi", hJet_MET_dPhiArray[0] )
176     readerJet0.AddVariable( "METet", METet )
177     if useRho25: readerJet0.AddVariable( "rho25", rho25 )
178 nmohr 1.1
179     theVars1 = {}
180     for var in regVars:
181     theVars1[var] = array( 'f', [ 0 ] )
182     readerJet1.AddVariable(var,theVars1[var])
183     theForms['form_reg_%s_1'%(regDict[var])] = ROOT.TTreeFormula("form_reg_%s_1"%(regDict[var]),'%s[1]' %(regDict[var]),tree)
184 nmohr 1.12 if useMET:
185     readerJet1.AddVariable( "Jet_MET_dPhi", hJet_MET_dPhiArray[1] )
186     readerJet1.AddVariable( "METet", METet )
187     if useRho25: readerJet1.AddVariable( "rho25", rho25 )
188 nmohr 1.1 readerJet0.BookMVA( "jet0Regression", regWeight );
189     readerJet1.BookMVA( "jet1Regression", regWeight );
190    
191 bortigno 1.4 #Add training Flag
192     EventForTraining = array('f',[0])
193     newtree.Branch('EventForTraining',EventForTraining,'EventForTraining/F')
194     EventForTraining[0]=0
195 bortigno 1.6
196 bortigno 1.5 TFlag=ROOT.TTreeFormula("EventForTraining","EVENT.event%2",tree)
197 nmohr 1.1
198     if job.type != 'DATA':
199     #CSV branches
200     hJet_flavour = array('f',[0]*2)
201     hJet_csv = array('f',[0]*2)
202     hJet_csvOld = array('f',[0]*2)
203     hJet_csvUp = array('f',[0]*2)
204     hJet_csvDown = array('f',[0]*2)
205     hJet_csvFUp = array('f',[0]*2)
206     hJet_csvFDown = array('f',[0]*2)
207     newtree.Branch('hJet_csvOld',hJet_csvOld,'hJet_csvOld[2]/F')
208     newtree.Branch('hJet_csvUp',hJet_csvUp,'hJet_csvUp[2]/F')
209     newtree.Branch('hJet_csvDown',hJet_csvDown,'hJet_csvDown[2]/F')
210     newtree.Branch('hJet_csvFUp',hJet_csvFUp,'hJet_csvFUp[2]/F')
211     newtree.Branch('hJet_csvFDown',hJet_csvFDown,'hJet_csvFDown[2]/F')
212    
213     #JER branches
214     hJet_pt_JER_up = array('f',[0]*2)
215     newtree.Branch('hJet_pt_JER_up',hJet_pt_JER_up,'hJet_pt_JER_up[2]/F')
216     hJet_pt_JER_down = array('f',[0]*2)
217     newtree.Branch('hJet_pt_JER_down',hJet_pt_JER_down,'hJet_pt_JER_down[2]/F')
218     hJet_e_JER_up = array('f',[0]*2)
219     newtree.Branch('hJet_e_JER_up',hJet_e_JER_up,'hJet_e_JER_up[2]/F')
220     hJet_e_JER_down = array('f',[0]*2)
221     newtree.Branch('hJet_e_JER_down',hJet_e_JER_down,'hJet_e_JER_down[2]/F')
222     H_JER = array('f',[0]*4)
223     newtree.Branch('H_JER',H_JER,'mass_up:mass_down:pt_up:pt_down/F')
224    
225     #JES branches
226     hJet_pt_JES_up = array('f',[0]*2)
227     newtree.Branch('hJet_pt_JES_up',hJet_pt_JES_up,'hJet_pt_JES_up[2]/F')
228     hJet_pt_JES_down = array('f',[0]*2)
229     newtree.Branch('hJet_pt_JES_down',hJet_pt_JES_down,'hJet_pt_JES_down[2]/F')
230     hJet_e_JES_up = array('f',[0]*2)
231     newtree.Branch('hJet_e_JES_up',hJet_e_JES_up,'hJet_e_JES_up[2]/F')
232     hJet_e_JES_down = array('f',[0]*2)
233     newtree.Branch('hJet_e_JES_down',hJet_e_JES_down,'hJet_e_JES_down[2]/F')
234     H_JES = array('f',[0]*4)
235     newtree.Branch('H_JES',H_JES,'mass_up:mass_down:pt_up:pt_down/F')
236    
237    
238     #iter=0
239    
240    
241     for entry in range(0,nEntries):
242     tree.GetEntry(entry)
243    
244     #fill training flag
245     #iter+=1
246     #if (iter%2==0):
247     # EventForTraining[0]=1
248     #else:
249     # EventForTraining[0]=0
250     #iter+=1
251    
252 bortigno 1.4 # if job.type != 'DATA':
253     # EventForTraining=int(not TFlag.EvalInstance())
254 nmohr 1.10 #EventForTraining[0]=int(not TFlag.EvalInstance())
255 bortigno 1.9
256 nmohr 1.1
257     #get
258     hJet_pt = tree.hJet_pt
259     hJet_e = tree.hJet_e
260     hJet_pt0 = tree.hJet_pt[0]
261     hJet_pt1 = tree.hJet_pt[1]
262     hJet_eta0 = tree.hJet_eta[0]
263     hJet_eta1 = tree.hJet_eta[1]
264     hJet_genPt0 = tree.hJet_genPt[0]
265     hJet_genPt1 = tree.hJet_genPt[1]
266     hJet_e0 = tree.hJet_e[0]
267     hJet_e1 = tree.hJet_e[1]
268     hJet_phi0 = tree.hJet_phi[0]
269     hJet_phi1 = tree.hJet_phi[1]
270     hJet_JECUnc0 = tree.hJet_JECUnc[0]
271     hJet_JECUnc1 = tree.hJet_JECUnc[1]
272    
273     Event[0]=fEvent.EvalInstance()
274     METet[0]=fMETet.EvalInstance()
275     rho25[0]=fRho25.EvalInstance()
276     METphi[0]=fMETphi.EvalInstance()
277     for key, value in regDict.items():
278     theVars0[key][0] = theForms["form_reg_%s_0" %(value)].EvalInstance()
279     theVars1[key][0] = theForms["form_reg_%s_1" %(value)].EvalInstance()
280     for i in range(2):
281     hJet_MET_dPhi[i] = deltaPhi(METphi[0],tree.hJet_phi[i])
282     hJet_MET_dPhiArray[i][0] = deltaPhi(METphi[0],tree.hJet_phi[i])
283    
284 nmohr 1.12 if not job.type == 'DATA' and usePtRaw:
285 nmohr 1.10 theVars0['Jet_ptRaw'][0] = theForms["form_reg_hJet_ptRaw_0"].EvalInstance()*corrPt(tree.hJet_pt[0],tree.hJet_eta[0],tree.hJet_genPt[0])
286     theVars1['Jet_ptRaw'][0] = theForms["form_reg_hJet_ptRaw_1"].EvalInstance()*corrPt(tree.hJet_pt[1],tree.hJet_eta[1],tree.hJet_genPt[1])
287    
288 nmohr 1.1 if applyRegression:
289     hJ0.SetPtEtaPhiE(hJet_pt0,hJet_eta0,hJet_phi0,hJet_e0)
290     hJ1.SetPtEtaPhiE(hJet_pt1,hJet_eta1,hJet_phi1,hJet_e1)
291     HNoReg.HiggsFlag = 1
292     HNoReg.mass = (hJ0+hJ1).M()
293     HNoReg.pt = (hJ0+hJ1).Pt()
294     HNoReg.eta = (hJ0+hJ1).Eta()
295     HNoReg.phi = (hJ0+hJ1).Phi()
296     HNoReg.dR = hJ0.DeltaR(hJ1)
297     HNoReg.dPhi = hJ0.DeltaPhi(hJ1)
298     HNoReg.dEta = abs(hJ0.Eta()-hJ1.Eta())
299 nmohr 1.10 rPt0 = max(0.0001,readerJet0.EvaluateRegression( "jet0Regression" )[0])
300     rPt1 = max(0.0001,readerJet1.EvaluateRegression( "jet1Regression" )[0])
301 nmohr 1.1 hJet_regWeight[0] = rPt0/hJet_pt0
302     hJet_regWeight[1] = rPt1/hJet_pt1
303     rE0 = hJet_e0*hJet_regWeight[0]
304     rE1 = hJet_e1*hJet_regWeight[1]
305     hJ0.SetPtEtaPhiE(rPt0,hJet_eta0,hJet_phi0,rE0)
306     hJ1.SetPtEtaPhiE(rPt1,hJet_eta1,hJet_phi1,rE1)
307     tree.hJet_pt[0] = rPt0
308     tree.hJet_pt[1] = rPt1
309     tree.hJet_e[0] = rE0
310     tree.hJet_e[1] = rE1
311     H.HiggsFlag = 1
312     H.mass = (hJ0+hJ1).M()
313     H.pt = (hJ0+hJ1).Pt()
314     H.eta = (hJ0+hJ1).Eta()
315     H.phi = (hJ0+hJ1).Phi()
316     H.dR = hJ0.DeltaR(hJ1)
317     H.dPhi = hJ0.DeltaPhi(hJ1)
318     H.dEta = abs(hJ0.Eta()-hJ1.Eta())
319     if hJet_regWeight[0] > 5. or hJet_regWeight[1] > 5.:
320     print 'MET %.2f' %(METet[0])
321     print 'rho25 %.2f' %(rho25[0])
322     for key, value in regDict.items():
323     print '%s 0: %.2f'%(key, theVars0[key][0])
324     print '%s 0: %.2f'%(key, theVars1[key][0])
325     for i in range(2):
326     print 'dPhi %.0f %.2f' %(i,hJet_MET_dPhiArray[i][0])
327     print 'corr 0 %.2f' %(hJet_regWeight[0])
328     print 'corr 1 %.2f' %(hJet_regWeight[1])
329     print 'Event %.0f' %(Event[0])
330     print 'rPt0 %.2f' %(rPt0)
331     print 'rPt1 %.2f' %(rPt1)
332     print 'rE0 %.2f' %(rE0)
333     print 'rE1 %.2f' %(rE1)
334     print 'Mass %.2f' %(H.mass)
335    
336     if job.type == 'DATA':
337     newtree.Fill()
338     continue
339    
340     for i in range(2):
341 nmohr 1.10 flavour = int(tree.hJet_flavour[i])
342     pt = float(tree.hJet_pt[i])
343     eta = float(tree.hJet_eta[i])
344     csv = float(tree.hJet_csv[i])
345     hJet_csvOld[i] = csv
346     tree.hJet_csv[i] = btagNom.reshape(eta,pt,csv,flavour)
347     hJet_csvDown[i] = btagDown.reshape(eta,pt,csv,flavour)
348     hJet_csvUp[i] = btagUp.reshape(eta,pt,csv,flavour)
349     hJet_csvFDown[i] = btagFDown.reshape(eta,pt,csv,flavour)
350     hJet_csvFUp[i] = btagFUp.reshape(eta,pt,csv,flavour)
351     #print pt, eta, flavour, csv
352     #tree.hJet_csv[i] = corrCSV(btagNom,csv,flavour)
353     #hJet_csvDown[i] = corrCSV(btagDown,csv,flavour)
354     #hJet_csvUp[i] = corrCSV(btagUp,csv,flavour)
355     #hJet_csvFDown[i] = corrCSV(btagFDown,csv,flavour)
356     #hJet_csvFUp[i] = corrCSV(btagFUp,csv,flavour)
357 nmohr 1.1
358     for updown in ['up','down']:
359     #JER
360     if updown == 'up':
361     inner = 0.06
362     outer = 0.1
363     if updown == 'down':
364     inner = -0.06
365     outer = -0.1
366     #Calculate
367     if abs(hJet_eta0)<1.1: res0 = inner
368     else: res0 = outer
369     if abs(hJet_eta1)<1.1: res1 = inner
370     else: res1 = outer
371     rPt0 = hJet_pt0 + (hJet_pt0-hJet_genPt0)*res0
372     rPt1 = hJet_pt1 + (hJet_pt1-hJet_genPt1)*res1
373     rE0 = hJet_e0*rPt0/hJet_pt0
374     rE1 = hJet_e1*rPt1/hJet_pt1
375     if applyRegression:
376     theVars0['Jet_pt'][0] = rPt0
377     theVars1['Jet_pt'][0] = rPt1
378     theVars0['Jet_e'][0] = rE0
379     theVars1['Jet_e'][0] = rE1
380 nmohr 1.10 rPt0 = max(0.0001,readerJet0.EvaluateRegression( "jet0Regression" )[0])
381     rPt1 = max(0.0001,readerJet1.EvaluateRegression( "jet1Regression" )[0])
382 nmohr 1.1 rE0 = hJet_e0*rPt0/hJet_pt0
383     rE1 = hJet_e1*rPt1/hJet_pt1
384     hJ0.SetPtEtaPhiE(rPt0,hJet_eta0,hJet_phi0,rE0)
385     hJ1.SetPtEtaPhiE(rPt1,hJet_eta1,hJet_phi1,rE1)
386     #Set
387     if updown == 'up':
388     hJet_pt_JER_up[0]=rPt0
389     hJet_pt_JER_up[1]=rPt1
390     hJet_e_JER_up[0]=rE0
391     hJet_e_JER_up[1]=rE1
392     H_JER[0]=(hJ0+hJ1).M()
393     H_JER[2]=(hJ0+hJ1).Pt()
394     if updown == 'down':
395     hJet_pt_JER_down[0]=rPt0
396     hJet_pt_JER_down[1]=rPt1
397     hJet_e_JER_down[0]=rE0
398     hJet_e_JER_down[1]=rE1
399     H_JER[1]=(hJ0+hJ1).M()
400     H_JER[3]=(hJ0+hJ1).Pt()
401    
402     #JES
403     if updown == 'up':
404     variation=1
405     if updown == 'down':
406     variation=-1
407     #calculate
408     rPt0 = hJet_pt0*(1+variation*hJet_JECUnc0)
409     rPt1 = hJet_pt1*(1+variation*hJet_JECUnc1)
410     rE0 = hJet_e0*(1+variation*hJet_JECUnc0)
411     rE1 = hJet_e1*(1+variation*hJet_JECUnc1)
412     if applyRegression:
413     theVars0['Jet_pt'][0] = rPt0
414     theVars1['Jet_pt'][0] = rPt1
415     theVars0['Jet_e'][0] = rE0
416     theVars1['Jet_e'][0] = rE1
417 nmohr 1.10 rPt0 = max(0.0001,readerJet0.EvaluateRegression( "jet0Regression" )[0])
418     rPt1 = max(0.0001,readerJet1.EvaluateRegression( "jet1Regression" )[0])
419 nmohr 1.1 rE0 = hJet_e0*rPt0/hJet_pt0
420     rE1 = hJet_e1*rPt1/hJet_pt1
421     hJ0.SetPtEtaPhiE(rPt0,hJet_eta0,hJet_phi0,rE0)
422     hJ1.SetPtEtaPhiE(rPt1,hJet_eta1,hJet_phi1,rE1)
423     #Fill
424     if updown == 'up':
425     hJet_pt_JES_up[0]=rPt0
426     hJet_pt_JES_up[1]=rPt1
427     hJet_e_JES_up[0]=rE0
428     hJet_e_JES_up[1]=rE1
429     H_JES[0]=(hJ0+hJ1).M()
430     H_JES[2]=(hJ0+hJ1).Pt()
431     if updown == 'down':
432     hJet_pt_JES_down[0]=rPt0
433     hJet_pt_JES_down[1]=rPt1
434     hJet_e_JES_down[0]=rE0
435     hJet_e_JES_down[1]=rE1
436     H_JES[1]=(hJ0+hJ1).M()
437     H_JES[3]=(hJ0+hJ1).Pt()
438    
439     newtree.Fill()
440    
441     newtree.AutoSave()
442     output.Close()
443    
444     #dump info
445 nmohr 1.11 #infofile = open(path+'/sys'+'/samples.info','w')
446     #pickle.dump(info,infofile)
447     #infofile.close()