ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/CRAB/python/Splitter.py
Revision: 1.22
Committed: Wed Jun 17 20:58:07 2009 UTC (15 years, 10 months ago) by ewv
Content type: text/x-python
Branch: MAIN
CVS Tags: CRAB_2_6_0_pre11
Changes since 1.21: +45 -42 lines
Log Message:
Restore generators other than pythia, add lhe

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 ewv 1.22 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 ewv 1.22
66     blockSites = self.args['blockSites']
67 spiga 1.4 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 ewv 1.22 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 ewv 1.22 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 ewv 1.22
280 spiga 1.1 # 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 ewv 1.22 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 ewv 1.22 raise CrabException('No jobs created')
342 spiga 1.10
343 spiga 1.1 return
344    
345    
346     ########################################################################
347 ewv 1.22 def jobSplittingByRun(self):
348 spiga 1.1 """
349     """
350 ewv 1.22 from sets import Set
351 spiga 1.1 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 ewv 1.22 from WMCore.DataStructs.Run import Run
358 spiga 1.1
359     self.checkUserSettings()
360 ewv 1.22 blockSites = self.args['blockSites']
361 spiga 1.4 pubdata = self.args['pubdata']
362 spiga 1.1
363     if self.selectNumberOfJobs == 0 :
364     self.theNumberOfJobs = 9999999
365     blocks = {}
366 ewv 1.22 runList = []
367 spiga 1.1 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 ewv 1.22 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 ewv 1.22 runList.append(runNum)
380 spiga 1.1 myRun = Run(runNumber=runNum)
381     wmbsFile.addRun( myRun )
382     thefiles.addFile(
383     wmbsFile
384     )
385 ewv 1.22
386 spiga 1.1 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 ewv 1.22
395     #loop over all runs
396 spiga 1.1 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 ewv 1.22 parString = ''
404 spiga 1.1 for file in res['lfns']:
405 spiga 1.11 parString += file + ','
406     fullString = parString[:-1]
407 ewv 1.22 list_of_lists.append([fullString,str(-1),str(0)])
408 spiga 1.2 #need to check single file location
409 ewv 1.22 jobDestination.append(res['locations'])
410 spiga 1.1 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 ewv 1.22 lfns = []
423     locations = []
424 spiga 1.1 tmp_check=0
425     for job in jobGroup.jobs:
426     for file in job.getFiles():
427 ewv 1.22 lfns.append(file['lfn'])
428 spiga 1.1 for loc in file['locations']:
429     if tmp_check < 1 :
430     locations.append(loc)
431 ewv 1.22 tmp_check = tmp_check + 1
432     ### qui va messo il check per la locations
433     res['lfns'] = lfns
434     res['locations'] = locations
435     return res
436    
437 spiga 1.1 ########################################################################
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 ewv 1.22 args.append(generator)
497     if (generator == 'comphep' and i == 0):
498 spiga 1.1 # COMPHEP is brain-dead and wants event #'s like 1,100,200,300
499     args.append('1')
500 ewv 1.22 else:
501 spiga 1.1 args.append(str(i*self.eventsPerJob))
502 spiga 1.7 args.append(str(self.eventsPerJob))
503 spiga 1.1 self.list_of_args.append(args)
504     # prepare dict output
505 spiga 1.11
506 spiga 1.1 dictOut = {}
507 spiga 1.11 dictOut['params'] = ['MaxEvents']
508     if (firstRun):
509     dictOut['params'] = ['FirstRun','MaxEvents']
510 ewv 1.22 if ( generator in managedGenerators ) :
511     dictOut['params'] = ['FirstRun', 'Generator', 'FirstEvent', 'MaxEvents']
512     else:
513     if (generator in managedGenerators) :
514     dictOut['params'] = ['Generator', '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 ewv 1.22
554     def jobSplittingByLumi(self):
555 spiga 1.1 """
556     """
557     return
558     def Algos(self):
559     """
560     Define key splittingType matrix
561     """
562 ewv 1.22 SplitAlogs = {
563     'EventBased' : self.jobSplittingByEvent,
564 spiga 1.1 'RunBased' : self.jobSplittingByRun,
565 ewv 1.22 'LumiBased' : self.jobSplittingByLumi,
566     'NoInput' : self.jobSplittingNoInput,
567 spiga 1.1 'ForScript' : self.jobSplittingForScript
568 ewv 1.22 }
569 spiga 1.1 return SplitAlogs
570