ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/VHbb/python/write_regression_systematics.py
Revision: 1.14
Committed: Thu Aug 2 16:03:52 2012 UTC (12 years, 9 months ago) by peller
Content type: text/x-python
Branch: MAIN
Changes since 1.13: +60 -99 lines
Log Message:
removed flavour splitting, fixed training readin problem

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