CMS 3D CMS Logo

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