ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/VHbb/python/submitThem.py
Revision: 1.38
Committed: Thu Apr 4 09:02:48 2013 UTC (12 years, 1 month ago) by nmohr
Content type: text/x-python
Branch: MAIN
Changes since 1.37: +3 -2 lines
Log Message:
Longer queue and not only ZH

File Contents

# User Rev Content
1 nmohr 1.1 #! /usr/bin/env python
2 nmohr 1.6 from optparse import OptionParser
3 bortigno 1.26 import sys
4 peller 1.28 import time
5     import os
6     import shutil
7 nmohr 1.7
8 nmohr 1.6 parser = OptionParser()
9     parser.add_option("-T", "--tag", dest="tag", default="",
10     help="Tag to run the analysis with, example '8TeV' uses config8TeV and pathConfig8TeV to run the analysis")
11 peller 1.9 parser.add_option("-J", "--task", dest="task", default="",
12 nmohr 1.19 help="Task to be done, i.e. 'dc' for Datacards, 'prep' for preparation of Trees, 'plot' to produce plots or 'eval' to write the MVA output or 'sys' to write regression and systematics (or 'syseval' for both). ")
13 peller 1.9 parser.add_option("-M", "--mass", dest="mass", default="125",
14 bortigno 1.10 help="Mass for DC or Plots, 110...135")
15     parser.add_option("-S","--samples",dest="samples",default="",
16     help="samples you want to run on")
17 peller 1.28 parser.add_option("-F", "--folderTag", dest="ftag", default="",
18     help="Creats a new folder structure for outputs or uses an existing one with the given name")
19 bortigno 1.30 parser.add_option("-N", "--number-of-events", dest="nevents_split", default=100000,
20     help="Number of events per file when splitting.")
21     parser.add_option("-P", "--philipp-love-progress-bars", dest="philipp_love_progress_bars", default=False,
22     help="If you share the love of Philipp...")
23    
24 bortigno 1.26 (opts, args) = parser.parse_args(sys.argv)
25    
26 bortigno 1.30 import os,shutil,pickle,subprocess,ROOT,re
27 nmohr 1.27 ROOT.gROOT.SetBatch(True)
28 bortigno 1.31 from myutils import BetterConfigParser, Sample, ParseInfo, sample_parser
29 bortigno 1.26 import getpass
30 nmohr 1.6
31     if opts.tag == "":
32     print "Please provide tag to run the analysis with, example '-T 8TeV' uses config8TeV and pathConfig8TeV to run the analysis."
33     sys.exit(123)
34 peller 1.9
35     if opts.task == "":
36     print "Please provide a task.\n-J prep:\tpreparation of Trees\n-J sys:\t\twrite regression and systematics\n-J eval:\tcreate MVA output\n-J plot:\tproduce Plots\n-J dc:\t\twrite workspaces and datacards"
37     sys.exit(123)
38    
39 peller 1.28
40     en = opts.tag
41    
42 bortigno 1.11 #create the list with the samples to run over
43     samplesList=opts.samples.split(",")
44 peller 1.28 timestamp = time.asctime().replace(' ','_').replace(':','-')
45    
46 bortigno 1.35 # the list of the config is taken from the path config
47 peller 1.28 pathconfig = BetterConfigParser()
48     pathconfig.read('%sconfig/paths'%(en))
49 bortigno 1.35 _configs = pathconfig.get('Configuration','List').split(" ")
50     configs = [ '%sconfig/'%(en) + c for c in _configs ]
51 peller 1.28
52     if not opts.ftag == '':
53     tagDir = pathconfig.get('Directories','tagDir')
54     DirStruct={'tagDir':tagDir,'ftagdir':'%s/%s/'%(tagDir,opts.ftag),'logpath':'%s/%s/%s/'%(tagDir,opts.ftag,'Logs'),'plotpath':'%s/%s/%s/'%(tagDir,opts.ftag,'Plots'),'limitpath':'%s/%s/%s/'%(tagDir,opts.ftag,'Limits'),'confpath':'%s/%s/%s/'%(tagDir,opts.ftag,'config') }
55    
56     for keys in ['tagDir','ftagdir','logpath','plotpath','limitpath','confpath']:
57     try:
58     os.stat(DirStruct[keys])
59     except:
60     os.mkdir(DirStruct[keys])
61    
62     pathfile = open('%sconfig/paths'%(en))
63     buffer = pathfile.readlines()
64     pathfile.close()
65     os.rename('%sconfig/paths'%(en),'%sconfig/paths.bkp'%(en))
66     pathfile = open('%sconfig/paths'%(en),'w')
67     for line in buffer:
68     if line.startswith('plotpath'):
69     line = 'plotpath: %s\n'%DirStruct['plotpath']
70     elif line.startswith('logpath'):
71     line = 'logpath: %s\n'%DirStruct['logpath']
72     elif line.startswith('limits'):
73     line = 'limits: %s\n'%DirStruct['limitpath']
74     pathfile.write(line)
75     pathfile.close()
76    
77     #copy config files
78     for item in configs:
79     shutil.copyfile(item,'%s/%s/%s'%(tagDir,opts.ftag,item.strip(en)))
80    
81    
82 nmohr 1.6 print configs
83     config = BetterConfigParser()
84     config.read(configs)
85 peller 1.28
86 bortigno 1.37 def dump_config(configs,output_file):
87     """
88     Dump all the configs in a output file
89     Args:
90     output_file: the file where the log will be dumped
91     configs: list of files (string) to be dumped
92     Returns:
93     nothing
94     """
95     outf = open(output_file,'w')
96     for i in configs:
97     try:
98     f=open(i,'r')
99     outf.write(f.read())
100     except: print '@WARNING: Config' + i + ' not found. It will not be used.'
101 bortigno 1.35
102     def compile_macro(config,macro):
103     """
104     Creates the library from a macro using CINT compiling it in scratch to avoid
105     problems with the linking in the working nodes.
106     Args:
107     config: configuration file where the macro path is specified
108     macro: macro name to be compiled
109     Returns:
110     nothing
111     """
112     submitDir = os.getcwd()
113     _macro=macro+'.h'
114     library = config.get(macro,'library')
115     libDir=os.path.dirname(library)
116     os.chdir(libDir)
117     if not os.path.exists(library):
118     print '@INFO: Compiling ' + _macro
119     scratchDir='/scratch/%s/'%(getpass.getuser())
120     shutil.copyfile(libDir+'/'+_macro,'/scratch/%s/%s'%(getpass.getuser(),_macro))
121     os.chdir(scratchDir)
122     ROOT.gROOT.ProcessLine('.L %s+'%(scratchDir+_macro))
123     shutil.copyfile('/scratch/%s/%s'%(getpass.getuser(),os.path.basename(library)),library)
124     os.chdir(submitDir)
125    
126     compile_macro(config,'BTagReshaping')
127     compile_macro(config,'VHbbNameSpace')
128    
129 nmohr 1.6 logPath = config.get("Directories","logpath")
130 nmohr 1.34 logo = open('%s/data/submit.txt' %config.get('Directories','vhbbpath')).readlines()
131     counter = 0
132    
133 bortigno 1.14 #check if the logPath exist. If not exit
134     if( not os.path.isdir(logPath) ):
135 bortigno 1.35 print '@ERROR : ' + logPath + ': dir not found.'
136     print '@ERROR : Create it before submitting '
137 nmohr 1.34 print 'Exit'
138     sys.exit(-1)
139    
140 bortigno 1.14
141 bortigno 1.30 repDict = {'en':en,'logpath':logPath,'job':'','task':opts.task,'queue': 'all.q','timestamp':timestamp,'additional':'','job_id':''}
142 nmohr 1.6 def submit(job,repDict):
143 nmohr 1.34 global counter
144     repDict['job'] = job
145     nJob = counter % len(logo)
146     counter += 1
147     if opts.philipp_love_progress_bars:
148     repDict['name'] = '"%s"' %logo[nJob].strip()
149     else:
150     repDict['name'] = '%(job)s_%(en)s%(task)s' %repDict
151     command = 'qsub -V -cwd -q %(queue)s -l h_vmem=6G -N %(name)s -o %(logpath)s/%(timestamp)s_%(job)s_%(en)s_%(task)s.out -e %(logpath)s/%(timestamp)s_%(job)s_%(en)s_%(task)s.err runAll.sh %(job)s %(en)s ' %(repDict) + opts.task + ' ' + repDict['job_id'] + ' ' + repDict['additional']
152     print command
153 bortigno 1.37 dump_config(configs,"%(logpath)s/%(timestamp)s_%(job)s_%(en)s_%(task)s.config" %(repDict))
154 nmohr 1.34 subprocess.call([command], shell=True)
155 nmohr 1.1
156 peller 1.29 if opts.task == 'train':
157     train_list = (config.get('MVALists','List_for_submitscript')).split(',')
158     print train_list
159     for item in train_list:
160     submit(item,repDict)
161    
162    
163 peller 1.9 if opts.task == 'dc':
164 peller 1.18 #DC_vars = config.items('Limit')
165     DC_vars= (config.get('LimitGeneral','List')).split(',')
166     print DC_vars
167    
168 peller 1.9 if opts.task == 'plot':
169 peller 1.15 Plot_vars= (config.get('Plot_general','List')).split(',')
170 peller 1.8
171 peller 1.12 if not opts.task == 'prep':
172     path = config.get("Directories","samplepath")
173 nmohr 1.21 samplesinfo = config.get("Directories","samplesinfo")
174 nmohr 1.27 info = ParseInfo(samplesinfo,path)
175 peller 1.8
176 peller 1.9 if opts.task == 'plot':
177 peller 1.23 repDict['queue'] = 'all.q'
178 peller 1.9 for item in Plot_vars:
179 peller 1.15 submit(item,repDict)
180 peller 1.9
181 nmohr 1.36 if opts.task == 'trainReg':
182     repDict['queue'] = 'all.q'
183     submit('trainReg',repDict)
184    
185 bortigno 1.30
186 peller 1.9 elif opts.task == 'dc':
187 nmohr 1.38 repDict['queue'] = 'all.q'
188 peller 1.9 for item in DC_vars:
189 peller 1.22 if 'ZH%s'%opts.mass in item:
190 peller 1.18 submit(item,repDict)
191 nmohr 1.38 elif opts.mass == 'all':
192 peller 1.18 submit(item,repDict)
193 peller 1.17
194 peller 1.9 elif opts.task == 'prep':
195 nmohr 1.33 if ( opts.samples == ""):
196     path = config.get("Directories","PREPin")
197     samplesinfo = config.get("Directories","samplesinfo")
198     info = ParseInfo(samplesinfo,path)
199     for job in info:
200     submit(job.name,repDict)
201 peller 1.9
202 nmohr 1.33 else:
203     for sample in samplesList:
204     submit(sample,repDict)
205 bortigno 1.30 elif opts.task == 'sys' or opts.task == 'syseval':
206     path = config.get("Directories","SYSin")
207     samplesinfo = config.get("Directories","samplesinfo")
208     info = ParseInfo(samplesinfo,path)
209     if ( opts.samples == ""):
210     for job in info:
211 nmohr 1.34 if (job.subsample):
212     continue #avoid multiple submissions form subsamples
213     # TO FIX FOR SPLITTED SAMPLE
214 bortigno 1.30 submit(job.name,repDict)
215     else:
216     for sample in samplesList:
217     submit(sample,repDict)
218    
219     elif opts.task == 'eval':
220 nmohr 1.38 repDict['queue'] = 'long.q'
221 bortigno 1.30 path = config.get("Directories","MVAin")
222     samplesinfo = config.get("Directories","samplesinfo")
223     info = ParseInfo(samplesinfo,path)
224 bortigno 1.10 if ( opts.samples == ""):
225     for job in info:
226 nmohr 1.34 if (job.subsample):
227     continue #avoid multiple submissions from subsamples
228     if(info.checkSplittedSampleName(job.identifier)): # if multiple entries for one name (splitted samples) use the identifier to submit
229     print '@INFO: Splitted samples: submit through identifier'
230     submit(job.identifier,repDict)
231     else: submit(job.name,repDict)
232 bortigno 1.10 else:
233 bortigno 1.11 for sample in samplesList:
234 bortigno 1.10 submit(sample,repDict)
235 peller 1.20
236 bortigno 1.30
237     elif( opts.task == 'split' ):
238     path = config.get("Directories","SPLITin")
239     samplesinfo = config.get("Directories","samplesinfo")
240 bortigno 1.32 repDict['job_id']=opts.nevents_split
241 bortigno 1.30 info = ParseInfo(samplesinfo,path)
242 bortigno 1.32 if ( opts.samples == "" ):
243 bortigno 1.30 for job in info:
244 bortigno 1.32 if (job.subsample): continue #avoid multiple submissions from subsamples
245 bortigno 1.30 submit(job.name,repDict)
246     else:
247     for sample in samplesList:
248     submit(sample,repDict)
249    
250     #BDT optimisation
251     elif opts.task == 'mva_opt':
252     total_number_of_steps=1
253     setting = ''
254     for par in (config.get('Optimisation','parameters').split(',')):
255     scan_par=eval(config.get('Optimisation',par))
256     setting+=par+'='+str(scan_par[0])+':'
257     if len(scan_par) > 1 and scan_par[2] != 0:
258     total_number_of_steps+=scan_par[2]
259     setting=setting[:-1] # eliminate last column at the end of the setting string
260     print setting
261     repDict['additional']=setting
262     repDict['job_id']=config.get('Optimisation','training')
263     submit('OPT_main_set',repDict)
264     main_setting=setting
265    
266     #Scanning all the parameters found in the training config in the Optimisation sector
267     for par in (config.get('Optimisation','parameters').split(',')):
268     scan_par=eval(config.get('Optimisation',par))
269     print par
270     if len(scan_par) > 1 and scan_par[2] != 0:
271     for step in range(scan_par[2]):
272     value = (scan_par[0])+((1+step)*(scan_par[1]-scan_par[0])/scan_par[2])
273     print value
274     setting=re.sub(par+'.*?:',par+'='+str(value)+':',main_setting)
275     repDict['additional']=setting
276     # repDict['job_id']=config.get('Optimisation','training')
277     submit('OPT_'+par+str(value),repDict)
278     # submit(config.get('Optimisation','training'),repDict)
279     print setting
280    
281    
282     os.system('qstat')
283     if (opts.philipp_love_progress_bars):
284     os.system('./qstat.py')