CMS 3D CMS Logo

ConfigBuilder.py
Go to the documentation of this file.
1 #! /usr/bin/env python
2 
3 from __future__ import print_function
4 __version__ = "$Revision: 1.19 $"
5 __source__ = "$Source: /local/reps/CMSSW/CMSSW/Configuration/Applications/python/ConfigBuilder.py,v $"
6 
7 import FWCore.ParameterSet.Config as cms
8 from FWCore.ParameterSet.Modules import _Module
9 import six
10 # The following import is provided for backward compatibility reasons.
11 # The function used to be defined in this file.
12 from FWCore.ParameterSet.MassReplace import massReplaceInputTag as MassReplaceInputTag
13 
14 import hashlib
15 import sys
16 import re
17 import collections
18 from subprocess import Popen,PIPE
19 import FWCore.ParameterSet.DictTypes as DictTypes
20 class Options:
21  pass
22 
23 # the canonical defaults
24 defaultOptions = Options()
25 defaultOptions.datamix = 'DataOnSim'
26 defaultOptions.isMC=False
27 defaultOptions.isData=True
28 defaultOptions.step=''
29 defaultOptions.pileup='NoPileUp'
30 defaultOptions.pileup_input = None
31 defaultOptions.pileup_dasoption = ''
32 defaultOptions.geometry = 'SimDB'
33 defaultOptions.geometryExtendedOptions = ['ExtendedGFlash','Extended','NoCastor']
34 defaultOptions.magField = ''
35 defaultOptions.conditions = None
36 defaultOptions.scenarioOptions=['pp','cosmics','nocoll','HeavyIons']
37 defaultOptions.harvesting= 'AtRunEnd'
38 defaultOptions.gflash = False
39 defaultOptions.number = -1
40 defaultOptions.number_out = None
41 defaultOptions.arguments = ""
42 defaultOptions.name = "NO NAME GIVEN"
43 defaultOptions.evt_type = ""
44 defaultOptions.filein = ""
45 defaultOptions.dasquery=""
46 defaultOptions.dasoption=""
47 defaultOptions.secondfilein = ""
48 defaultOptions.customisation_file = []
49 defaultOptions.customisation_file_unsch = []
50 defaultOptions.customise_commands = ""
51 defaultOptions.inline_custom=False
52 defaultOptions.particleTable = 'pythiapdt'
53 defaultOptions.particleTableList = ['pythiapdt','pdt']
54 defaultOptions.dirin = ''
55 defaultOptions.dirout = ''
56 defaultOptions.filetype = 'EDM'
57 defaultOptions.fileout = 'output.root'
58 defaultOptions.filtername = ''
59 defaultOptions.lazy_download = False
60 defaultOptions.custom_conditions = ''
61 defaultOptions.hltProcess = ''
62 defaultOptions.eventcontent = None
63 defaultOptions.datatier = None
64 defaultOptions.inlineEventContent = True
65 defaultOptions.inlineObjets =''
66 defaultOptions.hideGen=False
67 from Configuration.StandardSequences.VtxSmeared import VtxSmearedDefaultKey,VtxSmearedHIDefaultKey
68 defaultOptions.beamspot=None
69 defaultOptions.outputDefinition =''
70 defaultOptions.inputCommands = None
71 defaultOptions.outputCommands = None
72 defaultOptions.inputEventContent = ''
73 defaultOptions.dropDescendant = False
74 defaultOptions.relval = None
75 defaultOptions.profile = None
76 defaultOptions.isRepacked = False
77 defaultOptions.restoreRNDSeeds = False
78 defaultOptions.donotDropOnInput = ''
79 defaultOptions.python_filename =''
80 defaultOptions.io=None
81 defaultOptions.lumiToProcess=None
82 defaultOptions.fast=False
83 defaultOptions.runsAndWeightsForMC = None
84 defaultOptions.runsScenarioForMC = None
85 defaultOptions.runUnscheduled = False
86 defaultOptions.timeoutOutput = False
87 defaultOptions.nThreads = '1'
88 defaultOptions.nStreams = '0'
89 defaultOptions.nConcurrentLumis = '1'
90 
91 # some helper routines
92 def dumpPython(process,name):
93  theObject = getattr(process,name)
94  if isinstance(theObject,cms.Path) or isinstance(theObject,cms.EndPath) or isinstance(theObject,cms.Sequence):
95  return "process."+name+" = " + theObject.dumpPython()
96  elif isinstance(theObject,_Module) or isinstance(theObject,cms.ESProducer):
97  return "process."+name+" = " + theObject.dumpPython()+"\n"
98  else:
99  return "process."+name+" = " + theObject.dumpPython()+"\n"
100 def filesFromList(fileName,s=None):
101  import os
102  import FWCore.ParameterSet.Config as cms
103  prim=[]
104  sec=[]
105  for line in open(fileName,'r'):
106  if line.count(".root")>=2:
107  #two files solution...
108  entries=line.replace("\n","").split()
109  prim.append(entries[0])
110  sec.append(entries[1])
111  elif (line.find(".root")!=-1):
112  entry=line.replace("\n","")
113  prim.append(entry)
114  # remove any duplicates
115  prim = sorted(list(set(prim)))
116  sec = sorted(list(set(sec)))
117  if s:
118  if not hasattr(s,"fileNames"):
119  s.fileNames=cms.untracked.vstring(prim)
120  else:
121  s.fileNames.extend(prim)
122  if len(sec)!=0:
123  if not hasattr(s,"secondaryFileNames"):
124  s.secondaryFileNames=cms.untracked.vstring(sec)
125  else:
126  s.secondaryFileNames.extend(sec)
127  print("found files: ",prim)
128  if len(prim)==0:
129  raise Exception("There are not files in input from the file list")
130  if len(sec)!=0:
131  print("found parent files:",sec)
132  return (prim,sec)
133 
134 def filesFromDASQuery(query,option="",s=None):
135  import os,time
136  import FWCore.ParameterSet.Config as cms
137  prim=[]
138  sec=[]
139  print("the query is",query)
140  eC=5
141  count=0
142  while eC!=0 and count<3:
143  if count!=0:
144  print('Sleeping, then retrying DAS')
145  time.sleep(100)
146  p = Popen('dasgoclient %s --query "%s"'%(option,query), stdout=PIPE,shell=True, universal_newlines=True)
147  pipe=p.stdout.read()
148  tupleP = os.waitpid(p.pid, 0)
149  eC=tupleP[1]
150  count=count+1
151  if eC==0:
152  print("DAS succeeded after",count,"attempts",eC)
153  else:
154  print("DAS failed 3 times- I give up")
155  for line in pipe.split('\n'):
156  if line.count(".root")>=2:
157  #two files solution...
158  entries=line.replace("\n","").split()
159  prim.append(entries[0])
160  sec.append(entries[1])
161  elif (line.find(".root")!=-1):
162  entry=line.replace("\n","")
163  prim.append(entry)
164  # remove any duplicates
165  prim = sorted(list(set(prim)))
166  sec = sorted(list(set(sec)))
167  if s:
168  if not hasattr(s,"fileNames"):
169  s.fileNames=cms.untracked.vstring(prim)
170  else:
171  s.fileNames.extend(prim)
172  if len(sec)!=0:
173  if not hasattr(s,"secondaryFileNames"):
174  s.secondaryFileNames=cms.untracked.vstring(sec)
175  else:
176  s.secondaryFileNames.extend(sec)
177  print("found files: ",prim)
178  if len(sec)!=0:
179  print("found parent files:",sec)
180  return (prim,sec)
181 
182 def anyOf(listOfKeys,dict,opt=None):
183  for k in listOfKeys:
184  if k in dict:
185  toReturn=dict[k]
186  dict.pop(k)
187  return toReturn
188  if opt!=None:
189  return opt
190  else:
191  raise Exception("any of "+','.join(listOfKeys)+" are mandatory entries of --output options")
192 
194  """The main building routines """
195 
196  def __init__(self, options, process = None, with_output = False, with_input = False ):
197  """options taken from old cmsDriver and optparse """
198 
199  options.outfile_name = options.dirout+options.fileout
200 
201  self._options = options
202 
203  if self._options.isData and options.isMC:
204  raise Exception("ERROR: You may specify only --data or --mc, not both")
205  #if not self._options.conditions:
206  # raise Exception("ERROR: No conditions given!\nPlease specify conditions. E.g. via --conditions=IDEAL_30X::All")
207 
208  # check that MEtoEDMConverter (running in ENDJOB) and DQMIO don't run in the same job
209  if 'ENDJOB' in self._options.step:
210  if (hasattr(self._options,"outputDefinition") and \
211  self._options.outputDefinition != '' and \
212  any(anyOf(['t','tier','dataTier'],outdic) == 'DQMIO' for outdic in eval(self._options.outputDefinition))) or \
213  (hasattr(self._options,"datatier") and \
214  self._options.datatier and \
215  'DQMIO' in self._options.datatier):
216  print("removing ENDJOB from steps since not compatible with DQMIO dataTier")
217  self._options.step=self._options.step.replace(',ENDJOB','')
218 
219 
220 
221  # what steps are provided by this class?
222  stepList = [re.sub(r'^prepare_', '', methodName) for methodName in ConfigBuilder.__dict__ if methodName.startswith('prepare_')]
223  self.stepMap={}
224  self.stepKeys=[]
225  for step in self._options.step.split(","):
226  if step=='': continue
227  stepParts = step.split(":")
228  stepName = stepParts[0]
229  if stepName not in stepList and not stepName.startswith('re'):
230  raise ValueError("Step "+stepName+" unknown")
231  if len(stepParts)==1:
232  self.stepMap[stepName]=""
233  elif len(stepParts)==2:
234  self.stepMap[stepName]=stepParts[1].split('+')
235  elif len(stepParts)==3:
236  self.stepMap[stepName]=(stepParts[2].split('+'),stepParts[1])
237  else:
238  raise ValueError("Step definition "+step+" invalid")
239  self.stepKeys.append(stepName)
240 
241  #print "map of steps is:",self.stepMap
242 
243  self.with_output = with_output
244  self.process=process
245 
246  if hasattr(self._options,"no_output_flag") and self._options.no_output_flag:
247  self.with_output = False
248  self.with_input = with_input
249  self.imports = []
250  self.create_process()
251  self.define_Configs()
252  self.schedule = list()
253 
254  # we are doing three things here:
255  # creating a process to catch errors
256  # building the code to re-create the process
257 
259  # TODO: maybe a list of to be dumped objects would help as well
260  self.blacklist_paths = []
261  self.addedObjects = []
263 
269 
270  def profileOptions(self):
271  """
272  addIgProfService
273  Function to add the igprof profile service so that you can dump in the middle
274  of the run.
275  """
276  profileOpts = self._options.profile.split(':')
277  profilerStart = 1
278  profilerInterval = 100
279  profilerFormat = None
280  profilerJobFormat = None
281 
282  if len(profileOpts):
283  #type, given as first argument is unused here
284  profileOpts.pop(0)
285  if len(profileOpts):
286  startEvent = profileOpts.pop(0)
287  if not startEvent.isdigit():
288  raise Exception("%s is not a number" % startEvent)
289  profilerStart = int(startEvent)
290  if len(profileOpts):
291  eventInterval = profileOpts.pop(0)
292  if not eventInterval.isdigit():
293  raise Exception("%s is not a number" % eventInterval)
294  profilerInterval = int(eventInterval)
295  if len(profileOpts):
296  profilerFormat = profileOpts.pop(0)
297 
298 
299  if not profilerFormat:
300  profilerFormat = "%s___%s___%%I.gz" % (
301  self._options.evt_type.replace("_cfi", ""),
302  hashlib.md5(
303  str(self._options.step) + str(self._options.pileup) + str(self._options.conditions) +
304  str(self._options.datatier) + str(self._options.profileTypeLabel)
305  ).hexdigest()
306  )
307  if not profilerJobFormat and profilerFormat.endswith(".gz"):
308  profilerJobFormat = profilerFormat.replace(".gz", "_EndOfJob.gz")
309  elif not profilerJobFormat:
310  profilerJobFormat = profilerFormat + "_EndOfJob.gz"
311 
312  return (profilerStart,profilerInterval,profilerFormat,profilerJobFormat)
313 
314  def load(self,includeFile):
315  includeFile = includeFile.replace('/','.')
316  self.process.load(includeFile)
317  return sys.modules[includeFile]
318 
319  def loadAndRemember(self, includeFile):
320  """helper routine to load am memorize imports"""
321  # we could make the imports a on-the-fly data method of the process instance itself
322  # not sure if the latter is a good idea
323  includeFile = includeFile.replace('/','.')
324  self.imports.append(includeFile)
325  self.process.load(includeFile)
326  return sys.modules[includeFile]
327 
328  def executeAndRemember(self, command):
329  """helper routine to remember replace statements"""
330  self.additionalCommands.append(command)
331  if not command.strip().startswith("#"):
332  # substitute: process.foo = process.bar -> self.process.foo = self.process.bar
333  import re
334  exec(re.sub(r"([^a-zA-Z_0-9]|^)(process)([^a-zA-Z_0-9])",r"\1self.process\3",command))
335  #exec(command.replace("process.","self.process."))
336 
337  def addCommon(self):
338  if 'HARVESTING' in self.stepMap.keys() or 'ALCAHARVEST' in self.stepMap.keys():
339  self.process.options = cms.untracked.PSet( Rethrow = cms.untracked.vstring('ProductNotFound'),fileMode = cms.untracked.string('FULLMERGE'))
340  else:
341  self.process.options = cms.untracked.PSet( )
342 
343  self.addedObjects.append(("","options"))
344 
345  if self._options.lazy_download:
346  self.process.AdaptorConfig = cms.Service("AdaptorConfig",
347  stats = cms.untracked.bool(True),
348  enable = cms.untracked.bool(True),
349  cacheHint = cms.untracked.string("lazy-download"),
350  readHint = cms.untracked.string("read-ahead-buffered")
351  )
352  self.addedObjects.append(("Setup lazy download","AdaptorConfig"))
353 
354  #self.process.cmsDriverCommand = cms.untracked.PSet( command=cms.untracked.string('cmsDriver.py '+self._options.arguments) )
355  #self.addedObjects.append(("what cmsDriver command was used","cmsDriverCommand"))
356 
357  if self._options.profile:
358  (start, interval, eventFormat, jobFormat)=self.profileOptions()
359  self.process.IgProfService = cms.Service("IgProfService",
360  reportFirstEvent = cms.untracked.int32(start),
361  reportEventInterval = cms.untracked.int32(interval),
362  reportToFileAtPostEvent = cms.untracked.string("| gzip -c > %s"%(eventFormat)),
363  reportToFileAtPostEndJob = cms.untracked.string("| gzip -c > %s"%(jobFormat)))
364  self.addedObjects.append(("Setup IGProf Service for profiling","IgProfService"))
365 
366  def addMaxEvents(self):
367  """Here we decide how many evts will be processed"""
368  self.process.maxEvents=cms.untracked.PSet(input=cms.untracked.int32(int(self._options.number)))
369  if self._options.number_out:
370  self.process.maxEvents.output = cms.untracked.int32(int(self._options.number_out))
371  self.addedObjects.append(("","maxEvents"))
372 
373  def addSource(self):
374  """Here the source is built. Priority: file, generator"""
375  self.addedObjects.append(("Input source","source"))
376 
377  def filesFromOption(self):
378  for entry in self._options.filein.split(','):
379  print("entry",entry)
380  if entry.startswith("filelist:"):
381  filesFromList(entry[9:],self.process.source)
382  elif entry.startswith("dbs:") or entry.startswith("das:"):
383  filesFromDASQuery('file dataset = %s'%(entry[4:]),self._options.dasoption,self.process.source)
384  else:
385  self.process.source.fileNames.append(self._options.dirin+entry)
386  if self._options.secondfilein:
387  if not hasattr(self.process.source,"secondaryFileNames"):
388  raise Exception("--secondfilein not compatible with "+self._options.filetype+"input type")
389  for entry in self._options.secondfilein.split(','):
390  print("entry",entry)
391  if entry.startswith("filelist:"):
392  self.process.source.secondaryFileNames.extend((filesFromList(entry[9:]))[0])
393  elif entry.startswith("dbs:") or entry.startswith("das:"):
394  self.process.source.secondaryFileNames.extend((filesFromDASQuery('file dataset = %s'%(entry[4:]),self._options.dasoption))[0])
395  else:
396  self.process.source.secondaryFileNames.append(self._options.dirin+entry)
397 
398  if self._options.filein or self._options.dasquery:
399  if self._options.filetype == "EDM":
400  self.process.source=cms.Source("PoolSource",
401  fileNames = cms.untracked.vstring(),
402  secondaryFileNames= cms.untracked.vstring())
403  filesFromOption(self)
404  elif self._options.filetype == "DAT":
405  self.process.source=cms.Source("NewEventStreamFileReader",fileNames = cms.untracked.vstring())
406  filesFromOption(self)
407  elif self._options.filetype == "LHE":
408  self.process.source=cms.Source("LHESource", fileNames = cms.untracked.vstring())
409  if self._options.filein.startswith("lhe:"):
410  #list the article directory automatically
411  args=self._options.filein.split(':')
412  article=args[1]
413  print('LHE input from article ',article)
414  location='/store/lhe/'
415  import os
416  textOfFiles=os.popen('cmsLHEtoEOSManager.py -l '+article)
417  for line in textOfFiles:
418  for fileName in [x for x in line.split() if '.lhe' in x]:
419  self.process.source.fileNames.append(location+article+'/'+fileName)
420  #check first if list of LHE files is loaded (not empty)
421  if len(line)<2:
422  print('Issue to load LHE files, please check and try again.')
423  sys.exit(-1)
424  #Additional check to protect empty fileNames in process.source
425  if len(self.process.source.fileNames)==0:
426  print('Issue with empty filename, but can pass line check')
427  sys.exit(-1)
428  if len(args)>2:
429  self.process.source.skipEvents = cms.untracked.uint32(int(args[2]))
430  else:
431  filesFromOption(self)
432 
433  elif self._options.filetype == "DQM":
434  self.process.source=cms.Source("DQMRootSource",
435  fileNames = cms.untracked.vstring())
436  filesFromOption(self)
437 
438  elif self._options.filetype == "DQMDAQ":
439  # FIXME: how to configure it if there are no input files specified?
440  self.process.source=cms.Source("DQMStreamerReader")
441 
442 
443  if ('HARVESTING' in self.stepMap.keys() or 'ALCAHARVEST' in self.stepMap.keys()) and (not self._options.filetype == "DQM"):
444  self.process.source.processingMode = cms.untracked.string("RunsAndLumis")
445 
446  if self._options.dasquery!='':
447  self.process.source=cms.Source("PoolSource", fileNames = cms.untracked.vstring(),secondaryFileNames = cms.untracked.vstring())
448  filesFromDASQuery(self._options.dasquery,self._options.dasoption,self.process.source)
449 
450  if ('HARVESTING' in self.stepMap.keys() or 'ALCAHARVEST' in self.stepMap.keys()) and (not self._options.filetype == "DQM"):
451  self.process.source.processingMode = cms.untracked.string("RunsAndLumis")
452 
453 
454  if 'GEN' in self.stepMap.keys() and not self._options.filetype == "LHE":
455  if self._options.inputCommands:
456  self._options.inputCommands+=',drop LHEXMLStringProduct_*_*_*,'
457  else:
458  self._options.inputCommands='keep *, drop LHEXMLStringProduct_*_*_*,'
459 
460  if self.process.source and self._options.inputCommands and not self._options.filetype == "LHE":
461  if not hasattr(self.process.source,'inputCommands'): self.process.source.inputCommands=cms.untracked.vstring()
462  for command in self._options.inputCommands.split(','):
463  # remove whitespace around the keep/drop statements
464  command = command.strip()
465  if command=='': continue
466  self.process.source.inputCommands.append(command)
467  if not self._options.dropDescendant:
468  self.process.source.dropDescendantsOfDroppedBranches = cms.untracked.bool(False)
469 
470  if self._options.lumiToProcess:
471  import FWCore.PythonUtilities.LumiList as LumiList
472  self.process.source.lumisToProcess = cms.untracked.VLuminosityBlockRange( LumiList.LumiList(self._options.lumiToProcess).getCMSSWString().split(',') )
473 
474  if 'GEN' in self.stepMap.keys() or 'LHE' in self.stepMap or (not self._options.filein and hasattr(self._options, "evt_type")):
475  if self.process.source is None:
476  self.process.source=cms.Source("EmptySource")
477 
478  # modify source in case of run-dependent MC
479  self.runsAndWeights=None
480  if self._options.runsAndWeightsForMC or self._options.runsScenarioForMC :
481  if not self._options.isMC :
482  raise Exception("options --runsAndWeightsForMC and --runsScenarioForMC are only valid for MC")
483  if self._options.runsAndWeightsForMC:
484  self.runsAndWeights = eval(self._options.runsAndWeightsForMC)
485  else:
486  from Configuration.StandardSequences.RunsAndWeights import RunsAndWeights
487  if isinstance(RunsAndWeights[self._options.runsScenarioForMC], str):
488  __import__(RunsAndWeights[self._options.runsScenarioForMC])
489  self.runsAndWeights = sys.modules[RunsAndWeights[self._options.runsScenarioForMC]].runProbabilityDistribution
490  else:
491  self.runsAndWeights = RunsAndWeights[self._options.runsScenarioForMC]
492 
493  if self.runsAndWeights:
494  import SimGeneral.Configuration.ThrowAndSetRandomRun as ThrowAndSetRandomRun
496  self.additionalCommands.append('import SimGeneral.Configuration.ThrowAndSetRandomRun as ThrowAndSetRandomRun')
497  self.additionalCommands.append('ThrowAndSetRandomRun.throwAndSetRandomRun(process.source,%s)'%(self.runsAndWeights))
498 
499  return
500 
501  def addOutput(self):
502  """ Add output module to the process """
503  result=""
504  if self._options.outputDefinition:
505  if self._options.datatier:
506  print("--datatier & --eventcontent options ignored")
507 
508  #new output convention with a list of dict
509  outList = eval(self._options.outputDefinition)
510  for (id,outDefDict) in enumerate(outList):
511  outDefDictStr=outDefDict.__str__()
512  if not isinstance(outDefDict,dict):
513  raise Exception("--output needs to be passed a list of dict"+self._options.outputDefinition+" is invalid")
514  #requires option: tier
515  theTier=anyOf(['t','tier','dataTier'],outDefDict)
516  #optional option: eventcontent, filtername, selectEvents, moduleLabel, filename
517 
518  theStreamType=anyOf(['e','ec','eventContent','streamType'],outDefDict,theTier)
519  theFilterName=anyOf(['f','ftN','filterName'],outDefDict,'')
520  theSelectEvent=anyOf(['s','sE','selectEvents'],outDefDict,'')
521  theModuleLabel=anyOf(['l','mL','moduleLabel'],outDefDict,'')
522  theExtraOutputCommands=anyOf(['o','oC','outputCommands'],outDefDict,'')
523  # module label has a particular role
524  if not theModuleLabel:
525  tryNames=[theStreamType.replace(theTier.replace('-',''),'')+theTier.replace('-','')+'output',
526  theStreamType.replace(theTier.replace('-',''),'')+theTier.replace('-','')+theFilterName+'output',
527  theStreamType.replace(theTier.replace('-',''),'')+theTier.replace('-','')+theFilterName+theSelectEvent.split(',')[0].replace(':','for').replace(' ','')+'output'
528  ]
529  for name in tryNames:
530  if not hasattr(self.process,name):
531  theModuleLabel=name
532  break
533  if not theModuleLabel:
534  raise Exception("cannot find a module label for specification: "+outDefDictStr)
535  if id==0:
536  defaultFileName=self._options.outfile_name
537  else:
538  defaultFileName=self._options.outfile_name.replace('.root','_in'+theTier+'.root')
539 
540  theFileName=self._options.dirout+anyOf(['fn','fileName'],outDefDict,defaultFileName)
541  if not theFileName.endswith('.root'):
542  theFileName+='.root'
543 
544  if len(outDefDict):
545  raise Exception("unused keys from --output options: "+','.join(outDefDict.keys()))
546  if theStreamType=='DQMIO': theStreamType='DQM'
547  if theStreamType=='ALL':
548  theEventContent = cms.PSet(outputCommands = cms.untracked.vstring('keep *'))
549  else:
550  theEventContent = getattr(self.process, theStreamType+"EventContent")
551 
552 
553  addAlCaSelects=False
554  if theStreamType=='ALCARECO' and not theFilterName:
555  theFilterName='StreamALCACombined'
556  addAlCaSelects=True
557 
558  CppType='PoolOutputModule'
559  if self._options.timeoutOutput:
560  CppType='TimeoutPoolOutputModule'
561  if theStreamType=='DQM' and theTier=='DQMIO': CppType='DQMRootOutputModule'
562  output = cms.OutputModule(CppType,
563  theEventContent.clone(),
564  fileName = cms.untracked.string(theFileName),
565  dataset = cms.untracked.PSet(
566  dataTier = cms.untracked.string(theTier),
567  filterName = cms.untracked.string(theFilterName))
568  )
569  if not theSelectEvent and hasattr(self.process,'generation_step') and theStreamType!='LHE':
570  output.SelectEvents = cms.untracked.PSet(SelectEvents = cms.vstring('generation_step'))
571  if not theSelectEvent and hasattr(self.process,'filtering_step'):
572  output.SelectEvents = cms.untracked.PSet(SelectEvents = cms.vstring('filtering_step'))
573  if theSelectEvent:
574  output.SelectEvents =cms.untracked.PSet(SelectEvents = cms.vstring(theSelectEvent))
575 
576  if addAlCaSelects:
577  if not hasattr(output,'SelectEvents'):
578  output.SelectEvents=cms.untracked.PSet(SelectEvents=cms.vstring())
579  for alca in self.AlCaPaths:
580  output.SelectEvents.SelectEvents.extend(getattr(self.process,'OutALCARECO'+alca).SelectEvents.SelectEvents)
581 
582 
583  if hasattr(self.process,theModuleLabel):
584  raise Exception("the current process already has a module "+theModuleLabel+" defined")
585  #print "creating output module ",theModuleLabel
586  setattr(self.process,theModuleLabel,output)
587  outputModule=getattr(self.process,theModuleLabel)
588  setattr(self.process,theModuleLabel+'_step',cms.EndPath(outputModule))
589  path=getattr(self.process,theModuleLabel+'_step')
590  self.schedule.append(path)
591 
592  if not self._options.inlineEventContent and hasattr(self.process,theStreamType+"EventContent"):
593  def doNotInlineEventContent(instance,label = "cms.untracked.vstring(process."+theStreamType+"EventContent.outputCommands)"): return label
594  outputModule.outputCommands.__dict__["dumpPython"] = doNotInlineEventContent
595  if theExtraOutputCommands:
596  if not isinstance(theExtraOutputCommands,list):
597  raise Exception("extra ouput command in --option must be a list of strings")
598  if hasattr(self.process,theStreamType+"EventContent"):
599  self.executeAndRemember('process.%s.outputCommands.extend(%s)'%(theModuleLabel,theExtraOutputCommands))
600  else:
601  outputModule.outputCommands.extend(theExtraOutputCommands)
602 
603  result+="\nprocess."+theModuleLabel+" = "+outputModule.dumpPython()
604 
605 
606  return result
607 
608  streamTypes=self._options.eventcontent.split(',')
609  tiers=self._options.datatier.split(',')
610  if not self._options.outputDefinition and len(streamTypes)!=len(tiers):
611  raise Exception("number of event content arguments does not match number of datatier arguments")
612 
613  # if the only step is alca we don't need to put in an output
614  if self._options.step.split(',')[0].split(':')[0] == 'ALCA':
615  return "\n"
616 
617  for i,(streamType,tier) in enumerate(zip(streamTypes,tiers)):
618  if streamType=='': continue
619  if streamType == 'ALCARECO' and not 'ALCAPRODUCER' in self._options.step: continue
620  if streamType=='DQMIO': streamType='DQM'
621  eventContent=streamType
622 
623  if streamType == "NANOEDMAOD" :
624  eventContent = "NANOAOD"
625  elif streamType == "NANOEDMAODSIM" :
626  eventContent = "NANOAODSIM"
627  theEventContent = getattr(self.process, eventContent+"EventContent")
628  if i==0:
629  theFileName=self._options.outfile_name
630  theFilterName=self._options.filtername
631  else:
632  theFileName=self._options.outfile_name.replace('.root','_in'+streamType+'.root')
633  theFilterName=self._options.filtername
634  CppType='PoolOutputModule'
635  if self._options.timeoutOutput:
636  CppType='TimeoutPoolOutputModule'
637  if streamType=='DQM' and tier=='DQMIO': CppType='DQMRootOutputModule'
638  if "NANOAOD" in streamType : CppType='NanoAODOutputModule'
639  output = cms.OutputModule(CppType,
640  theEventContent,
641  fileName = cms.untracked.string(theFileName),
642  dataset = cms.untracked.PSet(dataTier = cms.untracked.string(tier),
643  filterName = cms.untracked.string(theFilterName)
644  )
645  )
646  if hasattr(self.process,"generation_step") and streamType!='LHE':
647  output.SelectEvents = cms.untracked.PSet(SelectEvents = cms.vstring('generation_step'))
648  if hasattr(self.process,"filtering_step"):
649  output.SelectEvents = cms.untracked.PSet(SelectEvents = cms.vstring('filtering_step'))
650 
651  if streamType=='ALCARECO':
652  output.dataset.filterName = cms.untracked.string('StreamALCACombined')
653 
654  if "MINIAOD" in streamType:
655  from PhysicsTools.PatAlgos.slimming.miniAOD_tools import miniAOD_customizeOutput
657 
658  outputModuleName=streamType+'output'
659  setattr(self.process,outputModuleName,output)
660  outputModule=getattr(self.process,outputModuleName)
661  setattr(self.process,outputModuleName+'_step',cms.EndPath(outputModule))
662  path=getattr(self.process,outputModuleName+'_step')
663  self.schedule.append(path)
664 
665  if self._options.outputCommands and streamType!='DQM':
666  for evct in self._options.outputCommands.split(','):
667  if not evct: continue
668  self.executeAndRemember("process.%s.outputCommands.append('%s')"%(outputModuleName,evct.strip()))
669 
670  if not self._options.inlineEventContent:
671  tmpstreamType=streamType
672  if "NANOEDM" in tmpstreamType :
673  tmpstreamType=tmpstreamType.replace("NANOEDM","NANO")
674  def doNotInlineEventContent(instance,label = "process."+tmpstreamType+"EventContent.outputCommands"):
675  return label
676  outputModule.outputCommands.__dict__["dumpPython"] = doNotInlineEventContent
677 
678  result+="\nprocess."+outputModuleName+" = "+outputModule.dumpPython()
679 
680  return result
681 
682  def addStandardSequences(self):
683  """
684  Add selected standard sequences to the process
685  """
686  # load the pile up file
687  if self._options.pileup:
688  pileupSpec=self._options.pileup.split(',')[0]
689 
690  # Does the requested pile-up scenario exist?
691  from Configuration.StandardSequences.Mixing import Mixing,defineMixing
692  if not pileupSpec in Mixing and '.' not in pileupSpec and 'file:' not in pileupSpec:
693  message = pileupSpec+' is not a know mixing scenario:\n available are: '+'\n'.join(Mixing.keys())
694  raise Exception(message)
695 
696  # Put mixing parameters in a dictionary
697  if '.' in pileupSpec:
698  mixingDict={'file':pileupSpec}
699  elif pileupSpec.startswith('file:'):
700  mixingDict={'file':pileupSpec[5:]}
701  else:
702  import copy
703  mixingDict=copy.copy(Mixing[pileupSpec])
704  if len(self._options.pileup.split(','))>1:
705  mixingDict.update(eval(self._options.pileup[self._options.pileup.find(',')+1:]))
706 
707  # Load the pu cfg file corresponding to the requested pu scenario
708  if 'file:' in pileupSpec:
709  #the file is local
710  self.process.load(mixingDict['file'])
711  print("inlining mixing module configuration")
712  self._options.inlineObjets+=',mix'
713  else:
714  self.loadAndRemember(mixingDict['file'])
715 
716  mixingDict.pop('file')
717  if not "DATAMIX" in self.stepMap.keys(): # when DATAMIX is present, pileup_input refers to pre-mixed GEN-RAW
718  if self._options.pileup_input:
719  if self._options.pileup_input.startswith('dbs:') or self._options.pileup_input.startswith('das:'):
720  mixingDict['F']=filesFromDASQuery('file dataset = %s'%(self._options.pileup_input[4:],),self._options.pileup_dasoption)[0]
721  elif self._options.pileup_input.startswith("filelist:"):
722  mixingDict['F']=(filesFromList(self._options.pileup_input[9:]))[0]
723  else:
724  mixingDict['F']=self._options.pileup_input.split(',')
725  specialization=defineMixing(mixingDict)
726  for command in specialization:
727  self.executeAndRemember(command)
728  if len(mixingDict)!=0:
729  raise Exception('unused mixing specification: '+mixingDict.keys().__str__())
730 
731 
732  # load the geometry file
733  try:
734  if len(self.stepMap):
735  self.loadAndRemember(self.GeometryCFF)
736  if ('SIM' in self.stepMap or 'reSIM' in self.stepMap) and not self._options.fast:
738  if self.geometryDBLabel:
739  self.executeAndRemember('process.XMLFromDBSource.label = cms.string("%s")'%(self.geometryDBLabel))
740  except ImportError:
741  print("Geometry option",self._options.geometry,"unknown.")
742  raise
743 
744  if len(self.stepMap):
745  self.loadAndRemember(self.magFieldCFF)
746 
747  for stepName in self.stepKeys:
748  stepSpec = self.stepMap[stepName]
749  print("Step:", stepName,"Spec:",stepSpec)
750  if stepName.startswith('re'):
751 
752  if stepName[2:] not in self._options.donotDropOnInput:
753  self._options.inputEventContent='%s,%s'%(stepName.upper(),self._options.inputEventContent)
754  stepName=stepName[2:]
755  if stepSpec=="":
756  getattr(self,"prepare_"+stepName)(sequence = getattr(self,stepName+"DefaultSeq"))
757  elif isinstance(stepSpec, list):
758  getattr(self,"prepare_"+stepName)(sequence = '+'.join(stepSpec))
759  elif isinstance(stepSpec, tuple):
760  getattr(self,"prepare_"+stepName)(sequence = ','.join([stepSpec[1],'+'.join(stepSpec[0])]))
761  else:
762  raise ValueError("Invalid step definition")
763 
764  if self._options.restoreRNDSeeds!=False:
765  #it is either True, or a process name
766  if self._options.restoreRNDSeeds==True:
767  self.executeAndRemember('process.RandomNumberGeneratorService.restoreStateLabel=cms.untracked.string("randomEngineStateProducer")')
768  else:
769  self.executeAndRemember('process.RandomNumberGeneratorService.restoreStateTag=cms.untracked.InputTag("randomEngineStateProducer","","%s")'%(self._options.restoreRNDSeeds))
770  if self._options.inputEventContent or self._options.inputCommands:
771  if self._options.inputCommands:
772  self._options.inputCommands+='keep *_randomEngineStateProducer_*_*,'
773  else:
774  self._options.inputCommands='keep *_randomEngineStateProducer_*_*,'
775 
776 
777  def completeInputCommand(self):
778  if self._options.inputEventContent:
779  import copy
780  def dropSecondDropStar(iec):
781  #drop occurence of 'drop *' in the list
782  count=0
783  for item in iec:
784  if item=='drop *':
785  if count!=0:
786  iec.remove(item)
787  count+=1
788 
789 
790  if not hasattr(self.process.source,'inputCommands'): self.process.source.inputCommands=cms.untracked.vstring()
791  for evct in self._options.inputEventContent.split(','):
792  if evct=='': continue
793  theEventContent = getattr(self.process, evct+"EventContent")
794  if hasattr(theEventContent,'outputCommands'):
795  self.process.source.inputCommands.extend(copy.copy(theEventContent.outputCommands))
796  if hasattr(theEventContent,'inputCommands'):
797  self.process.source.inputCommands.extend(copy.copy(theEventContent.inputCommands))
798 
799  dropSecondDropStar(self.process.source.inputCommands)
800 
801  if not self._options.dropDescendant:
802  self.process.source.dropDescendantsOfDroppedBranches = cms.untracked.bool(False)
803 
804 
805  return
806 
807  def addConditions(self):
808  """Add conditions to the process"""
809  if not self._options.conditions: return
810 
811  if 'FrontierConditions_GlobalTag' in self._options.conditions:
812  print('using FrontierConditions_GlobalTag in --conditions is not necessary anymore and will be deprecated soon. please update your command line')
813  self._options.conditions = self._options.conditions.replace("FrontierConditions_GlobalTag,",'')
814 
816  from Configuration.AlCa.GlobalTag import GlobalTag
817  self.process.GlobalTag = GlobalTag(self.process.GlobalTag, self._options.conditions, self._options.custom_conditions)
818  self.additionalCommands.append('from Configuration.AlCa.GlobalTag import GlobalTag')
819  self.additionalCommands.append('process.GlobalTag = GlobalTag(process.GlobalTag, %s, %s)' % (repr(self._options.conditions), repr(self._options.custom_conditions)))
820 
821 
822  def addCustomise(self,unsch=0):
823  """Include the customise code """
824 
825  custOpt=[]
826  if unsch==0:
827  for c in self._options.customisation_file:
828  custOpt.extend(c.split(","))
829  else:
830  for c in self._options.customisation_file_unsch:
831  custOpt.extend(c.split(","))
832 
833  custMap=DictTypes.SortedKeysDict()
834  for opt in custOpt:
835  if opt=='': continue
836  if opt.count('.')>1:
837  raise Exception("more than . in the specification:"+opt)
838  fileName=opt.split('.')[0]
839  if opt.count('.')==0: rest='customise'
840  else:
841  rest=opt.split('.')[1]
842  if rest=='py': rest='customise' #catch the case of --customise file.py
843 
844  if fileName in custMap:
845  custMap[fileName].extend(rest.split('+'))
846  else:
847  custMap[fileName]=rest.split('+')
848 
849  if len(custMap)==0:
850  final_snippet='\n'
851  else:
852  final_snippet='\n# customisation of the process.\n'
853 
854  allFcn=[]
855  for opt in custMap:
856  allFcn.extend(custMap[opt])
857  for fcn in allFcn:
858  if allFcn.count(fcn)!=1:
859  raise Exception("cannot specify twice "+fcn+" as a customisation method")
860 
861  for f in custMap:
862  # let python search for that package and do syntax checking at the same time
863  packageName = f.replace(".py","").replace("/",".")
864  __import__(packageName)
865  package = sys.modules[packageName]
866 
867  # now ask the package for its definition and pick .py instead of .pyc
868  customiseFile = re.sub(r'\.pyc$', '.py', package.__file__)
869 
870  final_snippet+='\n# Automatic addition of the customisation function from '+packageName+'\n'
871  if self._options.inline_custom:
872  for line in file(customiseFile,'r'):
873  if "import FWCore.ParameterSet.Config" in line:
874  continue
875  final_snippet += line
876  else:
877  final_snippet += 'from %s import %s \n'%(packageName,','.join(custMap[f]))
878  for fcn in custMap[f]:
879  print("customising the process with",fcn,"from",f)
880  if not hasattr(package,fcn):
881  #bound to fail at run time
882  raise Exception("config "+f+" has no function "+fcn)
883  #execute the command
884  self.process=getattr(package,fcn)(self.process)
885  #and print it in the configuration
886  final_snippet += "\n#call to customisation function "+fcn+" imported from "+packageName
887  final_snippet += "\nprocess = %s(process)\n"%(fcn,)
888 
889  if len(custMap)!=0:
890  final_snippet += '\n# End of customisation functions\n'
891 
892 
893  return final_snippet
894 
895  def addCustomiseCmdLine(self):
896  final_snippet='\n# Customisation from command line\n'
897  if self._options.customise_commands:
898  import string
899  for com in self._options.customise_commands.split('\\n'):
900  com=com.lstrip()
901  self.executeAndRemember(com)
902  final_snippet +='\n'+com
903 
904  return final_snippet
905 
906  #----------------------------------------------------------------------------
907  # here the methods to define the python includes for each step or
908  # conditions
909  #----------------------------------------------------------------------------
910  def define_Configs(self):
911  if len(self.stepMap):
912  self.loadAndRemember('Configuration/StandardSequences/Services_cff')
913  if self._options.particleTable not in defaultOptions.particleTableList:
914  print('Invalid particle table provided. Options are:')
915  print(defaultOptions.particleTable)
916  sys.exit(-1)
917  else:
918  if len(self.stepMap):
919  self.loadAndRemember('SimGeneral.HepPDTESSource.'+self._options.particleTable+'_cfi')
920 
921  self.loadAndRemember('FWCore/MessageService/MessageLogger_cfi')
922 
923  self.ALCADefaultCFF="Configuration/StandardSequences/AlCaRecoStreams_cff"
924  self.GENDefaultCFF="Configuration/StandardSequences/Generator_cff"
925  self.SIMDefaultCFF="Configuration/StandardSequences/Sim_cff"
926  self.DIGIDefaultCFF="Configuration/StandardSequences/Digi_cff"
927  self.DIGI2RAWDefaultCFF="Configuration/StandardSequences/DigiToRaw_cff"
928  self.L1EMDefaultCFF='Configuration/StandardSequences/SimL1Emulator_cff'
929  self.L1MENUDefaultCFF="Configuration/StandardSequences/L1TriggerDefaultMenu_cff"
930  self.HLTDefaultCFF="Configuration/StandardSequences/HLTtable_cff"
931  self.RAW2DIGIDefaultCFF="Configuration/StandardSequences/RawToDigi_Data_cff"
932  if self._options.isRepacked: self.RAW2DIGIDefaultCFF="Configuration/StandardSequences/RawToDigi_DataMapper_cff"
933  self.L1RecoDefaultCFF="Configuration/StandardSequences/L1Reco_cff"
934  self.L1TrackTriggerDefaultCFF="Configuration/StandardSequences/L1TrackTrigger_cff"
935  self.RECODefaultCFF="Configuration/StandardSequences/Reconstruction_Data_cff"
936  self.RECOSIMDefaultCFF="Configuration/StandardSequences/RecoSim_cff"
937  self.PATDefaultCFF="Configuration/StandardSequences/PAT_cff"
938  self.NANODefaultCFF="PhysicsTools/NanoAOD/nano_cff"
939  self.EIDefaultCFF=None
940  self.SKIMDefaultCFF="Configuration/StandardSequences/Skims_cff"
941  self.POSTRECODefaultCFF="Configuration/StandardSequences/PostRecoGenerator_cff"
942  self.VALIDATIONDefaultCFF="Configuration/StandardSequences/Validation_cff"
943  self.L1HwValDefaultCFF = "Configuration/StandardSequences/L1HwVal_cff"
944  self.DQMOFFLINEDefaultCFF="DQMOffline/Configuration/DQMOffline_cff"
945  self.HARVESTINGDefaultCFF="Configuration/StandardSequences/Harvesting_cff"
946  self.ALCAHARVESTDefaultCFF="Configuration/StandardSequences/AlCaHarvesting_cff"
947  self.ENDJOBDefaultCFF="Configuration/StandardSequences/EndOfProcess_cff"
948  self.ConditionsDefaultCFF = "Configuration/StandardSequences/FrontierConditions_GlobalTag_cff"
949  self.CFWRITERDefaultCFF = "Configuration/StandardSequences/CrossingFrameWriter_cff"
950  self.REPACKDefaultCFF="Configuration/StandardSequences/DigiToRaw_Repack_cff"
951 
952  if "DATAMIX" in self.stepMap.keys():
953  self.DATAMIXDefaultCFF="Configuration/StandardSequences/DataMixer"+self._options.datamix+"_cff"
954  self.DIGIDefaultCFF="Configuration/StandardSequences/DigiDM_cff"
955  self.DIGI2RAWDefaultCFF="Configuration/StandardSequences/DigiToRawDM_cff"
956  self.L1EMDefaultCFF='Configuration/StandardSequences/SimL1EmulatorDM_cff'
957 
958  self.ALCADefaultSeq=None
959  self.LHEDefaultSeq='externalLHEProducer'
960  self.GENDefaultSeq='pgen'
961  self.SIMDefaultSeq='psim'
962  self.DIGIDefaultSeq='pdigi'
964  self.DIGI2RAWDefaultSeq='DigiToRaw'
965  self.HLTDefaultSeq='GRun'
966  self.L1DefaultSeq=None
971  self.RAW2DIGIDefaultSeq='RawToDigi'
972  self.L1RecoDefaultSeq='L1Reco'
973  self.L1TrackTriggerDefaultSeq='L1TrackTrigger'
974  if self._options.fast or ('RAW2DIGI' in self.stepMap and 'RECO' in self.stepMap):
975  self.RECODefaultSeq='reconstruction'
976  else:
977  self.RECODefaultSeq='reconstruction_fromRECO'
978  self.RECOSIMDefaultSeq='recosim'
979  self.EIDefaultSeq='top'
981  self.L1HwValDefaultSeq='L1HwVal'
982  self.DQMDefaultSeq='DQMOffline'
984  self.ENDJOBDefaultSeq='endOfProcess'
985  self.REPACKDefaultSeq='DigiToRawRepack'
986  self.PATDefaultSeq='miniAOD'
987  self.PATGENDefaultSeq='miniGEN'
988  self.NANODefaultSeq='nanoSequence'
989 
990  self.EVTCONTDefaultCFF="Configuration/EventContent/EventContent_cff"
991 
992  if not self._options.beamspot:
993  self._options.beamspot=VtxSmearedDefaultKey
994 
995  # if its MC then change the raw2digi
996  if self._options.isMC==True:
997  self.RAW2DIGIDefaultCFF="Configuration/StandardSequences/RawToDigi_cff"
998  self.RECODefaultCFF="Configuration/StandardSequences/Reconstruction_cff"
999  self.PATDefaultCFF="Configuration/StandardSequences/PATMC_cff"
1000  self.PATGENDefaultCFF="Configuration/StandardSequences/PATGEN_cff"
1001  self.DQMOFFLINEDefaultCFF="DQMOffline/Configuration/DQMOfflineMC_cff"
1002  self.ALCADefaultCFF="Configuration/StandardSequences/AlCaRecoStreamsMC_cff"
1003  self.NANODefaultSeq='nanoSequenceMC'
1004  else:
1005  self._options.beamspot = None
1006 
1007  #patch for gen, due to backward incompatibility
1008  if 'reGEN' in self.stepMap:
1009  self.GENDefaultSeq='fixGenInfo'
1010 
1011  if self._options.scenario=='cosmics':
1012  self._options.pileup='Cosmics'
1013  self.DIGIDefaultCFF="Configuration/StandardSequences/DigiCosmics_cff"
1014  self.RECODefaultCFF="Configuration/StandardSequences/ReconstructionCosmics_cff"
1015  self.SKIMDefaultCFF="Configuration/StandardSequences/SkimsCosmics_cff"
1016  self.EVTCONTDefaultCFF="Configuration/EventContent/EventContentCosmics_cff"
1017  self.VALIDATIONDefaultCFF="Configuration/StandardSequences/ValidationCosmics_cff"
1018  self.DQMOFFLINEDefaultCFF="DQMOffline/Configuration/DQMOfflineCosmics_cff"
1019  if self._options.isMC==True:
1020  self.DQMOFFLINEDefaultCFF="DQMOffline/Configuration/DQMOfflineCosmicsMC_cff"
1021  self.HARVESTINGDefaultCFF="Configuration/StandardSequences/HarvestingCosmics_cff"
1022  self.RECODefaultSeq='reconstructionCosmics'
1023  self.DQMDefaultSeq='DQMOfflineCosmics'
1024 
1025  if self._options.scenario=='HeavyIons':
1026  if not self._options.beamspot:
1027  self._options.beamspot=VtxSmearedHIDefaultKey
1028  self.HLTDefaultSeq = 'HIon'
1029  self.VALIDATIONDefaultCFF="Configuration/StandardSequences/ValidationHeavyIons_cff"
1030  self.VALIDATIONDefaultSeq=''
1031  self.EVTCONTDefaultCFF="Configuration/EventContent/EventContentHeavyIons_cff"
1032  self.RECODefaultCFF="Configuration/StandardSequences/ReconstructionHeavyIons_cff"
1033  self.RECODefaultSeq='reconstructionHeavyIons'
1034  self.ALCADefaultCFF = "Configuration/StandardSequences/AlCaRecoStreamsHeavyIons_cff"
1035  self.DQMOFFLINEDefaultCFF="DQMOffline/Configuration/DQMOfflineHeavyIons_cff"
1036  self.DQMDefaultSeq='DQMOfflineHeavyIons'
1037  self.SKIMDefaultCFF="Configuration/StandardSequences/SkimsHeavyIons_cff"
1038  self.HARVESTINGDefaultCFF="Configuration/StandardSequences/HarvestingHeavyIons_cff"
1039  if self._options.isMC==True:
1040  self.DQMOFFLINEDefaultCFF="DQMOffline/Configuration/DQMOfflineHeavyIonsMC_cff"
1041 
1042 
1045  self.USERDefaultSeq='user'
1046  self.USERDefaultCFF=None
1048  # the magnetic field
1049  if self._options.isData:
1050  if self._options.magField==defaultOptions.magField:
1051  print("magnetic field option forced to: AutoFromDBCurrent")
1052  self._options.magField='AutoFromDBCurrent'
1053  self.magFieldCFF = 'Configuration/StandardSequences/MagneticField_'+self._options.magField.replace('.','')+'_cff'
1054  self.magFieldCFF = self.magFieldCFF.replace("__",'_')
1055 
1056  # the geometry
1057  self.GeometryCFF='Configuration/StandardSequences/GeometryRecoDB_cff'
1059  simGeometry=''
1060  if self._options.fast:
1061  if 'start' in self._options.conditions.lower():
1062  self.GeometryCFF='FastSimulation/Configuration/Geometries_START_cff'
1063  else:
1064  self.GeometryCFF='FastSimulation/Configuration/Geometries_MC_cff'
1065  else:
1066  def inGeometryKeys(opt):
1067  from Configuration.StandardSequences.GeometryConf import GeometryConf
1068  if opt in GeometryConf:
1069  return GeometryConf[opt]
1070  else:
1071  return opt
1072 
1073  geoms=self._options.geometry.split(',')
1074  if len(geoms)==1: geoms=inGeometryKeys(geoms[0]).split(',')
1075  if len(geoms)==2:
1076  #may specify the reco geometry
1077  if '/' in geoms[1] or '_cff' in geoms[1]:
1078  self.GeometryCFF=geoms[1]
1079  else:
1080  self.GeometryCFF='Configuration/Geometry/Geometry'+geoms[1]+'_cff'
1081 
1082  if (geoms[0].startswith('DB:')):
1083  self.SimGeometryCFF='Configuration/StandardSequences/GeometrySimDB_cff'
1084  self.geometryDBLabel=geoms[0][3:]
1085  print("with DB:")
1086  else:
1087  if '/' in geoms[0] or '_cff' in geoms[0]:
1088  self.SimGeometryCFF=geoms[0]
1089  else:
1090  simGeometry=geoms[0]
1091  if self._options.gflash==True:
1092  self.SimGeometryCFF='Configuration/Geometry/Geometry'+geoms[0]+'GFlash_cff'
1093  else:
1094  self.SimGeometryCFF='Configuration/Geometry/Geometry'+geoms[0]+'_cff'
1095 
1096  # synchronize the geometry configuration and the FullSimulation sequence to be used
1097  if simGeometry not in defaultOptions.geometryExtendedOptions:
1098  self.SIMDefaultCFF="Configuration/StandardSequences/SimIdeal_cff"
1099 
1100  if self._options.scenario=='nocoll' or self._options.scenario=='cosmics':
1101  self.SIMDefaultCFF="Configuration/StandardSequences/SimNOBEAM_cff"
1102  self._options.beamspot='NoSmear'
1103 
1104  # fastsim requires some changes to the default cff files and sequences
1105  if self._options.fast:
1106  self.SIMDefaultCFF = 'FastSimulation.Configuration.SimIdeal_cff'
1107  self.RECODefaultCFF= 'FastSimulation.Configuration.Reconstruction_AftMix_cff'
1108  self.RECOBEFMIXDefaultCFF = 'FastSimulation.Configuration.Reconstruction_BefMix_cff'
1109  self.RECOBEFMIXDefaultSeq = 'reconstruction_befmix'
1110  self.NANODefaultSeq = 'nanoSequenceFS'
1111  self.DQMOFFLINEDefaultCFF="DQMOffline.Configuration.DQMOfflineFS_cff"
1112 
1113  # Mixing
1114  if self._options.pileup=='default':
1115  from Configuration.StandardSequences.Mixing import MixingDefaultKey
1116  self._options.pileup=MixingDefaultKey
1117 
1118 
1119  #not driven by a default cff anymore
1120  if self._options.isData:
1121  self._options.pileup=None
1122 
1123 
1126  # for alca, skims, etc
1127  def addExtraStream(self,name,stream,workflow='full'):
1128  # define output module and go from there
1129  output = cms.OutputModule("PoolOutputModule")
1130  if stream.selectEvents.parameters_().__len__()!=0:
1131  output.SelectEvents = stream.selectEvents
1132  else:
1133  output.SelectEvents = cms.untracked.PSet()
1134  output.SelectEvents.SelectEvents=cms.vstring()
1135  if isinstance(stream.paths,tuple):
1136  for path in stream.paths:
1137  output.SelectEvents.SelectEvents.append(path.label())
1138  else:
1139  output.SelectEvents.SelectEvents.append(stream.paths.label())
1140 
1141 
1142 
1143  if isinstance(stream.content,str):
1144  evtPset=getattr(self.process,stream.content)
1145  for p in evtPset.parameters_():
1146  setattr(output,p,getattr(evtPset,p))
1147  if not self._options.inlineEventContent:
1148  def doNotInlineEventContent(instance,label = "process."+stream.content+".outputCommands"):
1149  return label
1150  output.outputCommands.__dict__["dumpPython"] = doNotInlineEventContent
1151  else:
1152  output.outputCommands = stream.content
1153 
1154 
1155  output.fileName = cms.untracked.string(self._options.dirout+stream.name+'.root')
1156 
1157  output.dataset = cms.untracked.PSet( dataTier = stream.dataTier,
1158  filterName = cms.untracked.string(stream.name))
1159 
1160  if self._options.filtername:
1161  output.dataset.filterName= cms.untracked.string(self._options.filtername+"_"+stream.name)
1162 
1163  #add an automatic flushing to limit memory consumption
1164  output.eventAutoFlushCompressedSize=cms.untracked.int32(5*1024*1024)
1165 
1166  if workflow in ("producers,full"):
1167  if isinstance(stream.paths,tuple):
1168  for path in stream.paths:
1169  self.schedule.append(path)
1170  else:
1171  self.schedule.append(stream.paths)
1172 
1173 
1174  # in case of relvals we don't want to have additional outputs
1175  if (not self._options.relval) and workflow in ("full","output"):
1176  self.additionalOutputs[name] = output
1177  setattr(self.process,name,output)
1178 
1179  if workflow == 'output':
1180  # adjust the select events to the proper trigger results from previous process
1181  filterList = output.SelectEvents.SelectEvents
1182  for i, filter in enumerate(filterList):
1183  filterList[i] = filter+":"+self._options.triggerResultsProcess
1184 
1185  return output
1186 
1187  #----------------------------------------------------------------------------
1188  # here the methods to create the steps. Of course we are doing magic here ;)
1189  # prepare_STEPNAME modifies self.process and what else's needed.
1190  #----------------------------------------------------------------------------
1191 
1192  def loadDefaultOrSpecifiedCFF(self, sequence,defaultCFF):
1193  if ( len(sequence.split('.'))==1 ):
1194  l=self.loadAndRemember(defaultCFF)
1195  elif ( len(sequence.split('.'))==2 ):
1196  l=self.loadAndRemember(sequence.split('.')[0])
1197  sequence=sequence.split('.')[1]
1198  else:
1199  print("sub sequence configuration must be of the form dir/subdir/cff.a+b+c or cff.a")
1200  print(sequence,"not recognized")
1201  raise
1202  return l
1203 
1204  def scheduleSequence(self,seq,prefix,what='Path'):
1205  if '*' in seq:
1206  #create only one path with all sequences in it
1207  for i,s in enumerate(seq.split('*')):
1208  if i==0:
1209  setattr(self.process,prefix,getattr(cms,what)( getattr(self.process, s) ))
1210  else:
1211  p=getattr(self.process,prefix)
1212  tmp = getattr(self.process, s)
1213  if isinstance(tmp, cms.Task):
1214  p.associate(tmp)
1215  else:
1216  p+=tmp
1217  self.schedule.append(getattr(self.process,prefix))
1218  return
1219  else:
1220  #create as many path as many sequences
1221  if not '+' in seq:
1222  if self.nextScheduleIsConditional:
1223  self.conditionalPaths.append(prefix)
1224  setattr(self.process,prefix,getattr(cms,what)( getattr(self.process, seq) ))
1225  self.schedule.append(getattr(self.process,prefix))
1226  else:
1227  for i,s in enumerate(seq.split('+')):
1228  sn=prefix+'%d'%(i)
1229  setattr(self.process,sn,getattr(cms,what)( getattr(self.process, s) ))
1230  self.schedule.append(getattr(self.process,sn))
1231  return
1232 
1233  def scheduleSequenceAtEnd(self,seq,prefix):
1234  self.scheduleSequence(seq,prefix,what='EndPath')
1235  return
1236 
1237  def prepare_ALCAPRODUCER(self, sequence = None):
1238  self.prepare_ALCA(sequence, workflow = "producers")
1239 
1240  def prepare_ALCAOUTPUT(self, sequence = None):
1241  self.prepare_ALCA(sequence, workflow = "output")
1242 
1243  def prepare_ALCA(self, sequence = None, workflow = 'full'):
1244  """ Enrich the process with alca streams """
1245  alcaConfig=self.loadDefaultOrSpecifiedCFF(sequence,self.ALCADefaultCFF)
1246  sequence = sequence.split('.')[-1]
1247 
1248  # decide which ALCA paths to use
1249  alcaList = sequence.split("+")
1250  maxLevel=0
1251  from Configuration.AlCa.autoAlca import autoAlca
1252  # support @X from autoAlca.py, and recursion support: i.e T0:@Mu+@EG+...
1253  self.expandMapping(alcaList,autoAlca)
1254  self.AlCaPaths=[]
1255  for name in alcaConfig.__dict__:
1256  alcastream = getattr(alcaConfig,name)
1257  shortName = name.replace('ALCARECOStream','')
1258  if shortName in alcaList and isinstance(alcastream,cms.FilteredStream):
1259  output = self.addExtraStream(name,alcastream, workflow = workflow)
1260  self.executeAndRemember('process.ALCARECOEventContent.outputCommands.extend(process.OutALCARECO'+shortName+'_noDrop.outputCommands)')
1261  self.AlCaPaths.append(shortName)
1262  if 'DQM' in alcaList:
1263  if not self._options.inlineEventContent and hasattr(self.process,name):
1264  self.executeAndRemember('process.' + name + '.outputCommands.append("keep *_MEtoEDMConverter_*_*")')
1265  else:
1266  output.outputCommands.append("keep *_MEtoEDMConverter_*_*")
1267 
1268  #rename the HLT process name in the alca modules
1269  if self._options.hltProcess or 'HLT' in self.stepMap:
1270  if isinstance(alcastream.paths,tuple):
1271  for path in alcastream.paths:
1272  self.renameHLTprocessInSequence(path.label())
1273  else:
1274  self.renameHLTprocessInSequence(alcastream.paths.label())
1275 
1276  for i in range(alcaList.count(shortName)):
1277  alcaList.remove(shortName)
1278 
1279  # DQM needs a special handling
1280  elif name == 'pathALCARECODQM' and 'DQM' in alcaList:
1281  path = getattr(alcaConfig,name)
1282  self.schedule.append(path)
1283  alcaList.remove('DQM')
1284 
1285  if isinstance(alcastream,cms.Path):
1286  #black list the alca path so that they do not appear in the cfg
1287  self.blacklist_paths.append(alcastream)
1288 
1289 
1290  if len(alcaList) != 0:
1291  available=[]
1292  for name in alcaConfig.__dict__:
1293  alcastream = getattr(alcaConfig,name)
1294  if isinstance(alcastream,cms.FilteredStream):
1295  available.append(name.replace('ALCARECOStream',''))
1296  print("The following alcas could not be found "+str(alcaList))
1297  print("available ",available)
1298  #print "verify your configuration, ignoring for now"
1299  raise Exception("The following alcas could not be found "+str(alcaList))
1300 
1301  def prepare_LHE(self, sequence = None):
1302  #load the fragment
1303 
1304  loadFragment = self._options.evt_type.replace('.py','',).replace('.','_').replace('python/','').replace('/','.')
1305  print("Loading lhe fragment from",loadFragment)
1306  __import__(loadFragment)
1307  self.process.load(loadFragment)
1308 
1309  self._options.inlineObjets+=','+sequence
1310 
1311  getattr(self.process,sequence).nEvents = int(self._options.number)
1312 
1313  #schedule it
1314  self.process.lhe_step = cms.Path( getattr( self.process,sequence) )
1315  self.excludedPaths.append("lhe_step")
1316  self.schedule.append( self.process.lhe_step )
1317 
1318  def prepare_GEN(self, sequence = None):
1319  """ load the fragment of generator configuration """
1320  loadFailure=False
1321  #remove trailing .py
1322  #support old style .cfi by changing into something.cfi into something_cfi
1323  #remove python/ from the name
1324  loadFragment = self._options.evt_type.replace('.py','',).replace('.','_').replace('python/','')
1325  #standard location of fragments
1326  if not '/' in loadFragment:
1327  loadFragment='Configuration.Generator.'+loadFragment
1328  else:
1329  loadFragment=loadFragment.replace('/','.')
1330  try:
1331  print("Loading generator fragment from",loadFragment)
1332  __import__(loadFragment)
1333  except:
1334  loadFailure=True
1335  #if self.process.source and self.process.source.type_()=='EmptySource':
1336  if not (self._options.filein or self._options.dasquery):
1337  raise Exception("Neither gen fragment of input files provided: this is an inconsistent GEN step configuration")
1338 
1339  if not loadFailure:
1340  generatorModule=sys.modules[loadFragment]
1341  genModules=generatorModule.__dict__
1342  #remove lhe producer module since this should have been
1343  #imported instead in the LHE step
1344  if self.LHEDefaultSeq in genModules:
1345  del genModules[self.LHEDefaultSeq]
1346 
1347  if self._options.hideGen:
1348  self.loadAndRemember(loadFragment)
1349  else:
1350  self.process.load(loadFragment)
1351  # expose the objects from that fragment to the configuration
1352  import FWCore.ParameterSet.Modules as cmstypes
1353  for name in genModules:
1354  theObject = getattr(generatorModule,name)
1355  if isinstance(theObject, cmstypes._Module):
1356  self._options.inlineObjets=name+','+self._options.inlineObjets
1357  elif isinstance(theObject, cms.Sequence) or isinstance(theObject, cmstypes.ESProducer):
1358  self._options.inlineObjets+=','+name
1359 
1360  if sequence == self.GENDefaultSeq or sequence == 'pgen_genonly':
1361  if 'ProductionFilterSequence' in genModules and ('generator' in genModules):
1362  self.productionFilterSequence = 'ProductionFilterSequence'
1363  elif 'generator' in genModules:
1364  self.productionFilterSequence = 'generator'
1365 
1366  """ Enrich the schedule with the rest of the generation step """
1367  self.loadDefaultOrSpecifiedCFF(sequence,self.GENDefaultCFF)
1368  genSeqName=sequence.split('.')[-1]
1369 
1370  if True:
1371  try:
1372  from Configuration.StandardSequences.VtxSmeared import VtxSmeared
1373  cffToBeLoaded=VtxSmeared[self._options.beamspot]
1374  self.loadAndRemember(cffToBeLoaded)
1375  except ImportError:
1376  raise Exception("VertexSmearing type or beamspot "+self._options.beamspot+" unknown.")
1377 
1378  if self._options.scenario == 'HeavyIons':
1379  if self._options.pileup=='HiMixGEN':
1380  self.loadAndRemember("Configuration/StandardSequences/GeneratorMix_cff")
1381  else:
1382  self.loadAndRemember("Configuration/StandardSequences/GeneratorHI_cff")
1383 
1384  self.process.generation_step = cms.Path( getattr(self.process,genSeqName) )
1385  self.schedule.append(self.process.generation_step)
1386 
1387  #register to the genstepfilter the name of the path (static right now, but might evolve)
1388  self.executeAndRemember('process.genstepfilter.triggerConditions=cms.vstring("generation_step")')
1389 
1390  if 'reGEN' in self.stepMap:
1391  #stop here
1392  return
1393 
1394  """ Enrich the schedule with the summary of the filter step """
1395  #the gen filter in the endpath
1396  self.loadAndRemember("GeneratorInterface/Core/genFilterSummary_cff")
1397  self.scheduleSequenceAtEnd('genFilterSummary','genfiltersummary_step')
1398  return
1399 
1400  def prepare_SIM(self, sequence = None):
1401  """ Enrich the schedule with the simulation step"""
1402  self.loadDefaultOrSpecifiedCFF(sequence,self.SIMDefaultCFF)
1403  if not self._options.fast:
1404  if self._options.gflash==True:
1405  self.loadAndRemember("Configuration/StandardSequences/GFlashSIM_cff")
1406 
1407  if self._options.magField=='0T':
1408  self.executeAndRemember("process.g4SimHits.UseMagneticField = cms.bool(False)")
1409  else:
1410  if self._options.magField=='0T':
1411  self.executeAndRemember("process.fastSimProducer.detectorDefinition.magneticFieldZ = cms.untracked.double(0.)")
1412 
1413  self.scheduleSequence(sequence.split('.')[-1],'simulation_step')
1414  return
1415 
1416  def prepare_DIGI(self, sequence = None):
1417  """ Enrich the schedule with the digitisation step"""
1418  self.loadDefaultOrSpecifiedCFF(sequence,self.DIGIDefaultCFF)
1419 
1420  if self._options.gflash==True:
1421  self.loadAndRemember("Configuration/StandardSequences/GFlashDIGI_cff")
1422 
1423  if sequence == 'pdigi_valid' or sequence == 'pdigi_hi':
1424  self.executeAndRemember("process.mix.digitizers = cms.PSet(process.theDigitizersValid)")
1425 
1426  if sequence != 'pdigi_nogen' and sequence != 'pdigi_valid_nogen' and sequence != 'pdigi_hi_nogen' and not self.process.source.type_()=='EmptySource' and not self._options.filetype == "LHE":
1427  if self._options.inputEventContent=='':
1428  self._options.inputEventContent='REGEN'
1429  else:
1430  self._options.inputEventContent=self._options.inputEventContent+',REGEN'
1431 
1432 
1433  self.scheduleSequence(sequence.split('.')[-1],'digitisation_step')
1434  return
1435 
1436  def prepare_CFWRITER(self, sequence = None):
1437  """ Enrich the schedule with the crossing frame writer step"""
1439  self.scheduleSequence('pcfw','cfwriter_step')
1440  return
1441 
1442  def prepare_DATAMIX(self, sequence = None):
1443  """ Enrich the schedule with the digitisation step"""
1445  self.scheduleSequence('pdatamix','datamixing_step')
1446 
1447  if self._options.pileup_input:
1448  theFiles=''
1449  if self._options.pileup_input.startswith('dbs:') or self._options.pileup_input.startswith('das:'):
1450  theFiles=filesFromDASQuery('file dataset = %s'%(self._options.pileup_input[4:],),self._options.pileup_dasoption)[0]
1451  elif self._options.pileup_input.startswith("filelist:"):
1452  theFiles= (filesFromList(self._options.pileup_input[9:]))[0]
1453  else:
1454  theFiles=self._options.pileup_input.split(',')
1455  #print theFiles
1456  self.executeAndRemember( "process.mixData.input.fileNames = cms.untracked.vstring(%s)"%( theFiles ) )
1457 
1458  return
1459 
1460  def prepare_DIGI2RAW(self, sequence = None):
1462  self.scheduleSequence(sequence.split('.')[-1],'digi2raw_step')
1463  return
1464 
1465  def prepare_REPACK(self, sequence = None):
1467  self.scheduleSequence(sequence.split('.')[-1],'digi2repack_step')
1468  return
1469 
1470  def prepare_L1(self, sequence = None):
1471  """ Enrich the schedule with the L1 simulation step"""
1472  assert(sequence == None)
1473  self.loadAndRemember(self.L1EMDefaultCFF)
1474  self.scheduleSequence('SimL1Emulator','L1simulation_step')
1475  return
1476 
1477  def prepare_L1REPACK(self, sequence = None):
1478  """ Enrich the schedule with the L1 simulation step, running the L1 emulator on data unpacked from the RAW collection, and repacking the result in a new RAW collection"""
1479  supported = ['GT','GT1','GT2','GCTGT','Full','FullSimTP','FullMC','Full2015Data','uGT','CalouGT']
1480  if sequence in supported:
1481  self.loadAndRemember('Configuration/StandardSequences/SimL1EmulatorRepack_%s_cff'%sequence)
1482  if self._options.scenario == 'HeavyIons':
1483  self.renameInputTagsInSequence("SimL1Emulator","rawDataCollector","rawDataRepacker")
1484  self.scheduleSequence('SimL1Emulator','L1RePack_step')
1485  else:
1486  print("L1REPACK with '",sequence,"' is not supported! Supported choices are: ",supported)
1487  raise Exception('unsupported feature')
1488 
1489 
1490  def prepare_HLT(self, sequence = None):
1491  """ Enrich the schedule with the HLT simulation step"""
1492  if not sequence:
1493  print("no specification of the hlt menu has been given, should never happen")
1494  raise Exception('no HLT sequence provided')
1495 
1496  if '@' in sequence:
1497  # case where HLT:@something was provided
1498  from Configuration.HLT.autoHLT import autoHLT
1499  key = sequence[1:]
1500  if key in autoHLT:
1501  sequence = autoHLT[key]
1502  else:
1503  raise ValueError('no HLT mapping key "%s" found in autoHLT' % key)
1504 
1505  if ',' in sequence:
1506  #case where HLT:something:something was provided
1507  self.executeAndRemember('import HLTrigger.Configuration.Utilities')
1508  optionsForHLT = {}
1509  if self._options.scenario == 'HeavyIons':
1510  optionsForHLT['type'] = 'HIon'
1511  else:
1512  optionsForHLT['type'] = 'GRun'
1513  optionsForHLTConfig = ', '.join('%s=%s' % (key, repr(val)) for (key, val) in six.iteritems(optionsForHLT))
1514  if sequence == 'run,fromSource':
1515  if hasattr(self.process.source,'firstRun'):
1516  self.executeAndRemember('process.loadHltConfiguration("run:%%d"%%(process.source.firstRun.value()),%s)'%(optionsForHLTConfig))
1517  elif hasattr(self.process.source,'setRunNumber'):
1518  self.executeAndRemember('process.loadHltConfiguration("run:%%d"%%(process.source.setRunNumber.value()),%s)'%(optionsForHLTConfig))
1519  else:
1520  raise Exception('Cannot replace menu to load %s'%(sequence))
1521  else:
1522  self.executeAndRemember('process.loadHltConfiguration("%s",%s)'%(sequence.replace(',',':'),optionsForHLTConfig))
1523  else:
1524  self.loadAndRemember('HLTrigger/Configuration/HLT_%s_cff' % sequence)
1525 
1526  if self._options.isMC:
1527  self._options.customisation_file.append("HLTrigger/Configuration/customizeHLTforMC.customizeHLTforMC")
1528 
1529  if self._options.name != 'HLT':
1530  self.additionalCommands.append('from HLTrigger.Configuration.CustomConfigs import ProcessName')
1531  self.additionalCommands.append('process = ProcessName(process)')
1532  self.additionalCommands.append('')
1533  from HLTrigger.Configuration.CustomConfigs import ProcessName
1534  self.process = ProcessName(self.process)
1535 
1536  self.schedule.append(self.process.HLTSchedule)
1537  [self.blacklist_paths.append(path) for path in self.process.HLTSchedule if isinstance(path,(cms.Path,cms.EndPath))]
1538 
1539  #this is a fake, to be removed with fastim migration and HLT menu dump
1540  if self._options.fast:
1541  if not hasattr(self.process,'HLTEndSequence'):
1542  self.executeAndRemember("process.HLTEndSequence = cms.Sequence( process.dummyModule )")
1543 
1544 
1545  def prepare_RAW2RECO(self, sequence = None):
1546  if ','in sequence:
1547  seqReco=sequence.split(',')[1]
1548  seqDigi=sequence.split(',')[0]
1549  else:
1550  print("RAW2RECO requires two specifications",sequence,"insufficient")
1551 
1552  self.prepare_RAW2DIGI(seqDigi)
1553  self.prepare_RECO(seqReco)
1554  return
1555 
1556  def prepare_RAW2DIGI(self, sequence = "RawToDigi"):
1558  self.scheduleSequence(sequence,'raw2digi_step')
1559  # if self._options.isRepacked:
1560  #self.renameInputTagsInSequence(sequence)
1561  return
1562 
1563  def prepare_PATFILTER(self, sequence=None):
1564  self.loadAndRemember("PhysicsTools/PatAlgos/slimming/metFilterPaths_cff")
1565  from PhysicsTools.PatAlgos.slimming.metFilterPaths_cff import allMetFilterPaths
1566  for filt in allMetFilterPaths:
1567  self.schedule.append(getattr(self.process,'Flag_'+filt))
1568 
1569  def prepare_L1HwVal(self, sequence = 'L1HwVal'):
1570  ''' Enrich the schedule with L1 HW validation '''
1571  self.loadDefaultOrSpecifiedCFF(sequence,self.L1HwValDefaultCFF)
1572  #self.scheduleSequence(sequence.split('.')[-1],'l1hwval_step')
1573  print('\n\n\n DEPRECATED this has no action \n\n\n')
1574  return
1575 
1576  def prepare_L1Reco(self, sequence = "L1Reco"):
1577  ''' Enrich the schedule with L1 reconstruction '''
1578  self.loadDefaultOrSpecifiedCFF(sequence,self.L1RecoDefaultCFF)
1579  self.scheduleSequence(sequence.split('.')[-1],'L1Reco_step')
1580  return
1581 
1582  def prepare_L1TrackTrigger(self, sequence = "L1TrackTrigger"):
1583  ''' Enrich the schedule with L1 reconstruction '''
1585  self.scheduleSequence(sequence.split('.')[-1],'L1TrackTrigger_step')
1586  return
1587 
1588  def prepare_FILTER(self, sequence = None):
1589  ''' Enrich the schedule with a user defined filter sequence '''
1590 
1591  filterConfig=self.load(sequence.split('.')[0])
1592  filterSeq=sequence.split('.')[-1]
1593 
1594  class PrintAllModules(object):
1595  def __init__(self):
1596  self.inliner=''
1597  pass
1598  def enter(self,visitee):
1599  try:
1600  label=visitee.label()
1601 
1602  self.inliner=label+','+self.inliner
1603  except:
1604  pass
1605  def leave(self,v): pass
1606 
1607  expander=PrintAllModules()
1608  getattr(self.process,filterSeq).visit( expander )
1609  self._options.inlineObjets+=','+expander.inliner
1610  self._options.inlineObjets+=','+filterSeq
1611 
1612 
1613  self.scheduleSequence(filterSeq,'filtering_step')
1614  self.nextScheduleIsConditional=True
1615 
1616  self.productionFilterSequence = filterSeq
1617 
1618  return
1619 
1620  def prepare_RECO(self, sequence = "reconstruction"):
1621  ''' Enrich the schedule with reconstruction '''
1622  self.loadDefaultOrSpecifiedCFF(sequence,self.RECODefaultCFF)
1623  self.scheduleSequence(sequence.split('.')[-1],'reconstruction_step')
1624  return
1625 
1626  def prepare_RECOSIM(self, sequence = "recosim"):
1627  ''' Enrich the schedule with reconstruction '''
1628  self.loadDefaultOrSpecifiedCFF(sequence,self.RECOSIMDefaultCFF)
1629  self.scheduleSequence(sequence.split('.')[-1],'recosim_step')
1630  return
1631 
1632  def prepare_RECOBEFMIX(self, sequence = "reconstruction"):
1633  ''' Enrich the schedule with the part of reconstruction that is done before mixing in FastSim'''
1634  if not self._options.fast:
1635  print("ERROR: this step is only implemented for FastSim")
1636  sys.exit()
1638  self.scheduleSequence(sequence.split('.')[-1],'reconstruction_befmix_step')
1639  return
1640 
1641  def prepare_PAT(self, sequence = "miniAOD"):
1642  ''' Enrich the schedule with PAT '''
1643  self.prepare_PATFILTER(self)
1644  self.loadDefaultOrSpecifiedCFF(sequence,self.PATDefaultCFF)
1645  self.labelsToAssociate.append('patTask')
1646  if not self._options.runUnscheduled:
1647  raise Exception("MiniAOD production can only run in unscheduled mode, please run cmsDriver with --runUnscheduled")
1648  if self._options.isData:
1649  self._options.customisation_file_unsch.insert(0,"PhysicsTools/PatAlgos/slimming/miniAOD_tools.miniAOD_customizeAllData")
1650  else:
1651  if self._options.fast:
1652  self._options.customisation_file_unsch.insert(0,"PhysicsTools/PatAlgos/slimming/miniAOD_tools.miniAOD_customizeAllMCFastSim")
1653  else:
1654  self._options.customisation_file_unsch.insert(0,"PhysicsTools/PatAlgos/slimming/miniAOD_tools.miniAOD_customizeAllMC")
1655 
1656  if self._options.hltProcess:
1657  if len(self._options.customise_commands) > 1:
1658  self._options.customise_commands = self._options.customise_commands + " \n"
1659  self._options.customise_commands = self._options.customise_commands + "process.patTrigger.processName = \""+self._options.hltProcess+"\"\n"
1660  self._options.customise_commands = self._options.customise_commands + "process.slimmedPatTrigger.triggerResults= cms.InputTag( 'TriggerResults::"+self._options.hltProcess+"' )\n"
1661  self._options.customise_commands = self._options.customise_commands + "process.patMuons.triggerResults= cms.InputTag( 'TriggerResults::"+self._options.hltProcess+"' )\n"
1662 
1663 # self.renameHLTprocessInSequence(sequence)
1664 
1665  return
1666 
1667  def prepare_PATGEN(self, sequence = "miniGEN"):
1668  ''' Enrich the schedule with PATGEN '''
1669  self.loadDefaultOrSpecifiedCFF(sequence,self.PATGENDefaultCFF) #this is unscheduled
1670  self.labelsToAssociate.append('patGENTask')
1671  if not self._options.runUnscheduled:
1672  raise Exception("MiniGEN production can only run in unscheduled mode, please run cmsDriver with --runUnscheduled")
1673  if self._options.isData:
1674  raise Exception("PATGEN step can only run on MC")
1675  return
1676 
1677  def prepare_NANO(self, sequence = "nanoAOD"):
1678  ''' Enrich the schedule with NANO '''
1679  self.loadDefaultOrSpecifiedCFF(sequence,self.NANODefaultCFF)
1680  self.scheduleSequence(sequence.split('.')[-1],'nanoAOD_step')
1681  custom = "nanoAOD_customizeData" if self._options.isData else "nanoAOD_customizeMC"
1682  if self._options.runUnscheduled:
1683  self._options.customisation_file_unsch.insert(0,"PhysicsTools/NanoAOD/nano_cff."+custom)
1684  else:
1685  self._options.customisation_file.insert(0,"PhysicsTools/NanoAOD/nano_cff."+custom)
1686  if self._options.hltProcess:
1687  if len(self._options.customise_commands) > 1:
1688  self._options.customise_commands = self._options.customise_commands + " \n"
1689  self._options.customise_commands = self._options.customise_commands + "process.unpackedPatTrigger.triggerResults= cms.InputTag( 'TriggerResults::"+self._options.hltProcess+"' )\n"
1690 
1691 
1692  def prepare_EI(self, sequence = None):
1693  ''' Enrich the schedule with event interpretation '''
1694  from Configuration.StandardSequences.EventInterpretation import EventInterpretation
1695  if sequence in EventInterpretation:
1696  self.EIDefaultCFF = EventInterpretation[sequence]
1697  sequence = 'EIsequence'
1698  else:
1699  raise Exception('Cannot set %s event interpretation'%( sequence) )
1700  self.loadDefaultOrSpecifiedCFF(sequence,self.EIDefaultCFF)
1701  self.scheduleSequence(sequence.split('.')[-1],'eventinterpretaion_step')
1702  return
1703 
1704  def prepare_SKIM(self, sequence = "all"):
1705  ''' Enrich the schedule with skimming fragments'''
1706  skimConfig = self.loadDefaultOrSpecifiedCFF(sequence,self.SKIMDefaultCFF)
1707  sequence = sequence.split('.')[-1]
1708 
1709  skimlist=sequence.split('+')
1710 
1711  from Configuration.Skimming.autoSkim import autoSkim
1712  self.expandMapping(skimlist,autoSkim)
1713 
1714  #print "dictionnary for skims:",skimConfig.__dict__
1715  for skim in skimConfig.__dict__:
1716  skimstream = getattr(skimConfig,skim)
1717  if isinstance(skimstream,cms.Path):
1718  #black list the alca path so that they do not appear in the cfg
1719  self.blacklist_paths.append(skimstream)
1720  if (not isinstance(skimstream,cms.FilteredStream)):
1721  continue
1722  shortname = skim.replace('SKIMStream','')
1723  if (sequence=="all"):
1724  self.addExtraStream(skim,skimstream)
1725  elif (shortname in skimlist):
1726  self.addExtraStream(skim,skimstream)
1727  #add a DQM eventcontent for this guy
1728  if self._options.datatier=='DQM':
1729  self.process.load(self.EVTCONTDefaultCFF)
1730  skimstreamDQM = cms.FilteredStream(
1731  responsible = skimstream.responsible,
1732  name = skimstream.name+'DQM',
1733  paths = skimstream.paths,
1734  selectEvents = skimstream.selectEvents,
1735  content = self._options.datatier+'EventContent',
1736  dataTier = cms.untracked.string(self._options.datatier)
1737  )
1738  self.addExtraStream(skim+'DQM',skimstreamDQM)
1739  for i in range(skimlist.count(shortname)):
1740  skimlist.remove(shortname)
1741 
1742 
1743 
1744  if (skimlist.__len__()!=0 and sequence!="all"):
1745  print('WARNING, possible typo with SKIM:'+'+'.join(skimlist))
1746  raise Exception('WARNING, possible typo with SKIM:'+'+'.join(skimlist))
1747 
1748  def prepare_USER(self, sequence = None):
1749  ''' Enrich the schedule with a user defined sequence '''
1750  self.loadDefaultOrSpecifiedCFF(sequence,self.USERDefaultCFF)
1751  self.scheduleSequence(sequence.split('.')[-1],'user_step')
1752  return
1753 
1754  def prepare_POSTRECO(self, sequence = None):
1755  """ Enrich the schedule with the postreco step """
1757  self.scheduleSequence('postreco_generator','postreco_step')
1758  return
1759 
1760 
1761  def prepare_VALIDATION(self, sequence = 'validation'):
1762  print(sequence,"in preparing validation")
1764  from Validation.Configuration.autoValidation import autoValidation
1765  #in case VALIDATION:something:somethingelse -> something,somethingelse
1766  sequence=sequence.split('.')[-1]
1767  if sequence.find(',')!=-1:
1768  prevalSeqName=sequence.split(',')[0].split('+')
1769  valSeqName=sequence.split(',')[1].split('+')
1770  self.expandMapping(prevalSeqName,autoValidation,index=0)
1771  self.expandMapping(valSeqName,autoValidation,index=1)
1772  else:
1773  if '@' in sequence:
1774  prevalSeqName=sequence.split('+')
1775  valSeqName=sequence.split('+')
1776  self.expandMapping(prevalSeqName,autoValidation,index=0)
1777  self.expandMapping(valSeqName,autoValidation,index=1)
1778  else:
1779  postfix=''
1780  if sequence:
1781  postfix='_'+sequence
1782  prevalSeqName=['prevalidation'+postfix]
1783  valSeqName=['validation'+postfix]
1784  if not hasattr(self.process,valSeqName[0]):
1785  prevalSeqName=['']
1786  valSeqName=[sequence]
1787 
1788  def NFI(index):
1789 
1790  if index==0:
1791  return ''
1792  else:
1793  return '%s'%index
1794 
1795 
1796  #rename the HLT process in validation steps
1797  if ('HLT' in self.stepMap and not self._options.fast) or self._options.hltProcess:
1798  for s in valSeqName+prevalSeqName:
1799  if s:
1801  for (i,s) in enumerate(prevalSeqName):
1802  if s:
1803  setattr(self.process,'prevalidation_step%s'%NFI(i), cms.Path( getattr(self.process, s)) )
1804  self.schedule.append(getattr(self.process,'prevalidation_step%s'%NFI(i)))
1805 
1806  for (i,s) in enumerate(valSeqName):
1807  setattr(self.process,'validation_step%s'%NFI(i), cms.EndPath( getattr(self.process, s)))
1808  self.schedule.append(getattr(self.process,'validation_step%s'%NFI(i)))
1809 
1810  #needed in case the miniAODValidation sequence is run starting from AODSIM
1811  if 'PAT' in self.stepMap and not 'RECO' in self.stepMap:
1812  return
1813 
1814  if not 'DIGI' in self.stepMap and not self._options.fast and not any(map( lambda s : s.startswith('genvalid'), valSeqName)):
1815  if self._options.restoreRNDSeeds==False and not self._options.restoreRNDSeeds==True:
1816  self._options.restoreRNDSeeds=True
1817 
1818  if not 'DIGI' in self.stepMap and not self._options.fast:
1819  self.executeAndRemember("process.mix.playback = True")
1820  self.executeAndRemember("process.mix.digitizers = cms.PSet()")
1821  self.executeAndRemember("for a in process.aliases: delattr(process, a)")
1822  self._options.customisation_file.append("SimGeneral/MixingModule/fullMixCustomize_cff.setCrossingFrameOn")
1823 
1824  if hasattr(self.process,"genstepfilter") and len(self.process.genstepfilter.triggerConditions):
1825  #will get in the schedule, smoothly
1826  for (i,s) in enumerate(valSeqName):
1827  getattr(self.process,'validation_step%s'%NFI(i)).insert(0, self.process.genstepfilter)
1828 
1829  return
1830 
1831 
1833  """Visitor that travels within a cms.Sequence, looks for a parameter and replace its value
1834  It will climb down within PSets, VPSets and VInputTags to find its target"""
1835  def __init__(self, paramSearch, paramReplace, verbose=False, whitelist=()):
1836  self._paramReplace = paramReplace
1837  self._paramSearch = paramSearch
1838  self._verbose = verbose
1839  self._whitelist = whitelist
1841  def doIt(self,pset,base):
1842  if isinstance(pset, cms._Parameterizable):
1843  for name in pset.parameters_().keys():
1844  # skip whitelisted parameters
1845  if name in self._whitelist:
1846  continue
1847  # if I use pset.parameters_().items() I get copies of the parameter values
1848  # so I can't modify the nested pset
1849  value = getattr(pset,name)
1850  type = value.pythonTypeName()
1851  if type in ('cms.PSet', 'cms.untracked.PSet'):
1852  self.doIt(value,base+"."+name)
1853  elif type in ('cms.VPSet', 'cms.untracked.VPSet'):
1854  for (i,ps) in enumerate(value): self.doIt(ps, "%s.%s[%d]"%(base,name,i) )
1855  elif type in ('cms.string', 'cms.untracked.string'):
1856  if value.value() == self._paramSearch:
1857  if self._verbose: print("set string process name %s.%s %s ==> %s"% (base, name, value, self._paramReplace))
1858  setattr(pset, name,self._paramReplace)
1859  elif type in ('cms.VInputTag', 'cms.untracked.VInputTag'):
1860  for (i,n) in enumerate(value):
1861  if not isinstance(n, cms.InputTag):
1862  n=cms.InputTag(n)
1863  if n.processName == self._paramSearch:
1864  # VInputTag can be declared as a list of strings, so ensure that n is formatted correctly
1865  if self._verbose:print("set process name %s.%s[%d] %s ==> %s " % (base, name, i, n, self._paramReplace))
1866  setattr(n,"processName",self._paramReplace)
1867  value[i]=n
1868  elif type in ('cms.vstring', 'cms.untracked.vstring'):
1869  for (i,n) in enumerate(value):
1870  if n==self._paramSearch:
1871  getattr(pset,name)[i]=self._paramReplace
1872  elif type in ('cms.InputTag', 'cms.untracked.InputTag'):
1873  if value.processName == self._paramSearch:
1874  if self._verbose: print("set process name %s.%s %s ==> %s " % (base, name, value, self._paramReplace))
1875  setattr(getattr(pset, name),"processName",self._paramReplace)
1876 
1877  def enter(self,visitee):
1878  label = ''
1879  try:
1880  label = visitee.label()
1881  except AttributeError:
1882  label = '<Module not in a Process>'
1883  except:
1884  label = 'other execption'
1885  self.doIt(visitee, label)
1886 
1887  def leave(self,visitee):
1888  pass
1889 
1890  #visit a sequence to repalce all input tags
1891  def renameInputTagsInSequence(self,sequence,oldT="rawDataCollector",newT="rawDataRepacker"):
1892  print("Replacing all InputTag %s => %s"%(oldT,newT))
1893  from PhysicsTools.PatAlgos.tools.helpers import massSearchReplaceAnyInputTag
1894  massSearchReplaceAnyInputTag(getattr(self.process,sequence),oldT,newT)
1895  loadMe='from PhysicsTools.PatAlgos.tools.helpers import massSearchReplaceAnyInputTag'
1896  if not loadMe in self.additionalCommands:
1897  self.additionalCommands.append(loadMe)
1898  self.additionalCommands.append('massSearchReplaceAnyInputTag(process.%s,"%s","%s",False,True)'%(sequence,oldT,newT))
1899 
1900  #change the process name used to address HLT results in any sequence
1901  def renameHLTprocessInSequence(self,sequence,proc=None,HLTprocess='HLT'):
1902  if self._options.hltProcess:
1903  proc=self._options.hltProcess
1904  else:
1905  proc=self.process.name_()
1906  if proc==HLTprocess: return
1907  # look up all module in dqm sequence
1908  print("replacing %s process name - sequence %s will use '%s'" % (HLTprocess,sequence, proc))
1909  getattr(self.process,sequence).visit(ConfigBuilder.MassSearchReplaceProcessNameVisitor(HLTprocess,proc,whitelist = ("subSystemFolder",)))
1910  if 'from Configuration.Applications.ConfigBuilder import ConfigBuilder' not in self.additionalCommands:
1911  self.additionalCommands.append('from Configuration.Applications.ConfigBuilder import ConfigBuilder')
1912  self.additionalCommands.append('process.%s.visit(ConfigBuilder.MassSearchReplaceProcessNameVisitor("%s", "%s", whitelist = ("subSystemFolder",)))'% (sequence,HLTprocess, proc))
1913 
1914 
1915  def expandMapping(self,seqList,mapping,index=None):
1916  maxLevel=30
1917  level=0
1918  while '@' in repr(seqList) and level<maxLevel:
1919  level+=1
1920  for specifiedCommand in seqList:
1921  if specifiedCommand.startswith('@'):
1922  location=specifiedCommand[1:]
1923  if not location in mapping:
1924  raise Exception("Impossible to map "+location+" from "+repr(mapping))
1925  mappedTo=mapping[location]
1926  if index!=None:
1927  mappedTo=mappedTo[index]
1928  seqList.remove(specifiedCommand)
1929  seqList.extend(mappedTo.split('+'))
1930  break;
1931  if level==maxLevel:
1932  raise Exception("Could not fully expand "+repr(seqList)+" from "+repr(mapping))
1933 
1934  def prepare_DQM(self, sequence = 'DQMOffline'):
1935  # this one needs replacement
1936 
1937  # any 'DQM' job should use DQMStore in non-legacy mode (but not HARVESTING)
1938  self.loadAndRemember("DQMServices/Core/DQMStoreNonLegacy_cff")
1940  sequenceList=sequence.split('.')[-1].split('+')
1941  postSequenceList=sequence.split('.')[-1].split('+')
1942  from DQMOffline.Configuration.autoDQM import autoDQM
1943  self.expandMapping(sequenceList,autoDQM,index=0)
1944  self.expandMapping(postSequenceList,autoDQM,index=1)
1945 
1946  if len(set(sequenceList))!=len(sequenceList):
1947  sequenceList=list(set(sequenceList))
1948  print("Duplicate entries for DQM:, using",sequenceList)
1949 
1950  pathName='dqmoffline_step'
1951  for (i,sequence) in enumerate(sequenceList):
1952  if (i!=0):
1953  pathName='dqmoffline_%d_step'%(i)
1954 
1955  if 'HLT' in self.stepMap.keys() or self._options.hltProcess:
1956  self.renameHLTprocessInSequence(sequence)
1957 
1958  setattr(self.process,pathName, cms.EndPath( getattr(self.process,sequence ) ) )
1959  self.schedule.append(getattr(self.process,pathName))
1960 
1961  if hasattr(self.process,"genstepfilter") and len(self.process.genstepfilter.triggerConditions):
1962  #will get in the schedule, smoothly
1963  getattr(self.process,pathName).insert(0,self.process.genstepfilter)
1964 
1965 
1966  pathName='dqmofflineOnPAT_step'
1967  for (i,sequence) in enumerate(postSequenceList):
1968  #Fix needed to avoid duplication of sequences not defined in autoDQM or without a PostDQM
1969  if (sequenceList[i]==postSequenceList[i]):
1970  continue
1971  if (i!=0):
1972  pathName='dqmofflineOnPAT_%d_step'%(i)
1973 
1974  setattr(self.process,pathName, cms.EndPath( getattr(self.process, sequence ) ) )
1975  self.schedule.append(getattr(self.process,pathName))
1976 
1977  def prepare_HARVESTING(self, sequence = None):
1978  """ Enrich the process with harvesting step """
1979  self.DQMSaverCFF='Configuration/StandardSequences/DQMSaver'+self._options.harvesting+'_cff'
1981 
1982  harvestingConfig = self.loadDefaultOrSpecifiedCFF(sequence,self.HARVESTINGDefaultCFF)
1983  sequence = sequence.split('.')[-1]
1984 
1985  # decide which HARVESTING paths to use
1986  harvestingList = sequence.split("+")
1987  from DQMOffline.Configuration.autoDQM import autoDQM
1988  from Validation.Configuration.autoValidation import autoValidation
1989  import copy
1990  combined_mapping = copy.deepcopy( autoDQM )
1991  combined_mapping.update( autoValidation )
1992  self.expandMapping(harvestingList,combined_mapping,index=-1)
1993 
1994  if len(set(harvestingList))!=len(harvestingList):
1995  harvestingList=list(set(harvestingList))
1996  print("Duplicate entries for HARVESTING, using",harvestingList)
1997 
1998  for name in harvestingList:
1999  if not name in harvestingConfig.__dict__:
2000  print(name,"is not a possible harvesting type. Available are",harvestingConfig.__dict__.keys())
2001  # trigger hard error, like for other sequence types
2002  getattr(self.process, name)
2003  continue
2004  harvestingstream = getattr(harvestingConfig,name)
2005  if isinstance(harvestingstream,cms.Path):
2006  self.schedule.append(harvestingstream)
2007  self.blacklist_paths.append(harvestingstream)
2008  if isinstance(harvestingstream,cms.Sequence):
2009  setattr(self.process,name+"_step",cms.Path(harvestingstream))
2010  self.schedule.append(getattr(self.process,name+"_step"))
2011 
2012  self.scheduleSequence('DQMSaver','dqmsave_step')
2013  return
2014 
2015  def prepare_ALCAHARVEST(self, sequence = None):
2016  """ Enrich the process with AlCaHarvesting step """
2017  harvestingConfig = self.loadAndRemember(self.ALCAHARVESTDefaultCFF)
2018  sequence=sequence.split(".")[-1]
2019 
2020  # decide which AlcaHARVESTING paths to use
2021  harvestingList = sequence.split("+")
2022 
2023 
2024 
2025  from Configuration.AlCa.autoPCL import autoPCL
2026  self.expandMapping(harvestingList,autoPCL)
2027 
2028  for name in harvestingConfig.__dict__:
2029  harvestingstream = getattr(harvestingConfig,name)
2030  if name in harvestingList and isinstance(harvestingstream,cms.Path):
2031  self.schedule.append(harvestingstream)
2032  if isinstance(getattr(harvestingConfig,"ALCAHARVEST" + name + "_dbOutput"), cms.VPSet) and \
2033  isinstance(getattr(harvestingConfig,"ALCAHARVEST" + name + "_metadata"), cms.VPSet):
2034  self.executeAndRemember("process.PoolDBOutputService.toPut.extend(process.ALCAHARVEST" + name + "_dbOutput)")
2035  self.executeAndRemember("process.pclMetadataWriter.recordsToMap.extend(process.ALCAHARVEST" + name + "_metadata)")
2036  else:
2037  self.executeAndRemember("process.PoolDBOutputService.toPut.append(process.ALCAHARVEST" + name + "_dbOutput)")
2038  self.executeAndRemember("process.pclMetadataWriter.recordsToMap.append(process.ALCAHARVEST" + name + "_metadata)")
2039  harvestingList.remove(name)
2040  # append the common part at the end of the sequence
2041  lastStep = getattr(harvestingConfig,"ALCAHARVESTDQMSaveAndMetadataWriter")
2042  self.schedule.append(lastStep)
2043 
2044  if len(harvestingList) != 0 and 'dummyHarvesting' not in harvestingList :
2045  print("The following harvesting could not be found : ", harvestingList)
2046  raise Exception("The following harvesting could not be found : "+str(harvestingList))
2047 
2048 
2049 
2050  def prepare_ENDJOB(self, sequence = 'endOfProcess'):
2052  self.scheduleSequenceAtEnd(sequence.split('.')[-1],'endjob_step')
2053  return
2054 
2055  def finalizeFastSimHLT(self):
2056  self.process.reconstruction = cms.Path(self.process.reconstructionWithFamos)
2057  self.schedule.append(self.process.reconstruction)
2058 
2059 
2060  def build_production_info(self, evt_type, evtnumber):
2061  """ Add useful info for the production. """
2062  self.process.configurationMetadata=cms.untracked.PSet\
2063  (version=cms.untracked.string("$Revision: 1.19 $"),
2064  name=cms.untracked.string("Applications"),
2065  annotation=cms.untracked.string(evt_type+ " nevts:"+str(evtnumber))
2066  )
2067 
2068  self.addedObjects.append(("Production Info","configurationMetadata"))
2069 
2070 
2071  def create_process(self):
2072  self.pythonCfgCode = "# Auto generated configuration file\n"
2073  self.pythonCfgCode += "# using: \n# "+__version__[1:-1]+"\n# "+__source__[1:-1]+'\n'
2074  self.pythonCfgCode += "# with command line options: "+self._options.arguments+'\n'
2075  self.pythonCfgCode += "import FWCore.ParameterSet.Config as cms\n\n"
2076 
2077  # now set up the modifies
2078  modifiers=[]
2079  modifierStrings=[]
2080  modifierImports=[]
2081 
2082  if hasattr(self._options,"era") and self._options.era :
2083  # Multiple eras can be specified in a comma seperated list
2084  from Configuration.StandardSequences.Eras import eras
2085  for requestedEra in self._options.era.split(",") :
2086  modifierStrings.append(requestedEra)
2087  modifierImports.append(eras.pythonCfgLines[requestedEra])
2088  modifiers.append(getattr(eras,requestedEra))
2089 
2090 
2091  if hasattr(self._options,"procModifiers") and self._options.procModifiers:
2092  import importlib
2093  thingsImported=[]
2094  for pm in self._options.procModifiers.split(','):
2095  modifierStrings.append(pm)
2096  modifierImports.append('from Configuration.ProcessModifiers.'+pm+'_cff import '+pm)
2097  modifiers.append(getattr(importlib.import_module('Configuration.ProcessModifiers.'+pm+'_cff'),pm))
2098 
2099  self.pythonCfgCode += '\n'.join(modifierImports)+'\n\n'
2100  self.pythonCfgCode += "process = cms.Process('"+self._options.name+"'" # Start of the line, finished after the loop
2101 
2102 
2103  if len(modifierStrings)>0:
2104  self.pythonCfgCode+= ','+','.join(modifierStrings)
2105  self.pythonCfgCode+=')\n\n'
2106 
2107  #yes, the cfg code gets out of sync here if a process is passed in. That could be fixed in the future
2108  #assuming there is some way for the fwk to get the list of modifiers (and their stringified name)
2109  if self.process == None:
2110  if len(modifiers)>0:
2111  self.process = cms.Process(self._options.name,*modifiers)
2112  else:
2113  self.process = cms.Process(self._options.name)
2114 
2115 
2116 
2117 
2118  def prepare(self, doChecking = False):
2119  """ Prepare the configuration string and add missing pieces."""
2120 
2121  self.loadAndRemember(self.EVTCONTDefaultCFF) #load the event contents regardless
2122  self.addMaxEvents()
2123  if self.with_input:
2124  self.addSource()
2125  self.addStandardSequences()
2126 
2127  self.completeInputCommand()
2128  self.addConditions()
2129 
2130 
2131  outputModuleCfgCode=""
2132  if not 'HARVESTING' in self.stepMap.keys() and not 'ALCAHARVEST' in self.stepMap.keys() and not 'ALCAOUTPUT' in self.stepMap.keys() and self.with_output:
2133  outputModuleCfgCode=self.addOutput()
2134 
2135  self.addCommon()
2136 
2137  self.pythonCfgCode += "# import of standard configurations\n"
2138  for module in self.imports:
2139  self.pythonCfgCode += ("process.load('"+module+"')\n")
2140 
2141  # production info
2142  if not hasattr(self.process,"configurationMetadata"):
2143  self.build_production_info(self._options.evt_type, self._options.number)
2144  else:
2145  #the PSet was added via a load
2146  self.addedObjects.append(("Production Info","configurationMetadata"))
2147 
2148  self.pythonCfgCode +="\n"
2149  for comment,object in self.addedObjects:
2150  if comment!="":
2151  self.pythonCfgCode += "\n# "+comment+"\n"
2152  self.pythonCfgCode += dumpPython(self.process,object)
2153 
2154  # dump the output definition
2155  self.pythonCfgCode += "\n# Output definition\n"
2156  self.pythonCfgCode += outputModuleCfgCode
2157 
2158  # dump all additional outputs (e.g. alca or skim streams)
2159  self.pythonCfgCode += "\n# Additional output definition\n"
2160  #I do not understand why the keys are not normally ordered.
2161  nl=sorted(self.additionalOutputs.keys())
2162  for name in nl:
2163  output = self.additionalOutputs[name]
2164  self.pythonCfgCode += "process.%s = %s" %(name, output.dumpPython())
2165  tmpOut = cms.EndPath(output)
2166  setattr(self.process,name+'OutPath',tmpOut)
2167  self.schedule.append(tmpOut)
2168 
2169  # dump all additional commands
2170  self.pythonCfgCode += "\n# Other statements\n"
2171  for command in self.additionalCommands:
2172  self.pythonCfgCode += command + "\n"
2173 
2174  #comma separated list of objects that deserve to be inlined in the configuration (typically from a modified config deep down)
2175  for object in self._options.inlineObjets.split(','):
2176  if not object:
2177  continue
2178  if not hasattr(self.process,object):
2179  print('cannot inline -'+object+'- : not known')
2180  else:
2181  self.pythonCfgCode +='\n'
2182  self.pythonCfgCode +=dumpPython(self.process,object)
2183 
2184  # dump all paths
2185  self.pythonCfgCode += "\n# Path and EndPath definitions\n"
2186  for path in self.process.paths:
2187  if getattr(self.process,path) not in self.blacklist_paths:
2188  self.pythonCfgCode += dumpPython(self.process,path)
2189 
2190  for endpath in self.process.endpaths:
2191  if getattr(self.process,endpath) not in self.blacklist_paths:
2192  self.pythonCfgCode += dumpPython(self.process,endpath)
2193 
2194  # dump the schedule
2195  self.pythonCfgCode += "\n# Schedule definition\n"
2196  result = "process.schedule = cms.Schedule("
2197 
2198  # handling of the schedule
2199  self.process.schedule = cms.Schedule()
2200  for item in self.schedule:
2201  if not isinstance(item, cms.Schedule):
2202  self.process.schedule.append(item)
2203  else:
2204  self.process.schedule.extend(item)
2205 
2206  if hasattr(self.process,"HLTSchedule"):
2207  beforeHLT = self.schedule[:self.schedule.index(self.process.HLTSchedule)]
2208  afterHLT = self.schedule[self.schedule.index(self.process.HLTSchedule)+1:]
2209  pathNames = ['process.'+p.label_() for p in beforeHLT]
2210  result += ','.join(pathNames)+')\n'
2211  result += 'process.schedule.extend(process.HLTSchedule)\n'
2212  pathNames = ['process.'+p.label_() for p in afterHLT]
2213  result += 'process.schedule.extend(['+','.join(pathNames)+'])\n'
2214  else:
2215  pathNames = ['process.'+p.label_() for p in self.schedule]
2216  result ='process.schedule = cms.Schedule('+','.join(pathNames)+')\n'
2217 
2218  self.pythonCfgCode += result
2219 
2220  for labelToAssociate in self.labelsToAssociate:
2221  self.process.schedule.associate(getattr(self.process, labelToAssociate))
2222  self.pythonCfgCode += 'process.schedule.associate(process.' + labelToAssociate + ')\n'
2223 
2224  from PhysicsTools.PatAlgos.tools.helpers import associatePatAlgosToolsTask
2226  self.pythonCfgCode+="from PhysicsTools.PatAlgos.tools.helpers import associatePatAlgosToolsTask\n"
2227  self.pythonCfgCode+="associatePatAlgosToolsTask(process)\n"
2228 
2229  if self._options.nThreads is not "1":
2230  self.pythonCfgCode +="\n"
2231  self.pythonCfgCode +="#Setup FWK for multithreaded\n"
2232  self.pythonCfgCode +="process.options.numberOfThreads=cms.untracked.uint32("+self._options.nThreads+")\n"
2233  self.pythonCfgCode +="process.options.numberOfStreams=cms.untracked.uint32("+self._options.nStreams+")\n"
2234  self.pythonCfgCode +="process.options.numberOfConcurrentLuminosityBlocks=cms.untracked.uint32("+self._options.nConcurrentLumis+")\n"
2235  if int(self._options.nConcurrentLumis) > 1:
2236  self.pythonCfgCode +="if hasattr(process, 'DQMStore'): process.DQMStore.assertLegacySafe=cms.untracked.bool(False)\n"
2237  self.process.options.numberOfThreads=cms.untracked.uint32(int(self._options.nThreads))
2238  self.process.options.numberOfStreams=cms.untracked.uint32(int(self._options.nStreams))
2239  self.process.options.numberOfConcurrentLuminosityBlocks=cms.untracked.uint32(int(self._options.nConcurrentLumis))
2240  #repacked version
2241  if self._options.isRepacked:
2242  self.pythonCfgCode +="\n"
2243  self.pythonCfgCode +="from Configuration.Applications.ConfigBuilder import MassReplaceInputTag\n"
2244  self.pythonCfgCode +="MassReplaceInputTag(process, new=\"rawDataMapperByLabel\", old=\"rawDataCollector\")\n"
2245  MassReplaceInputTag(self.process, new="rawDataMapperByLabel", old="rawDataCollector")
2246 
2247  # special treatment in case of production filter sequence 2/2
2248  if self.productionFilterSequence:
2249  self.pythonCfgCode +='# filter all path with the production filter sequence\n'
2250  self.pythonCfgCode +='for path in process.paths:\n'
2251  if len(self.conditionalPaths):
2252  self.pythonCfgCode +='\tif not path in %s: continue\n'%str(self.conditionalPaths)
2253  if len(self.excludedPaths):
2254  self.pythonCfgCode +='\tif path in %s: continue\n'%str(self.excludedPaths)
2255  self.pythonCfgCode +='\tgetattr(process,path).insert(0, process.%s)\n'%(self.productionFilterSequence,)
2256  pfs = getattr(self.process,self.productionFilterSequence)
2257  for path in self.process.paths:
2258  if not path in self.conditionalPaths: continue
2259  if path in self.excludedPaths: continue
2260  getattr(self.process,path).insert(0, pfs)
2261 
2262 
2263  # dump customise fragment
2264  self.pythonCfgCode += self.addCustomise()
2265 
2266  if self._options.runUnscheduled:
2267  # prune and delete paths
2268  #this is not supporting the blacklist at this point since I do not understand it
2269  self.pythonCfgCode+="#do not add changes to your config after this point (unless you know what you are doing)\n"
2270  self.pythonCfgCode+="from FWCore.ParameterSet.Utilities import convertToUnscheduled\n"
2271  self.pythonCfgCode+="process=convertToUnscheduled(process)\n"
2272 
2273  from FWCore.ParameterSet.Utilities import convertToUnscheduled
2275 
2276  self.pythonCfgCode += self.addCustomise(1)
2277 
2278  self.pythonCfgCode += self.addCustomiseCmdLine()
2279 
2280  if hasattr(self.process,"logErrorHarvester"):
2281  #configure logErrorHarvester to wait for same EDProducers to finish as the OutputModules
2282  self.pythonCfgCode +="\n#Have logErrorHarvester wait for the same EDProducers to finish as those providing data for the OutputModule\n"
2283  self.pythonCfgCode +="from FWCore.Modules.logErrorHarvester_cff import customiseLogErrorHarvesterUsingOutputCommands\n"
2284  self.pythonCfgCode +="process = customiseLogErrorHarvesterUsingOutputCommands(process)\n"
2285  from FWCore.Modules.logErrorHarvester_cff import customiseLogErrorHarvesterUsingOutputCommands
2287 
2288  # Temporary hack to put the early delete customization after
2289  # everything else
2290  #
2291  # FIXME: remove when no longer needed
2292  self.pythonCfgCode += "\n# Add early deletion of temporary data products to reduce peak memory need\n"
2293  self.pythonCfgCode += "from Configuration.StandardSequences.earlyDeleteSettings_cff import customiseEarlyDelete\n"
2294  self.pythonCfgCode += "process = customiseEarlyDelete(process)\n"
2295  self.pythonCfgCode += "# End adding early deletion\n"
2296  from Configuration.StandardSequences.earlyDeleteSettings_cff import customiseEarlyDelete
2297  self.process = customiseEarlyDelete(self.process)
2298 
2299  imports = cms.specialImportRegistry.getSpecialImports()
2300  if len(imports) > 0:
2301  #need to inject this at the top
2302  index = self.pythonCfgCode.find("import FWCore.ParameterSet.Config")
2303  #now find the end of line
2304  index = self.pythonCfgCode.find("\n",index)
2305  self.pythonCfgCode = self.pythonCfgCode[:index]+ "\n" + "\n".join(imports)+"\n" +self.pythonCfgCode[index:]
2306 
2307 
2308  # make the .io file
2309 
2310  if self._options.io:
2311  #io=open(self._options.python_filename.replace('.py','.io'),'w')
2312  if not self._options.io.endswith('.io'): self._option.io+='.io'
2313  io=open(self._options.io,'w')
2314  ioJson={}
2315  if hasattr(self.process.source,"fileNames"):
2316  if len(self.process.source.fileNames.value()):
2317  ioJson['primary']=self.process.source.fileNames.value()
2318  if hasattr(self.process.source,"secondaryFileNames"):
2319  if len(self.process.source.secondaryFileNames.value()):
2320  ioJson['secondary']=self.process.source.secondaryFileNames.value()
2321  if self._options.pileup_input and (self._options.pileup_input.startswith('dbs:') or self._options.pileup_input.startswith('das:')):
2322  ioJson['pileup']=self._options.pileup_input[4:]
2323  for (o,om) in self.process.outputModules_().items():
2324  ioJson[o]=om.fileName.value()
2325  ioJson['GT']=self.process.GlobalTag.globaltag.value()
2326  if self.productionFilterSequence:
2327  ioJson['filter']=self.productionFilterSequence
2328  import json
2329  io.write(json.dumps(ioJson))
2330  return
2331 
2332 
ConfigBuilder.ConfigBuilder.GENDefaultSeq
GENDefaultSeq
Definition: ConfigBuilder.py:961
helpers.associatePatAlgosToolsTask
def associatePatAlgosToolsTask(process)
Definition: helpers.py:25
ConfigBuilder.ConfigBuilder.RECODefaultSeq
RECODefaultSeq
Definition: ConfigBuilder.py:976
LumiList.LumiList
Definition: LumiList.py:22
ConfigBuilder.ConfigBuilder.DIGIDefaultSeq
DIGIDefaultSeq
Definition: ConfigBuilder.py:963
ConfigBuilder.ConfigBuilder.prepare_GEN
def prepare_GEN(self, sequence=None)
Definition: ConfigBuilder.py:1319
ConfigBuilder.ConfigBuilder.VALIDATIONDefaultSeq
VALIDATIONDefaultSeq
Definition: ConfigBuilder.py:984
ConfigBuilder.ConfigBuilder.prepare_CFWRITER
def prepare_CFWRITER(self, sequence=None)
Definition: ConfigBuilder.py:1437
ConfigBuilder.ConfigBuilder.RECODefaultCFF
RECODefaultCFF
Definition: ConfigBuilder.py:936
FastTimerService_cff.range
range
Definition: FastTimerService_cff.py:34
ConfigBuilder.ConfigBuilder.prepare_L1Reco
def prepare_L1Reco(self, sequence="L1Reco")
Definition: ConfigBuilder.py:1577
ConfigBuilder.ConfigBuilder.MassSearchReplaceProcessNameVisitor.enter
def enter(self, visitee)
Definition: ConfigBuilder.py:1878
logErrorHarvester_cff.customiseLogErrorHarvesterUsingOutputCommands
def customiseLogErrorHarvesterUsingOutputCommands(process)
Definition: logErrorHarvester_cff.py:5
ConfigBuilder.ConfigBuilder.MassSearchReplaceProcessNameVisitor._whitelist
_whitelist
Definition: ConfigBuilder.py:1840
ConfigBuilder.ConfigBuilder.prepare_EI
def prepare_EI(self, sequence=None)
Definition: ConfigBuilder.py:1693
ConfigBuilder.ConfigBuilder.finalizeFastSimHLT
def finalizeFastSimHLT(self)
Definition: ConfigBuilder.py:2056
ConfigBuilder.ConfigBuilder.NANODefaultCFF
NANODefaultCFF
Definition: ConfigBuilder.py:939
resolutioncreator_cfi.object
object
Definition: resolutioncreator_cfi.py:4
ConfigBuilder.ConfigBuilder.EVTCONTDefaultCFF
EVTCONTDefaultCFF
Definition: ConfigBuilder.py:991
ConfigBuilder.ConfigBuilder.REPACKDefaultSeq
REPACKDefaultSeq
Definition: ConfigBuilder.py:986
ConfigBuilder.ConfigBuilder.addMaxEvents
def addMaxEvents(self)
Definition: ConfigBuilder.py:366
ConfigBuilder.ConfigBuilder.LHEDefaultSeq
LHEDefaultSeq
Definition: ConfigBuilder.py:960
ConfigBuilder.ConfigBuilder.additionalOutputs
additionalOutputs
Definition: ConfigBuilder.py:262
GlobalTag
ConfigBuilder.ConfigBuilder.productionFilterSequence
productionFilterSequence
put it before all the other paths
Definition: ConfigBuilder.py:264
ConfigBuilder.ConfigBuilder.DQMDefaultSeq
DQMDefaultSeq
Definition: ConfigBuilder.py:983
ConfigBuilder.ConfigBuilder.prepare_RECOSIM
def prepare_RECOSIM(self, sequence="recosim")
Definition: ConfigBuilder.py:1627
ConfigBuilder.ConfigBuilder.prepare_VALIDATION
def prepare_VALIDATION(self, sequence='validation')
Definition: ConfigBuilder.py:1762
ConfigBuilder.ConfigBuilder.VALIDATIONDefaultCFF
VALIDATIONDefaultCFF
Definition: ConfigBuilder.py:943
ConfigBuilder.ConfigBuilder.prepare_LHE
def prepare_LHE(self, sequence=None)
Definition: ConfigBuilder.py:1302
ConfigBuilder.ConfigBuilder.prepare_REPACK
def prepare_REPACK(self, sequence=None)
Definition: ConfigBuilder.py:1466
ConfigBuilder.ConfigBuilder.HARVESTINGDefaultCFF
HARVESTINGDefaultCFF
Definition: ConfigBuilder.py:946
ConfigBuilder.ConfigBuilder.MassSearchReplaceProcessNameVisitor.__init__
def __init__(self, paramSearch, paramReplace, verbose=False, whitelist=())
Definition: ConfigBuilder.py:1836
ConfigBuilder.ConfigBuilder.GENDefaultCFF
GENDefaultCFF
Definition: ConfigBuilder.py:925
ConfigBuilder.ConfigBuilder.MassSearchReplaceProcessNameVisitor.doIt
def doIt(self, pset, base)
Definition: ConfigBuilder.py:1842
ConfigBuilder.ConfigBuilder.prepare_DIGI2RAW
def prepare_DIGI2RAW(self, sequence=None)
Definition: ConfigBuilder.py:1461
ConfigBuilder.ConfigBuilder.addCommon
def addCommon(self)
Definition: ConfigBuilder.py:337
ConfigBuilder.ConfigBuilder.stepMap
stepMap
Definition: ConfigBuilder.py:223
ConfigBuilder.ConfigBuilder.L1TrackTriggerDefaultSeq
L1TrackTriggerDefaultSeq
Definition: ConfigBuilder.py:974
ConfigBuilder.ConfigBuilder.MassSearchReplaceProcessNameVisitor._paramSearch
_paramSearch
Definition: ConfigBuilder.py:1838
ConfigBuilder.ConfigBuilder.SIMDefaultSeq
SIMDefaultSeq
Definition: ConfigBuilder.py:962
join
static std::string join(char **cmd)
Definition: RemoteFile.cc:17
ConfigBuilder.ConfigBuilder
Definition: ConfigBuilder.py:193
ConfigBuilder.ConfigBuilder.geometryDBLabel
geometryDBLabel
Definition: ConfigBuilder.py:1059
cms::cuda::assert
assert(be >=bs)
ConfigBuilder.ConfigBuilder.RAW2DIGIDefaultSeq
RAW2DIGIDefaultSeq
Definition: ConfigBuilder.py:972
ConfigBuilder.ConfigBuilder.ALCAHARVESTDefaultSeq
ALCAHARVESTDefaultSeq
Definition: ConfigBuilder.py:970
relativeConstraints.keys
keys
Definition: relativeConstraints.py:89
ConfigBuilder.ConfigBuilder.pythonCfgCode
pythonCfgCode
Definition: ConfigBuilder.py:2073
ConfigBuilder.ConfigBuilder.PATGENDefaultCFF
PATGENDefaultCFF
Definition: ConfigBuilder.py:1001
earlyDeleteSettings_cff.customiseEarlyDelete
def customiseEarlyDelete(process)
Definition: earlyDeleteSettings_cff.py:41
ConfigBuilder.ConfigBuilder.with_input
with_input
Definition: ConfigBuilder.py:248
cms::dd::split
std::vector< std::string_view > split(std::string_view, const char *)
ConfigBuilder.ConfigBuilder.build_production_info
def build_production_info(self, evt_type, evtnumber)
Definition: ConfigBuilder.py:2061
ConfigBuilder.ConfigBuilder.executeAndRemember
def executeAndRemember(self, command)
Definition: ConfigBuilder.py:328
ConfigBuilder.ConfigBuilder.renameHLTprocessInSequence
def renameHLTprocessInSequence(self, sequence, proc=None, HLTprocess='HLT')
Definition: ConfigBuilder.py:1902
spr::find
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:19
ConfigBuilder.filesFromList
def filesFromList(fileName, s=None)
Definition: ConfigBuilder.py:100
ConfigBuilder.filesFromDASQuery
def filesFromDASQuery(query, option="", s=None)
Definition: ConfigBuilder.py:134
ConfigBuilder.ConfigBuilder.RECOBEFMIXDefaultCFF
RECOBEFMIXDefaultCFF
Definition: ConfigBuilder.py:1109
mps_monitormerge.items
list items
Definition: mps_monitormerge.py:29
ConfigBuilder.ConfigBuilder.expandMapping
def expandMapping(self, seqList, mapping, index=None)
Definition: ConfigBuilder.py:1916
any
bool any(const std::vector< T > &v, const T &what)
Definition: ECalSD.cc:34
ConfigBuilder.ConfigBuilder.prepare_FILTER
def prepare_FILTER(self, sequence=None)
Definition: ConfigBuilder.py:1589
ConfigBuilder.ConfigBuilder.PATDefaultCFF
PATDefaultCFF
Definition: ConfigBuilder.py:938
ConfigBuilder.ConfigBuilder.NANODefaultSeq
NANODefaultSeq
Definition: ConfigBuilder.py:989
ConfigBuilder.ConfigBuilder.prepare_PATGEN
def prepare_PATGEN(self, sequence="miniGEN")
Definition: ConfigBuilder.py:1668
ConfigBuilder.ConfigBuilder.scheduleSequence
def scheduleSequence(self, seq, prefix, what='Path')
Definition: ConfigBuilder.py:1205
ConfigBuilder.ConfigBuilder.conditionalPaths
conditionalPaths
Definition: ConfigBuilder.py:267
ConfigBuilder.ConfigBuilder.PATGENDefaultSeq
PATGENDefaultSeq
Definition: ConfigBuilder.py:988
ConfigBuilder.ConfigBuilder.RECOSIMDefaultSeq
RECOSIMDefaultSeq
Definition: ConfigBuilder.py:979
ConfigBuilder.ConfigBuilder.MassSearchReplaceProcessNameVisitor._verbose
_verbose
Definition: ConfigBuilder.py:1839
ConfigBuilder.ConfigBuilder.addedObjects
addedObjects
Definition: ConfigBuilder.py:261
ConfigBuilder.ConfigBuilder.L1DefaultSeq
L1DefaultSeq
Definition: ConfigBuilder.py:967
CustomConfigs.ProcessName
def ProcessName(process)
Definition: CustomConfigs.py:8
ConfigBuilder.ConfigBuilder.create_process
def create_process(self)
Definition: ConfigBuilder.py:2072
ConfigBuilder.ConfigBuilder.__init__
def __init__(self, options, process=None, with_output=False, with_input=False)
Definition: ConfigBuilder.py:196
ConfigBuilder.Options
Definition: ConfigBuilder.py:20
ConfigBuilder.ConfigBuilder.prepare_ENDJOB
def prepare_ENDJOB(self, sequence='endOfProcess')
Definition: ConfigBuilder.py:2051
ConfigBuilder.ConfigBuilder.CFWRITERDefaultCFF
CFWRITERDefaultCFF
Definition: ConfigBuilder.py:950
ConfigBuilder.ConfigBuilder.ALCAHARVESTDefaultCFF
ALCAHARVESTDefaultCFF
Definition: ConfigBuilder.py:947
ConfigBuilder.ConfigBuilder.magFieldCFF
magFieldCFF
Definition: ConfigBuilder.py:1054
ConfigBuilder.ConfigBuilder.POSTRECODefaultCFF
POSTRECODefaultCFF
Definition: ConfigBuilder.py:942
ConfigBuilder.ConfigBuilder.imports
imports
Definition: ConfigBuilder.py:249
ConfigBuilder.ConfigBuilder.DQMSaverCFF
DQMSaverCFF
Definition: ConfigBuilder.py:1980
ConfigBuilder.ConfigBuilder.prepare_SIM
def prepare_SIM(self, sequence=None)
Definition: ConfigBuilder.py:1401
str
#define str(s)
Definition: TestProcessor.cc:48
ConfigBuilder.ConfigBuilder.loadAndRemember
def loadAndRemember(self, includeFile)
Definition: ConfigBuilder.py:319
ConfigBuilder.ConfigBuilder.ALCADefaultSeq
ALCADefaultSeq
Definition: ConfigBuilder.py:959
ConfigBuilder.ConfigBuilder.ENDJOBDefaultCFF
ENDJOBDefaultCFF
Definition: ConfigBuilder.py:948
ConfigBuilder.ConfigBuilder.L1TrackTriggerDefaultCFF
L1TrackTriggerDefaultCFF
Definition: ConfigBuilder.py:935
ConfigBuilder.ConfigBuilder.addSource
def addSource(self)
Definition: ConfigBuilder.py:373
ConfigBuilder.ConfigBuilder.L1RecoDefaultSeq
L1RecoDefaultSeq
Definition: ConfigBuilder.py:973
ConfigBuilder.ConfigBuilder.prepare_ALCA
def prepare_ALCA(self, sequence=None, workflow='full')
Definition: ConfigBuilder.py:1244
ConfigBuilder.ConfigBuilder.prepare_RECOBEFMIX
def prepare_RECOBEFMIX(self, sequence="reconstruction")
Definition: ConfigBuilder.py:1633
ConfigBuilder.ConfigBuilder.L1REPACKDefaultSeq
L1REPACKDefaultSeq
Definition: ConfigBuilder.py:968
ConfigBuilder.ConfigBuilder.prepare_DIGI
def prepare_DIGI(self, sequence=None)
Definition: ConfigBuilder.py:1417
ConfigBuilder.ConfigBuilder.DIGI2RAWDefaultSeq
DIGI2RAWDefaultSeq
Definition: ConfigBuilder.py:965
ConfigBuilder.ConfigBuilder.ConditionsDefaultCFF
ConditionsDefaultCFF
Definition: ConfigBuilder.py:949
ConfigBuilder.ConfigBuilder.HLTDefaultSeq
HLTDefaultSeq
Definition: ConfigBuilder.py:966
ConfigBuilder.ConfigBuilder.prepare_SKIM
def prepare_SKIM(self, sequence="all")
Definition: ConfigBuilder.py:1705
ConfigBuilder.ConfigBuilder.L1EMDefaultCFF
L1EMDefaultCFF
Definition: ConfigBuilder.py:929
GlobalTag
Definition: GlobalTag.h:4
ConfigBuilder.ConfigBuilder.addOutput
def addOutput(self)
Definition: ConfigBuilder.py:501
DictTypes.SortedKeysDict
Definition: DictTypes.py:3
ConfigBuilder.ConfigBuilder.prepare_RECO
def prepare_RECO(self, sequence="reconstruction")
Definition: ConfigBuilder.py:1621
ConfigBuilder.ConfigBuilder.prepare_L1HwVal
def prepare_L1HwVal(self, sequence='L1HwVal')
Definition: ConfigBuilder.py:1570
ConfigBuilder.ConfigBuilder.excludedPaths
excludedPaths
Definition: ConfigBuilder.py:268
ConfigBuilder.ConfigBuilder.prepare_L1
def prepare_L1(self, sequence=None)
Definition: ConfigBuilder.py:1471
ConfigBuilder.ConfigBuilder.RECOBEFMIXDefaultSeq
RECOBEFMIXDefaultSeq
Definition: ConfigBuilder.py:1110
Mixing.defineMixing
def defineMixing(dict)
Definition: Mixing.py:186
Exception
mps_setup.append
append
Definition: mps_setup.py:85
ConfigBuilder.ConfigBuilder.EIDefaultCFF
EIDefaultCFF
Definition: ConfigBuilder.py:940
ConfigBuilder.ConfigBuilder.with_output
with_output
Definition: ConfigBuilder.py:243
ConfigBuilder.ConfigBuilder.define_Configs
def define_Configs(self)
Definition: ConfigBuilder.py:911
ConfigBuilder.ConfigBuilder.loadDefaultOrSpecifiedCFF
def loadDefaultOrSpecifiedCFF(self, sequence, defaultCFF)
Definition: ConfigBuilder.py:1193
ConfigBuilder.ConfigBuilder.profileOptions
def profileOptions(self)
Definition: ConfigBuilder.py:270
createfilelist.int
int
Definition: createfilelist.py:10
FrontierConditions_GlobalTag_cff.file
file
Definition: FrontierConditions_GlobalTag_cff.py:13
metFilterPaths_cff
ConfigBuilder.ConfigBuilder.L1RecoDefaultCFF
L1RecoDefaultCFF
Definition: ConfigBuilder.py:934
ConfigBuilder.ConfigBuilder.prepare_ALCAOUTPUT
def prepare_ALCAOUTPUT(self, sequence=None)
Definition: ConfigBuilder.py:1241
ConfigBuilder.ConfigBuilder.scheduleSequenceAtEnd
def scheduleSequenceAtEnd(self, seq, prefix)
Definition: ConfigBuilder.py:1234
ConfigBuilder.ConfigBuilder.addCustomiseCmdLine
def addCustomiseCmdLine(self)
Definition: ConfigBuilder.py:896
ConfigBuilder.ConfigBuilder.prepare_HLT
def prepare_HLT(self, sequence=None)
Definition: ConfigBuilder.py:1491
helpers
ConfigBuilder.anyOf
def anyOf(listOfKeys, dict, opt=None)
Definition: ConfigBuilder.py:182
ConfigBuilder.ConfigBuilder.DATAMIXDefaultSeq
DATAMIXDefaultSeq
Definition: ConfigBuilder.py:964
ConfigBuilder.ConfigBuilder.POSTRECODefaultSeq
POSTRECODefaultSeq
Definition: ConfigBuilder.py:981
ConfigBuilder.ConfigBuilder.prepare_POSTRECO
def prepare_POSTRECO(self, sequence=None)
Definition: ConfigBuilder.py:1755
ConfigBuilder.ConfigBuilder.HLTDefaultCFF
HLTDefaultCFF
Definition: ConfigBuilder.py:931
TriggerAnalyzer.__str__
def __str__(self)
Definition: TriggerAnalyzer.py:103
ConfigBuilder.ConfigBuilder.SKIMDefaultCFF
SKIMDefaultCFF
Definition: ConfigBuilder.py:941
ConfigBuilder.ConfigBuilder.prepare_ALCAPRODUCER
def prepare_ALCAPRODUCER(self, sequence=None)
Definition: ConfigBuilder.py:1238
ConfigBuilder.ConfigBuilder.RAW2DIGIDefaultCFF
RAW2DIGIDefaultCFF
Definition: ConfigBuilder.py:932
ConfigBuilder.ConfigBuilder.EIDefaultSeq
EIDefaultSeq
Definition: ConfigBuilder.py:980
ConfigBuilder.ConfigBuilder.stepKeys
stepKeys
Definition: ConfigBuilder.py:224
ConfigBuilder.ConfigBuilder.prepare_DQM
def prepare_DQM(self, sequence='DQMOffline')
Definition: ConfigBuilder.py:1935
ConfigBuilder.ConfigBuilder.DQMOFFLINEDefaultCFF
DQMOFFLINEDefaultCFF
Definition: ConfigBuilder.py:945
ConfigBuilder.ConfigBuilder.MassSearchReplaceProcessNameVisitor
Definition: ConfigBuilder.py:1833
ConfigBuilder.ConfigBuilder.labelsToAssociate
labelsToAssociate
Definition: ConfigBuilder.py:265
ConfigBuilder.ConfigBuilder.renameInputTagsInSequence
def renameInputTagsInSequence(self, sequence, oldT="rawDataCollector", newT="rawDataRepacker")
Definition: ConfigBuilder.py:1892
ConfigBuilder.ConfigBuilder.RAW2RECODefaultSeq
RAW2RECODefaultSeq
Definition: ConfigBuilder.py:1044
edm::print
S & print(S &os, JobReport::InputFile const &f)
Definition: JobReport.cc:66
ComparisonHelper::zip
OutputIterator zip(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp)
Definition: L1TStage2CaloLayer1.h:38
ConfigBuilder.ConfigBuilder.USERDefaultSeq
USERDefaultSeq
Definition: ConfigBuilder.py:1046
ConfigBuilder.ConfigBuilder.DIGIDefaultCFF
DIGIDefaultCFF
Definition: ConfigBuilder.py:927
ConfigBuilder.ConfigBuilder.L1MENUDefaultCFF
L1MENUDefaultCFF
Definition: ConfigBuilder.py:930
miniAOD_tools.miniAOD_customizeOutput
def miniAOD_customizeOutput(out)
Definition: miniAOD_tools.py:527
ConfigBuilder.ConfigBuilder.additionalCommands
additionalCommands
Definition: ConfigBuilder.py:258
ConfigBuilder.ConfigBuilder.load
def load(self, includeFile)
Definition: ConfigBuilder.py:314
ConfigBuilder.ConfigBuilder.REDIGIDefaultSeq
REDIGIDefaultSeq
Definition: ConfigBuilder.py:1125
ConfigBuilder.ConfigBuilder.HARVESTINGDefaultSeq
HARVESTINGDefaultSeq
Definition: ConfigBuilder.py:969
ConfigBuilder.ConfigBuilder.PATDefaultSeq
PATDefaultSeq
Definition: ConfigBuilder.py:987
ConfigBuilder.ConfigBuilder.MassSearchReplaceProcessNameVisitor.leave
def leave(self, visitee)
Definition: ConfigBuilder.py:1888
ConfigBuilder.ConfigBuilder.SimGeometryCFF
SimGeometryCFF
Definition: ConfigBuilder.py:1084
ConfigBuilder.ConfigBuilder.prepare_HARVESTING
def prepare_HARVESTING(self, sequence=None)
Definition: ConfigBuilder.py:1978
cmsswConfigtrace.convertToUnscheduled
def convertToUnscheduled(proc)
Definition: cmsswConfigtrace.py:110
ConfigBuilder.ConfigBuilder.L1HwValDefaultSeq
L1HwValDefaultSeq
Definition: ConfigBuilder.py:982
ConfigBuilder.dumpPython
def dumpPython(process, name)
Definition: ConfigBuilder.py:92
ConfigBuilder.ConfigBuilder.runsAndWeights
runsAndWeights
drop LHEXMLStringProduct on input to save memory if appropriate
Definition: ConfigBuilder.py:479
ConfigBuilder.ConfigBuilder._options
_options
Definition: ConfigBuilder.py:201
ThrowAndSetRandomRun.throwAndSetRandomRun
def throwAndSetRandomRun(source, runsAndProbs)
Definition: ThrowAndSetRandomRun.py:7
ConfigBuilder.ConfigBuilder.L1HwValDefaultCFF
L1HwValDefaultCFF
Definition: ConfigBuilder.py:944
ConfigBuilder.ConfigBuilder.ALCADefaultCFF
ALCADefaultCFF
Definition: ConfigBuilder.py:924
edm::eventsetup::heterocontainer::insert
bool insert(Storage &iStorage, ItemType *iItem, const IdTag &iIdTag)
Definition: HCMethods.h:50
ConfigBuilder.ConfigBuilder.prepare_PAT
def prepare_PAT(self, sequence="miniAOD")
Definition: ConfigBuilder.py:1642
ConfigBuilder.ConfigBuilder.blacklist_paths
blacklist_paths
Definition: ConfigBuilder.py:260
MassReplace.massSearchReplaceAnyInputTag
def massSearchReplaceAnyInputTag(sequence, oldInputTag, newInputTag, verbose=False, moduleLabelOnly=False, skipLabelTest=False)
Definition: MassReplace.py:79
ConfigBuilder.ConfigBuilder.USERDefaultCFF
USERDefaultCFF
Definition: ConfigBuilder.py:1047
ConfigBuilder.ConfigBuilder.addCustomise
def addCustomise(self, unsch=0)
Definition: ConfigBuilder.py:823
ConfigBuilder.ConfigBuilder.prepare_ALCAHARVEST
def prepare_ALCAHARVEST(self, sequence=None)
Definition: ConfigBuilder.py:2016
ConfigBuilder.ConfigBuilder.completeInputCommand
def completeInputCommand(self)
Definition: ConfigBuilder.py:778
ConfigBuilder.ConfigBuilder.nextScheduleIsConditional
nextScheduleIsConditional
put the filtering path in the schedule
Definition: ConfigBuilder.py:266
AlignmentPI::index
index
Definition: AlignmentPayloadInspectorHelper.h:46
ConfigBuilder.ConfigBuilder.RECOSIMDefaultCFF
RECOSIMDefaultCFF
Definition: ConfigBuilder.py:937
ConfigBuilder.ConfigBuilder.prepare
def prepare(self, doChecking=False)
Definition: ConfigBuilder.py:2119
ConfigBuilder.ConfigBuilder.MassSearchReplaceProcessNameVisitor._paramReplace
_paramReplace
Definition: ConfigBuilder.py:1837
ConfigBuilder.ConfigBuilder.addExtraStream
def addExtraStream(self, name, stream, workflow='full')
Definition: ConfigBuilder.py:1128
list
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger list("!*", "!HLTx*" if it matches 2 triggers or more) will accept the event if all the matching triggers are FAIL. It will reject the event if any of the triggers are PASS or EXCEPTION(this matches the behavior of "!*" before the partial wildcard feature was incorporated). Triggers which are in the READY state are completely ignored.(READY should never be returned since the trigger paths have been run
ConfigBuilder.ConfigBuilder.process
process
adding standard sequences might change the inputEventContent option and therefore needs to be finaliz...
Definition: ConfigBuilder.py:244
ConfigBuilder.ConfigBuilder.addStandardSequences
def addStandardSequences(self)
Definition: ConfigBuilder.py:683
genParticles_cff.map
map
Definition: genParticles_cff.py:11
ConfigBuilder.ConfigBuilder.prepare_NANO
def prepare_NANO(self, sequence="nanoAOD")
Definition: ConfigBuilder.py:1678
ConfigBuilder.ConfigBuilder.prepare_RAW2RECO
def prepare_RAW2RECO(self, sequence=None)
Definition: ConfigBuilder.py:1546
ConfigBuilder.ConfigBuilder.prepare_DATAMIX
def prepare_DATAMIX(self, sequence=None)
Definition: ConfigBuilder.py:1443
ConfigBuilder.ConfigBuilder.REPACKDefaultCFF
REPACKDefaultCFF
Definition: ConfigBuilder.py:951
ConfigBuilder.ConfigBuilder.DATAMIXDefaultCFF
DATAMIXDefaultCFF
Definition: ConfigBuilder.py:954
ConfigBuilder.ConfigBuilder.prepare_L1REPACK
def prepare_L1REPACK(self, sequence=None)
Definition: ConfigBuilder.py:1478
ConfigBuilder.ConfigBuilder.GeometryCFF
GeometryCFF
Definition: ConfigBuilder.py:1058
ConfigBuilder.ConfigBuilder.inliner
inliner
load the relevant part
Definition: ConfigBuilder.py:1597
ConfigBuilder.ConfigBuilder.CFWRITERDefaultSeq
CFWRITERDefaultSeq
Definition: ConfigBuilder.py:971
ConfigBuilder.ConfigBuilder.DIGI2RAWDefaultCFF
DIGI2RAWDefaultCFF
Definition: ConfigBuilder.py:928
ConfigBuilder.ConfigBuilder.AlCaPaths
AlCaPaths
Definition: ConfigBuilder.py:1255
ConfigBuilder.ConfigBuilder.SIMDefaultCFF
SIMDefaultCFF
Definition: ConfigBuilder.py:926
ConfigBuilder.ConfigBuilder.prepare_L1TrackTrigger
def prepare_L1TrackTrigger(self, sequence="L1TrackTrigger")
Definition: ConfigBuilder.py:1583
ConfigBuilder.ConfigBuilder.schedule
schedule
Definition: ConfigBuilder.py:252
ConfigBuilder.ConfigBuilder.prepare_RAW2DIGI
def prepare_RAW2DIGI(self, sequence="RawToDigi")
Definition: ConfigBuilder.py:1557
ConfigBuilder.ConfigBuilder.prepare_PATFILTER
def prepare_PATFILTER(self, sequence=None)
Definition: ConfigBuilder.py:1564
ConfigBuilder.ConfigBuilder.ENDJOBDefaultSeq
ENDJOBDefaultSeq
Definition: ConfigBuilder.py:985
python.rootplot.root2matplotlib.replace
def replace(string, replacements)
Definition: root2matplotlib.py:444
ConfigBuilder.ConfigBuilder.prepare_USER
def prepare_USER(self, sequence=None)
Definition: ConfigBuilder.py:1749
ConfigBuilder.ConfigBuilder.addConditions
def addConditions(self)
Definition: ConfigBuilder.py:808