ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/VHbb/python/evaluateMVA.py
Revision: 1.21
Committed: Wed Jan 16 16:22:46 2013 UTC (12 years, 3 months ago) by peller
Content type: text/x-python
Branch: MAIN
CVS Tags: workingVersionAfterHCP
Changes since 1.20: +6 -6 lines
Log Message:
reorganized the whole repository. Macros im myutils, config files in subdirectories. Config file split in parts. Path config file restructured. Moved all path options to the path config. Changed the code accordingly.

File Contents

# Content
1 #!/usr/bin/env python
2 import sys
3 import os
4 import ROOT
5 from array import array
6 from math import sqrt
7 from copy import copy
8 #suppres the EvalInstace conversion warning bug
9 import warnings
10 warnings.filterwarnings( action='ignore', category=RuntimeWarning, message='creating converter.*' )
11 from optparse import OptionParser
12 import pickle
13 from myutils import BetterConfigParser, progbar, mvainfo, printc, parse_info
14
15
16 #CONFIGURE
17 ROOT.gROOT.SetBatch(True)
18 print 'hello'
19 #load config
20 #os.mkdir(path+'/sys')
21 argv = sys.argv
22 parser = OptionParser()
23 parser.add_option("-U", "--update", dest="update", default=0,
24 help="update infofile")
25 parser.add_option("-D", "--discr", dest="discr", default="",
26 help="discriminators to be added")
27 #parser.add_option("-I", "--inpath", dest="inpath", default="",
28 # help="path to samples")
29 #parser.add_option("-O", "--outpath", dest="outpath", default="",
30 # help="path where to store output samples")
31 parser.add_option("-S", "--samples", dest="names", default="",
32 help="samples you want to run on")
33 parser.add_option("-C", "--config", dest="config", default=[], action="append",
34 help="configuration file")
35 (opts, args) = parser.parse_args(argv)
36
37 #from samplesclass import sample
38 #from mvainfos import mvainfo
39 #from progbar import progbar
40 #from printcolor import printc
41
42
43 if opts.config =="":
44 opts.config = "config"
45 config = BetterConfigParser()
46 #config.read('./config7TeV_ZZ')
47 config.read(opts.config)
48 anaTag = config.get("Analysis","tag")
49
50 #get locations:
51 Wdir=config.get('Directories','Wdir')
52 samplesinfo=config.get('Directories','samplesinfo')
53
54 #systematics
55
56
57 INpath = config.get('Directories','MVAin')
58 OUTpath = config.get('Directories','MVAout')
59
60 info = parse_info(samplesinfo,INpath)
61
62 #infofile = open(samplesinfo,'r')
63 #info = pickle.load(infofile)
64 #infofile.close()
65 arglist=opts.discr #RTight_blavla,bsbsb
66
67 namelistIN=opts.names
68 namelist=namelistIN.split(',')
69
70 #doinfo=bool(int(opts.update))
71
72 MVAlist=arglist.split(',')
73
74
75 #CONFIG
76 #factory
77 factoryname=config.get('factory','factoryname')
78
79 #load the namespace
80 VHbbNameSpace=config.get('VHbbNameSpace','library')
81 ROOT.gSystem.Load(VHbbNameSpace)
82
83 #MVA
84 MVAinfos=[]
85 MVAdir=config.get('Directories','vhbbpath')
86 for MVAname in MVAlist:
87 MVAinfofile = open(MVAdir+'/data/'+factoryname+'_'+MVAname+'.info','r')
88 MVAinfos.append(pickle.load(MVAinfofile))
89 MVAinfofile.close()
90
91 longe=40
92 #Workdir
93 workdir=ROOT.gDirectory.GetPath()
94
95
96 #Apply samples
97 #infofile = open(samplesinfo,'r')
98 #Ainfo = pickle.load(infofile)
99 #infofile.close()
100
101
102 class MvaEvaluater:
103 def __init__(self, config, MVAinfo):
104 self.varset = MVAinfo.varset
105 #Define reader
106 self.reader = ROOT.TMVA.Reader("!Color:!Silent")
107 MVAdir=config.get('Directories','vhbbpath')
108 self.systematics=config.get('systematics','systematics').split(' ')
109 self.MVA_Vars={}
110 self.MVAname = MVAinfo.MVAname
111 for systematic in self.systematics:
112 self.MVA_Vars[systematic]=config.get(self.varset,systematic)
113 self.MVA_Vars[systematic]=self.MVA_Vars[systematic].split(' ')
114 #define variables and specatators
115 self.MVA_var_buffer = []
116 for i in range(len( self.MVA_Vars['Nominal'])):
117 self.MVA_var_buffer.append(array( 'f', [ 0 ] ))
118 self.reader.AddVariable( self.MVA_Vars['Nominal'][i],self.MVA_var_buffer[i])
119 self.reader.BookMVA(MVAinfo.MVAname,MVAdir+'/data/'+MVAinfo.getweightfile())
120 #--> Now the MVA is booked
121
122 def setBranches(self,tree,job):
123 #Set formulas for all vars
124 self.MVA_formulas={}
125 for systematic in self.systematics:
126 if job.type == 'DATA' and not systematic == 'Nominal': continue
127 self.MVA_formulas[systematic]=[]
128 for j in range(len( self.MVA_Vars['Nominal'])):
129 self.MVA_formulas[systematic].append(ROOT.TTreeFormula("MVA_formula%s_%s"%(j,systematic),self.MVA_Vars[systematic][j],tree))
130
131 def evaluate(self,MVAbranches,job):
132 #Evaluate all vars and fill the branches
133 for systematic in self.systematics:
134 for j in range(len( self.MVA_Vars['Nominal'])):
135 if job.type == 'DATA' and not systematic == 'Nominal': continue
136 self.MVA_var_buffer[j][0] = self.MVA_formulas[systematic][j].EvalInstance()
137 MVAbranches[self.systematics.index(systematic)] = self.reader.EvaluateMVA(self.MVAname)
138
139
140 theMVAs = []
141 for mva in MVAinfos:
142 theMVAs.append(MvaEvaluater(config,mva))
143
144
145 #eval
146 for job in info:
147 if eval(job.active):
148 if job.name in namelist:
149 #get trees:
150 print INpath+'/'+job.prefix+job.identifier+'.root'
151 input = ROOT.TFile.Open(INpath+'/'+job.prefix+job.identifier+'.root','read')
152 print OUTpath+'/'+job.prefix+job.identifier+'.root'
153 outfile = ROOT.TFile.Open(OUTpath+'/'+job.prefix+job.identifier+'.root','recreate')
154 input.cd()
155 obj = ROOT.TObject
156 for key in ROOT.gDirectory.GetListOfKeys():
157 input.cd()
158 obj = key.ReadObj()
159 #print obj.GetName()
160 if obj.GetName() == job.tree:
161 continue
162 outfile.cd()
163 #print key.GetName()
164 obj.Write(key.GetName())
165 tree = input.Get(job.tree)
166 nEntries = tree.GetEntries()
167 outfile.cd()
168 newtree = tree.CloneTree(0)
169
170
171 #Set branch adress for all vars
172 for i in range(0,len(theMVAs)):
173 theMVAs[i].setBranches(tree,job)
174 outfile.cd()
175 #Setup Branches
176 MVAbranches=[]
177 for i in range(0,len(theMVAs)):
178 if job.type == 'Data':
179 MVAbranches.append(array('f',[0]))
180 newtree.Branch(MVAinfos[i].MVAname,MVAbranches[i],'nominal/F')
181 else:
182 MVAbranches.append(array('f',[0]*11))
183 newtree.Branch(theMVAs[i].MVAname,MVAbranches[i],'nominal:JER_up:JER_down:JES_up:JES_down:beff_up:beff_down:bmis_up:bmis_down:beff1_up:beff1_down/F')
184 MVA_formulas_Nominal = []
185 print '\n--> ' + job.name +':'
186 #progbar setup
187 if nEntries >= longe:
188 step=int(nEntries/longe)
189 long=longe
190 else:
191 long=nEntries
192 step = 1
193 bar=progbar(long)
194 #Fill event by event:
195 for entry in range(0,nEntries):
196 if entry % step == 0:
197 bar.move()
198 #load entry
199 tree.GetEntry(entry)
200
201 for i in range(0,len(theMVAs)):
202 theMVAs[i].evaluate(MVAbranches[i],job)
203 #Fill:
204 newtree.Fill()
205 newtree.AutoSave()
206 outfile.Close()
207
208 print '\n'
209
210 #Update Info:
211 #if doinfo:
212 # for job in Ainfo:
213 # for MVAinfo in MVAinfos:
214 # job.addcomment('Added MVA %s'%MVAinfo.MVAname)
215 # job.addpath(MVAdir)
216 # infofile = open(samplesinfo,'w')
217 # pickle.dump(Ainfo,infofile)
218 # infofile.close()