ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/VHbb/python/write_regression_systematics.py
Revision: 1.18
Committed: Mon Sep 17 12:43:42 2012 UTC (12 years, 7 months ago) by nmohr
Content type: text/x-python
Branch: MAIN
Changes since 1.17: +3 -13 lines
Log Message:
Fix EventForTraining

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