ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/CRAB/python/cms_cmssw.py
Revision: 1.104
Committed: Sat Jul 14 14:42:55 2007 UTC (17 years, 9 months ago) by gutsche
Content type: text/x-python
Branch: MAIN
Changes since 1.103: +9 -15 lines
Log Message:
fix sorting in screen output

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 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 spiga 1.102 # txt += 'echo "Setting SCRAM_ARCH='+self.executable_arch+'"\n'
871     # txt += 'export SCRAM_ARCH='+self.executable_arch+'\n'
872 slacapra 1.1 txt += scram+' project CMSSW '+self.version+'\n'
873     txt += 'status=$?\n'
874     txt += 'if [ $status != 0 ] ; then\n'
875 gutsche 1.7 txt += ' echo "SET_EXE_ENV 10034 ==>ERROR CMSSW '+self.version+' not found on `hostname`" \n'
876 gutsche 1.3 txt += ' echo "JOB_EXIT_STATUS = 10034"\n'
877 gutsche 1.7 txt += ' echo "JobExitCode=10034" | tee -a $RUNTIME_AREA/$repo\n'
878 slacapra 1.1 txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
879 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
880     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
881     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
882 gutsche 1.3 ## OLI_Daniele
883     txt += ' if [ $middleware == OSG ]; then \n'
884     txt += ' echo "Remove working directory: $WORKING_DIR"\n'
885     txt += ' cd $RUNTIME_AREA\n'
886     txt += ' /bin/rm -rf $WORKING_DIR\n'
887     txt += ' if [ -d $WORKING_DIR ] ;then\n'
888 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'
889     txt += ' echo "JOB_EXIT_STATUS = 10018"\n'
890     txt += ' echo "JobExitCode=10018" | tee -a $RUNTIME_AREA/$repo\n'
891     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
892 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
893     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
894     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
895 gutsche 1.3 txt += ' fi\n'
896     txt += ' fi \n'
897     txt += ' exit 1 \n'
898 slacapra 1.1 txt += 'fi \n'
899     txt += 'echo "CMSSW_VERSION = '+self.version+'"\n'
900     txt += 'cd '+self.version+'\n'
901 fanzago 1.99 ########## FEDE FOR DBS2 ######################
902     txt += 'SOFTWARE_DIR=`pwd`\n'
903     txt += 'echo SOFTWARE_DIR=$SOFTWARE_DIR \n'
904     ###############################################
905 slacapra 1.1 ### needed grep for bug in scramv1 ###
906 corvo 1.58 txt += scram+' runtime -sh\n'
907 slacapra 1.1 txt += 'eval `'+scram+' runtime -sh | grep -v SCRAMRT_LSB_JOBNAME`\n'
908 corvo 1.58 txt += 'echo $PATH\n'
909 slacapra 1.1
910     # Handle the arguments:
911     txt += "\n"
912 gutsche 1.7 txt += "## number of arguments (first argument always jobnumber)\n"
913 slacapra 1.1 txt += "\n"
914 mkirn 1.32 # txt += "narg=$#\n"
915     txt += "if [ $nargs -lt 2 ]\n"
916 slacapra 1.1 txt += "then\n"
917 mkirn 1.33 txt += " echo 'SET_EXE_ENV 1 ==> ERROR Too few arguments' +$nargs+ \n"
918 gutsche 1.3 txt += ' echo "JOB_EXIT_STATUS = 50113"\n'
919 gutsche 1.7 txt += ' echo "JobExitCode=50113" | tee -a $RUNTIME_AREA/$repo\n'
920 slacapra 1.1 txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
921 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
922     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
923     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
924 gutsche 1.3 ## OLI_Daniele
925     txt += ' if [ $middleware == OSG ]; then \n'
926     txt += ' echo "Remove working directory: $WORKING_DIR"\n'
927     txt += ' cd $RUNTIME_AREA\n'
928     txt += ' /bin/rm -rf $WORKING_DIR\n'
929     txt += ' if [ -d $WORKING_DIR ] ;then\n'
930 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'
931     txt += ' echo "JOB_EXIT_STATUS = 50114"\n'
932     txt += ' echo "JobExitCode=50114" | tee -a $RUNTIME_AREA/$repo\n'
933     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
934 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
935     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
936     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
937 gutsche 1.3 txt += ' fi\n'
938     txt += ' fi \n'
939 slacapra 1.1 txt += " exit 1\n"
940     txt += "fi\n"
941     txt += "\n"
942    
943     # Prepare job-specific part
944     job = common.job_list[nj]
945 fanzago 1.93 ### FEDE FOR DBS OUTPUT PUBLICATION
946     if (self.datasetPath):
947     txt += '\n'
948     txt += 'DatasetPath='+self.datasetPath+'\n'
949    
950     datasetpath_split = self.datasetPath.split("/")
951    
952     txt += 'PrimaryDataset='+datasetpath_split[1]+'\n'
953     txt += 'DataTier='+datasetpath_split[2]+'\n'
954 fanzago 1.96 #txt += 'ProcessedDataset='+datasetpath_split[3]+'\n'
955     txt += 'ApplicationFamily=cmsRun\n'
956 fanzago 1.93
957     else:
958     txt += 'DatasetPath=MCDataTier\n'
959     txt += 'PrimaryDataset=null\n'
960     txt += 'DataTier=null\n'
961 fanzago 1.96 #txt += 'ProcessedDataset=null\n'
962 fanzago 1.93 txt += 'ApplicationFamily=MCDataTier\n'
963 spiga 1.42 if self.pset != None: #CarlosDaniele
964     pset = os.path.basename(job.configFilename())
965     txt += '\n'
966 spiga 1.95 txt += 'cp $RUNTIME_AREA/'+pset+' .\n'
967 spiga 1.42 if (self.datasetPath): # standard job
968     #txt += 'InputFiles=$2\n'
969     txt += 'InputFiles=${args[1]}\n'
970     txt += 'MaxEvents=${args[2]}\n'
971     txt += 'SkipEvents=${args[3]}\n'
972     txt += 'echo "Inputfiles:<$InputFiles>"\n'
973 slacapra 1.90 txt += 'sed "s#{\'INPUT\'}#$InputFiles#" '+pset+' > tmp && mv -f tmp '+pset+'\n'
974 spiga 1.42 txt += 'echo "MaxEvents:<$MaxEvents>"\n'
975 slacapra 1.90 txt += 'sed "s#INPUTMAXEVENTS#$MaxEvents#" '+pset+' > tmp && mv -f tmp '+pset+'\n'
976 spiga 1.42 txt += 'echo "SkipEvents:<$SkipEvents>"\n'
977 slacapra 1.90 txt += 'sed "s#INPUTSKIPEVENTS#$SkipEvents#" '+pset+' > tmp && mv -f tmp '+pset+'\n'
978 spiga 1.42 else: # pythia like job
979 slacapra 1.90 seedIndex=1
980     if (self.firstRun):
981     txt += 'FirstRun=${args['+str(seedIndex)+']}\n'
982 spiga 1.57 txt += 'echo "FirstRun: <$FirstRun>"\n'
983 slacapra 1.90 txt += 'sed "s#\<INPUTFIRSTRUN\>#$FirstRun#" '+pset+' > tmp && mv -f tmp '+pset+'\n'
984     seedIndex=seedIndex+1
985    
986 spiga 1.57 if (self.sourceSeed):
987 slacapra 1.90 txt += 'Seed=${args['+str(seedIndex)+']}\n'
988     txt += 'sed "s#\<INPUT\>#$Seed#" '+pset+' > tmp && mv -f tmp '+pset+'\n'
989     seedIndex=seedIndex+1
990     ## the following seeds are not always present
991 spiga 1.42 if (self.sourceSeedVtx):
992 slacapra 1.90 txt += 'VtxSeed=${args['+str(seedIndex)+']}\n'
993 spiga 1.42 txt += 'echo "VtxSeed: <$VtxSeed>"\n'
994 slacapra 1.90 txt += 'sed "s#\<INPUTVTX\>#$VtxSeed#" '+pset+' > tmp && mv -f tmp '+pset+'\n'
995     seedIndex += 1
996     if (self.sourceSeedG4):
997     txt += 'G4Seed=${args['+str(seedIndex)+']}\n'
998     txt += 'echo "G4Seed: <$G4Seed>"\n'
999     txt += 'sed "s#\<INPUTG4\>#$G4Seed#" '+pset+' > tmp && mv -f tmp '+pset+'\n'
1000     seedIndex += 1
1001     if (self.sourceSeedMix):
1002     txt += 'mixSeed=${args['+str(seedIndex)+']}\n'
1003     txt += 'echo "MixSeed: <$mixSeed>"\n'
1004     txt += 'sed "s#\<INPUTMIX\>#$mixSeed#" '+pset+' > tmp && mv -f tmp '+pset+'\n'
1005     seedIndex += 1
1006     pass
1007     pass
1008     txt += 'mv -f '+pset+' pset.cfg\n'
1009 slacapra 1.1
1010     if len(self.additional_inbox_files) > 0:
1011 slacapra 1.97 txt += 'if [ -e $RUNTIME_AREA/'+self.additional_tgz_name+' ] ; then\n'
1012     txt += ' tar xzvf $RUNTIME_AREA/'+self.additional_tgz_name+'\n'
1013     txt += 'fi\n'
1014 slacapra 1.1 pass
1015    
1016 spiga 1.42 if self.pset != None: #CarlosDaniele
1017     txt += 'echo "### END JOB SETUP ENVIRONMENT ###"\n\n'
1018    
1019     txt += '\n'
1020     txt += 'echo "***** cat pset.cfg *********"\n'
1021     txt += 'cat pset.cfg\n'
1022     txt += 'echo "****** end pset.cfg ********"\n'
1023     txt += '\n'
1024 fanzago 1.93 ### FEDE FOR DBS OUTPUT PUBLICATION
1025 fanzago 1.94 txt += 'PSETHASH=`EdmConfigHash < pset.cfg` \n'
1026     txt += 'echo "PSETHASH = $PSETHASH" \n'
1027 fanzago 1.93 ##############
1028     txt += '\n'
1029     # txt += 'echo "***** cat pset1.cfg *********"\n'
1030     # txt += 'cat pset1.cfg\n'
1031     # txt += 'echo "****** end pset1.cfg ********"\n'
1032 gutsche 1.3 return txt
1033    
1034 slacapra 1.63 def wsBuildExe(self, nj=0):
1035 gutsche 1.3 """
1036     Put in the script the commands to build an executable
1037     or a library.
1038     """
1039    
1040     txt = ""
1041    
1042     if os.path.isfile(self.tgzNameWithPath):
1043     txt += 'echo "tar xzvf $RUNTIME_AREA/'+os.path.basename(self.tgzNameWithPath)+'"\n'
1044     txt += 'tar xzvf $RUNTIME_AREA/'+os.path.basename(self.tgzNameWithPath)+'\n'
1045     txt += 'untar_status=$? \n'
1046     txt += 'if [ $untar_status -ne 0 ]; then \n'
1047     txt += ' echo "SET_EXE 1 ==> ERROR Untarring .tgz file failed"\n'
1048     txt += ' echo "JOB_EXIT_STATUS = $untar_status" \n'
1049 gutsche 1.7 txt += ' echo "JobExitCode=$untar_status" | tee -a $RUNTIME_AREA/$repo\n'
1050 gutsche 1.3 txt += ' if [ $middleware == OSG ]; then \n'
1051     txt += ' echo "Remove working directory: $WORKING_DIR"\n'
1052     txt += ' cd $RUNTIME_AREA\n'
1053     txt += ' /bin/rm -rf $WORKING_DIR\n'
1054     txt += ' if [ -d $WORKING_DIR ] ;then\n'
1055 gutsche 1.13 txt += ' echo "SET_EXE 50999 ==> OSG $WORKING_DIR could not be deleted on WN `hostname` after Untarring .tgz file failed"\n'
1056     txt += ' echo "JOB_EXIT_STATUS = 50999"\n'
1057     txt += ' echo "JobExitCode=50999" | tee -a $RUNTIME_AREA/$repo\n'
1058     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
1059     txt += ' rm -f $RUNTIME_AREA/$repo \n'
1060     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
1061     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
1062 gutsche 1.3 txt += ' fi\n'
1063     txt += ' fi \n'
1064     txt += ' \n'
1065 gutsche 1.7 txt += ' exit 1 \n'
1066 gutsche 1.3 txt += 'else \n'
1067     txt += ' echo "Successful untar" \n'
1068     txt += 'fi \n'
1069 gutsche 1.50 txt += '\n'
1070 fanzago 1.93 txt += 'echo "Include ProdAgentApi and PRODCOMMON in PYTHONPATH"\n'
1071 gutsche 1.50 txt += 'if [ -z "$PYTHONPATH" ]; then\n'
1072 fanzago 1.93 #### FEDE FOR DBS OUTPUT PUBLICATION
1073 fanzago 1.99 txt += ' export PYTHONPATH=$SOFTWARE_DIR/ProdAgentApi:$SOFTWARE_DIR/ProdCommon\n'
1074     #txt += ' export PYTHONPATH=`pwd`/ProdAgentApi:`pwd`/ProdCommon\n'
1075 fanzago 1.93 #txt += ' export PYTHONPATH=ProdAgentApi\n'
1076 gutsche 1.50 txt += 'else\n'
1077 fanzago 1.99 txt += ' export PYTHONPATH=$SOFTWARE_DIR/ProdAgentApi:$SOFTWARE_DIR/ProdCommon:${PYTHONPATH}\n'
1078     #txt += ' export PYTHONPATH=`pwd`/ProdAgentApi:`pwd`/ProdCommon:${PYTHONPATH}\n'
1079 fanzago 1.93 #txt += ' export PYTHONPATH=ProdAgentApi:${PYTHONPATH}\n'
1080     txt += 'echo "PYTHONPATH=$PYTHONPATH"\n'
1081     ###################
1082 gutsche 1.50 txt += 'fi\n'
1083     txt += '\n'
1084    
1085 gutsche 1.3 pass
1086    
1087 slacapra 1.1 return txt
1088    
1089     def modifySteeringCards(self, nj):
1090     """
1091     modify the card provided by the user,
1092     writing a new card into share dir
1093     """
1094    
1095     def executableName(self):
1096 slacapra 1.70 if self.scriptExe: #CarlosDaniele
1097 spiga 1.42 return "sh "
1098     else:
1099     return self.executable
1100 slacapra 1.1
1101     def executableArgs(self):
1102 slacapra 1.70 if self.scriptExe:#CarlosDaniele
1103 spiga 1.42 return self.scriptExe + " $NJob"
1104     else:
1105     return " -p pset.cfg"
1106 slacapra 1.1
1107     def inputSandbox(self, nj):
1108     """
1109     Returns a list of filenames to be put in JDL input sandbox.
1110     """
1111     inp_box = []
1112 slacapra 1.53 # # dict added to delete duplicate from input sandbox file list
1113     # seen = {}
1114 slacapra 1.1 ## code
1115     if os.path.isfile(self.tgzNameWithPath):
1116     inp_box.append(self.tgzNameWithPath)
1117 corvo 1.58 if os.path.isfile(self.MLtgzfile):
1118     inp_box.append(self.MLtgzfile)
1119 slacapra 1.1 ## config
1120 slacapra 1.70 if not self.pset is None:
1121 corvo 1.56 inp_box.append(common.work_space.pathForTgz() + 'job/' + self.configFilename())
1122 slacapra 1.1 ## additional input files
1123 slacapra 1.97 tgz = self.additionalInputFileTgz()
1124     inp_box.append(tgz)
1125 slacapra 1.1 return inp_box
1126    
1127     def outputSandbox(self, nj):
1128     """
1129     Returns a list of filenames to be put in JDL output sandbox.
1130     """
1131     out_box = []
1132    
1133     ## User Declared output files
1134 slacapra 1.54 for out in (self.output_file+self.output_file_sandbox):
1135 slacapra 1.1 n_out = nj + 1
1136     out_box.append(self.numberFile_(out,str(n_out)))
1137     return out_box
1138    
1139     def prepareSteeringCards(self):
1140     """
1141     Make initial modifications of the user's steering card file.
1142     """
1143     return
1144    
1145     def wsRenameOutput(self, nj):
1146     """
1147     Returns part of a job script which renames the produced files.
1148     """
1149    
1150     txt = '\n'
1151 gutsche 1.7 txt += '# directory content\n'
1152     txt += 'ls \n'
1153 slacapra 1.54
1154     for fileWithSuffix in (self.output_file+self.output_file_sandbox):
1155 slacapra 1.1 output_file_num = self.numberFile_(fileWithSuffix, '$NJob')
1156     txt += '\n'
1157 gutsche 1.7 txt += '# check output file\n'
1158 slacapra 1.1 txt += 'ls '+fileWithSuffix+'\n'
1159 fanzago 1.18 txt += 'ls_result=$?\n'
1160     txt += 'if [ $ls_result -ne 0 ] ; then\n'
1161 spiga 1.88 txt += ' exit_status=60302\n'
1162 fanzago 1.18 txt += ' echo "ERROR: Problem with output file"\n'
1163 gutsche 1.7 if common.scheduler.boss_scheduler_name == 'condor_g':
1164     txt += ' if [ $middleware == OSG ]; then \n'
1165     txt += ' echo "prepare dummy output file"\n'
1166     txt += ' echo "Processing of job output failed" > $RUNTIME_AREA/'+output_file_num+'\n'
1167     txt += ' fi \n'
1168 slacapra 1.1 txt += 'else\n'
1169 fanzago 1.93 ### FEDE FOR DBS OUTPUT PUBLICATION
1170     txt += ' mv '+fileWithSuffix+' $RUNTIME_AREA\n'
1171     txt += ' cp $RUNTIME_AREA/'+fileWithSuffix+' $RUNTIME_AREA/'+output_file_num+'\n'
1172     #################################
1173 slacapra 1.1 txt += 'fi\n'
1174    
1175 gutsche 1.7 txt += 'cd $RUNTIME_AREA\n'
1176 fanzago 1.99 #### FEDE this is the cleanEnv function
1177 gutsche 1.3 ### OLI_DANIELE
1178 fanzago 1.99 #txt += 'if [ $middleware == OSG ]; then\n'
1179     #txt += ' cd $RUNTIME_AREA\n'
1180     #txt += ' echo "Remove working directory: $WORKING_DIR"\n'
1181     #txt += ' /bin/rm -rf $WORKING_DIR\n'
1182     #txt += ' if [ -d $WORKING_DIR ] ;then\n'
1183     #txt += ' echo "SET_EXE 60999 ==> OSG $WORKING_DIR could not be deleted on WN `hostname` after cleanup of WN"\n'
1184     #txt += ' echo "JOB_EXIT_STATUS = 60999"\n'
1185     #txt += ' echo "JobExitCode=60999" | tee -a $RUNTIME_AREA/$repo\n'
1186     #txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
1187     #txt += ' rm -f $RUNTIME_AREA/$repo \n'
1188     #txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
1189     #txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
1190     #txt += ' fi\n'
1191     #txt += 'fi\n'
1192     #txt += '\n'
1193 slacapra 1.54
1194     file_list = ''
1195     ## Add to filelist only files to be possibly copied to SE
1196     for fileWithSuffix in self.output_file:
1197     output_file_num = self.numberFile_(fileWithSuffix, '$NJob')
1198     file_list=file_list+output_file_num+' '
1199     file_list=file_list[:-1]
1200     txt += 'file_list="'+file_list+'"\n'
1201    
1202 slacapra 1.1 return txt
1203    
1204     def numberFile_(self, file, txt):
1205     """
1206     append _'txt' before last extension of a file
1207     """
1208     p = string.split(file,".")
1209     # take away last extension
1210     name = p[0]
1211     for x in p[1:-1]:
1212 slacapra 1.90 name=name+"."+x
1213 slacapra 1.1 # add "_txt"
1214     if len(p)>1:
1215 slacapra 1.90 ext = p[len(p)-1]
1216     result = name + '_' + txt + "." + ext
1217 slacapra 1.1 else:
1218 slacapra 1.90 result = name + '_' + txt
1219 slacapra 1.1
1220     return result
1221    
1222 slacapra 1.63 def getRequirements(self, nj=[]):
1223 slacapra 1.1 """
1224     return job requirements to add to jdl files
1225     """
1226     req = ''
1227 slacapra 1.47 if self.version:
1228 slacapra 1.10 req='Member("VO-cms-' + \
1229 slacapra 1.47 self.version + \
1230 slacapra 1.10 '", other.GlueHostApplicationSoftwareRunTimeEnvironment)'
1231 slacapra 1.91 # if self.executable_arch:
1232     # req='Member("VO-cms-' + \
1233     # self.executable_arch + \
1234     # '", other.GlueHostApplicationSoftwareRunTimeEnvironment)'
1235 gutsche 1.35
1236     req = req + ' && (other.GlueHostNetworkAdapterOutboundIP)'
1237    
1238 slacapra 1.1 return req
1239 gutsche 1.3
1240     def configFilename(self):
1241     """ return the config filename """
1242     return self.name()+'.cfg'
1243    
1244     ### OLI_DANIELE
1245     def wsSetupCMSOSGEnvironment_(self):
1246     """
1247     Returns part of a job script which is prepares
1248     the execution environment and which is common for all CMS jobs.
1249     """
1250     txt = '\n'
1251     txt += ' echo "### SETUP CMS OSG ENVIRONMENT ###"\n'
1252     txt += ' if [ -f $GRID3_APP_DIR/cmssoft/cmsset_default.sh ] ;then\n'
1253     txt += ' # Use $GRID3_APP_DIR/cmssoft/cmsset_default.sh to setup cms software\n'
1254 spiga 1.87 txt += ' export SCRAM_ARCH='+self.executable_arch+'\n'
1255 gutsche 1.3 txt += ' source $GRID3_APP_DIR/cmssoft/cmsset_default.sh '+self.version+'\n'
1256 mkirn 1.40 txt += ' elif [ -f $OSG_APP/cmssoft/cms/cmsset_default.sh ] ;then\n'
1257     txt += ' # Use $OSG_APP/cmssoft/cms/cmsset_default.sh to setup cms software\n'
1258 spiga 1.87 txt += ' export SCRAM_ARCH='+self.executable_arch+'\n'
1259 mkirn 1.40 txt += ' source $OSG_APP/cmssoft/cms/cmsset_default.sh '+self.version+'\n'
1260 gutsche 1.3 txt += ' else\n'
1261 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'
1262 gutsche 1.3 txt += ' echo "JOB_EXIT_STATUS = 10020"\n'
1263     txt += ' echo "JobExitCode=10020" | tee -a $RUNTIME_AREA/$repo\n'
1264     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
1265 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
1266     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
1267     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
1268 gutsche 1.7 txt += ' exit 1\n'
1269 gutsche 1.3 txt += '\n'
1270     txt += ' echo "Remove working directory: $WORKING_DIR"\n'
1271     txt += ' cd $RUNTIME_AREA\n'
1272     txt += ' /bin/rm -rf $WORKING_DIR\n'
1273     txt += ' if [ -d $WORKING_DIR ] ;then\n'
1274 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'
1275     txt += ' echo "JOB_EXIT_STATUS = 10017"\n'
1276     txt += ' echo "JobExitCode=10017" | tee -a $RUNTIME_AREA/$repo\n'
1277     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
1278     txt += ' rm -f $RUNTIME_AREA/$repo \n'
1279     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
1280     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
1281 gutsche 1.3 txt += ' fi\n'
1282     txt += '\n'
1283 gutsche 1.7 txt += ' exit 1\n'
1284 gutsche 1.3 txt += ' fi\n'
1285     txt += '\n'
1286     txt += ' echo "SET_CMS_ENV 0 ==> setup cms environment ok"\n'
1287     txt += ' echo " END SETUP CMS OSG ENVIRONMENT "\n'
1288    
1289     return txt
1290    
1291     ### OLI_DANIELE
1292     def wsSetupCMSLCGEnvironment_(self):
1293     """
1294     Returns part of a job script which is prepares
1295     the execution environment and which is common for all CMS jobs.
1296     """
1297     txt = ' \n'
1298     txt += ' echo " ### SETUP CMS LCG ENVIRONMENT ### "\n'
1299     txt += ' if [ ! $VO_CMS_SW_DIR ] ;then\n'
1300     txt += ' echo "SET_CMS_ENV 10031 ==> ERROR CMS software dir not found on WN `hostname`"\n'
1301     txt += ' echo "JOB_EXIT_STATUS = 10031" \n'
1302     txt += ' echo "JobExitCode=10031" | tee -a $RUNTIME_AREA/$repo\n'
1303     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
1304 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
1305     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
1306     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
1307 gutsche 1.7 txt += ' exit 1\n'
1308 gutsche 1.3 txt += ' else\n'
1309     txt += ' echo "Sourcing environment... "\n'
1310     txt += ' if [ ! -s $VO_CMS_SW_DIR/cmsset_default.sh ] ;then\n'
1311     txt += ' echo "SET_CMS_ENV 10020 ==> ERROR cmsset_default.sh file not found into dir $VO_CMS_SW_DIR"\n'
1312     txt += ' echo "JOB_EXIT_STATUS = 10020"\n'
1313     txt += ' echo "JobExitCode=10020" | tee -a $RUNTIME_AREA/$repo\n'
1314     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
1315 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
1316     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
1317     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
1318 gutsche 1.7 txt += ' exit 1\n'
1319 gutsche 1.3 txt += ' fi\n'
1320     txt += ' echo "sourcing $VO_CMS_SW_DIR/cmsset_default.sh"\n'
1321     txt += ' source $VO_CMS_SW_DIR/cmsset_default.sh\n'
1322     txt += ' result=$?\n'
1323     txt += ' if [ $result -ne 0 ]; then\n'
1324     txt += ' echo "SET_CMS_ENV 10032 ==> ERROR problem sourcing $VO_CMS_SW_DIR/cmsset_default.sh"\n'
1325     txt += ' echo "JOB_EXIT_STATUS = 10032"\n'
1326     txt += ' echo "JobExitCode=10032" | tee -a $RUNTIME_AREA/$repo\n'
1327     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
1328 gutsche 1.13 txt += ' rm -f $RUNTIME_AREA/$repo \n'
1329     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
1330     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
1331 gutsche 1.7 txt += ' exit 1\n'
1332 gutsche 1.3 txt += ' fi\n'
1333     txt += ' fi\n'
1334     txt += ' \n'
1335     txt += ' echo "SET_CMS_ENV 0 ==> setup cms environment ok"\n'
1336     txt += ' echo "### END SETUP CMS LCG ENVIRONMENT ###"\n'
1337     return txt
1338 gutsche 1.5
1339 fanzago 1.93 ### FEDE FOR DBS OUTPUT PUBLICATION
1340     def modifyReport(self, nj):
1341     """
1342     insert the part of the script that modifies the FrameworkJob Report
1343     """
1344 fanzago 1.94
1345 fanzago 1.93 txt = ''
1346     txt += 'echo "Modify Job Report" \n'
1347 fanzago 1.99 #txt += 'chmod a+x $RUNTIME_AREA/'+self.version+'/ProdAgentApi/FwkJobRep/ModifyJobReport.py\n'
1348     ################ FEDE FOR DBS2 #############################################
1349     txt += 'chmod a+x $SOFTWARE_DIR/ProdAgentApi/FwkJobRep/ModifyJobReport.py\n'
1350     #############################################################################
1351 fanzago 1.94 try:
1352     publish_data = int(self.cfg_params['USER.publish_data'])
1353     except KeyError:
1354     publish_data = 0
1355    
1356 fanzago 1.93 txt += 'if [ -z "$SE" ]; then\n'
1357     txt += ' SE="" \n'
1358     txt += 'fi \n'
1359     txt += 'if [ -z "$SE_PATH" ]; then\n'
1360     txt += ' SE_PATH="" \n'
1361     txt += 'fi \n'
1362     txt += 'echo "SE = $SE"\n'
1363     txt += 'echo "SE_PATH = $SE_PATH"\n'
1364 fanzago 1.94
1365     if (publish_data == 1):
1366     #processedDataset = self.cfg_params['USER.processed_datasetname']
1367     processedDataset = self.cfg_params['USER.publish_data_name']
1368     txt += 'ProcessedDataset='+processedDataset+'\n'
1369     #### LFN=/store/user/<user>/processedDataset_PSETHASH
1370     txt += 'if [ "$SE_PATH" == "" ]; then\n'
1371 fanzago 1.101 #### FEDE: added slash in LFN ##############
1372     txt += ' FOR_LFN=/copy_problems/ \n'
1373 fanzago 1.94 txt += 'else \n'
1374     txt += ' tmp=`echo $SE_PATH | awk -F \'store\' \'{print$2}\'` \n'
1375 fanzago 1.101 ##### FEDE TO BE CHANGED, BECAUSE STORE IS HARDCODED!!!! ########
1376 fanzago 1.94 txt += ' FOR_LFN=/store$tmp \n'
1377     txt += 'fi \n'
1378     txt += 'echo "ProcessedDataset = $ProcessedDataset"\n'
1379     txt += 'echo "FOR_LFN = $FOR_LFN" \n'
1380 spiga 1.103 txt += 'echo "CMSSW_VERSION = $CMSSW_VERSION"\n\n'
1381     #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'
1382     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'
1383     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'
1384     #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'
1385    
1386     txt += 'modifyReport_result=$?\n'
1387     txt += 'echo modifyReport_result = $modifyReport_result\n'
1388     txt += 'if [ $modifyReport_result -ne 0 ]; then\n'
1389     txt += ' exit_status=1\n'
1390     txt += ' echo "ERROR: Problem with ModifyJobReport"\n'
1391     txt += 'else\n'
1392     txt += ' mv NewFrameworkJobReport.xml crab_fjr_$NJob.xml\n'
1393     txt += 'fi\n'
1394 fanzago 1.94 else:
1395     txt += 'ProcessedDataset=no_data_to_publish \n'
1396 fanzago 1.101 #### FEDE: added slash in LFN ##############
1397     txt += 'FOR_LFN=/local/ \n'
1398 fanzago 1.94 txt += 'echo "ProcessedDataset = $ProcessedDataset"\n'
1399     txt += 'echo "FOR_LFN = $FOR_LFN" \n'
1400 fanzago 1.93 return txt
1401 fanzago 1.99
1402     def cleanEnv(self):
1403     ### OLI_DANIELE
1404     txt = ''
1405     txt += 'if [ $middleware == OSG ]; then\n'
1406     txt += ' cd $RUNTIME_AREA\n'
1407     txt += ' echo "Remove working directory: $WORKING_DIR"\n'
1408     txt += ' /bin/rm -rf $WORKING_DIR\n'
1409     txt += ' if [ -d $WORKING_DIR ] ;then\n'
1410     txt += ' echo "SET_EXE 60999 ==> OSG $WORKING_DIR could not be deleted on WN `hostname` after cleanup of WN"\n'
1411     txt += ' echo "JOB_EXIT_STATUS = 60999"\n'
1412     txt += ' echo "JobExitCode=60999" | tee -a $RUNTIME_AREA/$repo\n'
1413     txt += ' dumpStatus $RUNTIME_AREA/$repo\n'
1414     txt += ' rm -f $RUNTIME_AREA/$repo \n'
1415     txt += ' echo "MonitorJobID=`echo $MonitorJobID`" | tee -a $RUNTIME_AREA/$repo \n'
1416     txt += ' echo "MonitorID=`echo $MonitorID`" | tee -a $RUNTIME_AREA/$repo\n'
1417     txt += ' fi\n'
1418     txt += 'fi\n'
1419     txt += '\n'
1420     return txt
1421 fanzago 1.93
1422 gutsche 1.5 def setParam_(self, param, value):
1423     self._params[param] = value
1424    
1425     def getParams(self):
1426     return self._params
1427 gutsche 1.8
1428     def setTaskid_(self):
1429     self._taskId = self.cfg_params['taskId']
1430    
1431     def getTaskid(self):
1432     return self._taskId
1433 gutsche 1.35
1434     def uniquelist(self, old):
1435     """
1436     remove duplicates from a list
1437     """
1438     nd={}
1439     for e in old:
1440     nd[e]=0
1441     return nd.keys()