CMS 3D CMS Logo

upgradeWorkflowComponents.py
Go to the documentation of this file.
1 from copy import copy, deepcopy
2 from collections import OrderedDict
3 from .MatrixUtil import merge, Kby, Mby
4 import re
5 
6 # DON'T CHANGE THE ORDER, only append new keys. Otherwise the numbering for the runTheMatrix tests will change.
7 
8 upgradeKeys = {}
9 
10 upgradeKeys[2017] = [
11  '2017',
12  '2017PU',
13  '2017Design',
14  '2017DesignPU',
15  '2018',
16  '2018PU',
17  '2018Design',
18  '2018DesignPU',
19  '2021',
20  '2021PU',
21  '2021Design',
22  '2021DesignPU',
23  '2023',
24  '2023PU',
25  '2024',
26  '2024PU',
27  '2021FS',
28  '2021FSPU',
29  '2021postEE',
30  '2021postEEPU',
31  '2023FS',
32  '2023FSPU',
33 ]
34 
35 upgradeKeys[2026] = [
36  '2026D86',
37  '2026D86PU',
38  '2026D88',
39  '2026D88PU',
40  '2026D91',
41  '2026D91PU',
42  '2026D92',
43  '2026D92PU',
44  '2026D93',
45  '2026D93PU',
46  '2026D94',
47  '2026D94PU',
48  '2026D95',
49  '2026D95PU',
50  '2026D96',
51  '2026D96PU',
52  '2026D97',
53  '2026D97PU',
54  '2026D98',
55  '2026D98PU',
56  '2026D99',
57  '2026D99PU',
58 ]
59 
60 # pre-generation of WF numbers
61 numWFStart={
62  2017: 10000,
63  2026: 20000,
64 }
65 numWFSkip=200
66 # temporary measure to keep other WF numbers the same
67 numWFConflict = [[20400,20800], #D87
68  [21200,22000], #D89-D90
69  [50000,51000]]
70 numWFAll={
71  2017: [],
72  2026: []
73 }
74 
75 for year in upgradeKeys:
76  for i in range(0,len(upgradeKeys[year])):
77  numWFtmp = numWFStart[year] if i==0 else (numWFAll[year][i-1] + numWFSkip)
78  for conflict in numWFConflict:
79  if numWFtmp>=conflict[0] and numWFtmp<conflict[1]:
80  numWFtmp = conflict[1]
81  break
82  numWFAll[year].append(numWFtmp)
83 
84 # workflows for baseline and for variations
85 # setup() automatically loops over all steps and applies any customizations specified in setup_() -> called in relval_steps.py
86 # setupPU() and setupPU_() operate similarly -> called in relval_steps.py *after* merging PUDataSets w/ regular steps
87 # workflow() adds a concrete workflow to the list based on condition() -> called in relval_upgrade.py
88 # every special workflow gets its own derived class, which must then be added to the global dict upgradeWFs
89 preventReuseKeyword = 'NOREUSE'
91  def __init__(self,steps,PU,suffix,offset):
92  self.steps = steps
93  self.PU = PU
94  self.allowReuse = True
95 
96  # ensure all PU steps are in normal step list
97  for step in self.PU:
98  if not step in self.steps:
99  self.steps.append(step)
100 
101  self.suffix = suffix
102  if len(self.suffix)>0 and self.suffix[0]!='_': self.suffix = '_'+self.suffix
103  self.offset = offset
104  if self.offset < 0.0 or self.offset > 1.0:
105  raise ValueError("Special workflow offset must be between 0.0 and 1.0")
106  def getStepName(self, step, extra=""):
107  stepName = step + self.suffix + extra
108  return stepName
109  def getStepNamePU(self, step, extra=""):
110  stepNamePU = step + 'PU' + self.suffix + extra
111  return stepNamePU
112  def init(self, stepDict):
113  for step in self.steps:
114  stepDict[self.getStepName(step)] = {}
115  if not self.allowReuse: stepDict[self.getStepName(step,preventReuseKeyword)] = {}
116  for step in self.PU:
117  stepDict[self.getStepNamePU(step)] = {}
118  if not self.allowReuse: stepDict[self.getStepNamePU(step,preventReuseKeyword)] = {}
119  def setup(self, stepDict, k, properties):
120  for step in self.steps:
121  self.setup_(step, self.getStepName(step), stepDict, k, properties)
122  if not self.allowReuse: self.preventReuse(self.getStepName(step,preventReuseKeyword), stepDict, k)
123  def setupPU(self, stepDict, k, properties):
124  for step in self.PU:
125  self.setupPU_(step, self.getStepNamePU(step), stepDict, k, properties)
126  if not self.allowReuse: self.preventReuse(self.getStepNamePU(step,preventReuseKeyword), stepDict, k)
127  def setup_(self, step, stepName, stepDict, k, properties):
128  pass
129  def setupPU_(self, step, stepName, stepDict, k, properties):
130  pass
131  def workflow(self, workflows, num, fragment, stepList, key, hasHarvest):
132  if self.condition(fragment, stepList, key, hasHarvest):
133  self.workflow_(workflows, num, fragment, stepList, key)
134  def workflow_(self, workflows, num, fragment, stepList, key):
135  fragmentTmp = [fragment, key]
136  if len(self.suffix)>0: fragmentTmp.append(self.suffix)
137  workflows[num+self.offset] = [ fragmentTmp, stepList ]
138  def condition(self, fragment, stepList, key, hasHarvest):
139  return False
140  def preventReuse(self, stepName, stepDict, k):
141  if "Sim" in stepName:
142  stepDict[stepName][k] = None
143  if "Gen" in stepName:
144  stepDict[stepName][k] = None
145 upgradeWFs = OrderedDict()
146 
148  def setup_(self, step, stepName, stepDict, k, properties):
149  cust=properties.get('Custom', None)
150  era=properties.get('Era', None)
151  modifier=properties.get('ProcessModifier',None)
152  if cust is not None: stepDict[stepName][k]['--customise']=cust
153  if era is not None:
154  stepDict[stepName][k]['--era']=era
155  if modifier is not None: stepDict[stepName][k]['--procModifier']=modifier
156  def condition(self, fragment, stepList, key, hasHarvest):
157  return True
158 upgradeWFs['baseline'] = UpgradeWorkflow_baseline(
159  steps = [
160  'Gen',
161  'GenSim',
162  'GenSimHLBeamSpot',
163  'GenSimHLBeamSpot14',
164  'GenSimHLBeamSpotHGCALCloseBy',
165  'Digi',
166  'DigiTrigger',
167  'HLTRun3',
168  'RecoLocal',
169  'Reco',
170  'RecoFakeHLT',
171  'RecoGlobal',
172  'RecoNano',
173  'RecoNanoFakeHLT',
174  'HARVEST',
175  'HARVESTFakeHLT',
176  'HARVESTNano',
177  'HARVESTNanoFakeHLT',
178  'FastSim',
179  'HARVESTFast',
180  'HARVESTGlobal',
181  'ALCA',
182  'ALCAPhase2',
183  'Nano',
184  'MiniAOD',
185  'HLT75e33',
186  'FastSimRun3',
187  'HARVESTFastRun3',
188  ],
189  PU = [
190  'DigiTrigger',
191  'RecoLocal',
192  'RecoGlobal',
193  'Digi',
194  'Reco',
195  'RecoFakeHLT',
196  'RecoNano',
197  'RecoNanoFakeHLT',
198  'HARVEST',
199  'HARVESTFakeHLT',
200  'HARVESTNano',
201  'HARVESTNanoFakeHLT',
202  'HARVESTGlobal',
203  'MiniAOD',
204  'Nano',
205  'HLT75e33',
206  'FastSimRun3',
207  'HARVESTFastRun3',
208  ],
209  suffix = '',
210  offset = 0.0,
211 )
212 
213 
215  def setup_(self, step, stepName, stepDict, k, properties):
216  if stepDict[step][k] != None:
217  if 'ALCA' in step:
218  stepDict[stepName][k] = None
219  if 'RecoNano' in step:
220  stepDict[stepName][k] = merge([{'--filein': 'file:step3.root', '--secondfilein': 'file:step2.root'}, stepDict[step][k]])
221  if 'Digi' in step:
222  stepDict[stepName][k] = merge([{'-s': re.sub(',HLT.*', '', stepDict[step][k]['-s'])}, stepDict[step][k]])
223  def condition(self, fragment, stepList, key, hasHarvest):
224  if ('TTbar_14TeV' in fragment and '2021' == key):
225  stepList.insert(stepList.index('Digi_DigiNoHLT_2021')+1, 'HLTRun3_2021')
226  return ('TTbar_14TeV' in fragment and '2021' == key)
227 upgradeWFs['DigiNoHLT'] = UpgradeWorkflow_DigiNoHLT(
228  steps = [
229  'Digi',
230  'RecoNano',
231  'RecoNanoFakeHLT',
232  'ALCA'
233  ],
234  PU = [],
235  suffix = '_DigiNoHLT',
236  offset = 0.601,
237 )
238 
239 # some commonalities among tracking WFs
241 
242  def __init__(self, steps, PU, suffix, offset):
243  # always include some steps that will be skipped
244  steps = steps + ["ALCA","Nano"]
245  super().__init__(steps, PU, suffix, offset)
246  def condition(self, fragment, stepList, key, hasHarvest):
247  result = (fragment=="TTbar_13" or fragment=="TTbar_14TeV") and not 'PU' in key and hasHarvest and self.condition_(fragment, stepList, key, hasHarvest)
248  return result
249  def condition_(self, fragment, stepList, key, hasHarvest):
250  return True
251  def setup_(self, step, stepName, stepDict, k, properties):
252  # skip ALCA and Nano steps (but not RecoNano or HARVESTNano for Run3)
253  if 'ALCA' in step or 'Nano'==step:
254  stepDict[stepName][k] = None
255  self.setup__(step, stepName, stepDict, k, properties)
256  # subordinate function for inherited classes
257  def setup__(self, step, stepName, stepDict, k, properties):
258  pass
259 
260 class UpgradeWorkflow_trackingOnly(UpgradeWorkflowTracking):
261  def setup__(self, step, stepName, stepDict, k, properties):
262  if 'Reco' in step: stepDict[stepName][k] = merge([self.step3, stepDict[step][k]])
263  elif 'HARVEST' in step: stepDict[stepName][k] = merge([{'-s': 'HARVESTING:@trackingOnlyValidation+@trackingOnlyDQM'}, stepDict[step][k]])
264 
265  def condition(self, fragment, stepList, key, hasHarvest):
266  result = (fragment=="TTbar_13" or fragment=="TTbar_14TeV") and hasHarvest and self.condition_(fragment, stepList, key, hasHarvest)
267  return result
268 
269 
270 
271 upgradeWFs['trackingOnly'] = UpgradeWorkflow_trackingOnly(
272  steps = [
273  'Reco',
274  'RecoFakeHLT',
275  'HARVEST',
276  'HARVESTFakeHLT',
277  'RecoGlobal',
278  'HARVESTGlobal',
279  'RecoNano',
280  'RecoNanoFakeHLT',
281  'HARVESTNano',
282  'HARVESTNanoFakeHLT',
283  ],
284  PU = [
285  'Reco',
286  'RecoFakeHLT',
287  'HARVEST',
288  'HARVESTFakeHLT',
289  'RecoGlobal',
290  'HARVESTGlobal',
291  'RecoNano',
292  'RecoNanoFakeHLT',
293  'HARVESTNano',
294  'HARVESTNanoFakeHLT',
295  ],
296 
297 
298  suffix = '_trackingOnly',
299  offset = 0.1,
300 )
301 upgradeWFs['trackingOnly'].step3 = {
302  '-s': 'RAW2DIGI,RECO:reconstruction_trackingOnly,VALIDATION:@trackingOnlyValidation,DQM:@trackingOnlyDQM',
303  '--datatier':'GEN-SIM-RECO,DQMIO',
304  '--eventcontent':'RECOSIM,DQM',
305 }
306 # used outside of upgrade WFs
307 step3_trackingOnly = upgradeWFs['trackingOnly'].step3
308 
310  def setup__(self, step, stepName, stepDict, k, properties):
311  if 'Reco' in step and stepDict[step][k]['--era']=='Run2_2017':
312  stepDict[stepName][k] = merge([{'--era': 'Run2_2017_trackingRun2'}, stepDict[step][k]])
313  def condition_(self, fragment, stepList, key, hasHarvest):
314  return '2017' in key
315 upgradeWFs['trackingRun2'] = UpgradeWorkflow_trackingRun2(
316  steps = [
317  'Reco',
318  'RecoFakeHLT',
319  ],
320  PU = [],
321  suffix = '_trackingRun2',
322  offset = 0.2,
323 )
324 
326  def setup__(self, step, stepName, stepDict, k, properties):
327  if 'Reco' in step and stepDict[step][k]['--era']=='Run2_2017':
328  stepDict[stepName][k] = merge([{'--era': 'Run2_2017_trackingRun2'}, self.step3, stepDict[step][k]])
329  elif 'HARVEST' in step: stepDict[stepName][k] = merge([{'-s': 'HARVESTING:@trackingOnlyValidation+@trackingOnlyDQM'}, stepDict[step][k]])
330  def condition_(self, fragment, stepList, key, hasHarvest):
331  return '2017' in key
332 upgradeWFs['trackingOnlyRun2'] = UpgradeWorkflow_trackingOnlyRun2(
333  steps = [
334  'Reco',
335  'RecoFakeHLT',
336  'HARVEST',
337  'HARVESTFakeHLT',
338  ],
339  PU = [],
340  suffix = '_trackingOnlyRun2',
341  offset = 0.3,
342 )
343 upgradeWFs['trackingOnlyRun2'].step3 = upgradeWFs['trackingOnly'].step3
344 
346  def setup__(self, step, stepName, stepDict, k, properties):
347  if 'Reco' in step and stepDict[step][k]['--era']=='Run2_2017':
348  stepDict[stepName][k] = merge([{'--era': 'Run2_2017_trackingLowPU'}, stepDict[step][k]])
349  def condition_(self, fragment, stepList, key, hasHarvest):
350  return '2017' in key
351 upgradeWFs['trackingLowPU'] = UpgradeWorkflow_trackingLowPU(
352  steps = [
353  'Reco',
354  'RecoFakeHLT',
355  ],
356  PU = [],
357  suffix = '_trackingLowPU',
358  offset = 0.4,
359 )
360 
362  def setup__(self, step, stepName, stepDict, k, properties):
363  if 'Reco' in step: stepDict[stepName][k] = merge([self.step3, stepDict[step][k]])
364  # skip ALCA step as products might not be available
365  elif 'ALCA' in step: stepDict[stepName][k] = None
366  elif 'HARVEST' in step: stepDict[stepName][k] = merge([{'-s': 'HARVESTING:@trackingOnlyValidation+@pixelTrackingOnlyDQM'}, stepDict[step][k]])
367  def condition_(self, fragment, stepList, key, hasHarvest):
368  return ('2017' in key or '2018' in key or '2021' in key or '2026' in key) and ('FS' not in key)
369 upgradeWFs['pixelTrackingOnly'] = UpgradeWorkflow_pixelTrackingOnly(
370  steps = [
371  'Reco',
372  'RecoFakeHLT',
373  'HARVEST',
374  'HARVESTFakeHLT',
375  'RecoGlobal',
376  'HARVESTGlobal',
377  'RecoNano',
378  'RecoNanoFakeHLT',
379  'HARVESTNano',
380  'HARVESTNanoFakeHLT',
381  'ALCA',
382  'ALCAPhase2'
383  ],
384  PU = [],
385  suffix = '_pixelTrackingOnly',
386  offset = 0.5,
387 )
388 upgradeWFs['pixelTrackingOnly'].step3 = {
389  '-s': 'RAW2DIGI:RawToDigi_pixelOnly,RECO:reconstruction_pixelTrackingOnly,VALIDATION:@pixelTrackingOnlyValidation,DQM:@pixelTrackingOnlyDQM',
390  '--datatier': 'GEN-SIM-RECO,DQMIO',
391  '--eventcontent': 'RECOSIM,DQM',
392 }
393 
395  def setup__(self, step, stepName, stepDict, k, properties):
396  if 'Digi' in step: stepDict[stepName][k] = merge([self.step2, stepDict[step][k]])
397  if 'Reco' in step: stepDict[stepName][k] = merge([self.step3, stepDict[step][k]])
398  def condition_(self, fragment, stepList, key, hasHarvest):
399  return ('2017' in key or '2021' in key or '2023' in key) and ('FS' not in key)
400 upgradeWFs['trackingMkFit'] = UpgradeWorkflow_trackingMkFit(
401  steps = [
402  'Digi',
403  'DigiTrigger',
404  'Reco',
405  'RecoFakeHLT',
406  'RecoGlobal',
407  'RecoNano',
408  'RecoNanoFakeHLT',
409  ],
410  PU = [],
411  suffix = '_trackingMkFit',
412  offset = 0.7,
413 )
414 upgradeWFs['trackingMkFit'].step2 = {
415  '--customise': 'RecoTracker/MkFit/customizeHLTIter0ToMkFit.customizeHLTIter0ToMkFit'
416 }
417 upgradeWFs['trackingMkFit'].step3 = {
418  '--procModifiers': 'trackingMkFitDevel'
419 }
420 
421 #DeepCore seeding for JetCore iteration workflow
423  def setup_(self, step, stepName, stepDict, k, properties):
424  # skip ALCA and Nano steps (but not RecoNano or HARVESTNano for Run3)
425  if 'ALCA' in step or 'Nano'==step:
426  stepDict[stepName][k] = None
427  elif 'Reco' in step or 'HARVEST' in step: stepDict[stepName][k] = merge([{'--procModifiers': 'seedingDeepCore'}, stepDict[step][k]])
428  def condition(self, fragment, stepList, key, hasHarvest):
429  result = (fragment=="QCD_Pt_1800_2400_14" or fragment=="TTbar_14TeV" ) and ('2021' in key or '2024' in key) and hasHarvest
430  return result
431 upgradeWFs['seedingDeepCore'] = UpgradeWorkflow_seedingDeepCore(
432  steps = [
433  'Reco',
434  'RecoFakeHLT',
435  'HARVEST',
436  'HARVESTFakeHLT',
437  'RecoGlobal',
438  'HARVESTGlobal',
439  'RecoNano',
440  'RecoNanoFakeHLT',
441  'HARVESTNano',
442  'HARVESTNanoFakeHLT',
443  'Nano',
444  'ALCA',
445  ],
446  PU = [
447  'Reco',
448  'RecoFakeHLT',
449  'RecoGlobal',
450  'HARVESTGlobal',
451  'RecoNano',
452  'RecoNanoFakeHLT',
453  'HARVESTNano',
454  'HARVESTNanoFakeHLT',
455  ],
456  suffix = '_seedingDeepCore',
457  offset = 0.17,
458 )
459 
460 # Vector Hits workflows
462  def setup_(self, step, stepName, stepDict, k, properties):
463  stepDict[stepName][k] = merge([{'--procModifiers': 'vectorHits'}, stepDict[step][k]])
464  def condition(self, fragment, stepList, key, hasHarvest):
465  return (fragment=="TTbar_14TeV" or fragment=="SingleMuPt10Extended") and '2026' in key
466 upgradeWFs['vectorHits'] = UpgradeWorkflow_vectorHits(
467  steps = [
468  'RecoGlobal',
469  'HARVESTGlobal'
470  ],
471  PU = [
472  'RecoGlobal',
473  'HARVESTGlobal'
474  ],
475  suffix = '_vectorHits',
476  offset = 0.9,
477 )
478 
479 # WeightedMeanFitter vertexing workflows
481  def __init__(self, reco = {}, harvest = {}, **kwargs):
482  # adapt the parameters for the UpgradeWorkflow init method
483  super(UpgradeWorkflow_weightedVertex, self).__init__(
484  steps = [
485  'Reco',
486  'RecoFakeHLT',
487  'HARVEST',
488  'HARVESTFakeHLT',
489  'RecoGlobal',
490  'HARVESTGlobal',
491  'RecoNano',
492  'RecoNanoFakeHLT',
493  'HARVESTNano',
494  'HARVESTNanoFakeHLT',
495  ],
496  PU = [
497  'Reco',
498  'RecoFakeHLT',
499  'HARVEST',
500  'HARVESTFakeHLT',
501  'RecoGlobal',
502  'HARVESTGlobal',
503  'RecoNano',
504  'RecoNanoFakeHLT',
505  'HARVESTNano',
506  'HARVESTNanoFakeHLT',
507  ],
508  **kwargs)
509  self.__reco = reco
510  self.__harvest = harvest
511 
512  def setup_(self, step, stepName, stepDict, k, properties):
513  # temporarily remove trigger & downstream steps
514  if 'Reco' in step:
515  mod = {'--procModifiers': 'weightedVertexing,vertexInBlocks', '--datatier':'GEN-SIM-RECO,DQMIO',
516  '--eventcontent':'RECOSIM,DQM'}
517  stepDict[stepName][k] = merge([mod,self.step3, stepDict[step][k]])
518  if 'HARVEST' in step:
519  stepDict[stepName][k] = merge([self.step4,stepDict[step][k]])
520 
521  def condition(self, fragment, stepList, key, hasHarvest):
522  # select only a subset of the workflows
523  selected = [
524  ('2021' in key and fragment == "TTbar_14TeV" and 'FS' not in key),
525  ('2024' in key and fragment == "TTbar_14TeV"),
526  ('2026' in key and fragment == "TTbar_14TeV")
527  ]
528  result = any(selected) and hasHarvest
529 
530  return result
531 
532 
533 upgradeWFs['weightedVertex'] = UpgradeWorkflow_weightedVertex(
534  suffix = '_weightedVertex',
535  offset = 0.278,
536 )
537 
538 upgradeWFs['weightedVertex'].step3 = {}
539 upgradeWFs['weightedVertex'].step4 = {}
540 
541 upgradeWFs['weightedVertexTrackingOnly'] = UpgradeWorkflow_weightedVertex(
542  suffix = '_weightedVertexTrackingOnly',
543  offset = 0.279,
544 )
545 
546 upgradeWFs['weightedVertexTrackingOnly'].step3 = {
547  '-s': 'RAW2DIGI,RECO:reconstruction_trackingOnly,VALIDATION:@trackingOnlyValidation,DQM:@trackingOnlyDQM',
548  '--datatier':'GEN-SIM-RECO,DQMIO',
549  '--eventcontent':'RECOSIM,DQM',
550 }
551 
552 upgradeWFs['weightedVertexTrackingOnly'].step4 = {
553  '-s': 'HARVESTING:@trackingOnlyValidation+@pixelTrackingOnlyDQM'
554 }
555 
556 # Special TICL Pattern recognition Workflows
558  def setup_(self, step, stepName, stepDict, k, properties):
559  if 'RecoGlobal' in step:
560  stepDict[stepName][k] = merge([self.step3, stepDict[step][k]])
561  if 'HARVESTGlobal' in step:
562  stepDict[stepName][k] = merge([self.step4, stepDict[step][k]])
563  def condition(self, fragment, stepList, key, hasHarvest):
564  return (fragment=="TTbar_14TeV" or 'CloseByPGun_CE' in fragment) and '2026' in key
565 upgradeWFs['ticl_clue3D'] = UpgradeWorkflow_ticl_clue3D(
566  steps = [
567  'RecoGlobal',
568  'HARVESTGlobal'
569  ],
570  PU = [
571  'RecoGlobal',
572  'HARVESTGlobal'
573  ],
574  suffix = '_ticl_clue3D',
575  offset = 0.201,
576 )
577 upgradeWFs['ticl_clue3D'].step3 = {'--procModifiers': 'clue3D'}
578 upgradeWFs['ticl_clue3D'].step4 = {'--procModifiers': 'clue3D'}
579 
581  def setup_(self, step, stepName, stepDict, k, properties):
582  if 'RecoGlobal' in step:
583  stepDict[stepName][k] = merge([self.step3, stepDict[step][k]])
584  if 'HARVESTGlobal' in step:
585  stepDict[stepName][k] = merge([self.step4, stepDict[step][k]])
586  def condition(self, fragment, stepList, key, hasHarvest):
587  return (fragment=="TTbar_14TeV" or 'CloseByPGun_CE' in fragment) and '2026' in key
588 upgradeWFs['ticl_FastJet'] = UpgradeWorkflow_ticl_FastJet(
589  steps = [
590  'RecoGlobal',
591  'HARVESTGlobal'
592  ],
593  PU = [
594  'RecoGlobal',
595  'HARVESTGlobal'
596  ],
597  suffix = '_ticl_FastJet',
598  offset = 0.202,
599 )
600 upgradeWFs['ticl_FastJet'].step3 = {'--procModifiers': 'fastJetTICL'}
601 upgradeWFs['ticl_FastJet'].step4 = {'--procModifiers': 'fastJetTICL'}
602 
604  def setup_(self, step, stepName, stepDict, k, properties):
605  if 'RecoGlobal' in step:
606  stepDict[stepName][k] = merge([self.step3, stepDict[step][k]])
607  if 'HARVESTGlobal' in step:
608  stepDict[stepName][k] = merge([self.step4, stepDict[step][k]])
609  def condition(self, fragment, stepList, key, hasHarvest):
610  return (fragment=="TTbar_14TeV" or 'CloseByP' in fragment or 'Eta1p7_2p7' in fragment) and '2026' in key
611 upgradeWFs['ticl_v3'] = UpgradeWorkflow_ticl_v3(
612  steps = [
613  'RecoGlobal',
614  'HARVESTGlobal'
615  ],
616  PU = [
617  'RecoGlobal',
618  'HARVESTGlobal'
619  ],
620  suffix = '_ticl_v3',
621  offset = 0.203,
622 )
623 upgradeWFs['ticl_v3'].step3 = {'--procModifiers': 'ticl_v3'}
624 upgradeWFs['ticl_v3'].step4 = {'--procModifiers': 'ticl_v3'}
625 
626 
627 # Track DNN workflows
629  def setup_(self, step, stepName, stepDict, k, properties):
630  stepDict[stepName][k] = merge([{'--procModifiers': 'trackdnn'}, stepDict[step][k]])
631 
632  def condition(self, fragment, stepList, key, hasHarvest):
633  return fragment=="TTbar_14TeV" and '2021' in key
634 upgradeWFs['trackdnn'] = UpgradeWorkflow_trackdnn(
635  steps = [
636  'Reco',
637  'RecoFakeHLT',
638  'RecoNano',
639  'RecoNanoFakeHLT',
640  ],
641  PU = [
642  'Reco',
643  'RecoFakeHLT',
644  'RecoNano',
645  'RecoNanoFakeHLT',
646  ],
647  suffix = '_trackdnn',
648  offset = 0.91,
649 )
650 
651 
652 # MLPF workflows
654  def setup_(self, step, stepName, stepDict, k, properties):
655  if 'Reco' in step:
656  stepDict[stepName][k] = merge([self.step3, stepDict[step][k]])
657  def condition(self, fragment, stepList, key, hasHarvest):
658  return (fragment=="TTbar_14TeV" or fragment=="QCD_FlatPt_15_3000HS_14") and '2021PU' in key
659 
660 upgradeWFs['mlpf'] = UpgradeWorkflow_mlpf(
661  steps = [
662  'Reco',
663  'RecoFakeHLT',
664  'RecoNano',
665  'RecoNanoFakeHLT',
666  ],
667  PU = [
668  'Reco',
669  'RecoFakeHLT',
670  'RecoNano',
671  'RecoNanoFakeHLT',
672  ],
673  suffix = '_mlpf',
674  offset = 0.13,
675 )
676 upgradeWFs['mlpf'].step3 = {
677  '--datatier': 'GEN-SIM-RECO,RECOSIM,MINIAODSIM,NANOAODSIM,DQMIO',
678  '--eventcontent': 'FEVTDEBUGHLT,RECOSIM,MINIAODSIM,NANOEDMAODSIM,DQM',
679  '--procModifiers': 'mlpf'
680 }
681 
682 
683 # ECAL DeepSC clustering studies workflow
685  def setup_(self, step, stepName, stepDict, k, properties):
686  if 'Reco' in step:
687  stepDict[stepName][k] = merge([self.step3, stepDict[step][k]])
688  def condition(self, fragment, stepList, key, hasHarvest):
689  return (fragment=="ZEE_14" or fragment=="TTbar_14TeV" or fragment=="WprimeTolNu_M3000_13TeV_pythia8"
690  or fragment=="DisplacedSUSY_stopToBottom_M_300_1000mm_13" or fragment=="RunEGamma2018D" )
691 
692 upgradeWFs['ecalDeepSC'] = UpgradeWorkflow_ecalclustering(
693  steps = [
694  'Reco',
695  'RecoFakeHLT',
696  'RecoNano',
697  'RecoNanoFakeHLT',
698  ],
699  PU = [
700  'Reco',
701  'RecoFakeHLT',
702  'RecoNano',
703  'RecoNanoFakeHLT',
704  ],
705  suffix = '_ecalDeepSC',
706  offset = 0.19,
707 )
708 upgradeWFs['ecalDeepSC'].step3 = {
709  '--datatier': 'RECOSIM,MINIAODSIM,NANOAODSIM,DQMIO',
710  '--eventcontent': 'RECOSIM,MINIAODSIM,NANOEDMAODSIM,DQM',
711  '--procModifiers': 'ecal_deepsc'
712 }
713 
714 
715 # photonDRN workflows
717  def setup_(self, step, stepName, stepDict, k, properties):
718  if 'Reco' in step:
719  stepDict[stepName][k] = merge([self.step3, stepDict[step][k]])
720  def condition(self, fragment, stepList, key, hasHarvest):
721  return '2018' in key and "SingleGamma" in fragment
722 
723 upgradeWFs['photonDRN'] = UpgradeWorkflow_photonDRN(
724  steps = [
725  'RecoFakeHLT',
726  'RecoNanoFakeHLT',
727  ],
728  PU = [
729  'RecoFakeHLT',
730  'RecoNanoFakeHLT',
731  ],
732  suffix = '_photonDRN',
733  offset = 0.31,
734 )
735 upgradeWFs['photonDRN'].step3 = {
736  '--procModifiers': 'enableSonicTriton,photonDRN'
737 }
738 
739 
740 # Patatrack workflows (NoPU):
741 # - 2018 conditions, TTbar
742 # - 2018 conditions, Z->mumu
743 # - 2022 conditions (labelled "2021"), TTbar
744 # - 2022 conditions (labelled "2021"), Z->mumu
745 # - 2023 conditions, TTbar
746 # - 2023 conditions, Z->mumu
747 # - 2026D88 conditions, TTbar
749  def __init__(self, digi = {}, reco = {}, harvest = {}, **kwargs):
750  # adapt the parameters for the UpgradeWorkflow init method
751  super(PatatrackWorkflow, self).__init__(
752  steps = [
753  'Digi',
754  'DigiTrigger',
755  'Reco',
756  'RecoFakeHLT',
757  'HARVEST',
758  'HARVESTFakeHLT',
759  'RecoGlobal',
760  'HARVESTGlobal',
761  'RecoNano',
762  'RecoNanoFakeHLT',
763  'HARVESTNano',
764  'HARVESTNanoFakeHLT',
765  'Nano',
766  'ALCA',
767  'ALCAPhase2'
768  ],
769  PU = [],
770  **kwargs)
771  self.__digi = digi
772  self.__reco = reco
773  self.__reco.update({
774  '--datatier': 'GEN-SIM-RECO,DQMIO',
775  '--eventcontent': 'RECOSIM,DQM'
776  })
777  self.__harvest = harvest
778 
779  def condition(self, fragment, stepList, key, hasHarvest):
780  # select only a subset of the workflows
781  selected = [
782  ('2018' in key and fragment == "TTbar_13"),
783  ('2021' in key and fragment == "TTbar_14TeV" and 'FS' not in key),
784  ('2023' in key and fragment == "TTbar_14TeV" and 'FS' not in key),
785  ('2018' in key and fragment == "ZMM_13"),
786  ('2021' in key and fragment == "ZMM_14" and 'FS' not in key),
787  ('2023' in key and fragment == "ZMM_14" and 'FS' not in key),
788  ('2026D88' in key and fragment == "TTbar_14TeV" and "PixelOnly" in self.suffix)
789  ]
790  result = any(selected) and hasHarvest
791 
792  return result
793 
794  def setup_(self, step, stepName, stepDict, k, properties):
795  # skip ALCA and Nano steps (but not RecoNano or HARVESTNano for Run3)
796  if 'ALCA' in step or 'Nano'==step:
797  stepDict[stepName][k] = None
798  elif 'Digi' in step:
799  if self.__digi is None:
800  stepDict[stepName][k] = None
801  else:
802  stepDict[stepName][k] = merge([self.__digi, stepDict[step][k]])
803  elif 'Reco' in step:
804  if self.__reco is None:
805  stepDict[stepName][k] = None
806  else:
807  stepDict[stepName][k] = merge([self.__reco, stepDict[step][k]])
808  elif 'HARVEST' in step:
809  if self.__harvest is None:
810  stepDict[stepName][k] = None
811  else:
812  stepDict[stepName][k] = merge([self.__harvest, stepDict[step][k]])
813 
814 # Pixel-only quadruplets workflow running on CPU
815 # - HLT on CPU
816 # - Pixel-only reconstruction on CPU, with DQM and validation
817 # - harvesting
818 upgradeWFs['PatatrackPixelOnlyCPU'] = PatatrackWorkflow(
819  digi = {
820  # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
821  },
822  reco = {
823  '-s': 'RAW2DIGI:RawToDigi_pixelOnly,RECO:reconstruction_pixelTrackingOnly,VALIDATION:@pixelTrackingOnlyValidation,DQM:@pixelTrackingOnlyDQM',
824  '--procModifiers': 'pixelNtupletFit'
825  },
826  harvest = {
827  '-s': 'HARVESTING:@trackingOnlyValidation+@pixelTrackingOnlyDQM'
828  },
829  suffix = 'Patatrack_PixelOnlyCPU',
830  offset = 0.501,
831 )
832 
833 # Pixel-only quadruplets workflow running on CPU or GPU
834 # - HLT on GPU (optional)
835 # - Pixel-only reconstruction on GPU (optional), with DQM and validation
836 # - harvesting
837 upgradeWFs['PatatrackPixelOnlyGPU'] = PatatrackWorkflow(
838  digi = {
839  # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
840  '--procModifiers': 'gpu'
841  },
842  reco = {
843  '-s': 'RAW2DIGI:RawToDigi_pixelOnly,RECO:reconstruction_pixelTrackingOnly,VALIDATION:@pixelTrackingOnlyValidation,DQM:@pixelTrackingOnlyDQM',
844  '--procModifiers': 'pixelNtupletFit,gpu'
845  },
846  harvest = {
847  '-s': 'HARVESTING:@trackingOnlyValidation+@pixelTrackingOnlyDQM'
848  },
849  suffix = 'Patatrack_PixelOnlyGPU',
850  offset = 0.502,
851 )
852 
853 # Pixel-only quadruplets workflow running on CPU and GPU
854 # - HLT on GPU (required)
855 # - Pixel-only reconstruction on both CPU and GPU, with DQM and validation for GPU-vs-CPU comparisons
856 # - harvesting
857 upgradeWFs['PatatrackPixelOnlyGPUValidation'] = PatatrackWorkflow(
858  digi = {
859  # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
860  '--accelerators': 'gpu-nvidia',
861  '--procModifiers': 'gpu'
862  },
863  reco = {
864  '-s': 'RAW2DIGI:RawToDigi_pixelOnly,RECO:reconstruction_pixelTrackingOnly,VALIDATION:@pixelTrackingOnlyValidation,DQM:@pixelTrackingOnlyDQM',
865  '--accelerators': 'gpu-nvidia',
866  '--procModifiers': 'pixelNtupletFit,gpuValidation'
867  },
868  harvest = {
869  '-s': 'HARVESTING:@trackingOnlyValidation+@pixelTrackingOnlyDQM',
870  '--procModifiers': 'gpuValidation'
871  },
872  suffix = 'Patatrack_PixelOnlyGPU_Validation',
873  offset = 0.503,
874 )
875 
876 # Pixel-only quadruplets workflow running on CPU or GPU, trimmed down for benchmarking
877 # - HLT on GPU (optional)
878 # - Pixel-only reconstruction on GPU (optional)
879 upgradeWFs['PatatrackPixelOnlyGPUProfiling'] = PatatrackWorkflow(
880  digi = {
881  # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
882  '--procModifiers': 'gpu'
883  },
884  reco = {
885  '-s': 'RAW2DIGI:RawToDigi_pixelOnly,RECO:reconstruction_pixelTrackingOnly',
886  '--procModifiers': 'pixelNtupletFit,gpu',
887  '--customise' : 'RecoTracker/Configuration/customizePixelOnlyForProfiling.customizePixelOnlyForProfilingGPUOnly'
888  },
889  harvest = None,
890  suffix = 'Patatrack_PixelOnlyGPU_Profiling',
891  offset = 0.504,
892 )
893 
894 # Pixel-only triplets workflow running on CPU
895 # - HLT on CPU
896 # - Pixel-only reconstruction on CPU, with DQM and validation
897 # - harvesting
898 upgradeWFs['PatatrackPixelOnlyTripletsCPU'] = PatatrackWorkflow(
899  digi = {
900  # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
901  },
902  reco = {
903  '-s': 'RAW2DIGI:RawToDigi_pixelOnly,RECO:reconstruction_pixelTrackingOnly,VALIDATION:@pixelTrackingOnlyValidation,DQM:@pixelTrackingOnlyDQM',
904  '--procModifiers': 'pixelNtupletFit',
905  '--customise' : 'RecoPixelVertexing/Configuration/customizePixelTracksForTriplets.customizePixelTracksForTriplets'
906  },
907  harvest = {
908  '-s': 'HARVESTING:@trackingOnlyValidation+@pixelTrackingOnlyDQM'
909  },
910  suffix = 'Patatrack_PixelOnlyTripletsCPU',
911  offset = 0.505,
912 )
913 
914 # Pixel-only triplets workflow running on CPU or GPU
915 # - HLT on GPU (optional)
916 # - Pixel-only reconstruction on GPU (optional), with DQM and validation
917 # - harvesting
918 upgradeWFs['PatatrackPixelOnlyTripletsGPU'] = PatatrackWorkflow(
919  digi = {
920  # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
921  '--procModifiers': 'gpu'
922  },
923  reco = {
924  '-s': 'RAW2DIGI:RawToDigi_pixelOnly,RECO:reconstruction_pixelTrackingOnly,VALIDATION:@pixelTrackingOnlyValidation,DQM:@pixelTrackingOnlyDQM',
925  '--procModifiers': 'pixelNtupletFit,gpu',
926  '--customise': 'RecoPixelVertexing/Configuration/customizePixelTracksForTriplets.customizePixelTracksForTriplets'
927  },
928  harvest = {
929  '-s': 'HARVESTING:@trackingOnlyValidation+@pixelTrackingOnlyDQM'
930  },
931  suffix = 'Patatrack_PixelOnlyTripletsGPU',
932  offset = 0.506,
933 )
934 
935 # Pixel-only triplets workflow running on CPU and GPU
936 # - HLT on GPU (required)
937 # - Pixel-only reconstruction on both CPU and GPU, with DQM and validation for GPU-vs-CPU comparisons
938 # - harvesting
939 upgradeWFs['PatatrackPixelOnlyTripletsGPUValidation'] = PatatrackWorkflow(
940  digi = {
941  # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
942  '--accelerators': 'gpu-nvidia',
943  '--procModifiers': 'gpu'
944  },
945  reco = {
946  '-s': 'RAW2DIGI:RawToDigi_pixelOnly,RECO:reconstruction_pixelTrackingOnly,VALIDATION:@pixelTrackingOnlyValidation,DQM:@pixelTrackingOnlyDQM',
947  '--accelerators': 'gpu-nvidia',
948  '--procModifiers': 'pixelNtupletFit,gpuValidation',
949  '--customise': 'RecoPixelVertexing/Configuration/customizePixelTracksForTriplets.customizePixelTracksForTriplets'
950  },
951  harvest = {
952  '-s': 'HARVESTING:@trackingOnlyValidation+@pixelTrackingOnlyDQM',
953  '--procModifiers': 'gpuValidation',
954  },
955  suffix = 'Patatrack_PixelOnlyTripletsGPU_Validation',
956  offset = 0.507,
957 )
958 
959 # Pixel-only triplets workflow running on CPU or GPU, trimmed down for benchmarking
960 # - HLT on GPU (optional)
961 # - Pixel-only reconstruction on GPU (optional)
962 upgradeWFs['PatatrackPixelOnlyTripletsGPUProfiling'] = PatatrackWorkflow(
963  digi = {
964  # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
965  '--procModifiers': 'gpu'
966  },
967  reco = {
968  '-s': 'RAW2DIGI:RawToDigi_pixelOnly,RECO:reconstruction_pixelTrackingOnly',
969  '--procModifiers': 'pixelNtupletFit,gpu',
970  '--customise': 'RecoPixelVertexing/Configuration/customizePixelTracksForTriplets.customizePixelTracksForTriplets,RecoTracker/Configuration/customizePixelOnlyForProfiling.customizePixelOnlyForProfilingGPUOnly'
971  },
972  harvest = None,
973  suffix = 'Patatrack_PixelOnlyTripletsGPU_Profiling',
974  offset = 0.508,
975 )
976 
977 # ECAL-only workflow running on CPU
978 # - HLT on CPU
979 # - ECAL-only reconstruction on CPU, with DQM and validation
980 # - harvesting
981 upgradeWFs['PatatrackECALOnlyCPU'] = PatatrackWorkflow(
982  digi = {
983  # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
984  },
985  reco = {
986  '-s': 'RAW2DIGI:RawToDigi_ecalOnly,RECO:reconstruction_ecalOnly,VALIDATION:@ecalOnlyValidation,DQM:@ecalOnly',
987  },
988  harvest = {
989  '-s': 'HARVESTING:@ecalOnlyValidation+@ecal'
990  },
991  suffix = 'Patatrack_ECALOnlyCPU',
992  offset = 0.511,
993 )
994 
995 # ECAL-only workflow running on CPU or GPU
996 # - HLT on GPU (optional)
997 # - ECAL-only reconstruction on GPU (optional), with DQM and validation
998 # - harvesting
999 upgradeWFs['PatatrackECALOnlyGPU'] = PatatrackWorkflow(
1000  digi = {
1001  # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
1002  '--procModifiers': 'gpu'
1003  },
1004  reco = {
1005  '-s': 'RAW2DIGI:RawToDigi_ecalOnly,RECO:reconstruction_ecalOnly,VALIDATION:@ecalOnlyValidation,DQM:@ecalOnly',
1006  '--procModifiers': 'gpu'
1007  },
1008  harvest = {
1009  '-s': 'HARVESTING:@ecalOnlyValidation+@ecal'
1010  },
1011  suffix = 'Patatrack_ECALOnlyGPU',
1012  offset = 0.512,
1013 )
1014 
1015 # ECAL-only workflow running on CPU and GPU
1016 # - HLT on GPU (required)
1017 # - ECAL-only reconstruction on both CPU and GPU, with DQM and validation for GPU-vs-CPU comparisons
1018 # - harvesting
1019 upgradeWFs['PatatrackECALOnlyGPUValidation'] = PatatrackWorkflow(
1020  digi = {
1021  # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
1022  '--accelerators': 'gpu-nvidia',
1023  '--procModifiers': 'gpu'
1024  },
1025  reco = {
1026  '-s': 'RAW2DIGI:RawToDigi_ecalOnly,RECO:reconstruction_ecalOnly,VALIDATION:@ecalOnlyValidation,DQM:@ecalOnly',
1027  '--accelerators': 'gpu-nvidia',
1028  '--procModifiers': 'gpuValidation'
1029  },
1030  harvest = {
1031  '-s': 'HARVESTING:@ecalOnlyValidation+@ecal'
1032  },
1033  suffix = 'Patatrack_ECALOnlyGPU_Validation',
1034  offset = 0.513,
1035 )
1036 
1037 # ECAL-only workflow running on CPU or GPU, trimmed down for benchmarking
1038 # - HLT on GPU (optional)
1039 # - ECAL-only reconstruction on GPU (optional)
1040 upgradeWFs['PatatrackECALOnlyGPUProfiling'] = PatatrackWorkflow(
1041  digi = {
1042  # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
1043  '--procModifiers': 'gpu'
1044  },
1045  reco = {
1046  '-s': 'RAW2DIGI:RawToDigi_ecalOnly,RECO:reconstruction_ecalOnly',
1047  '--procModifiers': 'gpu',
1048  '--customise' : 'RecoLocalCalo/Configuration/customizeEcalOnlyForProfiling.customizeEcalOnlyForProfilingGPUOnly'
1049  },
1050  harvest = None,
1051  suffix = 'Patatrack_ECALOnlyGPU_Profiling',
1052  offset = 0.514,
1053 )
1054 
1055 # HCAL-only workflow running on CPU
1056 # - HLT on CPU
1057 # - HCAL-only reconstruction on CPU, with DQM and validation
1058 # - harvesting
1059 upgradeWFs['PatatrackHCALOnlyCPU'] = PatatrackWorkflow(
1060  digi = {
1061  # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
1062  },
1063  reco = {
1064  '-s': 'RAW2DIGI:RawToDigi_hcalOnly,RECO:reconstruction_hcalOnly,VALIDATION:@hcalOnlyValidation,DQM:@hcalOnly+@hcal2Only',
1065  },
1066  harvest = {
1067  '-s': 'HARVESTING:@hcalOnlyValidation+@hcalOnly+@hcal2Only'
1068  },
1069  suffix = 'Patatrack_HCALOnlyCPU',
1070  offset = 0.521,
1071 )
1072 
1073 # HCAL-only workflow running on CPU or GPU
1074 # - HLT on GPU (optional)
1075 # - HCAL-only reconstruction on GPU (optional), with DQM and validation
1076 # - harvesting
1077 upgradeWFs['PatatrackHCALOnlyGPU'] = PatatrackWorkflow(
1078  digi = {
1079  # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
1080  '--procModifiers': 'gpu'
1081  },
1082  reco = {
1083  '-s': 'RAW2DIGI:RawToDigi_hcalOnly,RECO:reconstruction_hcalOnly,VALIDATION:@hcalOnlyValidation,DQM:@hcalOnly+@hcal2Only',
1084  '--procModifiers': 'gpu'
1085  },
1086  harvest = {
1087  '-s': 'HARVESTING:@hcalOnlyValidation+@hcalOnly+@hcal2Only'
1088  },
1089  suffix = 'Patatrack_HCALOnlyGPU',
1090  offset = 0.522,
1091 )
1092 
1093 # HCAL-only workflow running on CPU and GPU
1094 # - HLT on GPU (required)
1095 # - HCAL-only reconstruction on both CPU and GPU, with DQM and validation for GPU-vs-CPU comparisons
1096 # - harvesting
1097 upgradeWFs['PatatrackHCALOnlyGPUValidation'] = PatatrackWorkflow(
1098  digi = {
1099  # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
1100  '--accelerators': 'gpu-nvidia',
1101  '--procModifiers': 'gpu'
1102  },
1103  reco = {
1104  '-s': 'RAW2DIGI:RawToDigi_hcalOnly,RECO:reconstruction_hcalOnly,VALIDATION:@hcalOnlyValidation,DQM:@hcalOnly+@hcal2Only',
1105  '--accelerators': 'gpu-nvidia',
1106  '--procModifiers': 'gpuValidation'
1107  },
1108  harvest = {
1109  '-s': 'HARVESTING:@hcalOnlyValidation+@hcal'
1110  },
1111  suffix = 'Patatrack_HCALOnlyGPU_Validation',
1112  offset = 0.523,
1113 )
1114 
1115 # HCAL-only workflow running on CPU or GPU, trimmed down for benchmarking
1116 # - HLT on GPU (optional)
1117 # - HCAL-only reconstruction on GPU (optional)
1118 upgradeWFs['PatatrackHCALOnlyGPUProfiling'] = PatatrackWorkflow(
1119  digi = {
1120  # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
1121  '--procModifiers': 'gpu'
1122  },
1123  reco = {
1124  '-s': 'RAW2DIGI:RawToDigi_hcalOnly,RECO:reconstruction_hcalOnly',
1125  '--procModifiers': 'gpu',
1126  '--customise' : 'RecoLocalCalo/Configuration/customizeHcalOnlyForProfiling.customizeHcalOnlyForProfilingGPUOnly'
1127  },
1128  harvest = None,
1129  suffix = 'Patatrack_HCALOnlyGPU_Profiling',
1130  offset = 0.524,
1131 )
1132 
1133 # Workflow running the Pixel quadruplets, ECAL and HCAL reconstruction on CPU
1134 # - HLT on CPU
1135 # - reconstruction on CPU, with DQM and validation
1136 # - harvesting
1137 upgradeWFs['PatatrackAllCPU'] = PatatrackWorkflow(
1138  digi = {
1139  # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
1140  },
1141  reco = {
1142  '-s': 'RAW2DIGI:RawToDigi_pixelOnly+RawToDigi_ecalOnly+RawToDigi_hcalOnly,RECO:reconstruction_pixelTrackingOnly+reconstruction_ecalOnly+reconstruction_hcalOnly,VALIDATION:@pixelTrackingOnlyValidation+@ecalOnlyValidation+@hcalOnlyValidation,DQM:@pixelTrackingOnlyDQM+@ecalOnly+@hcalOnly+@hcal2Only',
1143  '--procModifiers': 'pixelNtupletFit'
1144  },
1145  harvest = {
1146  '-s': 'HARVESTING:@trackingOnlyValidation+@pixelTrackingOnlyDQM+@ecalOnlyValidation+@ecal+@hcalOnlyValidation+@hcalOnly+@hcal2Only'
1147  },
1148  suffix = 'Patatrack_AllCPU',
1149  offset = 0.581,
1150 )
1151 
1152 # Workflow running the Pixel quadruplets, ECAL and HCAL reconstruction on CPU or GPU
1153 # - HLT on GPU (optional)
1154 # - reconstruction on GPU (optional), with DQM and validation
1155 # - harvesting
1156 upgradeWFs['PatatrackAllGPU'] = PatatrackWorkflow(
1157  digi = {
1158  # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
1159  '--procModifiers': 'gpu'
1160  },
1161  reco = {
1162  '-s': 'RAW2DIGI:RawToDigi_pixelOnly+RawToDigi_ecalOnly+RawToDigi_hcalOnly,RECO:reconstruction_pixelTrackingOnly+reconstruction_ecalOnly+reconstruction_hcalOnly,VALIDATION:@pixelTrackingOnlyValidation+@ecalOnlyValidation+@hcalOnlyValidation,DQM:@pixelTrackingOnlyDQM+@ecalOnly+@hcalOnly+@hcal2Only',
1163  '--procModifiers': 'pixelNtupletFit,gpu'
1164  },
1165  harvest = {
1166  '-s': 'HARVESTING:@trackingOnlyValidation+@pixelTrackingOnlyDQM+@ecalOnlyValidation+@ecal+@hcalOnlyValidation+@hcalOnly+@hcal2Only'
1167  },
1168  suffix = 'Patatrack_AllGPU',
1169  offset = 0.582,
1170 )
1171 
1172 # Workflow running the Pixel quadruplets, ECAL and HCAL reconstruction on CPU and GPU
1173 # - HLT on GPU (required)
1174 # - reconstruction on CPU and GPU, with DQM and validation for GPU-vs-CPU comparisons
1175 # - harvesting
1176 upgradeWFs['PatatrackAllGPUValidation'] = PatatrackWorkflow(
1177  digi = {
1178  # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
1179  '--accelerators': 'gpu-nvidia',
1180  '--procModifiers': 'gpu'
1181  },
1182  reco = {
1183  '-s': 'RAW2DIGI:RawToDigi_pixelOnly+RawToDigi_ecalOnly+RawToDigi_hcalOnly,RECO:reconstruction_pixelTrackingOnly+reconstruction_ecalOnly+reconstruction_hcalOnly,VALIDATION:@pixelTrackingOnlyValidation+@ecalOnlyValidation+@hcalOnlyValidation,DQM:@pixelTrackingOnlyDQM+@ecalOnly+@hcalOnly+@hcal2Only',
1184  '--accelerators': 'gpu-nvidia',
1185  '--procModifiers': 'pixelNtupletFit,gpuValidation'
1186  },
1187  harvest = {
1188  '-s': 'HARVESTING:@trackingOnlyValidation+@pixelTrackingOnlyDQM+@ecalOnlyValidation+@ecal+@hcalOnlyValidation+@hcalOnly+@hcal2Only',
1189  '--procModifiers': 'gpuValidation'
1190  },
1191  suffix = 'Patatrack_AllGPU_Validation',
1192  offset = 0.583,
1193 )
1194 
1195 # Workflow running the Pixel quadruplets, ECAL and HCAL reconstruction on CPU or GPU, trimmed down for benchmarking
1196 # - HLT on GPU (optional)
1197 # - minimal reconstruction on GPU (optional)
1198 # FIXME workflow 0.584 to be implemented
1199 
1200 # Workflow running the Pixel triplets, ECAL and HCAL reconstruction on CPU
1201 # - HLT on CPU
1202 # - reconstruction on CPU, with DQM and validation
1203 # - harvesting
1204 upgradeWFs['PatatrackAllTripletsCPU'] = PatatrackWorkflow(
1205  digi = {
1206  # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
1207  },
1208  reco = {
1209  '-s': 'RAW2DIGI:RawToDigi_pixelOnly+RawToDigi_ecalOnly+RawToDigi_hcalOnly,RECO:reconstruction_pixelTrackingOnly+reconstruction_ecalOnly+reconstruction_hcalOnly,VALIDATION:@pixelTrackingOnlyValidation+@ecalOnlyValidation+@hcalOnlyValidation,DQM:@pixelTrackingOnlyDQM+@ecalOnly+@hcalOnly+@hcal2Only',
1210  '--procModifiers': 'pixelNtupletFit'
1211  },
1212  harvest = {
1213  '-s': 'HARVESTING:@trackingOnlyValidation+@pixelTrackingOnlyDQM+@ecalOnlyValidation+@ecal+@hcalOnlyValidation+@hcalOnly+@hcal2Only'
1214  },
1215  suffix = 'Patatrack_AllTripletsCPU',
1216  offset = 0.585,
1217 )
1218 
1219 # Workflow running the Pixel triplets, ECAL and HCAL reconstruction on CPU or GPU
1220 # - HLT on GPU (optional)
1221 # - reconstruction on GPU (optional), with DQM and validation
1222 # - harvesting
1223 upgradeWFs['PatatrackAllTripletsGPU'] = PatatrackWorkflow(
1224  digi = {
1225  # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
1226  '--procModifiers': 'gpu'
1227  },
1228  reco = {
1229  '-s': 'RAW2DIGI:RawToDigi_pixelOnly+RawToDigi_ecalOnly+RawToDigi_hcalOnly,RECO:reconstruction_pixelTrackingOnly+reconstruction_ecalOnly+reconstruction_hcalOnly,VALIDATION:@pixelTrackingOnlyValidation+@ecalOnlyValidation+@hcalOnlyValidation,DQM:@pixelTrackingOnlyDQM+@ecalOnly+@hcalOnly+@hcal2Only',
1230  '--procModifiers': 'pixelNtupletFit,gpu'
1231  },
1232  harvest = {
1233  '-s': 'HARVESTING:@trackingOnlyValidation+@pixelTrackingOnlyDQM+@ecalOnlyValidation+@ecal+@hcalOnlyValidation+@hcalOnly+@hcal2Only'
1234  },
1235  suffix = 'Patatrack_AllTripletsGPU',
1236  offset = 0.586,
1237 )
1238 
1239 # Workflow running the Pixel triplets, ECAL and HCAL reconstruction on CPU and GPU
1240 # - HLT on GPU (required)
1241 # - reconstruction on CPU and GPU, with DQM and validation for GPU-vs-CPU comparisons
1242 # - harvesting
1243 upgradeWFs['PatatrackAllTripletsGPUValidation'] = PatatrackWorkflow(
1244  digi = {
1245  # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
1246  '--accelerators': 'gpu-nvidia',
1247  '--procModifiers': 'gpu'
1248  },
1249  reco = {
1250  '-s': 'RAW2DIGI:RawToDigi_pixelOnly+RawToDigi_ecalOnly+RawToDigi_hcalOnly,RECO:reconstruction_pixelTrackingOnly+reconstruction_ecalOnly+reconstruction_hcalOnly,VALIDATION:@pixelTrackingOnlyValidation+@ecalOnlyValidation+@hcalOnlyValidation,DQM:@pixelTrackingOnlyDQM+@ecalOnly+@hcalOnly+@hcal2Only',
1251  '--accelerators': 'gpu-nvidia',
1252  '--procModifiers': 'pixelNtupletFit,gpuValidation'
1253  },
1254  harvest = {
1255  '-s': 'HARVESTING:@trackingOnlyValidation+@pixelTrackingOnlyDQM+@ecalOnlyValidation+@ecal+@hcalOnlyValidation+@hcalOnly+@hcal2Only',
1256  '--procModifiers': 'gpuValidation'
1257  },
1258  suffix = 'Patatrack_AllTripletsGPU_Validation',
1259  offset = 0.587,
1260 )
1261 
1262 # Workflow running the Pixel triplets, ECAL and HCAL reconstruction on CPU or GPU, trimmed down for benchmarking
1263 # - HLT on GPU (optional)
1264 # - minimal reconstruction on GPU (optional)
1265 # FIXME workflow 0.588 to be implemented
1266 
1267 # Workflow running the Pixel quadruplets, ECAL and HCAL reconstruction on CPU, together with the full offline reconstruction
1268 # - HLT on CPU
1269 # - reconstruction on CPU, with DQM and validation
1270 # - harvesting
1271 upgradeWFs['PatatrackFullRecoCPU'] = PatatrackWorkflow(
1272  digi = {
1273  # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
1274  },
1275  reco = {
1276  # skip the @pixelTrackingOnlyValidation which cannot run together with the full reconstruction
1277  '-s': 'RAW2DIGI:RawToDigi+RawToDigi_pixelOnly,L1Reco,RECO:reconstruction+reconstruction_pixelTrackingOnly,RECOSIM,PAT,VALIDATION:@standardValidation+@miniAODValidation,DQM:@standardDQM+@ExtraHLT+@miniAODDQM+@pixelTrackingOnlyDQM',
1278  '--procModifiers': 'pixelNtupletFit'
1279  },
1280  harvest = {
1281  # skip the @pixelTrackingOnlyDQM harvesting
1282  },
1283  suffix = 'Patatrack_FullRecoCPU',
1284  offset = 0.591,
1285 )
1286 
1287 # Workflow running the Pixel quadruplets, ECAL and HCAL reconstruction on GPU (optional), together with the full offline reconstruction on CPU
1288 # - HLT on GPU (optional)
1289 # - reconstruction on GPU (optional), with DQM and validation
1290 # - harvesting
1291 upgradeWFs['PatatrackFullRecoGPU'] = PatatrackWorkflow(
1292  digi = {
1293  # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
1294  '--procModifiers': 'gpu'
1295  },
1296  reco = {
1297  # skip the @pixelTrackingOnlyValidation which cannot run together with the full reconstruction
1298  '-s': 'RAW2DIGI:RawToDigi+RawToDigi_pixelOnly,L1Reco,RECO:reconstruction+reconstruction_pixelTrackingOnly,RECOSIM,PAT,VALIDATION:@standardValidation+@miniAODValidation,DQM:@standardDQM+@ExtraHLT+@miniAODDQM+@pixelTrackingOnlyDQM',
1299  '--procModifiers': 'pixelNtupletFit,gpu'
1300  },
1301  harvest = {
1302  # skip the @pixelTrackingOnlyDQM harvesting
1303  },
1304  suffix = 'Patatrack_FullRecoGPU',
1305  offset = 0.592,
1306 )
1307 
1308 # Workflow running the Pixel quadruplets, ECAL and HCAL reconstruction on CPU and GPU, together with the full offline reconstruction on CPU
1309 # - HLT on GPU (required)
1310 # - reconstruction on CPU and GPU, with DQM and validation for GPU-vs-CPU comparisons
1311 # - harvesting
1312 upgradeWFs['PatatrackFullRecoGPUValidation'] = PatatrackWorkflow(
1313  digi = {
1314  # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
1315  '--accelerators': 'gpu-nvidia',
1316  '--procModifiers': 'gpu'
1317  },
1318  reco = {
1319  # skip the @pixelTrackingOnlyValidation which cannot run together with the full reconstruction
1320  '-s': 'RAW2DIGI:RawToDigi+RawToDigi_pixelOnly,L1Reco,RECO:reconstruction+reconstruction_pixelTrackingOnly,RECOSIM,PAT,VALIDATION:@standardValidation+@miniAODValidation,DQM:@standardDQM+@ExtraHLT+@miniAODDQM+@pixelTrackingOnlyDQM',
1321  '--accelerators': 'gpu-nvidia',
1322  '--procModifiers': 'pixelNtupletFit,gpuValidation'
1323  },
1324  harvest = {
1325  # skip the @pixelTrackingOnlyDQM harvesting
1326  },
1327  suffix = 'Patatrack_FullRecoGPU_Validation',
1328  offset = 0.593,
1329 )
1330 
1331 # Workflow running the Pixel triplets, ECAL and HCAL reconstruction on CPU, together with the full offline reconstruction
1332 # - HLT on CPU
1333 # - reconstruction on CPU, with DQM and validation
1334 # - harvesting
1335 upgradeWFs['PatatrackFullRecoTripletsCPU'] = PatatrackWorkflow(
1336  digi = {
1337  # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
1338  },
1339  reco = {
1340  # skip the @pixelTrackingOnlyValidation which cannot run together with the full reconstruction
1341  '-s': 'RAW2DIGI:RawToDigi+RawToDigi_pixelOnly,L1Reco,RECO:reconstruction+reconstruction_pixelTrackingOnly,RECOSIM,PAT,VALIDATION:@standardValidation+@miniAODValidation,DQM:@standardDQM+@ExtraHLT+@miniAODDQM+@pixelTrackingOnlyDQM',
1342  '--procModifiers': 'pixelNtupletFit',
1343  '--customise' : 'RecoPixelVertexing/Configuration/customizePixelTracksForTriplets.customizePixelTracksForTriplets'
1344  },
1345  harvest = {
1346  # skip the @pixelTrackingOnlyDQM harvesting
1347  },
1348  suffix = 'Patatrack_FullRecoTripletsCPU',
1349  offset = 0.595,
1350 )
1351 
1352 # Workflow running the Pixel triplets, ECAL and HCAL reconstruction on GPU (optional), together with the full offline reconstruction on CPU
1353 # - HLT on GPU (optional)
1354 # - reconstruction on GPU (optional), with DQM and validation
1355 # - harvesting
1356 upgradeWFs['PatatrackFullRecoTripletsGPU'] = PatatrackWorkflow(
1357  digi = {
1358  # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
1359  '--procModifiers': 'gpu'
1360  },
1361  reco = {
1362  # skip the @pixelTrackingOnlyValidation which cannot run together with the full reconstruction
1363  '-s': 'RAW2DIGI:RawToDigi+RawToDigi_pixelOnly,L1Reco,RECO:reconstruction+reconstruction_pixelTrackingOnly,RECOSIM,PAT,VALIDATION:@standardValidation+@miniAODValidation,DQM:@standardDQM+@ExtraHLT+@miniAODDQM+@pixelTrackingOnlyDQM',
1364  '--procModifiers': 'pixelNtupletFit,gpu',
1365  '--customise': 'RecoPixelVertexing/Configuration/customizePixelTracksForTriplets.customizePixelTracksForTriplets'
1366  },
1367  harvest = {
1368  # skip the @pixelTrackingOnlyDQM harvesting
1369  },
1370  suffix = 'Patatrack_FullRecoTripletsGPU',
1371  offset = 0.596,
1372 )
1373 
1374 # Workflow running the Pixel triplets, ECAL and HCAL reconstruction on CPU and GPU, together with the full offline reconstruction on CPU
1375 # - HLT on GPU (required)
1376 # - reconstruction on CPU and GPU, with DQM and validation for GPU-vs-CPU comparisons
1377 # - harvesting
1378 upgradeWFs['PatatrackFullRecoTripletsGPUValidation'] = PatatrackWorkflow(
1379  digi = {
1380  # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
1381  '--accelerators': 'gpu-nvidia',
1382  '--procModifiers': 'gpu'
1383  },
1384  reco = {
1385  # skip the @pixelTrackingOnlyValidation which cannot run together with the full reconstruction
1386  '-s': 'RAW2DIGI:RawToDigi+RawToDigi_pixelOnly,L1Reco,RECO:reconstruction+reconstruction_pixelTrackingOnly,RECOSIM,PAT,VALIDATION:@standardValidation+@miniAODValidation,DQM:@standardDQM+@ExtraHLT+@miniAODDQM+@pixelTrackingOnlyDQM',
1387  '--accelerators': 'gpu-nvidia',
1388  '--procModifiers': 'pixelNtupletFit,gpuValidation',
1389  '--customise' : 'RecoPixelVertexing/Configuration/customizePixelTracksForTriplets.customizePixelTracksForTriplets'
1390  },
1391  harvest = {
1392  # skip the @pixelTrackingOnlyDQM harvesting
1393  },
1394  suffix = 'Patatrack_FullRecoTripletsGPU_Validation',
1395  offset = 0.597,
1396 )
1397 
1398 
1399 # end of Patatrack workflows
1400 
1402  def setup_(self, step, stepName, stepDict, k, properties):
1403  if 'GenSimHLBeamSpot14' in step:
1404  stepDict[stepName][k] = merge([{'--eventcontent': 'RAWSIM', '--datatier': 'GEN-SIM'},stepDict[step][k]])
1405  elif 'Digi' in step and 'Trigger' not in step:
1406  stepDict[stepName][k] = merge([{'-s': 'DIGI,L1,DIGI2RAW,HLT:@relval2022', '--datatier':'GEN-SIM-RAW', '--eventcontent':'RAWSIM'}, stepDict[step][k]])
1407  elif 'DigiTrigger' in step: # for Phase-2
1408  stepDict[stepName][k] = merge([{'-s': 'DIGI,L1TrackTrigger,L1,DIGI2RAW,HLT:@fake2', '--datatier':'GEN-SIM-RAW', '--eventcontent':'RAWSIM'}, stepDict[step][k]])
1409  elif 'Reco' in step:
1410  stepDict[stepName][k] = merge([{'-s': 'RAW2DIGI,L1Reco,RECO,RECOSIM', '--datatier':'AODSIM', '--eventcontent':'AODSIM'}, stepDict[step][k]])
1411  elif 'MiniAOD' in step:
1412  # the separate miniAOD step is used here
1413  stepDict[stepName][k] = deepcopy(stepDict[step][k])
1414  elif 'ALCA' in step or 'HARVEST' in step:
1415  # remove step
1416  stepDict[stepName][k] = None
1417  elif 'Nano'==step:
1418  stepDict[stepName][k] = merge([{'--filein':'file:step4.root','-s':'NANO','--datatier':'NANOAODSIM','--eventcontent':'NANOEDMAODSIM'}, stepDict[step][k]])
1419  def condition(self, fragment, stepList, key, hasHarvest):
1420  return fragment=="TTbar_14TeV" and ('2026' in key or '2021' in key)
1421 upgradeWFs['ProdLike'] = UpgradeWorkflow_ProdLike(
1422  steps = [
1423  'GenSimHLBeamSpot14',
1424  'Digi',
1425  'DigiTrigger',
1426  'Reco',
1427  'RecoFakeHLT',
1428  'RecoGlobal',
1429  'RecoNano',
1430  'RecoNanoFakeHLT',
1431  'HARVEST',
1432  'HARVESTFakeHLT',
1433  'HARVESTGlobal',
1434  'HARVESTNano',
1435  'HARVESTNanoFakeHLT',
1436  'MiniAOD',
1437  'ALCA',
1438  'ALCAPhase2',
1439  'Nano',
1440  ],
1441  PU = [
1442  'GenSimHLBeamSpot14',
1443  'Digi',
1444  'DigiTrigger',
1445  'Reco',
1446  'RecoFakeHLT',
1447  'RecoGlobal',
1448  'RecoNano',
1449  'RecoNanoFakeHLT',
1450  'HARVEST',
1451  'HARVESTFakeHLT',
1452  'HARVESTGlobal',
1453  'HARVESTNano',
1454  'HARVESTNanoFakeHLT',
1455  'MiniAOD',
1456  'ALCA',
1457  'ALCAPhase2',
1458  'Nano',
1459  ],
1460  suffix = '_ProdLike',
1461  offset = 0.21,
1462 )
1463 
1465  def __init__(self, suffix, offset, fixedPU,
1466  steps = [],
1467  PU = [
1468  'GenSimHLBeamSpot14',
1469  'Digi',
1470  'DigiTrigger',
1471  'Reco',
1472  'RecoFakeHLT',
1473  'RecoGlobal',
1474  'RecoNano',
1475  'RecoNanoFakeHLT',
1476  'HARVEST',
1477  'HARVESTFakeHLT',
1478  'HARVESTGlobal',
1479  'HARVESTNano',
1480  'HARVESTNanoFakeHLT',
1481  'MiniAOD',
1482  'ALCA',
1483  'ALCAPhase2',
1484  'Nano',
1485  ]):
1486  super(UpgradeWorkflow_ProdLikeRunningPU, self).__init__(steps, PU, suffix, offset)
1487  self.__fixedPU = fixedPU
1488  def setupPU_(self, step, stepName, stepDict, k, properties):
1489  # change PU skipping ALCA and HARVEST
1490  if stepDict[stepName][k] is not None and '--pileup' in stepDict[stepName][k]:
1491  stepDict[stepName][k]['--pileup'] = 'AVE_' + str(self.__fixedPU) + '_BX_25ns'
1492  def condition(self, fragment, stepList, key, hasHarvest):
1493  # lower PUs for Run3
1494  return (fragment=="TTbar_14TeV") and (('2026' in key) or ('2021' in key and self.__fixedPU<=100))
1495 
1496 # The numbering below is following the 0.21 for ProdLike wfs
1497 # 0.21N would have been a more natural choice but the
1498 # trailing zeros are ignored. Thus 0.21N1 is used
1499 
1500 upgradeWFs['ProdLikePU10'] = UpgradeWorkflow_ProdLikeRunningPU(
1501  suffix = '_ProdLikePU10',
1502  offset = 0.21101,
1503  fixedPU = 10,
1504 )
1505 
1506 upgradeWFs['ProdLikePU20'] = UpgradeWorkflow_ProdLikeRunningPU(
1507  suffix = '_ProdLikePU20',
1508  offset = 0.21201,
1509  fixedPU = 20,
1510 )
1511 
1512 upgradeWFs['ProdLikePU30'] = UpgradeWorkflow_ProdLikeRunningPU(
1513  suffix = '_ProdLikePU30',
1514  offset = 0.21301,
1515  fixedPU = 30,
1516 )
1517 
1518 upgradeWFs['ProdLikePU40'] = UpgradeWorkflow_ProdLikeRunningPU(
1519  suffix = '_ProdLikePU40',
1520  offset = 0.21401,
1521  fixedPU = 40,
1522 )
1523 
1524 upgradeWFs['ProdLikePU50'] = UpgradeWorkflow_ProdLikeRunningPU(
1525  suffix = '_ProdLikePU50',
1526  offset = 0.21501,
1527  fixedPU = 50,
1528 )
1529 
1530 upgradeWFs['ProdLikePU60'] = UpgradeWorkflow_ProdLikeRunningPU(
1531  suffix = '_ProdLikePU60',
1532  offset = 0.21601,
1533  fixedPU = 60,
1534 )
1535 
1536 upgradeWFs['ProdLikePU70'] = UpgradeWorkflow_ProdLikeRunningPU(
1537  suffix = '_ProdLikePU70',
1538  offset = 0.21701,
1539  fixedPU = 70,
1540 )
1541 
1542 upgradeWFs['ProdLikePU80'] = UpgradeWorkflow_ProdLikeRunningPU(
1543  suffix = '_ProdLikePU80',
1544  offset = 0.21801,
1545  fixedPU = 80,
1546 )
1547 
1548 upgradeWFs['ProdLikePU90'] = UpgradeWorkflow_ProdLikeRunningPU(
1549  suffix = '_ProdLikePU90',
1550  offset = 0.21901,
1551  fixedPU = 90,
1552 )
1553 
1554 upgradeWFs['ProdLikePU100'] = UpgradeWorkflow_ProdLikeRunningPU(
1555  suffix = '_ProdLikePU100',
1556  offset = 0.211001,
1557  fixedPU = 100,
1558 )
1559 
1560 upgradeWFs['ProdLikePU120'] = UpgradeWorkflow_ProdLikeRunningPU(
1561  suffix = '_ProdLikePU120',
1562  offset = 0.211201,
1563  fixedPU = 120,
1564 )
1565 
1566 upgradeWFs['ProdLikePU140'] = UpgradeWorkflow_ProdLikeRunningPU(
1567  suffix = '_ProdLikePU140',
1568  offset = 0.211401,
1569  fixedPU = 140,
1570 )
1571 
1572 upgradeWFs['ProdLikePU160'] = UpgradeWorkflow_ProdLikeRunningPU(
1573  suffix = '_ProdLikePU160',
1574  offset = 0.211601,
1575  fixedPU = 160,
1576 )
1577 
1578 upgradeWFs['ProdLikePU180'] = UpgradeWorkflow_ProdLikeRunningPU(
1579  suffix = '_ProdLikePU180',
1580  offset = 0.211801,
1581  fixedPU = 180,
1582 )
1583 
1585  def setup_(self, step, stepName, stepDict, k, properties):
1586  if 'HARVEST' in step:
1587  stepDict[stepName][k] = merge([{'--filein':'file:step3_inDQM.root'}, stepDict[step][k]])
1588  else:
1589  stepDict[stepName][k] = merge([stepDict[step][k]])
1590  def condition(self, fragment, stepList, key, hasHarvest):
1591  return fragment=="TTbar_14TeV" and '2026' in key
1592 upgradeWFs['HLT75e33'] = UpgradeWorkflow_HLT75e33(
1593  steps = [
1594  'GenSimHLBeamSpot14',
1595  'DigiTrigger',
1596  'RecoGlobal',
1597  'HLT75e33',
1598  'HARVESTGlobal',
1599  ],
1600  PU = [
1601  'GenSimHLBeamSpot14',
1602  'DigiTrigger',
1603  'RecoGlobal',
1604  'HLT75e33',
1605  'HARVESTGlobal',
1606  ],
1607  suffix = '_HLT75e33',
1608  offset = 0.75,
1609 )
1610 
1612  def setup_(self, step, stepName, stepDict, k, properties):
1613  if 'DigiTrigger' in step:
1614  stepDict[stepName][k] = merge([{'-s':'DIGI:pdigi_valid,L1TrackTrigger,L1,DIGI2RAW,HLT:@relval2026'}, stepDict[step][k]])
1615  def condition(self, fragment, stepList, key, hasHarvest):
1616  return fragment=="TTbar_14TeV" and '2026' in key
1617 upgradeWFs['HLTwDIGI75e33'] = UpgradeWorkflow_HLTwDIGI75e33(
1618  steps = [
1619  'DigiTrigger',
1620  ],
1621  PU = [
1622  'DigiTrigger',
1623  ],
1624  suffix = '_HLTwDIGI75e33',
1625  offset = 0.76,
1626 )
1627 
1629  def setup_(self, step, stepName, stepDict, k, properties):
1630  if 'GenSim' in step:
1631  custNew = "SimG4Core/Application/NeutronBGforMuonsXS_cff.customise"
1632  else:
1633  custNew = "SLHCUpgradeSimulations/Configuration/customise_mixing.customise_Mix_LongLived_Neutrons"
1634  stepDict[stepName][k] = deepcopy(stepDict[step][k])
1635  if '--customise' in stepDict[stepName][k].keys():
1636  stepDict[stepName][k]['--customise'] += ","+custNew
1637  else:
1638  stepDict[stepName][k]['--customise'] = custNew
1639  def condition(self, fragment, stepList, key, hasHarvest):
1640  return any(fragment==nfrag for nfrag in self.neutronFrags) and any(nkey in key for nkey in self.neutronKeys)
1641 upgradeWFs['Neutron'] = UpgradeWorkflow_Neutron(
1642  steps = [
1643  'GenSim',
1644  'GenSimHLBeamSpot',
1645  'GenSimHLBeamSpot14',
1646  'Digi',
1647  'DigiTrigger',
1648  ],
1649  PU = [
1650  'Digi',
1651  'DigiTrigger',
1652  ],
1653  suffix = '_Neutron',
1654  offset = 0.12,
1655 )
1656 # add some extra info
1657 upgradeWFs['Neutron'].neutronKeys = [x for x in upgradeKeys[2026] if 'PU' not in x]
1658 upgradeWFs['Neutron'].neutronFrags = ['ZMM_14','MinBias_14TeV']
1659 
1661  def setup_(self, step, stepName, stepDict, k, properties):
1662  stepDict[stepName][k] = merge([{'--procModifiers': 'run2_HECollapse_2018'}, stepDict[step][k]])
1663  def condition(self, fragment, stepList, key, hasHarvest):
1664  return fragment=="TTbar_13" and '2018' in key
1665 upgradeWFs['heCollapse'] = UpgradeWorkflow_heCollapse(
1666  steps = [
1667  'GenSim',
1668  'Digi',
1669  'Reco',
1670 # 'RecoFakeHLT',
1671  'HARVEST',
1672  'HARVESTFakeHLT',
1673  'ALCA',
1674  ],
1675  PU = [
1676  'Digi',
1677  'Reco',
1678 # 'RecoFakeHLT',
1679  'HARVEST',
1680  'HARVESTFakeHLT',
1681  ],
1682  suffix = '_heCollapse',
1683  offset = 0.6,
1684 )
1685 
1686 # ECAL Phase 2 development WF
1688  def __init__(self, digi = {}, reco = {}, harvest = {}, **kwargs):
1689  # adapt the parameters for the UpgradeWorkflow init method
1690  super(UpgradeWorkflow_ecalDevel, self).__init__(
1691  steps = [
1692  'DigiTrigger',
1693  'RecoGlobal',
1694  'HARVESTGlobal',
1695  'ALCAPhase2',
1696  ],
1697  PU = [
1698  'DigiTrigger',
1699  'RecoGlobal',
1700  'HARVESTGlobal',
1701  'ALCAPhase2',
1702  ],
1703  **kwargs)
1704  self.__digi = digi
1705  self.__reco = reco
1706  self.__harvest = harvest
1707 
1708  def setup_(self, step, stepName, stepDict, k, properties):
1709  # temporarily remove trigger & downstream steps
1710  mods = {'--era': stepDict[step][k]['--era']+',phase2_ecal_devel'}
1711  if 'Digi' in step:
1712  mods['-s'] = 'DIGI:pdigi_valid,DIGI2RAW'
1713  mods |= self.__digi
1714  elif 'Reco' in step:
1715  mods['-s'] = 'RAW2DIGI,RECO:reconstruction_ecalOnly,VALIDATION:@ecalOnlyValidation,DQM:@ecalOnly'
1716  mods['--datatier'] = 'GEN-SIM-RECO,DQMIO'
1717  mods['--eventcontent'] = 'FEVTDEBUGHLT,DQM'
1718  mods |= self.__reco
1719  elif 'HARVEST' in step:
1720  mods['-s'] = 'HARVESTING:@ecalOnlyValidation+@ecal'
1721  mods |= self.__harvest
1722  stepDict[stepName][k] = merge([mods, stepDict[step][k]])
1723  # skip ALCA step
1724  if 'ALCA' in step:
1725  stepDict[stepName][k] = None
1726 
1727  def condition(self, fragment, stepList, key, hasHarvest):
1728  return fragment=="TTbar_14TeV" and '2026' in key
1729 
1730 # ECAL Phase 2 workflow running on CPU
1731 upgradeWFs['ecalDevel'] = UpgradeWorkflow_ecalDevel(
1732  suffix = '_ecalDevel',
1733  offset = 0.61,
1734 )
1735 
1736 # ECAL Phase 2 workflow running on CPU or GPU (if available)
1737 upgradeWFs['ecalDevelGPU'] = UpgradeWorkflow_ecalDevel(
1738  reco = {'--procModifiers': 'gpu'},
1739  suffix = '_ecalDevelGPU',
1740  offset = 0.612,
1741 )
1742 
1744  def setup_(self, step, stepName, stepDict, k, properties):
1745  myGT=stepDict[step][k]['--conditions']
1746  myGT+="_0T"
1747  stepDict[stepName][k] = merge([{'-n':'1','--magField':'0T','--conditions':myGT}, stepDict[step][k]])
1748  def setupPU_(self, step, stepName, stepDict, k, properties):
1749  # override '-n' setting from PUDataSets in relval_steps.py
1750  stepDict[stepName][k] = merge([{'-n':'1'}, stepDict[step][k]])
1751  def condition(self, fragment, stepList, key, hasHarvest):
1752  return (fragment=="TTbar_13" or fragment=="TTbar_14TeV") and ('2017' in key or '2018' in key or '2021' in key) and ('FS' not in key)
1753 upgradeWFs['0T'] = UpgradeWorkflow_0T(
1754  steps = [
1755  'GenSim',
1756  'Digi',
1757  'Reco',
1758  'RecoFakeHLT',
1759  'HARVEST',
1760  'HARVESTFakeHLT',
1761  'RecoNano',
1762  'RecoNanoFakeHLT',
1763  'HARVESTNano',
1764  'HARVESTNanoFakeHLT',
1765  'ALCA',
1766  ],
1767  PU = [
1768  'Digi',
1769  'Reco',
1770  'RecoFakeHLT',
1771  'HARVEST',
1772  'HARVESTFakeHLT',
1773  'RecoNano',
1774  'RecoNanoFakeHLT',
1775  'HARVESTNano',
1776  'HARVESTNanoFakeHLT',
1777  ],
1778  suffix = '_0T',
1779  offset = 0.24,
1780 )
1781 
1783  def setup_(self, step, stepName, stepDict, k, properties):
1784  if 'Reco' in step and 'Run2_2018' in stepDict[step][k]['--era']:
1785  stepDict[stepName][k] = merge([{'--era': 'Run2_2018,bParking'}, stepDict[step][k]])
1786  def condition(self, fragment, stepList, key, hasHarvest):
1787  return fragment=="TTbar_13" and '2018' in key
1788 upgradeWFs['ParkingBPH'] = UpgradeWorkflow_ParkingBPH(
1789  steps = [
1790  'Reco',
1791  'RecoFakeHLT',
1792  ],
1793  PU = [],
1794  suffix = '_ParkingBPH',
1795  offset = 0.8,
1796 )
1797 
1799  def setup_(self, step, stepName, stepDict, k, properties):
1800  if 'Nano' in step:
1801  stepDict[stepName][k] = merge([{'--customise': 'PhysicsTools/NanoAOD/custom_jme_cff.PrepJMECustomNanoAOD_MC'}, stepDict[step][k]])
1802  def condition(self, fragment, stepList, key, hasHarvest):
1803  return (fragment=="TTbar_13" or fragment=="TTbar_14TeV") and ('2017' in key or '2018' in key or '2021' in key) and ('FS' not in key)
1804 upgradeWFs['JMENano'] = UpgradeWorkflow_JMENano(
1805  steps = [
1806  'Nano',
1807  'RecoNano',
1808  'RecoNanoFakeHLT',
1809  ],
1810  PU = [],
1811  suffix = '_JMENano',
1812  offset = 0.15,
1813 )
1814 
1815 
1816 # common operations for aging workflows
1818  def setup_(self, step, stepName, stepDict, k, properties):
1819  if 'Digi' in step or 'Reco' in step:
1820  stepDict[stepName][k] = merge([{'--customise': 'SLHCUpgradeSimulations/Configuration/aging.customise_aging_'+self.lumi}, stepDict[step][k]])
1821  def condition(self, fragment, stepList, key, hasHarvest):
1822  return '2026' in key
1823 # define several of them
1824 upgradeWFs['Aging1000'] = UpgradeWorkflowAging(
1825  steps = [
1826  'Digi',
1827  'DigiTrigger',
1828  'RecoLocal',
1829  'Reco',
1830  'RecoFakeHLT',
1831  'RecoGlobal',
1832  ],
1833  PU = [
1834  'Digi',
1835  'DigiTrigger',
1836  'RecoLocal',
1837  'Reco',
1838  'RecoFakeHLT',
1839  'RecoGlobal',
1840  ],
1841  suffix = 'Aging1000',
1842  offset = 0.101,
1843 )
1844 upgradeWFs['Aging1000'].lumi = '1000'
1845 upgradeWFs['Aging3000'] = deepcopy(upgradeWFs['Aging1000'])
1846 upgradeWFs['Aging3000'].suffix = 'Aging3000'
1847 upgradeWFs['Aging3000'].offset = 0.103
1848 upgradeWFs['Aging3000'].lumi = '3000'
1849 
1850 #
1851 # Simulates Bias Rail in Phase-2 OT PS modules and X% random bad Strips
1852 # in PS-s and SS sensors
1853 #
1855  def setup_(self, step, stepName, stepDict, k, properties):
1856  if 'Digi' in step:
1857  stepDict[stepName][k] = merge([{'--customise': 'SimTracker/SiPhase2Digitizer/customizeForOTInefficiency.customizeSiPhase2OTInefficiency'+self.percent+'Percent'}, stepDict[step][k]])
1858  def condition(self, fragment, stepList, key, hasHarvest):
1859  return fragment=="TTbar_14TeV" and '2026' in key
1860 # define several of them
1861 upgradeWFs['OTInefficiency'] = UpgradeWorkflow_OTInefficiency(
1862  steps = [
1863  'Digi',
1864  'DigiTrigger',
1865  ],
1866  PU = [
1867  'Digi',
1868  'DigiTrigger',
1869  ],
1870  suffix = '_OTInefficiency',
1871  offset = 0.111,
1872 )
1873 upgradeWFs['OTInefficiency'].percent = 'Zero'
1874 
1875 # 1% bad strips
1876 upgradeWFs['OTInefficiency1PC'] = deepcopy(upgradeWFs['OTInefficiency'])
1877 upgradeWFs['OTInefficiency1PC'].suffix = '_OTInefficiency1PC'
1878 upgradeWFs['OTInefficiency1PC'].offset = 0.112
1879 upgradeWFs['OTInefficiency1PC'].percent = 'One'
1880 
1881 # 5% bad strips
1882 upgradeWFs['OTInefficiency5PC'] = deepcopy(upgradeWFs['OTInefficiency'])
1883 upgradeWFs['OTInefficiency5PC'].suffix = '_OTInefficiency5PC'
1884 upgradeWFs['OTInefficiency5PC'].offset = 0.113
1885 upgradeWFs['OTInefficiency5PC'].percent = 'Five'
1886 
1887 # 10% bad strips
1888 upgradeWFs['OTInefficiency10PC'] = deepcopy(upgradeWFs['OTInefficiency'])
1889 upgradeWFs['OTInefficiency10PC'].suffix = '_OTInefficiency10PC'
1890 upgradeWFs['OTInefficiency10PC'].offset = 0.114
1891 upgradeWFs['OTInefficiency10PC'].percent = 'Ten'
1892 
1893 # Specifying explicitly the --filein is not nice but that was the
1894 # easiest way to "skip" the output of step2 (=premixing stage1) for
1895 # filein (as it goes to pileup_input). It works (a bit accidentally
1896 # though) also for "-i all" because in that case the --filein for DAS
1897 # input is after this one in the list of command line arguments to
1898 # cmsDriver, and gets then used in practice.
1899 digiPremixLocalPileup = {
1900  "--filein": "file:step1.root",
1901  "--pileup_input": "file:step2.root"
1902 }
1903 
1904 # for premix
1906  def setup_(self, step, stepName, stepDict, k, properties):
1907  # just copy steps
1908  stepDict[stepName][k] = merge([stepDict[step][k]])
1909  def setupPU_(self, step, stepName, stepDict, k, properties):
1910  # setup for stage 1
1911  if "GenSim" in stepName:
1912  stepNamePmx = stepName.replace('GenSim','Premix')
1913  if not stepNamePmx in stepDict: stepDict[stepNamePmx] = {}
1914  stepDict[stepNamePmx][k] = merge([
1915  {
1916  '-s': 'GEN,SIM,DIGI:pdigi_valid',
1917  '--datatier': 'PREMIX',
1918  '--eventcontent': 'PREMIX',
1919  '--procModifiers': 'premix_stage1'
1920  },
1921  stepDict[stepName][k]
1922  ])
1923  if "ProdLike" in self.suffix:
1924  stepDict[stepNamePmx][k] = merge([{'-s': 'GEN,SIM,DIGI'},stepDict[stepNamePmx][k]])
1925  # setup for stage 2
1926  elif "Digi" in step or "Reco" in step:
1927  # go back to non-PU step version
1928  d = merge([stepDict[self.getStepName(step)][k]])
1929  if d is None: return
1930  if "Digi" in step:
1931  tmpsteps = []
1932  for s in d["-s"].split(","):
1933  if s == "DIGI" or "DIGI:" in s:
1934  tmpsteps.extend([s, "DATAMIX"])
1935  else:
1936  tmpsteps.append(s)
1937  d = merge([{"-s" : ",".join(tmpsteps),
1938  "--datamix" : "PreMix",
1939  "--procModifiers": "premix_stage2"},
1940  d])
1941  # for combined stage1+stage2
1942  if "_PMXS1S2" in self.suffix:
1943  d = merge([digiPremixLocalPileup, d])
1944  elif "Reco" in step:
1945  if "--procModifiers" in d:
1946  d["--procModifiers"] += ",premix_stage2"
1947  else:
1948  d["--procModifiers"] = "premix_stage2"
1949  stepDict[stepName][k] = d
1950  # Increase the input file step number by one for Nano in combined stage1+stage2
1951  elif "Nano"==step:
1952  # go back to non-PU step version
1953  d = merge([stepDict[self.getStepName(step)][k]])
1954  if "--filein" in d:
1955  filein = d["--filein"]
1956  m = re.search("step(?P<ind>\d+)_", filein)
1957  if m:
1958  d["--filein"] = filein.replace(m.group(), "step%d_"%(int(m.group("ind"))+1))
1959  stepDict[stepName][k] = d
1960  # run2/3 WFs use Nano (not NanoPU) in PU WF
1961  stepDict[self.getStepName(step)][k] = merge([d])
1962  def condition(self, fragment, stepList, key, hasHarvest):
1963  if not 'PU' in key:
1964  return False
1965  if not any(y in key for y in ['2021', '2023', '2024', '2026']):
1966  return False
1967  if self.suffix.endswith("S1"):
1968  return "NuGun" in fragment
1969  return True
1970  def workflow_(self, workflows, num, fragment, stepList, key):
1971  fragmentTmp = fragment
1972  if self.suffix.endswith("S1"):
1973  fragmentTmp = 'PREMIXUP' + key[2:].replace("PU", "").replace("Design", "") + '_PU25'
1974  super(UpgradeWorkflowPremix,self).workflow_(workflows, num, fragmentTmp, stepList, key)
1975 # Premix stage1
1976 upgradeWFs['PMXS1'] = UpgradeWorkflowPremix(
1977  steps = [
1978  ],
1979  PU = [
1980  'GenSim',
1981  'GenSimHLBeamSpot',
1982  'GenSimHLBeamSpot14',
1983  ],
1984  suffix = '_PMXS1',
1985  offset = 0.97,
1986 )
1987 # Premix stage2
1988 upgradeWFs['PMXS2'] = UpgradeWorkflowPremix(
1989  steps = [],
1990  PU = [
1991  'Digi',
1992  'DigiTrigger',
1993  'RecoLocal',
1994  'Reco',
1995  'RecoFakeHLT',
1996  'RecoGlobal',
1997  'RecoNano',
1998  'RecoNanoFakeHLT',
1999  'Nano',
2000  ],
2001  suffix = '_PMXS2',
2002  offset = 0.98,
2003 )
2004 # Premix combined stage1+stage2
2005 upgradeWFs['PMXS1S2'] = UpgradeWorkflowPremix(
2006  steps = [],
2007  PU = [
2008  'GenSim',
2009  'GenSimHLBeamSpot',
2010  'GenSimHLBeamSpot14',
2011  'Digi',
2012  'DigiTrigger',
2013  'RecoLocal',
2014  'Reco',
2015  'RecoFakeHLT',
2016  'RecoGlobal',
2017  'RecoNano',
2018  'RecoNanoFakeHLT',
2019  'Nano',
2020  ],
2021  suffix = '_PMXS1S2',
2022  offset = 0.99,
2023 )
2024 # Alternative version of above w/ less PU for PR tests
2026  def setupPU_(self, step, stepName, stepDict, k, properties):
2027  # adjust first, so it gets copied into new Premix step
2028  if '--pileup' in stepDict[stepName][k]:
2029  stepDict[stepName][k]['--pileup'] = 'AVE_50_BX_25ns_m3p3'
2030  super(UpgradeWorkflowAdjustPU,self).setupPU_(step, stepName, stepDict, k, properties)
2031  def condition(self, fragment, stepList, key, hasHarvest):
2032  # restrict to phase2
2033  return super(UpgradeWorkflowAdjustPU,self).condition(fragment, stepList, key, hasHarvest) and '2026' in key
2034 upgradeWFs['PMXS1S2PR'] = UpgradeWorkflowAdjustPU(
2035  steps = [],
2036  PU = [
2037  'GenSim',
2038  'GenSimHLBeamSpot',
2039  'GenSimHLBeamSpot14',
2040  'Digi',
2041  'DigiTrigger',
2042  'RecoLocal',
2043  'Reco',
2044  'RecoFakeHLT',
2045  'RecoGlobal',
2046  'Nano',
2047  'HARVEST',
2048  'HARVESTFakeHLT',
2049  'HARVESTGlobal',
2050  ],
2051  suffix = '_PMXS1S2PR',
2052  offset = 0.999,
2053 )
2054 
2056  def setup_(self, step, stepName, stepDict, k, properties):
2057  # copy steps, then apply specializations
2058  UpgradeWorkflowPremix.setup_(self, step, stepName, stepDict, k, properties)
2059  UpgradeWorkflow_ProdLike.setup_(self, step, stepName, stepDict, k, properties)
2060  #
2061  if 'Digi' in step:
2062  d = merge([stepDict[self.getStepName(step)][k]])
2063  tmpsteps = []
2064  for s in d["-s"].split(","):
2065  if "DIGI:pdigi_valid" in s:
2066  tmpsteps.append("DIGI")
2067  else:
2068  tmpsteps.append(s)
2069  d = merge([{"-s" : ",".join(tmpsteps),
2070  "--eventcontent": "PREMIXRAW"},
2071  d])
2072  stepDict[stepName][k] = d
2073  if 'Nano'==step:
2074  stepDict[stepName][k] = merge([{'--filein':'file:step5.root','-s':'NANO','--datatier':'NANOAODSIM','--eventcontent':'NANOEDMAODSIM'}, stepDict[step][k]])
2075  def condition(self, fragment, stepList, key, hasHarvest):
2076  # use both conditions
2077  return UpgradeWorkflowPremix.condition(self, fragment, stepList, key, hasHarvest) and UpgradeWorkflow_ProdLike.condition(self, fragment, stepList, key, hasHarvest)
2078 # premix stage2
2079 upgradeWFs['PMXS2ProdLike'] = UpgradeWorkflowPremixProdLike(
2080  steps = [],
2081  PU = [
2082  'Digi',
2083  'DigiTrigger',
2084  'RecoLocal',
2085  'Reco',
2086  'RecoFakeHLT',
2087  'RecoGlobal',
2088  'RecoNano',
2089  'RecoNanoFakeHLT',
2090  'Nano',
2091  'HARVEST',
2092  'HARVESTFakeHLT',
2093  'HARVESTGlobal',
2094  'HARVESTNano',
2095  'HARVESTNanoFakeHLT',
2096  'MiniAOD',
2097  'ALCA',
2098  ],
2099  suffix = '_PMXS2ProdLike',
2100  offset = 0.9821,
2101 )
2102 # premix combined stage1+stage2
2103 upgradeWFs['PMXS1S2ProdLike'] = UpgradeWorkflowPremixProdLike(
2104  steps = [],
2105  PU = [
2106  'GenSim',
2107  'GenSimHLBeamSpot',
2108  'GenSimHLBeamSpot14',
2109  'Digi',
2110  'DigiTrigger',
2111  'RecoLocal',
2112  'Reco',
2113  'RecoFakeHLT',
2114  'RecoGlobal',
2115  'RecoNano',
2116  'RecoNanoFakeHLT',
2117  'Nano',
2118  'HARVEST',
2119  'HARVESTFakeHLT',
2120  'HARVESTGlobal',
2121  'HARVESTNano',
2122  'HARVESTNanoFakeHLT',
2123  'MiniAOD',
2124  'ALCA',
2125  ],
2126  suffix = '_PMXS1S2ProdLike',
2127  offset = 0.9921,
2128 )
2129 
2131  def setup_(self, step, stepName, stepDict, k, properties):
2132  if 'HARVESTFastRun3' in step:
2133  stepDict[stepName][k] = merge([{'-s':'HARVESTING:@trackingOnlyValidation+@trackingOnlyDQM',
2134  '--fast':'',
2135  '--era':'Run3_FastSim',
2136  '--filein':'file:step1_inDQM.root'}, stepDict[step][k]])
2137  else:
2138  stepDict[stepName][k] = merge([stepDict[step][k]])
2139  def condition(self, fragment, stepList, key, hasHarvest):
2140  return ('2021FS' in key or '2023FS' in key)
2141 upgradeWFs['Run3FStrackingOnly'] = UpgradeWorkflow_Run3FStrackingOnly(
2142  steps = [
2143  'Gen',
2144  'FastSimRun3',
2145  'HARVESTFastRun3'
2146  ],
2147  PU = [
2148  'FastSimRun3',
2149  'HARVESTFastRun3'
2150  ],
2151  suffix = '_Run3FSTrackingOnly',
2152  offset = 0.302,
2153 )
2154 
2156  def setup_(self, step, stepName, stepDict, k, properties):
2157  if 'Gen' in step:
2158  stepDict[stepName][k] = merge([{'-s':'GEN,SIM,RECOBEFMIX',
2159  '--fast':'',
2160  '--era':'Run3_FastSim',
2161  '--eventcontent':'FASTPU',
2162  '--datatier':'GEN-SIM-RECO',
2163  '--relval':'27000,3000'}, stepDict[step][k]])
2164  else:
2165  stepDict[stepName][k] = None
2166  def condition(self, fragment, stepList, key, hasHarvest):
2167  return ('2021FS' in key or '2023FS' in key) and fragment=="MinBias_14TeV"
2168 upgradeWFs['Run3FSMBMixing'] = UpgradeWorkflow_Run3FSMBMixing(
2169  steps = [
2170  'Gen',
2171  'FastSimRun3',
2172  'HARVESTFastRun3'
2173  ],
2174  PU = [],
2175  suffix = '_Run3FSMBMixing',
2176  offset = 0.303,
2177 )
2178 
2180  def setup_(self, step, stepName, stepDict, k, properties):
2181  if 'Run3' in stepDict[step][k]['--era'] and 'Fast' not in stepDict[step][k]['--era']:
2182  if '2023' in stepDict[step][k]['--conditions']:
2183  stepDict[stepName][k] = merge([{'--geometry': 'DD4hepExtended2023'}, stepDict[step][k]])
2184  else:
2185  stepDict[stepName][k] = merge([{'--geometry': 'DD4hepExtended2021'}, stepDict[step][k]])
2186  elif 'Phase2' in stepDict[step][k]['--era']:
2187  dd4hepGeom="DD4hep"
2188  dd4hepGeom+=stepDict[step][k]['--geometry']
2189  stepDict[stepName][k] = merge([{'--geometry' : dd4hepGeom, '--procModifiers': 'dd4hep'}, stepDict[step][k]])
2190  def condition(self, fragment, stepList, key, hasHarvest):
2191  return ('2021' in key or '2023' in key or '2026' in key) and ('FS' not in key)
2192 upgradeWFs['DD4hep'] = UpgradeWorkflow_DD4hep(
2193  steps = [
2194  'GenSim',
2195  'GenSimHLBeamSpot',
2196  'GenSimHLBeamSpot14',
2197  'Digi',
2198  'DigiTrigger',
2199  'Reco',
2200  'RecoFakeHLT',
2201  'RecoGlobal',
2202  'RecoNano',
2203  'RecoNanoFakeHLT',
2204  'HARVEST',
2205  'HARVESTFakeHLT',
2206  'HARVESTGlobal',
2207  'HARVESTNano',
2208  'HARVESTNanoFakeHLT',
2209  'ALCA',
2210  ],
2211  PU = [],
2212  suffix = '_DD4hep',
2213  offset = 0.911,
2214 )
2215 upgradeWFs['DD4hep'].allowReuse = False
2216 
2217 #This workflow is now obsolete, it becomes default for Run-3.
2218 #Keep it for future use in Phase-2, then delete
2220  def setup_(self, step, stepName, stepDict, k, properties):
2221  if 'Run3' in stepDict[step][k]['--era'] and 'Fast' not in stepDict[step][k]['--era']:
2222  stepDict[stepName][k] = merge([{'--conditions': 'auto:phase1_2022_realistic', '--geometry': 'DB:Extended'}, stepDict[step][k]])
2223  def condition(self, fragment, stepList, key, hasHarvest):
2224  return '2021' in key and 'FS' not in key
2225 upgradeWFs['DD4hepDB'] = UpgradeWorkflow_DD4hepDB(
2226  steps = [
2227  'GenSim',
2228  'GenSimHLBeamSpot',
2229  'GenSimHLBeamSpot14',
2230  'Digi',
2231  'DigiTrigger',
2232  'Reco',
2233  'RecoFakeHLT',
2234  'RecoGlobal',
2235  'RecoNano',
2236  'RecoNanoFakeHLT',
2237  'HARVEST',
2238  'HARVESTFakeHLT',
2239  'HARVESTGlobal',
2240  'HARVESTNano',
2241  'HARVESTNanoFakeHLT',
2242  'ALCA',
2243  ],
2244  PU = [],
2245  suffix = '_DD4hepDB',
2246  offset = 0.912,
2247 )
2248 upgradeWFs['DD4hepDB'].allowReuse = False
2249 
2251  def setup_(self, step, stepName, stepDict, k, properties):
2252  if 'Run3' in stepDict[step][k]['--era'] and '2023' not in stepDict[step][k]['--era'] and 'Fast' not in stepDict[step][k]['--era']:
2253  # retain any other eras
2254  tmp_eras = stepDict[step][k]['--era'].split(',')
2255  tmp_eras[tmp_eras.index("Run3")] = 'Run3_DDD'
2256  tmp_eras = ','.join(tmp_eras)
2257  stepDict[stepName][k] = merge([{'--conditions': 'auto:phase1_2022_realistic_ddd', '--geometry': 'DB:Extended', '--era': tmp_eras}, stepDict[step][k]])
2258  def condition(self, fragment, stepList, key, hasHarvest):
2259  return '2021' in key and 'FS' not in key
2260 upgradeWFs['DDDDB'] = UpgradeWorkflow_DDDDB(
2261  steps = [
2262  'GenSim',
2263  'GenSimHLBeamSpot',
2264  'GenSimHLBeamSpot14',
2265  'Digi',
2266  'DigiTrigger',
2267  'Reco',
2268  'RecoFakeHLT',
2269  'RecoGlobal',
2270  'RecoNano',
2271  'RecoNanoFakeHLT',
2272  'HARVEST',
2273  'HARVESTFakeHLT',
2274  'HARVESTGlobal',
2275  'HARVESTNano',
2276  'HARVESTNanoFakeHLT',
2277  'ALCA',
2278  ],
2279  PU = [],
2280  suffix = '_DDDDB',
2281  offset = 0.914,
2282 )
2283 upgradeWFs['DDDDB'].allowReuse = False
2284 
2286  def setup_(self, step, stepName, stepDict, k, properties):
2287  stepDict[stepName][k] = merge([{'--procModifiers': 'allSonicTriton'}, stepDict[step][k]])
2288  def condition(self, fragment, stepList, key, hasHarvest):
2289  return (fragment=='TTbar_13' and '2021' in key) \
2290  or (fragment=='TTbar_14TeV' and '2026' in key)
2291 upgradeWFs['SonicTriton'] = UpgradeWorkflow_SonicTriton(
2292  steps = [
2293  'GenSim',
2294  'GenSimHLBeamSpot',
2295  'GenSimHLBeamSpot14',
2296  'Digi',
2297  'DigiTrigger',
2298  'Reco',
2299  'RecoFakeHLT',
2300  'RecoGlobal',
2301  'RecoNano',
2302  'RecoNanoFakeHLT',
2303  'HARVEST',
2304  'HARVESTFakeHLT',
2305  'HARVESTGlobal',
2306  'HARVESTNano',
2307  'HARVESTNanoFakeHLT',
2308  'ALCA',
2309  ],
2310  PU = [
2311  'GenSim',
2312  'GenSimHLBeamSpot',
2313  'GenSimHLBeamSpot14',
2314  'Digi',
2315  'DigiTrigger',
2316  'Reco',
2317  'RecoFakeHLT',
2318  'RecoGlobal',
2319  'RecoNano',
2320  'RecoNanoFakeHLT',
2321  'HARVEST',
2322  'HARVESTFakeHLT',
2323  'HARVESTGlobal',
2324  'HARVESTNano',
2325  'HARVESTNanoFakeHLT',
2326  'ALCA',
2327  ],
2328  suffix = '_SonicTriton',
2329  offset = 0.9001,
2330 )
2331 
2332 # check for duplicate offsets
2333 offsets = [specialWF.offset for specialType,specialWF in upgradeWFs.items()]
2334 seen = set()
2335 dups = set(x for x in offsets if x in seen or seen.add(x))
2336 if len(dups)>0:
2337  raise ValueError("Duplicate special workflow offsets not allowed: "+','.join([str(x) for x in dups]))
2338 
2339 upgradeProperties = {}
2340 
2341 upgradeProperties[2017] = {
2342  '2017' : {
2343  'Geom' : 'DB:Extended',
2344  'GT' : 'auto:phase1_2017_realistic',
2345  'HLTmenu': '@relval2017',
2346  'Era' : 'Run2_2017',
2347  'ScenToRun' : ['GenSim','Digi','RecoFakeHLT','HARVESTFakeHLT','ALCA','Nano'],
2348  },
2349  '2017Design' : {
2350  'Geom' : 'DB:Extended',
2351  'GT' : 'auto:phase1_2017_design',
2352  'HLTmenu': '@relval2017',
2353  'Era' : 'Run2_2017',
2354  'BeamSpot': 'GaussSigmaZ4cm',
2355  'ScenToRun' : ['GenSim','Digi','RecoFakeHLT','HARVESTFakeHLT'],
2356  },
2357  '2018' : {
2358  'Geom' : 'DB:Extended',
2359  'GT' : 'auto:phase1_2018_realistic',
2360  'HLTmenu': '@relval2018',
2361  'Era' : 'Run2_2018',
2362  'BeamSpot': 'Realistic25ns13TeVEarly2018Collision',
2363  'ScenToRun' : ['GenSim','Digi','RecoFakeHLT','HARVESTFakeHLT','ALCA','Nano'],
2364  },
2365  '2018Design' : {
2366  'Geom' : 'DB:Extended',
2367  'GT' : 'auto:phase1_2018_design',
2368  'HLTmenu': '@relval2018',
2369  'Era' : 'Run2_2018',
2370  'BeamSpot': 'GaussSigmaZ4cm',
2371  'ScenToRun' : ['GenSim','Digi','RecoFakeHLT','HARVESTFakeHLT'],
2372  },
2373  '2021' : {
2374  'Geom' : 'DB:Extended',
2375  'GT' : 'auto:phase1_2022_realistic',
2376  'HLTmenu': '@relval2022',
2377  'Era' : 'Run3',
2378  'BeamSpot': 'Realistic25ns13p6TeVEarly2022Collision',
2379  'ScenToRun' : ['GenSim','Digi','RecoNanoFakeHLT','HARVESTNanoFakeHLT','ALCA'],
2380  },
2381  '2021Design' : {
2382  'Geom' : 'DB:Extended',
2383  'GT' : 'auto:phase1_2022_design',
2384  'HLTmenu': '@relval2022',
2385  'Era' : 'Run3',
2386  'BeamSpot': 'GaussSigmaZ4cm',
2387  'ScenToRun' : ['GenSim','Digi','RecoNanoFakeHLT','HARVESTNanoFakeHLT'],
2388  },
2389  '2023' : {
2390  'Geom' : 'DB:Extended',
2391  'GT' : 'auto:phase1_2023_realistic',
2392  'HLTmenu': '@relval2023',
2393  'Era' : 'Run3_2023',
2394  'BeamSpot': 'Realistic25ns13p6TeVEarly2022Collision',
2395  'ScenToRun' : ['GenSim','Digi','RecoNano','HARVESTNano','ALCA'],
2396  },
2397  '2024' : {
2398  'Geom' : 'DB:Extended',
2399  'GT' : 'auto:phase1_2024_realistic',
2400  'HLTmenu': '@relval2023',
2401  'Era' : 'Run3',
2402  'BeamSpot': 'Realistic25ns13p6TeVEarly2022Collision',
2403  'ScenToRun' : ['GenSim','Digi','RecoNano','HARVESTNano','ALCA'],
2404  },
2405  '2021FS' : {
2406  'Geom' : 'DB:Extended',
2407  'GT' : 'auto:phase1_2022_realistic',
2408  'HLTmenu': '@relval2022',
2409  'Era' : 'Run3_FastSim',
2410  'BeamSpot': 'Realistic25ns13p6TeVEarly2022Collision',
2411  'ScenToRun' : ['Gen','FastSimRun3','HARVESTFastRun3'],
2412  },
2413  '2021postEE' : {
2414  'Geom' : 'DB:Extended',
2415  'GT' : 'auto:phase1_2022_realistic_postEE',
2416  'HLTmenu': '@relval2022',
2417  'Era' : 'Run3',
2418  'BeamSpot': 'Realistic25ns13p6TeVEarly2022Collision',
2419  'ScenToRun' : ['GenSim','Digi','RecoNanoFakeHLT','HARVESTNanoFakeHLT','ALCA'],
2420  },
2421  '2023FS' : {
2422  'Geom' : 'DB:Extended',
2423  'GT' : 'auto:phase1_2023_realistic',
2424  'HLTmenu': '@relval2023',
2425  'Era' : 'Run3_FastSim',
2426  'BeamSpot': 'Realistic25ns13p6TeVEarly2022Collision',
2427  'ScenToRun' : ['Gen','FastSimRun3','HARVESTFastRun3'],
2428  },
2429 }
2430 
2431 # standard PU sequences
2432 for key in list(upgradeProperties[2017].keys()):
2433  upgradeProperties[2017][key+'PU'] = deepcopy(upgradeProperties[2017][key])
2434  if 'FS' not in key:
2435  # update ScenToRun list
2436  scenToRun = upgradeProperties[2017][key+'PU']['ScenToRun']
2437  for idx,val in enumerate(scenToRun):
2438  # Digi -> DigiPU, Reco* -> Reco*PU, HARVEST* -> HARVEST*PU
2439  scenToRun[idx] += 'PU'*(val.startswith('Digi') or val.startswith('Reco') or val.startswith('HARVEST'))
2440  # remove ALCA
2441  upgradeProperties[2017][key+'PU']['ScenToRun'] = [foo for foo in scenToRun if foo != 'ALCA']
2442  else:
2443  upgradeProperties[2017][key+'PU']['ScenToRun'] = ['Gen','FastSimRun3PU','HARVESTFastRun3PU']
2444 
2445 upgradeProperties[2026] = {
2446  '2026D86' : {
2447  'Geom' : 'Extended2026D86',
2448  'HLTmenu': '@fake2',
2449  'GT' : 'auto:phase2_realistic_T21',
2450  'Era' : 'Phase2C17I13M9',
2451  'ScenToRun' : ['GenSimHLBeamSpot','DigiTrigger','RecoGlobal', 'HARVESTGlobal', 'ALCAPhase2'],
2452  },
2453  '2026D88' : {
2454  'Geom' : 'Extended2026D88',
2455  'HLTmenu': '@relval2026',
2456  'GT' : 'auto:phase2_realistic_T21',
2457  'Era' : 'Phase2C17I13M9',
2458  'ScenToRun' : ['GenSimHLBeamSpot','DigiTrigger','RecoGlobal', 'HARVESTGlobal', 'ALCAPhase2'],
2459  },
2460  '2026D91' : {
2461  'Geom' : 'Extended2026D91',
2462  'HLTmenu': '@fake2',
2463  'GT' : 'auto:phase2_realistic_T30',
2464  'Era' : 'Phase2C17I13M9',
2465  'ScenToRun' : ['GenSimHLBeamSpot','DigiTrigger','RecoGlobal', 'HARVESTGlobal', 'ALCAPhase2'],
2466  },
2467  '2026D92' : {
2468  'Geom' : 'Extended2026D92',
2469  'HLTmenu': '@fake2',
2470  'GT' : 'auto:phase2_realistic_T21',
2471  'Era' : 'Phase2C17I13M9',
2472  'ScenToRun' : ['GenSimHLBeamSpot','DigiTrigger','RecoGlobal', 'HARVESTGlobal', 'ALCAPhase2'],
2473  },
2474  '2026D93' : {
2475  'Geom' : 'Extended2026D93',
2476  'HLTmenu': '@fake2',
2477  'GT' : 'auto:phase2_realistic_T21',
2478  'Era' : 'Phase2C17I13M9',
2479  'ScenToRun' : ['GenSimHLBeamSpot','DigiTrigger','RecoGlobal', 'HARVESTGlobal', 'ALCAPhase2'],
2480  },
2481  '2026D94' : {
2482  'Geom' : 'Extended2026D94',
2483  'HLTmenu': '@fake2',
2484  'GT' : 'auto:phase2_realistic_T21',
2485  'Era' : 'Phase2C20I13M9',
2486  'ScenToRun' : ['GenSimHLBeamSpot','DigiTrigger','RecoGlobal', 'HARVESTGlobal', 'ALCAPhase2'],
2487  },
2488  '2026D95' : {
2489  'Geom' : 'Extended2026D95',
2490  'HLTmenu': '@relval2026',
2491  'GT' : 'auto:phase2_realistic_T21',
2492  'Era' : 'Phase2C17I13M9',
2493  'ScenToRun' : ['GenSimHLBeamSpot','DigiTrigger','RecoGlobal', 'HARVESTGlobal', 'ALCAPhase2'],
2494  },
2495  '2026D96' : {
2496  'Geom' : 'Extended2026D96',
2497  'HLTmenu': '@fake2',
2498  'GT' : 'auto:phase2_realistic_T21',
2499  'Era' : 'Phase2C17I13M9',
2500  'ScenToRun' : ['GenSimHLBeamSpot','DigiTrigger','RecoGlobal', 'HARVESTGlobal', 'ALCAPhase2'],
2501  },
2502  '2026D97' : {
2503  'Geom' : 'Extended2026D97',
2504  'HLTmenu': '@fake2',
2505  'GT' : 'auto:phase2_realistic_T25',
2506  'Era' : 'Phase2C17I13M9',
2507  'ScenToRun' : ['GenSimHLBeamSpot','DigiTrigger','RecoGlobal', 'HARVESTGlobal', 'ALCAPhase2'],
2508  },
2509  '2026D98' : {
2510  'Geom' : 'Extended2026D98',
2511  'HLTmenu': '@fake2',
2512  'GT' : 'auto:phase2_realistic_T25',
2513  'Era' : 'Phase2C17I13M9',
2514  'ScenToRun' : ['GenSimHLBeamSpot','DigiTrigger','RecoGlobal', 'HARVESTGlobal', 'ALCAPhase2'],
2515  },
2516  '2026D99' : {
2517  'Geom' : 'Extended2026D99',
2518  'HLTmenu': '@fake2',
2519  'GT' : 'auto:phase2_realistic_T25',
2520  'Era' : 'Phase2C17I13M9',
2521  'ScenToRun' : ['GenSimHLBeamSpot','DigiTrigger','RecoGlobal', 'HARVESTGlobal', 'ALCAPhase2'],
2522  },
2523 }
2524 
2525 # standard PU sequences
2526 for key in list(upgradeProperties[2026].keys()):
2527  upgradeProperties[2026][key+'PU'] = deepcopy(upgradeProperties[2026][key])
2528  upgradeProperties[2026][key+'PU']['ScenToRun'] = ['GenSimHLBeamSpot','DigiTriggerPU','RecoGlobalPU', 'HARVESTGlobalPU']
2529 
2530 # for relvals
2531 defaultDataSets = {}
2532 for year in upgradeKeys:
2533  for key in upgradeKeys[year]:
2534  if 'PU' in key: continue
2535  defaultDataSets[key] = ''
2536 
2537 
2539  def __init__(self, howMuch, dataset):
2540  self.howMuch = howMuch
2541  self.dataset = dataset
2542 
2543 upgradeFragments = OrderedDict([
2544  ('FourMuPt_1_200_pythia8_cfi', UpgradeFragment(Kby(10,100),'FourMuPt1_200')),
2545  ('SingleElectronPt10_pythia8_cfi', UpgradeFragment(Kby(9,100),'SingleElectronPt10')),
2546  ('SingleElectronPt35_pythia8_cfi', UpgradeFragment(Kby(9,100),'SingleElectronPt35')),
2547  ('SingleElectronPt1000_pythia8_cfi', UpgradeFragment(Kby(9,50),'SingleElectronPt1000')),
2548  ('SingleGammaPt10_pythia8_cfi', UpgradeFragment(Kby(9,100),'SingleGammaPt10')),
2549  ('SingleGammaPt35_pythia8_cfi', UpgradeFragment(Kby(9,50),'SingleGammaPt35')),
2550  ('SingleMuPt1_pythia8_cfi', UpgradeFragment(Kby(25,100),'SingleMuPt1')),
2551  ('SingleMuPt10_Eta2p85_cfi', UpgradeFragment(Kby(9,100),'SingleMuPt10')),
2552  ('SingleMuPt100_Eta2p85_cfi', UpgradeFragment(Kby(9,100),'SingleMuPt100')),
2553  ('SingleMuPt1000_Eta2p85_cfi', UpgradeFragment(Kby(9,100),'SingleMuPt1000')),
2554  ('FourMuExtendedPt_1_200_pythia8_cfi', UpgradeFragment(Kby(10,100),'FourMuExtendedPt1_200')),
2555  ('TenMuExtendedE_0_200_pythia8_cfi', UpgradeFragment(Kby(10,100),'TenMuExtendedE_0_200')),
2556  ('DoubleElectronPt10Extended_pythia8_cfi', UpgradeFragment(Kby(9,100),'SingleElPt10Extended')),
2557  ('DoubleElectronPt35Extended_pythia8_cfi', UpgradeFragment(Kby(9,100),'SingleElPt35Extended')),
2558  ('DoubleElectronPt1000Extended_pythia8_cfi', UpgradeFragment(Kby(9,50),'SingleElPt1000Extended')),
2559  ('DoubleGammaPt10Extended_pythia8_cfi', UpgradeFragment(Kby(9,100),'SingleGammaPt10Extended')),
2560  ('DoubleGammaPt35Extended_pythia8_cfi', UpgradeFragment(Kby(9,50),'SingleGammaPt35Extended')),
2561  ('DoubleMuPt1Extended_pythia8_cfi', UpgradeFragment(Kby(25,100),'SingleMuPt1Extended')),
2562  ('DoubleMuPt10Extended_pythia8_cfi', UpgradeFragment(Kby(25,100),'SingleMuPt10Extended')),
2563  ('DoubleMuPt100Extended_pythia8_cfi', UpgradeFragment(Kby(9,100),'SingleMuPt100Extended')),
2564  ('DoubleMuPt1000Extended_pythia8_cfi', UpgradeFragment(Kby(9,100),'SingleMuPt1000Extended')),
2565  ('TenMuE_0_200_pythia8_cfi', UpgradeFragment(Kby(10,100),'TenMuE_0_200')),
2566  ('SinglePiE50HCAL_pythia8_cfi', UpgradeFragment(Kby(50,500),'SinglePiE50HCAL')),
2567  ('MinBias_13TeV_pythia8_TuneCUETP8M1_cfi', UpgradeFragment(Kby(90,100),'MinBias_13')),
2568  ('TTbar_13TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,50),'TTbar_13')),
2569  ('ZEE_13TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,100),'ZEE_13')),
2570  ('QCD_Pt_600_800_13TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,50),'QCD_Pt_600_800_13')),
2571  ('Wjet_Pt_80_120_14TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,100),'Wjet_Pt_80_120_14TeV')),
2572  ('Wjet_Pt_3000_3500_14TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,50),'Wjet_Pt_3000_3500_14TeV')),
2573  ('LM1_sfts_14TeV_cfi', UpgradeFragment(Kby(9,100),'LM1_sfts_14TeV')),
2574  ('QCD_Pt_3000_3500_14TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,50),'QCD_Pt_3000_3500_14TeV')),
2575  ('QCD_Pt_80_120_14TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,100),'QCD_Pt_80_120_14TeV')),
2576  ('H200ChargedTaus_Tauola_14TeV_cfi', UpgradeFragment(Kby(9,100),'Higgs200ChargedTaus_14TeV')),
2577  ('JpsiMM_14TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(66,100),'JpsiMM_14TeV')),
2578  ('TTbar_14TeV_TuneCP5_cfi', UpgradeFragment(Kby(9,100),'TTbar_14TeV')),
2579  ('WE_14TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,100),'WE_14TeV')),
2580  ('ZTT_Tauola_All_hadronic_14TeV_TuneCP5_cfi', UpgradeFragment(Kby(9,100),'ZTT_14TeV')),
2581  ('H130GGgluonfusion_14TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,100),'H130GGgluonfusion_14TeV')),
2582  ('PhotonJet_Pt_10_14TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,100),'PhotonJets_Pt_10_14TeV')),
2583  ('QQH1352T_Tauola_14TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,100),'QQH1352T_Tauola_14TeV')),
2584  ('MinBias_14TeV_pythia8_TuneCP5_cfi', UpgradeFragment(Kby(90,100),'MinBias_14TeV')),
2585  ('WToMuNu_14TeV_TuneCP5_pythia8_cfi', UpgradeFragment(Kby(9,100),'WToMuNu_14TeV')),
2586  ('ZMM_13TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(18,100),'ZMM_13')),
2587  ('QCDForPF_14TeV_TuneCP5_cfi', UpgradeFragment(Kby(50,100),'QCD_FlatPt_15_3000HS_14')),
2588  ('DYToLL_M-50_14TeV_pythia8_cff', UpgradeFragment(Kby(9,100),'DYToLL_M_50_14TeV')),
2589  ('DYToTauTau_M-50_14TeV_pythia8_tauola_cff', UpgradeFragment(Kby(9,100),'DYtoTauTau_M_50_14TeV')),
2590  ('ZEE_14TeV_TuneCP5_cfi', UpgradeFragment(Kby(9,100),'ZEE_14')),
2591  ('QCD_Pt_80_120_13TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,100),'QCD_Pt_80_120_13')),
2592  ('H125GGgluonfusion_13TeV_TuneCP5_cfi', UpgradeFragment(Kby(9,50),'H125GGgluonfusion_13')),
2593  ('QCD_Pt20toInf_MuEnrichedPt15_14TeV_TuneCP5_cff', UpgradeFragment(Kby(19565, 217391),'QCD_Pt20toInfMuEnrichPt15_14')), # effi = 4.6e-4, local=8.000e-04
2594  ('ZMM_14TeV_TuneCP5_cfi', UpgradeFragment(Kby(18,100),'ZMM_14')),
2595  ('QCD_Pt15To7000_Flat_14TeV_TuneCP5_cff', UpgradeFragment(Kby(9,50),'QCD_Pt15To7000_Flat_14')),
2596  ('H125GGgluonfusion_14TeV_TuneCP5_cfi', UpgradeFragment(Kby(9,50),'H125GGgluonfusion_14')),
2597  ('QCD_Pt_600_800_14TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,50),'QCD_Pt_600_800_14')),
2598  ('UndergroundCosmicSPLooseMu_cfi', UpgradeFragment(Kby(9,50),'CosmicsSPLoose')),
2599  ('BeamHalo_13TeV_cfi', UpgradeFragment(Kby(9,50),'BeamHalo_13')),
2600  ('H200ChargedTaus_Tauola_13TeV_cfi', UpgradeFragment(Kby(9,50),'Higgs200ChargedTaus_13')),
2601  ('ADDMonoJet_13TeV_d3MD3_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,50),'ADDMonoJet_d3MD3_13')),
2602  ('ZpMM_13TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,50),'ZpMM_13')),
2603  ('QCD_Pt_3000_3500_13TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,50),'QCD_Pt_3000_3500_13')),
2604  ('WpM_13TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,50),'WpM_13')),
2605  ('SingleNuE10_cfi', UpgradeFragment(Kby(9,50),'NuGun')),
2606  ('TTbarLepton_13TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,50),'TTbarLepton_13')),
2607  ('WE_13TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,50),'WE_13')),
2608  ('WM_13TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,50),'WM_13')),
2609  ('ZTT_All_hadronic_13TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,50),'ZTT_13')),
2610  ('PhotonJet_Pt_10_13TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,50),'PhotonJets_Pt_10_13')),
2611  ('QQH1352T_13TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,50),'QQH1352T_13')),
2612  ('Wjet_Pt_80_120_13TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,50),'Wjet_Pt_80_120_13')),
2613  ('Wjet_Pt_3000_3500_13TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,50),'Wjet_Pt_3000_3500_13')),
2614  ('SMS-T1tttt_mGl-1500_mLSP-100_13TeV-pythia8_cfi', UpgradeFragment(Kby(9,50),'SMS-T1tttt_mGl-1500_mLSP-100_13')),
2615  ('QCDForPF_13TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(50,100),'QCD_FlatPt_15_3000HS_13')),
2616  ('PYTHIA8_PhiToMuMu_TuneCUETP8M1_13TeV_cff', UpgradeFragment(Kby(9,50),'PhiToMuMu_13')),
2617  ('RSKKGluon_m3000GeV_13TeV_TuneCUETP8M1_cff', UpgradeFragment(Kby(9,50),'RSKKGluon_m3000GeV_13')),
2618  ('ZpMM_2250_13TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,50),'ZpMM_2250_13')),
2619  ('ZpEE_2250_13TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,50),'ZpEE_2250_13')),
2620  ('ZpTT_1500_13TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,50),'ZpTT_1500_13')),
2621  ('Upsilon1SToMuMu_forSTEAM_13TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,50),'Upsilon1SToMuMu_13')),
2622  ('EtaBToJpsiJpsi_forSTEAM_TuneCUEP8M1_13TeV_cfi', UpgradeFragment(Kby(9,50),'EtaBToJpsiJpsi_13')),
2623  ('JpsiMuMu_Pt-8_forSTEAM_13TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(3100,100000),'JpsiMuMu_Pt-8')),
2624  ('BuMixing_BMuonFilter_forSTEAM_13TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(900,10000),'BuMixing_13')),
2625  ('HSCPstop_M_200_TuneCUETP8M1_13TeV_pythia8_cff', UpgradeFragment(Kby(9,50),'HSCPstop_M_200_13')),
2626  ('RSGravitonToGammaGamma_kMpl01_M_3000_TuneCUETP8M1_13TeV_pythia8_cfi', UpgradeFragment(Kby(9,50),'RSGravitonToGaGa_13')),
2627  ('WprimeToENu_M-2000_TuneCUETP8M1_13TeV-pythia8_cff', UpgradeFragment(Kby(9,50),'WpToENu_M-2000_13')),
2628  ('DisplacedSUSY_stopToBottom_M_800_500mm_TuneCP5_13TeV_pythia8_cff', UpgradeFragment(Kby(9,50),'DisplacedSUSY_stopToB_M_800_500mm_13')),
2629  ('TenE_E_0_200_pythia8_cfi', UpgradeFragment(Kby(9,100),'TenE_0_200')),
2630  ('FlatRandomPtAndDxyGunProducer_cfi', UpgradeFragment(Kby(9,100),'DisplacedMuonsDxy_0_500')),
2631  ('TenTau_E_15_500_pythia8_cfi', UpgradeFragment(Kby(9,100),'TenTau_15_500')),
2632  ('SinglePiPt25Eta1p7_2p7_cfi', UpgradeFragment(Kby(9,100),'SinglePiPt25Eta1p7_2p7')),
2633  ('SingleMuPt15Eta1p7_2p7_cfi', UpgradeFragment(Kby(9,100),'SingleMuPt15Eta1p7_2p7')),
2634  ('SingleGammaPt25Eta1p7_2p7_cfi', UpgradeFragment(Kby(9,100),'SingleGammaPt25Eta1p7_2p7')),
2635  ('SingleElectronPt15Eta1p7_2p7_cfi', UpgradeFragment(Kby(9,100),'SingleElectronPt15Eta1p7_2p7')),
2636  ('ZTT_All_hadronic_14TeV_TuneCP5_cfi', UpgradeFragment(Kby(9,50),'ZTT_14')),
2637  ('CloseByParticle_Photon_ERZRanges_cfi', UpgradeFragment(Kby(9,100),'CloseByParticleGun')),
2638  ('CE_E_Front_300um_cfi', UpgradeFragment(Kby(9,100),'CloseByPGun_CE_E_Front_300um')),
2639  ('CE_E_Front_200um_cfi', UpgradeFragment(Kby(9,100),'CloseByPGun_CE_E_Front_200um')),
2640  ('CE_E_Front_120um_cfi', UpgradeFragment(Kby(9,100),'CloseByPGun_CE_E_Front_120um')),
2641  ('CE_H_Fine_300um_cfi', UpgradeFragment(Kby(9,100),'CloseByPGun_CE_H_Fine_300um')),
2642  ('CE_H_Fine_200um_cfi', UpgradeFragment(Kby(9,100),'CloseByPGun_CE_H_Fine_200um')),
2643  ('CE_H_Fine_120um_cfi', UpgradeFragment(Kby(9,100),'CloseByPGun_CE_H_Fine_120um')),
2644  ('CE_H_Coarse_Scint_cfi', UpgradeFragment(Kby(9,100),'CloseByPGun_CE_H_Coarse_Scint')),
2645  ('CE_H_Coarse_300um_cfi', UpgradeFragment(Kby(9,100),'CloseByPGun_CE_H_Coarse_300um')),
2646  ('SingleElectronFlatPt2To100_cfi', UpgradeFragment(Kby(9,100),'SingleEFlatPt2To100')),
2647  ('SingleMuFlatPt0p7To10_cfi', UpgradeFragment(Kby(9,100),'SingleMuFlatPt0p7To10')),
2648  ('SingleMuFlatPt2To100_cfi', UpgradeFragment(Kby(9,100),'SingleMuFlatPt2To100')),
2649  ('SingleGammaFlatPt8To150_cfi', UpgradeFragment(Kby(9,100),'SingleGammaFlatPt8To150')),
2650  ('SinglePiFlatPt0p7To10_cfi', UpgradeFragment(Kby(9,100),'SinglePiFlatPt0p7To10')),
2651  ('SingleTauFlatPt2To150_cfi', UpgradeFragment(Kby(9,100),'SingleTauFlatPt2To150')),
2652  ('FlatRandomPtAndDxyGunProducer_MuPt2To10_cfi', UpgradeFragment(Kby(9,100),'DisplacedMuPt2To10')),
2653  ('FlatRandomPtAndDxyGunProducer_MuPt10To30_cfi', UpgradeFragment(Kby(9,100),'DisplacedMuPt10To30')),
2654  ('FlatRandomPtAndDxyGunProducer_MuPt30To100_cfi', UpgradeFragment(Kby(9,100),'DisplacedMuPt30To100')),
2655  ('B0ToKstarMuMu_14TeV_TuneCP5_cfi', UpgradeFragment(Kby(304,3030),'B0ToKstarMuMu_14TeV')), # 3.3%
2656  ('BsToEleEle_14TeV_TuneCP5_cfi', UpgradeFragment(Kby(223,2222),'BsToEleEle_14TeV')), # 4.5%
2657  ('BsToJpsiGamma_14TeV_TuneCP5_cfi', UpgradeFragment(Kby(2500,25000),'BsToJpsiGamma_14TeV')), # 0.4%
2658  ('BsToJpsiPhi_mumuKK_14TeV_TuneCP5_cfi', UpgradeFragment(Kby(910,9090),'BsToJpsiPhi_mumuKK_14TeV')), # 1.1%
2659  ('BsToMuMu_14TeV_TuneCP5_cfi', UpgradeFragment(Kby(313,3125),'BsToMuMu_14TeV')), # 3.2%
2660  ('BsToPhiPhi_KKKK_14TeV_TuneCP5_cfi', UpgradeFragment(Kby(556,5555),'BsToPhiPhi_KKKK_14TeV')), # 1.8%
2661  ('TauToMuMuMu_14TeV_TuneCP5_cfi', UpgradeFragment(Kby(18939,189393),'TauToMuMuMu_14TeV')), # effi = 5.280e-04
2662  ('BdToKstarEleEle_14TeV_TuneCP5_cfi', UpgradeFragment(Kby(206,2061),'BdToKstarEleEle_14TeV')), #effi = 4.850e-02
2663  ('ZpTT_1500_14TeV_TuneCP5_cfi', UpgradeFragment(Kby(9,50),'ZpTT_1500_14')),
2664  ('BuMixing_BMuonFilter_forSTEAM_14TeV_TuneCP5_cfi', UpgradeFragment(Kby(900,10000),'BuMixing_14')),
2665  ('Upsilon1SToMuMu_forSTEAM_14TeV_TuneCP5_cfi', UpgradeFragment(Kby(9,50),'Upsilon1SToMuMu_14')),
2666  ('TenTau_E_15_500_Eta3p1_pythia8_cfi', UpgradeFragment(Kby(9,100),'TenTau_15_500_Eta3p1')),
2667  ('QCD_Pt_1800_2400_14TeV_TuneCP5_cfi', UpgradeFragment(Kby(9,50), 'QCD_Pt_1800_2400_14')),
2668  ('DisplacedSUSY_stopToBottom_M_800_500mm_TuneCP5_14TeV_pythia8_cff', UpgradeFragment(Kby(9,50),'DisplacedSUSY_14TeV')),
2669  ('GluGluTo2Jets_M_300_2000_14TeV_Exhume_cff',UpgradeFragment(Kby(9,100),'GluGluTo2Jets_14TeV')),
2670  ('TTbarToDilepton_mt172p5_TuneCP5_14TeV_pythia8_cfi',UpgradeFragment(Kby(9,50),'TTbarToDilepton_14TeV')),
2671  ('QQToHToTauTau_mh125_TuneCP5_14TeV_pythia8_cfi',UpgradeFragment(Kby(9,50),'QQToHToTauTau_14TeV')),
2672  ('ZpToEE_m6000_TuneCP5_14TeV_pythia8_cfi',UpgradeFragment(Kby(9,50),'ZpToEE_m6000_14TeV')),
2673  ('ZpToMM_m6000_TuneCP5_14TeV_pythia8_cfi',UpgradeFragment(Kby(9,50),'ZpToMM_m6000_14TeV')),
2674  ('SMS-T1tttt_mGl-1500_mLSP-100_TuneCP5_14TeV_pythia8_cfi',UpgradeFragment(Kby(9,50),'SMS-T1tttt_14TeV')),
2675  ('VBFHZZ4Nu_TuneCP5_14TeV_pythia8_cfi',UpgradeFragment(Kby(9,50),'VBFHZZ4Nu_14TeV')),
2676  ('EtaBToJpsiJpsi_14TeV_TuneCP5_pythia8_cfi',UpgradeFragment(Kby(9,50),'EtaBToJpsiJpsi_14TeV')),
2677  ('WToLNu_14TeV_TuneCP5_pythia8_cfi',UpgradeFragment(Kby(21,50),'WToLNu_14TeV')),
2678  ('WprimeToLNu_M2000_14TeV_TuneCP5_pythia8_cfi',UpgradeFragment(Kby(21,50),'WprimeToLNu_M2000_14TeV')),
2679  ('DoubleMuFlatPt1p5To8_cfi', UpgradeFragment(Kby(9,100),'SingleMuFlatPt1p5To8')),
2680  ('DoubleElectronFlatPt1p5To8_cfi', UpgradeFragment(Kby(9,100),'SingleElectronFlatPt1p5To8')),
2681  ('DoubleMuFlatPt1p5To8Dxy100GunProducer_cfi', UpgradeFragment(Kby(9,100),'DisplacedMuPt1p5To8Dxy100')),
2682  ('DoubleMuFlatPt2To100Dxy100GunProducer_cfi', UpgradeFragment(Kby(9,100),'DisplacedMuPt2To100Dxy100')),
2683  ('BuToJPsiPrimeKToJPsiPiPiK_14TeV_TuneCP5_pythia8_cfi', UpgradeFragment(Kby(223,2222),'BuToJPsiPrimeKToJPsiPiPiK_14TeV')), # 5.7%
2684  ('Psi2SToJPsiPiPi_14TeV_TuneCP5_pythia8_cfi', UpgradeFragment(Kby(45,500),'Psi2SToJPsiPiPi_14TeV')), # 24.6%
2685  ('XiMinus_13p6TeV_SoftQCDInel_TuneCP5_cfi', UpgradeFragment(Kby(8000,90000),'XiMinus_13p6TeV')), #2.8%
2686  ('Chib1PToUpsilon1SGamma_MuFilter_TuneCP5_14TeV-pythia8_evtgen_cfi', UpgradeFragment(Kby(3600,36000),'Chib1PToUpsilon1SGamma_14TeV')), #2.8%
2687  ('ChicToJpsiGamma_MuFilter_TuneCP5_14TeV_pythia8_evtgen_cfi', UpgradeFragment(Kby(2000,20000),'ChicToJpsiGamma_14TeV')), #5%
2688  ('B0ToJpsiK0s_JMM_Filter_DGamma0_TuneCP5_13p6TeV-pythia8-evtgen_cfi',UpgradeFragment(Kby(38000,38000),'B0ToJpsiK0s_DGamma0_13p6TeV')), #2.7%
2689  ('DStarToD0Pi_D0ToKsPiPi_inclusive_SoftQCD_TuneCP5_13p6TeV-pythia8-evtgen',UpgradeFragment(Kby(38000,38000),'DStarToD0Pi_D0ToKsPiPi_13p6TeV')), #1.3%
2690  ('LbToJpsiLambda_JMM_Filter_DGamma0_TuneCP5_13p6TeV-pythia8-evtgen_cfi',UpgradeFragment(Mby(66,660000),'LbToJpsiLambda_DGamma0_13p6TeV')), #0.3%
2691  ('LbToJpsiXiK0sPi_JMM_Filter_DGamma0_TuneCP5_13p6TeV-pythia8-evtgen_cfi',UpgradeFragment(Mby(50,500000),'LbToJpsiXiK0sPr_DGamma0_13p6TeV')), #0.6%
2692  ('OmegaMinus_13p6TeV_SoftQCDInel_TuneCP5_cfi',UpgradeFragment(Mby(100,1000000),'OmegaMinus_13p6TeV')), #0.1%
2693 ])
def condition(self, fragment, stepList, key, hasHarvest)
def setup_(self, step, stepName, stepDict, k, properties)
def condition(self, fragment, stepList, key, hasHarvest)
def setupPU_(self, step, stepName, stepDict, k, properties)
Definition: merge.py:1
def setup_(self, step, stepName, stepDict, k, properties)
def condition(self, fragment, stepList, key, hasHarvest)
def setup_(self, step, stepName, stepDict, k, properties)
def setup_(self, step, stepName, stepDict, k, properties)
def setupPU_(self, step, stepName, stepDict, k, properties)
def setup_(self, step, stepName, stepDict, k, properties)
def condition(self, fragment, stepList, key, hasHarvest)
def setup_(self, step, stepName, stepDict, k, properties)
def condition(self, fragment, stepList, key, hasHarvest)
def condition(self, fragment, stepList, key, hasHarvest)
def setup_(self, step, stepName, stepDict, k, properties)
def setup_(self, step, stepName, stepDict, k, properties)
def setup_(self, step, stepName, stepDict, k, properties)
def setup_(self, step, stepName, stepDict, k, properties)
bool any(const std::vector< T > &v, const T &what)
Definition: ECalSD.cc:37
def setupPU(self, stepDict, k, properties)
def condition(self, fragment, stepList, key, hasHarvest)
def condition(self, fragment, stepList, key, hasHarvest)
def condition_(self, fragment, stepList, key, hasHarvest)
def condition(self, fragment, stepList, key, hasHarvest)
def setupPU_(self, step, stepName, stepDict, k, properties)
def replace(string, replacements)
def condition(self, fragment, stepList, key, hasHarvest)
def condition(self, fragment, stepList, key, hasHarvest)
def condition(self, fragment, stepList, key, hasHarvest)
def setup_(self, step, stepName, stepDict, k, properties)
def workflow_(self, workflows, num, fragment, stepList, key)
def condition(self, fragment, stepList, key, hasHarvest)
def workflow_(self, workflows, num, fragment, stepList, key)
def setup_(self, step, stepName, stepDict, k, properties)
def setup_(self, step, stepName, stepDict, k, properties)
def condition(self, fragment, stepList, key, hasHarvest)
def condition(self, fragment, stepList, key, hasHarvest)
def condition_(self, fragment, stepList, key, hasHarvest)
def setup_(self, step, stepName, stepDict, k, properties)
def setup__(self, step, stepName, stepDict, k, properties)
def setup_(self, step, stepName, stepDict, k, properties)
def condition(self, fragment, stepList, key, hasHarvest)
def condition(self, fragment, stepList, key, hasHarvest)
def condition(self, fragment, stepList, key, hasHarvest)
def setupPU_(self, step, stepName, stepDict, k, properties)
def __init__(self, digi={}, reco={}, harvest={}, kwargs)
def condition(self, fragment, stepList, key, hasHarvest)
def setup_(self, step, stepName, stepDict, k, properties)
def workflow(self, workflows, num, fragment, stepList, key, hasHarvest)
def setup_(self, step, stepName, stepDict, k, properties)
def setup_(self, step, stepName, stepDict, k, properties)
def condition(self, fragment, stepList, key, hasHarvest)
def setup_(self, step, stepName, stepDict, k, properties)
def condition(self, fragment, stepList, key, hasHarvest)
def setup_(self, step, stepName, stepDict, k, properties)
def setup_(self, step, stepName, stepDict, k, properties)
def setup_(self, step, stepName, stepDict, k, properties)
def condition(self, fragment, stepList, key, hasHarvest)
def condition(self, fragment, stepList, key, hasHarvest)
def setup__(self, step, stepName, stepDict, k, properties)
def condition(self, fragment, stepList, key, hasHarvest)
def setupPU_(self, step, stepName, stepDict, k, properties)
def setup_(self, step, stepName, stepDict, k, properties)
def setup_(self, step, stepName, stepDict, k, properties)
def setup__(self, step, stepName, stepDict, k, properties)
def condition(self, fragment, stepList, key, hasHarvest)
def condition_(self, fragment, stepList, key, hasHarvest)
def setup_(self, step, stepName, stepDict, k, properties)
def setup__(self, step, stepName, stepDict, k, properties)
def condition_(self, fragment, stepList, key, hasHarvest)
def setup_(self, step, stepName, stepDict, k, properties)
static std::string join(char **cmd)
Definition: RemoteFile.cc:19
def condition(self, fragment, stepList, key, hasHarvest)
def setup_(self, step, stepName, stepDict, k, properties)
def setup_(self, step, stepName, stepDict, k, properties)
def setup_(self, step, stepName, stepDict, k, properties)
def condition(self, fragment, stepList, key, hasHarvest)
def condition_(self, fragment, stepList, key, hasHarvest)
def setup__(self, step, stepName, stepDict, k, properties)
def setup__(self, step, stepName, stepDict, k, properties)
#define update(a, b)
def Mby(N, s)
Definition: MatrixUtil.py:237
def setup_(self, step, stepName, stepDict, k, properties)
def setup_(self, step, stepName, stepDict, k, properties)
def condition(self, fragment, stepList, key, hasHarvest)
def condition(self, fragment, stepList, key, hasHarvest)
def setup_(self, step, stepName, stepDict, k, properties)
def condition_(self, fragment, stepList, key, hasHarvest)
def setup_(self, step, stepName, stepDict, k, properties)
def Kby(N, s)
Standard release validation samples ####.
Definition: MatrixUtil.py:235
def __init__(self, steps, PU, suffix, offset)
def setup_(self, step, stepName, stepDict, k, properties)
def condition(self, fragment, stepList, key, hasHarvest)
def setup__(self, step, stepName, stepDict, k, properties)
#define str(s)
def condition(self, fragment, stepList, key, hasHarvest)
def condition(self, fragment, stepList, key, hasHarvest)
def __init__(self, suffix, offset, fixedPU, steps=[], PU=['GenSimHLBeamSpot14', Digi, DigiTrigger, Reco, RecoFakeHLT, RecoGlobal, RecoNano, RecoNanoFakeHLT, HARVEST, HARVESTFakeHLT, HARVESTGlobal, HARVESTNano, HARVESTNanoFakeHLT, MiniAOD, ALCA, ALCAPhase2, Nano)
def condition(self, fragment, stepList, key, hasHarvest)
def condition(self, fragment, stepList, key, hasHarvest)
def condition(self, fragment, stepList, key, hasHarvest)
def condition(self, fragment, stepList, key, hasHarvest)
def __init__(self, digi={}, reco={}, harvest={}, kwargs)