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