ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/CRAB/python/cms_cmssw.py
Revision: 1.334
Committed: Thu Aug 27 12:42:23 2009 UTC (15 years, 8 months ago) by ewv
Content type: text/x-python
Branch: MAIN
Changes since 1.333: +13 -38 lines
Log Message:
Drop support for CMSSW 1.x, 2.0 (.cfg language and old-style random #s)

File Contents

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