ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/CRAB/python/cms_cmssw.py
Revision: 1.333
Committed: Thu Aug 20 15:46:52 2009 UTC (15 years, 8 months ago) by ewv
Content type: text/x-python
Branch: MAIN
CVS Tags: test_1, CRAB_2_6_2, CRAB_2_6_2_pre2
Branch point for: CRAB_2_6_X_br
Changes since 1.332: +6 -3 lines
Log Message:
Limit job creation for stand-alone, non-local schedulers

File Contents

# User Rev Content
1 ewv 1.327
2 ewv 1.332 __revision__ = "$Id: cms_cmssw.py,v 1.331 2009/08/13 13:09:59 spiga Exp $"
3     __version__ = "$Revision: 1.331 $"
4 ewv 1.327
5 slacapra 1.1 from JobType import JobType
6     from crab_exceptions import *
7     from crab_util import *
8     import common
9     import Scram
10 spiga 1.269 from Splitter import JobSplitter
11 slacapra 1.1
12 spiga 1.293 from IMProv.IMProvNode import IMProvNode
13 slacapra 1.105 import os, string, glob
14 slacapra 1.1
15     class Cmssw(JobType):
16 spiga 1.208 def __init__(self, cfg_params, ncjobs,skip_blocks, isNew):
17 slacapra 1.1 JobType.__init__(self, 'CMSSW')
18 spiga 1.304 common.logger.debug('CMSSW::__init__')
19 spiga 1.208 self.skip_blocks = skip_blocks
20 spiga 1.296 self.argsList = 1
21 spiga 1.315 self.NumEvents=0
22 gutsche 1.3 self._params = {}
23     self.cfg_params = cfg_params
24 ewv 1.254
25 spiga 1.234 ### Temporary patch to automatically skip the ISB size check:
26 ewv 1.319 self.server = self.cfg_params.get('CRAB.server_name',None) or \
27     self.cfg_params.get('CRAB.use_server',0)
28 ewv 1.333 self.local = common.scheduler.name().upper() in ['LSF','CAF','CONDOR','SGE']
29 ewv 1.250 size = 9.5
30 ewv 1.333 if self.server or self.local:
31 ewv 1.319 size = 99999
32 spiga 1.306 self.MaxTarBallSize = float(self.cfg_params.get('GRID.maxtarballsize',size))
33 gutsche 1.72
34 gutsche 1.44 # number of jobs requested to be created, limit obj splitting
35 gutsche 1.38 self.ncjobs = ncjobs
36    
37 slacapra 1.1 self.scram = Scram.Scram(cfg_params)
38     self.additional_inbox_files = []
39     self.scriptExe = ''
40     self.executable = ''
41 slacapra 1.71 self.executable_arch = self.scram.getArch()
42 spiga 1.320 self.tgz_name = 'default.tgz'
43 corvo 1.56 self.scriptName = 'CMSSW.sh'
44 ewv 1.192 self.pset = ''
45 spiga 1.187 self.datasetPath = ''
46 gutsche 1.3
47 spiga 1.300 self.tgzNameWithPath = common.work_space.pathForTgz()+self.tgz_name
48 gutsche 1.50 # set FJR file name
49     self.fjrFileName = 'crab_fjr.xml'
50    
51 slacapra 1.1 self.version = self.scram.getSWVersion()
52 spiga 1.304 common.logger.log(10-1,"CMSSW version is: "+str(self.version))
53 spiga 1.324 version_array = self.version.split('_')
54     self.CMSSW_major = 0
55     self.CMSSW_minor = 0
56     self.CMSSW_patch = 0
57 ewv 1.182 try:
58 spiga 1.324 self.CMSSW_major = int(version_array[1])
59     self.CMSSW_minor = int(version_array[2])
60     self.CMSSW_patch = int(version_array[3])
61 ewv 1.182 except:
62 ewv 1.184 msg = "Cannot parse CMSSW version string: " + self.version + " for major and minor release number!"
63 ewv 1.182 raise CrabException(msg)
64    
65 ewv 1.276 if self.CMSSW_major < 1 or (self.CMSSW_major == 1 and self.CMSSW_minor < 5):
66     msg = "CRAB supports CMSSW >= 1_5_x only. Use an older CRAB version."
67     raise CrabException(msg)
68     """
69     As CMSSW versions are dropped we can drop more code:
70     1.X dropped: drop support for running .cfg on WN
71     2.0 dropped: drop all support for cfg here and in writeCfg
72     2.0 dropped: Recheck the random number seed support
73     """
74    
75 slacapra 1.1 ### collect Data cards
76 gutsche 1.66
77 ewv 1.226
78 fanzago 1.221 ### Temporary: added to remove input file control in the case of PU
79 farinafa 1.224 self.dataset_pu = cfg_params.get('CMSSW.dataset_pu', None)
80 ewv 1.226
81 slacapra 1.153 tmp = cfg_params['CMSSW.datasetpath']
82 spiga 1.305 common.logger.log(10-1, "CMSSW::CMSSW(): datasetPath = "+tmp)
83 spiga 1.236
84     if tmp =='':
85     msg = "Error: datasetpath not defined "
86     raise CrabException(msg)
87     elif string.lower(tmp)=='none':
88 slacapra 1.153 self.datasetPath = None
89     self.selectNoInput = 1
90 fanzago 1.318 self.primaryDataset = 'null'
91 slacapra 1.153 else:
92     self.datasetPath = tmp
93     self.selectNoInput = 0
94 fanzago 1.318 self.primaryDataset = self.datasetPath.split("/")[1]
95     self.dataTier = self.datasetPath.split("/")[2]
96 gutsche 1.5
97 ewv 1.326 # Analysis dataset is primary/processed/tier/definition
98 ewv 1.330 self.ads = False
99     if self.datasetPath:
100     self.ads = len(self.datasetPath.split("/")) > 4
101 ewv 1.295
102 ewv 1.327 # FUTURE: Can remove this check
103     if self.ads and self.CMSSW_major < 3:
104     common.logger.info('Warning: Analysis dataset support is incomplete in CMSSW 2_x.')
105     common.logger.info(' Only file level, not lumi level, granularity is supported.')
106    
107 spiga 1.288 self.debugWrap=''
108 fanzago 1.285 self.debug_wrapper = int(cfg_params.get('USER.debug_wrapper',0))
109     if self.debug_wrapper == 1: self.debugWrap='--debug'
110 slacapra 1.291
111 slacapra 1.1 ## now the application
112 ewv 1.313 self.managedGenerators = ['madgraph', 'comphep', 'lhe']
113 ewv 1.258 self.generator = cfg_params.get('CMSSW.generator','pythia').lower()
114 slacapra 1.153 self.executable = cfg_params.get('CMSSW.executable','cmsRun')
115 spiga 1.305 common.logger.log(10-1, "CMSSW::CMSSW(): executable = "+self.executable)
116 slacapra 1.1
117 slacapra 1.153 if not cfg_params.has_key('CMSSW.pset'):
118 slacapra 1.1 raise CrabException("PSet file missing. Cannot run cmsRun ")
119 slacapra 1.153 self.pset = cfg_params['CMSSW.pset']
120 spiga 1.305 common.logger.log(10-1, "Cmssw::Cmssw(): PSet file = "+self.pset)
121 slacapra 1.153 if self.pset.lower() != 'none' :
122     if (not os.path.exists(self.pset)):
123     raise CrabException("User defined PSet file "+self.pset+" does not exist")
124     else:
125     self.pset = None
126 slacapra 1.1
127     # output files
128 slacapra 1.53 ## stuff which must be returned always via sandbox
129     self.output_file_sandbox = []
130    
131     # add fjr report by default via sandbox
132     self.output_file_sandbox.append(self.fjrFileName)
133    
134     # other output files to be returned via sandbox or copied to SE
135 mcinquil 1.216 outfileflag = False
136 slacapra 1.153 self.output_file = []
137     tmp = cfg_params.get('CMSSW.output_file',None)
138     if tmp :
139 slacapra 1.207 self.output_file = [x.strip() for x in tmp.split(',')]
140 mcinquil 1.216 outfileflag = True #output found
141     #else:
142     # log.message("No output file defined: only stdout/err and the CRAB Framework Job Report will be available\n")
143 slacapra 1.1
144     # script_exe file as additional file in inputSandbox
145 slacapra 1.153 self.scriptExe = cfg_params.get('USER.script_exe',None)
146     if self.scriptExe :
147 slacapra 1.176 if not os.path.isfile(self.scriptExe):
148     msg ="ERROR. file "+self.scriptExe+" not found"
149     raise CrabException(msg)
150     self.additional_inbox_files.append(string.strip(self.scriptExe))
151 slacapra 1.70
152 spiga 1.314 self.AdditionalArgs = cfg_params.get('USER.script_arguments',None)
153     if self.AdditionalArgs : self.AdditionalArgs = string.replace(self.AdditionalArgs,',',' ')
154    
155 spiga 1.42 if self.datasetPath == None and self.pset == None and self.scriptExe == '' :
156 slacapra 1.176 msg ="Error. script_exe not defined"
157     raise CrabException(msg)
158 spiga 1.42
159 ewv 1.226 # use parent files...
160 spiga 1.269 self.useParent = int(self.cfg_params.get('CMSSW.use_parent',0))
161 spiga 1.204
162 slacapra 1.1 ## additional input files
163 slacapra 1.153 if cfg_params.has_key('USER.additional_input_files'):
164 slacapra 1.29 tmpAddFiles = string.split(cfg_params['USER.additional_input_files'],',')
165 slacapra 1.70 for tmp in tmpAddFiles:
166     tmp = string.strip(tmp)
167     dirname = ''
168     if not tmp[0]=="/": dirname = "."
169 corvo 1.85 files = []
170     if string.find(tmp,"*")>-1:
171     files = glob.glob(os.path.join(dirname, tmp))
172     if len(files)==0:
173     raise CrabException("No additional input file found with this pattern: "+tmp)
174     else:
175     files.append(tmp)
176 slacapra 1.70 for file in files:
177     if not os.path.exists(file):
178     raise CrabException("Additional input file not found: "+file)
179 slacapra 1.45 pass
180 slacapra 1.105 self.additional_inbox_files.append(string.strip(file))
181 slacapra 1.1 pass
182     pass
183 spiga 1.304 common.logger.debug("Additional input files: "+str(self.additional_inbox_files))
184 slacapra 1.153 pass
185 gutsche 1.3
186 gutsche 1.35
187 ewv 1.160 ## New method of dealing with seeds
188     self.incrementSeeds = []
189     self.preserveSeeds = []
190     if cfg_params.has_key('CMSSW.preserve_seeds'):
191     tmpList = cfg_params['CMSSW.preserve_seeds'].split(',')
192     for tmp in tmpList:
193     tmp.strip()
194     self.preserveSeeds.append(tmp)
195     if cfg_params.has_key('CMSSW.increment_seeds'):
196     tmpList = cfg_params['CMSSW.increment_seeds'].split(',')
197     for tmp in tmpList:
198     tmp.strip()
199     self.incrementSeeds.append(tmp)
200    
201 slacapra 1.153 self.firstRun = cfg_params.get('CMSSW.first_run',None)
202 slacapra 1.90
203 fanzago 1.318 # Copy/return/publish
204 slacapra 1.153 self.copy_data = int(cfg_params.get('USER.copy_data',0))
205     self.return_data = int(cfg_params.get('USER.return_data',0))
206 fanzago 1.318 ### FEDE ###
207     self.publish_data = int(cfg_params.get('USER.publish_data',0))
208     if (self.publish_data == 1):
209     if not cfg_params.has_key('USER.publish_data_name'):
210     raise CrabException('Cannot publish output data, because you did not specify USER.publish_data_name parameter in the crab.cfg file')
211     else:
212     self.processedDataset = cfg_params['USER.publish_data_name']
213 ewv 1.329 """
214 fanzago 1.328 #### check of length of datasetname to publish ####
215 fanzago 1.318 common.logger.debug("test 100 char limit on datasetname")
216 fanzago 1.328 print "test 100 char limit on datasetname"
217     ###
218     len_file = 0
219     print "self.output_file = ", self.output_file
220     for file in self.output_file:
221     length = len(file)
222     if length > len_file:
223     len_file = length
224 ewv 1.329 print "len_file = ", len_file
225 fanzago 1.328 common.logger.debug("len_file = " + str(len_file))
226 ewv 1.329 ###
227 fanzago 1.318 user = getUserName()
228 fanzago 1.328 len_user_name = len(user)
229 fanzago 1.318 common.logger.debug("user = " + user)
230 fanzago 1.328 print "len_user_name = ", len_user_name
231 ewv 1.319 common.logger.debug("len_user_name = " + str(len_user_name))
232 fanzago 1.328
233 fanzago 1.318 len_processedDataset = len(self.processedDataset)
234     common.logger.debug("processedDataset " + self.processedDataset)
235     common.logger.debug("len_processedDataset = " + str(len_processedDataset))
236 fanzago 1.328 print "len_processedDataset = ", len_processedDataset
237 ewv 1.329
238 fanzago 1.318 if (self.datasetPath != None ):
239     len_primary = len(self.primaryDataset)
240     common.logger.debug("primaryDataset = " + self.primaryDataset)
241     common.logger.debug("len_primary = " + str(len_primary))
242 fanzago 1.328 if (len_primary > 100):
243     raise CrabException("Warning: primary datasetname has to be < 100 characters")
244     #500 - len_user_name - len_primary - 32 - 9 - 7 - output
245     #if (len_processedDataset > (59 - len_user_name - len_primary)):
246     if (len_processedDataset > ( 450 - len_user_name - len_primary - len_file)):
247     #raise CrabException("Warning: publication name too long. USER.publish_data_name has to be < " + str(59 - len_user_name - len_primary) + " characters")
248     raise CrabException("Warning: publication name too long. USER.publish_data_name has to be < " + str(450 - len_user_name - len_primary -len_file) + " characters")
249 fanzago 1.318 else:
250 fanzago 1.328 #if (len_processedDataset > (59 - len_user_name) / 2):
251     # raise CrabException("Warning: publication name too long. USER.publish_data_name has to be < " + str((59 - len_user_name) / 2) + " characters")
252     if (len_processedDataset > (450 - len_user_name -len_file) / 2):
253     raise CrabException("Warning: publication name too long. USER.publish_data_name has to be < " + str((450 - len_user_name - len_file) / 2) + " characters")
254 ewv 1.329 """
255 ewv 1.276
256     self.conf = {}
257     self.conf['pubdata'] = None
258 spiga 1.269 # number of jobs requested to be created, limit obj splitting DD
259 slacapra 1.1 #DBSDLS-start
260 ewv 1.131 ## Initialize the variables that are extracted from DBS/DLS and needed in other places of the code
261 slacapra 1.1 self.maxEvents=0 # max events available ( --> check the requested nb. of evts in Creator.py)
262     self.DBSPaths={} # all dbs paths requested ( --> input to the site local discovery script)
263 gutsche 1.35 self.jobDestination=[] # Site destination(s) for each job (list of lists)
264 slacapra 1.1 ## Perform the data location and discovery (based on DBS/DLS)
265 slacapra 1.9 ## SL: Don't if NONE is specified as input (pythia use case)
266 gutsche 1.35 blockSites = {}
267 slacapra 1.9 if self.datasetPath:
268 gutsche 1.35 blockSites = self.DataDiscoveryAndLocation(cfg_params)
269 ewv 1.131 #DBSDLS-end
270 spiga 1.269 self.conf['blockSites']=blockSites
271    
272 slacapra 1.9 ## Select Splitting
273 spiga 1.269 splitByRun = int(cfg_params.get('CMSSW.split_by_run',0))
274    
275 ewv 1.131 if self.selectNoInput:
276 spiga 1.187 if self.pset == None:
277 ewv 1.276 self.algo = 'ForScript'
278 spiga 1.42 else:
279 spiga 1.271 self.algo = 'NoInput'
280 ewv 1.276 self.conf['managedGenerators']=self.managedGenerators
281     self.conf['generator']=self.generator
282 ewv 1.326 elif self.ads:
283     self.algo = 'LumiBased'
284 ewv 1.276 elif splitByRun ==1:
285     self.algo = 'RunBased'
286 spiga 1.269 else:
287 ewv 1.276 self.algo = 'EventBased'
288 ewv 1.326 common.logger.debug("Job splitting method: %s" % self.algo)
289 ewv 1.276
290     splitter = JobSplitter(self.cfg_params,self.conf)
291 spiga 1.269 self.dict = splitter.Algos()[self.algo]()
292 gutsche 1.5
293 spiga 1.300 self.argsFile= '%s/arguments.xml'%common.work_space.shareDir()
294     self.rootArgsFilename= 'arguments'
295 spiga 1.208 # modify Pset only the first time
296 spiga 1.320 if isNew:
297     if self.pset != None: self.ModifyPset()
298 spiga 1.300
299 spiga 1.320 ## Prepare inputSandbox TarBall (only the first time)
300     self.tarNameWithPath = self.getTarBall(self.executable)
301 spiga 1.293
302    
303     def ModifyPset(self):
304     import PsetManipulator as pp
305     PsetEdit = pp.PsetManipulator(self.pset)
306     try:
307     # Add FrameworkJobReport to parameter-set, set max events.
308     # Reset later for data jobs by writeCFG which does all modifications
309 ewv 1.295 PsetEdit.maxEvent(1)
310 spiga 1.293 PsetEdit.skipEvent(0)
311     PsetEdit.psetWriter(self.configFilename())
312     ## If present, add TFileService to output files
313     if not int(self.cfg_params.get('CMSSW.skip_TFileService_output',0)):
314     tfsOutput = PsetEdit.getTFileService()
315     if tfsOutput:
316     if tfsOutput in self.output_file:
317 spiga 1.304 common.logger.debug("Output from TFileService "+tfsOutput+" already in output files")
318 spiga 1.293 else:
319     outfileflag = True #output found
320     self.output_file.append(tfsOutput)
321 spiga 1.304 common.logger.info("Adding "+tfsOutput+" (from TFileService) to list of output files")
322 spiga 1.293 pass
323     pass
324 ewv 1.321 # If present and requested, add PoolOutputModule to output files
325 ewv 1.301 edmOutput = PsetEdit.getPoolOutputModule()
326 spiga 1.293 if int(self.cfg_params.get('CMSSW.get_edm_output',0)):
327     if edmOutput:
328 ewv 1.321 for outputFile in edmOutput:
329     if outputFile in self.output_file:
330 ewv 1.325 common.logger.debug("Output from PoolOutputModule "+outputFile+" already in output files")
331 ewv 1.321 else:
332     self.output_file.append(outputFile)
333     common.logger.info("Adding "+outputFile+" (from PoolOutputModule) to list of output files")
334     # not requested, check anyhow to avoid accidental T2 overload
335 slacapra 1.297 else:
336 ewv 1.321 if edmOutput:
337     missedFiles = []
338     for outputFile in edmOutput:
339     if outputFile not in self.output_file:
340     missedFiles.append(outputFile)
341     if missedFiles:
342     msg = "ERROR: PoolOutputModule(s) are present in your ParameteSet %s \n"%self.pset
343     msg += " but the file(s) produced ( %s ) are not in the list of output files\n" % ', '.join(missedFiles)
344     msg += "WARNING: please remove them. If you want to keep them, add the file(s) to output_files or use CMSSW.get_edm_output = 1\n"
345     if int(self.cfg_params.get('CMSSW.ignore_edm_output',0)):
346     msg += " CMSSW.ignore_edm_output==1 : Hope you know what you are doing...\n"
347     common.logger.info(msg)
348 spiga 1.322 else :
349 ewv 1.321 raise CrabException(msg)
350 ewv 1.301
351     if (PsetEdit.getBadFilesSetting()):
352     msg = "WARNING: You have set skipBadFiles to True. This will continue processing on some errors and you may not be notified."
353 spiga 1.304 common.logger.info(msg)
354 ewv 1.301
355 slacapra 1.297 except CrabException, msg:
356 spiga 1.304 common.logger.info(str(msg))
357 slacapra 1.297 msg='Error while manipulating ParameterSet (see previous message, if any): exiting...'
358 spiga 1.293 raise CrabException(msg)
359    
360 gutsche 1.3
361 slacapra 1.1 def DataDiscoveryAndLocation(self, cfg_params):
362    
363 slacapra 1.86 import DataDiscovery
364     import DataLocation
365 spiga 1.304 common.logger.log(10-1,"CMSSW::DataDiscoveryAndLocation()")
366 gutsche 1.3
367     datasetPath=self.datasetPath
368    
369 slacapra 1.1 ## Contact the DBS
370 spiga 1.304 common.logger.info("Contacting Data Discovery Services ...")
371 slacapra 1.1 try:
372 spiga 1.208 self.pubdata=DataDiscovery.DataDiscovery(datasetPath, cfg_params,self.skip_blocks)
373 slacapra 1.1 self.pubdata.fetchDBSInfo()
374    
375 slacapra 1.41 except DataDiscovery.NotExistingDatasetError, ex :
376 slacapra 1.1 msg = 'ERROR ***: failed Data Discovery in DBS : %s'%ex.getErrorMessage()
377     raise CrabException(msg)
378 slacapra 1.41 except DataDiscovery.NoDataTierinProvenanceError, ex :
379 slacapra 1.1 msg = 'ERROR ***: failed Data Discovery in DBS : %s'%ex.getErrorMessage()
380     raise CrabException(msg)
381 slacapra 1.41 except DataDiscovery.DataDiscoveryError, ex:
382 gutsche 1.66 msg = 'ERROR ***: failed Data Discovery in DBS : %s'%ex.getErrorMessage()
383 slacapra 1.1 raise CrabException(msg)
384    
385 gutsche 1.35 self.filesbyblock=self.pubdata.getFiles()
386 slacapra 1.270 #print self.filesbyblock
387 spiga 1.269 self.conf['pubdata']=self.pubdata
388 gutsche 1.3
389 slacapra 1.1 ## get max number of events
390 ewv 1.192 self.maxEvents=self.pubdata.getMaxEvents()
391 slacapra 1.1
392     ## Contact the DLS and build a list of sites hosting the fileblocks
393     try:
394 slacapra 1.41 dataloc=DataLocation.DataLocation(self.filesbyblock.keys(),cfg_params)
395 gutsche 1.6 dataloc.fetchDLSInfo()
396 slacapra 1.263
397 slacapra 1.41 except DataLocation.DataLocationError , ex:
398 slacapra 1.1 msg = 'ERROR ***: failed Data Location in DLS \n %s '%ex.getErrorMessage()
399     raise CrabException(msg)
400 ewv 1.131
401 slacapra 1.1
402 slacapra 1.270 unsorted_sites = dataloc.getSites()
403     sites = self.filesbyblock.fromkeys(self.filesbyblock,'')
404     for lfn in self.filesbyblock.keys():
405     if unsorted_sites.has_key(lfn):
406     sites[lfn]=unsorted_sites[lfn]
407     else:
408     sites[lfn]=[]
409    
410 slacapra 1.264 if len(sites)==0:
411 spiga 1.267 msg = 'ERROR ***: no location for any of the blocks of this dataset: \n\t %s \n'%datasetPath
412     msg += "\tMaybe the dataset is located only at T1's (or at T0), where analysis jobs are not allowed\n"
413     msg += "\tPlease check DataDiscovery page https://cmsweb.cern.ch/dbs_discovery/\n"
414 slacapra 1.264 raise CrabException(msg)
415    
416 gutsche 1.35 allSites = []
417     listSites = sites.values()
418 slacapra 1.63 for listSite in listSites:
419     for oneSite in listSite:
420 gutsche 1.35 allSites.append(oneSite)
421 slacapra 1.291 [allSites.append(it) for it in allSites if not allSites.count(it)]
422 ewv 1.295
423 gutsche 1.3
424 gutsche 1.92 # screen output
425 spiga 1.304 common.logger.info("Requested dataset: " + datasetPath + " has " + str(self.maxEvents) + " events in " + str(len(self.filesbyblock.keys())) + " blocks.\n")
426 gutsche 1.92
427 gutsche 1.35 return sites
428 ewv 1.131
429 spiga 1.42
430 spiga 1.208 def split(self, jobParams,firstJobID):
431 ewv 1.276
432 spiga 1.293 jobParams = self.dict['args']
433 spiga 1.269 njobs = self.dict['njobs']
434     self.jobDestination = self.dict['jobDestination']
435 ewv 1.131
436 ewv 1.333 if njobs == 0:
437     raise CrabException("Asked to split zero jobs: aborting")
438     if not self.server and not self.local and njobs > 500:
439     raise CrabException("The CRAB client will not submit more than 500 jobs. You must use the server mode.")
440 slacapra 1.263
441 gutsche 1.3 # create the empty structure
442     for i in range(njobs):
443     jobParams.append("")
444 ewv 1.131
445 spiga 1.165 listID=[]
446     listField=[]
447 spiga 1.293 listDictions=[]
448 spiga 1.300 exist= os.path.exists(self.argsFile)
449 spiga 1.208 for id in range(njobs):
450     job = id + int(firstJobID)
451 spiga 1.167 listID.append(job+1)
452 spiga 1.162 job_ToSave ={}
453 spiga 1.169 concString = ' '
454 spiga 1.165 argu=''
455 spiga 1.293 str_argu = str(job+1)
456 spiga 1.208 if len(jobParams[id]):
457 ewv 1.295 argu = {'JobID': job+1}
458 spiga 1.293 for i in range(len(jobParams[id])):
459     argu[self.dict['params'][i]]=jobParams[id][i]
460 spiga 1.315 if len(jobParams[id])==1: self.NumEvents = jobParams[id][i]
461 ewv 1.295 # just for debug
462 spiga 1.293 str_argu += concString.join(jobParams[id])
463 spiga 1.314 if argu != '': listDictions.append(argu)
464 spiga 1.298 job_ToSave['arguments']= str(job+1)
465 spiga 1.208 job_ToSave['dlsDestination']= self.jobDestination[id]
466 spiga 1.165 listField.append(job_ToSave)
467 slacapra 1.311 from ProdCommon.SiteDB.CmsSiteMapper import CmsSEMap
468     cms_se = CmsSEMap()
469 ewv 1.295 msg="Job %s Arguments: %s\n"%(str(job+1),str_argu)
470 spiga 1.293 msg+="\t Destination: %s "%(str(self.jobDestination[id]))
471 slacapra 1.311 SEDestination = [cms_se[dest] for dest in self.jobDestination[id]]
472     msg+="\t CMSDestination: %s "%(str(SEDestination))
473 spiga 1.307 common.logger.log(10-1,msg)
474 spiga 1.293 # write xml
475 ewv 1.295 if len(listDictions):
476 spiga 1.293 if exist==False: self.CreateXML()
477     self.addEntry(listDictions)
478 spiga 1.320 # self.zipXMLfile()
479 spiga 1.187 common._db.updateJob_(listID,listField)
480 spiga 1.293 return
481 ewv 1.313
482 spiga 1.320 # def zipXMLfile(self):
483 ewv 1.313
484 spiga 1.320 # import tarfile
485     # try:
486     # tar = tarfile.open(self.tarNameWithPath, "a")
487     # tar.add(self.argsFile, os.path.basename(self.argsFile))
488     # tar.close()
489     # except IOError, exc:
490     # msg = 'Could not add %s to %s \n'%(self.argsFile,self.tarNameWithPath)
491     # msg += str(exc)
492     # raise CrabException(msg)
493     # except tarfile.TarError, exc:
494     # msg = 'Could not add %s to %s \n'%(self.argsFile,self.tarNameWithPath)
495     # msg += str(exc)
496     # raise CrabException(msg)
497 ewv 1.325
498 spiga 1.293 def CreateXML(self):
499     """
500 ewv 1.295 """
501 spiga 1.300 result = IMProvNode( self.rootArgsFilename )
502     outfile = file( self.argsFile, 'w').write(str(result))
503 ewv 1.295 return
504 spiga 1.293
505     def addEntry(self, listDictions):
506     """
507     _addEntry_
508 ewv 1.295
509 spiga 1.293 add an entry to the xml file
510     """
511     from IMProv.IMProvLoader import loadIMProvFile
512     ## load xml
513 spiga 1.300 improvDoc = loadIMProvFile(self.argsFile)
514 spiga 1.293 entrname= 'Job'
515     for dictions in listDictions:
516     report = IMProvNode(entrname , None, **dictions)
517     improvDoc.addNode(report)
518 spiga 1.300 outfile = file( self.argsFile, 'w').write(str(improvDoc))
519 gutsche 1.3 return
520 ewv 1.131
521 gutsche 1.3 def numberOfJobs(self):
522 spiga 1.269 return self.dict['njobs']
523 gutsche 1.3
524 slacapra 1.1 def getTarBall(self, exe):
525     """
526     Return the TarBall with lib and exe
527     """
528 spiga 1.320 self.tgzNameWithPath = common.work_space.pathForTgz()+self.tgz_name
529     if os.path.exists(self.tgzNameWithPath):
530     return self.tgzNameWithPath
531 slacapra 1.1
532     # Prepare a tar gzipped file with user binaries.
533     self.buildTar_(exe)
534    
535 spiga 1.320 return string.strip(self.tgzNameWithPath)
536 slacapra 1.1
537     def buildTar_(self, executable):
538    
539     # First of all declare the user Scram area
540     swArea = self.scram.getSWArea_()
541     swReleaseTop = self.scram.getReleaseTop_()
542 ewv 1.131
543 slacapra 1.1 ## check if working area is release top
544     if swReleaseTop == '' or swArea == swReleaseTop:
545 spiga 1.304 common.logger.debug("swArea = "+swArea+" swReleaseTop ="+swReleaseTop)
546 slacapra 1.1 return
547    
548 slacapra 1.61 import tarfile
549     try: # create tar ball
550 spiga 1.320 tar = tarfile.open(self.tgzNameWithPath, "w:gz")
551 slacapra 1.61 ## First find the executable
552 slacapra 1.86 if (self.executable != ''):
553 slacapra 1.61 exeWithPath = self.scram.findFile_(executable)
554     if ( not exeWithPath ):
555     raise CrabException('User executable '+executable+' not found')
556 ewv 1.131
557 slacapra 1.61 ## then check if it's private or not
558     if exeWithPath.find(swReleaseTop) == -1:
559     # the exe is private, so we must ship
560 spiga 1.304 common.logger.debug("Exe "+exeWithPath+" to be tarred")
561 slacapra 1.61 path = swArea+'/'
562 corvo 1.85 # distinguish case when script is in user project area or given by full path somewhere else
563     if exeWithPath.find(path) >= 0 :
564     exe = string.replace(exeWithPath, path,'')
565 slacapra 1.129 tar.add(path+exe,exe)
566 corvo 1.85 else :
567     tar.add(exeWithPath,os.path.basename(executable))
568 slacapra 1.61 pass
569     else:
570     # the exe is from release, we'll find it on WN
571     pass
572 ewv 1.131
573 slacapra 1.61 ## Now get the libraries: only those in local working area
574 slacapra 1.256 tar.dereference=True
575 slacapra 1.61 libDir = 'lib'
576     lib = swArea+'/' +libDir
577 spiga 1.304 common.logger.debug("lib "+lib+" to be tarred")
578 slacapra 1.61 if os.path.exists(lib):
579     tar.add(lib,libDir)
580 ewv 1.131
581 slacapra 1.61 ## Now check if module dir is present
582     moduleDir = 'module'
583     module = swArea + '/' + moduleDir
584     if os.path.isdir(module):
585     tar.add(module,moduleDir)
586 slacapra 1.256 tar.dereference=False
587 slacapra 1.61
588     ## Now check if any data dir(s) is present
589 spiga 1.179 self.dataExist = False
590 slacapra 1.212 todo_list = [(i, i) for i in os.listdir(swArea+"/src")]
591 slacapra 1.206 while len(todo_list):
592     entry, name = todo_list.pop()
593 slacapra 1.211 if name.startswith('crab_0_') or name.startswith('.') or name == 'CVS':
594 slacapra 1.206 continue
595 slacapra 1.212 if os.path.isdir(swArea+"/src/"+entry):
596 slacapra 1.206 entryPath = entry + '/'
597 slacapra 1.212 todo_list += [(entryPath + i, i) for i in os.listdir(swArea+"/src/"+entry)]
598 slacapra 1.206 if name == 'data':
599     self.dataExist=True
600 spiga 1.304 common.logger.debug("data "+entry+" to be tarred")
601 slacapra 1.212 tar.add(swArea+"/src/"+entry,"src/"+entry)
602 slacapra 1.206 pass
603     pass
604 ewv 1.182
605 spiga 1.179 ### CMSSW ParameterSet
606     if not self.pset is None:
607     cfg_file = common.work_space.jobDir()+self.configFilename()
608 ewv 1.182 tar.add(cfg_file,self.configFilename())
609 ewv 1.313
610 spiga 1.309 try:
611     crab_cfg_file = common.work_space.shareDir()+'/crab.cfg'
612     tar.add(crab_cfg_file,'crab.cfg')
613     except:
614     pass
615 fanzago 1.93
616 fanzago 1.152 ## Add ProdCommon dir to tar
617 slacapra 1.211 prodcommonDir = './'
618     prodcommonPath = os.environ['CRABDIR'] + '/' + 'external/'
619 spiga 1.244 neededStuff = ['ProdCommon/__init__.py','ProdCommon/FwkJobRep', 'ProdCommon/CMSConfigTools', \
620 spiga 1.298 'ProdCommon/Core', 'ProdCommon/MCPayloads', 'IMProv', 'ProdCommon/Storage', \
621     'WMCore/__init__.py','WMCore/Algorithms']
622 slacapra 1.214 for file in neededStuff:
623     tar.add(prodcommonPath+file,prodcommonDir+file)
624 spiga 1.179
625     ##### ML stuff
626     ML_file_list=['report.py', 'DashboardAPI.py', 'Logger.py', 'ProcInfo.py', 'apmon.py']
627     path=os.environ['CRABDIR'] + '/python/'
628     for file in ML_file_list:
629     tar.add(path+file,file)
630    
631     ##### Utils
632 spiga 1.238 Utils_file_list=['parseCrabFjr.py','writeCfg.py', 'fillCrabFjr.py','cmscp.py']
633 spiga 1.179 for file in Utils_file_list:
634     tar.add(path+file,file)
635 ewv 1.131
636 ewv 1.182 ##### AdditionalFiles
637 slacapra 1.253 tar.dereference=True
638 spiga 1.179 for file in self.additional_inbox_files:
639     tar.add(file,string.split(file,'/')[-1])
640 slacapra 1.253 tar.dereference=False
641 spiga 1.320 common.logger.log(10-1,"Files in "+self.tgzNameWithPath+" : "+str(tar.getnames()))
642 ewv 1.182
643 slacapra 1.61 tar.close()
644 mcinquil 1.241 except IOError, exc:
645 spiga 1.320 msg = 'Could not create tar-ball %s \n'%self.tgzNameWithPath
646 spiga 1.304 msg += str(exc)
647     raise CrabException(msg)
648 mcinquil 1.241 except tarfile.TarError, exc:
649 spiga 1.320 msg = 'Could not create tar-ball %s \n'%self.tgzNameWithPath
650 spiga 1.304 msg += str(exc)
651     raise CrabException(msg)
652 spiga 1.300
653 gutsche 1.72 tarballinfo = os.stat(self.tgzNameWithPath)
654     if ( tarballinfo.st_size > self.MaxTarBallSize*1024*1024 ) :
655 spiga 1.238 msg = 'Input sandbox size of ' + str(float(tarballinfo.st_size)/1024.0/1024.0) + ' MB is larger than the allowed ' + str(self.MaxTarBallSize) \
656 ewv 1.250 +'MB input sandbox limit \n'
657 spiga 1.238 msg += ' and not supported by the direct GRID submission system.\n'
658     msg += ' Please use the CRAB server mode by setting server_name=<NAME> in section [CRAB] of your crab.cfg.\n'
659     msg += ' For further infos please see https://twiki.cern.ch/twiki/bin/view/CMS/CrabServer#CRABSERVER_for_Users'
660     raise CrabException(msg)
661 gutsche 1.72
662 slacapra 1.61 ## create tar-ball with ML stuff
663 slacapra 1.97
664 spiga 1.165 def wsSetupEnvironment(self, nj=0):
665 slacapra 1.1 """
666     Returns part of a job script which prepares
667     the execution environment for the job 'nj'.
668     """
669 ewv 1.276 # FUTURE: Drop support for .cfg when possible
670 ewv 1.184 if (self.CMSSW_major >= 2 and self.CMSSW_minor >= 1) or (self.CMSSW_major >= 3):
671     psetName = 'pset.py'
672     else:
673     psetName = 'pset.cfg'
674 slacapra 1.1 # Prepare JobType-independent part
675 ewv 1.160 txt = '\n#Written by cms_cmssw::wsSetupEnvironment\n'
676 fanzago 1.133 txt += 'echo ">>> setup environment"\n'
677 spiga 1.290 txt += 'if [ $middleware == LCG ] || [ $middleware == CAF ] || [ $middleware == LSF ]; then \n'
678 gutsche 1.3 txt += self.wsSetupCMSLCGEnvironment_()
679 ewv 1.283 txt += 'elif [ $middleware == OSG ]; then\n'
680 gutsche 1.43 txt += ' WORKING_DIR=`/bin/mktemp -d $OSG_WN_TMP/cms_XXXXXXXXXXXX`\n'
681 ewv 1.132 txt += ' if [ ! $? == 0 ] ;then\n'
682 fanzago 1.161 txt += ' echo "ERROR ==> OSG $WORKING_DIR could not be created on WN `hostname`"\n'
683     txt += ' job_exit_code=10016\n'
684     txt += ' func_exit\n'
685 gutsche 1.3 txt += ' fi\n'
686 fanzago 1.133 txt += ' echo ">>> Created working directory: $WORKING_DIR"\n'
687 gutsche 1.3 txt += '\n'
688     txt += ' echo "Change to working directory: $WORKING_DIR"\n'
689     txt += ' cd $WORKING_DIR\n'
690 fanzago 1.133 txt += ' echo ">>> current directory (WORKING_DIR): $WORKING_DIR"\n'
691 ewv 1.131 txt += self.wsSetupCMSOSGEnvironment_()
692 spiga 1.282 #Setup SGE Environment
693 ewv 1.283 txt += 'elif [ $middleware == SGE ]; then\n'
694 spiga 1.282 txt += self.wsSetupCMSLCGEnvironment_()
695    
696 edelmann 1.289 txt += 'elif [ $middleware == ARC ]; then\n'
697     txt += self.wsSetupCMSLCGEnvironment_()
698    
699 gutsche 1.3 txt += 'fi\n'
700 slacapra 1.1
701     # Prepare JobType-specific part
702     scram = self.scram.commandName()
703     txt += '\n\n'
704 fanzago 1.133 txt += 'echo ">>> specific cmssw setup environment:"\n'
705     txt += 'echo "CMSSW_VERSION = '+self.version+'"\n'
706 slacapra 1.1 txt += scram+' project CMSSW '+self.version+'\n'
707     txt += 'status=$?\n'
708     txt += 'if [ $status != 0 ] ; then\n'
709 fanzago 1.161 txt += ' echo "ERROR ==> CMSSW '+self.version+' not found on `hostname`" \n'
710     txt += ' job_exit_code=10034\n'
711 fanzago 1.163 txt += ' func_exit\n'
712 slacapra 1.1 txt += 'fi \n'
713     txt += 'cd '+self.version+'\n'
714 spiga 1.277 txt += 'SOFTWARE_DIR=`pwd`; export SOFTWARE_DIR\n'
715 fanzago 1.133 txt += 'echo ">>> current directory (SOFTWARE_DIR): $SOFTWARE_DIR" \n'
716 slacapra 1.1 txt += 'eval `'+scram+' runtime -sh | grep -v SCRAMRT_LSB_JOBNAME`\n'
717 fanzago 1.180 txt += 'if [ $? != 0 ] ; then\n'
718     txt += ' echo "ERROR ==> Problem with the command: "\n'
719     txt += ' echo "eval \`'+scram+' runtime -sh | grep -v SCRAMRT_LSB_JOBNAME \` at `hostname`"\n'
720     txt += ' job_exit_code=10034\n'
721     txt += ' func_exit\n'
722     txt += 'fi \n'
723 slacapra 1.1 # Handle the arguments:
724     txt += "\n"
725 gutsche 1.7 txt += "## number of arguments (first argument always jobnumber)\n"
726 slacapra 1.1 txt += "\n"
727 spiga 1.165 txt += "if [ $nargs -lt "+str(self.argsList)+" ]\n"
728 slacapra 1.1 txt += "then\n"
729 fanzago 1.161 txt += " echo 'ERROR ==> Too few arguments' +$nargs+ \n"
730     txt += ' job_exit_code=50113\n'
731     txt += " func_exit\n"
732 slacapra 1.1 txt += "fi\n"
733     txt += "\n"
734    
735     # Prepare job-specific part
736     job = common.job_list[nj]
737 ewv 1.131 if (self.datasetPath):
738 fanzago 1.318 #self.primaryDataset = self.datasetPath.split("/")[1]
739     #DataTier = self.datasetPath.split("/")[2]
740 fanzago 1.93 txt += '\n'
741     txt += 'DatasetPath='+self.datasetPath+'\n'
742    
743 spiga 1.238 txt += 'PrimaryDataset='+self.primaryDataset +'\n'
744 fanzago 1.318 txt += 'DataTier='+self.dataTier+'\n'
745 fanzago 1.96 txt += 'ApplicationFamily=cmsRun\n'
746 fanzago 1.93
747     else:
748 fanzago 1.318 #self.primaryDataset = 'null'
749 fanzago 1.93 txt += 'DatasetPath=MCDataTier\n'
750     txt += 'PrimaryDataset=null\n'
751     txt += 'DataTier=null\n'
752     txt += 'ApplicationFamily=MCDataTier\n'
753 ewv 1.170 if self.pset != None:
754 spiga 1.42 pset = os.path.basename(job.configFilename())
755     txt += '\n'
756 spiga 1.95 txt += 'cp $RUNTIME_AREA/'+pset+' .\n'
757 spiga 1.296
758 ewv 1.295 txt += 'PreserveSeeds=' + ','.join(self.preserveSeeds) + '; export PreserveSeeds\n'
759     txt += 'IncrementSeeds=' + ','.join(self.incrementSeeds) + '; export IncrementSeeds\n'
760     txt += 'echo "PreserveSeeds: <$PreserveSeeds>"\n'
761     txt += 'echo "IncrementSeeds:<$IncrementSeeds>"\n'
762 slacapra 1.90
763 ewv 1.184 txt += 'mv -f ' + pset + ' ' + psetName + '\n'
764 ewv 1.319 else:
765 spiga 1.314 txt += '\n'
766 spiga 1.331 if self.AdditionalArgs: txt += 'export AdditionalArgs=\"%s\"\n'%(self.AdditionalArgs)
767 spiga 1.315 if int(self.NumEvents) != 0: txt += 'export MaxEvents=%s\n'%str(self.NumEvents)
768 gutsche 1.3 return txt
769 slacapra 1.176
770 fanzago 1.166 def wsUntarSoftware(self, nj=0):
771 gutsche 1.3 """
772     Put in the script the commands to build an executable
773     or a library.
774     """
775    
776 fanzago 1.166 txt = '\n#Written by cms_cmssw::wsUntarSoftware\n'
777 gutsche 1.3
778     if os.path.isfile(self.tgzNameWithPath):
779 fanzago 1.133 txt += 'echo ">>> tar xzvf $RUNTIME_AREA/'+os.path.basename(self.tgzNameWithPath)+' :" \n'
780 spiga 1.300 txt += 'tar zxvf $RUNTIME_AREA/'+os.path.basename(self.tgzNameWithPath)+'\n'
781 fanzago 1.285 if self.debug_wrapper==1 :
782 spiga 1.199 txt += 'ls -Al \n'
783 gutsche 1.3 txt += 'untar_status=$? \n'
784     txt += 'if [ $untar_status -ne 0 ]; then \n'
785 fanzago 1.161 txt += ' echo "ERROR ==> Untarring .tgz file failed"\n'
786     txt += ' job_exit_code=$untar_status\n'
787     txt += ' func_exit\n'
788 gutsche 1.3 txt += 'else \n'
789     txt += ' echo "Successful untar" \n'
790     txt += 'fi \n'
791 gutsche 1.50 txt += '\n'
792 slacapra 1.211 txt += 'echo ">>> Include $RUNTIME_AREA in PYTHONPATH:"\n'
793 gutsche 1.50 txt += 'if [ -z "$PYTHONPATH" ]; then\n'
794 slacapra 1.211 txt += ' export PYTHONPATH=$RUNTIME_AREA/\n'
795 gutsche 1.50 txt += 'else\n'
796 slacapra 1.211 txt += ' export PYTHONPATH=$RUNTIME_AREA/:${PYTHONPATH}\n'
797 fanzago 1.93 txt += 'echo "PYTHONPATH=$PYTHONPATH"\n'
798 gutsche 1.50 txt += 'fi\n'
799     txt += '\n'
800    
801 gutsche 1.3 pass
802 ewv 1.131
803 slacapra 1.1 return txt
804 ewv 1.170
805 fanzago 1.166 def wsBuildExe(self, nj=0):
806     """
807     Put in the script the commands to build an executable
808     or a library.
809     """
810    
811     txt = '\n#Written by cms_cmssw::wsBuildExe\n'
812     txt += 'echo ">>> moving CMSSW software directories in `pwd`" \n'
813    
814 ewv 1.170 txt += 'rm -r lib/ module/ \n'
815     txt += 'mv $RUNTIME_AREA/lib/ . \n'
816     txt += 'mv $RUNTIME_AREA/module/ . \n'
817 spiga 1.186 if self.dataExist == True:
818     txt += 'rm -r src/ \n'
819     txt += 'mv $RUNTIME_AREA/src/ . \n'
820 ewv 1.182 if len(self.additional_inbox_files)>0:
821 spiga 1.179 for file in self.additional_inbox_files:
822 spiga 1.191 txt += 'mv $RUNTIME_AREA/'+os.path.basename(file)+' . \n'
823 slacapra 1.214 # txt += 'mv $RUNTIME_AREA/ProdCommon/ . \n'
824     # txt += 'mv $RUNTIME_AREA/IMProv/ . \n'
825 ewv 1.170
826 slacapra 1.211 txt += 'echo ">>> Include $RUNTIME_AREA in PYTHONPATH:"\n'
827 fanzago 1.166 txt += 'if [ -z "$PYTHONPATH" ]; then\n'
828 slacapra 1.211 txt += ' export PYTHONPATH=$RUNTIME_AREA/\n'
829 fanzago 1.166 txt += 'else\n'
830 slacapra 1.211 txt += ' export PYTHONPATH=$RUNTIME_AREA/:${PYTHONPATH}\n'
831 fanzago 1.166 txt += 'echo "PYTHONPATH=$PYTHONPATH"\n'
832     txt += 'fi\n'
833     txt += '\n'
834    
835 slacapra 1.302 if self.pset != None:
836 slacapra 1.303 # FUTURE: Drop support for .cfg when possible
837     if (self.CMSSW_major >= 2 and self.CMSSW_minor >= 1) or (self.CMSSW_major >= 3):
838     psetName = 'pset.py'
839     else:
840     psetName = 'pset.cfg'
841 slacapra 1.302 # FUTURE: Can simply for 2_1_x and higher
842     txt += '\n'
843     if self.debug_wrapper == 1:
844     txt += 'echo "***** cat ' + psetName + ' *********"\n'
845     txt += 'cat ' + psetName + '\n'
846     txt += 'echo "****** end ' + psetName + ' ********"\n'
847     txt += '\n'
848     txt += 'echo "***********************" \n'
849     txt += 'which edmConfigHash \n'
850     txt += 'echo "***********************" \n'
851     if (self.CMSSW_major >= 2 and self.CMSSW_minor >= 1) or (self.CMSSW_major >= 3):
852     txt += 'edmConfigHash ' + psetName + ' \n'
853     txt += 'PSETHASH=`edmConfigHash ' + psetName + '` \n'
854     else:
855     txt += 'PSETHASH=`edmConfigHash < ' + psetName + '` \n'
856     txt += 'echo "PSETHASH = $PSETHASH" \n'
857     #### FEDE temporary fix for noEdm files #####
858     txt += 'if [ -z "$PSETHASH" ]; then \n'
859     txt += ' export PSETHASH=null\n'
860     txt += 'fi \n'
861     #############################################
862     txt += '\n'
863 fanzago 1.166 return txt
864 slacapra 1.1
865 ewv 1.131
866 slacapra 1.1 def executableName(self):
867 ewv 1.192 if self.scriptExe:
868 spiga 1.42 return "sh "
869     else:
870     return self.executable
871 slacapra 1.1
872     def executableArgs(self):
873 ewv 1.160 # FUTURE: This function tests the CMSSW version. Can be simplified as we drop support for old versions
874 ewv 1.276 if self.scriptExe:
875 ewv 1.319 return self.scriptExe + " $NJob $AdditionalArgs"
876 fanzago 1.115 else:
877 ewv 1.160 ex_args = ""
878 ewv 1.276 ex_args += " -j $RUNTIME_AREA/crab_fjr_$NJob.xml"
879     # Type of config file depends on CMSSW version
880 ewv 1.184 if self.CMSSW_major >= 2 :
881 ewv 1.171 ex_args += " -p pset.py"
882 fanzago 1.115 else:
883 ewv 1.160 ex_args += " -p pset.cfg"
884     return ex_args
885 slacapra 1.1
886     def inputSandbox(self, nj):
887     """
888     Returns a list of filenames to be put in JDL input sandbox.
889     """
890     inp_box = []
891     if os.path.isfile(self.tgzNameWithPath):
892     inp_box.append(self.tgzNameWithPath)
893 spiga 1.320 if os.path.isfile(self.argsFile):
894     inp_box.append(self.argsFile)
895 spiga 1.243 inp_box.append(common.work_space.jobDir() + self.scriptName)
896 slacapra 1.1 return inp_box
897    
898     def outputSandbox(self, nj):
899     """
900     Returns a list of filenames to be put in JDL output sandbox.
901     """
902     out_box = []
903    
904     ## User Declared output files
905 slacapra 1.54 for out in (self.output_file+self.output_file_sandbox):
906 ewv 1.131 n_out = nj + 1
907 slacapra 1.207 out_box.append(numberFile(out,str(n_out)))
908 slacapra 1.1 return out_box
909    
910    
911     def wsRenameOutput(self, nj):
912     """
913     Returns part of a job script which renames the produced files.
914     """
915    
916 ewv 1.160 txt = '\n#Written by cms_cmssw::wsRenameOutput\n'
917 fanzago 1.148 txt += 'echo ">>> current directory (SOFTWARE_DIR): $SOFTWARE_DIR" \n'
918     txt += 'echo ">>> current directory content:"\n'
919 fanzago 1.285 if self.debug_wrapper==1:
920 spiga 1.199 txt += 'ls -Al\n'
921 fanzago 1.145 txt += '\n'
922 slacapra 1.54
923 fanzago 1.128 for fileWithSuffix in (self.output_file):
924 slacapra 1.207 output_file_num = numberFile(fileWithSuffix, '$NJob')
925 slacapra 1.1 txt += '\n'
926 gutsche 1.7 txt += '# check output file\n'
927 slacapra 1.106 txt += 'if [ -e ./'+fileWithSuffix+' ] ; then\n'
928 ewv 1.147 if (self.copy_data == 1): # For OSG nodes, file is in $WORKING_DIR, should not be moved to $RUNTIME_AREA
929     txt += ' mv '+fileWithSuffix+' '+output_file_num+'\n'
930 spiga 1.209 txt += ' ln -s `pwd`/'+output_file_num+' $RUNTIME_AREA/'+fileWithSuffix+'\n'
931 ewv 1.147 else:
932     txt += ' mv '+fileWithSuffix+' $RUNTIME_AREA/'+output_file_num+'\n'
933     txt += ' ln -s $RUNTIME_AREA/'+output_file_num+' $RUNTIME_AREA/'+fileWithSuffix+'\n'
934 slacapra 1.106 txt += 'else\n'
935 fanzago 1.161 txt += ' job_exit_code=60302\n'
936     txt += ' echo "WARNING: Output file '+fileWithSuffix+' not found"\n'
937 ewv 1.156 if common.scheduler.name().upper() == 'CONDOR_G':
938 gutsche 1.7 txt += ' if [ $middleware == OSG ]; then \n'
939     txt += ' echo "prepare dummy output file"\n'
940     txt += ' echo "Processing of job output failed" > $RUNTIME_AREA/'+output_file_num+'\n'
941     txt += ' fi \n'
942 slacapra 1.1 txt += 'fi\n'
943 slacapra 1.105 file_list = []
944     for fileWithSuffix in (self.output_file):
945 spiga 1.246 file_list.append(numberFile('$SOFTWARE_DIR/'+fileWithSuffix, '$NJob'))
946 ewv 1.131
947 spiga 1.245 txt += 'file_list="'+string.join(file_list,',')+'"\n'
948 fanzago 1.149 txt += '\n'
949 fanzago 1.148 txt += 'echo ">>> current directory (SOFTWARE_DIR): $SOFTWARE_DIR" \n'
950     txt += 'echo ">>> current directory content:"\n'
951 fanzago 1.285 if self.debug_wrapper==1:
952 spiga 1.199 txt += 'ls -Al\n'
953 fanzago 1.148 txt += '\n'
954 gutsche 1.7 txt += 'cd $RUNTIME_AREA\n'
955 fanzago 1.133 txt += 'echo ">>> current directory (RUNTIME_AREA): $RUNTIME_AREA"\n'
956 slacapra 1.1 return txt
957    
958 slacapra 1.63 def getRequirements(self, nj=[]):
959 slacapra 1.1 """
960 ewv 1.131 return job requirements to add to jdl files
961 slacapra 1.1 """
962     req = ''
963 slacapra 1.47 if self.version:
964 slacapra 1.10 req='Member("VO-cms-' + \
965 slacapra 1.47 self.version + \
966 slacapra 1.10 '", other.GlueHostApplicationSoftwareRunTimeEnvironment)'
967 ewv 1.192 if self.executable_arch:
968 gutsche 1.107 req+=' && Member("VO-cms-' + \
969 slacapra 1.105 self.executable_arch + \
970     '", other.GlueHostApplicationSoftwareRunTimeEnvironment)'
971 gutsche 1.35
972     req = req + ' && (other.GlueHostNetworkAdapterOutboundIP)'
973 afanfani 1.229 if ( common.scheduler.name() == "glitecoll" ) or ( common.scheduler.name() == "glite"):
974 slacapra 1.316 ## 25-Jun-2009 SL: patch to use Cream enabled WMS
975     if ( self.cfg_params.get('GRID.use_cream',None) ):
976     req += ' && (other.GlueCEStateStatus == "Production" || other.GlueCEStateStatus == "Special")'
977     else:
978     req += ' && other.GlueCEStateStatus == "Production" '
979 gutsche 1.35
980 slacapra 1.1 return req
981 gutsche 1.3
982     def configFilename(self):
983     """ return the config filename """
984 ewv 1.182 # FUTURE: Can remove cfg mode for CMSSW >= 2_1_x
985 ewv 1.184 if (self.CMSSW_major >= 2 and self.CMSSW_minor >= 1) or (self.CMSSW_major >= 3):
986 slacapra 1.316 return self.name()+'.py'
987 ewv 1.182 else:
988 slacapra 1.316 return self.name()+'.cfg'
989 gutsche 1.3
990     def wsSetupCMSOSGEnvironment_(self):
991     """
992     Returns part of a job script which is prepares
993     the execution environment and which is common for all CMS jobs.
994     """
995 ewv 1.160 txt = '\n#Written by cms_cmssw::wsSetupCMSOSGEnvironment_\n'
996     txt += ' echo ">>> setup CMS OSG environment:"\n'
997 fanzago 1.133 txt += ' echo "set SCRAM ARCH to ' + self.executable_arch + '"\n'
998     txt += ' export SCRAM_ARCH='+self.executable_arch+'\n'
999 fanzago 1.136 txt += ' echo "SCRAM_ARCH = $SCRAM_ARCH"\n'
1000 ewv 1.135 txt += ' if [ -f $OSG_APP/cmssoft/cms/cmsset_default.sh ] ;then\n'
1001 mkirn 1.40 txt += ' # Use $OSG_APP/cmssoft/cms/cmsset_default.sh to setup cms software\n'
1002 fanzago 1.133 txt += ' source $OSG_APP/cmssoft/cms/cmsset_default.sh '+self.version+'\n'
1003     txt += ' else\n'
1004 fanzago 1.161 txt += ' echo "ERROR ==> $OSG_APP/cmssoft/cms/cmsset_default.sh file not found"\n'
1005     txt += ' job_exit_code=10020\n'
1006     txt += ' func_exit\n'
1007 fanzago 1.133 txt += ' fi\n'
1008 gutsche 1.3 txt += '\n'
1009 fanzago 1.161 txt += ' echo "==> setup cms environment ok"\n'
1010 fanzago 1.136 txt += ' echo "SCRAM_ARCH = $SCRAM_ARCH"\n'
1011 gutsche 1.3
1012     return txt
1013 ewv 1.131
1014 gutsche 1.3 def wsSetupCMSLCGEnvironment_(self):
1015     """
1016     Returns part of a job script which is prepares
1017     the execution environment and which is common for all CMS jobs.
1018     """
1019 ewv 1.160 txt = '\n#Written by cms_cmssw::wsSetupCMSLCGEnvironment_\n'
1020     txt += ' echo ">>> setup CMS LCG environment:"\n'
1021 fanzago 1.133 txt += ' echo "set SCRAM ARCH and BUILD_ARCH to ' + self.executable_arch + ' ###"\n'
1022     txt += ' export SCRAM_ARCH='+self.executable_arch+'\n'
1023     txt += ' export BUILD_ARCH='+self.executable_arch+'\n'
1024     txt += ' if [ ! $VO_CMS_SW_DIR ] ;then\n'
1025 fanzago 1.161 txt += ' echo "ERROR ==> CMS software dir not found on WN `hostname`"\n'
1026     txt += ' job_exit_code=10031\n'
1027     txt += ' func_exit\n'
1028 fanzago 1.133 txt += ' else\n'
1029     txt += ' echo "Sourcing environment... "\n'
1030     txt += ' if [ ! -s $VO_CMS_SW_DIR/cmsset_default.sh ] ;then\n'
1031 fanzago 1.161 txt += ' echo "ERROR ==> cmsset_default.sh file not found into dir $VO_CMS_SW_DIR"\n'
1032     txt += ' job_exit_code=10020\n'
1033     txt += ' func_exit\n'
1034 fanzago 1.133 txt += ' fi\n'
1035     txt += ' echo "sourcing $VO_CMS_SW_DIR/cmsset_default.sh"\n'
1036     txt += ' source $VO_CMS_SW_DIR/cmsset_default.sh\n'
1037     txt += ' result=$?\n'
1038     txt += ' if [ $result -ne 0 ]; then\n'
1039 fanzago 1.161 txt += ' echo "ERROR ==> problem sourcing $VO_CMS_SW_DIR/cmsset_default.sh"\n'
1040     txt += ' job_exit_code=10032\n'
1041     txt += ' func_exit\n'
1042 fanzago 1.133 txt += ' fi\n'
1043     txt += ' fi\n'
1044     txt += ' \n'
1045 fanzago 1.161 txt += ' echo "==> setup cms environment ok"\n'
1046 gutsche 1.3 return txt
1047 gutsche 1.5
1048 spiga 1.238 def wsModifyReport(self, nj):
1049 fanzago 1.93 """
1050 ewv 1.131 insert the part of the script that modifies the FrameworkJob Report
1051 fanzago 1.93 """
1052 ewv 1.250
1053 fanzago 1.281 txt = ''
1054 fanzago 1.318 #publish_data = int(self.cfg_params.get('USER.publish_data',0))
1055 fanzago 1.292 if (self.copy_data == 1):
1056 fanzago 1.281 txt = '\n#Written by cms_cmssw::wsModifyReport\n'
1057 fanzago 1.318 #publish_data = int(self.cfg_params.get('USER.publish_data',0))
1058 ewv 1.283
1059 spiga 1.238
1060     txt += 'if [ $StageOutExitStatus -eq 0 ]; then\n'
1061 fanzago 1.248 txt += ' FOR_LFN=$LFNBaseName\n'
1062 fanzago 1.175 txt += 'else\n'
1063     txt += ' FOR_LFN=/copy_problems/ \n'
1064     txt += 'fi\n'
1065 ewv 1.182
1066 fanzago 1.175 txt += 'echo ">>> Modify Job Report:" \n'
1067 fanzago 1.217 txt += 'chmod a+x $RUNTIME_AREA/ProdCommon/FwkJobRep/ModifyJobReport.py\n'
1068 fanzago 1.175 txt += 'echo "SE = $SE"\n'
1069     txt += 'echo "SE_PATH = $SE_PATH"\n'
1070     txt += 'echo "FOR_LFN = $FOR_LFN" \n'
1071     txt += 'echo "CMSSW_VERSION = $CMSSW_VERSION"\n\n'
1072 fanzago 1.281
1073    
1074 fanzago 1.323 args = 'fjr $RUNTIME_AREA/crab_fjr_$NJob.xml n_job $NJob for_lfn $FOR_LFN PrimaryDataset $PrimaryDataset ApplicationFamily $ApplicationFamily ApplicationName $executable cmssw_version $CMSSW_VERSION psethash $PSETHASH se_name $SE se_path $SE_PATH file_list $file_list'
1075 fanzago 1.318 if (self.publish_data == 1):
1076     #processedDataset = self.cfg_params['USER.publish_data_name']
1077     txt += 'ProcessedDataset='+self.processedDataset+'\n'
1078 fanzago 1.292 txt += 'echo "ProcessedDataset = $ProcessedDataset"\n'
1079     args += ' UserProcessedDataset $USER-$ProcessedDataset-$PSETHASH'
1080 fanzago 1.281
1081 fanzago 1.247 txt += 'echo "$RUNTIME_AREA/ProdCommon/FwkJobRep/ModifyJobReport.py '+str(args)+'"\n'
1082     txt += '$RUNTIME_AREA/ProdCommon/FwkJobRep/ModifyJobReport.py '+str(args)+'\n'
1083 fanzago 1.175 txt += 'modifyReport_result=$?\n'
1084     txt += 'if [ $modifyReport_result -ne 0 ]; then\n'
1085     txt += ' modifyReport_result=70500\n'
1086     txt += ' job_exit_code=$modifyReport_result\n'
1087     txt += ' echo "ModifyReportResult=$modifyReport_result" | tee -a $RUNTIME_AREA/$repo\n'
1088     txt += ' echo "WARNING: Problem with ModifyJobReport"\n'
1089     txt += 'else\n'
1090     txt += ' mv NewFrameworkJobReport.xml $RUNTIME_AREA/crab_fjr_$NJob.xml\n'
1091 spiga 1.103 txt += 'fi\n'
1092 fanzago 1.93 return txt
1093 ewv 1.283
1094 ewv 1.192 def wsParseFJR(self):
1095 spiga 1.189 """
1096 ewv 1.192 Parse the FrameworkJobReport to obtain useful infos
1097 spiga 1.189 """
1098     txt = '\n#Written by cms_cmssw::wsParseFJR\n'
1099     txt += 'echo ">>> Parse FrameworkJobReport crab_fjr.xml"\n'
1100     txt += 'if [ -s $RUNTIME_AREA/crab_fjr_$NJob.xml ]; then\n'
1101     txt += ' if [ -s $RUNTIME_AREA/parseCrabFjr.py ]; then\n'
1102 spiga 1.197 txt += ' cmd_out=`python $RUNTIME_AREA/parseCrabFjr.py --input $RUNTIME_AREA/crab_fjr_$NJob.xml --dashboard $MonitorID,$MonitorJobID '+self.debugWrap+'`\n'
1103 fanzago 1.285 if self.debug_wrapper==1 :
1104 spiga 1.197 txt += ' echo "Result of parsing the FrameworkJobReport crab_fjr.xml: $cmd_out"\n'
1105     txt += ' executable_exit_status=`python $RUNTIME_AREA/parseCrabFjr.py --input $RUNTIME_AREA/crab_fjr_$NJob.xml --exitcode`\n'
1106 spiga 1.189 txt += ' if [ $executable_exit_status -eq 50115 ];then\n'
1107     txt += ' echo ">>> crab_fjr.xml contents: "\n'
1108 spiga 1.222 txt += ' cat $RUNTIME_AREA/crab_fjr_$NJob.xml\n'
1109 spiga 1.189 txt += ' echo "Wrong FrameworkJobReport --> does not contain useful info. ExitStatus: $executable_exit_status"\n'
1110 spiga 1.197 txt += ' elif [ $executable_exit_status -eq -999 ];then\n'
1111     txt += ' echo "ExitStatus from FrameworkJobReport not available. not available. Using exit code of executable from command line."\n'
1112 spiga 1.189 txt += ' else\n'
1113     txt += ' echo "Extracted ExitStatus from FrameworkJobReport parsing output: $executable_exit_status"\n'
1114     txt += ' fi\n'
1115     txt += ' else\n'
1116     txt += ' echo "CRAB python script to parse CRAB FrameworkJobReport crab_fjr.xml is not available, using exit code of executable from command line."\n'
1117     txt += ' fi\n'
1118     #### Patch to check input data reading for CMSSW16x Hopefully we-ll remove it asap
1119 spiga 1.232 txt += ' if [ $executable_exit_status -eq 0 ];then\n'
1120 fanzago 1.273 txt += ' echo ">>> Executable succeded $executable_exit_status"\n'
1121 ewv 1.301 ## This cannot more work given the changes on the Job argumentsJob
1122 spiga 1.296 """
1123 spiga 1.269 if (self.datasetPath and not (self.dataset_pu or self.useParent==1)) :
1124 spiga 1.189 # VERIFY PROCESSED DATA
1125 fanzago 1.273 txt += ' echo ">>> Verify list of processed files:"\n'
1126     txt += ' echo $InputFiles |tr -d \'\\\\\' |tr \',\' \'\\n\'|tr -d \'"\' > input-files.txt\n'
1127     txt += ' python $RUNTIME_AREA/parseCrabFjr.py --input $RUNTIME_AREA/crab_fjr_$NJob.xml --lfn > processed-files.txt\n'
1128     txt += ' cat input-files.txt | sort | uniq > tmp.txt\n'
1129     txt += ' mv tmp.txt input-files.txt\n'
1130     txt += ' echo "cat input-files.txt"\n'
1131     txt += ' echo "----------------------"\n'
1132     txt += ' cat input-files.txt\n'
1133     txt += ' cat processed-files.txt | sort | uniq > tmp.txt\n'
1134     txt += ' mv tmp.txt processed-files.txt\n'
1135     txt += ' echo "----------------------"\n'
1136     txt += ' echo "cat processed-files.txt"\n'
1137     txt += ' echo "----------------------"\n'
1138     txt += ' cat processed-files.txt\n'
1139     txt += ' echo "----------------------"\n'
1140 spiga 1.278 txt += ' diff -qbB input-files.txt processed-files.txt\n'
1141 fanzago 1.273 txt += ' fileverify_status=$?\n'
1142     txt += ' if [ $fileverify_status -ne 0 ]; then\n'
1143     txt += ' executable_exit_status=30001\n'
1144     txt += ' echo "ERROR ==> not all input files processed"\n'
1145     txt += ' echo " ==> list of processed files from crab_fjr.xml differs from list in pset.cfg"\n'
1146     txt += ' echo " ==> diff input-files.txt processed-files.txt"\n'
1147     txt += ' fi\n'
1148 spiga 1.296 """
1149 spiga 1.232 txt += ' fi\n'
1150 spiga 1.189 txt += 'else\n'
1151     txt += ' echo "CRAB FrameworkJobReport crab_fjr.xml is not available, using exit code of executable from command line."\n'
1152     txt += 'fi\n'
1153     txt += '\n'
1154 fanzago 1.279 txt += 'if [ $executable_exit_status -ne 0 ] && [ $executable_exit_status -ne 50115 ] && [ $executable_exit_status -ne 50117 ] && [ $executable_exit_status -ne 30001 ];then\n'
1155 fanzago 1.273 txt += ' echo ">>> Executable failed $executable_exit_status"\n'
1156     txt += ' echo "ExeExitCode=$executable_exit_status" | tee -a $RUNTIME_AREA/$repo\n'
1157     txt += ' echo "EXECUTABLE_EXIT_STATUS = $executable_exit_status"\n'
1158     txt += ' job_exit_code=$executable_exit_status\n'
1159     txt += ' func_exit\n'
1160     txt += 'fi\n\n'
1161 spiga 1.189 txt += 'echo "ExeExitCode=$executable_exit_status" | tee -a $RUNTIME_AREA/$repo\n'
1162     txt += 'echo "EXECUTABLE_EXIT_STATUS = $executable_exit_status"\n'
1163     txt += 'job_exit_code=$executable_exit_status\n'
1164    
1165     return txt
1166    
1167 gutsche 1.5 def setParam_(self, param, value):
1168     self._params[param] = value
1169    
1170     def getParams(self):
1171     return self._params
1172 gutsche 1.8
1173 spiga 1.257 def outList(self,list=False):
1174 mcinquil 1.121 """
1175     check the dimension of the output files
1176     """
1177 spiga 1.169 txt = ''
1178     txt += 'echo ">>> list of expected files on output sandbox"\n'
1179 mcinquil 1.121 listOutFiles = []
1180 ewv 1.170 stdout = 'CMSSW_$NJob.stdout'
1181 spiga 1.169 stderr = 'CMSSW_$NJob.stderr'
1182 spiga 1.268 if len(self.output_file) <= 0:
1183     msg ="WARNING: no output files name have been defined!!\n"
1184     msg+="\tno output files will be reported back/staged\n"
1185 spiga 1.304 common.logger.info(msg)
1186 fanzago 1.148 if (self.return_data == 1):
1187 spiga 1.157 for file in (self.output_file+self.output_file_sandbox):
1188 slacapra 1.207 listOutFiles.append(numberFile(file, '$NJob'))
1189 spiga 1.169 listOutFiles.append(stdout)
1190     listOutFiles.append(stderr)
1191 ewv 1.156 else:
1192 spiga 1.157 for file in (self.output_file_sandbox):
1193 slacapra 1.207 listOutFiles.append(numberFile(file, '$NJob'))
1194 spiga 1.169 listOutFiles.append(stdout)
1195     listOutFiles.append(stderr)
1196 fanzago 1.161 txt += 'echo "output files: '+string.join(listOutFiles,' ')+'"\n'
1197 spiga 1.157 txt += 'filesToCheck="'+string.join(listOutFiles,' ')+'"\n'
1198 spiga 1.169 txt += 'export filesToCheck\n'
1199 ewv 1.276
1200 spiga 1.257 if list : return self.output_file
1201 ewv 1.170 return txt