ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/CRAB/python/Splitter.py
Revision: 1.15
Committed: Fri May 29 15:10:50 2009 UTC (15 years, 11 months ago) by spiga
Content type: text/x-python
Branch: MAIN
CVS Tags: CRAB_2_6_0_pre6
Changes since 1.14: +8 -6 lines
Log Message:
improved logging

File Contents

# User Rev Content
1 spiga 1.1 import common
2     from crab_exceptions import *
3     from crab_util import *
4     from WMCore.SiteScreening.BlackWhiteListParser import SEBlackWhiteListParser
5    
6     class JobSplitter:
7     def __init__( self, cfg_params, args ):
8     self.cfg_params = cfg_params
9 spiga 1.3 self.args=args
10 spiga 1.1 #self.maxEvents
11     # init BlackWhiteListParser
12 spiga 1.14 seWhiteList = cfg_params.get('GRID.se_white_list',[])
13     seBlackList = cfg_params.get('GRID.se_black_list',[])
14 spiga 1.1 self.blackWhiteListParser = SEBlackWhiteListParser(seWhiteList, seBlackList, common.logger)
15    
16    
17     def checkUserSettings(self):
18     ## Events per job
19     if self.cfg_params.has_key('CMSSW.events_per_job'):
20     self.eventsPerJob =int( self.cfg_params['CMSSW.events_per_job'])
21     self.selectEventsPerJob = 1
22     else:
23     self.eventsPerJob = -1
24     self.selectEventsPerJob = 0
25    
26     ## number of jobs
27     if self.cfg_params.has_key('CMSSW.number_of_jobs'):
28     self.theNumberOfJobs =int( self.cfg_params['CMSSW.number_of_jobs'])
29     self.selectNumberOfJobs = 1
30     else:
31     self.theNumberOfJobs = 0
32     self.selectNumberOfJobs = 0
33    
34     if self.cfg_params.has_key('CMSSW.total_number_of_events'):
35     self.total_number_of_events = int(self.cfg_params['CMSSW.total_number_of_events'])
36     self.selectTotalNumberEvents = 1
37     if self.selectNumberOfJobs == 1:
38     if (self.total_number_of_events != -1) and int(self.total_number_of_events) < int(self.theNumberOfJobs):
39     msg = 'Must specify at least one event per job. total_number_of_events > number_of_jobs '
40     raise CrabException(msg)
41     else:
42     self.total_number_of_events = 0
43     self.selectTotalNumberEvents = 0
44    
45    
46     ########################################################################
47     def jobSplittingByEvent( self ):
48     """
49     Perform job splitting. Jobs run over an integer number of files
50     and no more than one block.
51     ARGUMENT: blockSites: dictionary with blocks as keys and list of host sites as values
52     REQUIRES: self.selectTotalNumberEvents, self.selectEventsPerJob, self.selectNumberofJobs,
53     self.total_number_of_events, self.eventsPerJob, self.theNumberOfJobs,
54     self.maxEvents, self.filesbyblock
55 spiga 1.3 SETS: jobDestination - Site destination(s) for each job (a list of lists)
56 spiga 1.1 self.total_number_of_jobs - Total # of jobs
57     self.list_of_args - File(s) job will run on (a list of lists)
58     """
59    
60 spiga 1.3 jobDestination=[]
61 spiga 1.1 self.checkUserSettings()
62     if ( (self.selectTotalNumberEvents + self.selectEventsPerJob + self.selectNumberOfJobs) != 2 ):
63     msg = 'Must define exactly two of total_number_of_events, events_per_job, or number_of_jobs.'
64     raise CrabException(msg)
65    
66 spiga 1.4 blockSites = self.args['blockSites']
67     pubdata = self.args['pubdata']
68 spiga 1.3 filesbyblock=pubdata.getFiles()
69    
70     self.eventsbyblock=pubdata.getEventsPerBlock()
71     self.eventsbyfile=pubdata.getEventsPerFile()
72     self.parentFiles=pubdata.getParent()
73 spiga 1.1
74     ## get max number of events
75 spiga 1.3 self.maxEvents=pubdata.getMaxEvents()
76 spiga 1.1
77     self.useParent = int(self.cfg_params.get('CMSSW.use_parent',0))
78     noBboundary = int(self.cfg_params.get('CMSSW.no_block_boundary',0))
79    
80     # ---- Handle the possible job splitting configurations ---- #
81     if (self.selectTotalNumberEvents):
82     totalEventsRequested = self.total_number_of_events
83     if (self.selectEventsPerJob):
84     eventsPerJobRequested = self.eventsPerJob
85     if (self.selectNumberOfJobs):
86     totalEventsRequested = self.theNumberOfJobs * self.eventsPerJob
87    
88     # If user requested all the events in the dataset
89     if (totalEventsRequested == -1):
90     eventsRemaining=self.maxEvents
91     # If user requested more events than are in the dataset
92     elif (totalEventsRequested > self.maxEvents):
93     eventsRemaining = self.maxEvents
94 spiga 1.13 common.logger.info("Requested "+str(self.total_number_of_events)+ " events, but only "+str(self.maxEvents)+" events are available.")
95 spiga 1.1 # If user requested less events than are in the dataset
96     else:
97     eventsRemaining = totalEventsRequested
98    
99     # If user requested more events per job than are in the dataset
100     if (self.selectEventsPerJob and eventsPerJobRequested > self.maxEvents):
101     eventsPerJobRequested = self.maxEvents
102    
103     # For user info at end
104     totalEventCount = 0
105    
106     if (self.selectTotalNumberEvents and self.selectNumberOfJobs):
107     eventsPerJobRequested = int(eventsRemaining/self.theNumberOfJobs)
108    
109     if (self.selectNumberOfJobs):
110 spiga 1.13 common.logger.info("May not create the exact number_of_jobs requested.")
111 spiga 1.1
112     # old... to remove Daniele
113     totalNumberOfJobs = 999999999
114    
115 spiga 1.3 blocks = blockSites.keys()
116 spiga 1.1 blockCount = 0
117     # Backup variable in case self.maxEvents counted events in a non-included block
118     numBlocksInDataset = len(blocks)
119    
120     jobCount = 0
121     list_of_lists = []
122    
123     # list tracking which jobs are in which jobs belong to which block
124     jobsOfBlock = {}
125    
126     parString = ""
127     filesEventCount = 0
128    
129     # ---- Iterate over the blocks in the dataset until ---- #
130     # ---- we've met the requested total # of events ---- #
131     while ( (eventsRemaining > 0) and (blockCount < numBlocksInDataset) and (jobCount < totalNumberOfJobs)):
132     block = blocks[blockCount]
133     blockCount += 1
134     if block not in jobsOfBlock.keys() :
135     jobsOfBlock[block] = []
136    
137     if self.eventsbyblock.has_key(block) :
138     numEventsInBlock = self.eventsbyblock[block]
139 spiga 1.13 common.logger.debug('Events in Block File '+str(numEventsInBlock))
140 spiga 1.1
141 spiga 1.4 files = filesbyblock[block]
142 spiga 1.1 numFilesInBlock = len(files)
143     if (numFilesInBlock <= 0):
144     continue
145     fileCount = 0
146     if noBboundary == 0: # DD
147     # ---- New block => New job ---- #
148     parString = ""
149     # counter for number of events in files currently worked on
150     filesEventCount = 0
151     # flag if next while loop should touch new file
152     newFile = 1
153     # job event counter
154     jobSkipEventCount = 0
155    
156     # ---- Iterate over the files in the block until we've met the requested ---- #
157     # ---- total # of events or we've gone over all the files in this block ---- #
158     pString=''
159 spiga 1.15 msg='\n'
160 spiga 1.1 while ( (eventsRemaining > 0) and (fileCount < numFilesInBlock) and (jobCount < totalNumberOfJobs) ):
161     file = files[fileCount]
162     if self.useParent==1:
163     parent = self.parentFiles[file]
164     for f in parent :
165 spiga 1.11 pString += f + ','
166 spiga 1.13 common.logger.log(10-1, "File "+str(file)+" has the following parents: "+str(parent))
167 spiga 1.1 if newFile :
168     try:
169     numEventsInFile = self.eventsbyfile[file]
170 spiga 1.13 common.logger.log(10-1, "File "+str(file)+" has "+str(numEventsInFile)+" events")
171 spiga 1.1 # increase filesEventCount
172     filesEventCount += numEventsInFile
173     # Add file to current job
174 spiga 1.11 parString += file + ','
175 spiga 1.1 newFile = 0
176     except KeyError:
177 spiga 1.13 common.logger.info("File "+str(file)+" has unknown number of events: skipping")
178 spiga 1.1
179     eventsPerJobRequested = min(eventsPerJobRequested, eventsRemaining)
180     # if less events in file remain than eventsPerJobRequested
181     if ( filesEventCount - jobSkipEventCount < eventsPerJobRequested):
182     if noBboundary == 1: ## DD
183     newFile = 1
184     fileCount += 1
185     else:
186     # if last file in block
187     if ( fileCount == numFilesInBlock-1 ) :
188     # end job using last file, use remaining events in block
189     # close job and touch new file
190 spiga 1.11 fullString = parString[:-1]
191 spiga 1.1 if self.useParent==1:
192 spiga 1.11 fullParentString = pString[:-1]
193 spiga 1.1 list_of_lists.append([fullString,fullParentString,str(-1),str(jobSkipEventCount)])
194     else:
195     list_of_lists.append([fullString,str(-1),str(jobSkipEventCount)])
196 spiga 1.15 msg += "Job %s can run over %s events (last file in block).\n"%(str(jobCount+1), str(filesEventCount - jobSkipEventCount))
197 spiga 1.3 jobDestination.append(blockSites[block])
198 spiga 1.15 msg += "Job %s Destination: %s\n"%(str(jobCount+1),str(jobDestination[jobCount]))
199 spiga 1.1 # fill jobs of block dictionary
200     jobsOfBlock[block].append(jobCount+1)
201     # reset counter
202     jobCount = jobCount + 1
203     totalEventCount = totalEventCount + filesEventCount - jobSkipEventCount
204     eventsRemaining = eventsRemaining - filesEventCount + jobSkipEventCount
205     jobSkipEventCount = 0
206     # reset file
207     pString = ""
208     parString = ""
209     filesEventCount = 0
210     newFile = 1
211     fileCount += 1
212     else :
213     # go to next file
214     newFile = 1
215     fileCount += 1
216     # if events in file equal to eventsPerJobRequested
217     elif ( filesEventCount - jobSkipEventCount == eventsPerJobRequested ) :
218     # close job and touch new file
219 spiga 1.11 fullString = parString[:-1]
220 spiga 1.1 if self.useParent==1:
221 spiga 1.11 fullParentString = pString[:-1]
222 spiga 1.1 list_of_lists.append([fullString,fullParentString,str(eventsPerJobRequested),str(jobSkipEventCount)])
223     else:
224     list_of_lists.append([fullString,str(eventsPerJobRequested),str(jobSkipEventCount)])
225 spiga 1.15 msg += "Job %s can run over %s events.\n"%(str(jobCount+1),str(eventsPerJobRequested))
226 spiga 1.3 jobDestination.append(blockSites[block])
227 spiga 1.15 msg+= "Job %s Destination: %s\n"%(str(jobCount+1),str(jobDestination[jobCount]))
228 spiga 1.1 jobsOfBlock[block].append(jobCount+1)
229     # reset counter
230     jobCount = jobCount + 1
231     totalEventCount = totalEventCount + eventsPerJobRequested
232     eventsRemaining = eventsRemaining - eventsPerJobRequested
233     jobSkipEventCount = 0
234     # reset file
235     pString = ""
236     parString = ""
237     filesEventCount = 0
238     newFile = 1
239     fileCount += 1
240    
241     # if more events in file remain than eventsPerJobRequested
242     else :
243     # close job but don't touch new file
244 spiga 1.11 fullString = parString[:-1]
245 spiga 1.1 if self.useParent==1:
246 spiga 1.11 fullParentString = pString[:-1]
247 spiga 1.1 list_of_lists.append([fullString,fullParentString,str(eventsPerJobRequested),str(jobSkipEventCount)])
248     else:
249     list_of_lists.append([fullString,str(eventsPerJobRequested),str(jobSkipEventCount)])
250 spiga 1.15 msg += "Job %s can run over %s events.\n"%(str(jobCount+1),str(eventsPerJobRequested))
251 spiga 1.3 jobDestination.append(blockSites[block])
252 spiga 1.15 msg+= "Job %s Destination: %s\n"%(str(jobCount+1),str(jobDestination[jobCount]))
253 spiga 1.1 jobsOfBlock[block].append(jobCount+1)
254     # increase counter
255     jobCount = jobCount + 1
256     totalEventCount = totalEventCount + eventsPerJobRequested
257     eventsRemaining = eventsRemaining - eventsPerJobRequested
258     # calculate skip events for last file
259     # use filesEventCount (contains several files), jobSkipEventCount and eventsPerJobRequest
260     jobSkipEventCount = eventsPerJobRequested - (filesEventCount - jobSkipEventCount - self.eventsbyfile[file])
261     # remove all but the last file
262     filesEventCount = self.eventsbyfile[file]
263     if self.useParent==1:
264 spiga 1.11 for f in parent : pString += f + ','
265     parString = file + ','
266 spiga 1.1 pass # END if
267     pass # END while (iterate over files in the block)
268     pass # END while (iterate over blocks in the dataset)
269 spiga 1.15 common.logger.debug(msg)
270 spiga 1.1 self.ncjobs = self.total_number_of_jobs = jobCount
271     if (eventsRemaining > 0 and jobCount < totalNumberOfJobs ):
272 spiga 1.13 common.logger.info("Could not run on all requested events because some blocks not hosted at allowed sites.")
273     common.logger.info(str(jobCount)+" job(s) can run on "+str(totalEventCount)+" events.\n")
274 spiga 1.1
275     # skip check on block with no sites DD
276 spiga 1.5 if noBboundary == 0 : self.checkBlockNoSite(blocks,jobsOfBlock,blockSites)
277 spiga 1.1
278     # prepare dict output
279     dictOut = {}
280 spiga 1.11 dictOut['params']= ['InputFiles','MaxEvents','SkipEvents']
281     if self.useParent: dictOut['params']= ['InputFiles','ParentFiles','MaxEvents','SkipEvents']
282 spiga 1.1 dictOut['args'] = list_of_lists
283 spiga 1.3 dictOut['jobDestination'] = jobDestination
284 spiga 1.1 dictOut['njobs']=self.total_number_of_jobs
285    
286     return dictOut
287    
288     # keep trace of block with no sites to print a warning at the end
289    
290 spiga 1.5 def checkBlockNoSite(self,blocks,jobsOfBlock,blockSites):
291 spiga 1.1 # screen output
292     screenOutput = "List of jobs and available destination sites:\n\n"
293     noSiteBlock = []
294     bloskNoSite = []
295 spiga 1.10 allBlock = []
296 spiga 1.1
297     blockCounter = 0
298     for block in blocks:
299     if block in jobsOfBlock.keys() :
300     blockCounter += 1
301 spiga 1.10 allBlock.append( blockCounter )
302 spiga 1.1 screenOutput += "Block %5i: jobs %20s: sites: %s\n" % (blockCounter,spanRanges(jobsOfBlock[block]),
303 spiga 1.3 ','.join(self.blackWhiteListParser.checkWhiteList(self.blackWhiteListParser.checkBlackList(blockSites[block],[block]),[block])))
304     if len(self.blackWhiteListParser.checkWhiteList(self.blackWhiteListParser.checkBlackList(blockSites[block],[block]),[block])) == 0:
305 spiga 1.1 noSiteBlock.append( spanRanges(jobsOfBlock[block]) )
306     bloskNoSite.append( blockCounter )
307    
308 spiga 1.13 common.logger.info(screenOutput)
309 spiga 1.1 if len(noSiteBlock) > 0 and len(bloskNoSite) > 0:
310     msg = 'WARNING: No sites are hosting any part of data for block:\n '
311     virgola = ""
312     if len(bloskNoSite) > 1:
313     virgola = ","
314     for block in bloskNoSite:
315     msg += ' ' + str(block) + virgola
316     msg += '\n Related jobs:\n '
317     virgola = ""
318     if len(noSiteBlock) > 1:
319     virgola = ","
320     for range_jobs in noSiteBlock:
321     msg += str(range_jobs) + virgola
322     msg += '\n will not be submitted and this block of data can not be analyzed!\n'
323 spiga 1.14 if self.cfg_params.has_key('GRID.se_white_list'):
324     msg += 'WARNING: SE White List: '+self.cfg_params['GRID.se_white_list']+'\n'
325 spiga 1.1 msg += '(Hint: By whitelisting you force the job to run at this particular site(s).\n'
326     msg += 'Please check if the dataset is available at this site!)\n'
327 spiga 1.14 if self.cfg_params.has_key('GRID.ce_white_list'):
328     msg += 'WARNING: CE White List: '+self.cfg_params['GRID.ce_white_list']+'\n'
329 spiga 1.1 msg += '(Hint: By whitelisting you force the job to run at this particular site(s).\n'
330     msg += 'Please check if the dataset is available at this site!)\n'
331    
332 spiga 1.13 common.logger.info(msg)
333 spiga 1.1
334 spiga 1.10 if bloskNoSite == allBlock:
335     raise CrabException('No jobs created')
336    
337 spiga 1.1 return
338    
339    
340     ########################################################################
341     def jobSplittingByRun(self):
342     """
343     """
344     from sets import Set
345     from WMCore.JobSplitting.RunBased import RunBased
346     from WMCore.DataStructs.Workflow import Workflow
347     from WMCore.DataStructs.File import File
348     from WMCore.DataStructs.Fileset import Fileset
349     from WMCore.DataStructs.Subscription import Subscription
350     from WMCore.JobSplitting.SplitterFactory import SplitterFactory
351     from WMCore.DataStructs.Run import Run
352    
353     self.checkUserSettings()
354 spiga 1.4 blockSites = self.args['blockSites']
355     pubdata = self.args['pubdata']
356 spiga 1.1
357     if self.selectNumberOfJobs == 0 :
358     self.theNumberOfJobs = 9999999
359     blocks = {}
360     runList = []
361     thefiles = Fileset(name='FilesToSplit')
362 spiga 1.3 fileList = pubdata.getListFiles()
363 spiga 1.1 for f in fileList:
364     block = f['Block']['Name']
365     try:
366 spiga 1.3 f['Block']['StorageElementList'].extend(blockSites[block])
367 spiga 1.1 except:
368     continue
369     wmbsFile = File(f['LogicalFileName'])
370 spiga 1.3 [ wmbsFile['locations'].add(x) for x in blockSites[block] ]
371 spiga 1.1 wmbsFile['block'] = block
372     runNum = f['RunsList'][0]['RunNumber']
373     runList.append(runNum)
374     myRun = Run(runNumber=runNum)
375     wmbsFile.addRun( myRun )
376     thefiles.addFile(
377     wmbsFile
378     )
379    
380     work = Workflow()
381     subs = Subscription(
382     fileset = thefiles,
383     workflow = work,
384     split_algo = 'RunBased',
385     type = "Processing")
386     splitter = SplitterFactory()
387     jobfactory = splitter(subs)
388    
389     #loop over all runs
390     set = Set(runList)
391     list_of_lists = []
392     jobDestination = []
393    
394     count = 0
395     for i in list(set):
396     if count < self.theNumberOfJobs:
397     res = self.getJobInfo(jobfactory())
398     parString = ''
399     for file in res['lfns']:
400 spiga 1.11 parString += file + ','
401     fullString = parString[:-1]
402 spiga 1.1 list_of_lists.append([fullString,str(-1),str(0)])
403 spiga 1.2 #need to check single file location
404 spiga 1.1 jobDestination.append(res['locations'])
405     count +=1
406     # prepare dict output
407     dictOut = {}
408 spiga 1.11 dictOut['params']= ['InputFiles','MaxEvents','SkipEvents']
409 spiga 1.1 dictOut['args'] = list_of_lists
410     dictOut['jobDestination'] = jobDestination
411     dictOut['njobs']=count
412    
413     return dictOut
414    
415     def getJobInfo( self,jobGroup ):
416     res = {}
417     lfns = []
418     locations = []
419     tmp_check=0
420     for job in jobGroup.jobs:
421     for file in job.getFiles():
422     lfns.append(file['lfn'])
423     for loc in file['locations']:
424     if tmp_check < 1 :
425     locations.append(loc)
426 spiga 1.8 tmp_check = tmp_check + 1
427 spiga 1.1 ### qui va messo il check per la locations
428     res['lfns'] = lfns
429     res['locations'] = locations
430     return res
431    
432     ########################################################################
433     def jobSplittingNoInput(self):
434     """
435     Perform job splitting based on number of event per job
436     """
437 spiga 1.13 common.logger.debug('Splitting per events')
438 spiga 1.3 self.checkUserSettings()
439     jobDestination=[]
440 spiga 1.6 if ( (self.selectTotalNumberEvents + self.selectEventsPerJob + self.selectNumberOfJobs) != 2 ):
441     msg = 'Must define exactly two of total_number_of_events, events_per_job, or number_of_jobs.'
442 spiga 1.3 raise CrabException(msg)
443    
444     managedGenerators =self.args['managedGenerators']
445     generator = self.args['generator']
446     firstRun = self.cfg_params.get('CMSSW.first_run',None)
447 spiga 1.1
448     if (self.selectEventsPerJob):
449 spiga 1.13 common.logger.info('Required '+str(self.eventsPerJob)+' events per job ')
450 spiga 1.1 if (self.selectNumberOfJobs):
451 spiga 1.13 common.logger.info('Required '+str(self.theNumberOfJobs)+' jobs in total ')
452 spiga 1.1 if (self.selectTotalNumberEvents):
453 spiga 1.13 common.logger.info('Required '+str(self.total_number_of_events)+' events in total ')
454 spiga 1.1
455     if (self.total_number_of_events < 0):
456     msg='Cannot split jobs per Events with "-1" as total number of events'
457     raise CrabException(msg)
458    
459     if (self.selectEventsPerJob):
460     if (self.selectTotalNumberEvents):
461     self.total_number_of_jobs = int(self.total_number_of_events/self.eventsPerJob)
462     elif(self.selectNumberOfJobs) :
463     self.total_number_of_jobs =self.theNumberOfJobs
464     self.total_number_of_events =int(self.theNumberOfJobs*self.eventsPerJob)
465    
466     elif (self.selectNumberOfJobs) :
467     self.total_number_of_jobs = self.theNumberOfJobs
468     self.eventsPerJob = int(self.total_number_of_events/self.total_number_of_jobs)
469    
470 spiga 1.13 common.logger.debug('N jobs '+str(self.total_number_of_jobs))
471 spiga 1.1
472     # is there any remainder?
473     check = int(self.total_number_of_events) - (int(self.total_number_of_jobs)*self.eventsPerJob)
474    
475 spiga 1.13 common.logger.debug('Check '+str(check))
476 spiga 1.1
477 spiga 1.13 common.logger.info(str(self.total_number_of_jobs)+' jobs can be created, each for '+str(self.eventsPerJob)+' for a total of '+str(self.total_number_of_jobs*self.eventsPerJob)+' events')
478 spiga 1.1 if check > 0:
479 spiga 1.13 common.logger.info('Warning: asked '+str(self.total_number_of_events)+' but can do only '+str(int(self.total_number_of_jobs)*self.eventsPerJob))
480 spiga 1.1
481     # argument is seed number.$i
482     self.list_of_args = []
483     for i in range(self.total_number_of_jobs):
484     ## Since there is no input, any site is good
485 spiga 1.3 jobDestination.append([""]) #must be empty to write correctly the xml
486 spiga 1.1 args=[]
487 spiga 1.3 if (firstRun):
488 spiga 1.1 ## pythia first run
489 spiga 1.3 args.append(str(firstRun)+str(i))
490     if (generator in managedGenerators):
491     if (generator == 'comphep' and i == 0):
492 spiga 1.1 # COMPHEP is brain-dead and wants event #'s like 1,100,200,300
493     args.append('1')
494     else:
495     args.append(str(i*self.eventsPerJob))
496 spiga 1.7 args.append(str(self.eventsPerJob))
497 spiga 1.1 self.list_of_args.append(args)
498     # prepare dict output
499 spiga 1.11
500 spiga 1.1 dictOut = {}
501 spiga 1.11 dictOut['params'] = ['MaxEvents']
502     if (firstRun):
503     dictOut['params'] = ['FirstRun','MaxEvents']
504 spiga 1.12 if ( generator in managedGenerators ) : dictOut['params'] = ['FirstRun', 'FirstEvent', 'MaxEvents']
505 spiga 1.11 else:
506 spiga 1.12 if (generator in managedGenerators) : dictOut['params'] = ['FirstEvent', 'MaxEvents']
507 spiga 1.1 dictOut['args'] = self.list_of_args
508 spiga 1.3 dictOut['jobDestination'] = jobDestination
509 spiga 1.1 dictOut['njobs']=self.total_number_of_jobs
510    
511     return dictOut
512    
513    
514     def jobSplittingForScript(self):
515     """
516     Perform job splitting based on number of job
517     """
518     self.checkUserSettings()
519 spiga 1.3 if (self.selectNumberOfJobs == 0):
520 spiga 1.1 msg = 'must specify number_of_jobs.'
521     raise crabexception(msg)
522 spiga 1.3 jobDestination = []
523 spiga 1.13 common.logger.debug('Splitting per job')
524     common.logger.info('Required '+str(self.theNumberOfJobs)+' jobs in total ')
525 spiga 1.1
526     self.total_number_of_jobs = self.theNumberOfJobs
527    
528 spiga 1.13 common.logger.debug('N jobs '+str(self.total_number_of_jobs))
529 spiga 1.1
530 spiga 1.13 common.logger.info(str(self.total_number_of_jobs)+' jobs can be created')
531 spiga 1.1
532     # argument is seed number.$i
533 spiga 1.11 #self.list_of_args = []
534 spiga 1.1 for i in range(self.total_number_of_jobs):
535 spiga 1.3 jobDestination.append([""])
536 spiga 1.11 # self.list_of_args.append([str(i)])
537 spiga 1.1
538     # prepare dict output
539     dictOut = {}
540 spiga 1.11 dictOut['args'] = [] # self.list_of_args
541 spiga 1.3 dictOut['jobDestination'] = jobDestination
542 spiga 1.1 dictOut['njobs']=self.total_number_of_jobs
543     return dictOut
544    
545    
546     def jobSplittingByLumi(self):
547     """
548     """
549     return
550     def Algos(self):
551     """
552     Define key splittingType matrix
553     """
554     SplitAlogs = {
555     'EventBased' : self.jobSplittingByEvent,
556     'RunBased' : self.jobSplittingByRun,
557     'LumiBased' : self.jobSplittingByLumi,
558     'NoInput' : self.jobSplittingNoInput,
559     'ForScript' : self.jobSplittingForScript
560     }
561     return SplitAlogs
562