ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/CRAB/python/cms_cmssw.py
Revision: 1.312
Committed: Tue Jun 16 15:49:00 2009 UTC (15 years, 10 months ago) by slacapra
Content type: text/x-python
Branch: MAIN
Changes since 1.311: +5 -1 lines
Log Message:
add CMSSW.ignore_edm_output to allow production of EDM output w/o saving it anywhere

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