ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/VHbb/python/submitThem.py
Revision: 1.39
Committed: Mon Apr 8 08:02:00 2013 UTC (12 years, 1 month ago) by peller
Content type: text/x-python
Branch: MAIN
CVS Tags: lhcp_UnblindFix, hcp_Unblind, lhcp_11April, LHCP_PreAppFixAfterFreeze, HEAD
Changes since 1.38: +37 -37 lines
Log Message:
set default to 8TeV

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 peller 1.39 parser.add_option("-T", "--tag", dest="tag", default="8TeV",
10 nmohr 1.6 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 peller 1.39 help="Mass for DC or Plots, 110...135")
15 bortigno 1.10 parser.add_option("-S","--samples",dest="samples",default="",
16 peller 1.39 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 peller 1.39 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.30 repDict = {'en':en,'logpath':logPath,'job':'','task':opts.task,'queue': 'all.q','timestamp':timestamp,'additional':'','job_id':''}
141 nmohr 1.6 def submit(job,repDict):
142 nmohr 1.34 global counter
143     repDict['job'] = job
144     nJob = counter % len(logo)
145     counter += 1
146     if opts.philipp_love_progress_bars:
147     repDict['name'] = '"%s"' %logo[nJob].strip()
148     else:
149     repDict['name'] = '%(job)s_%(en)s%(task)s' %repDict
150     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']
151     print command
152 bortigno 1.37 dump_config(configs,"%(logpath)s/%(timestamp)s_%(job)s_%(en)s_%(task)s.config" %(repDict))
153 nmohr 1.34 subprocess.call([command], shell=True)
154 nmohr 1.1
155 peller 1.29 if opts.task == 'train':
156     train_list = (config.get('MVALists','List_for_submitscript')).split(',')
157     print train_list
158     for item in train_list:
159     submit(item,repDict)
160    
161    
162 peller 1.9 if opts.task == 'dc':
163 peller 1.18 #DC_vars = config.items('Limit')
164     DC_vars= (config.get('LimitGeneral','List')).split(',')
165     print DC_vars
166    
167 peller 1.9 if opts.task == 'plot':
168 peller 1.15 Plot_vars= (config.get('Plot_general','List')).split(',')
169 peller 1.8
170 peller 1.12 if not opts.task == 'prep':
171     path = config.get("Directories","samplepath")
172 nmohr 1.21 samplesinfo = config.get("Directories","samplesinfo")
173 nmohr 1.27 info = ParseInfo(samplesinfo,path)
174 peller 1.8
175 peller 1.9 if opts.task == 'plot':
176 peller 1.23 repDict['queue'] = 'all.q'
177 peller 1.9 for item in Plot_vars:
178 peller 1.15 submit(item,repDict)
179 peller 1.9
180 nmohr 1.36 if opts.task == 'trainReg':
181     repDict['queue'] = 'all.q'
182     submit('trainReg',repDict)
183    
184 bortigno 1.30
185 peller 1.9 elif opts.task == 'dc':
186 nmohr 1.38 repDict['queue'] = 'all.q'
187 peller 1.9 for item in DC_vars:
188 peller 1.22 if 'ZH%s'%opts.mass in item:
189 peller 1.18 submit(item,repDict)
190 nmohr 1.38 elif opts.mass == 'all':
191 peller 1.18 submit(item,repDict)
192 peller 1.17
193 peller 1.9 elif opts.task == 'prep':
194 nmohr 1.33 if ( opts.samples == ""):
195     path = config.get("Directories","PREPin")
196     samplesinfo = config.get("Directories","samplesinfo")
197     info = ParseInfo(samplesinfo,path)
198     for job in info:
199     submit(job.name,repDict)
200 peller 1.9
201 nmohr 1.33 else:
202     for sample in samplesList:
203     submit(sample,repDict)
204 bortigno 1.30 elif opts.task == 'sys' or opts.task == 'syseval':
205     path = config.get("Directories","SYSin")
206     samplesinfo = config.get("Directories","samplesinfo")
207     info = ParseInfo(samplesinfo,path)
208 peller 1.39 if opts.samples == "":
209 bortigno 1.30 for job in info:
210 nmohr 1.34 if (job.subsample):
211     continue #avoid multiple submissions form subsamples
212     # TO FIX FOR SPLITTED SAMPLE
213 bortigno 1.30 submit(job.name,repDict)
214     else:
215     for sample in samplesList:
216     submit(sample,repDict)
217    
218     elif opts.task == 'eval':
219 nmohr 1.38 repDict['queue'] = 'long.q'
220 bortigno 1.30 path = config.get("Directories","MVAin")
221     samplesinfo = config.get("Directories","samplesinfo")
222     info = ParseInfo(samplesinfo,path)
223 peller 1.39 if opts.samples == "":
224 bortigno 1.10 for job in info:
225 nmohr 1.34 if (job.subsample):
226     continue #avoid multiple submissions from subsamples
227     if(info.checkSplittedSampleName(job.identifier)): # if multiple entries for one name (splitted samples) use the identifier to submit
228     print '@INFO: Splitted samples: submit through identifier'
229     submit(job.identifier,repDict)
230     else: submit(job.name,repDict)
231 bortigno 1.10 else:
232 bortigno 1.11 for sample in samplesList:
233 peller 1.39 print sample
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 peller 1.39 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 bortigno 1.30
281    
282     os.system('qstat')
283     if (opts.philipp_love_progress_bars):
284 peller 1.39 os.system('./qstat.py')