ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/CRAB/python/cms_cmssw.py
Revision: 1.325
Committed: Fri Jul 24 19:01:11 2009 UTC (15 years, 9 months ago) by ewv
Content type: text/x-python
Branch: MAIN
Changes since 1.324: +2 -2 lines
Log Message:
Crashing bug in 261 avoidable by the user

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