ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/CRAB/python/cms_cmssw.py
Revision: 1.16
Committed: Tue Jun 27 17:09:13 2006 UTC (18 years, 10 months ago) by slacapra
Content type: text/x-python
Branch: MAIN
Changes since 1.15: +4 -0 lines
Log Message:
fix bug if asked all events but more files per job than total available

File Contents

# User Rev Content
1 slacapra 1.1 from JobType import JobType
2     from crab_logger import Logger
3     from crab_exceptions import *
4     from crab_util import *
5     import common
6 gutsche 1.3 import PsetManipulator
7 slacapra 1.1
8 gutsche 1.3 import DBSInfo_EDM
9     import DataDiscovery_EDM
10     import DataLocation_EDM
11 slacapra 1.1 import Scram
12    
13     import os, string, re
14    
15     class Cmssw(JobType):
16     def __init__(self, cfg_params):
17     JobType.__init__(self, 'CMSSW')
18     common.logger.debug(3,'CMSSW::__init__')
19    
20     self.analisys_common_info = {}
21 gutsche 1.3 # Marco.
22     self._params = {}
23     self.cfg_params = cfg_params
24 slacapra 1.1 log = common.logger
25    
26     self.scram = Scram.Scram(cfg_params)
27     scramArea = ''
28     self.additional_inbox_files = []
29     self.scriptExe = ''
30     self.executable = ''
31     self.tgz_name = 'default.tgz'
32    
33 gutsche 1.3
34 slacapra 1.1 self.version = self.scram.getSWVersion()
35 gutsche 1.5 self.setParam_('application', self.version)
36 slacapra 1.1 common.analisys_common_info['sw_version'] = self.version
37 gutsche 1.3 ### FEDE
38     common.analisys_common_info['copy_input_data'] = 0
39     common.analisys_common_info['events_management'] = 1
40 slacapra 1.1
41     ### collect Data cards
42     try:
43 slacapra 1.9 tmp = cfg_params['CMSSW.datasetpath']
44     log.debug(6, "CMSSW::CMSSW(): datasetPath = "+tmp)
45     if string.lower(tmp)=='none':
46     self.datasetPath = None
47     else:
48     self.datasetPath = tmp
49 slacapra 1.1 except KeyError:
50 gutsche 1.3 msg = "Error: datasetpath not defined "
51 slacapra 1.1 raise CrabException(msg)
52 gutsche 1.5
53     # ML monitoring
54     # split dataset path style: /PreProdR3Minbias/SIM/GEN-SIM
55 slacapra 1.9 if not self.datasetPath:
56     self.setParam_('dataset', 'None')
57     self.setParam_('owner', 'None')
58     else:
59     datasetpath_split = self.datasetPath.split("/")
60     self.setParam_('dataset', datasetpath_split[1])
61     self.setParam_('owner', datasetpath_split[-1])
62    
63 gutsche 1.8 self.setTaskid_()
64     self.setParam_('taskId', self.cfg_params['taskId'])
65 gutsche 1.5
66 slacapra 1.1 self.dataTiers = []
67    
68     ## now the application
69     try:
70     self.executable = cfg_params['CMSSW.executable']
71 gutsche 1.5 self.setParam_('exe', self.executable)
72 slacapra 1.1 log.debug(6, "CMSSW::CMSSW(): executable = "+self.executable)
73     msg = "Default executable cmsRun overridden. Switch to " + self.executable
74     log.debug(3,msg)
75     except KeyError:
76     self.executable = 'cmsRun'
77 gutsche 1.5 self.setParam_('exe', self.executable)
78 slacapra 1.1 msg = "User executable not defined. Use cmsRun"
79     log.debug(3,msg)
80     pass
81    
82     try:
83     self.pset = cfg_params['CMSSW.pset']
84     log.debug(6, "Cmssw::Cmssw(): PSet file = "+self.pset)
85     if (not os.path.exists(self.pset)):
86     raise CrabException("User defined PSet file "+self.pset+" does not exist")
87     except KeyError:
88     raise CrabException("PSet file missing. Cannot run cmsRun ")
89    
90     # output files
91     try:
92     self.output_file = []
93    
94     tmp = cfg_params['CMSSW.output_file']
95     if tmp != '':
96     tmpOutFiles = string.split(cfg_params['CMSSW.output_file'],',')
97     log.debug(7, 'cmssw::cmssw(): output files '+str(tmpOutFiles))
98     for tmp in tmpOutFiles:
99     tmp=string.strip(tmp)
100     self.output_file.append(tmp)
101     pass
102     else:
103     log.message("No output file defined: only stdout/err will be available")
104     pass
105     pass
106     except KeyError:
107     log.message("No output file defined: only stdout/err will be available")
108     pass
109    
110     # script_exe file as additional file in inputSandbox
111     try:
112 slacapra 1.10 self.scriptExe = cfg_params['USER.script_exe']
113     self.additional_inbox_files.append(self.scriptExe)
114     if self.scriptExe != '':
115     if not os.path.isfile(self.scriptExe):
116     msg ="WARNING. file "+self.scriptExe+" not found"
117     raise CrabException(msg)
118 slacapra 1.1 except KeyError:
119     pass
120    
121     ## additional input files
122     try:
123     tmpAddFiles = string.split(cfg_params['CMSSW.additional_input_files'],',')
124     for tmp in tmpAddFiles:
125 gutsche 1.3 if not os.path.exists(tmp):
126     raise CrabException("Additional input file not found: "+tmp)
127 slacapra 1.1 tmp=string.strip(tmp)
128     self.additional_inbox_files.append(tmp)
129     pass
130     pass
131     except KeyError:
132     pass
133    
134 slacapra 1.9 # files per job
135 slacapra 1.1 try:
136 gutsche 1.3 self.filesPerJob = int(cfg_params['CMSSW.files_per_jobs']) #Daniele
137 slacapra 1.9 self.selectFilesPerJob = 1
138 gutsche 1.3 except KeyError:
139 slacapra 1.9 self.filesPerJob = 0
140     self.selectFilesPerJob = 0
141 gutsche 1.3
142 slacapra 1.9 ## Events per job
143 gutsche 1.3 try:
144 slacapra 1.10 self.eventsPerJob =int( cfg_params['CMSSW.events_per_job'])
145 slacapra 1.9 self.selectEventsPerJob = 1
146 gutsche 1.3 except KeyError:
147 slacapra 1.9 self.eventsPerJob = -1
148     self.selectEventsPerJob = 0
149    
150 slacapra 1.10 # To be implemented
151     # ## number of jobs
152     # try:
153     # self.numberOfJobs =int( cfg_params['CMSSW.number_of_job'])
154     # self.selectNumberOfJobs = 1
155     # except KeyError:
156     # self.selectNumberOfJobs = 0
157    
158 slacapra 1.9 if (self.selectFilesPerJob == self.selectEventsPerJob):
159 slacapra 1.10 msg = 'Must define either files_per_jobs or events_per_job'
160 slacapra 1.9 raise CrabException(msg)
161    
162 slacapra 1.10 if (self.selectEventsPerJob and not self.datasetPath == None):
163     msg = 'Splitting according to events_per_job available only with None as datasetpath'
164     raise CrabException(msg)
165    
166 gutsche 1.3 try:
167 slacapra 1.1 self.total_number_of_events = int(cfg_params['CMSSW.total_number_of_events'])
168     except KeyError:
169 gutsche 1.3 msg = 'Must define total_number_of_events'
170 slacapra 1.1 raise CrabException(msg)
171    
172     CEBlackList = []
173     try:
174     tmpBad = string.split(cfg_params['EDG.ce_black_list'],',')
175     for tmp in tmpBad:
176     tmp=string.strip(tmp)
177     CEBlackList.append(tmp)
178     except KeyError:
179     pass
180    
181     self.reCEBlackList=[]
182     for bad in CEBlackList:
183     self.reCEBlackList.append(re.compile( bad ))
184    
185     common.logger.debug(5,'CEBlackList: '+str(CEBlackList))
186    
187     CEWhiteList = []
188     try:
189     tmpGood = string.split(cfg_params['EDG.ce_white_list'],',')
190     for tmp in tmpGood:
191     tmp=string.strip(tmp)
192     CEWhiteList.append(tmp)
193     except KeyError:
194     pass
195    
196     #print 'CEWhiteList: ',CEWhiteList
197     self.reCEWhiteList=[]
198     for Good in CEWhiteList:
199     self.reCEWhiteList.append(re.compile( Good ))
200    
201     common.logger.debug(5,'CEWhiteList: '+str(CEWhiteList))
202    
203 gutsche 1.3 self.PsetEdit = PsetManipulator.PsetManipulator(self.pset) #Daniele Pset
204    
205 slacapra 1.1 #DBSDLS-start
206     ## Initialize the variables that are extracted from DBS/DLS and needed in other places of the code
207     self.maxEvents=0 # max events available ( --> check the requested nb. of evts in Creator.py)
208     self.DBSPaths={} # all dbs paths requested ( --> input to the site local discovery script)
209     ## Perform the data location and discovery (based on DBS/DLS)
210 slacapra 1.9 ## SL: Don't if NONE is specified as input (pythia use case)
211     common.analisys_common_info['sites']=None
212     if self.datasetPath:
213     self.DataDiscoveryAndLocation(cfg_params)
214 slacapra 1.1 #DBSDLS-end
215    
216     self.tgzNameWithPath = self.getTarBall(self.executable)
217    
218 slacapra 1.10 # modify Pset
219     if (self.datasetPath): # standard job
220     self.PsetEdit.maxEvent(self.eventsPerJob) #Daniele
221     self.PsetEdit.inputModule("INPUT") #Daniele
222    
223     else: # pythia like job
224     self.PsetEdit.maxEvent(self.eventsPerJob) #Daniele
225     self.PsetEdit.pythiaSeed("INPUT") #Daniele
226     try:
227     self.sourceSeed = int(cfg_params['CMSSW.pythia_seed'])
228     except KeyError:
229     self.sourceSeed = 123456
230     common.logger.message("No seed given, will use "+str(self.sourceSeed))
231    
232     self.PsetEdit.psetWriter(self.configFilename())
233    
234 slacapra 1.9 ## Select Splitting
235     if self.selectFilesPerJob: self.jobSplittingPerFiles()
236     elif self.selectEventsPerJob: self.jobSplittingPerEvents()
237     else:
238     msg = 'Don\'t know how to split...'
239     raise CrabException(msg)
240 gutsche 1.5
241 gutsche 1.3
242 slacapra 1.1 def DataDiscoveryAndLocation(self, cfg_params):
243    
244 gutsche 1.3 common.logger.debug(10,"CMSSW::DataDiscoveryAndLocation()")
245    
246     datasetPath=self.datasetPath
247    
248     ## TODO
249     dataTiersList = ""
250     dataTiers = dataTiersList.split(',')
251 slacapra 1.1
252     ## Contact the DBS
253     try:
254 afanfani 1.4 self.pubdata=DataDiscovery_EDM.DataDiscovery_EDM(datasetPath, dataTiers, cfg_params)
255 slacapra 1.1 self.pubdata.fetchDBSInfo()
256    
257 gutsche 1.3 except DataDiscovery_EDM.NotExistingDatasetError, ex :
258 slacapra 1.1 msg = 'ERROR ***: failed Data Discovery in DBS : %s'%ex.getErrorMessage()
259     raise CrabException(msg)
260    
261 gutsche 1.3 except DataDiscovery_EDM.NoDataTierinProvenanceError, ex :
262 slacapra 1.1 msg = 'ERROR ***: failed Data Discovery in DBS : %s'%ex.getErrorMessage()
263     raise CrabException(msg)
264 gutsche 1.3 except DataDiscovery_EDM.DataDiscoveryError, ex:
265 slacapra 1.1 msg = 'ERROR ***: failed Data Discovery in DBS %s'%ex.getErrorMessage()
266     raise CrabException(msg)
267    
268     ## get list of all required data in the form of dbs paths (dbs path = /dataset/datatier/owner)
269 gutsche 1.3 ## self.DBSPaths=self.pubdata.getDBSPaths()
270     common.logger.message("Required data are :"+self.datasetPath)
271    
272     filesbyblock=self.pubdata.getFiles()
273     self.AllInputFiles=filesbyblock.values()
274     self.files = self.AllInputFiles
275    
276     ## TEMP
277     # self.filesTmp = filesbyblock.values()
278     # self.files = []
279     # locPath='rfio:cmsbose2.bo.infn.it:/flatfiles/SE00/cms/fanfani/ProdTest/'
280     # locPath=''
281     # tmp = []
282     # for file in self.filesTmp[0]:
283     # tmp.append(locPath+file)
284     # self.files.append(tmp)
285     ## END TEMP
286 slacapra 1.1
287     ## get max number of events
288 gutsche 1.3 #common.logger.debug(10,"number of events for primary fileblocks %i"%self.pubdata.getMaxEvents())
289 slacapra 1.1 self.maxEvents=self.pubdata.getMaxEvents() ## self.maxEvents used in Creator.py
290     common.logger.message("\nThe number of available events is %s"%self.maxEvents)
291    
292     ## Contact the DLS and build a list of sites hosting the fileblocks
293     try:
294 gutsche 1.6 dataloc=DataLocation_EDM.DataLocation_EDM(filesbyblock.keys(),cfg_params)
295     dataloc.fetchDLSInfo()
296 gutsche 1.3 except DataLocation_EDM.DataLocationError , ex:
297 slacapra 1.1 msg = 'ERROR ***: failed Data Location in DLS \n %s '%ex.getErrorMessage()
298     raise CrabException(msg)
299    
300     allsites=dataloc.getSites()
301     common.logger.debug(5,"sites are %s"%allsites)
302     sites=self.checkBlackList(allsites)
303     common.logger.debug(5,"sites are (after black list) %s"%sites)
304     sites=self.checkWhiteList(sites)
305     common.logger.debug(5,"sites are (after white list) %s"%sites)
306    
307     if len(sites)==0:
308     msg = 'No sites hosting all the needed data! Exiting... '
309     raise CrabException(msg)
310 gutsche 1.3
311 slacapra 1.1 common.logger.message("List of Sites hosting the data : "+str(sites))
312     common.logger.debug(6, "List of Sites: "+str(sites))
313     common.analisys_common_info['sites']=sites ## used in SchedulerEdg.py in createSchScript
314 gutsche 1.5 self.setParam_('TargetCE', ','.join(sites))
315 slacapra 1.1 return
316 gutsche 1.3
317 slacapra 1.9 def jobSplittingPerFiles(self):
318     """
319     Perform job splitting based on number of files to be accessed per job
320 gutsche 1.3 """
321 slacapra 1.9 common.logger.debug(5,'Splitting per input files')
322 gutsche 1.3 common.logger.message('Required '+str(self.filesPerJob)+' files per job ')
323     common.logger.message('Required '+str(self.total_number_of_events)+' events in total ')
324    
325     ## TODO: SL need to have (from DBS) a detailed list of how many events per each file
326     n_tot_files = (len(self.files[0]))
327 fanzago 1.12 #print "n_tot_files = ", n_tot_files
328 gutsche 1.3 ## SL: this is wrong if the files have different number of events
329 fanzago 1.12 #print "self.maxEvents = ", self.maxEvents
330 gutsche 1.3 evPerFile = int(self.maxEvents)/n_tot_files
331 fanzago 1.12 #print "evPerFile = int(self.maxEvents)/n_tot_files = ", evPerFile
332    
333 gutsche 1.3 common.logger.debug(5,'Events per File '+str(evPerFile))
334    
335     ## if asked to process all events, do it
336     if self.total_number_of_events == -1:
337     self.total_number_of_events=self.maxEvents
338     self.total_number_of_jobs = int(n_tot_files)*1/int(self.filesPerJob)
339 slacapra 1.16 check = int(n_tot_files) - (int(self.total_number_of_jobs)*self.filesPerJob)
340     if check > 0:
341     self.total_number_of_jobs = self.total_number_of_jobs + 1
342     common.logger.message('Warning: last job will be created with '+str(check)+' files')
343 gutsche 1.3 common.logger.message(str(self.total_number_of_jobs)+' jobs will be created for all available events '+str(self.total_number_of_events)+' events')
344    
345     else:
346 fanzago 1.12 #print "self.total_number_of_events = ", self.total_number_of_events
347     #print "evPerFile = ", evPerFile
348 gutsche 1.3 self.total_number_of_files = int(self.total_number_of_events/evPerFile)
349 fanzago 1.12 #print "self.total_number_of_files = int(self.total_number_of_events/evPerFile) = " , self.total_number_of_files
350 slacapra 1.15
351     ## SL: round the number of files to be processed to the ceiling
352     rem = self.total_number_of_events - self.total_number_of_files*evPerFile
353     if rem>0:
354     self.total_number_of_files = self.total_number_of_files + 1
355    
356 gutsche 1.3 ## SL: if ask for less event than what is computed to be available on a
357     ## file, process the first file anyhow.
358     if self.total_number_of_files == 0:
359     self.total_number_of_files = self.total_number_of_files + 1
360 fanzago 1.12
361 gutsche 1.3
362     common.logger.debug(5,'N files '+str(self.total_number_of_files))
363    
364     check = 0
365    
366     ## Compute the number of jobs
367     #self.total_number_of_jobs = int(n_tot_files)*1/int(self.filesPerJob)
368 fanzago 1.12 #print "self.total_number_of_files = ", self.total_number_of_files
369     #print "self.filesPerJob = ", self.filesPerJob
370 gutsche 1.3 self.total_number_of_jobs = int(self.total_number_of_files/self.filesPerJob)
371 fanzago 1.12 #print "self.total_number_of_jobs = ", self.total_number_of_jobs
372 gutsche 1.3 common.logger.debug(5,'N jobs '+str(self.total_number_of_jobs))
373    
374     ## is there any remainder?
375     check = int(self.total_number_of_files) - (int(self.total_number_of_jobs)*self.filesPerJob)
376    
377     common.logger.debug(5,'Check '+str(check))
378    
379     if check > 0:
380     self.total_number_of_jobs = self.total_number_of_jobs + 1
381     common.logger.message('Warning: last job will be created with '+str(check)+' files')
382    
383 fanzago 1.12 #common.logger.message(str(self.total_number_of_jobs)+' jobs will be created for a total of '+str((self.total_number_of_jobs-1)*self.filesPerJob*evPerFile + check*evPerFile)+' events')
384 slacapra 1.15 common.logger.message(str(self.total_number_of_jobs)+' jobs will be created for a total of '+str((self.total_number_of_jobs-check)*self.filesPerJob*evPerFile + check*evPerFile)+' events')
385 gutsche 1.3 pass
386    
387     list_of_lists = []
388     for i in xrange(0, int(n_tot_files), self.filesPerJob):
389 slacapra 1.9 parString = "\\{"
390    
391     params = self.files[0][i: i+self.filesPerJob]
392     for i in range(len(params) - 1):
393     parString += '\\\"' + params[i] + '\\\"\,'
394    
395     parString += '\\\"' + params[len(params) - 1] + '\\\"\\}'
396     list_of_lists.append(parString)
397     pass
398    
399     self.list_of_args = list_of_lists
400 fanzago 1.11 #print self.list_of_args
401 slacapra 1.9 return
402    
403     def jobSplittingPerEvents(self):
404     """
405     Perform job splitting based on number of event per job
406     """
407     common.logger.debug(5,'Splitting per events')
408     common.logger.message('Required '+str(self.eventsPerJob)+' events per job ')
409     common.logger.message('Required '+str(self.total_number_of_events)+' events in total ')
410    
411 slacapra 1.10 if (self.total_number_of_events < 0):
412     msg='Cannot split jobs per Events with "-1" as total number of events'
413     raise CrabException(msg)
414    
415 slacapra 1.9 self.total_number_of_jobs = int(self.total_number_of_events/self.eventsPerJob)
416 fanzago 1.12
417     print "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
418     print "self.total_number_of_events = ", self.total_number_of_events
419     print "self.eventsPerJob = ", self.eventsPerJob
420     print "self.total_number_of_jobs = ", self.total_number_of_jobs
421     print "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
422 slacapra 1.9
423     common.logger.debug(5,'N jobs '+str(self.total_number_of_jobs))
424    
425     # is there any remainder?
426     check = int(self.total_number_of_events) - (int(self.total_number_of_jobs)*self.eventsPerJob)
427    
428     common.logger.debug(5,'Check '+str(check))
429    
430     if check > 0:
431     common.logger.message('Warning: asked '+self.total_number_of_events+' but will do only '+(int(self.total_number_of_jobs)*self.eventsPerJob))
432    
433     common.logger.message(str(self.total_number_of_jobs)+' jobs will be created for a total of '+str(self.total_number_of_jobs*self.eventsPerJob)+' events')
434    
435 slacapra 1.10 # argument is seed number.$i
436 slacapra 1.9 self.list_of_args = []
437     for i in range(self.total_number_of_jobs):
438 slacapra 1.10 self.list_of_args.append(int(str(self.sourceSeed)+str(i)))
439 slacapra 1.9 print self.list_of_args
440 gutsche 1.3
441     return
442    
443     def split(self, jobParams):
444    
445     common.jobDB.load()
446     #### Fabio
447     njobs = self.total_number_of_jobs
448 slacapra 1.9 arglist = self.list_of_args
449 gutsche 1.3 # create the empty structure
450     for i in range(njobs):
451     jobParams.append("")
452    
453     for job in range(njobs):
454 slacapra 1.9 jobParams[job] = str(arglist[job])
455 gutsche 1.3 common.jobDB.setArguments(job, jobParams[job])
456    
457     common.jobDB.save()
458     return
459    
460     def getJobTypeArguments(self, nj, sched):
461 slacapra 1.9 return common.jobDB.arguments(nj)
462 gutsche 1.3
463     def numberOfJobs(self):
464     # Fabio
465     return self.total_number_of_jobs
466    
467 slacapra 1.1 def checkBlackList(self, allSites):
468     if len(self.reCEBlackList)==0: return allSites
469     sites = []
470     for site in allSites:
471     common.logger.debug(10,'Site '+site)
472     good=1
473     for re in self.reCEBlackList:
474     if re.search(site):
475     common.logger.message('CE in black list, skipping site '+site)
476     good=0
477     pass
478     if good: sites.append(site)
479     if len(sites) == 0:
480     common.logger.debug(3,"No sites found after BlackList")
481     return sites
482    
483 gutsche 1.3 def checkWhiteList(self, allSites):
484 slacapra 1.1
485 gutsche 1.3 if len(self.reCEWhiteList)==0: return allSites
486 slacapra 1.1 sites = []
487 gutsche 1.3 for site in allSites:
488 slacapra 1.1 good=0
489     for re in self.reCEWhiteList:
490     if re.search(site):
491     common.logger.debug(5,'CE in white list, adding site '+site)
492     good=1
493     if not good: continue
494     sites.append(site)
495     if len(sites) == 0:
496     common.logger.message("No sites found after WhiteList\n")
497     else:
498     common.logger.debug(5,"Selected sites via WhiteList are "+str(sites)+"\n")
499     return sites
500    
501     def getTarBall(self, exe):
502     """
503     Return the TarBall with lib and exe
504     """
505    
506     # if it exist, just return it
507     self.tgzNameWithPath = common.work_space.shareDir()+self.tgz_name
508     if os.path.exists(self.tgzNameWithPath):
509     return self.tgzNameWithPath
510    
511     # Prepare a tar gzipped file with user binaries.
512     self.buildTar_(exe)
513    
514     return string.strip(self.tgzNameWithPath)
515    
516     def buildTar_(self, executable):
517    
518     # First of all declare the user Scram area
519     swArea = self.scram.getSWArea_()
520     #print "swArea = ", swArea
521     swVersion = self.scram.getSWVersion()
522     #print "swVersion = ", swVersion
523     swReleaseTop = self.scram.getReleaseTop_()
524     #print "swReleaseTop = ", swReleaseTop
525    
526     ## check if working area is release top
527     if swReleaseTop == '' or swArea == swReleaseTop:
528     return
529    
530     filesToBeTarred = []
531     ## First find the executable
532     if (self.executable != ''):
533     exeWithPath = self.scram.findFile_(executable)
534     # print exeWithPath
535     if ( not exeWithPath ):
536     raise CrabException('User executable '+executable+' not found')
537    
538     ## then check if it's private or not
539     if exeWithPath.find(swReleaseTop) == -1:
540     # the exe is private, so we must ship
541     common.logger.debug(5,"Exe "+exeWithPath+" to be tarred")
542     path = swArea+'/'
543     exe = string.replace(exeWithPath, path,'')
544     filesToBeTarred.append(exe)
545     pass
546     else:
547     # the exe is from release, we'll find it on WN
548     pass
549    
550     ## Now get the libraries: only those in local working area
551     libDir = 'lib'
552     lib = swArea+'/' +libDir
553     common.logger.debug(5,"lib "+lib+" to be tarred")
554     if os.path.exists(lib):
555     filesToBeTarred.append(libDir)
556    
557 gutsche 1.3 ## Now check if module dir is present
558     moduleDir = 'module'
559     if os.path.isdir(swArea+'/'+moduleDir):
560     filesToBeTarred.append(moduleDir)
561    
562 slacapra 1.1 ## Now check if the Data dir is present
563     dataDir = 'src/Data/'
564     if os.path.isdir(swArea+'/'+dataDir):
565     filesToBeTarred.append(dataDir)
566    
567     ## Create the tar-ball
568     if len(filesToBeTarred)>0:
569     cwd = os.getcwd()
570     os.chdir(swArea)
571     tarcmd = 'tar zcvf ' + self.tgzNameWithPath + ' '
572     for line in filesToBeTarred:
573     tarcmd = tarcmd + line + ' '
574     cout = runCommand(tarcmd)
575     if not cout:
576     raise CrabException('Could not create tar-ball')
577     os.chdir(cwd)
578     else:
579     common.logger.debug(5,"No files to be to be tarred")
580    
581     return
582    
583     def wsSetupEnvironment(self, nj):
584     """
585     Returns part of a job script which prepares
586     the execution environment for the job 'nj'.
587     """
588     # Prepare JobType-independent part
589 gutsche 1.3 txt = ''
590    
591     ## OLI_Daniele at this level middleware already known
592    
593     txt += 'if [ $middleware == LCG ]; then \n'
594     txt += self.wsSetupCMSLCGEnvironment_()
595     txt += 'elif [ $middleware == OSG ]; then\n'
596     txt += ' time=`date -u +"%s"`\n'
597     txt += ' WORKING_DIR=$OSG_WN_TMP/cms_$time\n'
598     txt += ' echo "Creating working directory: $WORKING_DIR"\n'
599     txt += ' /bin/mkdir -p $WORKING_DIR\n'
600     txt += ' if [ ! -d $WORKING_DIR ] ;then\n'
601 gutsche 1.7 txt += ' echo "SET_CMS_ENV 10016 ==> OSG $WORKING_DIR could not be created on WN `hostname`"\n'
602     txt += ' echo "JOB_EXIT_STATUS = 10016"\n'
603     txt += ' echo "JobExitCode=10016" | tee -a $RUNTIME_AREA/$repo\n'
604     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
605 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
606     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
607     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
608 gutsche 1.3 txt += ' exit 1\n'
609     txt += ' fi\n'
610     txt += '\n'
611     txt += ' echo "Change to working directory: $WORKING_DIR"\n'
612     txt += ' cd $WORKING_DIR\n'
613     txt += self.wsSetupCMSOSGEnvironment_()
614     txt += 'fi\n'
615 slacapra 1.1
616     # Prepare JobType-specific part
617     scram = self.scram.commandName()
618     txt += '\n\n'
619     txt += 'echo "### SPECIFIC JOB SETUP ENVIRONMENT ###"\n'
620     txt += scram+' project CMSSW '+self.version+'\n'
621     txt += 'status=$?\n'
622     txt += 'if [ $status != 0 ] ; then\n'
623 gutsche 1.7 txt += ' echo "SET_EXE_ENV 10034 ==>ERROR CMSSW '+self.version+' not found on `hostname`" \n'
624 gutsche 1.3 txt += ' echo "JOB_EXIT_STATUS = 10034"\n'
625 gutsche 1.7 txt += ' echo "JobExitCode=10034" | tee -a $RUNTIME_AREA/$repo\n'
626 slacapra 1.1 txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
627 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
628     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
629     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
630 gutsche 1.3 ## OLI_Daniele
631     txt += ' if [ $middleware == OSG ]; then \n'
632     txt += ' echo "Remove working directory: $WORKING_DIR"\n'
633     txt += ' cd $RUNTIME_AREA\n'
634     txt += ' /bin/rm -rf $WORKING_DIR\n'
635     txt += ' if [ -d $WORKING_DIR ] ;then\n'
636 gutsche 1.7 txt += ' echo "SET_CMS_ENV 10018 ==> OSG $WORKING_DIR could not be deleted on WN `hostname` after CMSSW CMSSW_0_6_1 not found on `hostname`"\n'
637     txt += ' echo "JOB_EXIT_STATUS = 10018"\n'
638     txt += ' echo "JobExitCode=10018" | tee -a $RUNTIME_AREA/$repo\n'
639     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
640 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
641     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
642     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
643 gutsche 1.3 txt += ' fi\n'
644     txt += ' fi \n'
645     txt += ' exit 1 \n'
646 slacapra 1.1 txt += 'fi \n'
647     txt += 'echo "CMSSW_VERSION = '+self.version+'"\n'
648     txt += 'cd '+self.version+'\n'
649     ### needed grep for bug in scramv1 ###
650     txt += 'eval `'+scram+' runtime -sh | grep -v SCRAMRT_LSB_JOBNAME`\n'
651    
652     # Handle the arguments:
653     txt += "\n"
654 gutsche 1.7 txt += "## number of arguments (first argument always jobnumber)\n"
655 slacapra 1.1 txt += "\n"
656     txt += "narg=$#\n"
657 gutsche 1.3 txt += "if [ $narg -lt 2 ]\n"
658 slacapra 1.1 txt += "then\n"
659     txt += " echo 'SET_EXE_ENV 1 ==> ERROR Too few arguments' +$narg+ \n"
660 gutsche 1.3 txt += ' echo "JOB_EXIT_STATUS = 50113"\n'
661 gutsche 1.7 txt += ' echo "JobExitCode=50113" | tee -a $RUNTIME_AREA/$repo\n'
662 slacapra 1.1 txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
663 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
664     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
665     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
666 gutsche 1.3 ## OLI_Daniele
667     txt += ' if [ $middleware == OSG ]; then \n'
668     txt += ' echo "Remove working directory: $WORKING_DIR"\n'
669     txt += ' cd $RUNTIME_AREA\n'
670     txt += ' /bin/rm -rf $WORKING_DIR\n'
671     txt += ' if [ -d $WORKING_DIR ] ;then\n'
672 gutsche 1.7 txt += ' echo "SET_EXE_ENV 50114 ==> OSG $WORKING_DIR could not be deleted on WN `hostname` after Too few arguments for CRAB job wrapper"\n'
673     txt += ' echo "JOB_EXIT_STATUS = 50114"\n'
674     txt += ' echo "JobExitCode=50114" | tee -a $RUNTIME_AREA/$repo\n'
675     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
676 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
677     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
678     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
679 gutsche 1.3 txt += ' fi\n'
680     txt += ' fi \n'
681 slacapra 1.1 txt += " exit 1\n"
682     txt += "fi\n"
683     txt += "\n"
684    
685     # Prepare job-specific part
686     job = common.job_list[nj]
687     pset = os.path.basename(job.configFilename())
688     txt += '\n'
689 slacapra 1.10 if (self.datasetPath): # standard job
690     txt += 'InputFiles=$2\n'
691     txt += 'echo "Inputfiles:<$InputFiles>"\n'
692     txt += 'sed "s#{\'INPUT\'}#$InputFiles#" $RUNTIME_AREA/'+pset+' > pset.cfg\n'
693     else: # pythia like job
694     txt += 'Seed=$2\n'
695     txt += 'echo "Seed: <$Seed>"\n'
696     txt += 'sed "s#INPUT#$Seed#" $RUNTIME_AREA/'+pset+' > pset.cfg\n'
697 slacapra 1.1
698     if len(self.additional_inbox_files) > 0:
699     for file in self.additional_inbox_files:
700     txt += 'if [ -e $RUNTIME_AREA/'+file+' ] ; then\n'
701     txt += ' cp $RUNTIME_AREA/'+file+' .\n'
702     txt += ' chmod +x '+file+'\n'
703     txt += 'fi\n'
704     pass
705    
706     txt += 'echo "### END JOB SETUP ENVIRONMENT ###"\n\n'
707    
708     txt += '\n'
709     txt += 'echo "***** cat pset.cfg *********"\n'
710     txt += 'cat pset.cfg\n'
711     txt += 'echo "****** end pset.cfg ********"\n'
712 gutsche 1.3 txt += '\n'
713     # txt += 'echo "***** cat pset1.cfg *********"\n'
714     # txt += 'cat pset1.cfg\n'
715     # txt += 'echo "****** end pset1.cfg ********"\n'
716     return txt
717    
718     def wsBuildExe(self, nj):
719     """
720     Put in the script the commands to build an executable
721     or a library.
722     """
723    
724     txt = ""
725    
726     if os.path.isfile(self.tgzNameWithPath):
727     txt += 'echo "tar xzvf $RUNTIME_AREA/'+os.path.basename(self.tgzNameWithPath)+'"\n'
728     txt += 'tar xzvf $RUNTIME_AREA/'+os.path.basename(self.tgzNameWithPath)+'\n'
729     txt += 'untar_status=$? \n'
730     txt += 'if [ $untar_status -ne 0 ]; then \n'
731     txt += ' echo "SET_EXE 1 ==> ERROR Untarring .tgz file failed"\n'
732     txt += ' echo "JOB_EXIT_STATUS = $untar_status" \n'
733 gutsche 1.7 txt += ' echo "JobExitCode=$untar_status" | tee -a $RUNTIME_AREA/$repo\n'
734 gutsche 1.3 txt += ' if [ $middleware == OSG ]; then \n'
735     txt += ' echo "Remove working directory: $WORKING_DIR"\n'
736     txt += ' cd $RUNTIME_AREA\n'
737     txt += ' /bin/rm -rf $WORKING_DIR\n'
738     txt += ' if [ -d $WORKING_DIR ] ;then\n'
739 gutsche 1.13 txt += ' echo "SET_EXE 50999 ==> OSG $WORKING_DIR could not be deleted on WN `hostname` after Untarring .tgz file failed"\n'
740     txt += ' echo "JOB_EXIT_STATUS = 50999"\n'
741     txt += ' echo "JobExitCode=50999" | tee -a $RUNTIME_AREA/$repo\n'
742     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
743     txt += ' rm -f $RUNTIME_AREA/$repo \n'
744     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
745     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
746 gutsche 1.3 txt += ' fi\n'
747     txt += ' fi \n'
748     txt += ' \n'
749 gutsche 1.7 txt += ' exit 1 \n'
750 gutsche 1.3 txt += 'else \n'
751     txt += ' echo "Successful untar" \n'
752     txt += 'fi \n'
753     pass
754    
755 slacapra 1.1 return txt
756    
757     def modifySteeringCards(self, nj):
758     """
759     modify the card provided by the user,
760     writing a new card into share dir
761     """
762    
763     def executableName(self):
764     return self.executable
765    
766     def executableArgs(self):
767 gutsche 1.3 return " -p pset.cfg"
768 slacapra 1.1
769     def inputSandbox(self, nj):
770     """
771     Returns a list of filenames to be put in JDL input sandbox.
772     """
773     inp_box = []
774     # dict added to delete duplicate from input sandbox file list
775     seen = {}
776     ## code
777     if os.path.isfile(self.tgzNameWithPath):
778     inp_box.append(self.tgzNameWithPath)
779     ## config
780     inp_box.append(common.job_list[nj].configFilename())
781     ## additional input files
782 gutsche 1.3 #for file in self.additional_inbox_files:
783     # inp_box.append(common.work_space.cwdDir()+file)
784 slacapra 1.1 return inp_box
785    
786     def outputSandbox(self, nj):
787     """
788     Returns a list of filenames to be put in JDL output sandbox.
789     """
790     out_box = []
791    
792     stdout=common.job_list[nj].stdout()
793     stderr=common.job_list[nj].stderr()
794    
795     ## User Declared output files
796     for out in self.output_file:
797     n_out = nj + 1
798     out_box.append(self.numberFile_(out,str(n_out)))
799     return out_box
800     return []
801    
802     def prepareSteeringCards(self):
803     """
804     Make initial modifications of the user's steering card file.
805     """
806     return
807    
808     def wsRenameOutput(self, nj):
809     """
810     Returns part of a job script which renames the produced files.
811     """
812    
813     txt = '\n'
814 gutsche 1.7 txt += '# directory content\n'
815     txt += 'ls \n'
816 slacapra 1.1 file_list = ''
817     for fileWithSuffix in self.output_file:
818     output_file_num = self.numberFile_(fileWithSuffix, '$NJob')
819 gutsche 1.7 file_list=file_list+output_file_num+' '
820 slacapra 1.1 txt += '\n'
821 gutsche 1.7 txt += '# check output file\n'
822 slacapra 1.1 txt += 'ls '+fileWithSuffix+'\n'
823     txt += 'exe_result=$?\n'
824     txt += 'if [ $exe_result -ne 0 ] ; then\n'
825     txt += ' echo "ERROR: No output file to manage"\n'
826 gutsche 1.7 txt += ' echo "JOB_EXIT_STATUS = $exe_result"\n'
827     txt += ' echo "JobExitCode=60302" | tee -a $RUNTIME_AREA/$repo\n'
828     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
829 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
830     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
831     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
832 gutsche 1.3 ### OLI_DANIELE
833 gutsche 1.7 if common.scheduler.boss_scheduler_name == 'condor_g':
834     txt += ' if [ $middleware == OSG ]; then \n'
835     txt += ' echo "prepare dummy output file"\n'
836     txt += ' echo "Processing of job output failed" > $RUNTIME_AREA/'+output_file_num+'\n'
837     txt += ' fi \n'
838 slacapra 1.1 txt += 'else\n'
839     txt += ' cp '+fileWithSuffix+' $RUNTIME_AREA/'+output_file_num+'\n'
840     txt += 'fi\n'
841    
842 gutsche 1.7 txt += 'cd $RUNTIME_AREA\n'
843 slacapra 1.1 file_list=file_list[:-1]
844 slacapra 1.2 txt += 'file_list="'+file_list+'"\n'
845 gutsche 1.3 ### OLI_DANIELE
846     txt += 'if [ $middleware == OSG ]; then\n'
847     txt += ' cd $RUNTIME_AREA\n'
848     txt += ' echo "Remove working directory: $WORKING_DIR"\n'
849     txt += ' /bin/rm -rf $WORKING_DIR\n'
850     txt += ' if [ -d $WORKING_DIR ] ;then\n'
851 gutsche 1.7 txt += ' echo "SET_EXE 60999 ==> OSG $WORKING_DIR could not be deleted on WN `hostname` after cleanup of WN"\n'
852     txt += ' echo "JOB_EXIT_STATUS = 60999"\n'
853     txt += ' echo "JobExitCode=60999" | tee -a $RUNTIME_AREA/$repo\n'
854     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
855 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
856     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
857     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
858 gutsche 1.3 txt += ' fi\n'
859     txt += 'fi\n'
860     txt += '\n'
861 slacapra 1.1 return txt
862    
863     def numberFile_(self, file, txt):
864     """
865     append _'txt' before last extension of a file
866     """
867     p = string.split(file,".")
868     # take away last extension
869     name = p[0]
870     for x in p[1:-1]:
871     name=name+"."+x
872     # add "_txt"
873     if len(p)>1:
874     ext = p[len(p)-1]
875     #result = name + '_' + str(txt) + "." + ext
876     result = name + '_' + txt + "." + ext
877     else:
878     #result = name + '_' + str(txt)
879     result = name + '_' + txt
880    
881     return result
882    
883     def getRequirements(self):
884     """
885     return job requirements to add to jdl files
886     """
887     req = ''
888 slacapra 1.10 if common.analisys_common_info['sw_version']:
889     req='Member("VO-cms-' + \
890     common.analisys_common_info['sw_version'] + \
891     '", other.GlueHostApplicationSoftwareRunTimeEnvironment)'
892 slacapra 1.1 if common.analisys_common_info['sites']:
893     if len(common.analisys_common_info['sites'])>0:
894     req = req + ' && ('
895     for i in range(len(common.analisys_common_info['sites'])):
896     req = req + 'other.GlueCEInfoHostName == "' \
897     + common.analisys_common_info['sites'][i] + '"'
898     if ( i < (int(len(common.analisys_common_info['sites']) - 1)) ):
899     req = req + ' || '
900     req = req + ')'
901     #print "req = ", req
902     return req
903 gutsche 1.3
904     def configFilename(self):
905     """ return the config filename """
906     return self.name()+'.cfg'
907    
908     ### OLI_DANIELE
909     def wsSetupCMSOSGEnvironment_(self):
910     """
911     Returns part of a job script which is prepares
912     the execution environment and which is common for all CMS jobs.
913     """
914     txt = '\n'
915     txt += ' echo "### SETUP CMS OSG ENVIRONMENT ###"\n'
916     txt += ' if [ -f $GRID3_APP_DIR/cmssoft/cmsset_default.sh ] ;then\n'
917     txt += ' # Use $GRID3_APP_DIR/cmssoft/cmsset_default.sh to setup cms software\n'
918     txt += ' source $GRID3_APP_DIR/cmssoft/cmsset_default.sh '+self.version+'\n'
919     txt += ' elif [ -f $OSG_APP/cmssoft/cmsset_default.sh ] ;then\n'
920     txt += ' # Use $OSG_APP/cmssoft/cmsset_default.sh to setup cms software\n'
921     txt += ' source $OSG_APP/cmssoft/cmsset_default.sh '+self.version+'\n'
922     txt += ' else\n'
923     txt += ' echo "SET_CMS_ENV 10020 ==> ERROR $GRID3_APP_DIR/cmssoft/cmsset_default.sh and $OSG_APP/cmssoft/cmsset_default.sh file not found"\n'
924     txt += ' echo "JOB_EXIT_STATUS = 10020"\n'
925     txt += ' echo "JobExitCode=10020" | tee -a $RUNTIME_AREA/$repo\n'
926     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
927 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
928     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
929     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
930 gutsche 1.7 txt += ' exit 1\n'
931 gutsche 1.3 txt += '\n'
932     txt += ' echo "Remove working directory: $WORKING_DIR"\n'
933     txt += ' cd $RUNTIME_AREA\n'
934     txt += ' /bin/rm -rf $WORKING_DIR\n'
935     txt += ' if [ -d $WORKING_DIR ] ;then\n'
936 gutsche 1.7 txt += ' echo "SET_CMS_ENV 10017 ==> OSG $WORKING_DIR could not be deleted on WN `hostname` after $GRID3_APP_DIR/cmssoft/cmsset_default.sh and $OSG_APP/cmssoft/cmsset_default.sh file not found"\n'
937     txt += ' echo "JOB_EXIT_STATUS = 10017"\n'
938     txt += ' echo "JobExitCode=10017" | tee -a $RUNTIME_AREA/$repo\n'
939     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
940 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
941     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
942     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
943 gutsche 1.3 txt += ' fi\n'
944     txt += '\n'
945 gutsche 1.7 txt += ' exit 1\n'
946 gutsche 1.3 txt += ' fi\n'
947     txt += '\n'
948     txt += ' echo "SET_CMS_ENV 0 ==> setup cms environment ok"\n'
949     txt += ' echo " END SETUP CMS OSG ENVIRONMENT "\n'
950    
951     return txt
952    
953     ### OLI_DANIELE
954     def wsSetupCMSLCGEnvironment_(self):
955     """
956     Returns part of a job script which is prepares
957     the execution environment and which is common for all CMS jobs.
958     """
959     txt = ' \n'
960     txt += ' echo " ### SETUP CMS LCG ENVIRONMENT ### "\n'
961     txt += ' if [ ! $VO_CMS_SW_DIR ] ;then\n'
962     txt += ' echo "SET_CMS_ENV 10031 ==> ERROR CMS software dir not found on WN `hostname`"\n'
963     txt += ' echo "JOB_EXIT_STATUS = 10031" \n'
964     txt += ' echo "JobExitCode=10031" | tee -a $RUNTIME_AREA/$repo\n'
965     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
966 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
967     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
968     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
969 gutsche 1.7 txt += ' exit 1\n'
970 gutsche 1.3 txt += ' else\n'
971     txt += ' echo "Sourcing environment... "\n'
972     txt += ' if [ ! -s $VO_CMS_SW_DIR/cmsset_default.sh ] ;then\n'
973     txt += ' echo "SET_CMS_ENV 10020 ==> ERROR cmsset_default.sh file not found into dir $VO_CMS_SW_DIR"\n'
974     txt += ' echo "JOB_EXIT_STATUS = 10020"\n'
975     txt += ' echo "JobExitCode=10020" | tee -a $RUNTIME_AREA/$repo\n'
976     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
977 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
978     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
979     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
980 gutsche 1.7 txt += ' exit 1\n'
981 gutsche 1.3 txt += ' fi\n'
982     txt += ' echo "sourcing $VO_CMS_SW_DIR/cmsset_default.sh"\n'
983     txt += ' source $VO_CMS_SW_DIR/cmsset_default.sh\n'
984     txt += ' result=$?\n'
985     txt += ' if [ $result -ne 0 ]; then\n'
986     txt += ' echo "SET_CMS_ENV 10032 ==> ERROR problem sourcing $VO_CMS_SW_DIR/cmsset_default.sh"\n'
987     txt += ' echo "JOB_EXIT_STATUS = 10032"\n'
988     txt += ' echo "JobExitCode=10032" | tee -a $RUNTIME_AREA/$repo\n'
989     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
990 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
991     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
992     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
993 gutsche 1.7 txt += ' exit 1\n'
994 gutsche 1.3 txt += ' fi\n'
995     txt += ' fi\n'
996     txt += ' \n'
997     txt += ' string=`cat /etc/redhat-release`\n'
998     txt += ' echo $string\n'
999     txt += ' if [[ $string = *alhalla* ]]; then\n'
1000     txt += ' echo "SCRAM_ARCH= $SCRAM_ARCH"\n'
1001     txt += ' elif [[ $string = *Enterprise* ]] || [[ $string = *cientific* ]]; then\n'
1002     txt += ' export SCRAM_ARCH=slc3_ia32_gcc323\n'
1003     txt += ' echo "SCRAM_ARCH= $SCRAM_ARCH"\n'
1004     txt += ' else\n'
1005 gutsche 1.7 txt += ' echo "SET_CMS_ENV 10033 ==> ERROR OS unknown, LCG environment not initialized"\n'
1006 gutsche 1.3 txt += ' echo "JOB_EXIT_STATUS = 10033"\n'
1007     txt += ' echo "JobExitCode=10033" | tee -a $RUNTIME_AREA/$repo\n'
1008     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
1009 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
1010     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
1011     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
1012 gutsche 1.7 txt += ' exit 1\n'
1013 gutsche 1.3 txt += ' fi\n'
1014     txt += ' echo "SET_CMS_ENV 0 ==> setup cms environment ok"\n'
1015     txt += ' echo "### END SETUP CMS LCG ENVIRONMENT ###"\n'
1016     return txt
1017 gutsche 1.5
1018     def setParam_(self, param, value):
1019     self._params[param] = value
1020    
1021     def getParams(self):
1022     return self._params
1023 gutsche 1.8
1024     def setTaskid_(self):
1025     self._taskId = self.cfg_params['taskId']
1026    
1027     def getTaskid(self):
1028     return self._taskId