ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/CRAB/python/cms_cmssw.py
Revision: 1.105
Committed: Thu Jul 19 15:02:51 2007 UTC (17 years, 9 months ago) by slacapra
Content type: text/x-python
Branch: MAIN
Changes since 1.104: +20 -24 lines
Log Message:
add SCRAM_ARCH as requirement in jdl _only_ for SL4. Plus cosmetics

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     import Scram
7    
8 slacapra 1.105 import os, string, glob
9 slacapra 1.1
10     class Cmssw(JobType):
11 gutsche 1.38 def __init__(self, cfg_params, ncjobs):
12 slacapra 1.1 JobType.__init__(self, 'CMSSW')
13     common.logger.debug(3,'CMSSW::__init__')
14    
15 gutsche 1.3 self._params = {}
16     self.cfg_params = cfg_params
17 gutsche 1.38
18 gutsche 1.72 try:
19     self.MaxTarBallSize = float(self.cfg_params['EDG.maxtarballsize'])
20     except KeyError:
21 slacapra 1.86 self.MaxTarBallSize = 9.5
22 gutsche 1.72
23 gutsche 1.44 # number of jobs requested to be created, limit obj splitting
24 gutsche 1.38 self.ncjobs = ncjobs
25    
26 slacapra 1.1 log = common.logger
27    
28     self.scram = Scram.Scram(cfg_params)
29     self.additional_inbox_files = []
30     self.scriptExe = ''
31     self.executable = ''
32 slacapra 1.71 self.executable_arch = self.scram.getArch()
33 slacapra 1.1 self.tgz_name = 'default.tgz'
34 slacapra 1.97 self.additional_tgz_name = 'additional.tgz'
35 corvo 1.56 self.scriptName = 'CMSSW.sh'
36 spiga 1.42 self.pset = '' #scrip use case Da
37     self.datasetPath = '' #scrip use case Da
38 gutsche 1.3
39 gutsche 1.50 # set FJR file name
40     self.fjrFileName = 'crab_fjr.xml'
41    
42 slacapra 1.1 self.version = self.scram.getSWVersion()
43 slacapra 1.55 common.taskDB.setDict('codeVersion',self.version)
44 gutsche 1.5 self.setParam_('application', self.version)
45 slacapra 1.47
46 slacapra 1.1 ### collect Data cards
47 gutsche 1.66
48     ## get DBS mode
49     try:
50 slacapra 1.86 self.use_dbs_1 = int(self.cfg_params['CMSSW.use_dbs_1'])
51 gutsche 1.66 except KeyError:
52 slacapra 1.86 self.use_dbs_1 = 0
53 gutsche 1.66
54 slacapra 1.1 try:
55 slacapra 1.9 tmp = cfg_params['CMSSW.datasetpath']
56     log.debug(6, "CMSSW::CMSSW(): datasetPath = "+tmp)
57     if string.lower(tmp)=='none':
58     self.datasetPath = None
59 slacapra 1.21 self.selectNoInput = 1
60 slacapra 1.9 else:
61     self.datasetPath = tmp
62 slacapra 1.21 self.selectNoInput = 0
63 slacapra 1.1 except KeyError:
64 gutsche 1.3 msg = "Error: datasetpath not defined "
65 slacapra 1.1 raise CrabException(msg)
66 gutsche 1.5
67     # ML monitoring
68     # split dataset path style: /PreProdR3Minbias/SIM/GEN-SIM
69 slacapra 1.9 if not self.datasetPath:
70     self.setParam_('dataset', 'None')
71     self.setParam_('owner', 'None')
72     else:
73 gutsche 1.92 try:
74     datasetpath_split = self.datasetPath.split("/")
75     # standard style
76     if self.use_dbs_1 == 1 :
77     self.setParam_('dataset', datasetpath_split[1])
78     self.setParam_('owner', datasetpath_split[-1])
79     else:
80     self.setParam_('dataset', datasetpath_split[1])
81     self.setParam_('owner', datasetpath_split[2])
82     except:
83     self.setParam_('dataset', self.datasetPath)
84     self.setParam_('owner', self.datasetPath)
85    
86 gutsche 1.8 self.setTaskid_()
87     self.setParam_('taskId', self.cfg_params['taskId'])
88 gutsche 1.5
89 slacapra 1.1 self.dataTiers = []
90    
91     ## now the application
92     try:
93     self.executable = cfg_params['CMSSW.executable']
94 gutsche 1.5 self.setParam_('exe', self.executable)
95 slacapra 1.1 log.debug(6, "CMSSW::CMSSW(): executable = "+self.executable)
96     msg = "Default executable cmsRun overridden. Switch to " + self.executable
97     log.debug(3,msg)
98     except KeyError:
99     self.executable = 'cmsRun'
100 gutsche 1.5 self.setParam_('exe', self.executable)
101 slacapra 1.1 msg = "User executable not defined. Use cmsRun"
102     log.debug(3,msg)
103     pass
104    
105     try:
106     self.pset = cfg_params['CMSSW.pset']
107     log.debug(6, "Cmssw::Cmssw(): PSet file = "+self.pset)
108 spiga 1.42 if self.pset.lower() != 'none' :
109     if (not os.path.exists(self.pset)):
110     raise CrabException("User defined PSet file "+self.pset+" does not exist")
111     else:
112     self.pset = None
113 slacapra 1.1 except KeyError:
114     raise CrabException("PSet file missing. Cannot run cmsRun ")
115    
116     # output files
117 slacapra 1.53 ## stuff which must be returned always via sandbox
118     self.output_file_sandbox = []
119    
120     # add fjr report by default via sandbox
121     self.output_file_sandbox.append(self.fjrFileName)
122    
123     # other output files to be returned via sandbox or copied to SE
124 slacapra 1.1 try:
125     self.output_file = []
126     tmp = cfg_params['CMSSW.output_file']
127     if tmp != '':
128     tmpOutFiles = string.split(cfg_params['CMSSW.output_file'],',')
129     log.debug(7, 'cmssw::cmssw(): output files '+str(tmpOutFiles))
130     for tmp in tmpOutFiles:
131     tmp=string.strip(tmp)
132     self.output_file.append(tmp)
133     pass
134     else:
135 gutsche 1.92 log.message("No output file defined: only stdout/err and the CRAB Framework Job Report will be available\n")
136 slacapra 1.1 pass
137     pass
138     except KeyError:
139 gutsche 1.92 log.message("No output file defined: only stdout/err and the CRAB Framework Job Report will be available\n")
140 slacapra 1.1 pass
141    
142     # script_exe file as additional file in inputSandbox
143     try:
144 slacapra 1.10 self.scriptExe = cfg_params['USER.script_exe']
145     if self.scriptExe != '':
146     if not os.path.isfile(self.scriptExe):
147 slacapra 1.64 msg ="ERROR. file "+self.scriptExe+" not found"
148 slacapra 1.10 raise CrabException(msg)
149 spiga 1.42 self.additional_inbox_files.append(string.strip(self.scriptExe))
150 slacapra 1.1 except KeyError:
151 spiga 1.42 self.scriptExe = ''
152 slacapra 1.70
153 spiga 1.42 #CarlosDaniele
154     if self.datasetPath == None and self.pset == None and self.scriptExe == '' :
155 slacapra 1.70 msg ="Error. script_exe not defined"
156 spiga 1.42 raise CrabException(msg)
157    
158 slacapra 1.1 ## additional input files
159     try:
160 slacapra 1.29 tmpAddFiles = string.split(cfg_params['USER.additional_input_files'],',')
161 slacapra 1.70 for tmp in tmpAddFiles:
162     tmp = string.strip(tmp)
163     dirname = ''
164     if not tmp[0]=="/": dirname = "."
165 corvo 1.85 files = []
166     if string.find(tmp,"*")>-1:
167     files = glob.glob(os.path.join(dirname, tmp))
168     if len(files)==0:
169     raise CrabException("No additional input file found with this pattern: "+tmp)
170     else:
171     files.append(tmp)
172 slacapra 1.70 for file in files:
173     if not os.path.exists(file):
174     raise CrabException("Additional input file not found: "+file)
175 slacapra 1.45 pass
176 slacapra 1.105 # fname = string.split(file, '/')[-1]
177     # storedFile = common.work_space.pathForTgz()+'share/'+fname
178     # shutil.copyfile(file, storedFile)
179     self.additional_inbox_files.append(string.strip(file))
180 slacapra 1.1 pass
181     pass
182 slacapra 1.70 common.logger.debug(5,"Additional input files: "+str(self.additional_inbox_files))
183 slacapra 1.1 except KeyError:
184     pass
185    
186 slacapra 1.9 # files per job
187 slacapra 1.1 try:
188 gutsche 1.35 if (cfg_params['CMSSW.files_per_jobs']):
189     raise CrabException("files_per_jobs no longer supported. Quitting.")
190 gutsche 1.3 except KeyError:
191 gutsche 1.35 pass
192 gutsche 1.3
193 slacapra 1.9 ## Events per job
194 gutsche 1.3 try:
195 slacapra 1.10 self.eventsPerJob =int( cfg_params['CMSSW.events_per_job'])
196 slacapra 1.9 self.selectEventsPerJob = 1
197 gutsche 1.3 except KeyError:
198 slacapra 1.9 self.eventsPerJob = -1
199     self.selectEventsPerJob = 0
200    
201 slacapra 1.22 ## number of jobs
202     try:
203     self.theNumberOfJobs =int( cfg_params['CMSSW.number_of_jobs'])
204     self.selectNumberOfJobs = 1
205     except KeyError:
206     self.theNumberOfJobs = 0
207     self.selectNumberOfJobs = 0
208 slacapra 1.10
209 gutsche 1.35 try:
210     self.total_number_of_events = int(cfg_params['CMSSW.total_number_of_events'])
211     self.selectTotalNumberEvents = 1
212     except KeyError:
213     self.total_number_of_events = 0
214     self.selectTotalNumberEvents = 0
215    
216 spiga 1.42 if self.pset != None: #CarlosDaniele
217     if ( (self.selectTotalNumberEvents + self.selectEventsPerJob + self.selectNumberOfJobs) != 2 ):
218     msg = 'Must define exactly two of total_number_of_events, events_per_job, or number_of_jobs.'
219     raise CrabException(msg)
220     else:
221     if (self.selectNumberOfJobs == 0):
222     msg = 'Must specify number_of_jobs.'
223     raise CrabException(msg)
224 gutsche 1.35
225 slacapra 1.22 ## source seed for pythia
226     try:
227     self.sourceSeed = int(cfg_params['CMSSW.pythia_seed'])
228     except KeyError:
229 slacapra 1.23 self.sourceSeed = None
230     common.logger.debug(5,"No seed given")
231 slacapra 1.22
232 slacapra 1.28 try:
233     self.sourceSeedVtx = int(cfg_params['CMSSW.vtx_seed'])
234     except KeyError:
235     self.sourceSeedVtx = None
236     common.logger.debug(5,"No vertex seed given")
237 slacapra 1.90
238     try:
239     self.sourceSeedG4 = int(cfg_params['CMSSW.g4_seed'])
240     except KeyError:
241     self.sourceSeedG4 = None
242     common.logger.debug(5,"No g4 sim hits seed given")
243    
244     try:
245     self.sourceSeedMix = int(cfg_params['CMSSW.mix_seed'])
246     except KeyError:
247     self.sourceSeedMix = None
248     common.logger.debug(5,"No mix seed given")
249    
250 spiga 1.57 try:
251     self.firstRun = int(cfg_params['CMSSW.first_run'])
252     except KeyError:
253     self.firstRun = None
254     common.logger.debug(5,"No first run given")
255 spiga 1.42 if self.pset != None: #CarlosDaniele
256 slacapra 1.97 ver = string.split(self.version,"_")
257     if (int(ver[1])>=1 and int(ver[2])>=5):
258     import PsetManipulator150 as pp
259     else:
260     import PsetManipulator as pp
261     PsetEdit = pp.PsetManipulator(self.pset) #Daniele Pset
262 gutsche 1.3
263 slacapra 1.1 #DBSDLS-start
264     ## Initialize the variables that are extracted from DBS/DLS and needed in other places of the code
265     self.maxEvents=0 # max events available ( --> check the requested nb. of evts in Creator.py)
266     self.DBSPaths={} # all dbs paths requested ( --> input to the site local discovery script)
267 gutsche 1.35 self.jobDestination=[] # Site destination(s) for each job (list of lists)
268 slacapra 1.1 ## Perform the data location and discovery (based on DBS/DLS)
269 slacapra 1.9 ## SL: Don't if NONE is specified as input (pythia use case)
270 gutsche 1.35 blockSites = {}
271 slacapra 1.9 if self.datasetPath:
272 gutsche 1.35 blockSites = self.DataDiscoveryAndLocation(cfg_params)
273 slacapra 1.1 #DBSDLS-end
274    
275     self.tgzNameWithPath = self.getTarBall(self.executable)
276 slacapra 1.10
277 slacapra 1.9 ## Select Splitting
278 spiga 1.42 if self.selectNoInput:
279     if self.pset == None: #CarlosDaniele
280     self.jobSplittingForScript()
281     else:
282     self.jobSplittingNoInput()
283 gutsche 1.92 else:
284 corvo 1.56 self.jobSplittingByBlocks(blockSites)
285 gutsche 1.5
286 slacapra 1.22 # modify Pset
287 spiga 1.42 if self.pset != None: #CarlosDaniele
288 slacapra 1.86 try:
289     if (self.datasetPath): # standard job
290     # allow to processa a fraction of events in a file
291 slacapra 1.90 PsetEdit.inputModule("INPUT")
292     PsetEdit.maxEvent("INPUTMAXEVENTS")
293     PsetEdit.skipEvent("INPUTSKIPEVENTS")
294 slacapra 1.86 else: # pythia like job
295 slacapra 1.90 PsetEdit.maxEvent(self.eventsPerJob)
296 slacapra 1.86 if (self.firstRun):
297 slacapra 1.90 PsetEdit.pythiaFirstRun("INPUTFIRSTRUN") #First Run
298 slacapra 1.86 if (self.sourceSeed) :
299 slacapra 1.90 PsetEdit.pythiaSeed("INPUT")
300 slacapra 1.86 if (self.sourceSeedVtx) :
301 slacapra 1.90 PsetEdit.vtxSeed("INPUTVTX")
302     if (self.sourceSeedG4) :
303     self.PsetEdit.g4Seed("INPUTG4")
304     if (self.sourceSeedMix) :
305     self.PsetEdit.mixSeed("INPUTMIX")
306 slacapra 1.86 # add FrameworkJobReport to parameter-set
307 slacapra 1.90 PsetEdit.addCrabFJR(self.fjrFileName)
308     PsetEdit.psetWriter(self.configFilename())
309 slacapra 1.86 except:
310     msg='Error while manipuliating ParameterSet: exiting...'
311     raise CrabException(msg)
312 gutsche 1.3
313 slacapra 1.1 def DataDiscoveryAndLocation(self, cfg_params):
314    
315 slacapra 1.86 import DataDiscovery
316     import DataDiscovery_DBS2
317     import DataLocation
318 gutsche 1.3 common.logger.debug(10,"CMSSW::DataDiscoveryAndLocation()")
319    
320     datasetPath=self.datasetPath
321    
322 slacapra 1.1 ## Contact the DBS
323 gutsche 1.92 common.logger.message("Contacting Data Discovery Services ...")
324 slacapra 1.1 try:
325 gutsche 1.66
326 slacapra 1.86 if self.use_dbs_1 == 1 :
327     self.pubdata=DataDiscovery.DataDiscovery(datasetPath, cfg_params)
328     else :
329 corvo 1.85 self.pubdata=DataDiscovery_DBS2.DataDiscovery_DBS2(datasetPath, cfg_params)
330 slacapra 1.1 self.pubdata.fetchDBSInfo()
331    
332 slacapra 1.41 except DataDiscovery.NotExistingDatasetError, ex :
333 slacapra 1.1 msg = 'ERROR ***: failed Data Discovery in DBS : %s'%ex.getErrorMessage()
334     raise CrabException(msg)
335 slacapra 1.41 except DataDiscovery.NoDataTierinProvenanceError, ex :
336 slacapra 1.1 msg = 'ERROR ***: failed Data Discovery in DBS : %s'%ex.getErrorMessage()
337     raise CrabException(msg)
338 slacapra 1.41 except DataDiscovery.DataDiscoveryError, ex:
339 gutsche 1.66 msg = 'ERROR ***: failed Data Discovery in DBS : %s'%ex.getErrorMessage()
340 slacapra 1.1 raise CrabException(msg)
341 gutsche 1.67 except DataDiscovery_DBS2.NotExistingDatasetError_DBS2, ex :
342     msg = 'ERROR ***: failed Data Discovery in DBS : %s'%ex.getErrorMessage()
343     raise CrabException(msg)
344     except DataDiscovery_DBS2.NoDataTierinProvenanceError_DBS2, ex :
345     msg = 'ERROR ***: failed Data Discovery in DBS : %s'%ex.getErrorMessage()
346     raise CrabException(msg)
347     except DataDiscovery_DBS2.DataDiscoveryError_DBS2, ex:
348     msg = 'ERROR ***: failed Data Discovery in DBS : %s'%ex.getErrorMessage()
349     raise CrabException(msg)
350 slacapra 1.1
351 gutsche 1.35 self.filesbyblock=self.pubdata.getFiles()
352 mkirn 1.37 self.eventsbyblock=self.pubdata.getEventsPerBlock()
353     self.eventsbyfile=self.pubdata.getEventsPerFile()
354 gutsche 1.3
355 slacapra 1.1 ## get max number of events
356     self.maxEvents=self.pubdata.getMaxEvents() ## self.maxEvents used in Creator.py
357    
358     ## Contact the DLS and build a list of sites hosting the fileblocks
359     try:
360 slacapra 1.41 dataloc=DataLocation.DataLocation(self.filesbyblock.keys(),cfg_params)
361 gutsche 1.6 dataloc.fetchDLSInfo()
362 slacapra 1.41 except DataLocation.DataLocationError , ex:
363 slacapra 1.1 msg = 'ERROR ***: failed Data Location in DLS \n %s '%ex.getErrorMessage()
364     raise CrabException(msg)
365    
366    
367 gutsche 1.35 sites = dataloc.getSites()
368     allSites = []
369     listSites = sites.values()
370 slacapra 1.63 for listSite in listSites:
371     for oneSite in listSite:
372 gutsche 1.35 allSites.append(oneSite)
373     allSites = self.uniquelist(allSites)
374 gutsche 1.3
375 gutsche 1.92 # screen output
376     common.logger.message("Requested dataset: " + datasetPath + " has " + str(self.maxEvents) + " events in " + str(len(self.filesbyblock.keys())) + " blocks.\n")
377    
378 gutsche 1.35 return sites
379 gutsche 1.3
380 gutsche 1.35 def jobSplittingByBlocks(self, blockSites):
381 slacapra 1.9 """
382 gutsche 1.35 Perform job splitting. Jobs run over an integer number of files
383     and no more than one block.
384     ARGUMENT: blockSites: dictionary with blocks as keys and list of host sites as values
385     REQUIRES: self.selectTotalNumberEvents, self.selectEventsPerJob, self.selectNumberofJobs,
386     self.total_number_of_events, self.eventsPerJob, self.theNumberOfJobs,
387     self.maxEvents, self.filesbyblock
388     SETS: self.jobDestination - Site destination(s) for each job (a list of lists)
389     self.total_number_of_jobs - Total # of jobs
390     self.list_of_args - File(s) job will run on (a list of lists)
391     """
392    
393     # ---- Handle the possible job splitting configurations ---- #
394     if (self.selectTotalNumberEvents):
395     totalEventsRequested = self.total_number_of_events
396     if (self.selectEventsPerJob):
397     eventsPerJobRequested = self.eventsPerJob
398     if (self.selectNumberOfJobs):
399     totalEventsRequested = self.theNumberOfJobs * self.eventsPerJob
400    
401     # If user requested all the events in the dataset
402     if (totalEventsRequested == -1):
403     eventsRemaining=self.maxEvents
404     # If user requested more events than are in the dataset
405     elif (totalEventsRequested > self.maxEvents):
406     eventsRemaining = self.maxEvents
407     common.logger.message("Requested "+str(self.total_number_of_events)+ " events, but only "+str(self.maxEvents)+" events are available.")
408     # If user requested less events than are in the dataset
409     else:
410     eventsRemaining = totalEventsRequested
411 slacapra 1.22
412 slacapra 1.41 # If user requested more events per job than are in the dataset
413     if (self.selectEventsPerJob and eventsPerJobRequested > self.maxEvents):
414     eventsPerJobRequested = self.maxEvents
415    
416 gutsche 1.35 # For user info at end
417     totalEventCount = 0
418 gutsche 1.3
419 gutsche 1.35 if (self.selectTotalNumberEvents and self.selectNumberOfJobs):
420     eventsPerJobRequested = int(eventsRemaining/self.theNumberOfJobs)
421 slacapra 1.22
422 gutsche 1.35 if (self.selectNumberOfJobs):
423     common.logger.message("May not create the exact number_of_jobs requested.")
424 slacapra 1.23
425 gutsche 1.38 if ( self.ncjobs == 'all' ) :
426     totalNumberOfJobs = 999999999
427     else :
428     totalNumberOfJobs = self.ncjobs
429    
430    
431 gutsche 1.35 blocks = blockSites.keys()
432     blockCount = 0
433     # Backup variable in case self.maxEvents counted events in a non-included block
434     numBlocksInDataset = len(blocks)
435 gutsche 1.3
436 gutsche 1.35 jobCount = 0
437     list_of_lists = []
438 gutsche 1.3
439 gutsche 1.92 # list tracking which jobs are in which jobs belong to which block
440     jobsOfBlock = {}
441    
442 gutsche 1.35 # ---- Iterate over the blocks in the dataset until ---- #
443     # ---- we've met the requested total # of events ---- #
444 gutsche 1.38 while ( (eventsRemaining > 0) and (blockCount < numBlocksInDataset) and (jobCount < totalNumberOfJobs)):
445 gutsche 1.35 block = blocks[blockCount]
446 gutsche 1.44 blockCount += 1
447 gutsche 1.104 if block not in jobsOfBlock.keys() :
448     jobsOfBlock[block] = []
449 gutsche 1.44
450 gutsche 1.68 if self.eventsbyblock.has_key(block) :
451     numEventsInBlock = self.eventsbyblock[block]
452     common.logger.debug(5,'Events in Block File '+str(numEventsInBlock))
453 slacapra 1.9
454 gutsche 1.68 files = self.filesbyblock[block]
455     numFilesInBlock = len(files)
456     if (numFilesInBlock <= 0):
457     continue
458     fileCount = 0
459    
460     # ---- New block => New job ---- #
461     parString = "\\{"
462     # counter for number of events in files currently worked on
463     filesEventCount = 0
464     # flag if next while loop should touch new file
465     newFile = 1
466     # job event counter
467     jobSkipEventCount = 0
468 slacapra 1.9
469 gutsche 1.68 # ---- Iterate over the files in the block until we've met the requested ---- #
470     # ---- total # of events or we've gone over all the files in this block ---- #
471     while ( (eventsRemaining > 0) and (fileCount < numFilesInBlock) and (jobCount < totalNumberOfJobs) ):
472     file = files[fileCount]
473     if newFile :
474     try:
475     numEventsInFile = self.eventsbyfile[file]
476     common.logger.debug(6, "File "+str(file)+" has "+str(numEventsInFile)+" events")
477     # increase filesEventCount
478     filesEventCount += numEventsInFile
479     # Add file to current job
480     parString += '\\\"' + file + '\\\"\,'
481     newFile = 0
482     except KeyError:
483     common.logger.message("File "+str(file)+" has unknown number of events: skipping")
484 slacapra 1.41
485 gutsche 1.38
486 gutsche 1.68 # if less events in file remain than eventsPerJobRequested
487     if ( filesEventCount - jobSkipEventCount < eventsPerJobRequested ) :
488     # if last file in block
489     if ( fileCount == numFilesInBlock-1 ) :
490     # end job using last file, use remaining events in block
491     # close job and touch new file
492     fullString = parString[:-2]
493     fullString += '\\}'
494     list_of_lists.append([fullString,str(-1),str(jobSkipEventCount)])
495     common.logger.debug(3,"Job "+str(jobCount+1)+" can run over "+str(filesEventCount - jobSkipEventCount)+" events (last file in block).")
496     self.jobDestination.append(blockSites[block])
497     common.logger.debug(5,"Job "+str(jobCount+1)+" Destination: "+str(self.jobDestination[jobCount]))
498 gutsche 1.92 # fill jobs of block dictionary
499 gutsche 1.104 jobsOfBlock[block].append(jobCount+1)
500 gutsche 1.68 # reset counter
501     jobCount = jobCount + 1
502     totalEventCount = totalEventCount + filesEventCount - jobSkipEventCount
503     eventsRemaining = eventsRemaining - filesEventCount + jobSkipEventCount
504     jobSkipEventCount = 0
505     # reset file
506     parString = "\\{"
507     filesEventCount = 0
508     newFile = 1
509     fileCount += 1
510     else :
511     # go to next file
512     newFile = 1
513     fileCount += 1
514     # if events in file equal to eventsPerJobRequested
515     elif ( filesEventCount - jobSkipEventCount == eventsPerJobRequested ) :
516 gutsche 1.38 # close job and touch new file
517     fullString = parString[:-2]
518     fullString += '\\}'
519 gutsche 1.68 list_of_lists.append([fullString,str(eventsPerJobRequested),str(jobSkipEventCount)])
520     common.logger.debug(3,"Job "+str(jobCount+1)+" can run over "+str(eventsPerJobRequested)+" events.")
521 gutsche 1.38 self.jobDestination.append(blockSites[block])
522     common.logger.debug(5,"Job "+str(jobCount+1)+" Destination: "+str(self.jobDestination[jobCount]))
523 gutsche 1.104 jobsOfBlock[block].append(jobCount+1)
524 gutsche 1.38 # reset counter
525     jobCount = jobCount + 1
526 gutsche 1.68 totalEventCount = totalEventCount + eventsPerJobRequested
527     eventsRemaining = eventsRemaining - eventsPerJobRequested
528 gutsche 1.38 jobSkipEventCount = 0
529     # reset file
530     parString = "\\{"
531     filesEventCount = 0
532     newFile = 1
533     fileCount += 1
534 gutsche 1.68
535     # if more events in file remain than eventsPerJobRequested
536 gutsche 1.38 else :
537 gutsche 1.68 # close job but don't touch new file
538     fullString = parString[:-2]
539     fullString += '\\}'
540     list_of_lists.append([fullString,str(eventsPerJobRequested),str(jobSkipEventCount)])
541     common.logger.debug(3,"Job "+str(jobCount+1)+" can run over "+str(eventsPerJobRequested)+" events.")
542     self.jobDestination.append(blockSites[block])
543     common.logger.debug(5,"Job "+str(jobCount+1)+" Destination: "+str(self.jobDestination[jobCount]))
544 gutsche 1.104 jobsOfBlock[block].append(jobCount+1)
545 gutsche 1.68 # increase counter
546     jobCount = jobCount + 1
547     totalEventCount = totalEventCount + eventsPerJobRequested
548     eventsRemaining = eventsRemaining - eventsPerJobRequested
549     # calculate skip events for last file
550     # use filesEventCount (contains several files), jobSkipEventCount and eventsPerJobRequest
551     jobSkipEventCount = eventsPerJobRequested - (filesEventCount - jobSkipEventCount - self.eventsbyfile[file])
552     # remove all but the last file
553     filesEventCount = self.eventsbyfile[file]
554     parString = "\\{"
555     parString += '\\\"' + file + '\\\"\,'
556     pass # END if
557     pass # END while (iterate over files in the block)
558 gutsche 1.35 pass # END while (iterate over blocks in the dataset)
559 slacapra 1.41 self.ncjobs = self.total_number_of_jobs = jobCount
560 gutsche 1.38 if (eventsRemaining > 0 and jobCount < totalNumberOfJobs ):
561 gutsche 1.35 common.logger.message("Could not run on all requested events because some blocks not hosted at allowed sites.")
562 gutsche 1.92 common.logger.message(str(jobCount)+" job(s) can run on "+str(totalEventCount)+" events.\n")
563 slacapra 1.22
564 gutsche 1.92 # screen output
565     screenOutput = "List of jobs and available destination sites:\n\n"
566    
567     blockCounter = 0
568 gutsche 1.104 for block in blocks:
569     if block in jobsOfBlock.keys() :
570     blockCounter += 1
571     screenOutput += "Block %5i: jobs %20s: sites: %s\n" % (blockCounter,spanRanges(jobsOfBlock[block]),','.join(blockSites[block]))
572 gutsche 1.92
573     common.logger.message(screenOutput)
574    
575 slacapra 1.9 self.list_of_args = list_of_lists
576     return
577    
578 slacapra 1.21 def jobSplittingNoInput(self):
579 slacapra 1.9 """
580     Perform job splitting based on number of event per job
581     """
582     common.logger.debug(5,'Splitting per events')
583     common.logger.message('Required '+str(self.eventsPerJob)+' events per job ')
584 slacapra 1.22 common.logger.message('Required '+str(self.theNumberOfJobs)+' jobs in total ')
585 slacapra 1.9 common.logger.message('Required '+str(self.total_number_of_events)+' events in total ')
586    
587 slacapra 1.10 if (self.total_number_of_events < 0):
588     msg='Cannot split jobs per Events with "-1" as total number of events'
589     raise CrabException(msg)
590    
591 slacapra 1.22 if (self.selectEventsPerJob):
592 spiga 1.65 if (self.selectTotalNumberEvents):
593     self.total_number_of_jobs = int(self.total_number_of_events/self.eventsPerJob)
594     elif(self.selectNumberOfJobs) :
595     self.total_number_of_jobs =self.theNumberOfJobs
596     self.total_number_of_events =int(self.theNumberOfJobs*self.eventsPerJob)
597    
598 slacapra 1.22 elif (self.selectNumberOfJobs) :
599     self.total_number_of_jobs = self.theNumberOfJobs
600     self.eventsPerJob = int(self.total_number_of_events/self.total_number_of_jobs)
601 spiga 1.65
602 slacapra 1.9 common.logger.debug(5,'N jobs '+str(self.total_number_of_jobs))
603    
604     # is there any remainder?
605     check = int(self.total_number_of_events) - (int(self.total_number_of_jobs)*self.eventsPerJob)
606    
607     common.logger.debug(5,'Check '+str(check))
608    
609 gutsche 1.35 common.logger.message(str(self.total_number_of_jobs)+' jobs can be created, each for '+str(self.eventsPerJob)+' for a total of '+str(self.total_number_of_jobs*self.eventsPerJob)+' events')
610 slacapra 1.9 if check > 0:
611 gutsche 1.35 common.logger.message('Warning: asked '+str(self.total_number_of_events)+' but can do only '+str(int(self.total_number_of_jobs)*self.eventsPerJob))
612 slacapra 1.9
613 slacapra 1.10 # argument is seed number.$i
614 slacapra 1.9 self.list_of_args = []
615     for i in range(self.total_number_of_jobs):
616 gutsche 1.35 ## Since there is no input, any site is good
617 slacapra 1.86 # self.jobDestination.append(["Any"])
618 spiga 1.42 self.jobDestination.append([""]) #must be empty to write correctly the xml
619 slacapra 1.90 args=[]
620 spiga 1.57 if (self.firstRun):
621     ## pythia first run
622 slacapra 1.86 #self.list_of_args.append([(str(self.firstRun)+str(i))])
623 slacapra 1.90 args.append(str(self.firstRun)+str(i))
624 spiga 1.57 else:
625     ## no first run
626 slacapra 1.86 #self.list_of_args.append([str(i)])
627 slacapra 1.90 args.append(str(i))
628 slacapra 1.23 if (self.sourceSeed):
629 slacapra 1.90 args.append(str(self.sourceSeed)+str(i))
630 slacapra 1.28 if (self.sourceSeedVtx):
631 slacapra 1.90 ## + vtx random seed
632     args.append(str(self.sourceSeedVtx)+str(i))
633     if (self.sourceSeedG4):
634     ## + G4 random seed
635     args.append(str(self.sourceSeedG4)+str(i))
636     if (self.sourceSeedMix):
637     ## + Mix random seed
638     args.append(str(self.sourceSeedMix)+str(i))
639     pass
640     pass
641     self.list_of_args.append(args)
642     pass
643 slacapra 1.86
644 slacapra 1.90 # print self.list_of_args
645 gutsche 1.3
646     return
647    
648 spiga 1.42
649     def jobSplittingForScript(self):#CarlosDaniele
650     """
651     Perform job splitting based on number of job
652     """
653     common.logger.debug(5,'Splitting per job')
654     common.logger.message('Required '+str(self.theNumberOfJobs)+' jobs in total ')
655    
656     self.total_number_of_jobs = self.theNumberOfJobs
657    
658     common.logger.debug(5,'N jobs '+str(self.total_number_of_jobs))
659    
660     common.logger.message(str(self.total_number_of_jobs)+' jobs can be created')
661    
662     # argument is seed number.$i
663     self.list_of_args = []
664     for i in range(self.total_number_of_jobs):
665     ## Since there is no input, any site is good
666     # self.jobDestination.append(["Any"])
667     self.jobDestination.append([""])
668     ## no random seed
669     self.list_of_args.append([str(i)])
670     return
671    
672 gutsche 1.3 def split(self, jobParams):
673    
674     common.jobDB.load()
675     #### Fabio
676     njobs = self.total_number_of_jobs
677 slacapra 1.9 arglist = self.list_of_args
678 gutsche 1.3 # create the empty structure
679     for i in range(njobs):
680     jobParams.append("")
681    
682     for job in range(njobs):
683 slacapra 1.17 jobParams[job] = arglist[job]
684     # print str(arglist[job])
685     # print jobParams[job]
686 gutsche 1.3 common.jobDB.setArguments(job, jobParams[job])
687 gutsche 1.35 common.logger.debug(5,"Job "+str(job)+" Destination: "+str(self.jobDestination[job]))
688     common.jobDB.setDestination(job, self.jobDestination[job])
689 gutsche 1.3
690     common.jobDB.save()
691     return
692    
693     def getJobTypeArguments(self, nj, sched):
694 slacapra 1.17 result = ''
695     for i in common.jobDB.arguments(nj):
696     result=result+str(i)+" "
697     return result
698 gutsche 1.3
699     def numberOfJobs(self):
700     # Fabio
701     return self.total_number_of_jobs
702    
703 slacapra 1.1 def getTarBall(self, exe):
704     """
705     Return the TarBall with lib and exe
706     """
707    
708     # if it exist, just return it
709 corvo 1.56 #
710     # Marco. Let's start to use relative path for Boss XML files
711     #
712     self.tgzNameWithPath = common.work_space.pathForTgz()+'share/'+self.tgz_name
713 slacapra 1.1 if os.path.exists(self.tgzNameWithPath):
714     return self.tgzNameWithPath
715    
716     # Prepare a tar gzipped file with user binaries.
717     self.buildTar_(exe)
718    
719     return string.strip(self.tgzNameWithPath)
720    
721     def buildTar_(self, executable):
722    
723     # First of all declare the user Scram area
724     swArea = self.scram.getSWArea_()
725     #print "swArea = ", swArea
726 slacapra 1.63 # swVersion = self.scram.getSWVersion()
727     # print "swVersion = ", swVersion
728 slacapra 1.1 swReleaseTop = self.scram.getReleaseTop_()
729     #print "swReleaseTop = ", swReleaseTop
730    
731     ## check if working area is release top
732     if swReleaseTop == '' or swArea == swReleaseTop:
733     return
734    
735 slacapra 1.61 import tarfile
736     try: # create tar ball
737     tar = tarfile.open(self.tgzNameWithPath, "w:gz")
738     ## First find the executable
739 slacapra 1.86 if (self.executable != ''):
740 slacapra 1.61 exeWithPath = self.scram.findFile_(executable)
741     if ( not exeWithPath ):
742     raise CrabException('User executable '+executable+' not found')
743    
744     ## then check if it's private or not
745     if exeWithPath.find(swReleaseTop) == -1:
746     # the exe is private, so we must ship
747     common.logger.debug(5,"Exe "+exeWithPath+" to be tarred")
748     path = swArea+'/'
749 corvo 1.85 # distinguish case when script is in user project area or given by full path somewhere else
750     if exeWithPath.find(path) >= 0 :
751     exe = string.replace(exeWithPath, path,'')
752     tar.add(path+exe,os.path.basename(executable))
753     else :
754     tar.add(exeWithPath,os.path.basename(executable))
755 slacapra 1.61 pass
756     else:
757     # the exe is from release, we'll find it on WN
758     pass
759    
760     ## Now get the libraries: only those in local working area
761     libDir = 'lib'
762     lib = swArea+'/' +libDir
763     common.logger.debug(5,"lib "+lib+" to be tarred")
764     if os.path.exists(lib):
765     tar.add(lib,libDir)
766    
767     ## Now check if module dir is present
768     moduleDir = 'module'
769     module = swArea + '/' + moduleDir
770     if os.path.isdir(module):
771     tar.add(module,moduleDir)
772    
773     ## Now check if any data dir(s) is present
774     swAreaLen=len(swArea)
775     for root, dirs, files in os.walk(swArea):
776     if "data" in dirs:
777     common.logger.debug(5,"data "+root+"/data"+" to be tarred")
778     tar.add(root+"/data",root[swAreaLen:]+"/data")
779    
780     ## Add ProdAgent dir to tar
781     paDir = 'ProdAgentApi'
782     pa = os.environ['CRABDIR'] + '/' + 'ProdAgentApi'
783     if os.path.isdir(pa):
784     tar.add(pa,paDir)
785 fanzago 1.93
786     ### FEDE FOR DBS PUBLICATION
787     ## Add PRODCOMMON dir to tar
788     prodcommonDir = 'ProdCommon'
789     prodcommonPath = os.environ['CRABDIR'] + '/' + 'ProdCommon'
790     if os.path.isdir(prodcommonPath):
791     tar.add(prodcommonPath,prodcommonDir)
792     #############################
793 slacapra 1.61
794     common.logger.debug(5,"Files added to "+self.tgzNameWithPath+" : "+str(tar.getnames()))
795     tar.close()
796     except :
797     raise CrabException('Could not create tar-ball')
798 gutsche 1.72
799     ## check for tarball size
800     tarballinfo = os.stat(self.tgzNameWithPath)
801     if ( tarballinfo.st_size > self.MaxTarBallSize*1024*1024 ) :
802     raise CrabException('Input sandbox size of ' + str(float(tarballinfo.st_size)/1024.0/1024.0) + ' MB is larger than the allowed ' + str(self.MaxTarBallSize) + ' MB input sandbox limit and not supported by the used GRID submission system. Please make sure that no unnecessary files are in all data directories in your local CMSSW project area as they are automatically packed into the input sandbox.')
803    
804 slacapra 1.61 ## create tar-ball with ML stuff
805 corvo 1.58 self.MLtgzfile = common.work_space.pathForTgz()+'share/MLfiles.tgz'
806 slacapra 1.61 try:
807     tar = tarfile.open(self.MLtgzfile, "w:gz")
808     path=os.environ['CRABDIR'] + '/python/'
809     for file in ['report.py', 'DashboardAPI.py', 'Logger.py', 'ProcInfo.py', 'apmon.py', 'parseCrabFjr.py']:
810     tar.add(path+file,file)
811     common.logger.debug(5,"Files added to "+self.MLtgzfile+" : "+str(tar.getnames()))
812     tar.close()
813     except :
814 corvo 1.58 raise CrabException('Could not create ML files tar-ball')
815    
816 slacapra 1.1 return
817    
818 slacapra 1.97 def additionalInputFileTgz(self):
819     """
820     Put all additional files into a tar ball and return its name
821     """
822     import tarfile
823     tarName= common.work_space.pathForTgz()+'share/'+self.additional_tgz_name
824     tar = tarfile.open(tarName, "w:gz")
825     for file in self.additional_inbox_files:
826     tar.add(file,string.split(file,'/')[-1])
827     common.logger.debug(5,"Files added to "+self.additional_tgz_name+" : "+str(tar.getnames()))
828     tar.close()
829     return tarName
830    
831 slacapra 1.1 def wsSetupEnvironment(self, nj):
832     """
833     Returns part of a job script which prepares
834     the execution environment for the job 'nj'.
835     """
836     # Prepare JobType-independent part
837 gutsche 1.3 txt = ''
838    
839     ## OLI_Daniele at this level middleware already known
840    
841 spiga 1.102 txt += 'echo "### Firtst set SCRAM ARCH and BUILD_ARCH ###"\n'
842     txt += 'echo "Setting SCRAM_ARCH='+self.executable_arch+'"\n'
843     txt += 'export SCRAM_ARCH='+self.executable_arch+'\n'
844     txt += 'export BUILD_ARCH='+self.executable_arch+'\n'
845 gutsche 1.3 txt += 'if [ $middleware == LCG ]; then \n'
846     txt += self.wsSetupCMSLCGEnvironment_()
847     txt += 'elif [ $middleware == OSG ]; then\n'
848 gutsche 1.43 txt += ' WORKING_DIR=`/bin/mktemp -d $OSG_WN_TMP/cms_XXXXXXXXXXXX`\n'
849     txt += ' echo "Created working directory: $WORKING_DIR"\n'
850 gutsche 1.3 txt += ' if [ ! -d $WORKING_DIR ] ;then\n'
851 gutsche 1.7 txt += ' echo "SET_CMS_ENV 10016 ==> OSG $WORKING_DIR could not be created on WN `hostname`"\n'
852 slacapra 1.90 txt += ' echo "JOB_EXIT_STATUS = 10016"\n'
853     txt += ' echo "JobExitCode=10016" | 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 += ' exit 1\n'
859     txt += ' fi\n'
860     txt += '\n'
861     txt += ' echo "Change to working directory: $WORKING_DIR"\n'
862     txt += ' cd $WORKING_DIR\n'
863     txt += self.wsSetupCMSOSGEnvironment_()
864     txt += 'fi\n'
865 slacapra 1.1
866     # Prepare JobType-specific part
867     scram = self.scram.commandName()
868     txt += '\n\n'
869     txt += 'echo "### SPECIFIC JOB SETUP ENVIRONMENT ###"\n'
870     txt += scram+' project CMSSW '+self.version+'\n'
871     txt += 'status=$?\n'
872     txt += 'if [ $status != 0 ] ; then\n'
873 gutsche 1.7 txt += ' echo "SET_EXE_ENV 10034 ==>ERROR CMSSW '+self.version+' not found on `hostname`" \n'
874 gutsche 1.3 txt += ' echo "JOB_EXIT_STATUS = 10034"\n'
875 gutsche 1.7 txt += ' echo "JobExitCode=10034" | tee -a $RUNTIME_AREA/$repo\n'
876 slacapra 1.1 txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
877 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
878     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
879     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
880 gutsche 1.3 ## OLI_Daniele
881     txt += ' if [ $middleware == OSG ]; then \n'
882     txt += ' echo "Remove working directory: $WORKING_DIR"\n'
883     txt += ' cd $RUNTIME_AREA\n'
884     txt += ' /bin/rm -rf $WORKING_DIR\n'
885     txt += ' if [ -d $WORKING_DIR ] ;then\n'
886 fanzago 1.96 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'
887     txt += ' echo "JOB_EXIT_STATUS = 10018"\n'
888     txt += ' echo "JobExitCode=10018" | tee -a $RUNTIME_AREA/$repo\n'
889     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
890 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
891     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
892     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
893 gutsche 1.3 txt += ' fi\n'
894     txt += ' fi \n'
895     txt += ' exit 1 \n'
896 slacapra 1.1 txt += 'fi \n'
897     txt += 'echo "CMSSW_VERSION = '+self.version+'"\n'
898     txt += 'cd '+self.version+'\n'
899 fanzago 1.99 ########## FEDE FOR DBS2 ######################
900     txt += 'SOFTWARE_DIR=`pwd`\n'
901     txt += 'echo SOFTWARE_DIR=$SOFTWARE_DIR \n'
902     ###############################################
903 slacapra 1.1 ### needed grep for bug in scramv1 ###
904 corvo 1.58 txt += scram+' runtime -sh\n'
905 slacapra 1.1 txt += 'eval `'+scram+' runtime -sh | grep -v SCRAMRT_LSB_JOBNAME`\n'
906 corvo 1.58 txt += 'echo $PATH\n'
907 slacapra 1.1
908     # Handle the arguments:
909     txt += "\n"
910 gutsche 1.7 txt += "## number of arguments (first argument always jobnumber)\n"
911 slacapra 1.1 txt += "\n"
912 mkirn 1.32 # txt += "narg=$#\n"
913     txt += "if [ $nargs -lt 2 ]\n"
914 slacapra 1.1 txt += "then\n"
915 mkirn 1.33 txt += " echo 'SET_EXE_ENV 1 ==> ERROR Too few arguments' +$nargs+ \n"
916 gutsche 1.3 txt += ' echo "JOB_EXIT_STATUS = 50113"\n'
917 gutsche 1.7 txt += ' echo "JobExitCode=50113" | tee -a $RUNTIME_AREA/$repo\n'
918 slacapra 1.1 txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
919 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
920     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
921     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
922 gutsche 1.3 ## OLI_Daniele
923     txt += ' if [ $middleware == OSG ]; then \n'
924     txt += ' echo "Remove working directory: $WORKING_DIR"\n'
925     txt += ' cd $RUNTIME_AREA\n'
926     txt += ' /bin/rm -rf $WORKING_DIR\n'
927     txt += ' if [ -d $WORKING_DIR ] ;then\n'
928 fanzago 1.96 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'
929     txt += ' echo "JOB_EXIT_STATUS = 50114"\n'
930     txt += ' echo "JobExitCode=50114" | tee -a $RUNTIME_AREA/$repo\n'
931     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
932 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
933     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
934     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
935 gutsche 1.3 txt += ' fi\n'
936     txt += ' fi \n'
937 slacapra 1.1 txt += " exit 1\n"
938     txt += "fi\n"
939     txt += "\n"
940    
941     # Prepare job-specific part
942     job = common.job_list[nj]
943 fanzago 1.93 ### FEDE FOR DBS OUTPUT PUBLICATION
944     if (self.datasetPath):
945     txt += '\n'
946     txt += 'DatasetPath='+self.datasetPath+'\n'
947    
948     datasetpath_split = self.datasetPath.split("/")
949    
950     txt += 'PrimaryDataset='+datasetpath_split[1]+'\n'
951     txt += 'DataTier='+datasetpath_split[2]+'\n'
952 fanzago 1.96 #txt += 'ProcessedDataset='+datasetpath_split[3]+'\n'
953     txt += 'ApplicationFamily=cmsRun\n'
954 fanzago 1.93
955     else:
956     txt += 'DatasetPath=MCDataTier\n'
957     txt += 'PrimaryDataset=null\n'
958     txt += 'DataTier=null\n'
959 fanzago 1.96 #txt += 'ProcessedDataset=null\n'
960 fanzago 1.93 txt += 'ApplicationFamily=MCDataTier\n'
961 spiga 1.42 if self.pset != None: #CarlosDaniele
962     pset = os.path.basename(job.configFilename())
963     txt += '\n'
964 spiga 1.95 txt += 'cp $RUNTIME_AREA/'+pset+' .\n'
965 spiga 1.42 if (self.datasetPath): # standard job
966     #txt += 'InputFiles=$2\n'
967     txt += 'InputFiles=${args[1]}\n'
968     txt += 'MaxEvents=${args[2]}\n'
969     txt += 'SkipEvents=${args[3]}\n'
970     txt += 'echo "Inputfiles:<$InputFiles>"\n'
971 slacapra 1.90 txt += 'sed "s#{\'INPUT\'}#$InputFiles#" '+pset+' > tmp && mv -f tmp '+pset+'\n'
972 spiga 1.42 txt += 'echo "MaxEvents:<$MaxEvents>"\n'
973 slacapra 1.90 txt += 'sed "s#INPUTMAXEVENTS#$MaxEvents#" '+pset+' > tmp && mv -f tmp '+pset+'\n'
974 spiga 1.42 txt += 'echo "SkipEvents:<$SkipEvents>"\n'
975 slacapra 1.90 txt += 'sed "s#INPUTSKIPEVENTS#$SkipEvents#" '+pset+' > tmp && mv -f tmp '+pset+'\n'
976 spiga 1.42 else: # pythia like job
977 slacapra 1.90 seedIndex=1
978     if (self.firstRun):
979     txt += 'FirstRun=${args['+str(seedIndex)+']}\n'
980 spiga 1.57 txt += 'echo "FirstRun: <$FirstRun>"\n'
981 slacapra 1.90 txt += 'sed "s#\<INPUTFIRSTRUN\>#$FirstRun#" '+pset+' > tmp && mv -f tmp '+pset+'\n'
982     seedIndex=seedIndex+1
983    
984 spiga 1.57 if (self.sourceSeed):
985 slacapra 1.90 txt += 'Seed=${args['+str(seedIndex)+']}\n'
986     txt += 'sed "s#\<INPUT\>#$Seed#" '+pset+' > tmp && mv -f tmp '+pset+'\n'
987     seedIndex=seedIndex+1
988     ## the following seeds are not always present
989 spiga 1.42 if (self.sourceSeedVtx):
990 slacapra 1.90 txt += 'VtxSeed=${args['+str(seedIndex)+']}\n'
991 spiga 1.42 txt += 'echo "VtxSeed: <$VtxSeed>"\n'
992 slacapra 1.90 txt += 'sed "s#\<INPUTVTX\>#$VtxSeed#" '+pset+' > tmp && mv -f tmp '+pset+'\n'
993     seedIndex += 1
994     if (self.sourceSeedG4):
995     txt += 'G4Seed=${args['+str(seedIndex)+']}\n'
996     txt += 'echo "G4Seed: <$G4Seed>"\n'
997     txt += 'sed "s#\<INPUTG4\>#$G4Seed#" '+pset+' > tmp && mv -f tmp '+pset+'\n'
998     seedIndex += 1
999     if (self.sourceSeedMix):
1000     txt += 'mixSeed=${args['+str(seedIndex)+']}\n'
1001     txt += 'echo "MixSeed: <$mixSeed>"\n'
1002     txt += 'sed "s#\<INPUTMIX\>#$mixSeed#" '+pset+' > tmp && mv -f tmp '+pset+'\n'
1003     seedIndex += 1
1004     pass
1005     pass
1006     txt += 'mv -f '+pset+' pset.cfg\n'
1007 slacapra 1.1
1008     if len(self.additional_inbox_files) > 0:
1009 slacapra 1.97 txt += 'if [ -e $RUNTIME_AREA/'+self.additional_tgz_name+' ] ; then\n'
1010     txt += ' tar xzvf $RUNTIME_AREA/'+self.additional_tgz_name+'\n'
1011     txt += 'fi\n'
1012 slacapra 1.1 pass
1013    
1014 spiga 1.42 if self.pset != None: #CarlosDaniele
1015     txt += 'echo "### END JOB SETUP ENVIRONMENT ###"\n\n'
1016    
1017     txt += '\n'
1018     txt += 'echo "***** cat pset.cfg *********"\n'
1019     txt += 'cat pset.cfg\n'
1020     txt += 'echo "****** end pset.cfg ********"\n'
1021     txt += '\n'
1022 fanzago 1.93 ### FEDE FOR DBS OUTPUT PUBLICATION
1023 fanzago 1.94 txt += 'PSETHASH=`EdmConfigHash < pset.cfg` \n'
1024     txt += 'echo "PSETHASH = $PSETHASH" \n'
1025 fanzago 1.93 ##############
1026     txt += '\n'
1027     # txt += 'echo "***** cat pset1.cfg *********"\n'
1028     # txt += 'cat pset1.cfg\n'
1029     # txt += 'echo "****** end pset1.cfg ********"\n'
1030 gutsche 1.3 return txt
1031    
1032 slacapra 1.63 def wsBuildExe(self, nj=0):
1033 gutsche 1.3 """
1034     Put in the script the commands to build an executable
1035     or a library.
1036     """
1037    
1038     txt = ""
1039    
1040     if os.path.isfile(self.tgzNameWithPath):
1041     txt += 'echo "tar xzvf $RUNTIME_AREA/'+os.path.basename(self.tgzNameWithPath)+'"\n'
1042     txt += 'tar xzvf $RUNTIME_AREA/'+os.path.basename(self.tgzNameWithPath)+'\n'
1043     txt += 'untar_status=$? \n'
1044     txt += 'if [ $untar_status -ne 0 ]; then \n'
1045     txt += ' echo "SET_EXE 1 ==> ERROR Untarring .tgz file failed"\n'
1046     txt += ' echo "JOB_EXIT_STATUS = $untar_status" \n'
1047 gutsche 1.7 txt += ' echo "JobExitCode=$untar_status" | tee -a $RUNTIME_AREA/$repo\n'
1048 gutsche 1.3 txt += ' if [ $middleware == OSG ]; then \n'
1049     txt += ' echo "Remove working directory: $WORKING_DIR"\n'
1050     txt += ' cd $RUNTIME_AREA\n'
1051     txt += ' /bin/rm -rf $WORKING_DIR\n'
1052     txt += ' if [ -d $WORKING_DIR ] ;then\n'
1053 gutsche 1.13 txt += ' echo "SET_EXE 50999 ==> OSG $WORKING_DIR could not be deleted on WN `hostname` after Untarring .tgz file failed"\n'
1054     txt += ' echo "JOB_EXIT_STATUS = 50999"\n'
1055     txt += ' echo "JobExitCode=50999" | tee -a $RUNTIME_AREA/$repo\n'
1056     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
1057     txt += ' rm -f $RUNTIME_AREA/$repo \n'
1058     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
1059     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
1060 gutsche 1.3 txt += ' fi\n'
1061     txt += ' fi \n'
1062     txt += ' \n'
1063 gutsche 1.7 txt += ' exit 1 \n'
1064 gutsche 1.3 txt += 'else \n'
1065     txt += ' echo "Successful untar" \n'
1066     txt += 'fi \n'
1067 gutsche 1.50 txt += '\n'
1068 fanzago 1.93 txt += 'echo "Include ProdAgentApi and PRODCOMMON in PYTHONPATH"\n'
1069 gutsche 1.50 txt += 'if [ -z "$PYTHONPATH" ]; then\n'
1070 fanzago 1.93 #### FEDE FOR DBS OUTPUT PUBLICATION
1071 fanzago 1.99 txt += ' export PYTHONPATH=$SOFTWARE_DIR/ProdAgentApi:$SOFTWARE_DIR/ProdCommon\n'
1072     #txt += ' export PYTHONPATH=`pwd`/ProdAgentApi:`pwd`/ProdCommon\n'
1073 fanzago 1.93 #txt += ' export PYTHONPATH=ProdAgentApi\n'
1074 gutsche 1.50 txt += 'else\n'
1075 fanzago 1.99 txt += ' export PYTHONPATH=$SOFTWARE_DIR/ProdAgentApi:$SOFTWARE_DIR/ProdCommon:${PYTHONPATH}\n'
1076     #txt += ' export PYTHONPATH=`pwd`/ProdAgentApi:`pwd`/ProdCommon:${PYTHONPATH}\n'
1077 fanzago 1.93 #txt += ' export PYTHONPATH=ProdAgentApi:${PYTHONPATH}\n'
1078     txt += 'echo "PYTHONPATH=$PYTHONPATH"\n'
1079     ###################
1080 gutsche 1.50 txt += 'fi\n'
1081     txt += '\n'
1082    
1083 gutsche 1.3 pass
1084    
1085 slacapra 1.1 return txt
1086    
1087     def modifySteeringCards(self, nj):
1088     """
1089     modify the card provided by the user,
1090     writing a new card into share dir
1091     """
1092    
1093     def executableName(self):
1094 slacapra 1.70 if self.scriptExe: #CarlosDaniele
1095 spiga 1.42 return "sh "
1096     else:
1097     return self.executable
1098 slacapra 1.1
1099     def executableArgs(self):
1100 slacapra 1.70 if self.scriptExe:#CarlosDaniele
1101 spiga 1.42 return self.scriptExe + " $NJob"
1102     else:
1103     return " -p pset.cfg"
1104 slacapra 1.1
1105     def inputSandbox(self, nj):
1106     """
1107     Returns a list of filenames to be put in JDL input sandbox.
1108     """
1109     inp_box = []
1110 slacapra 1.53 # # dict added to delete duplicate from input sandbox file list
1111     # seen = {}
1112 slacapra 1.1 ## code
1113     if os.path.isfile(self.tgzNameWithPath):
1114     inp_box.append(self.tgzNameWithPath)
1115 corvo 1.58 if os.path.isfile(self.MLtgzfile):
1116     inp_box.append(self.MLtgzfile)
1117 slacapra 1.1 ## config
1118 slacapra 1.70 if not self.pset is None:
1119 corvo 1.56 inp_box.append(common.work_space.pathForTgz() + 'job/' + self.configFilename())
1120 slacapra 1.1 ## additional input files
1121 slacapra 1.97 tgz = self.additionalInputFileTgz()
1122     inp_box.append(tgz)
1123 slacapra 1.1 return inp_box
1124    
1125     def outputSandbox(self, nj):
1126     """
1127     Returns a list of filenames to be put in JDL output sandbox.
1128     """
1129     out_box = []
1130    
1131     ## User Declared output files
1132 slacapra 1.54 for out in (self.output_file+self.output_file_sandbox):
1133 slacapra 1.1 n_out = nj + 1
1134     out_box.append(self.numberFile_(out,str(n_out)))
1135     return out_box
1136    
1137     def prepareSteeringCards(self):
1138     """
1139     Make initial modifications of the user's steering card file.
1140     """
1141     return
1142    
1143     def wsRenameOutput(self, nj):
1144     """
1145     Returns part of a job script which renames the produced files.
1146     """
1147    
1148     txt = '\n'
1149 gutsche 1.7 txt += '# directory content\n'
1150     txt += 'ls \n'
1151 slacapra 1.54
1152     for fileWithSuffix in (self.output_file+self.output_file_sandbox):
1153 slacapra 1.1 output_file_num = self.numberFile_(fileWithSuffix, '$NJob')
1154     txt += '\n'
1155 gutsche 1.7 txt += '# check output file\n'
1156 slacapra 1.105 # txt += 'ls '+fileWithSuffix+'\n'
1157     # txt += 'ls_result=$?\n'
1158     txt += 'if [ -e '+fileWithSuffix+' ] ; then\n'
1159 spiga 1.88 txt += ' exit_status=60302\n'
1160 slacapra 1.105 txt += ' echo "ERROR: Problem with output file '+fileWithSuffix+'"\n'
1161 gutsche 1.7 if common.scheduler.boss_scheduler_name == 'condor_g':
1162     txt += ' if [ $middleware == OSG ]; then \n'
1163     txt += ' echo "prepare dummy output file"\n'
1164     txt += ' echo "Processing of job output failed" > $RUNTIME_AREA/'+output_file_num+'\n'
1165     txt += ' fi \n'
1166 slacapra 1.1 txt += 'else\n'
1167 fanzago 1.93 ### FEDE FOR DBS OUTPUT PUBLICATION
1168 slacapra 1.105 txt += ' mv '+fileWithSuffix+' $RUNTIME_AREA/'+output_file_num+'\n'
1169 fanzago 1.93 #################################
1170 slacapra 1.1 txt += 'fi\n'
1171 slacapra 1.105 file_list = []
1172     for fileWithSuffix in (self.output_file):
1173     file_list.append(self.numberFile_(fileWithSuffix, '$NJob'))
1174     txt += 'file_list="'+string.join(file_list,' ')+'"\n'
1175 slacapra 1.1
1176 gutsche 1.7 txt += 'cd $RUNTIME_AREA\n'
1177 fanzago 1.99 #### FEDE this is the cleanEnv function
1178 gutsche 1.3 ### OLI_DANIELE
1179 fanzago 1.99 #txt += 'if [ $middleware == OSG ]; then\n'
1180     #txt += ' cd $RUNTIME_AREA\n'
1181     #txt += ' echo "Remove working directory: $WORKING_DIR"\n'
1182     #txt += ' /bin/rm -rf $WORKING_DIR\n'
1183     #txt += ' if [ -d $WORKING_DIR ] ;then\n'
1184     #txt += ' echo "SET_EXE 60999 ==> OSG $WORKING_DIR could not be deleted on WN `hostname` after cleanup of WN"\n'
1185     #txt += ' echo "JOB_EXIT_STATUS = 60999"\n'
1186     #txt += ' echo "JobExitCode=60999" | tee -a $RUNTIME_AREA/$repo\n'
1187     #txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
1188     #txt += ' rm -f $RUNTIME_AREA/$repo \n'
1189     #txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
1190     #txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
1191     #txt += ' fi\n'
1192     #txt += 'fi\n'
1193     #txt += '\n'
1194 slacapra 1.54
1195    
1196 slacapra 1.1 return txt
1197    
1198     def numberFile_(self, file, txt):
1199     """
1200     append _'txt' before last extension of a file
1201     """
1202     p = string.split(file,".")
1203     # take away last extension
1204     name = p[0]
1205     for x in p[1:-1]:
1206 slacapra 1.90 name=name+"."+x
1207 slacapra 1.1 # add "_txt"
1208     if len(p)>1:
1209 slacapra 1.90 ext = p[len(p)-1]
1210     result = name + '_' + txt + "." + ext
1211 slacapra 1.1 else:
1212 slacapra 1.90 result = name + '_' + txt
1213 slacapra 1.1
1214     return result
1215    
1216 slacapra 1.63 def getRequirements(self, nj=[]):
1217 slacapra 1.1 """
1218     return job requirements to add to jdl files
1219     """
1220     req = ''
1221 slacapra 1.47 if self.version:
1222 slacapra 1.10 req='Member("VO-cms-' + \
1223 slacapra 1.47 self.version + \
1224 slacapra 1.10 '", other.GlueHostApplicationSoftwareRunTimeEnvironment)'
1225 slacapra 1.105 ## SL add requirement for OS version only if SL4
1226     reSL4 = re.compile( r'slc4' )
1227     if self.executable_arch and reSL4.search(self.executable_arch):
1228     req='Member("VO-cms-' + \
1229     self.executable_arch + \
1230     '", other.GlueHostApplicationSoftwareRunTimeEnvironment)'
1231 gutsche 1.35
1232     req = req + ' && (other.GlueHostNetworkAdapterOutboundIP)'
1233    
1234 slacapra 1.1 return req
1235 gutsche 1.3
1236     def configFilename(self):
1237     """ return the config filename """
1238     return self.name()+'.cfg'
1239    
1240     ### OLI_DANIELE
1241     def wsSetupCMSOSGEnvironment_(self):
1242     """
1243     Returns part of a job script which is prepares
1244     the execution environment and which is common for all CMS jobs.
1245     """
1246     txt = '\n'
1247     txt += ' echo "### SETUP CMS OSG ENVIRONMENT ###"\n'
1248     txt += ' if [ -f $GRID3_APP_DIR/cmssoft/cmsset_default.sh ] ;then\n'
1249     txt += ' # Use $GRID3_APP_DIR/cmssoft/cmsset_default.sh to setup cms software\n'
1250 spiga 1.87 txt += ' export SCRAM_ARCH='+self.executable_arch+'\n'
1251 gutsche 1.3 txt += ' source $GRID3_APP_DIR/cmssoft/cmsset_default.sh '+self.version+'\n'
1252 mkirn 1.40 txt += ' elif [ -f $OSG_APP/cmssoft/cms/cmsset_default.sh ] ;then\n'
1253     txt += ' # Use $OSG_APP/cmssoft/cms/cmsset_default.sh to setup cms software\n'
1254 spiga 1.87 txt += ' export SCRAM_ARCH='+self.executable_arch+'\n'
1255 mkirn 1.40 txt += ' source $OSG_APP/cmssoft/cms/cmsset_default.sh '+self.version+'\n'
1256 gutsche 1.3 txt += ' else\n'
1257 mkirn 1.40 txt += ' echo "SET_CMS_ENV 10020 ==> ERROR $GRID3_APP_DIR/cmssoft/cmsset_default.sh and $OSG_APP/cmssoft/cms/cmsset_default.sh file not found"\n'
1258 gutsche 1.3 txt += ' echo "JOB_EXIT_STATUS = 10020"\n'
1259     txt += ' echo "JobExitCode=10020" | tee -a $RUNTIME_AREA/$repo\n'
1260     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
1261 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
1262     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
1263     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
1264 gutsche 1.7 txt += ' exit 1\n'
1265 gutsche 1.3 txt += '\n'
1266     txt += ' echo "Remove working directory: $WORKING_DIR"\n'
1267     txt += ' cd $RUNTIME_AREA\n'
1268     txt += ' /bin/rm -rf $WORKING_DIR\n'
1269     txt += ' if [ -d $WORKING_DIR ] ;then\n'
1270 fanzago 1.96 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/cms/cmsset_default.sh file not found"\n'
1271     txt += ' echo "JOB_EXIT_STATUS = 10017"\n'
1272     txt += ' echo "JobExitCode=10017" | tee -a $RUNTIME_AREA/$repo\n'
1273     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
1274     txt += ' rm -f $RUNTIME_AREA/$repo \n'
1275     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
1276     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
1277 gutsche 1.3 txt += ' fi\n'
1278     txt += '\n'
1279 gutsche 1.7 txt += ' exit 1\n'
1280 gutsche 1.3 txt += ' fi\n'
1281     txt += '\n'
1282     txt += ' echo "SET_CMS_ENV 0 ==> setup cms environment ok"\n'
1283     txt += ' echo " END SETUP CMS OSG ENVIRONMENT "\n'
1284    
1285     return txt
1286    
1287     ### OLI_DANIELE
1288     def wsSetupCMSLCGEnvironment_(self):
1289     """
1290     Returns part of a job script which is prepares
1291     the execution environment and which is common for all CMS jobs.
1292     """
1293     txt = ' \n'
1294     txt += ' echo " ### SETUP CMS LCG ENVIRONMENT ### "\n'
1295     txt += ' if [ ! $VO_CMS_SW_DIR ] ;then\n'
1296     txt += ' echo "SET_CMS_ENV 10031 ==> ERROR CMS software dir not found on WN `hostname`"\n'
1297     txt += ' echo "JOB_EXIT_STATUS = 10031" \n'
1298     txt += ' echo "JobExitCode=10031" | tee -a $RUNTIME_AREA/$repo\n'
1299     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
1300 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
1301     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
1302     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
1303 gutsche 1.7 txt += ' exit 1\n'
1304 gutsche 1.3 txt += ' else\n'
1305     txt += ' echo "Sourcing environment... "\n'
1306     txt += ' if [ ! -s $VO_CMS_SW_DIR/cmsset_default.sh ] ;then\n'
1307     txt += ' echo "SET_CMS_ENV 10020 ==> ERROR cmsset_default.sh file not found into dir $VO_CMS_SW_DIR"\n'
1308     txt += ' echo "JOB_EXIT_STATUS = 10020"\n'
1309     txt += ' echo "JobExitCode=10020" | tee -a $RUNTIME_AREA/$repo\n'
1310     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
1311 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
1312     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
1313     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
1314 gutsche 1.7 txt += ' exit 1\n'
1315 gutsche 1.3 txt += ' fi\n'
1316     txt += ' echo "sourcing $VO_CMS_SW_DIR/cmsset_default.sh"\n'
1317     txt += ' source $VO_CMS_SW_DIR/cmsset_default.sh\n'
1318     txt += ' result=$?\n'
1319     txt += ' if [ $result -ne 0 ]; then\n'
1320     txt += ' echo "SET_CMS_ENV 10032 ==> ERROR problem sourcing $VO_CMS_SW_DIR/cmsset_default.sh"\n'
1321     txt += ' echo "JOB_EXIT_STATUS = 10032"\n'
1322     txt += ' echo "JobExitCode=10032" | tee -a $RUNTIME_AREA/$repo\n'
1323     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
1324 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
1325     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
1326     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
1327 gutsche 1.7 txt += ' exit 1\n'
1328 gutsche 1.3 txt += ' fi\n'
1329     txt += ' fi\n'
1330     txt += ' \n'
1331     txt += ' echo "SET_CMS_ENV 0 ==> setup cms environment ok"\n'
1332     txt += ' echo "### END SETUP CMS LCG ENVIRONMENT ###"\n'
1333     return txt
1334 gutsche 1.5
1335 fanzago 1.93 ### FEDE FOR DBS OUTPUT PUBLICATION
1336     def modifyReport(self, nj):
1337     """
1338     insert the part of the script that modifies the FrameworkJob Report
1339     """
1340 fanzago 1.94
1341 fanzago 1.93 txt = ''
1342     txt += 'echo "Modify Job Report" \n'
1343 fanzago 1.99 #txt += 'chmod a+x $RUNTIME_AREA/'+self.version+'/ProdAgentApi/FwkJobRep/ModifyJobReport.py\n'
1344     ################ FEDE FOR DBS2 #############################################
1345     txt += 'chmod a+x $SOFTWARE_DIR/ProdAgentApi/FwkJobRep/ModifyJobReport.py\n'
1346     #############################################################################
1347 fanzago 1.94 try:
1348     publish_data = int(self.cfg_params['USER.publish_data'])
1349     except KeyError:
1350     publish_data = 0
1351    
1352 fanzago 1.93 txt += 'if [ -z "$SE" ]; then\n'
1353     txt += ' SE="" \n'
1354     txt += 'fi \n'
1355     txt += 'if [ -z "$SE_PATH" ]; then\n'
1356     txt += ' SE_PATH="" \n'
1357     txt += 'fi \n'
1358     txt += 'echo "SE = $SE"\n'
1359     txt += 'echo "SE_PATH = $SE_PATH"\n'
1360 fanzago 1.94
1361     if (publish_data == 1):
1362     #processedDataset = self.cfg_params['USER.processed_datasetname']
1363     processedDataset = self.cfg_params['USER.publish_data_name']
1364     txt += 'ProcessedDataset='+processedDataset+'\n'
1365     #### LFN=/store/user/<user>/processedDataset_PSETHASH
1366     txt += 'if [ "$SE_PATH" == "" ]; then\n'
1367 fanzago 1.101 #### FEDE: added slash in LFN ##############
1368     txt += ' FOR_LFN=/copy_problems/ \n'
1369 fanzago 1.94 txt += 'else \n'
1370     txt += ' tmp=`echo $SE_PATH | awk -F \'store\' \'{print$2}\'` \n'
1371 fanzago 1.101 ##### FEDE TO BE CHANGED, BECAUSE STORE IS HARDCODED!!!! ########
1372 fanzago 1.94 txt += ' FOR_LFN=/store$tmp \n'
1373     txt += 'fi \n'
1374     txt += 'echo "ProcessedDataset = $ProcessedDataset"\n'
1375     txt += 'echo "FOR_LFN = $FOR_LFN" \n'
1376 spiga 1.103 txt += 'echo "CMSSW_VERSION = $CMSSW_VERSION"\n\n'
1377     #txt += 'echo "$RUNTIME_AREA/'+self.version+'/ProdAgentApi/FwkJobRep/ModifyJobReport.py crab_fjr_$NJob.xml $NJob $FOR_LFN $PrimaryDataset $DataTier $ProcessedDataset $ApplicationFamily $executable $CMSSW_VERSION $PSETHASH $SE $SE_PATH"\n'
1378     txt += 'echo "$SOFTWARE_DIR/ProdAgentApi/FwkJobRep/ModifyJobReport.py crab_fjr_$NJob.xml $NJob $FOR_LFN $PrimaryDataset $DataTier $ProcessedDataset $ApplicationFamily $executable $CMSSW_VERSION $PSETHASH $SE $SE_PATH"\n'
1379     txt += '$SOFTWARE_DIR/ProdAgentApi/FwkJobRep/ModifyJobReport.py crab_fjr_$NJob.xml $NJob $FOR_LFN $PrimaryDataset $DataTier $ProcessedDataset $ApplicationFamily $executable $CMSSW_VERSION $PSETHASH $SE $SE_PATH\n'
1380     #txt += '$RUNTIME_AREA/'+self.version+'/ProdAgentApi/FwkJobRep/ModifyJobReport.py crab_fjr_$NJob.xml $NJob $FOR_LFN $PrimaryDataset $DataTier $ProcessedDataset $ApplicationFamily $executable $CMSSW_VERSION $PSETHASH $SE $SE_PATH\n'
1381    
1382     txt += 'modifyReport_result=$?\n'
1383     txt += 'echo modifyReport_result = $modifyReport_result\n'
1384     txt += 'if [ $modifyReport_result -ne 0 ]; then\n'
1385     txt += ' exit_status=1\n'
1386     txt += ' echo "ERROR: Problem with ModifyJobReport"\n'
1387     txt += 'else\n'
1388     txt += ' mv NewFrameworkJobReport.xml crab_fjr_$NJob.xml\n'
1389     txt += 'fi\n'
1390 fanzago 1.94 else:
1391     txt += 'ProcessedDataset=no_data_to_publish \n'
1392 fanzago 1.101 #### FEDE: added slash in LFN ##############
1393     txt += 'FOR_LFN=/local/ \n'
1394 fanzago 1.94 txt += 'echo "ProcessedDataset = $ProcessedDataset"\n'
1395     txt += 'echo "FOR_LFN = $FOR_LFN" \n'
1396 fanzago 1.93 return txt
1397 fanzago 1.99
1398     def cleanEnv(self):
1399     ### OLI_DANIELE
1400     txt = ''
1401     txt += 'if [ $middleware == OSG ]; then\n'
1402     txt += ' cd $RUNTIME_AREA\n'
1403     txt += ' echo "Remove working directory: $WORKING_DIR"\n'
1404     txt += ' /bin/rm -rf $WORKING_DIR\n'
1405     txt += ' if [ -d $WORKING_DIR ] ;then\n'
1406     txt += ' echo "SET_EXE 60999 ==> OSG $WORKING_DIR could not be deleted on WN `hostname` after cleanup of WN"\n'
1407     txt += ' echo "JOB_EXIT_STATUS = 60999"\n'
1408     txt += ' echo "JobExitCode=60999" | tee -a $RUNTIME_AREA/$repo\n'
1409     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
1410     txt += ' rm -f $RUNTIME_AREA/$repo \n'
1411     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
1412     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
1413     txt += ' fi\n'
1414     txt += 'fi\n'
1415     txt += '\n'
1416     return txt
1417 fanzago 1.93
1418 gutsche 1.5 def setParam_(self, param, value):
1419     self._params[param] = value
1420    
1421     def getParams(self):
1422     return self._params
1423 gutsche 1.8
1424     def setTaskid_(self):
1425     self._taskId = self.cfg_params['taskId']
1426    
1427     def getTaskid(self):
1428     return self._taskId
1429 gutsche 1.35
1430     def uniquelist(self, old):
1431     """
1432     remove duplicates from a list
1433     """
1434     nd={}
1435     for e in old:
1436     nd[e]=0
1437     return nd.keys()