ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/CRAB/python/cms_cmssw.py
Revision: 1.304
Committed: Tue May 26 10:22:49 2009 UTC (15 years, 11 months ago) by spiga
Content type: text/x-python
Branch: MAIN
Changes since 1.303: +25 -24 lines
Log Message:
adapting code to logging usage. (crab_logger removed)

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