ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/CRAB/python/cms_cmssw.py
Revision: 1.101
Committed: Thu Jun 28 14:54:43 2007 UTC (17 years, 10 months ago) by fanzago
Content type: text/x-python
Branch: MAIN
CVS Tags: CRAB_1_5_3_pre3, configure, CRAB_2_0_0_pre4
Changes since 1.100: +5 -2 lines
Log Message:
added slash in FOR_LFN

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.70 import os, string, re, shutil, 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 corvo 1.85 fname = string.split(file, '/')[-1]
177     storedFile = common.work_space.pathForTgz()+'share/'+fname
178 slacapra 1.70 shutil.copyfile(file, storedFile)
179     self.additional_inbox_files.append(string.strip(storedFile))
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    
448 gutsche 1.68 if self.eventsbyblock.has_key(block) :
449     numEventsInBlock = self.eventsbyblock[block]
450     common.logger.debug(5,'Events in Block File '+str(numEventsInBlock))
451 slacapra 1.9
452 gutsche 1.68 files = self.filesbyblock[block]
453     numFilesInBlock = len(files)
454     if (numFilesInBlock <= 0):
455     continue
456     fileCount = 0
457    
458     # ---- New block => New job ---- #
459     parString = "\\{"
460     # counter for number of events in files currently worked on
461     filesEventCount = 0
462     # flag if next while loop should touch new file
463     newFile = 1
464     # job event counter
465     jobSkipEventCount = 0
466 slacapra 1.9
467 gutsche 1.68 # ---- Iterate over the files in the block until we've met the requested ---- #
468     # ---- total # of events or we've gone over all the files in this block ---- #
469     while ( (eventsRemaining > 0) and (fileCount < numFilesInBlock) and (jobCount < totalNumberOfJobs) ):
470     file = files[fileCount]
471     if newFile :
472     try:
473     numEventsInFile = self.eventsbyfile[file]
474     common.logger.debug(6, "File "+str(file)+" has "+str(numEventsInFile)+" events")
475     # increase filesEventCount
476     filesEventCount += numEventsInFile
477     # Add file to current job
478     parString += '\\\"' + file + '\\\"\,'
479     newFile = 0
480     except KeyError:
481     common.logger.message("File "+str(file)+" has unknown number of events: skipping")
482 slacapra 1.41
483 gutsche 1.38
484 gutsche 1.68 # if less events in file remain than eventsPerJobRequested
485     if ( filesEventCount - jobSkipEventCount < eventsPerJobRequested ) :
486     # if last file in block
487     if ( fileCount == numFilesInBlock-1 ) :
488     # end job using last file, use remaining events in block
489     # close job and touch new file
490     fullString = parString[:-2]
491     fullString += '\\}'
492     list_of_lists.append([fullString,str(-1),str(jobSkipEventCount)])
493     common.logger.debug(3,"Job "+str(jobCount+1)+" can run over "+str(filesEventCount - jobSkipEventCount)+" events (last file in block).")
494     self.jobDestination.append(blockSites[block])
495     common.logger.debug(5,"Job "+str(jobCount+1)+" Destination: "+str(self.jobDestination[jobCount]))
496 gutsche 1.92 # fill jobs of block dictionary
497     if block in jobsOfBlock.keys() :
498     jobsOfBlock[block].append(jobCount+1)
499     else:
500     jobsOfBlock[block] = [jobCount+1]
501 gutsche 1.68 # reset counter
502     jobCount = jobCount + 1
503     totalEventCount = totalEventCount + filesEventCount - jobSkipEventCount
504     eventsRemaining = eventsRemaining - filesEventCount + jobSkipEventCount
505     jobSkipEventCount = 0
506     # reset file
507     parString = "\\{"
508     filesEventCount = 0
509     newFile = 1
510     fileCount += 1
511     else :
512     # go to next file
513     newFile = 1
514     fileCount += 1
515     # if events in file equal to eventsPerJobRequested
516     elif ( filesEventCount - jobSkipEventCount == eventsPerJobRequested ) :
517 gutsche 1.38 # close job and touch new file
518     fullString = parString[:-2]
519     fullString += '\\}'
520 gutsche 1.68 list_of_lists.append([fullString,str(eventsPerJobRequested),str(jobSkipEventCount)])
521     common.logger.debug(3,"Job "+str(jobCount+1)+" can run over "+str(eventsPerJobRequested)+" events.")
522 gutsche 1.38 self.jobDestination.append(blockSites[block])
523     common.logger.debug(5,"Job "+str(jobCount+1)+" Destination: "+str(self.jobDestination[jobCount]))
524 gutsche 1.92 if block in jobsOfBlock.keys() :
525     jobsOfBlock[block].append(jobCount+1)
526     else:
527     jobsOfBlock[block] = [jobCount+1]
528 gutsche 1.38 # reset counter
529     jobCount = jobCount + 1
530 gutsche 1.68 totalEventCount = totalEventCount + eventsPerJobRequested
531     eventsRemaining = eventsRemaining - eventsPerJobRequested
532 gutsche 1.38 jobSkipEventCount = 0
533     # reset file
534     parString = "\\{"
535     filesEventCount = 0
536     newFile = 1
537     fileCount += 1
538 gutsche 1.68
539     # if more events in file remain than eventsPerJobRequested
540 gutsche 1.38 else :
541 gutsche 1.68 # close job but don't touch new file
542     fullString = parString[:-2]
543     fullString += '\\}'
544     list_of_lists.append([fullString,str(eventsPerJobRequested),str(jobSkipEventCount)])
545     common.logger.debug(3,"Job "+str(jobCount+1)+" can run over "+str(eventsPerJobRequested)+" events.")
546     self.jobDestination.append(blockSites[block])
547     common.logger.debug(5,"Job "+str(jobCount+1)+" Destination: "+str(self.jobDestination[jobCount]))
548 gutsche 1.92 if block in jobsOfBlock.keys() :
549     jobsOfBlock[block].append(jobCount+1)
550     else:
551     jobsOfBlock[block] = [jobCount+1]
552 gutsche 1.68 # increase counter
553     jobCount = jobCount + 1
554     totalEventCount = totalEventCount + eventsPerJobRequested
555     eventsRemaining = eventsRemaining - eventsPerJobRequested
556     # calculate skip events for last file
557     # use filesEventCount (contains several files), jobSkipEventCount and eventsPerJobRequest
558     jobSkipEventCount = eventsPerJobRequested - (filesEventCount - jobSkipEventCount - self.eventsbyfile[file])
559     # remove all but the last file
560     filesEventCount = self.eventsbyfile[file]
561     parString = "\\{"
562     parString += '\\\"' + file + '\\\"\,'
563     pass # END if
564     pass # END while (iterate over files in the block)
565 gutsche 1.35 pass # END while (iterate over blocks in the dataset)
566 slacapra 1.41 self.ncjobs = self.total_number_of_jobs = jobCount
567 gutsche 1.38 if (eventsRemaining > 0 and jobCount < totalNumberOfJobs ):
568 gutsche 1.35 common.logger.message("Could not run on all requested events because some blocks not hosted at allowed sites.")
569 gutsche 1.92 common.logger.message(str(jobCount)+" job(s) can run on "+str(totalEventCount)+" events.\n")
570 slacapra 1.22
571 gutsche 1.92 # screen output
572     screenOutput = "List of jobs and available destination sites:\n\n"
573    
574     blockCounter = 0
575     for block in jobsOfBlock.keys():
576     blockCounter += 1
577     screenOutput += "Block %5i: jobs %20s: sites: %s\n" % (blockCounter,spanRanges(jobsOfBlock[block]),','.join(blockSites[block]))
578    
579     common.logger.message(screenOutput)
580    
581 slacapra 1.9 self.list_of_args = list_of_lists
582     return
583    
584 slacapra 1.21 def jobSplittingNoInput(self):
585 slacapra 1.9 """
586     Perform job splitting based on number of event per job
587     """
588     common.logger.debug(5,'Splitting per events')
589     common.logger.message('Required '+str(self.eventsPerJob)+' events per job ')
590 slacapra 1.22 common.logger.message('Required '+str(self.theNumberOfJobs)+' jobs in total ')
591 slacapra 1.9 common.logger.message('Required '+str(self.total_number_of_events)+' events in total ')
592    
593 slacapra 1.10 if (self.total_number_of_events < 0):
594     msg='Cannot split jobs per Events with "-1" as total number of events'
595     raise CrabException(msg)
596    
597 slacapra 1.22 if (self.selectEventsPerJob):
598 spiga 1.65 if (self.selectTotalNumberEvents):
599     self.total_number_of_jobs = int(self.total_number_of_events/self.eventsPerJob)
600     elif(self.selectNumberOfJobs) :
601     self.total_number_of_jobs =self.theNumberOfJobs
602     self.total_number_of_events =int(self.theNumberOfJobs*self.eventsPerJob)
603    
604 slacapra 1.22 elif (self.selectNumberOfJobs) :
605     self.total_number_of_jobs = self.theNumberOfJobs
606     self.eventsPerJob = int(self.total_number_of_events/self.total_number_of_jobs)
607 spiga 1.65
608 slacapra 1.9 common.logger.debug(5,'N jobs '+str(self.total_number_of_jobs))
609    
610     # is there any remainder?
611     check = int(self.total_number_of_events) - (int(self.total_number_of_jobs)*self.eventsPerJob)
612    
613     common.logger.debug(5,'Check '+str(check))
614    
615 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')
616 slacapra 1.9 if check > 0:
617 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))
618 slacapra 1.9
619 slacapra 1.10 # argument is seed number.$i
620 slacapra 1.9 self.list_of_args = []
621     for i in range(self.total_number_of_jobs):
622 gutsche 1.35 ## Since there is no input, any site is good
623 slacapra 1.86 # self.jobDestination.append(["Any"])
624 spiga 1.42 self.jobDestination.append([""]) #must be empty to write correctly the xml
625 slacapra 1.90 args=[]
626 spiga 1.57 if (self.firstRun):
627     ## pythia first run
628 slacapra 1.86 #self.list_of_args.append([(str(self.firstRun)+str(i))])
629 slacapra 1.90 args.append(str(self.firstRun)+str(i))
630 spiga 1.57 else:
631     ## no first run
632 slacapra 1.86 #self.list_of_args.append([str(i)])
633 slacapra 1.90 args.append(str(i))
634 slacapra 1.23 if (self.sourceSeed):
635 slacapra 1.90 args.append(str(self.sourceSeed)+str(i))
636 slacapra 1.28 if (self.sourceSeedVtx):
637 slacapra 1.90 ## + vtx random seed
638     args.append(str(self.sourceSeedVtx)+str(i))
639     if (self.sourceSeedG4):
640     ## + G4 random seed
641     args.append(str(self.sourceSeedG4)+str(i))
642     if (self.sourceSeedMix):
643     ## + Mix random seed
644     args.append(str(self.sourceSeedMix)+str(i))
645     pass
646     pass
647     self.list_of_args.append(args)
648     pass
649 slacapra 1.86
650 slacapra 1.90 # print self.list_of_args
651 gutsche 1.3
652     return
653    
654 spiga 1.42
655     def jobSplittingForScript(self):#CarlosDaniele
656     """
657     Perform job splitting based on number of job
658     """
659     common.logger.debug(5,'Splitting per job')
660     common.logger.message('Required '+str(self.theNumberOfJobs)+' jobs in total ')
661    
662     self.total_number_of_jobs = self.theNumberOfJobs
663    
664     common.logger.debug(5,'N jobs '+str(self.total_number_of_jobs))
665    
666     common.logger.message(str(self.total_number_of_jobs)+' jobs can be created')
667    
668     # argument is seed number.$i
669     self.list_of_args = []
670     for i in range(self.total_number_of_jobs):
671     ## Since there is no input, any site is good
672     # self.jobDestination.append(["Any"])
673     self.jobDestination.append([""])
674     ## no random seed
675     self.list_of_args.append([str(i)])
676     return
677    
678 gutsche 1.3 def split(self, jobParams):
679    
680     common.jobDB.load()
681     #### Fabio
682     njobs = self.total_number_of_jobs
683 slacapra 1.9 arglist = self.list_of_args
684 gutsche 1.3 # create the empty structure
685     for i in range(njobs):
686     jobParams.append("")
687    
688     for job in range(njobs):
689 slacapra 1.17 jobParams[job] = arglist[job]
690     # print str(arglist[job])
691     # print jobParams[job]
692 gutsche 1.3 common.jobDB.setArguments(job, jobParams[job])
693 gutsche 1.35 common.logger.debug(5,"Job "+str(job)+" Destination: "+str(self.jobDestination[job]))
694     common.jobDB.setDestination(job, self.jobDestination[job])
695 gutsche 1.3
696     common.jobDB.save()
697     return
698    
699     def getJobTypeArguments(self, nj, sched):
700 slacapra 1.17 result = ''
701     for i in common.jobDB.arguments(nj):
702     result=result+str(i)+" "
703     return result
704 gutsche 1.3
705     def numberOfJobs(self):
706     # Fabio
707     return self.total_number_of_jobs
708    
709 slacapra 1.1 def getTarBall(self, exe):
710     """
711     Return the TarBall with lib and exe
712     """
713    
714     # if it exist, just return it
715 corvo 1.56 #
716     # Marco. Let's start to use relative path for Boss XML files
717     #
718     self.tgzNameWithPath = common.work_space.pathForTgz()+'share/'+self.tgz_name
719 slacapra 1.1 if os.path.exists(self.tgzNameWithPath):
720     return self.tgzNameWithPath
721    
722     # Prepare a tar gzipped file with user binaries.
723     self.buildTar_(exe)
724    
725     return string.strip(self.tgzNameWithPath)
726    
727     def buildTar_(self, executable):
728    
729     # First of all declare the user Scram area
730     swArea = self.scram.getSWArea_()
731     #print "swArea = ", swArea
732 slacapra 1.63 # swVersion = self.scram.getSWVersion()
733     # print "swVersion = ", swVersion
734 slacapra 1.1 swReleaseTop = self.scram.getReleaseTop_()
735     #print "swReleaseTop = ", swReleaseTop
736    
737     ## check if working area is release top
738     if swReleaseTop == '' or swArea == swReleaseTop:
739     return
740    
741 slacapra 1.61 import tarfile
742     try: # create tar ball
743     tar = tarfile.open(self.tgzNameWithPath, "w:gz")
744     ## First find the executable
745 slacapra 1.86 if (self.executable != ''):
746 slacapra 1.61 exeWithPath = self.scram.findFile_(executable)
747     if ( not exeWithPath ):
748     raise CrabException('User executable '+executable+' not found')
749    
750     ## then check if it's private or not
751     if exeWithPath.find(swReleaseTop) == -1:
752     # the exe is private, so we must ship
753     common.logger.debug(5,"Exe "+exeWithPath+" to be tarred")
754     path = swArea+'/'
755 corvo 1.85 # distinguish case when script is in user project area or given by full path somewhere else
756     if exeWithPath.find(path) >= 0 :
757     exe = string.replace(exeWithPath, path,'')
758     tar.add(path+exe,os.path.basename(executable))
759     else :
760     tar.add(exeWithPath,os.path.basename(executable))
761 slacapra 1.61 pass
762     else:
763     # the exe is from release, we'll find it on WN
764     pass
765    
766     ## Now get the libraries: only those in local working area
767     libDir = 'lib'
768     lib = swArea+'/' +libDir
769     common.logger.debug(5,"lib "+lib+" to be tarred")
770     if os.path.exists(lib):
771     tar.add(lib,libDir)
772    
773     ## Now check if module dir is present
774     moduleDir = 'module'
775     module = swArea + '/' + moduleDir
776     if os.path.isdir(module):
777     tar.add(module,moduleDir)
778    
779     ## Now check if any data dir(s) is present
780     swAreaLen=len(swArea)
781     for root, dirs, files in os.walk(swArea):
782     if "data" in dirs:
783     common.logger.debug(5,"data "+root+"/data"+" to be tarred")
784     tar.add(root+"/data",root[swAreaLen:]+"/data")
785    
786     ## Add ProdAgent dir to tar
787     paDir = 'ProdAgentApi'
788     pa = os.environ['CRABDIR'] + '/' + 'ProdAgentApi'
789     if os.path.isdir(pa):
790     tar.add(pa,paDir)
791 fanzago 1.93
792     ### FEDE FOR DBS PUBLICATION
793     ## Add PRODCOMMON dir to tar
794     prodcommonDir = 'ProdCommon'
795     prodcommonPath = os.environ['CRABDIR'] + '/' + 'ProdCommon'
796     if os.path.isdir(prodcommonPath):
797     tar.add(prodcommonPath,prodcommonDir)
798     #############################
799 slacapra 1.61
800     common.logger.debug(5,"Files added to "+self.tgzNameWithPath+" : "+str(tar.getnames()))
801     tar.close()
802     except :
803     raise CrabException('Could not create tar-ball')
804 gutsche 1.72
805     ## check for tarball size
806     tarballinfo = os.stat(self.tgzNameWithPath)
807     if ( tarballinfo.st_size > self.MaxTarBallSize*1024*1024 ) :
808     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.')
809    
810 slacapra 1.61 ## create tar-ball with ML stuff
811 corvo 1.58 self.MLtgzfile = common.work_space.pathForTgz()+'share/MLfiles.tgz'
812 slacapra 1.61 try:
813     tar = tarfile.open(self.MLtgzfile, "w:gz")
814     path=os.environ['CRABDIR'] + '/python/'
815     for file in ['report.py', 'DashboardAPI.py', 'Logger.py', 'ProcInfo.py', 'apmon.py', 'parseCrabFjr.py']:
816     tar.add(path+file,file)
817     common.logger.debug(5,"Files added to "+self.MLtgzfile+" : "+str(tar.getnames()))
818     tar.close()
819     except :
820 corvo 1.58 raise CrabException('Could not create ML files tar-ball')
821    
822 slacapra 1.1 return
823    
824 slacapra 1.97 def additionalInputFileTgz(self):
825     """
826     Put all additional files into a tar ball and return its name
827     """
828     import tarfile
829     tarName= common.work_space.pathForTgz()+'share/'+self.additional_tgz_name
830     tar = tarfile.open(tarName, "w:gz")
831     for file in self.additional_inbox_files:
832     tar.add(file,string.split(file,'/')[-1])
833     common.logger.debug(5,"Files added to "+self.additional_tgz_name+" : "+str(tar.getnames()))
834     tar.close()
835     return tarName
836    
837 slacapra 1.1 def wsSetupEnvironment(self, nj):
838     """
839     Returns part of a job script which prepares
840     the execution environment for the job 'nj'.
841     """
842     # Prepare JobType-independent part
843 gutsche 1.3 txt = ''
844    
845     ## OLI_Daniele at this level middleware already known
846    
847     txt += 'if [ $middleware == LCG ]; then \n'
848     txt += self.wsSetupCMSLCGEnvironment_()
849     txt += 'elif [ $middleware == OSG ]; then\n'
850 gutsche 1.43 txt += ' WORKING_DIR=`/bin/mktemp -d $OSG_WN_TMP/cms_XXXXXXXXXXXX`\n'
851     txt += ' echo "Created working directory: $WORKING_DIR"\n'
852 gutsche 1.3 txt += ' if [ ! -d $WORKING_DIR ] ;then\n'
853 gutsche 1.7 txt += ' echo "SET_CMS_ENV 10016 ==> OSG $WORKING_DIR could not be created on WN `hostname`"\n'
854 slacapra 1.90 txt += ' echo "JOB_EXIT_STATUS = 10016"\n'
855     txt += ' echo "JobExitCode=10016" | tee -a $RUNTIME_AREA/$repo\n'
856     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
857 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
858     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
859     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
860 gutsche 1.3 txt += ' exit 1\n'
861     txt += ' fi\n'
862     txt += '\n'
863     txt += ' echo "Change to working directory: $WORKING_DIR"\n'
864     txt += ' cd $WORKING_DIR\n'
865     txt += self.wsSetupCMSOSGEnvironment_()
866     txt += 'fi\n'
867 slacapra 1.1
868     # Prepare JobType-specific part
869     scram = self.scram.commandName()
870     txt += '\n\n'
871     txt += 'echo "### SPECIFIC JOB SETUP ENVIRONMENT ###"\n'
872 slacapra 1.86 txt += 'echo "Setting SCRAM_ARCH='+self.executable_arch+'"\n'
873     txt += 'export SCRAM_ARCH='+self.executable_arch+'\n'
874 slacapra 1.1 txt += scram+' project CMSSW '+self.version+'\n'
875     txt += 'status=$?\n'
876     txt += 'if [ $status != 0 ] ; then\n'
877 gutsche 1.7 txt += ' echo "SET_EXE_ENV 10034 ==>ERROR CMSSW '+self.version+' not found on `hostname`" \n'
878 gutsche 1.3 txt += ' echo "JOB_EXIT_STATUS = 10034"\n'
879 gutsche 1.7 txt += ' echo "JobExitCode=10034" | tee -a $RUNTIME_AREA/$repo\n'
880 slacapra 1.1 txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
881 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
882     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
883     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
884 gutsche 1.3 ## OLI_Daniele
885     txt += ' if [ $middleware == OSG ]; then \n'
886     txt += ' echo "Remove working directory: $WORKING_DIR"\n'
887     txt += ' cd $RUNTIME_AREA\n'
888     txt += ' /bin/rm -rf $WORKING_DIR\n'
889     txt += ' if [ -d $WORKING_DIR ] ;then\n'
890 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'
891     txt += ' echo "JOB_EXIT_STATUS = 10018"\n'
892     txt += ' echo "JobExitCode=10018" | tee -a $RUNTIME_AREA/$repo\n'
893     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
894 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
895     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
896     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
897 gutsche 1.3 txt += ' fi\n'
898     txt += ' fi \n'
899     txt += ' exit 1 \n'
900 slacapra 1.1 txt += 'fi \n'
901     txt += 'echo "CMSSW_VERSION = '+self.version+'"\n'
902     txt += 'cd '+self.version+'\n'
903 fanzago 1.99 ########## FEDE FOR DBS2 ######################
904     txt += 'SOFTWARE_DIR=`pwd`\n'
905     txt += 'echo SOFTWARE_DIR=$SOFTWARE_DIR \n'
906     ###############################################
907 slacapra 1.1 ### needed grep for bug in scramv1 ###
908 corvo 1.58 txt += scram+' runtime -sh\n'
909 slacapra 1.1 txt += 'eval `'+scram+' runtime -sh | grep -v SCRAMRT_LSB_JOBNAME`\n'
910 corvo 1.58 txt += 'echo $PATH\n'
911 slacapra 1.1
912     # Handle the arguments:
913     txt += "\n"
914 gutsche 1.7 txt += "## number of arguments (first argument always jobnumber)\n"
915 slacapra 1.1 txt += "\n"
916 mkirn 1.32 # txt += "narg=$#\n"
917     txt += "if [ $nargs -lt 2 ]\n"
918 slacapra 1.1 txt += "then\n"
919 mkirn 1.33 txt += " echo 'SET_EXE_ENV 1 ==> ERROR Too few arguments' +$nargs+ \n"
920 gutsche 1.3 txt += ' echo "JOB_EXIT_STATUS = 50113"\n'
921 gutsche 1.7 txt += ' echo "JobExitCode=50113" | tee -a $RUNTIME_AREA/$repo\n'
922 slacapra 1.1 txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
923 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
924     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
925     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
926 gutsche 1.3 ## OLI_Daniele
927     txt += ' if [ $middleware == OSG ]; then \n'
928     txt += ' echo "Remove working directory: $WORKING_DIR"\n'
929     txt += ' cd $RUNTIME_AREA\n'
930     txt += ' /bin/rm -rf $WORKING_DIR\n'
931     txt += ' if [ -d $WORKING_DIR ] ;then\n'
932 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'
933     txt += ' echo "JOB_EXIT_STATUS = 50114"\n'
934     txt += ' echo "JobExitCode=50114" | tee -a $RUNTIME_AREA/$repo\n'
935     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
936 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
937     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
938     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
939 gutsche 1.3 txt += ' fi\n'
940     txt += ' fi \n'
941 slacapra 1.1 txt += " exit 1\n"
942     txt += "fi\n"
943     txt += "\n"
944    
945     # Prepare job-specific part
946     job = common.job_list[nj]
947 fanzago 1.93 ### FEDE FOR DBS OUTPUT PUBLICATION
948     if (self.datasetPath):
949     txt += '\n'
950     txt += 'DatasetPath='+self.datasetPath+'\n'
951    
952     datasetpath_split = self.datasetPath.split("/")
953    
954     txt += 'PrimaryDataset='+datasetpath_split[1]+'\n'
955     txt += 'DataTier='+datasetpath_split[2]+'\n'
956 fanzago 1.96 #txt += 'ProcessedDataset='+datasetpath_split[3]+'\n'
957     txt += 'ApplicationFamily=cmsRun\n'
958 fanzago 1.93
959     else:
960     txt += 'DatasetPath=MCDataTier\n'
961     txt += 'PrimaryDataset=null\n'
962     txt += 'DataTier=null\n'
963 fanzago 1.96 #txt += 'ProcessedDataset=null\n'
964 fanzago 1.93 txt += 'ApplicationFamily=MCDataTier\n'
965 spiga 1.42 if self.pset != None: #CarlosDaniele
966     pset = os.path.basename(job.configFilename())
967     txt += '\n'
968 spiga 1.95 txt += 'cp $RUNTIME_AREA/'+pset+' .\n'
969 spiga 1.42 if (self.datasetPath): # standard job
970     #txt += 'InputFiles=$2\n'
971     txt += 'InputFiles=${args[1]}\n'
972     txt += 'MaxEvents=${args[2]}\n'
973     txt += 'SkipEvents=${args[3]}\n'
974     txt += 'echo "Inputfiles:<$InputFiles>"\n'
975 slacapra 1.90 txt += 'sed "s#{\'INPUT\'}#$InputFiles#" '+pset+' > tmp && mv -f tmp '+pset+'\n'
976 spiga 1.42 txt += 'echo "MaxEvents:<$MaxEvents>"\n'
977 slacapra 1.90 txt += 'sed "s#INPUTMAXEVENTS#$MaxEvents#" '+pset+' > tmp && mv -f tmp '+pset+'\n'
978 spiga 1.42 txt += 'echo "SkipEvents:<$SkipEvents>"\n'
979 slacapra 1.90 txt += 'sed "s#INPUTSKIPEVENTS#$SkipEvents#" '+pset+' > tmp && mv -f tmp '+pset+'\n'
980 spiga 1.42 else: # pythia like job
981 slacapra 1.90 seedIndex=1
982     if (self.firstRun):
983     txt += 'FirstRun=${args['+str(seedIndex)+']}\n'
984 spiga 1.57 txt += 'echo "FirstRun: <$FirstRun>"\n'
985 slacapra 1.90 txt += 'sed "s#\<INPUTFIRSTRUN\>#$FirstRun#" '+pset+' > tmp && mv -f tmp '+pset+'\n'
986     seedIndex=seedIndex+1
987    
988 spiga 1.57 if (self.sourceSeed):
989 slacapra 1.90 txt += 'Seed=${args['+str(seedIndex)+']}\n'
990     txt += 'sed "s#\<INPUT\>#$Seed#" '+pset+' > tmp && mv -f tmp '+pset+'\n'
991     seedIndex=seedIndex+1
992     ## the following seeds are not always present
993 spiga 1.42 if (self.sourceSeedVtx):
994 slacapra 1.90 txt += 'VtxSeed=${args['+str(seedIndex)+']}\n'
995 spiga 1.42 txt += 'echo "VtxSeed: <$VtxSeed>"\n'
996 slacapra 1.90 txt += 'sed "s#\<INPUTVTX\>#$VtxSeed#" '+pset+' > tmp && mv -f tmp '+pset+'\n'
997     seedIndex += 1
998     if (self.sourceSeedG4):
999     txt += 'G4Seed=${args['+str(seedIndex)+']}\n'
1000     txt += 'echo "G4Seed: <$G4Seed>"\n'
1001     txt += 'sed "s#\<INPUTG4\>#$G4Seed#" '+pset+' > tmp && mv -f tmp '+pset+'\n'
1002     seedIndex += 1
1003     if (self.sourceSeedMix):
1004     txt += 'mixSeed=${args['+str(seedIndex)+']}\n'
1005     txt += 'echo "MixSeed: <$mixSeed>"\n'
1006     txt += 'sed "s#\<INPUTMIX\>#$mixSeed#" '+pset+' > tmp && mv -f tmp '+pset+'\n'
1007     seedIndex += 1
1008     pass
1009     pass
1010     txt += 'mv -f '+pset+' pset.cfg\n'
1011 slacapra 1.1
1012     if len(self.additional_inbox_files) > 0:
1013 slacapra 1.97 txt += 'if [ -e $RUNTIME_AREA/'+self.additional_tgz_name+' ] ; then\n'
1014     txt += ' tar xzvf $RUNTIME_AREA/'+self.additional_tgz_name+'\n'
1015     txt += 'fi\n'
1016 slacapra 1.1 pass
1017    
1018 spiga 1.42 if self.pset != None: #CarlosDaniele
1019     txt += 'echo "### END JOB SETUP ENVIRONMENT ###"\n\n'
1020    
1021     txt += '\n'
1022     txt += 'echo "***** cat pset.cfg *********"\n'
1023     txt += 'cat pset.cfg\n'
1024     txt += 'echo "****** end pset.cfg ********"\n'
1025     txt += '\n'
1026 fanzago 1.93 ### FEDE FOR DBS OUTPUT PUBLICATION
1027 fanzago 1.94 txt += 'PSETHASH=`EdmConfigHash < pset.cfg` \n'
1028     txt += 'echo "PSETHASH = $PSETHASH" \n'
1029 fanzago 1.93 ##############
1030     txt += '\n'
1031     # txt += 'echo "***** cat pset1.cfg *********"\n'
1032     # txt += 'cat pset1.cfg\n'
1033     # txt += 'echo "****** end pset1.cfg ********"\n'
1034 gutsche 1.3 return txt
1035    
1036 slacapra 1.63 def wsBuildExe(self, nj=0):
1037 gutsche 1.3 """
1038     Put in the script the commands to build an executable
1039     or a library.
1040     """
1041    
1042     txt = ""
1043    
1044     if os.path.isfile(self.tgzNameWithPath):
1045     txt += 'echo "tar xzvf $RUNTIME_AREA/'+os.path.basename(self.tgzNameWithPath)+'"\n'
1046     txt += 'tar xzvf $RUNTIME_AREA/'+os.path.basename(self.tgzNameWithPath)+'\n'
1047     txt += 'untar_status=$? \n'
1048     txt += 'if [ $untar_status -ne 0 ]; then \n'
1049     txt += ' echo "SET_EXE 1 ==> ERROR Untarring .tgz file failed"\n'
1050     txt += ' echo "JOB_EXIT_STATUS = $untar_status" \n'
1051 gutsche 1.7 txt += ' echo "JobExitCode=$untar_status" | tee -a $RUNTIME_AREA/$repo\n'
1052 gutsche 1.3 txt += ' if [ $middleware == OSG ]; then \n'
1053     txt += ' echo "Remove working directory: $WORKING_DIR"\n'
1054     txt += ' cd $RUNTIME_AREA\n'
1055     txt += ' /bin/rm -rf $WORKING_DIR\n'
1056     txt += ' if [ -d $WORKING_DIR ] ;then\n'
1057 gutsche 1.13 txt += ' echo "SET_EXE 50999 ==> OSG $WORKING_DIR could not be deleted on WN `hostname` after Untarring .tgz file failed"\n'
1058     txt += ' echo "JOB_EXIT_STATUS = 50999"\n'
1059     txt += ' echo "JobExitCode=50999" | tee -a $RUNTIME_AREA/$repo\n'
1060     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
1061     txt += ' rm -f $RUNTIME_AREA/$repo \n'
1062     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
1063     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
1064 gutsche 1.3 txt += ' fi\n'
1065     txt += ' fi \n'
1066     txt += ' \n'
1067 gutsche 1.7 txt += ' exit 1 \n'
1068 gutsche 1.3 txt += 'else \n'
1069     txt += ' echo "Successful untar" \n'
1070     txt += 'fi \n'
1071 gutsche 1.50 txt += '\n'
1072 fanzago 1.93 txt += 'echo "Include ProdAgentApi and PRODCOMMON in PYTHONPATH"\n'
1073 gutsche 1.50 txt += 'if [ -z "$PYTHONPATH" ]; then\n'
1074 fanzago 1.93 #### FEDE FOR DBS OUTPUT PUBLICATION
1075 fanzago 1.99 txt += ' export PYTHONPATH=$SOFTWARE_DIR/ProdAgentApi:$SOFTWARE_DIR/ProdCommon\n'
1076     #txt += ' export PYTHONPATH=`pwd`/ProdAgentApi:`pwd`/ProdCommon\n'
1077 fanzago 1.93 #txt += ' export PYTHONPATH=ProdAgentApi\n'
1078 gutsche 1.50 txt += 'else\n'
1079 fanzago 1.99 txt += ' export PYTHONPATH=$SOFTWARE_DIR/ProdAgentApi:$SOFTWARE_DIR/ProdCommon:${PYTHONPATH}\n'
1080     #txt += ' export PYTHONPATH=`pwd`/ProdAgentApi:`pwd`/ProdCommon:${PYTHONPATH}\n'
1081 fanzago 1.93 #txt += ' export PYTHONPATH=ProdAgentApi:${PYTHONPATH}\n'
1082     txt += 'echo "PYTHONPATH=$PYTHONPATH"\n'
1083     ###################
1084 gutsche 1.50 txt += 'fi\n'
1085     txt += '\n'
1086    
1087 gutsche 1.3 pass
1088    
1089 slacapra 1.1 return txt
1090    
1091     def modifySteeringCards(self, nj):
1092     """
1093     modify the card provided by the user,
1094     writing a new card into share dir
1095     """
1096    
1097     def executableName(self):
1098 slacapra 1.70 if self.scriptExe: #CarlosDaniele
1099 spiga 1.42 return "sh "
1100     else:
1101     return self.executable
1102 slacapra 1.1
1103     def executableArgs(self):
1104 slacapra 1.70 if self.scriptExe:#CarlosDaniele
1105 spiga 1.42 return self.scriptExe + " $NJob"
1106     else:
1107     return " -p pset.cfg"
1108 slacapra 1.1
1109     def inputSandbox(self, nj):
1110     """
1111     Returns a list of filenames to be put in JDL input sandbox.
1112     """
1113     inp_box = []
1114 slacapra 1.53 # # dict added to delete duplicate from input sandbox file list
1115     # seen = {}
1116 slacapra 1.1 ## code
1117     if os.path.isfile(self.tgzNameWithPath):
1118     inp_box.append(self.tgzNameWithPath)
1119 corvo 1.58 if os.path.isfile(self.MLtgzfile):
1120     inp_box.append(self.MLtgzfile)
1121 slacapra 1.1 ## config
1122 slacapra 1.70 if not self.pset is None:
1123 corvo 1.56 inp_box.append(common.work_space.pathForTgz() + 'job/' + self.configFilename())
1124 slacapra 1.1 ## additional input files
1125 slacapra 1.97 tgz = self.additionalInputFileTgz()
1126     inp_box.append(tgz)
1127 slacapra 1.1 return inp_box
1128    
1129     def outputSandbox(self, nj):
1130     """
1131     Returns a list of filenames to be put in JDL output sandbox.
1132     """
1133     out_box = []
1134    
1135     ## User Declared output files
1136 slacapra 1.54 for out in (self.output_file+self.output_file_sandbox):
1137 slacapra 1.1 n_out = nj + 1
1138     out_box.append(self.numberFile_(out,str(n_out)))
1139     return out_box
1140    
1141     def prepareSteeringCards(self):
1142     """
1143     Make initial modifications of the user's steering card file.
1144     """
1145     return
1146    
1147     def wsRenameOutput(self, nj):
1148     """
1149     Returns part of a job script which renames the produced files.
1150     """
1151    
1152     txt = '\n'
1153 gutsche 1.7 txt += '# directory content\n'
1154     txt += 'ls \n'
1155 slacapra 1.54
1156     for fileWithSuffix in (self.output_file+self.output_file_sandbox):
1157 slacapra 1.1 output_file_num = self.numberFile_(fileWithSuffix, '$NJob')
1158     txt += '\n'
1159 gutsche 1.7 txt += '# check output file\n'
1160 slacapra 1.1 txt += 'ls '+fileWithSuffix+'\n'
1161 fanzago 1.18 txt += 'ls_result=$?\n'
1162     txt += 'if [ $ls_result -ne 0 ] ; then\n'
1163 spiga 1.88 txt += ' exit_status=60302\n'
1164 fanzago 1.18 txt += ' echo "ERROR: Problem with output file"\n'
1165 gutsche 1.7 if common.scheduler.boss_scheduler_name == 'condor_g':
1166     txt += ' if [ $middleware == OSG ]; then \n'
1167     txt += ' echo "prepare dummy output file"\n'
1168     txt += ' echo "Processing of job output failed" > $RUNTIME_AREA/'+output_file_num+'\n'
1169     txt += ' fi \n'
1170 slacapra 1.1 txt += 'else\n'
1171 fanzago 1.93 ### FEDE FOR DBS OUTPUT PUBLICATION
1172     txt += ' mv '+fileWithSuffix+' $RUNTIME_AREA\n'
1173     txt += ' cp $RUNTIME_AREA/'+fileWithSuffix+' $RUNTIME_AREA/'+output_file_num+'\n'
1174     #################################
1175 slacapra 1.1 txt += 'fi\n'
1176    
1177 gutsche 1.7 txt += 'cd $RUNTIME_AREA\n'
1178 fanzago 1.99 #### FEDE this is the cleanEnv function
1179 gutsche 1.3 ### OLI_DANIELE
1180 fanzago 1.99 #txt += 'if [ $middleware == OSG ]; then\n'
1181     #txt += ' cd $RUNTIME_AREA\n'
1182     #txt += ' echo "Remove working directory: $WORKING_DIR"\n'
1183     #txt += ' /bin/rm -rf $WORKING_DIR\n'
1184     #txt += ' if [ -d $WORKING_DIR ] ;then\n'
1185     #txt += ' echo "SET_EXE 60999 ==> OSG $WORKING_DIR could not be deleted on WN `hostname` after cleanup of WN"\n'
1186     #txt += ' echo "JOB_EXIT_STATUS = 60999"\n'
1187     #txt += ' echo "JobExitCode=60999" | tee -a $RUNTIME_AREA/$repo\n'
1188     #txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
1189     #txt += ' rm -f $RUNTIME_AREA/$repo \n'
1190     #txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
1191     #txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
1192     #txt += ' fi\n'
1193     #txt += 'fi\n'
1194     #txt += '\n'
1195 slacapra 1.54
1196     file_list = ''
1197     ## Add to filelist only files to be possibly copied to SE
1198     for fileWithSuffix in self.output_file:
1199     output_file_num = self.numberFile_(fileWithSuffix, '$NJob')
1200     file_list=file_list+output_file_num+' '
1201     file_list=file_list[:-1]
1202     txt += 'file_list="'+file_list+'"\n'
1203    
1204 slacapra 1.1 return txt
1205    
1206     def numberFile_(self, file, txt):
1207     """
1208     append _'txt' before last extension of a file
1209     """
1210     p = string.split(file,".")
1211     # take away last extension
1212     name = p[0]
1213     for x in p[1:-1]:
1214 slacapra 1.90 name=name+"."+x
1215 slacapra 1.1 # add "_txt"
1216     if len(p)>1:
1217 slacapra 1.90 ext = p[len(p)-1]
1218     result = name + '_' + txt + "." + ext
1219 slacapra 1.1 else:
1220 slacapra 1.90 result = name + '_' + txt
1221 slacapra 1.1
1222     return result
1223    
1224 slacapra 1.63 def getRequirements(self, nj=[]):
1225 slacapra 1.1 """
1226     return job requirements to add to jdl files
1227     """
1228     req = ''
1229 slacapra 1.47 if self.version:
1230 slacapra 1.10 req='Member("VO-cms-' + \
1231 slacapra 1.47 self.version + \
1232 slacapra 1.10 '", other.GlueHostApplicationSoftwareRunTimeEnvironment)'
1233 slacapra 1.91 # if self.executable_arch:
1234     # req='Member("VO-cms-' + \
1235     # self.executable_arch + \
1236     # '", other.GlueHostApplicationSoftwareRunTimeEnvironment)'
1237 gutsche 1.35
1238     req = req + ' && (other.GlueHostNetworkAdapterOutboundIP)'
1239    
1240 slacapra 1.1 return req
1241 gutsche 1.3
1242     def configFilename(self):
1243     """ return the config filename """
1244     return self.name()+'.cfg'
1245    
1246     ### OLI_DANIELE
1247     def wsSetupCMSOSGEnvironment_(self):
1248     """
1249     Returns part of a job script which is prepares
1250     the execution environment and which is common for all CMS jobs.
1251     """
1252     txt = '\n'
1253     txt += ' echo "### SETUP CMS OSG ENVIRONMENT ###"\n'
1254     txt += ' if [ -f $GRID3_APP_DIR/cmssoft/cmsset_default.sh ] ;then\n'
1255     txt += ' # Use $GRID3_APP_DIR/cmssoft/cmsset_default.sh to setup cms software\n'
1256 spiga 1.87 txt += ' export SCRAM_ARCH='+self.executable_arch+'\n'
1257 gutsche 1.3 txt += ' source $GRID3_APP_DIR/cmssoft/cmsset_default.sh '+self.version+'\n'
1258 mkirn 1.40 txt += ' elif [ -f $OSG_APP/cmssoft/cms/cmsset_default.sh ] ;then\n'
1259     txt += ' # Use $OSG_APP/cmssoft/cms/cmsset_default.sh to setup cms software\n'
1260 spiga 1.87 txt += ' export SCRAM_ARCH='+self.executable_arch+'\n'
1261 mkirn 1.40 txt += ' source $OSG_APP/cmssoft/cms/cmsset_default.sh '+self.version+'\n'
1262 gutsche 1.3 txt += ' else\n'
1263 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'
1264 gutsche 1.3 txt += ' echo "JOB_EXIT_STATUS = 10020"\n'
1265     txt += ' echo "JobExitCode=10020" | tee -a $RUNTIME_AREA/$repo\n'
1266     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
1267 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
1268     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
1269     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
1270 gutsche 1.7 txt += ' exit 1\n'
1271 gutsche 1.3 txt += '\n'
1272     txt += ' echo "Remove working directory: $WORKING_DIR"\n'
1273     txt += ' cd $RUNTIME_AREA\n'
1274     txt += ' /bin/rm -rf $WORKING_DIR\n'
1275     txt += ' if [ -d $WORKING_DIR ] ;then\n'
1276 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'
1277     txt += ' echo "JOB_EXIT_STATUS = 10017"\n'
1278     txt += ' echo "JobExitCode=10017" | tee -a $RUNTIME_AREA/$repo\n'
1279     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
1280     txt += ' rm -f $RUNTIME_AREA/$repo \n'
1281     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
1282     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
1283 gutsche 1.3 txt += ' fi\n'
1284     txt += '\n'
1285 gutsche 1.7 txt += ' exit 1\n'
1286 gutsche 1.3 txt += ' fi\n'
1287     txt += '\n'
1288     txt += ' echo "SET_CMS_ENV 0 ==> setup cms environment ok"\n'
1289     txt += ' echo " END SETUP CMS OSG ENVIRONMENT "\n'
1290    
1291     return txt
1292    
1293     ### OLI_DANIELE
1294     def wsSetupCMSLCGEnvironment_(self):
1295     """
1296     Returns part of a job script which is prepares
1297     the execution environment and which is common for all CMS jobs.
1298     """
1299     txt = ' \n'
1300     txt += ' echo " ### SETUP CMS LCG ENVIRONMENT ### "\n'
1301     txt += ' if [ ! $VO_CMS_SW_DIR ] ;then\n'
1302     txt += ' echo "SET_CMS_ENV 10031 ==> ERROR CMS software dir not found on WN `hostname`"\n'
1303     txt += ' echo "JOB_EXIT_STATUS = 10031" \n'
1304     txt += ' echo "JobExitCode=10031" | tee -a $RUNTIME_AREA/$repo\n'
1305     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
1306 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
1307     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
1308     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
1309 gutsche 1.7 txt += ' exit 1\n'
1310 gutsche 1.3 txt += ' else\n'
1311     txt += ' echo "Sourcing environment... "\n'
1312     txt += ' if [ ! -s $VO_CMS_SW_DIR/cmsset_default.sh ] ;then\n'
1313     txt += ' echo "SET_CMS_ENV 10020 ==> ERROR cmsset_default.sh file not found into dir $VO_CMS_SW_DIR"\n'
1314     txt += ' echo "JOB_EXIT_STATUS = 10020"\n'
1315     txt += ' echo "JobExitCode=10020" | tee -a $RUNTIME_AREA/$repo\n'
1316     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
1317 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
1318     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
1319     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
1320 gutsche 1.7 txt += ' exit 1\n'
1321 gutsche 1.3 txt += ' fi\n'
1322     txt += ' echo "sourcing $VO_CMS_SW_DIR/cmsset_default.sh"\n'
1323     txt += ' source $VO_CMS_SW_DIR/cmsset_default.sh\n'
1324     txt += ' result=$?\n'
1325     txt += ' if [ $result -ne 0 ]; then\n'
1326     txt += ' echo "SET_CMS_ENV 10032 ==> ERROR problem sourcing $VO_CMS_SW_DIR/cmsset_default.sh"\n'
1327     txt += ' echo "JOB_EXIT_STATUS = 10032"\n'
1328     txt += ' echo "JobExitCode=10032" | tee -a $RUNTIME_AREA/$repo\n'
1329     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
1330 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
1331     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
1332     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
1333 gutsche 1.7 txt += ' exit 1\n'
1334 gutsche 1.3 txt += ' fi\n'
1335     txt += ' fi\n'
1336     txt += ' \n'
1337     txt += ' echo "SET_CMS_ENV 0 ==> setup cms environment ok"\n'
1338     txt += ' echo "### END SETUP CMS LCG ENVIRONMENT ###"\n'
1339     return txt
1340 gutsche 1.5
1341 fanzago 1.93 ### FEDE FOR DBS OUTPUT PUBLICATION
1342     def modifyReport(self, nj):
1343     """
1344     insert the part of the script that modifies the FrameworkJob Report
1345     """
1346 fanzago 1.94
1347 fanzago 1.93 txt = ''
1348     txt += 'echo "Modify Job Report" \n'
1349 fanzago 1.99 #txt += 'chmod a+x $RUNTIME_AREA/'+self.version+'/ProdAgentApi/FwkJobRep/ModifyJobReport.py\n'
1350     ################ FEDE FOR DBS2 #############################################
1351     txt += 'chmod a+x $SOFTWARE_DIR/ProdAgentApi/FwkJobRep/ModifyJobReport.py\n'
1352     #############################################################################
1353 fanzago 1.94 try:
1354     publish_data = int(self.cfg_params['USER.publish_data'])
1355     except KeyError:
1356     publish_data = 0
1357    
1358 fanzago 1.93 txt += 'if [ -z "$SE" ]; then\n'
1359     txt += ' SE="" \n'
1360     txt += 'fi \n'
1361     txt += 'if [ -z "$SE_PATH" ]; then\n'
1362     txt += ' SE_PATH="" \n'
1363     txt += 'fi \n'
1364     txt += 'echo "SE = $SE"\n'
1365     txt += 'echo "SE_PATH = $SE_PATH"\n'
1366 fanzago 1.94
1367     if (publish_data == 1):
1368     #processedDataset = self.cfg_params['USER.processed_datasetname']
1369     processedDataset = self.cfg_params['USER.publish_data_name']
1370     txt += 'ProcessedDataset='+processedDataset+'\n'
1371     #### LFN=/store/user/<user>/processedDataset_PSETHASH
1372     txt += 'if [ "$SE_PATH" == "" ]; then\n'
1373 fanzago 1.101 #### FEDE: added slash in LFN ##############
1374     txt += ' FOR_LFN=/copy_problems/ \n'
1375 fanzago 1.94 txt += 'else \n'
1376     txt += ' tmp=`echo $SE_PATH | awk -F \'store\' \'{print$2}\'` \n'
1377 fanzago 1.101 ##### FEDE TO BE CHANGED, BECAUSE STORE IS HARDCODED!!!! ########
1378 fanzago 1.94 txt += ' FOR_LFN=/store$tmp \n'
1379     txt += 'fi \n'
1380     txt += 'echo "ProcessedDataset = $ProcessedDataset"\n'
1381     txt += 'echo "FOR_LFN = $FOR_LFN" \n'
1382     else:
1383     txt += 'ProcessedDataset=no_data_to_publish \n'
1384 fanzago 1.101 #### FEDE: added slash in LFN ##############
1385     txt += 'FOR_LFN=/local/ \n'
1386 fanzago 1.94 txt += 'echo "ProcessedDataset = $ProcessedDataset"\n'
1387     txt += 'echo "FOR_LFN = $FOR_LFN" \n'
1388     txt += 'echo "CMSSW_VERSION = $CMSSW_VERSION"\n\n'
1389 fanzago 1.99 #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'
1390     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'
1391     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'
1392     #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'
1393 fanzago 1.93 txt += 'modifyReport_result=$?\n'
1394     txt += 'echo modifyReport_result = $modifyReport_result\n'
1395 fanzago 1.100 txt += 'if [ $modifyReport_result -ne 0 ]; then\n'
1396 fanzago 1.93 txt += ' exit_status=1\n'
1397     txt += ' echo "ERROR: Problem with ModifyJobReport"\n'
1398     txt += 'else\n'
1399     txt += ' mv NewFrameworkJobReport.xml crab_fjr_$NJob.xml\n'
1400     txt += 'fi\n'
1401     return txt
1402 fanzago 1.99
1403     def cleanEnv(self):
1404     ### OLI_DANIELE
1405     txt = ''
1406     txt += 'if [ $middleware == OSG ]; then\n'
1407     txt += ' cd $RUNTIME_AREA\n'
1408     txt += ' echo "Remove working directory: $WORKING_DIR"\n'
1409     txt += ' /bin/rm -rf $WORKING_DIR\n'
1410     txt += ' if [ -d $WORKING_DIR ] ;then\n'
1411     txt += ' echo "SET_EXE 60999 ==> OSG $WORKING_DIR could not be deleted on WN `hostname` after cleanup of WN"\n'
1412     txt += ' echo "JOB_EXIT_STATUS = 60999"\n'
1413     txt += ' echo "JobExitCode=60999" | tee -a $RUNTIME_AREA/$repo\n'
1414     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
1415     txt += ' rm -f $RUNTIME_AREA/$repo \n'
1416     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
1417     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
1418     txt += ' fi\n'
1419     txt += 'fi\n'
1420     txt += '\n'
1421     return txt
1422 fanzago 1.93
1423 gutsche 1.5 def setParam_(self, param, value):
1424     self._params[param] = value
1425    
1426     def getParams(self):
1427     return self._params
1428 gutsche 1.8
1429     def setTaskid_(self):
1430     self._taskId = self.cfg_params['taskId']
1431    
1432     def getTaskid(self):
1433     return self._taskId
1434 gutsche 1.35
1435     def uniquelist(self, old):
1436     """
1437     remove duplicates from a list
1438     """
1439     nd={}
1440     for e in old:
1441     nd[e]=0
1442     return nd.keys()