ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/VHbb/python/write_regression_systematics.py
Revision: 1.15
Committed: Thu Aug 9 10:05:30 2012 UTC (12 years, 9 months ago) by peller
Content type: text/x-python
Branch: MAIN
Changes since 1.14: +99 -60 lines
Log Message:
reverting to old version

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