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