257 def configureJob(self,jobnr,inputList=[]):
258 """Configure parameters for a single job and write job configuration files. If inputLIst
259 is given, this is the list of input files used for the job."""
260 if jobnr in self.jobs:
261 raise JobRunnerError ('Job number %s already configured' % jobnr)
262 jobConfig = { }
263
264 jobConfig['jobnr'] = jobnr
265 self.setParam('jobnr',jobnr)
266
267
268 if inputList:
269 jobConfig['inputfiles'] = inputList
270 else:
271 inputfiles = self.getParam('inputfiles')
272 iFirst = self.getParam('filesperjob')*jobnr
273 if iFirst >= len(inputfiles):
274 raise JobRunnerError ('Jobnr = %i too high for available number of files' % jobnr)
275 iLast = iFirst + self.getParam('filesperjob')
276 if iLast > len(inputfiles):
277 iLast=len(inputfiles)
278 jobConfig['inputfiles'] = inputfiles[iFirst:iLast]
279
280
281 for p in self.paramOrder:
282 if self.isSpecialParam(p): continue
283 value = self.getParam(p)
284 if isinstance(value,str):
285 jobConfig[p] = value % jobConfig
286 else:
287 jobConfig[p] = value
288
289
290 if jobConfig['setuprelease']:
291
292 jobConfig['cmdsetup'] = self.getParam('cmdsetup') % jobConfig
293
294 if not jobConfig['cmdsetup']:
295 jobConfig['cmdsetup'] = os.getenv('CMDSETUP','source /afs/cern.ch/atlas/software/dist/AtlasSetup/scripts/asetup.sh %(release)s --noautocdtest') % jobConfig
296 else:
297 jobConfig['cmdsetup'] = ''
298
299
300
301 jobConfig['cmdcopyfiles'] = self.getParam('cmdcopyfiles') % jobConfig
302 if not jobConfig['cmdcopyfiles']:
303 filestobecopied = ''
304 for p in self.paramToBeCopied:
305 if not jobConfig[p]: continue
306 filestobecopied = ' '.join([filestobecopied,jobConfig[p]])
307 jobConfig[p] = os.path.basename(jobConfig[p])
308 if filestobecopied:
309 jobConfig['cmdcopyfiles'] = 'cp -p '+filestobecopied+' .'
310
311
312
313 jobConfig['cmddefinepoolcatalog'] = self.getParam('cmddefinepoolcatalog') % jobConfig
314 if not jobConfig['cmddefinepoolcatalog']:
315 if jobConfig['addinputtopoolcatalog']:
316 argstring = ' '.join(jobConfig['filesforpoolcatalog']+jobConfig['inputfiles']) % jobConfig
317 else:
318 argstring = ' '.join(jobConfig['filesforpoolcatalog']) % jobConfig
319 if argstring:
320 jobConfig['cmddefinepoolcatalog'] = 'pool_insertFileToCatalog '+argstring
321
322
323 if jobConfig['returnstatuscode']:
324 jobConfig['cmdexit'] = self.getParam('cmdexit') % jobConfig
325 if not jobConfig['cmdexit']:
326 jobConfig['cmdexit'] = 'exit $status' % jobConfig
327 else:
328 jobConfig['cmdexit'] = ''
329
330
331 jobConfig['outputfilestring'] = ','.join([jobConfig['outputfileprefix']+f for f in jobConfig['outputfilelist']])
332
333
334 if jobConfig['taskpostprocsteps']:
335 jobConfig['doneflag'] = jobConfig['postprocflag']
336 else:
337 jobConfig['doneflag'] = jobConfig['completedflag']
338 jobConfig['script'] = self.getParam('script') % jobConfig
339
340
341
342
343 for f in jobConfig['outputfilelist']:
344 if os.access(jobConfig['outputfileprefix']+f,os.F_OK):
345 raise JobRunnerError ('Job output file %s exists already' % jobConfig[f])
346 for f in ('configfile', 'scriptfile', 'logfile'):
347 if os.access(jobConfig[f],os.F_OK):
348 raise JobRunnerError ('Job configuration or log file %s exists already' % jobConfig[f])
349
350
351 os.makedirs('%(jobdir)s' % jobConfig)
352
353
354 config = open(jobConfig['configfile'],'w')
355 config.write('# Job configuration data for job %(jobname)s\n' % jobConfig)
356 config.write('# Generated by JobRunner.py\n\n')
357 if pprint.isreadable(jobConfig):
358 config.write('jobConfig = '+pprint.pformat(jobConfig))
359 else:
360 config.write('jobConfig = '+repr(jobConfig))
361 config.write('\n')
362 config.close()
363
364
365 script = open(jobConfig['scriptfile'],'w')
366 script.write(jobConfig['script'])
367 script.close()
368 os.chmod(jobConfig['scriptfile'],0o755)
369
370
371 self.jobs[jobnr] = jobConfig
372
373