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