ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/CRAB/python/cms_cmssw.py
Revision: 1.303
Committed: Tue May 26 08:54:36 2009 UTC (15 years, 11 months ago) by slacapra
Content type: text/x-python
Branch: MAIN
Changes since 1.302: +5 -0 lines
Log Message:
fix problem in defining psetname

File Contents

# User Rev Content
1 slacapra 1.1 from JobType import JobType
2     from crab_logger import Logger
3     from crab_exceptions import *
4     from crab_util import *
5     import common
6     import Scram
7 spiga 1.269 from Splitter import JobSplitter
8 slacapra 1.1
9 spiga 1.293 from IMProv.IMProvNode import IMProvNode
10 slacapra 1.105 import os, string, glob
11 slacapra 1.1
12     class Cmssw(JobType):
13 spiga 1.208 def __init__(self, cfg_params, ncjobs,skip_blocks, isNew):
14 slacapra 1.1 JobType.__init__(self, 'CMSSW')
15     common.logger.debug(3,'CMSSW::__init__')
16 spiga 1.208 self.skip_blocks = skip_blocks
17 spiga 1.296 self.argsList = 1
18 mcinquil 1.144
19 gutsche 1.3 self._params = {}
20     self.cfg_params = cfg_params
21 ewv 1.254
22 spiga 1.234 ### Temporary patch to automatically skip the ISB size check:
23     server=self.cfg_params.get('CRAB.server_name',None)
24 ewv 1.250 size = 9.5
25 spiga 1.249 if server or common.scheduler.name().upper() in ['LSF','CAF']: size = 99999
26 spiga 1.234 ### D.S.
27     self.MaxTarBallSize = float(self.cfg_params.get('EDG.maxtarballsize',size))
28 gutsche 1.72
29 gutsche 1.44 # number of jobs requested to be created, limit obj splitting
30 gutsche 1.38 self.ncjobs = ncjobs
31    
32 slacapra 1.1 log = common.logger
33 ewv 1.131
34 slacapra 1.1 self.scram = Scram.Scram(cfg_params)
35     self.additional_inbox_files = []
36     self.scriptExe = ''
37     self.executable = ''
38 slacapra 1.71 self.executable_arch = self.scram.getArch()
39 spiga 1.300 self.tgz_name = 'default.tar.gz'
40     self.tar_name = 'default.tar'
41 corvo 1.56 self.scriptName = 'CMSSW.sh'
42 ewv 1.192 self.pset = ''
43 spiga 1.187 self.datasetPath = ''
44 gutsche 1.3
45 spiga 1.300 self.tgzNameWithPath = common.work_space.pathForTgz()+self.tgz_name
46 gutsche 1.50 # set FJR file name
47     self.fjrFileName = 'crab_fjr.xml'
48    
49 slacapra 1.1 self.version = self.scram.getSWVersion()
50 slacapra 1.275 common.logger.write("CMSSW version is: "+str(self.version))
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     log.debug(6, "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     log.debug(6, "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     log.debug(6, "Cmssw::Cmssw(): PSet file = "+self.pset)
102     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 slacapra 1.70 common.logger.debug(5,"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     common.logger.debug(5,"Output from TFileService "+tfsOutput+" already in output files")
244     else:
245     outfileflag = True #output found
246     self.output_file.append(tfsOutput)
247     common.logger.message("Adding "+tfsOutput+" (from TFileService) to list of output files")
248     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     common.logger.debug(5,"Output from PoolOutputModule "+edmOutput+" already in output files")
256     else:
257     self.output_file.append(edmOutput)
258     common.logger.message("Adding "+edmOutput+" (from PoolOutputModule) to list of output files")
259     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     common.logger.message(msg)
274    
275 slacapra 1.297 except CrabException, msg:
276     common.logger.message(str(msg))
277     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 gutsche 1.3 common.logger.debug(10,"CMSSW::DataDiscoveryAndLocation()")
286    
287     datasetPath=self.datasetPath
288    
289 slacapra 1.1 ## Contact the DBS
290 gutsche 1.92 common.logger.message("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     #print "Unsorted :",unsorted_sites
324     sites = self.filesbyblock.fromkeys(self.filesbyblock,'')
325     for lfn in self.filesbyblock.keys():
326     #print lfn
327     if unsorted_sites.has_key(lfn):
328     #print "Found ",lfn
329     sites[lfn]=unsorted_sites[lfn]
330     else:
331     #print "Not Found ",lfn
332     sites[lfn]=[]
333     #print sites
334    
335     #print "Sorted :",sites
336 slacapra 1.264 if len(sites)==0:
337 spiga 1.267 msg = 'ERROR ***: no location for any of the blocks of this dataset: \n\t %s \n'%datasetPath
338     msg += "\tMaybe the dataset is located only at T1's (or at T0), where analysis jobs are not allowed\n"
339     msg += "\tPlease check DataDiscovery page https://cmsweb.cern.ch/dbs_discovery/\n"
340 slacapra 1.264 raise CrabException(msg)
341    
342 gutsche 1.35 allSites = []
343     listSites = sites.values()
344 slacapra 1.63 for listSite in listSites:
345     for oneSite in listSite:
346 gutsche 1.35 allSites.append(oneSite)
347 slacapra 1.291 [allSites.append(it) for it in allSites if not allSites.count(it)]
348 ewv 1.295
349 gutsche 1.3
350 gutsche 1.92 # screen output
351     common.logger.message("Requested dataset: " + datasetPath + " has " + str(self.maxEvents) + " events in " + str(len(self.filesbyblock.keys())) + " blocks.\n")
352    
353 gutsche 1.35 return sites
354 ewv 1.131
355 spiga 1.42
356 spiga 1.208 def split(self, jobParams,firstJobID):
357 ewv 1.276
358 spiga 1.293 jobParams = self.dict['args']
359 spiga 1.269 njobs = self.dict['njobs']
360     self.jobDestination = self.dict['jobDestination']
361 ewv 1.131
362 slacapra 1.263 if njobs==0:
363     raise CrabException("Ask to split "+str(njobs)+" jobs: aborting")
364    
365 gutsche 1.3 # create the empty structure
366     for i in range(njobs):
367     jobParams.append("")
368 ewv 1.131
369 spiga 1.165 listID=[]
370     listField=[]
371 spiga 1.293 listDictions=[]
372 spiga 1.300 exist= os.path.exists(self.argsFile)
373 spiga 1.208 for id in range(njobs):
374     job = id + int(firstJobID)
375 spiga 1.167 listID.append(job+1)
376 spiga 1.162 job_ToSave ={}
377 spiga 1.169 concString = ' '
378 spiga 1.165 argu=''
379 spiga 1.293 str_argu = str(job+1)
380 spiga 1.208 if len(jobParams[id]):
381 ewv 1.295 argu = {'JobID': job+1}
382 spiga 1.293 for i in range(len(jobParams[id])):
383     argu[self.dict['params'][i]]=jobParams[id][i]
384 ewv 1.295 # just for debug
385 spiga 1.293 str_argu += concString.join(jobParams[id])
386     listDictions.append(argu)
387 spiga 1.298 job_ToSave['arguments']= str(job+1)
388 spiga 1.208 job_ToSave['dlsDestination']= self.jobDestination[id]
389 spiga 1.165 listField.append(job_ToSave)
390 ewv 1.295 msg="Job %s Arguments: %s\n"%(str(job+1),str_argu)
391 spiga 1.293 msg+="\t Destination: %s "%(str(self.jobDestination[id]))
392 spiga 1.165 common.logger.debug(5,msg)
393 spiga 1.293 # write xml
394 ewv 1.295 if len(listDictions):
395 spiga 1.293 if exist==False: self.CreateXML()
396     self.addEntry(listDictions)
397 spiga 1.300 self.addXMLfile()
398 spiga 1.187 common._db.updateJob_(listID,listField)
399 spiga 1.300 self.zipTarFile()
400 spiga 1.293 return
401 spiga 1.300
402     def addXMLfile(self):
403    
404     import tarfile
405     # try:
406     print self.argsFile
407     tar = tarfile.open(self.tarNameWithPath, "a")
408     tar.add(self.argsFile, os.path.basename(self.argsFile))
409     tar.close()
410     ## except:
411     # pass
412 gutsche 1.3
413 spiga 1.300
414 spiga 1.293 def CreateXML(self):
415     """
416 ewv 1.295 """
417 spiga 1.300 result = IMProvNode( self.rootArgsFilename )
418     outfile = file( self.argsFile, 'w').write(str(result))
419 ewv 1.295 return
420 spiga 1.293
421     def addEntry(self, listDictions):
422     """
423     _addEntry_
424 ewv 1.295
425 spiga 1.293 add an entry to the xml file
426     """
427     from IMProv.IMProvLoader import loadIMProvFile
428     ## load xml
429 spiga 1.300 improvDoc = loadIMProvFile(self.argsFile)
430 spiga 1.293 entrname= 'Job'
431     for dictions in listDictions:
432     report = IMProvNode(entrname , None, **dictions)
433     improvDoc.addNode(report)
434 spiga 1.300 outfile = file( self.argsFile, 'w').write(str(improvDoc))
435 gutsche 1.3 return
436 ewv 1.131
437 gutsche 1.3 def numberOfJobs(self):
438 spiga 1.269 return self.dict['njobs']
439 gutsche 1.3
440 slacapra 1.1 def getTarBall(self, exe):
441     """
442     Return the TarBall with lib and exe
443     """
444 spiga 1.300 self.tarNameWithPath = common.work_space.pathForTgz()+self.tar_name
445     if os.path.exists(self.tarNameWithPath):
446     return self.tarNameWithPath
447 slacapra 1.1
448     # Prepare a tar gzipped file with user binaries.
449     self.buildTar_(exe)
450    
451 spiga 1.300 return string.strip(self.tarNameWithPath)
452 slacapra 1.1
453     def buildTar_(self, executable):
454    
455     # First of all declare the user Scram area
456     swArea = self.scram.getSWArea_()
457     swReleaseTop = self.scram.getReleaseTop_()
458 ewv 1.131
459 slacapra 1.1 ## check if working area is release top
460     if swReleaseTop == '' or swArea == swReleaseTop:
461 afanfani 1.172 common.logger.debug(3,"swArea = "+swArea+" swReleaseTop ="+swReleaseTop)
462 slacapra 1.1 return
463    
464 slacapra 1.61 import tarfile
465     try: # create tar ball
466 spiga 1.300 #tar = tarfile.open(self.tgzNameWithPath, "w:gz")
467     tar = tarfile.open(self.tarNameWithPath, "w")
468 slacapra 1.61 ## First find the executable
469 slacapra 1.86 if (self.executable != ''):
470 slacapra 1.61 exeWithPath = self.scram.findFile_(executable)
471     if ( not exeWithPath ):
472     raise CrabException('User executable '+executable+' not found')
473 ewv 1.131
474 slacapra 1.61 ## then check if it's private or not
475     if exeWithPath.find(swReleaseTop) == -1:
476     # the exe is private, so we must ship
477     common.logger.debug(5,"Exe "+exeWithPath+" to be tarred")
478     path = swArea+'/'
479 corvo 1.85 # distinguish case when script is in user project area or given by full path somewhere else
480     if exeWithPath.find(path) >= 0 :
481     exe = string.replace(exeWithPath, path,'')
482 slacapra 1.129 tar.add(path+exe,exe)
483 corvo 1.85 else :
484     tar.add(exeWithPath,os.path.basename(executable))
485 slacapra 1.61 pass
486     else:
487     # the exe is from release, we'll find it on WN
488     pass
489 ewv 1.131
490 slacapra 1.61 ## Now get the libraries: only those in local working area
491 slacapra 1.256 tar.dereference=True
492 slacapra 1.61 libDir = 'lib'
493     lib = swArea+'/' +libDir
494     common.logger.debug(5,"lib "+lib+" to be tarred")
495     if os.path.exists(lib):
496     tar.add(lib,libDir)
497 ewv 1.131
498 slacapra 1.61 ## Now check if module dir is present
499     moduleDir = 'module'
500     module = swArea + '/' + moduleDir
501     if os.path.isdir(module):
502     tar.add(module,moduleDir)
503 slacapra 1.256 tar.dereference=False
504 slacapra 1.61
505     ## Now check if any data dir(s) is present
506 spiga 1.179 self.dataExist = False
507 slacapra 1.212 todo_list = [(i, i) for i in os.listdir(swArea+"/src")]
508 slacapra 1.206 while len(todo_list):
509     entry, name = todo_list.pop()
510 slacapra 1.211 if name.startswith('crab_0_') or name.startswith('.') or name == 'CVS':
511 slacapra 1.206 continue
512 slacapra 1.212 if os.path.isdir(swArea+"/src/"+entry):
513 slacapra 1.206 entryPath = entry + '/'
514 slacapra 1.212 todo_list += [(entryPath + i, i) for i in os.listdir(swArea+"/src/"+entry)]
515 slacapra 1.206 if name == 'data':
516     self.dataExist=True
517     common.logger.debug(5,"data "+entry+" to be tarred")
518 slacapra 1.212 tar.add(swArea+"/src/"+entry,"src/"+entry)
519 slacapra 1.206 pass
520     pass
521 ewv 1.182
522 spiga 1.179 ### CMSSW ParameterSet
523     if not self.pset is None:
524     cfg_file = common.work_space.jobDir()+self.configFilename()
525 ewv 1.182 tar.add(cfg_file,self.configFilename())
526 slacapra 1.61
527 fanzago 1.93
528 fanzago 1.152 ## Add ProdCommon dir to tar
529 slacapra 1.211 prodcommonDir = './'
530     prodcommonPath = os.environ['CRABDIR'] + '/' + 'external/'
531 spiga 1.244 neededStuff = ['ProdCommon/__init__.py','ProdCommon/FwkJobRep', 'ProdCommon/CMSConfigTools', \
532 spiga 1.298 'ProdCommon/Core', 'ProdCommon/MCPayloads', 'IMProv', 'ProdCommon/Storage', \
533     'WMCore/__init__.py','WMCore/Algorithms']
534 slacapra 1.214 for file in neededStuff:
535     tar.add(prodcommonPath+file,prodcommonDir+file)
536 spiga 1.179
537     ##### ML stuff
538     ML_file_list=['report.py', 'DashboardAPI.py', 'Logger.py', 'ProcInfo.py', 'apmon.py']
539     path=os.environ['CRABDIR'] + '/python/'
540     for file in ML_file_list:
541     tar.add(path+file,file)
542    
543     ##### Utils
544 spiga 1.238 Utils_file_list=['parseCrabFjr.py','writeCfg.py', 'fillCrabFjr.py','cmscp.py']
545 spiga 1.179 for file in Utils_file_list:
546     tar.add(path+file,file)
547 ewv 1.131
548 ewv 1.182 ##### AdditionalFiles
549 slacapra 1.253 tar.dereference=True
550 spiga 1.179 for file in self.additional_inbox_files:
551     tar.add(file,string.split(file,'/')[-1])
552 slacapra 1.253 tar.dereference=False
553 spiga 1.300 common.logger.debug(5,"Files in "+self.tarNameWithPath+" : "+str(tar.getnames()))
554 ewv 1.182
555 slacapra 1.61 tar.close()
556 mcinquil 1.241 except IOError, exc:
557     common.logger.write(str(exc))
558 spiga 1.300 raise CrabException('Could not create tar-ball '+self.tarNameWithPath)
559 mcinquil 1.241 except tarfile.TarError, exc:
560     common.logger.write(str(exc))
561 spiga 1.300 raise CrabException('Could not create tar-ball '+self.tarNameWithPath)
562    
563     def zipTarFile(self):
564    
565     cmd = "gzip -c %s > %s "%(self.tarNameWithPath,self.tgzNameWithPath)
566     res=runCommand(cmd)
567 gutsche 1.72
568     tarballinfo = os.stat(self.tgzNameWithPath)
569     if ( tarballinfo.st_size > self.MaxTarBallSize*1024*1024 ) :
570 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) \
571 ewv 1.250 +'MB input sandbox limit \n'
572 spiga 1.238 msg += ' and not supported by the direct GRID submission system.\n'
573     msg += ' Please use the CRAB server mode by setting server_name=<NAME> in section [CRAB] of your crab.cfg.\n'
574     msg += ' For further infos please see https://twiki.cern.ch/twiki/bin/view/CMS/CrabServer#CRABSERVER_for_Users'
575     raise CrabException(msg)
576 gutsche 1.72
577 slacapra 1.61 ## create tar-ball with ML stuff
578 slacapra 1.97
579 spiga 1.165 def wsSetupEnvironment(self, nj=0):
580 slacapra 1.1 """
581     Returns part of a job script which prepares
582     the execution environment for the job 'nj'.
583     """
584 ewv 1.276 # FUTURE: Drop support for .cfg when possible
585 ewv 1.184 if (self.CMSSW_major >= 2 and self.CMSSW_minor >= 1) or (self.CMSSW_major >= 3):
586     psetName = 'pset.py'
587     else:
588     psetName = 'pset.cfg'
589 slacapra 1.1 # Prepare JobType-independent part
590 ewv 1.160 txt = '\n#Written by cms_cmssw::wsSetupEnvironment\n'
591 fanzago 1.133 txt += 'echo ">>> setup environment"\n'
592 spiga 1.290 txt += 'if [ $middleware == LCG ] || [ $middleware == CAF ] || [ $middleware == LSF ]; then \n'
593 gutsche 1.3 txt += self.wsSetupCMSLCGEnvironment_()
594 ewv 1.283 txt += 'elif [ $middleware == OSG ]; then\n'
595 gutsche 1.43 txt += ' WORKING_DIR=`/bin/mktemp -d $OSG_WN_TMP/cms_XXXXXXXXXXXX`\n'
596 ewv 1.132 txt += ' if [ ! $? == 0 ] ;then\n'
597 fanzago 1.161 txt += ' echo "ERROR ==> OSG $WORKING_DIR could not be created on WN `hostname`"\n'
598     txt += ' job_exit_code=10016\n'
599     txt += ' func_exit\n'
600 gutsche 1.3 txt += ' fi\n'
601 fanzago 1.133 txt += ' echo ">>> Created working directory: $WORKING_DIR"\n'
602 gutsche 1.3 txt += '\n'
603     txt += ' echo "Change to working directory: $WORKING_DIR"\n'
604     txt += ' cd $WORKING_DIR\n'
605 fanzago 1.133 txt += ' echo ">>> current directory (WORKING_DIR): $WORKING_DIR"\n'
606 ewv 1.131 txt += self.wsSetupCMSOSGEnvironment_()
607 spiga 1.282 #Setup SGE Environment
608 ewv 1.283 txt += 'elif [ $middleware == SGE ]; then\n'
609 spiga 1.282 txt += self.wsSetupCMSLCGEnvironment_()
610    
611 edelmann 1.289 txt += 'elif [ $middleware == ARC ]; then\n'
612     txt += self.wsSetupCMSLCGEnvironment_()
613    
614 gutsche 1.3 txt += 'fi\n'
615 slacapra 1.1
616     # Prepare JobType-specific part
617     scram = self.scram.commandName()
618     txt += '\n\n'
619 fanzago 1.133 txt += 'echo ">>> specific cmssw setup environment:"\n'
620     txt += 'echo "CMSSW_VERSION = '+self.version+'"\n'
621 slacapra 1.1 txt += scram+' project CMSSW '+self.version+'\n'
622     txt += 'status=$?\n'
623     txt += 'if [ $status != 0 ] ; then\n'
624 fanzago 1.161 txt += ' echo "ERROR ==> CMSSW '+self.version+' not found on `hostname`" \n'
625     txt += ' job_exit_code=10034\n'
626 fanzago 1.163 txt += ' func_exit\n'
627 slacapra 1.1 txt += 'fi \n'
628     txt += 'cd '+self.version+'\n'
629 spiga 1.277 txt += 'SOFTWARE_DIR=`pwd`; export SOFTWARE_DIR\n'
630 fanzago 1.133 txt += 'echo ">>> current directory (SOFTWARE_DIR): $SOFTWARE_DIR" \n'
631 slacapra 1.1 txt += 'eval `'+scram+' runtime -sh | grep -v SCRAMRT_LSB_JOBNAME`\n'
632 fanzago 1.180 txt += 'if [ $? != 0 ] ; then\n'
633     txt += ' echo "ERROR ==> Problem with the command: "\n'
634     txt += ' echo "eval \`'+scram+' runtime -sh | grep -v SCRAMRT_LSB_JOBNAME \` at `hostname`"\n'
635     txt += ' job_exit_code=10034\n'
636     txt += ' func_exit\n'
637     txt += 'fi \n'
638 slacapra 1.1 # Handle the arguments:
639     txt += "\n"
640 gutsche 1.7 txt += "## number of arguments (first argument always jobnumber)\n"
641 slacapra 1.1 txt += "\n"
642 spiga 1.165 txt += "if [ $nargs -lt "+str(self.argsList)+" ]\n"
643 slacapra 1.1 txt += "then\n"
644 fanzago 1.161 txt += " echo 'ERROR ==> Too few arguments' +$nargs+ \n"
645     txt += ' job_exit_code=50113\n'
646     txt += " func_exit\n"
647 slacapra 1.1 txt += "fi\n"
648     txt += "\n"
649    
650     # Prepare job-specific part
651     job = common.job_list[nj]
652 ewv 1.131 if (self.datasetPath):
653 spiga 1.238 self.primaryDataset = self.datasetPath.split("/")[1]
654     DataTier = self.datasetPath.split("/")[2]
655 fanzago 1.93 txt += '\n'
656     txt += 'DatasetPath='+self.datasetPath+'\n'
657    
658 spiga 1.238 txt += 'PrimaryDataset='+self.primaryDataset +'\n'
659     txt += 'DataTier='+DataTier+'\n'
660 fanzago 1.96 txt += 'ApplicationFamily=cmsRun\n'
661 fanzago 1.93
662     else:
663 ewv 1.250 self.primaryDataset = 'null'
664 fanzago 1.93 txt += 'DatasetPath=MCDataTier\n'
665     txt += 'PrimaryDataset=null\n'
666     txt += 'DataTier=null\n'
667     txt += 'ApplicationFamily=MCDataTier\n'
668 ewv 1.170 if self.pset != None:
669 spiga 1.42 pset = os.path.basename(job.configFilename())
670     txt += '\n'
671 spiga 1.95 txt += 'cp $RUNTIME_AREA/'+pset+' .\n'
672 spiga 1.296
673 ewv 1.295 txt += 'PreserveSeeds=' + ','.join(self.preserveSeeds) + '; export PreserveSeeds\n'
674     txt += 'IncrementSeeds=' + ','.join(self.incrementSeeds) + '; export IncrementSeeds\n'
675     txt += 'echo "PreserveSeeds: <$PreserveSeeds>"\n'
676     txt += 'echo "IncrementSeeds:<$IncrementSeeds>"\n'
677 slacapra 1.90
678 ewv 1.184 txt += 'mv -f ' + pset + ' ' + psetName + '\n'
679 slacapra 1.1
680    
681 gutsche 1.3 return txt
682 slacapra 1.176
683 fanzago 1.166 def wsUntarSoftware(self, nj=0):
684 gutsche 1.3 """
685     Put in the script the commands to build an executable
686     or a library.
687     """
688    
689 fanzago 1.166 txt = '\n#Written by cms_cmssw::wsUntarSoftware\n'
690 gutsche 1.3
691     if os.path.isfile(self.tgzNameWithPath):
692 fanzago 1.133 txt += 'echo ">>> tar xzvf $RUNTIME_AREA/'+os.path.basename(self.tgzNameWithPath)+' :" \n'
693 spiga 1.300 txt += 'tar zxvf $RUNTIME_AREA/'+os.path.basename(self.tgzNameWithPath)+'\n'
694 fanzago 1.285 if self.debug_wrapper==1 :
695 spiga 1.199 txt += 'ls -Al \n'
696 gutsche 1.3 txt += 'untar_status=$? \n'
697     txt += 'if [ $untar_status -ne 0 ]; then \n'
698 fanzago 1.161 txt += ' echo "ERROR ==> Untarring .tgz file failed"\n'
699     txt += ' job_exit_code=$untar_status\n'
700     txt += ' func_exit\n'
701 gutsche 1.3 txt += 'else \n'
702     txt += ' echo "Successful untar" \n'
703     txt += 'fi \n'
704 gutsche 1.50 txt += '\n'
705 slacapra 1.211 txt += 'echo ">>> Include $RUNTIME_AREA in PYTHONPATH:"\n'
706 gutsche 1.50 txt += 'if [ -z "$PYTHONPATH" ]; then\n'
707 slacapra 1.211 txt += ' export PYTHONPATH=$RUNTIME_AREA/\n'
708 gutsche 1.50 txt += 'else\n'
709 slacapra 1.211 txt += ' export PYTHONPATH=$RUNTIME_AREA/:${PYTHONPATH}\n'
710 fanzago 1.93 txt += 'echo "PYTHONPATH=$PYTHONPATH"\n'
711 gutsche 1.50 txt += 'fi\n'
712     txt += '\n'
713    
714 gutsche 1.3 pass
715 ewv 1.131
716 slacapra 1.1 return txt
717 ewv 1.170
718 fanzago 1.166 def wsBuildExe(self, nj=0):
719     """
720     Put in the script the commands to build an executable
721     or a library.
722     """
723    
724     txt = '\n#Written by cms_cmssw::wsBuildExe\n'
725     txt += 'echo ">>> moving CMSSW software directories in `pwd`" \n'
726    
727 ewv 1.170 txt += 'rm -r lib/ module/ \n'
728     txt += 'mv $RUNTIME_AREA/lib/ . \n'
729     txt += 'mv $RUNTIME_AREA/module/ . \n'
730 spiga 1.186 if self.dataExist == True:
731     txt += 'rm -r src/ \n'
732     txt += 'mv $RUNTIME_AREA/src/ . \n'
733 ewv 1.182 if len(self.additional_inbox_files)>0:
734 spiga 1.179 for file in self.additional_inbox_files:
735 spiga 1.191 txt += 'mv $RUNTIME_AREA/'+os.path.basename(file)+' . \n'
736 slacapra 1.214 # txt += 'mv $RUNTIME_AREA/ProdCommon/ . \n'
737     # txt += 'mv $RUNTIME_AREA/IMProv/ . \n'
738 ewv 1.170
739 slacapra 1.211 txt += 'echo ">>> Include $RUNTIME_AREA in PYTHONPATH:"\n'
740 fanzago 1.166 txt += 'if [ -z "$PYTHONPATH" ]; then\n'
741 slacapra 1.211 txt += ' export PYTHONPATH=$RUNTIME_AREA/\n'
742 fanzago 1.166 txt += 'else\n'
743 slacapra 1.211 txt += ' export PYTHONPATH=$RUNTIME_AREA/:${PYTHONPATH}\n'
744 fanzago 1.166 txt += 'echo "PYTHONPATH=$PYTHONPATH"\n'
745     txt += 'fi\n'
746     txt += '\n'
747    
748 slacapra 1.302 if self.pset != None:
749 slacapra 1.303 # FUTURE: Drop support for .cfg when possible
750     if (self.CMSSW_major >= 2 and self.CMSSW_minor >= 1) or (self.CMSSW_major >= 3):
751     psetName = 'pset.py'
752     else:
753     psetName = 'pset.cfg'
754 slacapra 1.302 # FUTURE: Can simply for 2_1_x and higher
755     txt += '\n'
756     if self.debug_wrapper == 1:
757     txt += 'echo "***** cat ' + psetName + ' *********"\n'
758     txt += 'cat ' + psetName + '\n'
759     txt += 'echo "****** end ' + psetName + ' ********"\n'
760     txt += '\n'
761     txt += 'echo "***********************" \n'
762     txt += 'which edmConfigHash \n'
763     txt += 'echo "***********************" \n'
764     if (self.CMSSW_major >= 2 and self.CMSSW_minor >= 1) or (self.CMSSW_major >= 3):
765     txt += 'edmConfigHash ' + psetName + ' \n'
766     txt += 'PSETHASH=`edmConfigHash ' + psetName + '` \n'
767     else:
768     txt += 'PSETHASH=`edmConfigHash < ' + psetName + '` \n'
769     txt += 'echo "PSETHASH = $PSETHASH" \n'
770     #### FEDE temporary fix for noEdm files #####
771     txt += 'if [ -z "$PSETHASH" ]; then \n'
772     txt += ' export PSETHASH=null\n'
773     txt += 'fi \n'
774     #############################################
775     txt += '\n'
776 fanzago 1.166 return txt
777 slacapra 1.1
778 ewv 1.131
779 slacapra 1.1 def executableName(self):
780 ewv 1.192 if self.scriptExe:
781 spiga 1.42 return "sh "
782     else:
783     return self.executable
784 slacapra 1.1
785     def executableArgs(self):
786 ewv 1.160 # FUTURE: This function tests the CMSSW version. Can be simplified as we drop support for old versions
787 ewv 1.276 if self.scriptExe:
788     return self.scriptExe + " $NJob"
789 fanzago 1.115 else:
790 ewv 1.160 ex_args = ""
791 ewv 1.276 ex_args += " -j $RUNTIME_AREA/crab_fjr_$NJob.xml"
792     # Type of config file depends on CMSSW version
793 ewv 1.184 if self.CMSSW_major >= 2 :
794 ewv 1.171 ex_args += " -p pset.py"
795 fanzago 1.115 else:
796 ewv 1.160 ex_args += " -p pset.cfg"
797     return ex_args
798 slacapra 1.1
799     def inputSandbox(self, nj):
800     """
801     Returns a list of filenames to be put in JDL input sandbox.
802     """
803     inp_box = []
804     if os.path.isfile(self.tgzNameWithPath):
805     inp_box.append(self.tgzNameWithPath)
806 spiga 1.243 inp_box.append(common.work_space.jobDir() + self.scriptName)
807 slacapra 1.1 return inp_box
808    
809     def outputSandbox(self, nj):
810     """
811     Returns a list of filenames to be put in JDL output sandbox.
812     """
813     out_box = []
814    
815     ## User Declared output files
816 slacapra 1.54 for out in (self.output_file+self.output_file_sandbox):
817 ewv 1.131 n_out = nj + 1
818 slacapra 1.207 out_box.append(numberFile(out,str(n_out)))
819 slacapra 1.1 return out_box
820    
821    
822     def wsRenameOutput(self, nj):
823     """
824     Returns part of a job script which renames the produced files.
825     """
826    
827 ewv 1.160 txt = '\n#Written by cms_cmssw::wsRenameOutput\n'
828 fanzago 1.148 txt += 'echo ">>> current directory (SOFTWARE_DIR): $SOFTWARE_DIR" \n'
829     txt += 'echo ">>> current directory content:"\n'
830 fanzago 1.285 if self.debug_wrapper==1:
831 spiga 1.199 txt += 'ls -Al\n'
832 fanzago 1.145 txt += '\n'
833 slacapra 1.54
834 fanzago 1.128 for fileWithSuffix in (self.output_file):
835 slacapra 1.207 output_file_num = numberFile(fileWithSuffix, '$NJob')
836 slacapra 1.1 txt += '\n'
837 gutsche 1.7 txt += '# check output file\n'
838 slacapra 1.106 txt += 'if [ -e ./'+fileWithSuffix+' ] ; then\n'
839 ewv 1.147 if (self.copy_data == 1): # For OSG nodes, file is in $WORKING_DIR, should not be moved to $RUNTIME_AREA
840     txt += ' mv '+fileWithSuffix+' '+output_file_num+'\n'
841 spiga 1.209 txt += ' ln -s `pwd`/'+output_file_num+' $RUNTIME_AREA/'+fileWithSuffix+'\n'
842 ewv 1.147 else:
843     txt += ' mv '+fileWithSuffix+' $RUNTIME_AREA/'+output_file_num+'\n'
844     txt += ' ln -s $RUNTIME_AREA/'+output_file_num+' $RUNTIME_AREA/'+fileWithSuffix+'\n'
845 slacapra 1.106 txt += 'else\n'
846 fanzago 1.161 txt += ' job_exit_code=60302\n'
847     txt += ' echo "WARNING: Output file '+fileWithSuffix+' not found"\n'
848 ewv 1.156 if common.scheduler.name().upper() == 'CONDOR_G':
849 gutsche 1.7 txt += ' if [ $middleware == OSG ]; then \n'
850     txt += ' echo "prepare dummy output file"\n'
851     txt += ' echo "Processing of job output failed" > $RUNTIME_AREA/'+output_file_num+'\n'
852     txt += ' fi \n'
853 slacapra 1.1 txt += 'fi\n'
854 slacapra 1.105 file_list = []
855     for fileWithSuffix in (self.output_file):
856 spiga 1.246 file_list.append(numberFile('$SOFTWARE_DIR/'+fileWithSuffix, '$NJob'))
857 ewv 1.131
858 spiga 1.245 txt += 'file_list="'+string.join(file_list,',')+'"\n'
859 fanzago 1.149 txt += '\n'
860 fanzago 1.148 txt += 'echo ">>> current directory (SOFTWARE_DIR): $SOFTWARE_DIR" \n'
861     txt += 'echo ">>> current directory content:"\n'
862 fanzago 1.285 if self.debug_wrapper==1:
863 spiga 1.199 txt += 'ls -Al\n'
864 fanzago 1.148 txt += '\n'
865 gutsche 1.7 txt += 'cd $RUNTIME_AREA\n'
866 fanzago 1.133 txt += 'echo ">>> current directory (RUNTIME_AREA): $RUNTIME_AREA"\n'
867 slacapra 1.1 return txt
868    
869 slacapra 1.63 def getRequirements(self, nj=[]):
870 slacapra 1.1 """
871 ewv 1.131 return job requirements to add to jdl files
872 slacapra 1.1 """
873     req = ''
874 slacapra 1.47 if self.version:
875 slacapra 1.10 req='Member("VO-cms-' + \
876 slacapra 1.47 self.version + \
877 slacapra 1.10 '", other.GlueHostApplicationSoftwareRunTimeEnvironment)'
878 ewv 1.192 if self.executable_arch:
879 gutsche 1.107 req+=' && Member("VO-cms-' + \
880 slacapra 1.105 self.executable_arch + \
881     '", other.GlueHostApplicationSoftwareRunTimeEnvironment)'
882 gutsche 1.35
883     req = req + ' && (other.GlueHostNetworkAdapterOutboundIP)'
884 afanfani 1.229 if ( common.scheduler.name() == "glitecoll" ) or ( common.scheduler.name() == "glite"):
885 afanfani 1.158 req += ' && other.GlueCEStateStatus == "Production" '
886 gutsche 1.35
887 slacapra 1.1 return req
888 gutsche 1.3
889     def configFilename(self):
890     """ return the config filename """
891 ewv 1.182 # FUTURE: Can remove cfg mode for CMSSW >= 2_1_x
892 ewv 1.184 if (self.CMSSW_major >= 2 and self.CMSSW_minor >= 1) or (self.CMSSW_major >= 3):
893 ewv 1.182 return self.name()+'.py'
894     else:
895     return self.name()+'.cfg'
896 gutsche 1.3
897     def wsSetupCMSOSGEnvironment_(self):
898     """
899     Returns part of a job script which is prepares
900     the execution environment and which is common for all CMS jobs.
901     """
902 ewv 1.160 txt = '\n#Written by cms_cmssw::wsSetupCMSOSGEnvironment_\n'
903     txt += ' echo ">>> setup CMS OSG environment:"\n'
904 fanzago 1.133 txt += ' echo "set SCRAM ARCH to ' + self.executable_arch + '"\n'
905     txt += ' export SCRAM_ARCH='+self.executable_arch+'\n'
906 fanzago 1.136 txt += ' echo "SCRAM_ARCH = $SCRAM_ARCH"\n'
907 ewv 1.135 txt += ' if [ -f $OSG_APP/cmssoft/cms/cmsset_default.sh ] ;then\n'
908 mkirn 1.40 txt += ' # Use $OSG_APP/cmssoft/cms/cmsset_default.sh to setup cms software\n'
909 fanzago 1.133 txt += ' source $OSG_APP/cmssoft/cms/cmsset_default.sh '+self.version+'\n'
910     txt += ' else\n'
911 fanzago 1.161 txt += ' echo "ERROR ==> $OSG_APP/cmssoft/cms/cmsset_default.sh file not found"\n'
912     txt += ' job_exit_code=10020\n'
913     txt += ' func_exit\n'
914 fanzago 1.133 txt += ' fi\n'
915 gutsche 1.3 txt += '\n'
916 fanzago 1.161 txt += ' echo "==> setup cms environment ok"\n'
917 fanzago 1.136 txt += ' echo "SCRAM_ARCH = $SCRAM_ARCH"\n'
918 gutsche 1.3
919     return txt
920 ewv 1.131
921 gutsche 1.3 def wsSetupCMSLCGEnvironment_(self):
922     """
923     Returns part of a job script which is prepares
924     the execution environment and which is common for all CMS jobs.
925     """
926 ewv 1.160 txt = '\n#Written by cms_cmssw::wsSetupCMSLCGEnvironment_\n'
927     txt += ' echo ">>> setup CMS LCG environment:"\n'
928 fanzago 1.133 txt += ' echo "set SCRAM ARCH and BUILD_ARCH to ' + self.executable_arch + ' ###"\n'
929     txt += ' export SCRAM_ARCH='+self.executable_arch+'\n'
930     txt += ' export BUILD_ARCH='+self.executable_arch+'\n'
931     txt += ' if [ ! $VO_CMS_SW_DIR ] ;then\n'
932 fanzago 1.161 txt += ' echo "ERROR ==> CMS software dir not found on WN `hostname`"\n'
933     txt += ' job_exit_code=10031\n'
934     txt += ' func_exit\n'
935 fanzago 1.133 txt += ' else\n'
936     txt += ' echo "Sourcing environment... "\n'
937     txt += ' if [ ! -s $VO_CMS_SW_DIR/cmsset_default.sh ] ;then\n'
938 fanzago 1.161 txt += ' echo "ERROR ==> cmsset_default.sh file not found into dir $VO_CMS_SW_DIR"\n'
939     txt += ' job_exit_code=10020\n'
940     txt += ' func_exit\n'
941 fanzago 1.133 txt += ' fi\n'
942     txt += ' echo "sourcing $VO_CMS_SW_DIR/cmsset_default.sh"\n'
943     txt += ' source $VO_CMS_SW_DIR/cmsset_default.sh\n'
944     txt += ' result=$?\n'
945     txt += ' if [ $result -ne 0 ]; then\n'
946 fanzago 1.161 txt += ' echo "ERROR ==> problem sourcing $VO_CMS_SW_DIR/cmsset_default.sh"\n'
947     txt += ' job_exit_code=10032\n'
948     txt += ' func_exit\n'
949 fanzago 1.133 txt += ' fi\n'
950     txt += ' fi\n'
951     txt += ' \n'
952 fanzago 1.161 txt += ' echo "==> setup cms environment ok"\n'
953 gutsche 1.3 return txt
954 gutsche 1.5
955 spiga 1.238 def wsModifyReport(self, nj):
956 fanzago 1.93 """
957 ewv 1.131 insert the part of the script that modifies the FrameworkJob Report
958 fanzago 1.93 """
959 ewv 1.250
960 fanzago 1.281 txt = ''
961 fanzago 1.286 publish_data = int(self.cfg_params.get('USER.publish_data',0))
962 fanzago 1.292 #if (publish_data == 1):
963     if (self.copy_data == 1):
964 fanzago 1.281 txt = '\n#Written by cms_cmssw::wsModifyReport\n'
965 fanzago 1.292 publish_data = int(self.cfg_params.get('USER.publish_data',0))
966 ewv 1.283
967 spiga 1.238
968     txt += 'if [ $StageOutExitStatus -eq 0 ]; then\n'
969 fanzago 1.248 txt += ' FOR_LFN=$LFNBaseName\n'
970 fanzago 1.175 txt += 'else\n'
971     txt += ' FOR_LFN=/copy_problems/ \n'
972     txt += 'fi\n'
973 ewv 1.182
974 fanzago 1.175 txt += 'echo ">>> Modify Job Report:" \n'
975 fanzago 1.217 txt += 'chmod a+x $RUNTIME_AREA/ProdCommon/FwkJobRep/ModifyJobReport.py\n'
976 fanzago 1.175 txt += 'echo "SE = $SE"\n'
977     txt += 'echo "SE_PATH = $SE_PATH"\n'
978     txt += 'echo "FOR_LFN = $FOR_LFN" \n'
979     txt += 'echo "CMSSW_VERSION = $CMSSW_VERSION"\n\n'
980 fanzago 1.281
981    
982     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'
983 fanzago 1.292 if (publish_data == 1):
984     processedDataset = self.cfg_params['USER.publish_data_name']
985     txt += 'ProcessedDataset='+processedDataset+'\n'
986     txt += 'echo "ProcessedDataset = $ProcessedDataset"\n'
987     args += ' UserProcessedDataset $USER-$ProcessedDataset-$PSETHASH'
988 fanzago 1.281
989 fanzago 1.247 txt += 'echo "$RUNTIME_AREA/ProdCommon/FwkJobRep/ModifyJobReport.py '+str(args)+'"\n'
990     txt += '$RUNTIME_AREA/ProdCommon/FwkJobRep/ModifyJobReport.py '+str(args)+'\n'
991 fanzago 1.175 txt += 'modifyReport_result=$?\n'
992     txt += 'if [ $modifyReport_result -ne 0 ]; then\n'
993     txt += ' modifyReport_result=70500\n'
994     txt += ' job_exit_code=$modifyReport_result\n'
995     txt += ' echo "ModifyReportResult=$modifyReport_result" | tee -a $RUNTIME_AREA/$repo\n'
996     txt += ' echo "WARNING: Problem with ModifyJobReport"\n'
997     txt += 'else\n'
998     txt += ' mv NewFrameworkJobReport.xml $RUNTIME_AREA/crab_fjr_$NJob.xml\n'
999 spiga 1.103 txt += 'fi\n'
1000 fanzago 1.93 return txt
1001 ewv 1.283
1002 ewv 1.192 def wsParseFJR(self):
1003 spiga 1.189 """
1004 ewv 1.192 Parse the FrameworkJobReport to obtain useful infos
1005 spiga 1.189 """
1006     txt = '\n#Written by cms_cmssw::wsParseFJR\n'
1007     txt += 'echo ">>> Parse FrameworkJobReport crab_fjr.xml"\n'
1008     txt += 'if [ -s $RUNTIME_AREA/crab_fjr_$NJob.xml ]; then\n'
1009     txt += ' if [ -s $RUNTIME_AREA/parseCrabFjr.py ]; then\n'
1010 spiga 1.197 txt += ' cmd_out=`python $RUNTIME_AREA/parseCrabFjr.py --input $RUNTIME_AREA/crab_fjr_$NJob.xml --dashboard $MonitorID,$MonitorJobID '+self.debugWrap+'`\n'
1011 fanzago 1.285 if self.debug_wrapper==1 :
1012 spiga 1.197 txt += ' echo "Result of parsing the FrameworkJobReport crab_fjr.xml: $cmd_out"\n'
1013     txt += ' executable_exit_status=`python $RUNTIME_AREA/parseCrabFjr.py --input $RUNTIME_AREA/crab_fjr_$NJob.xml --exitcode`\n'
1014 spiga 1.189 txt += ' if [ $executable_exit_status -eq 50115 ];then\n'
1015     txt += ' echo ">>> crab_fjr.xml contents: "\n'
1016 spiga 1.222 txt += ' cat $RUNTIME_AREA/crab_fjr_$NJob.xml\n'
1017 spiga 1.189 txt += ' echo "Wrong FrameworkJobReport --> does not contain useful info. ExitStatus: $executable_exit_status"\n'
1018 spiga 1.197 txt += ' elif [ $executable_exit_status -eq -999 ];then\n'
1019     txt += ' echo "ExitStatus from FrameworkJobReport not available. not available. Using exit code of executable from command line."\n'
1020 spiga 1.189 txt += ' else\n'
1021     txt += ' echo "Extracted ExitStatus from FrameworkJobReport parsing output: $executable_exit_status"\n'
1022     txt += ' fi\n'
1023     txt += ' else\n'
1024     txt += ' echo "CRAB python script to parse CRAB FrameworkJobReport crab_fjr.xml is not available, using exit code of executable from command line."\n'
1025     txt += ' fi\n'
1026     #### Patch to check input data reading for CMSSW16x Hopefully we-ll remove it asap
1027 spiga 1.232 txt += ' if [ $executable_exit_status -eq 0 ];then\n'
1028 fanzago 1.273 txt += ' echo ">>> Executable succeded $executable_exit_status"\n'
1029 ewv 1.301 ## This cannot more work given the changes on the Job argumentsJob
1030 spiga 1.296 """
1031 spiga 1.269 if (self.datasetPath and not (self.dataset_pu or self.useParent==1)) :
1032 spiga 1.189 # VERIFY PROCESSED DATA
1033 fanzago 1.273 txt += ' echo ">>> Verify list of processed files:"\n'
1034     txt += ' echo $InputFiles |tr -d \'\\\\\' |tr \',\' \'\\n\'|tr -d \'"\' > input-files.txt\n'
1035     txt += ' python $RUNTIME_AREA/parseCrabFjr.py --input $RUNTIME_AREA/crab_fjr_$NJob.xml --lfn > processed-files.txt\n'
1036     txt += ' cat input-files.txt | sort | uniq > tmp.txt\n'
1037     txt += ' mv tmp.txt input-files.txt\n'
1038     txt += ' echo "cat input-files.txt"\n'
1039     txt += ' echo "----------------------"\n'
1040     txt += ' cat input-files.txt\n'
1041     txt += ' cat processed-files.txt | sort | uniq > tmp.txt\n'
1042     txt += ' mv tmp.txt processed-files.txt\n'
1043     txt += ' echo "----------------------"\n'
1044     txt += ' echo "cat processed-files.txt"\n'
1045     txt += ' echo "----------------------"\n'
1046     txt += ' cat processed-files.txt\n'
1047     txt += ' echo "----------------------"\n'
1048 spiga 1.278 txt += ' diff -qbB input-files.txt processed-files.txt\n'
1049 fanzago 1.273 txt += ' fileverify_status=$?\n'
1050     txt += ' if [ $fileverify_status -ne 0 ]; then\n'
1051     txt += ' executable_exit_status=30001\n'
1052     txt += ' echo "ERROR ==> not all input files processed"\n'
1053     txt += ' echo " ==> list of processed files from crab_fjr.xml differs from list in pset.cfg"\n'
1054     txt += ' echo " ==> diff input-files.txt processed-files.txt"\n'
1055     txt += ' fi\n'
1056 spiga 1.296 """
1057 spiga 1.232 txt += ' fi\n'
1058 spiga 1.189 txt += 'else\n'
1059     txt += ' echo "CRAB FrameworkJobReport crab_fjr.xml is not available, using exit code of executable from command line."\n'
1060     txt += 'fi\n'
1061     txt += '\n'
1062 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'
1063 fanzago 1.273 txt += ' echo ">>> Executable failed $executable_exit_status"\n'
1064     txt += ' echo "ExeExitCode=$executable_exit_status" | tee -a $RUNTIME_AREA/$repo\n'
1065     txt += ' echo "EXECUTABLE_EXIT_STATUS = $executable_exit_status"\n'
1066     txt += ' job_exit_code=$executable_exit_status\n'
1067     txt += ' func_exit\n'
1068     txt += 'fi\n\n'
1069 spiga 1.189 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    
1073     return txt
1074    
1075 gutsche 1.5 def setParam_(self, param, value):
1076     self._params[param] = value
1077    
1078     def getParams(self):
1079     return self._params
1080 gutsche 1.8
1081 spiga 1.257 def outList(self,list=False):
1082 mcinquil 1.121 """
1083     check the dimension of the output files
1084     """
1085 spiga 1.169 txt = ''
1086     txt += 'echo ">>> list of expected files on output sandbox"\n'
1087 mcinquil 1.121 listOutFiles = []
1088 ewv 1.170 stdout = 'CMSSW_$NJob.stdout'
1089 spiga 1.169 stderr = 'CMSSW_$NJob.stderr'
1090 spiga 1.268 if len(self.output_file) <= 0:
1091     msg ="WARNING: no output files name have been defined!!\n"
1092     msg+="\tno output files will be reported back/staged\n"
1093     common.logger.message(msg)
1094 fanzago 1.148 if (self.return_data == 1):
1095 spiga 1.157 for file in (self.output_file+self.output_file_sandbox):
1096 slacapra 1.207 listOutFiles.append(numberFile(file, '$NJob'))
1097 spiga 1.169 listOutFiles.append(stdout)
1098     listOutFiles.append(stderr)
1099 ewv 1.156 else:
1100 spiga 1.157 for file in (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 fanzago 1.161 txt += 'echo "output files: '+string.join(listOutFiles,' ')+'"\n'
1105 spiga 1.157 txt += 'filesToCheck="'+string.join(listOutFiles,' ')+'"\n'
1106 spiga 1.169 txt += 'export filesToCheck\n'
1107 ewv 1.276
1108 spiga 1.257 if list : return self.output_file
1109 ewv 1.170 return txt