ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/CRAB/python/cms_cmssw.py
Revision: 1.310
Committed: Tue Jun 9 13:12:07 2009 UTC (15 years, 10 months ago) by slacapra
Content type: text/x-python
Branch: MAIN
Changes since 1.309: +0 -2 lines
Log Message:
Introduce a CrabLogger class which hanlde the std python logging

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