CMS 3D CMS Logo

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