ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/CRAB/python/cms_cmssw.py
Revision: 1.27
Committed: Thu Jul 6 17:50:33 2006 UTC (18 years, 9 months ago) by spiga
Content type: text/x-python
Branch: MAIN
Changes since 1.26: +1 -2 lines
Log Message:
add manipulation VtxSmeared

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