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