ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/CRAB/python/cms_cmssw.py
Revision: 1.309
Committed: Tue Jun 2 09:55:13 2009 UTC (15 years, 10 months ago) by spiga
Content type: text/x-python
Branch: MAIN
CVS Tags: CRAB_2_6_0_pre7
Changes since 1.308: +6 -1 lines
Log Message:
add crab.cfg to default.tgz. strongly requested by David Braun

File Contents

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