ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/CRAB/python/Splitter.py
Revision: 1.19
Committed: Wed Jun 10 11:31:33 2009 UTC (15 years, 10 months ago) by slacapra
Content type: text/x-python
Branch: MAIN
Changes since 1.18: +10 -5 lines
Log Message:
print CMS names for destination SE rather than plain grid names

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