ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/CRAB/python/cms_cmssw.py
Revision: 1.320
Committed: Tue Jul 21 20:23:30 2009 UTC (15 years, 9 months ago) by spiga
Content type: text/x-python
Branch: MAIN
CVS Tags: CRAB_2_6_1_pre2
Changes since 1.319: +31 -44 lines
Log Message:
fix for bug #52484. Add arguments.xml to the ISB files list. not more included in default.tgz

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