ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/VHbb/python/write_regression_systematics.py
Revision: 1.16
Committed: Thu Aug 9 13:52:04 2012 UTC (12 years, 9 months ago) by nmohr
Content type: text/x-python
Branch: MAIN
Changes since 1.15: +16 -12 lines
Log Message:
Fixes for 7 and 8 TeV

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     EventForTraining = array('f',[0])
200     newtree.Branch('EventForTraining',EventForTraining,'EventForTraining/F')
201     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    
244    
245     #iter=0
246    
247    
248     for entry in range(0,nEntries):
249     tree.GetEntry(entry)
250    
251     #fill training flag
252     #iter+=1
253     #if (iter%2==0):
254     # EventForTraining[0]=1
255     #else:
256     # EventForTraining[0]=0
257     #iter+=1
258    
259 peller 1.15
260     if job.type != 'DATA' and anaTag == '7TeV':
261     EventForTraining=int(not TFlag.EvalInstance())
262     #EventForTraining[0]=int(not TFlag.EvalInstance())
263 bortigno 1.9
264 nmohr 1.1
265     #get
266     hJet_pt = tree.hJet_pt
267     hJet_e = tree.hJet_e
268     hJet_pt0 = tree.hJet_pt[0]
269     hJet_pt1 = tree.hJet_pt[1]
270     hJet_eta0 = tree.hJet_eta[0]
271     hJet_eta1 = tree.hJet_eta[1]
272     hJet_genPt0 = tree.hJet_genPt[0]
273     hJet_genPt1 = tree.hJet_genPt[1]
274     hJet_e0 = tree.hJet_e[0]
275     hJet_e1 = tree.hJet_e[1]
276     hJet_phi0 = tree.hJet_phi[0]
277     hJet_phi1 = tree.hJet_phi[1]
278     hJet_JECUnc0 = tree.hJet_JECUnc[0]
279     hJet_JECUnc1 = tree.hJet_JECUnc[1]
280    
281     Event[0]=fEvent.EvalInstance()
282     METet[0]=fMETet.EvalInstance()
283     rho25[0]=fRho25.EvalInstance()
284     METphi[0]=fMETphi.EvalInstance()
285     for key, value in regDict.items():
286     theVars0[key][0] = theForms["form_reg_%s_0" %(value)].EvalInstance()
287     theVars1[key][0] = theForms["form_reg_%s_1" %(value)].EvalInstance()
288     for i in range(2):
289     hJet_MET_dPhi[i] = deltaPhi(METphi[0],tree.hJet_phi[i])
290     hJet_MET_dPhiArray[i][0] = deltaPhi(METphi[0],tree.hJet_phi[i])
291    
292 peller 1.15 if not job.type == 'DATA' and usePtRaw:
293     theVars0['Jet_ptRaw'][0] = theForms["form_reg_hJet_ptRaw_0"].EvalInstance()*corrPt(tree.hJet_pt[0],tree.hJet_eta[0],tree.hJet_genPt[0])
294     theVars1['Jet_ptRaw'][0] = theForms["form_reg_hJet_ptRaw_1"].EvalInstance()*corrPt(tree.hJet_pt[1],tree.hJet_eta[1],tree.hJet_genPt[1])
295    
296 nmohr 1.1 if applyRegression:
297     hJ0.SetPtEtaPhiE(hJet_pt0,hJet_eta0,hJet_phi0,hJet_e0)
298     hJ1.SetPtEtaPhiE(hJet_pt1,hJet_eta1,hJet_phi1,hJet_e1)
299     HNoReg.HiggsFlag = 1
300     HNoReg.mass = (hJ0+hJ1).M()
301     HNoReg.pt = (hJ0+hJ1).Pt()
302     HNoReg.eta = (hJ0+hJ1).Eta()
303     HNoReg.phi = (hJ0+hJ1).Phi()
304     HNoReg.dR = hJ0.DeltaR(hJ1)
305     HNoReg.dPhi = hJ0.DeltaPhi(hJ1)
306     HNoReg.dEta = abs(hJ0.Eta()-hJ1.Eta())
307 peller 1.15 rPt0 = max(0.0001,readerJet0.EvaluateRegression( "jet0Regression" )[0])
308     rPt1 = max(0.0001,readerJet1.EvaluateRegression( "jet1Regression" )[0])
309 nmohr 1.1 hJet_regWeight[0] = rPt0/hJet_pt0
310     hJet_regWeight[1] = rPt1/hJet_pt1
311     rE0 = hJet_e0*hJet_regWeight[0]
312     rE1 = hJet_e1*hJet_regWeight[1]
313     hJ0.SetPtEtaPhiE(rPt0,hJet_eta0,hJet_phi0,rE0)
314     hJ1.SetPtEtaPhiE(rPt1,hJet_eta1,hJet_phi1,rE1)
315     tree.hJet_pt[0] = rPt0
316     tree.hJet_pt[1] = rPt1
317     tree.hJet_e[0] = rE0
318     tree.hJet_e[1] = rE1
319     H.HiggsFlag = 1
320     H.mass = (hJ0+hJ1).M()
321     H.pt = (hJ0+hJ1).Pt()
322     H.eta = (hJ0+hJ1).Eta()
323     H.phi = (hJ0+hJ1).Phi()
324     H.dR = hJ0.DeltaR(hJ1)
325     H.dPhi = hJ0.DeltaPhi(hJ1)
326     H.dEta = abs(hJ0.Eta()-hJ1.Eta())
327     if hJet_regWeight[0] > 5. or hJet_regWeight[1] > 5.:
328     print 'MET %.2f' %(METet[0])
329     print 'rho25 %.2f' %(rho25[0])
330     for key, value in regDict.items():
331     print '%s 0: %.2f'%(key, theVars0[key][0])
332     print '%s 0: %.2f'%(key, theVars1[key][0])
333     for i in range(2):
334     print 'dPhi %.0f %.2f' %(i,hJet_MET_dPhiArray[i][0])
335     print 'corr 0 %.2f' %(hJet_regWeight[0])
336     print 'corr 1 %.2f' %(hJet_regWeight[1])
337     print 'Event %.0f' %(Event[0])
338     print 'rPt0 %.2f' %(rPt0)
339     print 'rPt1 %.2f' %(rPt1)
340     print 'rE0 %.2f' %(rE0)
341     print 'rE1 %.2f' %(rE1)
342     print 'Mass %.2f' %(H.mass)
343    
344     if job.type == 'DATA':
345     newtree.Fill()
346     continue
347    
348     for i in range(2):
349 peller 1.15 flavour = int(tree.hJet_flavour[i])
350     pt = float(tree.hJet_pt[i])
351     eta = float(tree.hJet_eta[i])
352     csv = float(tree.hJet_csv[i])
353     hJet_csvOld[i] = csv
354     if anaTag == '7TeV':
355     tree.hJet_csv[i] = corrCSV(btagNom,csv,flavour)
356     hJet_csvDown[i] = corrCSV(btagDown,csv,flavour)
357     hJet_csvUp[i] = corrCSV(btagUp,csv,flavour)
358     hJet_csvFDown[i] = corrCSV(btagFDown,csv,flavour)
359     hJet_csvFUp[i] = corrCSV(btagFUp,csv,flavour)
360     elif anaTag == '8TeV':
361     tree.hJet_csv[i] = btagNom.reshape(eta,pt,csv,flavour)
362     hJet_csvDown[i] = btagDown.reshape(eta,pt,csv,flavour)
363     hJet_csvUp[i] = btagUp.reshape(eta,pt,csv,flavour)
364     hJet_csvFDown[i] = btagFDown.reshape(eta,pt,csv,flavour)
365     hJet_csvFUp[i] = btagFUp.reshape(eta,pt,csv,flavour)
366 nmohr 1.1
367     for updown in ['up','down']:
368     #JER
369     if updown == 'up':
370     inner = 0.06
371     outer = 0.1
372     if updown == 'down':
373     inner = -0.06
374     outer = -0.1
375     #Calculate
376     if abs(hJet_eta0)<1.1: res0 = inner
377     else: res0 = outer
378     if abs(hJet_eta1)<1.1: res1 = inner
379     else: res1 = outer
380     rPt0 = hJet_pt0 + (hJet_pt0-hJet_genPt0)*res0
381     rPt1 = hJet_pt1 + (hJet_pt1-hJet_genPt1)*res1
382     rE0 = hJet_e0*rPt0/hJet_pt0
383     rE1 = hJet_e1*rPt1/hJet_pt1
384     if applyRegression:
385     theVars0['Jet_pt'][0] = rPt0
386     theVars1['Jet_pt'][0] = rPt1
387     theVars0['Jet_e'][0] = rE0
388     theVars1['Jet_e'][0] = rE1
389 peller 1.15 rPt0 = max(0.0001,readerJet0.EvaluateRegression( "jet0Regression" )[0])
390     rPt1 = max(0.0001,readerJet1.EvaluateRegression( "jet1Regression" )[0])
391 nmohr 1.1 rE0 = hJet_e0*rPt0/hJet_pt0
392     rE1 = hJet_e1*rPt1/hJet_pt1
393     hJ0.SetPtEtaPhiE(rPt0,hJet_eta0,hJet_phi0,rE0)
394     hJ1.SetPtEtaPhiE(rPt1,hJet_eta1,hJet_phi1,rE1)
395     #Set
396     if updown == 'up':
397     hJet_pt_JER_up[0]=rPt0
398     hJet_pt_JER_up[1]=rPt1
399     hJet_e_JER_up[0]=rE0
400     hJet_e_JER_up[1]=rE1
401     H_JER[0]=(hJ0+hJ1).M()
402     H_JER[2]=(hJ0+hJ1).Pt()
403     if updown == 'down':
404     hJet_pt_JER_down[0]=rPt0
405     hJet_pt_JER_down[1]=rPt1
406     hJet_e_JER_down[0]=rE0
407     hJet_e_JER_down[1]=rE1
408     H_JER[1]=(hJ0+hJ1).M()
409     H_JER[3]=(hJ0+hJ1).Pt()
410    
411     #JES
412     if updown == 'up':
413     variation=1
414     if updown == 'down':
415     variation=-1
416     #calculate
417     rPt0 = hJet_pt0*(1+variation*hJet_JECUnc0)
418     rPt1 = hJet_pt1*(1+variation*hJet_JECUnc1)
419     rE0 = hJet_e0*(1+variation*hJet_JECUnc0)
420     rE1 = hJet_e1*(1+variation*hJet_JECUnc1)
421     if applyRegression:
422     theVars0['Jet_pt'][0] = rPt0
423     theVars1['Jet_pt'][0] = rPt1
424     theVars0['Jet_e'][0] = rE0
425     theVars1['Jet_e'][0] = rE1
426 peller 1.15 rPt0 = max(0.0001,readerJet0.EvaluateRegression( "jet0Regression" )[0])
427     rPt1 = max(0.0001,readerJet1.EvaluateRegression( "jet1Regression" )[0])
428 nmohr 1.1 rE0 = hJet_e0*rPt0/hJet_pt0
429     rE1 = hJet_e1*rPt1/hJet_pt1
430     hJ0.SetPtEtaPhiE(rPt0,hJet_eta0,hJet_phi0,rE0)
431     hJ1.SetPtEtaPhiE(rPt1,hJet_eta1,hJet_phi1,rE1)
432     #Fill
433     if updown == 'up':
434     hJet_pt_JES_up[0]=rPt0
435     hJet_pt_JES_up[1]=rPt1
436     hJet_e_JES_up[0]=rE0
437     hJet_e_JES_up[1]=rE1
438     H_JES[0]=(hJ0+hJ1).M()
439     H_JES[2]=(hJ0+hJ1).Pt()
440     if updown == 'down':
441     hJet_pt_JES_down[0]=rPt0
442     hJet_pt_JES_down[1]=rPt1
443     hJet_e_JES_down[0]=rE0
444     hJet_e_JES_down[1]=rE1
445     H_JES[1]=(hJ0+hJ1).M()
446     H_JES[3]=(hJ0+hJ1).Pt()
447    
448     newtree.Fill()
449    
450     newtree.AutoSave()
451     output.Close()
452    
453     #dump info
454 peller 1.15 #infofile = open(path+'/sys'+'/samples.info','w')
455     #pickle.dump(info,infofile)
456     #infofile.close()