ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/CRAB/python/Splitter.py
Revision: 1.21
Committed: Thu Jun 11 09:30:19 2009 UTC (15 years, 10 months ago) by spiga
Content type: text/x-python
Branch: MAIN
CVS Tags: CRAB_2_6_0_pre10, CRAB_2_6_0_pre9
Changes since 1.20: +1 -0 lines
Log Message:
define msg before use it

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 slacapra 1.18 self.blackWhiteListParser = SEBlackWhiteListParser(seWhiteList, seBlackList, common.logger())
15 spiga 1.1
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 spiga 1.16 pString = ""
128 spiga 1.1 filesEventCount = 0
129 spiga 1.21 msg=''
130 spiga 1.1
131     # ---- Iterate over the blocks in the dataset until ---- #
132     # ---- we've met the requested total # of events ---- #
133     while ( (eventsRemaining > 0) and (blockCount < numBlocksInDataset) and (jobCount < totalNumberOfJobs)):
134     block = blocks[blockCount]
135     blockCount += 1
136     if block not in jobsOfBlock.keys() :
137     jobsOfBlock[block] = []
138    
139     if self.eventsbyblock.has_key(block) :
140     numEventsInBlock = self.eventsbyblock[block]
141 spiga 1.13 common.logger.debug('Events in Block File '+str(numEventsInBlock))
142 spiga 1.1
143 spiga 1.4 files = filesbyblock[block]
144 spiga 1.1 numFilesInBlock = len(files)
145     if (numFilesInBlock <= 0):
146     continue
147     fileCount = 0
148     if noBboundary == 0: # DD
149     # ---- New block => New job ---- #
150     parString = ""
151 spiga 1.16 pString=""
152 spiga 1.1 # counter for number of events in files currently worked on
153     filesEventCount = 0
154     # flag if next while loop should touch new file
155     newFile = 1
156     # job event counter
157     jobSkipEventCount = 0
158    
159     # ---- Iterate over the files in the block until we've met the requested ---- #
160     # ---- total # of events or we've gone over all the files in this block ---- #
161 spiga 1.15 msg='\n'
162 spiga 1.1 while ( (eventsRemaining > 0) and (fileCount < numFilesInBlock) and (jobCount < totalNumberOfJobs) ):
163     file = files[fileCount]
164     if self.useParent==1:
165     parent = self.parentFiles[file]
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.16 if self.useParent==1:
176     for f in parent :
177     pString += f + ','
178 spiga 1.1 newFile = 0
179     except KeyError:
180 spiga 1.13 common.logger.info("File "+str(file)+" has unknown number of events: skipping")
181 spiga 1.1
182     eventsPerJobRequested = min(eventsPerJobRequested, eventsRemaining)
183     # if less events in file remain than eventsPerJobRequested
184     if ( filesEventCount - jobSkipEventCount < eventsPerJobRequested):
185     if noBboundary == 1: ## DD
186     newFile = 1
187     fileCount += 1
188     else:
189     # if last file in block
190     if ( fileCount == numFilesInBlock-1 ) :
191     # end job using last file, use remaining events in block
192     # close job and touch new file
193 spiga 1.11 fullString = parString[:-1]
194 spiga 1.1 if self.useParent==1:
195 spiga 1.11 fullParentString = pString[:-1]
196 spiga 1.1 list_of_lists.append([fullString,fullParentString,str(-1),str(jobSkipEventCount)])
197     else:
198     list_of_lists.append([fullString,str(-1),str(jobSkipEventCount)])
199 spiga 1.15 msg += "Job %s can run over %s events (last file in block).\n"%(str(jobCount+1), str(filesEventCount - jobSkipEventCount))
200 spiga 1.3 jobDestination.append(blockSites[block])
201 slacapra 1.20 msg += "Job %s Destination: %s\n"%(str(jobCount+1),str(SE2CMS(jobDestination[jobCount])))
202 spiga 1.1 # fill jobs of block dictionary
203     jobsOfBlock[block].append(jobCount+1)
204     # reset counter
205     jobCount = jobCount + 1
206     totalEventCount = totalEventCount + filesEventCount - jobSkipEventCount
207     eventsRemaining = eventsRemaining - filesEventCount + jobSkipEventCount
208     jobSkipEventCount = 0
209     # reset file
210     pString = ""
211     parString = ""
212     filesEventCount = 0
213     newFile = 1
214     fileCount += 1
215     else :
216     # go to next file
217     newFile = 1
218     fileCount += 1
219     # if events in file equal to eventsPerJobRequested
220     elif ( filesEventCount - jobSkipEventCount == eventsPerJobRequested ) :
221     # close job and touch new file
222 spiga 1.11 fullString = parString[:-1]
223 spiga 1.1 if self.useParent==1:
224 spiga 1.11 fullParentString = pString[:-1]
225 spiga 1.1 list_of_lists.append([fullString,fullParentString,str(eventsPerJobRequested),str(jobSkipEventCount)])
226     else:
227     list_of_lists.append([fullString,str(eventsPerJobRequested),str(jobSkipEventCount)])
228 spiga 1.15 msg += "Job %s can run over %s events.\n"%(str(jobCount+1),str(eventsPerJobRequested))
229 spiga 1.3 jobDestination.append(blockSites[block])
230 slacapra 1.20 msg+= "Job %s Destination: %s\n"%(str(jobCount+1),str(SE2CMS(jobDestination[jobCount])))
231 spiga 1.1 jobsOfBlock[block].append(jobCount+1)
232     # reset counter
233     jobCount = jobCount + 1
234     totalEventCount = totalEventCount + eventsPerJobRequested
235     eventsRemaining = eventsRemaining - eventsPerJobRequested
236     jobSkipEventCount = 0
237     # reset file
238     pString = ""
239     parString = ""
240     filesEventCount = 0
241     newFile = 1
242     fileCount += 1
243    
244     # if more events in file remain than eventsPerJobRequested
245     else :
246     # close job but don't touch new file
247 spiga 1.11 fullString = parString[:-1]
248 spiga 1.1 if self.useParent==1:
249 spiga 1.11 fullParentString = pString[:-1]
250 spiga 1.1 list_of_lists.append([fullString,fullParentString,str(eventsPerJobRequested),str(jobSkipEventCount)])
251     else:
252     list_of_lists.append([fullString,str(eventsPerJobRequested),str(jobSkipEventCount)])
253 spiga 1.15 msg += "Job %s can run over %s events.\n"%(str(jobCount+1),str(eventsPerJobRequested))
254 spiga 1.3 jobDestination.append(blockSites[block])
255 slacapra 1.20 msg+= "Job %s Destination: %s\n"%(str(jobCount+1),str(SE2CMS(jobDestination[jobCount])))
256 spiga 1.1 jobsOfBlock[block].append(jobCount+1)
257     # increase counter
258     jobCount = jobCount + 1
259     totalEventCount = totalEventCount + eventsPerJobRequested
260     eventsRemaining = eventsRemaining - eventsPerJobRequested
261     # calculate skip events for last file
262     # use filesEventCount (contains several files), jobSkipEventCount and eventsPerJobRequest
263     jobSkipEventCount = eventsPerJobRequested - (filesEventCount - jobSkipEventCount - self.eventsbyfile[file])
264     # remove all but the last file
265     filesEventCount = self.eventsbyfile[file]
266 spiga 1.16 pString_tmp=''
267 spiga 1.1 if self.useParent==1:
268 spiga 1.16 for f in parent : pString_tmp += f + ','
269     pString = pString_tmp
270 spiga 1.11 parString = file + ','
271 spiga 1.1 pass # END if
272     pass # END while (iterate over files in the block)
273     pass # END while (iterate over blocks in the dataset)
274 spiga 1.15 common.logger.debug(msg)
275 spiga 1.1 self.ncjobs = self.total_number_of_jobs = jobCount
276     if (eventsRemaining > 0 and jobCount < totalNumberOfJobs ):
277 spiga 1.13 common.logger.info("Could not run on all requested events because some blocks not hosted at allowed sites.")
278     common.logger.info(str(jobCount)+" job(s) can run on "+str(totalEventCount)+" events.\n")
279 spiga 1.1
280     # skip check on block with no sites DD
281 spiga 1.5 if noBboundary == 0 : self.checkBlockNoSite(blocks,jobsOfBlock,blockSites)
282 spiga 1.1
283     # prepare dict output
284     dictOut = {}
285 spiga 1.11 dictOut['params']= ['InputFiles','MaxEvents','SkipEvents']
286     if self.useParent: dictOut['params']= ['InputFiles','ParentFiles','MaxEvents','SkipEvents']
287 spiga 1.1 dictOut['args'] = list_of_lists
288 spiga 1.3 dictOut['jobDestination'] = jobDestination
289 spiga 1.1 dictOut['njobs']=self.total_number_of_jobs
290    
291     return dictOut
292    
293     # keep trace of block with no sites to print a warning at the end
294    
295 spiga 1.5 def checkBlockNoSite(self,blocks,jobsOfBlock,blockSites):
296 spiga 1.1 # screen output
297     screenOutput = "List of jobs and available destination sites:\n\n"
298     noSiteBlock = []
299     bloskNoSite = []
300 spiga 1.10 allBlock = []
301 spiga 1.1
302     blockCounter = 0
303     for block in blocks:
304     if block in jobsOfBlock.keys() :
305     blockCounter += 1
306 spiga 1.10 allBlock.append( blockCounter )
307 slacapra 1.19 sites=self.blackWhiteListParser.checkWhiteList(self.blackWhiteListParser.checkBlackList(blockSites[block],[block]),[block])
308 spiga 1.1 screenOutput += "Block %5i: jobs %20s: sites: %s\n" % (blockCounter,spanRanges(jobsOfBlock[block]),
309 slacapra 1.20 ', '.join(SE2CMS(sites)))
310 slacapra 1.19 if len(sites) == 0:
311 spiga 1.1 noSiteBlock.append( spanRanges(jobsOfBlock[block]) )
312     bloskNoSite.append( blockCounter )
313    
314 spiga 1.13 common.logger.info(screenOutput)
315 spiga 1.1 if len(noSiteBlock) > 0 and len(bloskNoSite) > 0:
316     msg = 'WARNING: No sites are hosting any part of data for block:\n '
317     virgola = ""
318     if len(bloskNoSite) > 1:
319     virgola = ","
320     for block in bloskNoSite:
321     msg += ' ' + str(block) + virgola
322     msg += '\n Related jobs:\n '
323     virgola = ""
324     if len(noSiteBlock) > 1:
325     virgola = ","
326     for range_jobs in noSiteBlock:
327     msg += str(range_jobs) + virgola
328     msg += '\n will not be submitted and this block of data can not be analyzed!\n'
329 spiga 1.14 if self.cfg_params.has_key('GRID.se_white_list'):
330     msg += 'WARNING: SE White List: '+self.cfg_params['GRID.se_white_list']+'\n'
331 spiga 1.1 msg += '(Hint: By whitelisting you force the job to run at this particular site(s).\n'
332     msg += 'Please check if the dataset is available at this site!)\n'
333 spiga 1.14 if self.cfg_params.has_key('GRID.ce_white_list'):
334     msg += 'WARNING: CE White List: '+self.cfg_params['GRID.ce_white_list']+'\n'
335 spiga 1.1 msg += '(Hint: By whitelisting you force the job to run at this particular site(s).\n'
336     msg += 'Please check if the dataset is available at this site!)\n'
337    
338 spiga 1.13 common.logger.info(msg)
339 spiga 1.1
340 spiga 1.10 if bloskNoSite == allBlock:
341     raise CrabException('No jobs created')
342    
343 spiga 1.1 return
344    
345    
346     ########################################################################
347     def jobSplittingByRun(self):
348     """
349     """
350     from sets import Set
351     from WMCore.JobSplitting.RunBased import RunBased
352     from WMCore.DataStructs.Workflow import Workflow
353     from WMCore.DataStructs.File import File
354     from WMCore.DataStructs.Fileset import Fileset
355     from WMCore.DataStructs.Subscription import Subscription
356     from WMCore.JobSplitting.SplitterFactory import SplitterFactory
357     from WMCore.DataStructs.Run import Run
358    
359     self.checkUserSettings()
360 spiga 1.4 blockSites = self.args['blockSites']
361     pubdata = self.args['pubdata']
362 spiga 1.1
363     if self.selectNumberOfJobs == 0 :
364     self.theNumberOfJobs = 9999999
365     blocks = {}
366     runList = []
367     thefiles = Fileset(name='FilesToSplit')
368 spiga 1.3 fileList = pubdata.getListFiles()
369 spiga 1.1 for f in fileList:
370     block = f['Block']['Name']
371     try:
372 spiga 1.3 f['Block']['StorageElementList'].extend(blockSites[block])
373 spiga 1.1 except:
374     continue
375     wmbsFile = File(f['LogicalFileName'])
376 spiga 1.3 [ wmbsFile['locations'].add(x) for x in blockSites[block] ]
377 spiga 1.1 wmbsFile['block'] = block
378     runNum = f['RunsList'][0]['RunNumber']
379     runList.append(runNum)
380     myRun = Run(runNumber=runNum)
381     wmbsFile.addRun( myRun )
382     thefiles.addFile(
383     wmbsFile
384     )
385    
386     work = Workflow()
387     subs = Subscription(
388     fileset = thefiles,
389     workflow = work,
390     split_algo = 'RunBased',
391     type = "Processing")
392     splitter = SplitterFactory()
393     jobfactory = splitter(subs)
394    
395     #loop over all runs
396     set = Set(runList)
397     list_of_lists = []
398     jobDestination = []
399     count = 0
400 spiga 1.17 for jobGroup in jobfactory():
401 spiga 1.1 if count < self.theNumberOfJobs:
402 spiga 1.17 res = self.getJobInfo(jobGroup)
403 spiga 1.1 parString = ''
404     for file in res['lfns']:
405 spiga 1.11 parString += file + ','
406     fullString = parString[:-1]
407 spiga 1.1 list_of_lists.append([fullString,str(-1),str(0)])
408 spiga 1.2 #need to check single file location
409 spiga 1.1 jobDestination.append(res['locations'])
410     count +=1
411     # prepare dict output
412     dictOut = {}
413 spiga 1.11 dictOut['params']= ['InputFiles','MaxEvents','SkipEvents']
414 spiga 1.1 dictOut['args'] = list_of_lists
415     dictOut['jobDestination'] = jobDestination
416     dictOut['njobs']=count
417    
418     return dictOut
419    
420     def getJobInfo( self,jobGroup ):
421     res = {}
422     lfns = []
423     locations = []
424     tmp_check=0
425     for job in jobGroup.jobs:
426     for file in job.getFiles():
427     lfns.append(file['lfn'])
428     for loc in file['locations']:
429     if tmp_check < 1 :
430     locations.append(loc)
431 spiga 1.8 tmp_check = tmp_check + 1
432 spiga 1.1 ### qui va messo il check per la locations
433     res['lfns'] = lfns
434     res['locations'] = locations
435     return res
436    
437     ########################################################################
438     def jobSplittingNoInput(self):
439     """
440     Perform job splitting based on number of event per job
441     """
442 spiga 1.13 common.logger.debug('Splitting per events')
443 spiga 1.3 self.checkUserSettings()
444     jobDestination=[]
445 spiga 1.6 if ( (self.selectTotalNumberEvents + self.selectEventsPerJob + self.selectNumberOfJobs) != 2 ):
446     msg = 'Must define exactly two of total_number_of_events, events_per_job, or number_of_jobs.'
447 spiga 1.3 raise CrabException(msg)
448    
449     managedGenerators =self.args['managedGenerators']
450     generator = self.args['generator']
451     firstRun = self.cfg_params.get('CMSSW.first_run',None)
452 spiga 1.1
453     if (self.selectEventsPerJob):
454 spiga 1.13 common.logger.info('Required '+str(self.eventsPerJob)+' events per job ')
455 spiga 1.1 if (self.selectNumberOfJobs):
456 spiga 1.13 common.logger.info('Required '+str(self.theNumberOfJobs)+' jobs in total ')
457 spiga 1.1 if (self.selectTotalNumberEvents):
458 spiga 1.13 common.logger.info('Required '+str(self.total_number_of_events)+' events in total ')
459 spiga 1.1
460     if (self.total_number_of_events < 0):
461     msg='Cannot split jobs per Events with "-1" as total number of events'
462     raise CrabException(msg)
463    
464     if (self.selectEventsPerJob):
465     if (self.selectTotalNumberEvents):
466     self.total_number_of_jobs = int(self.total_number_of_events/self.eventsPerJob)
467     elif(self.selectNumberOfJobs) :
468     self.total_number_of_jobs =self.theNumberOfJobs
469     self.total_number_of_events =int(self.theNumberOfJobs*self.eventsPerJob)
470    
471     elif (self.selectNumberOfJobs) :
472     self.total_number_of_jobs = self.theNumberOfJobs
473     self.eventsPerJob = int(self.total_number_of_events/self.total_number_of_jobs)
474    
475 spiga 1.13 common.logger.debug('N jobs '+str(self.total_number_of_jobs))
476 spiga 1.1
477     # is there any remainder?
478     check = int(self.total_number_of_events) - (int(self.total_number_of_jobs)*self.eventsPerJob)
479    
480 spiga 1.13 common.logger.debug('Check '+str(check))
481 spiga 1.1
482 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')
483 spiga 1.1 if check > 0:
484 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))
485 spiga 1.1
486     # argument is seed number.$i
487     self.list_of_args = []
488     for i in range(self.total_number_of_jobs):
489     ## Since there is no input, any site is good
490 spiga 1.3 jobDestination.append([""]) #must be empty to write correctly the xml
491 spiga 1.1 args=[]
492 spiga 1.3 if (firstRun):
493 spiga 1.1 ## pythia first run
494 spiga 1.3 args.append(str(firstRun)+str(i))
495     if (generator in managedGenerators):
496     if (generator == 'comphep' and i == 0):
497 spiga 1.1 # COMPHEP is brain-dead and wants event #'s like 1,100,200,300
498     args.append('1')
499     else:
500     args.append(str(i*self.eventsPerJob))
501 spiga 1.7 args.append(str(self.eventsPerJob))
502 spiga 1.1 self.list_of_args.append(args)
503     # prepare dict output
504 spiga 1.11
505 spiga 1.1 dictOut = {}
506 spiga 1.11 dictOut['params'] = ['MaxEvents']
507     if (firstRun):
508     dictOut['params'] = ['FirstRun','MaxEvents']
509 spiga 1.12 if ( generator in managedGenerators ) : dictOut['params'] = ['FirstRun', 'FirstEvent', 'MaxEvents']
510 spiga 1.11 else:
511 spiga 1.12 if (generator in managedGenerators) : dictOut['params'] = ['FirstEvent', 'MaxEvents']
512 spiga 1.1 dictOut['args'] = self.list_of_args
513 spiga 1.3 dictOut['jobDestination'] = jobDestination
514 spiga 1.1 dictOut['njobs']=self.total_number_of_jobs
515    
516     return dictOut
517    
518    
519     def jobSplittingForScript(self):
520     """
521     Perform job splitting based on number of job
522     """
523     self.checkUserSettings()
524 spiga 1.3 if (self.selectNumberOfJobs == 0):
525 spiga 1.1 msg = 'must specify number_of_jobs.'
526     raise crabexception(msg)
527 spiga 1.3 jobDestination = []
528 spiga 1.13 common.logger.debug('Splitting per job')
529     common.logger.info('Required '+str(self.theNumberOfJobs)+' jobs in total ')
530 spiga 1.1
531     self.total_number_of_jobs = self.theNumberOfJobs
532    
533 spiga 1.13 common.logger.debug('N jobs '+str(self.total_number_of_jobs))
534 spiga 1.1
535 spiga 1.13 common.logger.info(str(self.total_number_of_jobs)+' jobs can be created')
536 spiga 1.1
537     # argument is seed number.$i
538 spiga 1.11 #self.list_of_args = []
539 spiga 1.1 for i in range(self.total_number_of_jobs):
540 spiga 1.3 jobDestination.append([""])
541 spiga 1.11 # self.list_of_args.append([str(i)])
542 spiga 1.1
543     # prepare dict output
544     dictOut = {}
545 spiga 1.11 dictOut['args'] = [] # self.list_of_args
546 spiga 1.3 dictOut['jobDestination'] = jobDestination
547 spiga 1.1 dictOut['njobs']=self.total_number_of_jobs
548     return dictOut
549    
550    
551     def jobSplittingByLumi(self):
552     """
553     """
554     return
555     def Algos(self):
556     """
557     Define key splittingType matrix
558     """
559     SplitAlogs = {
560     'EventBased' : self.jobSplittingByEvent,
561     'RunBased' : self.jobSplittingByRun,
562     'LumiBased' : self.jobSplittingByLumi,
563     'NoInput' : self.jobSplittingNoInput,
564     'ForScript' : self.jobSplittingForScript
565     }
566     return SplitAlogs
567