CMS 3D CMS Logo

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