Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-07-16 22:52:10

0001 from copy import copy, deepcopy
0002 from collections import OrderedDict
0003 from .MatrixUtil import merge, Kby, Mby
0004 import re
0005 
0006 U2000by1={'--relval': '2000,1'}
0007 
0008 # DON'T CHANGE THE ORDER, only append new keys. Otherwise the numbering for the runTheMatrix tests will change.
0009 
0010 upgradeKeys = {}
0011 
0012 upgradeKeys[2017] = [
0013     '2017',
0014     '2017PU',
0015     '2017Design',
0016     '2017DesignPU',
0017     '2018',
0018     '2018PU',
0019     '2018Design',
0020     '2018DesignPU',
0021     '2021',
0022     '2021PU',
0023     '2021Design',
0024     '2021DesignPU',
0025     '2023',
0026     '2023PU',
0027     '2024',
0028     '2024PU',
0029     '2021FS',
0030     '2021FSPU',
0031     '2021postEE',
0032     '2021postEEPU',
0033     '2023FS',
0034     '2023FSPU',
0035     '2022HI',
0036     '2022HIRP', #RawPrime
0037     '2023HI',
0038     '2023HIRP', #RawPrime
0039     '2024HLTOnDigi',
0040     '2024HLTOnDigiPU',
0041     '2024GenOnly',
0042     '2024SimOnGen',
0043 ]
0044 
0045 upgradeKeys[2026] = [
0046     '2026D86',
0047     '2026D86PU',
0048     '2026D88',
0049     '2026D88PU',
0050     '2026D91',
0051     '2026D91PU',
0052     '2026D92',
0053     '2026D92PU',
0054     '2026D93',
0055     '2026D93PU',
0056     '2026D94',
0057     '2026D94PU',
0058     '2026D95',
0059     '2026D95PU',
0060     '2026D96',
0061     '2026D96PU',
0062     '2026D97',
0063     '2026D97PU',
0064     '2026D98',
0065     '2026D98PU',
0066     '2026D99',
0067     '2026D99PU',
0068     '2026D100',
0069     '2026D100PU',
0070     '2026D101',
0071     '2026D101PU',
0072     '2026D102',
0073     '2026D102PU',
0074     '2026D103',
0075     '2026D103PU',
0076     '2026D104',
0077     '2026D104PU',
0078     '2026D105',
0079     '2026D105PU',
0080     '2026D106',
0081     '2026D106PU',
0082     '2026D107',
0083     '2026D107PU',
0084     '2026D108',
0085     '2026D108PU',
0086     '2026D109',
0087     '2026D109PU',
0088     '2026D110',
0089     '2026D110PU',
0090     '2026D111',
0091     '2026D111PU',
0092     '2026D112',
0093     '2026D112PU',
0094     '2026D113',
0095     '2026D113PU',
0096     '2026D114',
0097     '2026D114PU',
0098     '2026D110GenOnly',
0099     '2026D110SimOnGen',
0100     '2026D115',
0101     '2026D115PU',
0102 ]
0103 
0104 # pre-generation of WF numbers
0105 numWFStart={
0106     2017: 10000,
0107     2026: 20000,
0108 }
0109 numWFSkip=200
0110 # temporary measure to keep other WF numbers the same
0111 numWFConflict = [[14400,14800], #2022ReReco, 2022ReRecoPU (in 12_4)
0112                  [20400,20800], #D87
0113                  [21200,22000], #D89-D90
0114                  [50000,51000]]
0115 numWFAll={
0116     2017: [],
0117     2026: []
0118 }
0119 
0120 for year in upgradeKeys:
0121     for i in range(0,len(upgradeKeys[year])):
0122         numWFtmp = numWFStart[year] if i==0 else (numWFAll[year][i-1] + numWFSkip)
0123         for conflict in numWFConflict:
0124             if numWFtmp>=conflict[0] and numWFtmp<conflict[1]:
0125                 numWFtmp = conflict[1]
0126                 break
0127         numWFAll[year].append(numWFtmp)
0128 
0129 # workflows for baseline and for variations
0130 # setup() automatically loops over all steps and applies any customizations specified in setup_() -> called in relval_steps.py
0131 # setupPU() and setupPU_() operate similarly -> called in relval_steps.py *after* merging PUDataSets w/ regular steps
0132 # workflow() adds a concrete workflow to the list based on condition() -> called in relval_upgrade.py
0133 # every special workflow gets its own derived class, which must then be added to the global dict upgradeWFs
0134 preventReuseKeyword = 'NOREUSE'
0135 class UpgradeWorkflow(object):
0136     def __init__(self,steps,PU,suffix,offset):
0137         self.steps = steps
0138         self.PU = PU
0139         self.allowReuse = True
0140 
0141         # ensure all PU steps are in normal step list
0142         for step in self.PU:
0143             if not step in self.steps:
0144                 self.steps.append(step)
0145 
0146         self.suffix = suffix
0147         if len(self.suffix)>0 and self.suffix[0]!='_': self.suffix = '_'+self.suffix
0148         self.offset = offset
0149         if self.offset < 0.0 or self.offset > 1.0:
0150             raise ValueError("Special workflow offset must be between 0.0 and 1.0")
0151     def getStepName(self, step, extra=""):
0152         stepName = step + self.suffix + extra
0153         return stepName
0154     def getStepNamePU(self, step, extra=""):
0155         stepNamePU = step + 'PU' + self.suffix + extra
0156         return stepNamePU
0157     def init(self, stepDict):
0158         for step in self.steps:
0159             stepDict[self.getStepName(step)] = {}
0160             if not self.allowReuse: stepDict[self.getStepName(step,preventReuseKeyword)] = {}
0161         for step in self.PU:
0162             stepDict[self.getStepNamePU(step)] = {}
0163             if not self.allowReuse: stepDict[self.getStepNamePU(step,preventReuseKeyword)] = {}
0164     def setup(self, stepDict, k, properties):
0165         for step in self.steps:
0166             self.setup_(step, self.getStepName(step), stepDict, k, properties)
0167             if not self.allowReuse: self.preventReuse(self.getStepName(step,preventReuseKeyword), stepDict, k)
0168     def setupPU(self, stepDict, k, properties):
0169         for step in self.PU:
0170             self.setupPU_(step, self.getStepNamePU(step), stepDict, k, properties)
0171             if not self.allowReuse: self.preventReuse(self.getStepNamePU(step,preventReuseKeyword), stepDict, k)
0172     def setup_(self, step, stepName, stepDict, k, properties):
0173         pass
0174     def setupPU_(self, step, stepName, stepDict, k, properties):
0175         pass
0176     def workflow(self, workflows, num, fragment, stepList, key, hasHarvest):
0177         if self.condition(fragment, stepList, key, hasHarvest):
0178             self.workflow_(workflows, num, fragment, stepList, key)
0179     def workflow_(self, workflows, num, fragment, stepList, key):
0180         fragmentTmp = [fragment, key]
0181         if len(self.suffix)>0: fragmentTmp.append(self.suffix)
0182         workflows[num+self.offset] = [ fragmentTmp, stepList ]
0183     def condition(self, fragment, stepList, key, hasHarvest):
0184         return False
0185     def preventReuse(self, stepName, stepDict, k):
0186         if "Sim" in stepName and stepName != "Sim":
0187             stepDict[stepName][k] = None
0188         if "Gen" in stepName:
0189             stepDict[stepName][k] = None
0190 upgradeWFs = OrderedDict()
0191 
0192 class UpgradeWorkflow_baseline(UpgradeWorkflow):
0193     def setup_(self, step, stepName, stepDict, k, properties):
0194         cust=properties.get('Custom', None)
0195         era=properties.get('Era', None)
0196         modifier=properties.get('ProcessModifier',None)
0197         if cust is not None: stepDict[stepName][k]['--customise']=cust
0198         if era is not None:
0199             stepDict[stepName][k]['--era']=era
0200         if modifier is not None: stepDict[stepName][k]['--procModifier']=modifier
0201     def condition(self, fragment, stepList, key, hasHarvest):
0202         return True
0203 upgradeWFs['baseline'] = UpgradeWorkflow_baseline(
0204     steps =  [
0205         'Gen',
0206         'Sim',
0207         'GenSim',
0208         'GenSimHLBeamSpot',
0209         'GenSimHLBeamSpot14',
0210         'GenSimHLBeamSpotHGCALCloseBy',
0211         'Digi',
0212         'DigiNoHLT',
0213         'DigiTrigger',
0214         'HLTRun3',
0215         'HLTOnly',
0216         'RecoLocal',
0217         'Reco',
0218         'RecoFakeHLT',
0219         'RecoGlobal',
0220         'RecoNano',
0221         'RecoNanoFakeHLT',
0222         'HARVEST',
0223         'HARVESTFakeHLT',
0224         'HARVESTNano',
0225         'HARVESTNanoFakeHLT',
0226         'FastSim',
0227         'HARVESTFast',
0228         'HARVESTGlobal',
0229         'ALCA',
0230         'ALCAPhase2',
0231         'Nano',
0232         'MiniAOD',
0233         'HLT75e33',
0234         'FastSimRun3',
0235         'HARVESTFastRun3',
0236     ],
0237     PU =  [
0238         'DigiTrigger',
0239         'RecoLocal',
0240         'RecoGlobal',
0241         'Digi',
0242         'DigiNoHLT',
0243         'HLTOnly',
0244         'Reco',
0245         'RecoFakeHLT',
0246         'RecoNano',
0247         'RecoNanoFakeHLT',
0248         'HARVEST',
0249         'HARVESTFakeHLT',
0250         'HARVESTNano',
0251         'HARVESTNanoFakeHLT',
0252         'HARVESTGlobal',
0253         'MiniAOD',
0254         'Nano',
0255         'HLT75e33',
0256         'FastSimRun3',
0257         'HARVESTFastRun3',
0258     ],
0259     suffix = '',
0260     offset = 0.0,
0261 )
0262 
0263 
0264 class UpgradeWorkflow_DigiNoHLT(UpgradeWorkflow):
0265     def setup_(self, step, stepName, stepDict, k, properties):
0266         if stepDict[step][k] != None:
0267             if 'ALCA' in step:
0268                 stepDict[stepName][k] = None
0269             if 'RecoNano' in step:
0270                 stepDict[stepName][k] = merge([{'--filein': 'file:step3.root', '--secondfilein': 'file:step2.root'}, stepDict[step][k]])
0271             if 'Digi' in step and 'NoHLT' not in step:
0272                 stepDict[stepName][k] = merge([{'-s': re.sub(',HLT.*', '', stepDict[step][k]['-s'])}, stepDict[step][k]])
0273     def condition(self, fragment, stepList, key, hasHarvest):
0274         if ('TTbar_14TeV' in fragment and '2021' == key):
0275             stepList.insert(stepList.index('Digi_DigiNoHLT_2021')+1, 'HLTRun3_2021')
0276         return ('TTbar_14TeV' in fragment and '2021' == key)
0277 upgradeWFs['DigiNoHLT'] = UpgradeWorkflow_DigiNoHLT(
0278     steps = [
0279         'Digi',
0280         'RecoNano',
0281         'RecoNanoFakeHLT',
0282         'ALCA'
0283     ],
0284     PU = [],
0285     suffix = '_DigiNoHLT',
0286     offset = 0.601,
0287 )
0288 
0289 # some commonalities among tracking WFs
0290 class UpgradeWorkflowTracking(UpgradeWorkflow):
0291 
0292     def __init__(self, steps, PU, suffix, offset):
0293         # always include some steps that will be skipped
0294         steps = steps + ["ALCA","Nano"]
0295         super().__init__(steps, PU, suffix, offset)
0296     def condition(self, fragment, stepList, key, hasHarvest):
0297         result = (fragment=="TTbar_13" or fragment=="TTbar_14TeV" or 'Hydjet' in fragment) and not 'PU' in key and hasHarvest and self.condition_(fragment, stepList, key, hasHarvest)
0298         return result
0299     def condition_(self, fragment, stepList, key, hasHarvest):
0300         return True
0301     def setup_(self, step, stepName, stepDict, k, properties):
0302         # skip ALCA and Nano steps (but not RecoNano or HARVESTNano for Run3)
0303         if 'ALCA' in step or 'Nano'==step:
0304             stepDict[stepName][k] = None
0305         self.setup__(step, stepName, stepDict, k, properties)
0306     # subordinate function for inherited classes
0307     def setup__(self, step, stepName, stepDict, k, properties):
0308         pass
0309 
0310 class UpgradeWorkflow_trackingOnly(UpgradeWorkflowTracking):
0311     def setup__(self, step, stepName, stepDict, k, properties):
0312         if 'Reco' in step: stepDict[stepName][k] = merge([self.step3, stepDict[step][k]])
0313         elif 'HARVEST' in step: stepDict[stepName][k] = merge([{'-s': 'HARVESTING:@trackingOnlyValidation+@trackingOnlyDQM'}, stepDict[step][k]])
0314 
0315     def condition(self, fragment, stepList, key, hasHarvest):
0316         result = (fragment=="TTbar_13" or fragment=="TTbar_14TeV") and hasHarvest and self.condition_(fragment, stepList, key, hasHarvest)
0317         return result
0318 
0319 
0320 
0321 upgradeWFs['trackingOnly'] = UpgradeWorkflow_trackingOnly(
0322     steps = [
0323         'Reco',
0324         'RecoFakeHLT',
0325         'HARVEST',
0326         'HARVESTFakeHLT',
0327         'RecoGlobal',
0328         'HARVESTGlobal',
0329         'RecoNano',
0330         'RecoNanoFakeHLT',
0331         'HARVESTNano',
0332         'HARVESTNanoFakeHLT',
0333     ],
0334     PU = [
0335         'Reco',
0336         'RecoFakeHLT',
0337         'HARVEST',
0338         'HARVESTFakeHLT',
0339         'RecoGlobal',
0340         'HARVESTGlobal',
0341         'RecoNano',
0342         'RecoNanoFakeHLT',
0343         'HARVESTNano',
0344         'HARVESTNanoFakeHLT',
0345     ],
0346 
0347 
0348     suffix = '_trackingOnly',
0349     offset = 0.1,
0350 )
0351 upgradeWFs['trackingOnly'].step3 = {
0352     '-s': 'RAW2DIGI,RECO:reconstruction_trackingOnly,VALIDATION:@trackingOnlyValidation,DQM:@trackingOnlyDQM',
0353     '--datatier':'GEN-SIM-RECO,DQMIO',
0354     '--eventcontent':'RECOSIM,DQM',
0355 }
0356 # used outside of upgrade WFs
0357 step3_trackingOnly = upgradeWFs['trackingOnly'].step3
0358 
0359 class UpgradeWorkflow_trackingRun2(UpgradeWorkflowTracking):
0360     def setup__(self, step, stepName, stepDict, k, properties):
0361         if 'Reco' in step and stepDict[step][k]['--era']=='Run2_2017':
0362             stepDict[stepName][k] = merge([{'--era': 'Run2_2017_trackingRun2'}, stepDict[step][k]])
0363     def condition_(self, fragment, stepList, key, hasHarvest):
0364         return '2017' in key
0365 upgradeWFs['trackingRun2'] = UpgradeWorkflow_trackingRun2(
0366     steps = [
0367         'Reco',
0368         'RecoFakeHLT',
0369     ],
0370     PU = [],
0371     suffix = '_trackingRun2',
0372     offset = 0.2,
0373 )
0374 
0375 class UpgradeWorkflow_trackingOnlyRun2(UpgradeWorkflowTracking):
0376     def setup__(self, step, stepName, stepDict, k, properties):
0377         if 'Reco' in step and stepDict[step][k]['--era']=='Run2_2017':
0378             stepDict[stepName][k] = merge([{'--era': 'Run2_2017_trackingRun2'}, self.step3, stepDict[step][k]])
0379         elif 'HARVEST' in step: stepDict[stepName][k] = merge([{'-s': 'HARVESTING:@trackingOnlyValidation+@trackingOnlyDQM'}, stepDict[step][k]])
0380     def condition_(self, fragment, stepList, key, hasHarvest):
0381         return '2017' in key
0382 upgradeWFs['trackingOnlyRun2'] = UpgradeWorkflow_trackingOnlyRun2(
0383     steps = [
0384         'Reco',
0385         'RecoFakeHLT',
0386         'HARVEST',
0387         'HARVESTFakeHLT',
0388     ],
0389     PU = [],
0390     suffix = '_trackingOnlyRun2',
0391     offset = 0.3,
0392 )
0393 upgradeWFs['trackingOnlyRun2'].step3 = upgradeWFs['trackingOnly'].step3
0394 
0395 class UpgradeWorkflow_trackingLowPU(UpgradeWorkflowTracking):
0396     def setup__(self, step, stepName, stepDict, k, properties):
0397         if 'Reco' in step and stepDict[step][k]['--era']=='Run2_2017':
0398             stepDict[stepName][k] = merge([{'--era': 'Run2_2017_trackingLowPU'}, stepDict[step][k]])
0399     def condition_(self, fragment, stepList, key, hasHarvest):
0400         return '2017' in key
0401 upgradeWFs['trackingLowPU'] = UpgradeWorkflow_trackingLowPU(
0402     steps = [
0403         'Reco',
0404         'RecoFakeHLT',
0405     ],
0406     PU = [],
0407     suffix = '_trackingLowPU',
0408     offset = 0.4,
0409 )
0410 
0411 class UpgradeWorkflow_pixelTrackingOnly(UpgradeWorkflowTracking):
0412     def setup__(self, step, stepName, stepDict, k, properties):
0413         if 'Reco' in step: stepDict[stepName][k] = merge([self.step3, stepDict[step][k]])
0414         # skip ALCA step as products might not be available
0415         elif 'ALCA' in step: stepDict[stepName][k] = None
0416         elif 'HARVEST' in step: stepDict[stepName][k] = merge([{'-s': 'HARVESTING:@trackingOnlyValidation+@pixelTrackingOnlyDQM'}, stepDict[step][k]])
0417     def condition_(self, fragment, stepList, key, hasHarvest):
0418         return ('2022' in key or '2023' in key or '2024' in key or '2026' in key or 'HI' in key) and ('FS' not in key)
0419 upgradeWFs['pixelTrackingOnly'] = UpgradeWorkflow_pixelTrackingOnly(
0420     steps = [
0421         'Reco',
0422         'RecoFakeHLT',
0423         'HARVEST',
0424         'HARVESTFakeHLT',
0425         'RecoGlobal',
0426         'HARVESTGlobal',
0427         'RecoNano',
0428         'RecoNanoFakeHLT',
0429         'HARVESTNano',
0430         'HARVESTNanoFakeHLT',
0431         'ALCA',
0432         'ALCAPhase2'
0433     ],
0434     PU = [],
0435     suffix = '_pixelTrackingOnly',
0436     offset = 0.5,
0437 )
0438 upgradeWFs['pixelTrackingOnly'].step3 = {
0439     '-s': 'RAW2DIGI:RawToDigi_pixelOnly,RECO:reconstruction_pixelTrackingOnly,VALIDATION:@pixelTrackingOnlyValidation,DQM:@pixelTrackingOnlyDQM',
0440     '--datatier': 'GEN-SIM-RECO,DQMIO',
0441     '--eventcontent': 'RECOSIM,DQM',
0442 }
0443 
0444 class UpgradeWorkflow_trackingMkFit(UpgradeWorkflowTracking):
0445     def setup__(self, step, stepName, stepDict, k, properties):
0446         if ('Digi' in step and 'NoHLT' not in step) or ('HLTOnly' in step): stepDict[stepName][k] = merge([self.step2, stepDict[step][k]])
0447         if 'Reco' in step: stepDict[stepName][k] = merge([self.step3, stepDict[step][k]])
0448     def condition_(self, fragment, stepList, key, hasHarvest):
0449         return ('2017' in key or '2021' in key or '2023' in key or '2024' in key) and ('FS' not in key)
0450 upgradeWFs['trackingMkFit'] = UpgradeWorkflow_trackingMkFit(
0451     steps = [
0452         'Digi',
0453         'HLTOnly',
0454         'DigiTrigger',
0455         'Reco',
0456         'RecoFakeHLT',
0457         'RecoGlobal',
0458         'RecoNano',
0459         'RecoNanoFakeHLT',
0460     ],
0461     PU = [],
0462     suffix = '_trackingMkFit',
0463     offset = 0.7,
0464 )
0465 upgradeWFs['trackingMkFit'].step2 = {
0466     '--customise': 'RecoTracker/MkFit/customizeHLTIter0ToMkFit.customizeHLTIter0ToMkFit'
0467 }
0468 upgradeWFs['trackingMkFit'].step3 = {
0469     '--procModifiers': 'trackingMkFitDevel'
0470 }
0471 
0472 # mkFit for phase-2 initialStep tracking
0473 class UpgradeWorkflow_trackingMkFitPhase2(UpgradeWorkflowTracking):
0474     def setup__(self, step, stepName, stepDict, k, properties):
0475         if 'Reco' in step: stepDict[stepName][k] = merge([self.step3, stepDict[step][k]])
0476     def condition_(self, fragment, stepList, key, hasHarvest):
0477         return ('2026' in key)
0478 upgradeWFs['trackingMkFitPhase2'] = UpgradeWorkflow_trackingMkFitPhase2(
0479     steps = [
0480         'Reco',
0481         'RecoFakeHLT',
0482         'RecoGlobal',
0483         'RecoNano',
0484         'RecoNanoFakeHLT',
0485     ],
0486     PU = [],
0487     suffix = '_trackingMkFitPhase2',
0488     offset = 0.702,
0489 )
0490 upgradeWFs['trackingMkFitPhase2'].step3 = {
0491     '--procModifiers': 'trackingMkFitCommon,trackingMkFitInitialStep'
0492 }
0493 
0494 #DeepCore seeding for JetCore iteration workflow
0495 class UpgradeWorkflow_seedingDeepCore(UpgradeWorkflow):
0496     def setup_(self, step, stepName, stepDict, k, properties):
0497         # skip ALCA and Nano steps (but not RecoNano or HARVESTNano for Run3)
0498         if 'ALCA' in step or 'Nano'==step:
0499             stepDict[stepName][k] = None
0500         elif 'Reco' in step or 'HARVEST' in step: stepDict[stepName][k] = merge([{'--procModifiers': 'seedingDeepCore'}, stepDict[step][k]])
0501     def condition(self, fragment, stepList, key, hasHarvest):
0502         result = (fragment=="QCD_Pt_1800_2400_14" or fragment=="TTbar_14TeV" ) and ('2021' in key or '2024' in key) and hasHarvest
0503         return result
0504 upgradeWFs['seedingDeepCore'] = UpgradeWorkflow_seedingDeepCore(
0505     steps = [
0506         'Reco',
0507         'RecoFakeHLT',
0508         'HARVEST',
0509         'HARVESTFakeHLT',
0510         'RecoGlobal',
0511         'HARVESTGlobal',
0512         'RecoNano',
0513         'RecoNanoFakeHLT',
0514         'HARVESTNano',
0515         'HARVESTNanoFakeHLT',
0516         'Nano',
0517         'ALCA',
0518     ],
0519     PU = [
0520         'Reco',
0521         'RecoFakeHLT',
0522         'RecoGlobal',
0523         'HARVESTGlobal',
0524         'RecoNano',
0525         'RecoNanoFakeHLT',
0526         'HARVESTNano',
0527         'HARVESTNanoFakeHLT',
0528     ],
0529     suffix = '_seedingDeepCore',
0530     offset = 0.17,
0531 )
0532 
0533 #Workflow to enable displacedRegionalStep tracking iteration
0534 class UpgradeWorkflow_displacedRegional(UpgradeWorkflowTracking):
0535     def setup__(self, step, stepName, stepDict, k, properties):
0536         if 'Reco' in step: stepDict[stepName][k] = merge([self.step3, stepDict[step][k]])
0537     def condition_(self, fragment, stepList, key, hasHarvest):
0538         return ('2021' in key or '2023' in key or '2024' in key)
0539 upgradeWFs['displacedRegional'] = UpgradeWorkflow_displacedRegional(
0540     steps = [
0541         'Reco',
0542         'RecoFakeHLT',
0543         'RecoGlobal',
0544         'RecoNano',
0545         'RecoNanoFakeHLT',
0546     ],
0547     PU = [],
0548     suffix = '_displacedRegional',
0549     offset = 0.701,
0550 )
0551 upgradeWFs['displacedRegional'].step3 = {
0552     '--procModifiers': 'displacedRegionalTracking'
0553 }
0554 
0555 # Vector Hits workflows
0556 class UpgradeWorkflow_vectorHits(UpgradeWorkflow):
0557     def setup_(self, step, stepName, stepDict, k, properties):
0558         stepDict[stepName][k] = merge([{'--procModifiers': 'vectorHits'}, stepDict[step][k]])
0559     def condition(self, fragment, stepList, key, hasHarvest):
0560         return (fragment=="TTbar_14TeV" or fragment=="SingleMuPt10Extended") and '2026' in key
0561 upgradeWFs['vectorHits'] = UpgradeWorkflow_vectorHits(
0562     steps = [
0563         'RecoGlobal',
0564         'HARVESTGlobal'
0565     ],
0566     PU = [
0567         'RecoGlobal',
0568         'HARVESTGlobal'
0569     ],
0570     suffix = '_vectorHits',
0571     offset = 0.9,
0572 )
0573 
0574 # WeightedMeanFitter vertexing workflows
0575 class UpgradeWorkflow_weightedVertex(UpgradeWorkflow):
0576     def __init__(self, reco = {}, harvest = {}, **kwargs):
0577         # adapt the parameters for the UpgradeWorkflow init method
0578         super(UpgradeWorkflow_weightedVertex, self).__init__(
0579             steps = [
0580                 'Reco',
0581                 'RecoFakeHLT',
0582                 'HARVEST',
0583                 'HARVESTFakeHLT',
0584                 'RecoGlobal',
0585                 'HARVESTGlobal',
0586                 'RecoNano',
0587                 'RecoNanoFakeHLT',
0588                 'HARVESTNano',
0589                 'HARVESTNanoFakeHLT',
0590             ],
0591             PU = [
0592                 'Reco',
0593                 'RecoFakeHLT',
0594                 'HARVEST',
0595                 'HARVESTFakeHLT',
0596                 'RecoGlobal',
0597                 'HARVESTGlobal',
0598                 'RecoNano',
0599                 'RecoNanoFakeHLT',
0600                 'HARVESTNano',
0601                 'HARVESTNanoFakeHLT',
0602             ],
0603             **kwargs)
0604         self.__reco = reco
0605         self.__harvest = harvest
0606 
0607     def setup_(self, step, stepName, stepDict, k, properties):
0608         # temporarily remove trigger & downstream steps
0609         if 'Reco' in step:
0610             mod = {'--procModifiers': 'weightedVertexing,vertexInBlocks', '--datatier':'GEN-SIM-RECO,DQMIO',
0611             '--eventcontent':'RECOSIM,DQM'}
0612             stepDict[stepName][k] = merge([mod,self.step3, stepDict[step][k]])
0613         if 'HARVEST' in step:
0614             stepDict[stepName][k] = merge([self.step4,stepDict[step][k]])
0615 
0616     def condition(self, fragment, stepList, key, hasHarvest):
0617         # select only a subset of the workflows
0618         selected = [
0619             ('2021' in key and fragment == "TTbar_14TeV" and 'FS' not in key),
0620             ('2024' in key and fragment == "TTbar_14TeV"),
0621             ('2026' in key and fragment == "TTbar_14TeV")
0622         ]
0623         result = any(selected) and hasHarvest
0624 
0625         return result
0626 
0627 
0628 upgradeWFs['weightedVertex'] = UpgradeWorkflow_weightedVertex(
0629     suffix = '_weightedVertex',
0630     offset = 0.278,
0631 )
0632 
0633 upgradeWFs['weightedVertex'].step3 = {}
0634 upgradeWFs['weightedVertex'].step4 = {}
0635 
0636 upgradeWFs['weightedVertexTrackingOnly'] = UpgradeWorkflow_weightedVertex(
0637     suffix = '_weightedVertexTrackingOnly',
0638     offset = 0.279,
0639 )
0640 
0641 upgradeWFs['weightedVertexTrackingOnly'].step3 = {
0642     '-s': 'RAW2DIGI,RECO:reconstruction_trackingOnly,VALIDATION:@trackingOnlyValidation,DQM:@trackingOnlyDQM',
0643     '--datatier':'GEN-SIM-RECO,DQMIO',
0644     '--eventcontent':'RECOSIM,DQM',
0645 }
0646 
0647 upgradeWFs['weightedVertexTrackingOnly'].step4 = {
0648     '-s': 'HARVESTING:@trackingOnlyValidation+@pixelTrackingOnlyDQM'
0649 }
0650 
0651 # Special TICL Pattern recognition Workflows
0652 class UpgradeWorkflow_ticl_clue3D(UpgradeWorkflow):
0653     def setup_(self, step, stepName, stepDict, k, properties):
0654         if 'RecoGlobal' in step:
0655             stepDict[stepName][k] = merge([self.step3, stepDict[step][k]])
0656         if 'HARVESTGlobal' in step:
0657             stepDict[stepName][k] = merge([self.step4, stepDict[step][k]])
0658     def condition(self, fragment, stepList, key, hasHarvest):
0659         return (fragment=="TTbar_14TeV" or 'CloseByPGun_CE' in fragment) and '2026' in key
0660 upgradeWFs['ticl_clue3D'] = UpgradeWorkflow_ticl_clue3D(
0661     steps = [
0662         'RecoGlobal',
0663         'HARVESTGlobal'
0664     ],
0665     PU = [
0666         'RecoGlobal',
0667         'HARVESTGlobal'
0668     ],
0669     suffix = '_ticl_clue3D',
0670     offset = 0.201,
0671 )
0672 upgradeWFs['ticl_clue3D'].step3 = {'--procModifiers': 'clue3D'}
0673 upgradeWFs['ticl_clue3D'].step4 = {'--procModifiers': 'clue3D'}
0674 
0675 class UpgradeWorkflow_ticl_FastJet(UpgradeWorkflow):
0676     def setup_(self, step, stepName, stepDict, k, properties):
0677         if 'RecoGlobal' in step:
0678             stepDict[stepName][k] = merge([self.step3, stepDict[step][k]])
0679         if 'HARVESTGlobal' in step:
0680             stepDict[stepName][k] = merge([self.step4, stepDict[step][k]])
0681     def condition(self, fragment, stepList, key, hasHarvest):
0682         return (fragment=="TTbar_14TeV" or 'CloseByPGun_CE' in fragment) and '2026' in key
0683 upgradeWFs['ticl_FastJet'] = UpgradeWorkflow_ticl_FastJet(
0684     steps = [
0685         'RecoGlobal',
0686         'HARVESTGlobal'
0687     ],
0688     PU = [
0689         'RecoGlobal',
0690         'HARVESTGlobal'
0691     ],
0692     suffix = '_ticl_FastJet',
0693     offset = 0.202,
0694 )
0695 upgradeWFs['ticl_FastJet'].step3 = {'--procModifiers': 'fastJetTICL'}
0696 upgradeWFs['ticl_FastJet'].step4 = {'--procModifiers': 'fastJetTICL'}
0697 
0698 class UpgradeWorkflow_ticl_v5(UpgradeWorkflow):
0699     def setup_(self, step, stepName, stepDict, k, properties):
0700         if 'RecoGlobal' in step:
0701             stepDict[stepName][k] = merge([self.step3, stepDict[step][k]])
0702         if 'HARVESTGlobal' in step:
0703             stepDict[stepName][k] = merge([self.step4, stepDict[step][k]])
0704     def condition(self, fragment, stepList, key, hasHarvest):
0705         return (fragment=="TTbar_14TeV" or 'CloseByP' in fragment or 'Eta1p7_2p7' in fragment) and '2026' in key
0706 upgradeWFs['ticl_v5'] = UpgradeWorkflow_ticl_v5(
0707     steps = [
0708         'RecoGlobal',
0709         'HARVESTGlobal'
0710     ],
0711     PU = [
0712         'RecoGlobal',
0713         'HARVESTGlobal'
0714     ],
0715     suffix = '_ticl_v5',
0716     offset = 0.203,
0717 )
0718 upgradeWFs['ticl_v5'].step3 = {'--procModifiers': 'ticl_v5'}
0719 upgradeWFs['ticl_v5'].step4 = {'--procModifiers': 'ticl_v5'}
0720 
0721 # Track DNN workflows
0722 class UpgradeWorkflow_trackdnn(UpgradeWorkflow):
0723     def setup_(self, step, stepName, stepDict, k, properties):
0724         stepDict[stepName][k] = merge([{'--procModifiers': 'trackdnn'}, stepDict[step][k]])
0725 
0726     def condition(self, fragment, stepList, key, hasHarvest):
0727         return fragment=="TTbar_14TeV" and '2021' in key
0728 upgradeWFs['trackdnn'] = UpgradeWorkflow_trackdnn(
0729     steps = [
0730         'Reco',
0731         'RecoFakeHLT',
0732         'RecoNano',
0733         'RecoNanoFakeHLT',
0734     ],
0735     PU = [
0736         'Reco',
0737         'RecoFakeHLT',
0738         'RecoNano',
0739         'RecoNanoFakeHLT',
0740     ],
0741     suffix = '_trackdnn',
0742     offset = 0.91,
0743 )
0744 
0745 
0746 # MLPF workflows
0747 class UpgradeWorkflow_mlpf(UpgradeWorkflow):
0748     def setup_(self, step, stepName, stepDict, k, properties):
0749         if 'Reco' in step:
0750             stepDict[stepName][k] = merge([self.step3, stepDict[step][k]])
0751     def condition(self, fragment, stepList, key, hasHarvest):
0752         return (fragment=="TTbar_14TeV" or fragment=="QCD_FlatPt_15_3000HS_14") and '2021PU' in key
0753 
0754 upgradeWFs['mlpf'] = UpgradeWorkflow_mlpf(
0755     steps = [
0756         'Reco',
0757         'RecoFakeHLT',
0758         'RecoNano',
0759         'RecoNanoFakeHLT',
0760     ],
0761     PU = [
0762         'Reco',
0763         'RecoFakeHLT',
0764         'RecoNano',
0765         'RecoNanoFakeHLT',
0766     ],
0767     suffix = '_mlpf',
0768     offset = 0.13,
0769 )
0770 upgradeWFs['mlpf'].step3 = {
0771     '--datatier': 'GEN-SIM-RECO,RECOSIM,MINIAODSIM,NANOAODSIM,DQMIO',
0772     '--eventcontent': 'FEVTDEBUGHLT,RECOSIM,MINIAODSIM,NANOEDMAODSIM,DQM',
0773     '--procModifiers': 'mlpf'
0774 }
0775 
0776 
0777 # ECAL DeepSC clustering studies workflow
0778 class UpgradeWorkflow_ecalclustering(UpgradeWorkflow):
0779     def setup_(self, step, stepName, stepDict, k, properties):
0780         if 'Reco' in step:
0781             stepDict[stepName][k] = merge([self.step3, stepDict[step][k]])
0782     def condition(self, fragment, stepList, key, hasHarvest):
0783         return (fragment=="ZEE_14" or fragment=="TTbar_14TeV" or fragment=="WprimeTolNu_M3000_13TeV_pythia8"
0784             or fragment=="DisplacedSUSY_stopToBottom_M_300_1000mm_13" or fragment=="RunEGamma2018D" )
0785 
0786 upgradeWFs['ecalDeepSC'] = UpgradeWorkflow_ecalclustering(
0787     steps = [
0788         'Reco',
0789         'RecoFakeHLT',
0790         'RecoNano',
0791         'RecoNanoFakeHLT',
0792     ],
0793     PU = [
0794         'Reco',
0795         'RecoFakeHLT',
0796         'RecoNano',
0797         'RecoNanoFakeHLT',
0798     ],
0799     suffix = '_ecalDeepSC',
0800     offset = 0.19,
0801 )
0802 upgradeWFs['ecalDeepSC'].step3 = {
0803     '--datatier': 'RECOSIM,MINIAODSIM,NANOAODSIM,DQMIO',
0804     '--eventcontent': 'RECOSIM,MINIAODSIM,NANOEDMAODSIM,DQM',
0805     '--procModifiers': 'ecal_deepsc'
0806 }
0807 
0808 
0809 # photonDRN workflows
0810 class UpgradeWorkflow_photonDRN(UpgradeWorkflow):
0811     def setup_(self, step, stepName, stepDict, k, properties):
0812         if 'Reco' in step:
0813             stepDict[stepName][k] = merge([self.step3, stepDict[step][k]])
0814     def condition(self, fragment, stepList, key, hasHarvest):
0815         return '2018' in key and "SingleGamma" in fragment
0816 
0817 upgradeWFs['photonDRN'] = UpgradeWorkflow_photonDRN(
0818     steps = [
0819         'RecoFakeHLT',
0820         'RecoNanoFakeHLT',
0821     ],
0822     PU = [
0823         'RecoFakeHLT',
0824         'RecoNanoFakeHLT',
0825     ],
0826     suffix = '_photonDRN',
0827     offset = 0.31,
0828 )
0829 upgradeWFs['photonDRN'].step3 = {
0830     '--procModifiers': 'enableSonicTriton,photonDRN'
0831 }
0832 
0833 
0834 # Patatrack workflows (NoPU and PU):
0835 #   - TTbar_14, ZMM_14", ZEE_14, ZTT_14, NuGun, SingleMu, QCD_Pt15To7000_Flat for
0836 #       > 2021, 2022, 2023, 2024 and 2026 conditions, TTbar
0837 #   - Hydjet for HI conditions
0838 class PatatrackWorkflow(UpgradeWorkflow):
0839     def __init__(self, digi = {}, reco = {}, mini = {}, harvest = {}, **kwargs):
0840         # adapt the parameters for the UpgradeWorkflow init method
0841         super(PatatrackWorkflow, self).__init__(
0842             steps = [
0843                 'Digi',
0844                 'HLTOnly',
0845                 'DigiTrigger',
0846                 'Reco',
0847                 'RecoFakeHLT',
0848                 'HARVEST',
0849                 'HARVESTFakeHLT',
0850                 'RecoGlobal',
0851                 'HARVESTGlobal',
0852                 'RecoNano',
0853                 'RecoNanoFakeHLT',
0854                 'HARVESTNano',
0855                 'HARVESTNanoFakeHLT',
0856                 'MiniAOD',
0857                 'Nano',
0858                 'ALCA',
0859                 'ALCAPhase2'
0860             ],
0861             PU = [
0862                 'Digi',
0863                 'HLTOnly',
0864                 'DigiTrigger',
0865                 'Reco',
0866                 'RecoFakeHLT',
0867                 'HARVEST',
0868                 'HARVESTFakeHLT',
0869                 'RecoGlobal',
0870                 'HARVESTGlobal',
0871                 'RecoNano',
0872                 'RecoNanoFakeHLT',
0873                 'HARVESTNano',
0874                 'HARVESTNanoFakeHLT',
0875                 'MiniAOD',
0876                 'Nano',
0877                 'ALCA',
0878                 'ALCAPhase2'
0879             ],
0880             **kwargs)
0881         self.__digi = digi
0882         self.__reco = reco
0883         if 'DQM' in self.__reco:
0884             self.__reco.update({
0885                 '--datatier':     'GEN-SIM-RECO,DQMIO',
0886                 '--eventcontent': 'RECOSIM,DQM'
0887             })
0888         self.__mini = mini
0889         self.__harvest = harvest
0890 
0891     def condition(self, fragment, stepList, key, hasHarvest):
0892         # select only a subset of the workflows
0893         years = ['2021','2023','2024','2026']
0894         fragments = ["TTbar_14","ZMM_14","ZEE_14","ZTT_14","NuGun","SingleMu","QCD_Pt15To7000_Flat"]
0895         selected = [
0896             (any(y in key for y in years) and ('FS' not in key) and any( f in fragment for f in fragments)),
0897             (('HI' in key) and ('Hydjet' in fragment) and ("PixelOnly" in self.suffix) )
0898         ]
0899         result = any(selected) and hasHarvest
0900 
0901         return result
0902 
0903     def setup_(self, step, stepName, stepDict, k, properties):
0904         # skip ALCA and Nano steps (but not RecoNano or HARVESTNano for Run3)
0905         if 'ALCA' in step or 'Nano'==step:
0906             stepDict[stepName][k] = None
0907         elif ('Digi' in step and "NoHLT" not in step) or 'HLTOnly' in step:
0908             if self.__digi is None:
0909               stepDict[stepName][k] = None
0910             else:
0911               stepDict[stepName][k] = merge([self.__digi, stepDict[step][k]])
0912         elif 'Reco' in step:
0913             if self.__reco is None:
0914               stepDict[stepName][k] = None
0915             else:
0916               stepDict[stepName][k] = merge([self.__reco, stepDict[step][k]])
0917             if 'Phase2' in stepDict[stepName][k]['--era']:
0918                 if 'DQM:@standardDQM+@ExtraHLT' in stepDict[stepName][k]['-s']:
0919                     stepDict[stepName][k]['-s'] = stepDict[stepName][k]['-s'].replace('DQM:@standardDQM+@ExtraHLT','DQM:@phase2')
0920                 if 'VALIDATION:@standardValidation' in stepDict[stepName][k]['-s']:
0921                     stepDict[stepName][k]['-s'] = stepDict[stepName][k]['-s'].replace('VALIDATION:@standardValidation','VALIDATION:@phase2Validation')
0922 
0923 
0924         elif 'MiniAOD' in step:
0925             if self.__mini is None:
0926               stepDict[stepName][k] = None
0927             else:
0928               stepDict[stepName][k] = merge([self.__mini, stepDict[step][k]])
0929         elif 'HARVEST' in step:
0930             if self.__harvest is None:
0931               stepDict[stepName][k] = None
0932             else:
0933               stepDict[stepName][k] = merge([self.__harvest, stepDict[step][k]])
0934 
0935 # Pixel-only quadruplets workflow running on CPU
0936 #  - HLT on CPU
0937 #  - Pixel-only reconstruction on CPU, with DQM and validation
0938 #  - harvesting
0939 
0940 upgradeWFs['PatatrackPixelOnlyCPU'] = PatatrackWorkflow(
0941     digi = {
0942         # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
0943     },
0944     reco = {
0945         '-s': 'RAW2DIGI:RawToDigi_pixelOnly,RECO:reconstruction_pixelTrackingOnly,VALIDATION:@pixelTrackingOnlyValidation,DQM:@pixelTrackingOnlyDQM',
0946         '--procModifiers': 'pixelNtupletFit'
0947     },
0948     harvest = {
0949         '-s': 'HARVESTING:@trackingOnlyValidation+@pixelTrackingOnlyDQM'
0950     },
0951     suffix = 'Patatrack_PixelOnlyCPU',
0952     offset = 0.501,
0953 )
0954 
0955 # Pixel-only quadruplets workflow running on CPU or GPU
0956 #  - HLT on GPU (optional)
0957 #  - Pixel-only reconstruction on GPU (optional), with DQM and validation
0958 #  - harvesting
0959 upgradeWFs['PatatrackPixelOnlyGPU'] = PatatrackWorkflow(
0960     digi = {
0961         # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
0962         '--procModifiers': 'gpu'
0963     },
0964     reco = {
0965         '-s': 'RAW2DIGI:RawToDigi_pixelOnly,RECO:reconstruction_pixelTrackingOnly,VALIDATION:@pixelTrackingOnlyValidation,DQM:@pixelTrackingOnlyDQM',
0966         '--procModifiers': 'pixelNtupletFit,gpu'
0967     },
0968     harvest = {
0969         '-s': 'HARVESTING:@trackingOnlyValidation+@pixelTrackingOnlyDQM'
0970     },
0971     suffix = 'Patatrack_PixelOnlyGPU',
0972     offset = 0.502,
0973 )
0974 
0975 # Pixel-only quadruplets workflow running on CPU and GPU
0976 #  - HLT on GPU (required)
0977 #  - Pixel-only reconstruction on both CPU and GPU, with DQM and validation for GPU-vs-CPU comparisons
0978 #  - harvesting
0979 upgradeWFs['PatatrackPixelOnlyGPUValidation'] = PatatrackWorkflow(
0980     digi = {
0981         # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
0982         '--accelerators': 'gpu-nvidia',
0983         '--procModifiers': 'gpu'
0984     },
0985     reco = {
0986         '-s': 'RAW2DIGI:RawToDigi_pixelOnly,RECO:reconstruction_pixelTrackingOnly,VALIDATION:@pixelTrackingOnlyValidation,DQM:@pixelTrackingOnlyDQM',
0987         '--accelerators': 'gpu-nvidia',
0988         '--procModifiers': 'pixelNtupletFit,gpuValidation'
0989     },
0990     harvest = {
0991         '-s': 'HARVESTING:@trackingOnlyValidation+@pixelTrackingOnlyDQM',
0992         '--procModifiers': 'gpuValidation'
0993     },
0994     suffix = 'Patatrack_PixelOnlyGPU_Validation',
0995     offset = 0.503,
0996 )
0997 
0998 # Pixel-only quadruplets workflow running on CPU or GPU, trimmed down for benchmarking
0999 #  - HLT on GPU (optional)
1000 #  - Pixel-only reconstruction on GPU (optional)
1001 upgradeWFs['PatatrackPixelOnlyGPUProfiling'] = PatatrackWorkflow(
1002     digi = {
1003         # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
1004         '--procModifiers': 'gpu'
1005     },
1006     reco = {
1007         '-s': 'RAW2DIGI:RawToDigi_pixelOnly,RECO:reconstruction_pixelTrackingOnly',
1008         '--procModifiers': 'pixelNtupletFit,gpu',
1009         '--customise' : 'RecoTracker/Configuration/customizePixelOnlyForProfiling.customizePixelOnlyForProfilingGPUOnly'
1010     },
1011     harvest = None,
1012     suffix = 'Patatrack_PixelOnlyGPU_Profiling',
1013     offset = 0.504,
1014 )
1015 
1016 # Pixel-only triplets workflow running on CPU
1017 #  - HLT on CPU
1018 #  - Pixel-only reconstruction on CPU, with DQM and validation
1019 #  - harvesting
1020 upgradeWFs['PatatrackPixelOnlyTripletsCPU'] = PatatrackWorkflow(
1021     digi = {
1022         # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
1023     },
1024     reco = {
1025         '-s': 'RAW2DIGI:RawToDigi_pixelOnly,RECO:reconstruction_pixelTrackingOnly,VALIDATION:@pixelTrackingOnlyValidation,DQM:@pixelTrackingOnlyDQM',
1026         '--procModifiers': 'pixelNtupletFit',
1027         '--customise' : 'RecoTracker/Configuration/customizePixelTracksForTriplets.customizePixelTracksForTriplets'
1028     },
1029     harvest = {
1030         '-s': 'HARVESTING:@trackingOnlyValidation+@pixelTrackingOnlyDQM'
1031     },
1032     suffix = 'Patatrack_PixelOnlyTripletsCPU',
1033     offset = 0.505,
1034 )
1035 
1036 # Pixel-only triplets workflow running on CPU or GPU
1037 #  - HLT on GPU (optional)
1038 #  - Pixel-only reconstruction on GPU (optional), with DQM and validation
1039 #  - harvesting
1040 upgradeWFs['PatatrackPixelOnlyTripletsGPU'] = PatatrackWorkflow(
1041     digi = {
1042         # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
1043         '--procModifiers': 'gpu'
1044     },
1045     reco = {
1046         '-s': 'RAW2DIGI:RawToDigi_pixelOnly,RECO:reconstruction_pixelTrackingOnly,VALIDATION:@pixelTrackingOnlyValidation,DQM:@pixelTrackingOnlyDQM',
1047         '--procModifiers': 'pixelNtupletFit,gpu',
1048         '--customise': 'RecoTracker/Configuration/customizePixelTracksForTriplets.customizePixelTracksForTriplets'
1049     },
1050     harvest = {
1051         '-s': 'HARVESTING:@trackingOnlyValidation+@pixelTrackingOnlyDQM'
1052     },
1053     suffix = 'Patatrack_PixelOnlyTripletsGPU',
1054     offset = 0.506,
1055 )
1056 
1057 # Pixel-only triplets workflow running on CPU and GPU
1058 #  - HLT on GPU (required)
1059 #  - Pixel-only reconstruction on both CPU and GPU, with DQM and validation for GPU-vs-CPU comparisons
1060 #  - harvesting
1061 upgradeWFs['PatatrackPixelOnlyTripletsGPUValidation'] = PatatrackWorkflow(
1062     digi = {
1063         # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
1064         '--accelerators': 'gpu-nvidia',
1065         '--procModifiers': 'gpu'
1066     },
1067     reco = {
1068         '-s': 'RAW2DIGI:RawToDigi_pixelOnly,RECO:reconstruction_pixelTrackingOnly,VALIDATION:@pixelTrackingOnlyValidation,DQM:@pixelTrackingOnlyDQM',
1069         '--accelerators': 'gpu-nvidia',
1070         '--procModifiers': 'pixelNtupletFit,gpuValidation',
1071         '--customise': 'RecoTracker/Configuration/customizePixelTracksForTriplets.customizePixelTracksForTriplets'
1072     },
1073     harvest = {
1074         '-s': 'HARVESTING:@trackingOnlyValidation+@pixelTrackingOnlyDQM',
1075         '--procModifiers': 'gpuValidation',
1076     },
1077     suffix = 'Patatrack_PixelOnlyTripletsGPU_Validation',
1078     offset = 0.507,
1079 )
1080 
1081 # Pixel-only triplets workflow running on CPU or GPU, trimmed down for benchmarking
1082 #  - HLT on GPU (optional)
1083 #  - Pixel-only reconstruction on GPU (optional)
1084 upgradeWFs['PatatrackPixelOnlyTripletsGPUProfiling'] = PatatrackWorkflow(
1085     digi = {
1086         # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
1087         '--procModifiers': 'gpu'
1088     },
1089     reco = {
1090         '-s': 'RAW2DIGI:RawToDigi_pixelOnly,RECO:reconstruction_pixelTrackingOnly',
1091         '--procModifiers': 'pixelNtupletFit,gpu',
1092         '--customise': 'RecoTracker/Configuration/customizePixelTracksForTriplets.customizePixelTracksForTriplets,RecoTracker/Configuration/customizePixelOnlyForProfiling.customizePixelOnlyForProfilingGPUOnly'
1093     },
1094     harvest = None,
1095     suffix = 'Patatrack_PixelOnlyTripletsGPU_Profiling',
1096     offset = 0.508,
1097 )
1098 
1099 # ECAL-only workflow running on CPU or GPU with Alpaka code
1100 #  - HLT with Alpaka
1101 #  - ECAL-only reconstruction with Alpaka, with DQM and validation
1102 #  - harvesting
1103 upgradeWFs['PatatrackECALOnlyAlpaka'] = PatatrackWorkflow(
1104     digi = {
1105         # customize the ECAL Local Reco part of the HLT menu for Alpaka
1106         '--procModifiers': 'alpaka', # alpaka modifier activates customiseHLTForAlpaka
1107         '--customise' : 'HeterogeneousCore/AlpakaServices/customiseAlpakaServiceMemoryFilling.customiseAlpakaServiceMemoryFilling',
1108     },
1109     reco = {
1110         '-s': 'RAW2DIGI:RawToDigi_ecalOnly,RECO:reconstruction_ecalOnly,VALIDATION:@ecalOnlyValidation,DQM:@ecalOnly',
1111         '--procModifiers': 'alpaka',
1112         '--customise' : 'HeterogeneousCore/AlpakaServices/customiseAlpakaServiceMemoryFilling.customiseAlpakaServiceMemoryFilling',
1113     },
1114     harvest = {
1115         '-s': 'HARVESTING:@ecalOnlyValidation+@ecal'
1116     },
1117     suffix = 'Patatrack_ECALOnlyAlpaka',
1118     offset = 0.412,
1119 )
1120 
1121 # ECAL-only workflow running on CPU
1122 #  - HLT on CPU
1123 #  - ECAL-only reconstruction on CPU, with DQM and validation
1124 #  - harvesting
1125 upgradeWFs['PatatrackECALOnlyCPU'] = PatatrackWorkflow(
1126     digi = {
1127         # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
1128     },
1129     reco = {
1130         '-s': 'RAW2DIGI:RawToDigi_ecalOnly,RECO:reconstruction_ecalOnly,VALIDATION:@ecalOnlyValidation,DQM:@ecalOnly',
1131     },
1132     harvest = {
1133         '-s': 'HARVESTING:@ecalOnlyValidation+@ecal'
1134     },
1135     suffix = 'Patatrack_ECALOnlyCPU',
1136     offset = 0.511,
1137 )
1138 
1139 # ECAL-only workflow running on CPU or GPU
1140 #  - HLT on GPU (optional)
1141 #  - ECAL-only reconstruction on GPU (optional), with DQM and validation
1142 #  - harvesting
1143 upgradeWFs['PatatrackECALOnlyGPU'] = PatatrackWorkflow(
1144     digi = {
1145         # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
1146         '--procModifiers': 'gpu'
1147     },
1148     reco = {
1149         '-s': 'RAW2DIGI:RawToDigi_ecalOnly,RECO:reconstruction_ecalOnly,VALIDATION:@ecalOnlyValidation,DQM:@ecalOnly',
1150         '--procModifiers': 'gpu'
1151     },
1152     harvest = {
1153         '-s': 'HARVESTING:@ecalOnlyValidation+@ecal'
1154     },
1155     suffix = 'Patatrack_ECALOnlyGPU',
1156     offset = 0.512,
1157 )
1158 
1159 # ECAL-only workflow running on CPU and GPU
1160 #  - HLT on GPU (required)
1161 #  - ECAL-only reconstruction on both CPU and GPU, with DQM and validation for GPU-vs-CPU comparisons
1162 #  - harvesting
1163 upgradeWFs['PatatrackECALOnlyGPUValidation'] = PatatrackWorkflow(
1164     digi = {
1165         # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
1166         '--accelerators': 'gpu-nvidia',
1167         '--procModifiers': 'gpu'
1168     },
1169     reco = {
1170         '-s': 'RAW2DIGI:RawToDigi_ecalOnly,RECO:reconstruction_ecalOnly,VALIDATION:@ecalOnlyValidation,DQM:@ecalOnly',
1171         '--accelerators': 'gpu-nvidia',
1172         '--procModifiers': 'gpuValidation'
1173     },
1174     harvest = {
1175         '-s': 'HARVESTING:@ecalOnlyValidation+@ecal'
1176     },
1177     suffix = 'Patatrack_ECALOnlyGPU_Validation',
1178     offset = 0.513,
1179 )
1180 
1181 # ECAL-only workflow running on CPU or GPU, trimmed down for benchmarking
1182 #  - HLT on GPU (optional)
1183 #  - ECAL-only reconstruction on GPU (optional)
1184 upgradeWFs['PatatrackECALOnlyGPUProfiling'] = PatatrackWorkflow(
1185     digi = {
1186         # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
1187         '--procModifiers': 'gpu'
1188     },
1189     reco = {
1190         '-s': 'RAW2DIGI:RawToDigi_ecalOnly,RECO:reconstruction_ecalOnly',
1191         '--procModifiers': 'gpu',
1192         '--customise' : 'RecoLocalCalo/Configuration/customizeEcalOnlyForProfiling.customizeEcalOnlyForProfilingGPUOnly'
1193     },
1194     harvest = None,
1195     suffix = 'Patatrack_ECALOnlyGPU_Profiling',
1196     offset = 0.514,
1197 )
1198 
1199 # HCAL-only workflow running on CPU
1200 #  - HLT on CPU
1201 #  - HCAL-only reconstruction on CPU, with DQM and validation
1202 #  - harvesting
1203 upgradeWFs['PatatrackHCALOnlyCPU'] = PatatrackWorkflow(
1204     digi = {
1205         # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
1206     },
1207     reco = {
1208         '-s': 'RAW2DIGI:RawToDigi_hcalOnly,RECO:reconstruction_hcalOnly,VALIDATION:@hcalOnlyValidation,DQM:@hcalOnly+@hcal2Only',
1209     },
1210     harvest = {
1211         '-s': 'HARVESTING:@hcalOnlyValidation+@hcalOnly+@hcal2Only'
1212     },
1213     suffix = 'Patatrack_HCALOnlyCPU',
1214     offset = 0.521,
1215 )
1216 
1217 # HCAL-only workflow running on CPU or GPU
1218 #  - HLT on GPU (optional)
1219 #  - HCAL-only reconstruction on GPU (optional), with DQM and validation
1220 #  - harvesting
1221 upgradeWFs['PatatrackHCALOnlyGPU'] = PatatrackWorkflow(
1222     digi = {
1223         # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
1224         '--procModifiers': 'gpu'
1225     },
1226     reco = {
1227         '-s': 'RAW2DIGI:RawToDigi_hcalOnly,RECO:reconstruction_hcalOnly,VALIDATION:@hcalOnlyValidation,DQM:@hcalOnly+@hcal2Only',
1228         '--procModifiers': 'gpu'
1229     },
1230     harvest = {
1231         '-s': 'HARVESTING:@hcalOnlyValidation+@hcalOnly+@hcal2Only'
1232     },
1233     suffix = 'Patatrack_HCALOnlyGPU',
1234     offset = 0.522,
1235 )
1236 
1237 # HCAL-only workflow running on CPU and GPU
1238 #  - HLT on GPU (required)
1239 #  - HCAL-only reconstruction on both CPU and GPU, with DQM and validation for GPU-vs-CPU comparisons
1240 #  - harvesting
1241 upgradeWFs['PatatrackHCALOnlyGPUValidation'] = PatatrackWorkflow(
1242     digi = {
1243         # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
1244         '--accelerators': 'gpu-nvidia',
1245         '--procModifiers': 'gpu'
1246     },
1247     reco = {
1248         '-s': 'RAW2DIGI:RawToDigi_hcalOnly,RECO:reconstruction_hcalOnly,VALIDATION:@hcalOnlyValidation,DQM:@hcalOnly+@hcal2Only',
1249         '--accelerators': 'gpu-nvidia',
1250         '--procModifiers': 'gpuValidation'
1251     },
1252     harvest = {
1253         '-s': 'HARVESTING:@hcalOnlyValidation+@hcal'
1254     },
1255     suffix = 'Patatrack_HCALOnlyGPU_Validation',
1256     offset = 0.523,
1257 )
1258 
1259 # HCAL-only workflow running on CPU or GPU, trimmed down for benchmarking
1260 #  - HLT on GPU (optional)
1261 #  - HCAL-only reconstruction on GPU (optional)
1262 upgradeWFs['PatatrackHCALOnlyGPUProfiling'] = PatatrackWorkflow(
1263     digi = {
1264         # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
1265         '--procModifiers': 'gpu'
1266     },
1267     reco = {
1268         '-s': 'RAW2DIGI:RawToDigi_hcalOnly,RECO:reconstruction_hcalOnly',
1269         '--procModifiers': 'gpu',
1270         '--customise' : 'RecoLocalCalo/Configuration/customizeHcalOnlyForProfiling.customizeHcalOnlyForProfilingGPUOnly'
1271     },
1272     harvest = None,
1273     suffix = 'Patatrack_HCALOnlyGPU_Profiling',
1274     offset = 0.524,
1275 )
1276 
1277 # HCAL-PF Only workflow running HCAL local reco on GPU and PF with Alpaka with DQM and Validation
1278 # - HLT-alpaka
1279 # - HCAL-only reconstruction using Alpaka with DQM and Validation
1280 upgradeWFs['PatatrackHCALOnlyAlpakaValidation'] = PatatrackWorkflow(
1281     digi = {
1282         '--procModifiers': 'alpaka', # alpaka modifier activates customiseHLTForAlpaka
1283         '--customise' : 'HeterogeneousCore/AlpakaServices/customiseAlpakaServiceMemoryFilling.customiseAlpakaServiceMemoryFilling',
1284     },
1285     reco = {
1286         '-s': 'RAW2DIGI:RawToDigi_hcalOnly,RECO:reconstruction_hcalOnly,VALIDATION:@hcalOnlyValidation,DQM:@hcalOnly+@hcal2Only',
1287         '--procModifiers': 'alpaka',
1288         '--customise' : 'HeterogeneousCore/AlpakaServices/customiseAlpakaServiceMemoryFilling.customiseAlpakaServiceMemoryFilling',
1289     },
1290     harvest = {
1291         '-s': 'HARVESTING:@hcalOnlyValidation'
1292     },
1293     suffix = 'Patatrack_HCALOnlyAlpaka_Validation',
1294     offset = 0.422,
1295 )
1296 
1297 # HCAL-PF Only workflow running HCAL local reco and PF with Alpaka with cluster level-validation
1298 # - HLT-alpaka
1299 # - HCAL-only reconstruction using GPU and Alpaka with DQM and Validation for PF Alpaka vs CPU comparisons
1300 upgradeWFs['PatatrackHCALOnlyGPUandAlpakaValidation'] = PatatrackWorkflow(
1301     digi = {
1302         '--procModifiers': 'alpaka', # alpaka modifier activates customiseHLTForAlpaka
1303         '--customise' : 'HeterogeneousCore/AlpakaServices/customiseAlpakaServiceMemoryFilling.customiseAlpakaServiceMemoryFilling',
1304     },
1305     reco = {
1306         '-s': 'RAW2DIGI:RawToDigi_hcalOnly,RECO:reconstruction_hcalOnlyLegacy+reconstruction_hcalOnly,VALIDATION:@hcalOnlyValidation+pfClusterHBHEOnlyAlpakaComparisonSequence,DQM:@hcalOnly+@hcal2Only+hcalOnlyOfflineSourceSequenceAlpaka',
1307         '--procModifiers': 'alpaka',
1308         '--customise' : 'HeterogeneousCore/AlpakaServices/customiseAlpakaServiceMemoryFilling.customiseAlpakaServiceMemoryFilling',
1309     },
1310     harvest = {
1311         '-s': 'HARVESTING:@hcalOnlyValidation'
1312     },
1313     suffix = 'Patatrack_HCALOnlyGPUandAlpaka_Validation',
1314     offset = 0.423,
1315 )
1316 
1317 # HCAL-PF Only workflow running HCAL local reco on CPU and PF with Alpaka slimmed for benchmarking
1318 # - HLT-alpaka
1319 # - HCAL-only reconstruction using Alpaka
1320 upgradeWFs['PatatrackHCALOnlyAlpakaProfiling'] = PatatrackWorkflow(
1321     digi = {
1322         '--procModifiers': 'alpaka', # alpaka modifier activates customiseHLTForAlpaka
1323     },
1324     reco = {
1325         '-s': 'RAW2DIGI:RawToDigi_hcalOnly,RECO:reconstruction_hcalOnly',
1326         '--procModifiers': 'alpaka'
1327     },
1328     harvest = None,
1329     suffix = 'Patatrack_HCALOnlyAlpaka_Profiling',
1330     offset = 0.424,
1331 )
1332 
1333 # Workflow running the Pixel quadruplets, ECAL and HCAL reconstruction on GPU (optional), PF using Alpaka, together with the full offline reconstruction on CPU
1334 #  - HLT on GPU (optional)
1335 #  - reconstruction on Alpaka, with DQM and validation
1336 #  - harvesting
1337 upgradeWFs['PatatrackFullRecoAlpaka'] = PatatrackWorkflow(
1338     digi = {
1339         '--procModifiers': 'alpaka', # alpaka modifier activates customiseHLTForAlpaka
1340         '--customise' : 'HeterogeneousCore/AlpakaServices/customiseAlpakaServiceMemoryFilling.customiseAlpakaServiceMemoryFilling',
1341     },
1342     reco = {
1343         # skip the @pixelTrackingOnlyValidation which cannot run together with the full reconstruction
1344         '-s': 'RAW2DIGI:RawToDigi+RawToDigi_pixelOnly,L1Reco,RECO:reconstruction+reconstruction_pixelTrackingOnly,RECOSIM,PAT,VALIDATION:@standardValidation+@miniAODValidation,DQM:@standardDQM+@ExtraHLT+@miniAODDQM+@pixelTrackingOnlyDQM',
1345         '--procModifiers': 'alpaka,pixelNtupletFit',
1346         '--customise' : 'HeterogeneousCore/AlpakaServices/customiseAlpakaServiceMemoryFilling.customiseAlpakaServiceMemoryFilling',
1347     },
1348     harvest = {
1349         # skip the @pixelTrackingOnlyDQM harvesting
1350     },
1351     suffix = 'Patatrack_FullRecoAlpaka',
1352     offset = 0.492,
1353 )
1354 
1355 # Workflow running the Pixel quadruplets, ECAL and HCAL reconstruction on CPU
1356 #  - HLT on CPU
1357 #  - reconstruction on CPU, with DQM and validation
1358 #  - harvesting
1359 upgradeWFs['PatatrackAllCPU'] = PatatrackWorkflow(
1360     digi = {
1361         # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
1362     },
1363     reco = {
1364         '-s': 'RAW2DIGI:RawToDigi_pixelOnly+RawToDigi_ecalOnly+RawToDigi_hcalOnly,RECO:reconstruction_pixelTrackingOnly+reconstruction_ecalOnly+reconstruction_hcalOnly,VALIDATION:@pixelTrackingOnlyValidation+@ecalOnlyValidation+@hcalOnlyValidation,DQM:@pixelTrackingOnlyDQM+@ecalOnly+@hcalOnly+@hcal2Only',
1365         '--procModifiers': 'pixelNtupletFit'
1366     },
1367     harvest = {
1368         '-s': 'HARVESTING:@trackingOnlyValidation+@pixelTrackingOnlyDQM+@ecalOnlyValidation+@ecal+@hcalOnlyValidation+@hcalOnly+@hcal2Only'
1369     },
1370     suffix = 'Patatrack_AllCPU',
1371     offset = 0.581,
1372 )
1373 
1374 # Workflow running the Pixel quadruplets, ECAL and HCAL reconstruction on CPU or GPU
1375 #  - HLT on GPU (optional)
1376 #  - reconstruction on GPU (optional), with DQM and validation
1377 #  - harvesting
1378 upgradeWFs['PatatrackAllGPU'] = PatatrackWorkflow(
1379     digi = {
1380         # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
1381         '--procModifiers': 'gpu'
1382     },
1383     reco = {
1384         '-s': 'RAW2DIGI:RawToDigi_pixelOnly+RawToDigi_ecalOnly+RawToDigi_hcalOnly,RECO:reconstruction_pixelTrackingOnly+reconstruction_ecalOnly+reconstruction_hcalOnly,VALIDATION:@pixelTrackingOnlyValidation+@ecalOnlyValidation+@hcalOnlyValidation,DQM:@pixelTrackingOnlyDQM+@ecalOnly+@hcalOnly+@hcal2Only',
1385         '--procModifiers': 'pixelNtupletFit,gpu'
1386     },
1387     harvest = {
1388         '-s': 'HARVESTING:@trackingOnlyValidation+@pixelTrackingOnlyDQM+@ecalOnlyValidation+@ecal+@hcalOnlyValidation+@hcalOnly+@hcal2Only'
1389     },
1390     suffix = 'Patatrack_AllGPU',
1391     offset = 0.582,
1392 )
1393 
1394 # Workflow running the Pixel quadruplets, ECAL and HCAL reconstruction on CPU and GPU
1395 #  - HLT on GPU (required)
1396 #  - reconstruction on CPU and GPU, with DQM and validation for GPU-vs-CPU comparisons
1397 #  - harvesting
1398 upgradeWFs['PatatrackAllGPUValidation'] = PatatrackWorkflow(
1399     digi = {
1400         # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
1401         '--accelerators': 'gpu-nvidia',
1402         '--procModifiers': 'gpu'
1403     },
1404     reco = {
1405         '-s': 'RAW2DIGI:RawToDigi_pixelOnly+RawToDigi_ecalOnly+RawToDigi_hcalOnly,RECO:reconstruction_pixelTrackingOnly+reconstruction_ecalOnly+reconstruction_hcalOnly,VALIDATION:@pixelTrackingOnlyValidation+@ecalOnlyValidation+@hcalOnlyValidation,DQM:@pixelTrackingOnlyDQM+@ecalOnly+@hcalOnly+@hcal2Only',
1406         '--accelerators': 'gpu-nvidia',
1407         '--procModifiers': 'pixelNtupletFit,gpuValidation'
1408     },
1409     harvest = {
1410         '-s': 'HARVESTING:@trackingOnlyValidation+@pixelTrackingOnlyDQM+@ecalOnlyValidation+@ecal+@hcalOnlyValidation+@hcalOnly+@hcal2Only',
1411         '--procModifiers': 'gpuValidation'
1412     },
1413     suffix = 'Patatrack_AllGPU_Validation',
1414     offset = 0.583,
1415 )
1416 
1417 # Workflow running the Pixel quadruplets, ECAL and HCAL reconstruction on CPU or GPU, trimmed down for benchmarking
1418 #  - HLT on GPU (optional)
1419 #  - minimal reconstruction on GPU (optional)
1420 # FIXME workflow 0.584 to be implemented
1421 
1422 # Workflow running the Pixel triplets, ECAL and HCAL reconstruction on CPU
1423 #  - HLT on CPU
1424 #  - reconstruction on CPU, with DQM and validation
1425 #  - harvesting
1426 upgradeWFs['PatatrackAllTripletsCPU'] = PatatrackWorkflow(
1427     digi = {
1428         # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
1429     },
1430     reco = {
1431         '-s': 'RAW2DIGI:RawToDigi_pixelOnly+RawToDigi_ecalOnly+RawToDigi_hcalOnly,RECO:reconstruction_pixelTrackingOnly+reconstruction_ecalOnly+reconstruction_hcalOnly,VALIDATION:@pixelTrackingOnlyValidation+@ecalOnlyValidation+@hcalOnlyValidation,DQM:@pixelTrackingOnlyDQM+@ecalOnly+@hcalOnly+@hcal2Only',
1432         '--procModifiers': 'pixelNtupletFit'
1433     },
1434     harvest = {
1435         '-s': 'HARVESTING:@trackingOnlyValidation+@pixelTrackingOnlyDQM+@ecalOnlyValidation+@ecal+@hcalOnlyValidation+@hcalOnly+@hcal2Only'
1436     },
1437     suffix = 'Patatrack_AllTripletsCPU',
1438     offset = 0.585,
1439 )
1440 
1441 # Workflow running the Pixel triplets, ECAL and HCAL reconstruction on CPU or GPU
1442 #  - HLT on GPU (optional)
1443 #  - reconstruction on GPU (optional), with DQM and validation
1444 #  - harvesting
1445 upgradeWFs['PatatrackAllTripletsGPU'] = PatatrackWorkflow(
1446     digi = {
1447         # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
1448         '--procModifiers': 'gpu'
1449     },
1450     reco = {
1451         '-s': 'RAW2DIGI:RawToDigi_pixelOnly+RawToDigi_ecalOnly+RawToDigi_hcalOnly,RECO:reconstruction_pixelTrackingOnly+reconstruction_ecalOnly+reconstruction_hcalOnly,VALIDATION:@pixelTrackingOnlyValidation+@ecalOnlyValidation+@hcalOnlyValidation,DQM:@pixelTrackingOnlyDQM+@ecalOnly+@hcalOnly+@hcal2Only',
1452         '--procModifiers': 'pixelNtupletFit,gpu'
1453     },
1454     harvest = {
1455         '-s': 'HARVESTING:@trackingOnlyValidation+@pixelTrackingOnlyDQM+@ecalOnlyValidation+@ecal+@hcalOnlyValidation+@hcalOnly+@hcal2Only'
1456     },
1457     suffix = 'Patatrack_AllTripletsGPU',
1458     offset = 0.586,
1459 )
1460 
1461 # Workflow running the Pixel triplets, ECAL and HCAL reconstruction on CPU and GPU
1462 #  - HLT on GPU (required)
1463 #  - reconstruction on CPU and GPU, with DQM and validation for GPU-vs-CPU comparisons
1464 #  - harvesting
1465 upgradeWFs['PatatrackAllTripletsGPUValidation'] = PatatrackWorkflow(
1466     digi = {
1467         # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
1468         '--accelerators': 'gpu-nvidia',
1469         '--procModifiers': 'gpu'
1470     },
1471     reco = {
1472         '-s': 'RAW2DIGI:RawToDigi_pixelOnly+RawToDigi_ecalOnly+RawToDigi_hcalOnly,RECO:reconstruction_pixelTrackingOnly+reconstruction_ecalOnly+reconstruction_hcalOnly,VALIDATION:@pixelTrackingOnlyValidation+@ecalOnlyValidation+@hcalOnlyValidation,DQM:@pixelTrackingOnlyDQM+@ecalOnly+@hcalOnly+@hcal2Only',
1473         '--accelerators': 'gpu-nvidia',
1474         '--procModifiers': 'pixelNtupletFit,gpuValidation'
1475     },
1476     harvest = {
1477         '-s': 'HARVESTING:@trackingOnlyValidation+@pixelTrackingOnlyDQM+@ecalOnlyValidation+@ecal+@hcalOnlyValidation+@hcalOnly+@hcal2Only',
1478         '--procModifiers': 'gpuValidation'
1479     },
1480     suffix = 'Patatrack_AllTripletsGPU_Validation',
1481     offset = 0.587,
1482 )
1483 
1484 # Workflow running the Pixel triplets, ECAL and HCAL reconstruction on CPU or GPU, trimmed down for benchmarking
1485 #  - HLT on GPU (optional)
1486 #  - minimal reconstruction on GPU (optional)
1487 # FIXME workflow 0.588 to be implemented
1488 
1489 # Workflow running the Pixel quadruplets, ECAL and HCAL reconstruction on CPU, together with the full offline reconstruction
1490 #  - HLT on CPU
1491 #  - reconstruction on CPU, with DQM and validation
1492 #  - harvesting
1493 upgradeWFs['PatatrackFullRecoCPU'] = PatatrackWorkflow(
1494     digi = {
1495         # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
1496     },
1497     reco = {
1498         # skip the @pixelTrackingOnlyValidation which cannot run together with the full reconstruction
1499         '-s': 'RAW2DIGI:RawToDigi+RawToDigi_pixelOnly,L1Reco,RECO:reconstruction+reconstruction_pixelTrackingOnly,RECOSIM,PAT,VALIDATION:@standardValidation+@miniAODValidation,DQM:@standardDQM+@ExtraHLT+@miniAODDQM+@pixelTrackingOnlyDQM',
1500         '--procModifiers': 'pixelNtupletFit'
1501     },
1502     harvest = {
1503         # skip the @pixelTrackingOnlyDQM harvesting
1504     },
1505     suffix = 'Patatrack_FullRecoCPU',
1506     offset = 0.591,
1507 )
1508 
1509 # Workflow running the Pixel quadruplets, ECAL and HCAL reconstruction on GPU (optional), together with the full offline reconstruction on CPU
1510 #  - HLT on GPU (optional)
1511 #  - reconstruction on GPU (optional), with DQM and validation
1512 #  - harvesting
1513 upgradeWFs['PatatrackFullRecoGPU'] = PatatrackWorkflow(
1514     digi = {
1515         # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
1516         '--procModifiers': 'gpu'
1517     },
1518     reco = {
1519         # skip the @pixelTrackingOnlyValidation which cannot run together with the full reconstruction
1520         '-s': 'RAW2DIGI:RawToDigi+RawToDigi_pixelOnly,L1Reco,RECO:reconstruction+reconstruction_pixelTrackingOnly,RECOSIM,PAT,VALIDATION:@standardValidation+@miniAODValidation,DQM:@standardDQM+@ExtraHLT+@miniAODDQM+@pixelTrackingOnlyDQM',
1521         '--procModifiers': 'pixelNtupletFit,gpu'
1522     },
1523     harvest = {
1524         # skip the @pixelTrackingOnlyDQM harvesting
1525     },
1526     suffix = 'Patatrack_FullRecoGPU',
1527     offset = 0.592,
1528 )
1529 
1530 # Workflow running the Pixel quadruplets, ECAL and HCAL reconstruction on CPU and GPU, together with the full offline reconstruction on CPU
1531 #  - HLT on GPU (required)
1532 #  - reconstruction on CPU and GPU, with DQM and validation for GPU-vs-CPU comparisons
1533 #  - harvesting
1534 upgradeWFs['PatatrackFullRecoGPUValidation'] = PatatrackWorkflow(
1535     digi = {
1536         # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
1537         '--accelerators': 'gpu-nvidia',
1538         '--procModifiers': 'gpu'
1539     },
1540     reco = {
1541         # skip the @pixelTrackingOnlyValidation which cannot run together with the full reconstruction
1542         '-s': 'RAW2DIGI:RawToDigi+RawToDigi_pixelOnly,L1Reco,RECO:reconstruction+reconstruction_pixelTrackingOnly,RECOSIM,PAT,VALIDATION:@standardValidation+@miniAODValidation,DQM:@standardDQM+@ExtraHLT+@miniAODDQM+@pixelTrackingOnlyDQM',
1543         '--accelerators': 'gpu-nvidia',
1544         '--procModifiers': 'pixelNtupletFit,gpuValidation'
1545     },
1546     harvest = {
1547         # skip the @pixelTrackingOnlyDQM harvesting
1548     },
1549     suffix = 'Patatrack_FullRecoGPU_Validation',
1550     offset = 0.593,
1551 )
1552 
1553 # Workflow running the Pixel triplets, ECAL and HCAL reconstruction on CPU, together with the full offline reconstruction
1554 #  - HLT on CPU
1555 #  - reconstruction on CPU, with DQM and validation
1556 #  - harvesting
1557 upgradeWFs['PatatrackFullRecoTripletsCPU'] = PatatrackWorkflow(
1558     digi = {
1559         # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
1560     },
1561     reco = {
1562         # skip the @pixelTrackingOnlyValidation which cannot run together with the full reconstruction
1563         '-s': 'RAW2DIGI:RawToDigi+RawToDigi_pixelOnly,L1Reco,RECO:reconstruction+reconstruction_pixelTrackingOnly,RECOSIM,PAT,VALIDATION:@standardValidation+@miniAODValidation,DQM:@standardDQM+@ExtraHLT+@miniAODDQM+@pixelTrackingOnlyDQM',
1564         '--procModifiers': 'pixelNtupletFit',
1565         '--customise' : 'RecoTracker/Configuration/customizePixelTracksForTriplets.customizePixelTracksForTriplets'
1566     },
1567     harvest = {
1568         # skip the @pixelTrackingOnlyDQM harvesting
1569     },
1570     suffix = 'Patatrack_FullRecoTripletsCPU',
1571     offset = 0.595,
1572 )
1573 #  - ProdLike
1574 upgradeWFs['PatatrackFullRecoTripletsCPUProdLike'] = PatatrackWorkflow(
1575     digi = {
1576         # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
1577         '--datatier':'GEN-SIM-RAW',
1578         '--eventcontent':'RAWSIM',
1579     },
1580     reco = {
1581         # skip the @pixelTrackingOnlyValidation which cannot run together with the full reconstruction
1582         '-s': 'RAW2DIGI:RawToDigi+RawToDigi_pixelOnly,L1Reco,RECO:reconstruction+reconstruction_pixelTrackingOnly,RECOSIM',
1583         '--procModifiers': 'pixelNtupletFit',
1584         '--customise' : 'RecoTracker/Configuration/customizePixelTracksForTriplets.customizePixelTracksForTriplets',
1585         '--datatier':'AODSIM',
1586         '--eventcontent':'AODSIM',
1587     },
1588     harvest = None,
1589     suffix = 'Patatrack_FullRecoTripletsCPUProdLike',
1590     offset = 0.59521,
1591 )
1592 
1593 # Workflow running the Pixel triplets, ECAL and HCAL reconstruction on GPU (optional), together with the full offline reconstruction on CPU
1594 #  - HLT on GPU (optional)
1595 #  - reconstruction on GPU (optional), with DQM and validation
1596 #  - harvesting
1597 upgradeWFs['PatatrackFullRecoTripletsGPU'] = PatatrackWorkflow(
1598     digi = {
1599         # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
1600         '--procModifiers': 'gpu'
1601     },
1602     reco = {
1603         # skip the @pixelTrackingOnlyValidation which cannot run together with the full reconstruction
1604         '-s': 'RAW2DIGI:RawToDigi+RawToDigi_pixelOnly,L1Reco,RECO:reconstruction+reconstruction_pixelTrackingOnly,RECOSIM,PAT,VALIDATION:@standardValidation+@miniAODValidation,DQM:@standardDQM+@ExtraHLT+@miniAODDQM+@pixelTrackingOnlyDQM',
1605         '--procModifiers': 'pixelNtupletFit,gpu',
1606         '--customise': 'RecoTracker/Configuration/customizePixelTracksForTriplets.customizePixelTracksForTriplets'
1607     },
1608     harvest = {
1609         # skip the @pixelTrackingOnlyDQM harvesting
1610     },
1611     suffix = 'Patatrack_FullRecoTripletsGPU',
1612     offset = 0.596,
1613 )
1614 #  - ProdLike
1615 upgradeWFs['PatatrackFullRecoTripletsGPUProdLike'] = PatatrackWorkflow(
1616     digi = {
1617         # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
1618         '--procModifiers': 'gpu',
1619         '--datatier':'GEN-SIM-RAW',
1620         '--eventcontent':'RAWSIM',
1621     },
1622     reco = {
1623         # skip the @pixelTrackingOnlyValidation which cannot run together with the full reconstruction
1624         '-s': 'RAW2DIGI:RawToDigi+RawToDigi_pixelOnly,L1Reco,RECO:reconstruction+reconstruction_pixelTrackingOnly,RECOSIM',
1625         '--procModifiers': 'pixelNtupletFit,gpu',
1626         '--customise': 'RecoTracker/Configuration/customizePixelTracksForTriplets.customizePixelTracksForTriplets',
1627         '--datatier':'AODSIM',
1628         '--eventcontent':'AODSIM',
1629     },
1630     harvest = None,
1631     suffix = 'Patatrack_FullRecoTripletsGPUProdLike',
1632     offset = 0.59621,
1633 )
1634 
1635 # Workflow running the Pixel triplets, ECAL and HCAL reconstruction on CPU and GPU, together with the full offline reconstruction on CPU
1636 #  - HLT on GPU (required)
1637 #  - reconstruction on CPU and GPU, with DQM and validation for GPU-vs-CPU comparisons
1638 #  - harvesting
1639 upgradeWFs['PatatrackFullRecoTripletsGPUValidation'] = PatatrackWorkflow(
1640     digi = {
1641         # the HLT menu is already set up for using GPUs if available and if the "gpu" modifier is enabled
1642         '--accelerators': 'gpu-nvidia',
1643         '--procModifiers': 'gpu'
1644     },
1645     reco = {
1646         # skip the @pixelTrackingOnlyValidation which cannot run together with the full reconstruction
1647         '-s': 'RAW2DIGI:RawToDigi+RawToDigi_pixelOnly,L1Reco,RECO:reconstruction+reconstruction_pixelTrackingOnly,RECOSIM,PAT,VALIDATION:@standardValidation+@miniAODValidation,DQM:@standardDQM+@ExtraHLT+@miniAODDQM+@pixelTrackingOnlyDQM',
1648         '--accelerators': 'gpu-nvidia',
1649         '--procModifiers': 'pixelNtupletFit,gpuValidation',
1650         '--customise' : 'RecoTracker/Configuration/customizePixelTracksForTriplets.customizePixelTracksForTriplets'
1651     },
1652     harvest = {
1653         # skip the @pixelTrackingOnlyDQM harvesting
1654     },
1655     suffix = 'Patatrack_FullRecoTripletsGPU_Validation',
1656     offset = 0.597,
1657 )
1658 
1659 upgradeWFs['PatatrackPixelOnlyAlpaka'] = PatatrackWorkflow(
1660     digi = {
1661         '--procModifiers': 'alpaka', # alpaka modifier activates customiseHLTForAlpaka
1662         '--customise' : 'HeterogeneousCore/AlpakaServices/customiseAlpakaServiceMemoryFilling.customiseAlpakaServiceMemoryFilling',
1663     },
1664     reco = {
1665         '-s': 'RAW2DIGI:RawToDigi_pixelOnly,RECO:reconstruction_pixelTrackingOnly,VALIDATION:@pixelTrackingOnlyValidation,DQM:@pixelTrackingOnlyDQM',
1666         '--procModifiers': 'alpaka',
1667         '--customise' : 'HeterogeneousCore/AlpakaServices/customiseAlpakaServiceMemoryFilling.customiseAlpakaServiceMemoryFilling',
1668     },
1669     harvest = {
1670         '-s': 'HARVESTING:@trackingOnlyValidation+@pixelTrackingOnlyDQM'
1671     },
1672     suffix = 'Patatrack_PixelOnlyAlpaka',
1673     offset = 0.402,
1674 )
1675 
1676 upgradeWFs['PatatrackPixelOnlyAlpakaValidation'] = PatatrackWorkflow(
1677     digi = {
1678         '--procModifiers': 'alpaka', # alpaka modifier activates customiseHLTForAlpaka
1679         '--customise' : 'HeterogeneousCore/AlpakaServices/customiseAlpakaServiceMemoryFilling.customiseAlpakaServiceMemoryFilling',
1680     },
1681     reco = {
1682         '-s': 'RAW2DIGI:RawToDigi_pixelOnly,RECO:reconstruction_pixelTrackingOnly,VALIDATION:@pixelTrackingOnlyValidation,DQM:@pixelTrackingOnlyDQM',
1683         '--procModifiers': 'alpakaValidation',
1684         '--customise' : 'HeterogeneousCore/AlpakaServices/customiseAlpakaServiceMemoryFilling.customiseAlpakaServiceMemoryFilling',
1685     },
1686     harvest = {
1687         '-s': 'HARVESTING:@trackingOnlyValidation+@pixelTrackingOnlyDQM'
1688     },
1689     suffix = 'Patatrack_PixelOnlyAlpaka_Validation',
1690     offset = 0.403,
1691 )
1692 
1693 upgradeWFs['PatatrackPixelOnlyAlpakaProfiling'] = PatatrackWorkflow(
1694     digi = {
1695         '--procModifiers': 'alpaka', # alpaka modifier activates customiseHLTForAlpaka
1696     },
1697     reco = {
1698         '-s': 'RAW2DIGI:RawToDigi_pixelOnly,RECO:reconstruction_pixelTrackingOnly',
1699         '--procModifiers': 'alpaka',
1700         '--customise' : 'RecoTracker/Configuration/customizePixelOnlyForProfiling.customizePixelOnlyForProfilingGPUOnly'
1701     },
1702     harvest = None,
1703     suffix = 'Patatrack_PixelOnlyAlpaka_Profiling',
1704     offset = 0.404,
1705 )
1706 
1707 # end of Patatrack workflows
1708 
1709 class UpgradeWorkflow_ProdLike(UpgradeWorkflow):
1710     def setup_(self, step, stepName, stepDict, k, properties):
1711         thisStep = stepDict[step][k]["-s"]
1712         if 'GenSimHLBeamSpot14' in step:
1713             stepDict[stepName][k] = merge([{'--eventcontent': 'RAWSIM', '--datatier': 'GEN-SIM'},stepDict[step][k]])
1714         elif 'Digi' in step and 'Trigger' not in step:
1715             stepDict[stepName][k] = merge([{'-s': thisStep.replace("DIGI:pdigi_valid","DIGI"),'--datatier':'GEN-SIM-RAW', '--eventcontent':'RAWSIM'}, stepDict[step][k]])
1716         elif 'DigiTrigger' in step: # for Phase-2
1717             stepDict[stepName][k] = merge([{'-s': thisStep.replace("DIGI:pdigi_valid","DIGI"), '--datatier':'GEN-SIM-RAW', '--eventcontent':'RAWSIM'}, stepDict[step][k]])
1718         elif 'Reco' in step:
1719             stepDict[stepName][k] = merge([{'-s': 'RAW2DIGI,L1Reco,RECO,RECOSIM', '--datatier':'AODSIM', '--eventcontent':'AODSIM'}, stepDict[step][k]])
1720         elif 'MiniAOD' in step:
1721             # the separate miniAOD step is used here
1722             stepDict[stepName][k] = deepcopy(stepDict[step][k])
1723         elif 'ALCA' in step or 'HARVEST' in step:
1724             # remove step
1725             stepDict[stepName][k] = None
1726         elif 'Nano'==step:
1727             stepDict[stepName][k] = merge([{'--filein':'file:step4.root','-s':'NANO','--datatier':'NANOAODSIM','--eventcontent':'NANOEDMAODSIM'}, stepDict[step][k]])
1728     def condition(self, fragment, stepList, key, hasHarvest):
1729         return fragment=="TTbar_14TeV" and ('2026' in key or '2021' in key or '2023' in key or '2024' in key)
1730 upgradeWFs['ProdLike'] = UpgradeWorkflow_ProdLike(
1731     steps = [
1732         'GenSimHLBeamSpot14',
1733         'Digi',
1734         'DigiTrigger',
1735         'Reco',
1736         'RecoFakeHLT',
1737         'RecoGlobal',
1738         'RecoNano',
1739         'RecoNanoFakeHLT',
1740         'HARVEST',
1741         'HARVESTFakeHLT',
1742         'HARVESTGlobal',
1743         'HARVESTNano',
1744         'HARVESTNanoFakeHLT',
1745         'MiniAOD',
1746         'ALCA',
1747         'ALCAPhase2',
1748         'Nano',
1749     ],
1750     PU = [
1751         'GenSimHLBeamSpot14',
1752         'Digi',
1753         'DigiTrigger',
1754         'Reco',
1755         'RecoFakeHLT',
1756         'RecoGlobal',
1757         'RecoNano',
1758         'RecoNanoFakeHLT',
1759         'HARVEST',
1760         'HARVESTFakeHLT',
1761         'HARVESTGlobal',
1762         'HARVESTNano',
1763         'HARVESTNanoFakeHLT',
1764         'MiniAOD',
1765         'ALCA',
1766         'ALCAPhase2',
1767         'Nano',
1768     ],
1769     suffix = '_ProdLike',
1770     offset = 0.21,
1771 )
1772 
1773 class UpgradeWorkflow_ProdLikeRunningPU(UpgradeWorkflow_ProdLike):
1774     def __init__(self, suffix, offset, fixedPU,
1775          steps = [],
1776         PU = [
1777             'GenSimHLBeamSpot14',
1778             'Digi',
1779             'DigiTrigger',
1780             'Reco',
1781             'RecoFakeHLT',
1782             'RecoGlobal',
1783             'RecoNano',
1784             'RecoNanoFakeHLT',
1785             'HARVEST',
1786             'HARVESTFakeHLT',
1787             'HARVESTGlobal',
1788             'HARVESTNano',
1789             'HARVESTNanoFakeHLT',
1790             'MiniAOD',
1791             'ALCA',
1792             'ALCAPhase2',
1793             'Nano',
1794         ]):
1795         super(UpgradeWorkflow_ProdLikeRunningPU, self).__init__(steps, PU, suffix, offset)
1796         self.__fixedPU = fixedPU
1797     def setupPU_(self, step, stepName, stepDict, k, properties):
1798         #  change PU skipping ALCA and HARVEST
1799         if stepDict[stepName][k] is not None and '--pileup' in stepDict[stepName][k]:
1800             stepDict[stepName][k]['--pileup'] = 'AVE_' + str(self.__fixedPU) + '_BX_25ns'
1801     def condition(self, fragment, stepList, key, hasHarvest):
1802         # lower PUs for Run3
1803         return (fragment=="TTbar_14TeV") and (('2026' in key) or ('2021' in key and self.__fixedPU<=100))
1804 
1805 # The numbering below is following the 0.21 for ProdLike wfs
1806 # 0.21N would have been a more natural choice but the
1807 # trailing zeros are ignored. Thus 0.21N1 is used
1808 
1809 upgradeWFs['ProdLikePU10'] = UpgradeWorkflow_ProdLikeRunningPU(
1810     suffix = '_ProdLikePU10',
1811     offset = 0.21101,
1812     fixedPU = 10,
1813 )
1814 
1815 upgradeWFs['ProdLikePU20'] = UpgradeWorkflow_ProdLikeRunningPU(
1816     suffix = '_ProdLikePU20',
1817     offset = 0.21201,
1818     fixedPU = 20,
1819 )
1820 
1821 upgradeWFs['ProdLikePU30'] = UpgradeWorkflow_ProdLikeRunningPU(
1822     suffix = '_ProdLikePU30',
1823     offset = 0.21301,
1824     fixedPU = 30,
1825 )
1826 
1827 upgradeWFs['ProdLikePU40'] = UpgradeWorkflow_ProdLikeRunningPU(
1828     suffix = '_ProdLikePU40',
1829     offset = 0.21401,
1830     fixedPU = 40,
1831 )
1832 
1833 upgradeWFs['ProdLikePU50'] = UpgradeWorkflow_ProdLikeRunningPU(
1834     suffix = '_ProdLikePU50',
1835     offset = 0.21501,
1836     fixedPU = 50,
1837 )
1838 
1839 upgradeWFs['ProdLikePU55'] = UpgradeWorkflow_ProdLikeRunningPU(
1840     suffix = '_ProdLikePU55',
1841     offset = 0.21551,
1842     fixedPU = 55,
1843 )
1844 
1845 upgradeWFs['ProdLikePU60'] = UpgradeWorkflow_ProdLikeRunningPU(
1846     suffix = '_ProdLikePU60',
1847     offset = 0.21601,
1848     fixedPU = 60,
1849 )
1850 
1851 upgradeWFs['ProdLikePU65'] = UpgradeWorkflow_ProdLikeRunningPU(
1852     suffix = '_ProdLikePU65',
1853     offset = 0.21651,
1854     fixedPU = 65,
1855 )
1856 
1857 upgradeWFs['ProdLikePU70'] = UpgradeWorkflow_ProdLikeRunningPU(
1858     suffix = '_ProdLikePU70',
1859     offset = 0.21701,
1860     fixedPU = 70,
1861 )
1862 
1863 upgradeWFs['ProdLikePU80'] = UpgradeWorkflow_ProdLikeRunningPU(
1864     suffix = '_ProdLikePU80',
1865     offset = 0.21801,
1866     fixedPU = 80,
1867 )
1868 
1869 upgradeWFs['ProdLikePU90'] = UpgradeWorkflow_ProdLikeRunningPU(
1870     suffix = '_ProdLikePU90',
1871     offset = 0.21901,
1872     fixedPU = 90,
1873 )
1874 
1875 upgradeWFs['ProdLikePU100'] = UpgradeWorkflow_ProdLikeRunningPU(
1876     suffix = '_ProdLikePU100',
1877     offset = 0.211001,
1878     fixedPU = 100,
1879 )
1880 
1881 upgradeWFs['ProdLikePU120'] = UpgradeWorkflow_ProdLikeRunningPU(
1882     suffix = '_ProdLikePU120',
1883     offset = 0.211201,
1884     fixedPU = 120,
1885 )
1886 
1887 upgradeWFs['ProdLikePU140'] = UpgradeWorkflow_ProdLikeRunningPU(
1888     suffix = '_ProdLikePU140',
1889     offset = 0.211401,
1890     fixedPU = 140,
1891 )
1892 
1893 upgradeWFs['ProdLikePU160'] = UpgradeWorkflow_ProdLikeRunningPU(
1894     suffix = '_ProdLikePU160',
1895     offset = 0.211601,
1896     fixedPU = 160,
1897 )
1898 
1899 upgradeWFs['ProdLikePU180'] = UpgradeWorkflow_ProdLikeRunningPU(
1900     suffix = '_ProdLikePU180',
1901     offset = 0.211801,
1902     fixedPU = 180,
1903 )
1904 
1905 class UpgradeWorkflow_HLT75e33(UpgradeWorkflow):
1906     def setup_(self, step, stepName, stepDict, k, properties):
1907         if 'HARVEST' in step:
1908             stepDict[stepName][k] = merge([{'--filein':'file:step3_inDQM.root'}, stepDict[step][k]])
1909         else:
1910             stepDict[stepName][k] = merge([stepDict[step][k]])
1911     def condition(self, fragment, stepList, key, hasHarvest):
1912         return fragment=="TTbar_14TeV" and '2026' in key
1913 upgradeWFs['HLT75e33'] = UpgradeWorkflow_HLT75e33(
1914     steps = [
1915         'GenSimHLBeamSpot14',
1916         'DigiTrigger',
1917         'RecoGlobal',
1918         'HLT75e33',
1919         'HARVESTGlobal',
1920     ],
1921     PU = [
1922         'GenSimHLBeamSpot14',
1923         'DigiTrigger',
1924         'RecoGlobal',
1925         'HLT75e33',
1926         'HARVESTGlobal',
1927     ],
1928     suffix = '_HLT75e33',
1929     offset = 0.75,
1930 )
1931 
1932 class UpgradeWorkflow_HLTwDIGI75e33(UpgradeWorkflow):
1933     def setup_(self, step, stepName, stepDict, k, properties):
1934         if 'DigiTrigger' in step:
1935             stepDict[stepName][k] = merge([{'-s':'DIGI:pdigi_valid,L1TrackTrigger,L1,DIGI2RAW,HLT:@relval2026'}, stepDict[step][k]])
1936     def condition(self, fragment, stepList, key, hasHarvest):
1937         return fragment=="TTbar_14TeV" and '2026' in key
1938 upgradeWFs['HLTwDIGI75e33'] = UpgradeWorkflow_HLTwDIGI75e33(
1939     steps = [
1940         'DigiTrigger',
1941     ],
1942     PU = [
1943         'DigiTrigger',
1944     ],
1945     suffix = '_HLTwDIGI75e33',
1946     offset = 0.76,
1947 )
1948 
1949 class UpgradeWorkflow_L1Complete(UpgradeWorkflow):
1950     def setup_(self, step, stepName, stepDict, k, properties):
1951         if 'Digi' in step and 'NoHLT' not in step:
1952             stepDict[stepName][k] = merge([{'-s': 'DIGI:pdigi_valid,L1,L1TrackTrigger,L1P2GT,DIGI2RAW,HLT:@relval2026'}, stepDict[step][k]])
1953     def condition(self, fragment, stepList, key, hasHarvest):
1954         return '2026' in key
1955 
1956 upgradeWFs['L1Complete'] = UpgradeWorkflow_L1Complete(
1957     steps = [
1958         'DigiTrigger',
1959     ],
1960     PU = [
1961         'DigiTrigger',
1962     ],
1963     suffix = '_L1Complete',
1964     offset = 0.78
1965 )
1966 
1967 class UpgradeWorkflow_Neutron(UpgradeWorkflow):
1968     def setup_(self, step, stepName, stepDict, k, properties):
1969         if 'GenSim' in step:
1970             custNew = "SimG4Core/Application/NeutronBGforMuonsXS_cff.customise"
1971         else:
1972             custNew = "SLHCUpgradeSimulations/Configuration/customise_mixing.customise_Mix_LongLived_Neutrons"
1973         stepDict[stepName][k] = deepcopy(stepDict[step][k])
1974         if '--customise' in stepDict[stepName][k].keys():
1975             stepDict[stepName][k]['--customise'] += ","+custNew
1976         else:
1977             stepDict[stepName][k]['--customise'] = custNew
1978     def condition(self, fragment, stepList, key, hasHarvest):
1979         return any(fragment==nfrag for nfrag in self.neutronFrags) and any(nkey in key for nkey in self.neutronKeys)
1980 upgradeWFs['Neutron'] = UpgradeWorkflow_Neutron(
1981     steps = [
1982         'GenSim',
1983         'GenSimHLBeamSpot',
1984         'GenSimHLBeamSpot14',
1985         'Digi',
1986         'DigiTrigger',
1987     ],
1988     PU = [
1989         'Digi',
1990         'DigiTrigger',
1991     ],
1992     suffix = '_Neutron',
1993     offset = 0.12,
1994 )
1995 # add some extra info
1996 upgradeWFs['Neutron'].neutronKeys = [x for x in upgradeKeys[2026] if 'PU' not in x]
1997 upgradeWFs['Neutron'].neutronFrags = ['ZMM_14','MinBias_14TeV']
1998 
1999 class UpgradeWorkflow_heCollapse(UpgradeWorkflow):
2000     def setup_(self, step, stepName, stepDict, k, properties):
2001         stepDict[stepName][k] = merge([{'--procModifiers': 'run2_HECollapse_2018'}, stepDict[step][k]])
2002     def condition(self, fragment, stepList, key, hasHarvest):
2003         return fragment=="TTbar_13" and '2018' in key
2004 upgradeWFs['heCollapse'] = UpgradeWorkflow_heCollapse(
2005     steps = [
2006         'GenSim',
2007         'Digi',
2008         'Reco',
2009 #        'RecoFakeHLT',
2010         'HARVEST',
2011         'HARVESTFakeHLT',
2012         'ALCA',
2013     ],
2014     PU = [
2015         'Digi',
2016         'Reco',
2017 #        'RecoFakeHLT',
2018         'HARVEST',
2019         'HARVESTFakeHLT',
2020     ],
2021     suffix = '_heCollapse',
2022     offset = 0.6,
2023 )
2024 
2025 # ECAL Phase 2 development WF
2026 class UpgradeWorkflow_ecalDevel(UpgradeWorkflow):
2027     def __init__(self, digi = {}, reco = {}, harvest = {}, **kwargs):
2028         # adapt the parameters for the UpgradeWorkflow init method
2029         super(UpgradeWorkflow_ecalDevel, self).__init__(
2030             steps = [
2031                 'DigiTrigger',
2032                 'RecoGlobal',
2033                 'HARVESTGlobal',
2034                 'ALCAPhase2',
2035             ],
2036             PU = [
2037                 'DigiTrigger',
2038                 'RecoGlobal',
2039                 'HARVESTGlobal',
2040                 'ALCAPhase2',
2041             ],
2042             **kwargs)
2043         self.__digi = digi
2044         self.__reco = reco
2045         self.__harvest = harvest
2046 
2047     def setup_(self, step, stepName, stepDict, k, properties):
2048         # temporarily remove trigger & downstream steps
2049         mods = {'--era': stepDict[step][k]['--era']+',phase2_ecal_devel'}
2050         if 'Digi' in step:
2051             mods['-s'] = 'DIGI:pdigi_valid,DIGI2RAW'
2052             mods |= self.__digi
2053         elif 'Reco' in step:
2054             mods['-s'] = 'RAW2DIGI,RECO:reconstruction_ecalOnly,VALIDATION:@ecalOnlyValidation,DQM:@ecalOnly'
2055             mods['--datatier'] = 'GEN-SIM-RECO,DQMIO'
2056             mods['--eventcontent'] = 'FEVTDEBUGHLT,DQM'
2057             mods |= self.__reco
2058         elif 'HARVEST' in step:
2059             mods['-s'] = 'HARVESTING:@ecalOnlyValidation+@ecal'
2060             mods |= self.__harvest
2061         stepDict[stepName][k] = merge([mods, stepDict[step][k]])
2062         # skip ALCA step
2063         if 'ALCA' in step:
2064             stepDict[stepName][k] = None
2065 
2066     def condition(self, fragment, stepList, key, hasHarvest):
2067         return fragment=="TTbar_14TeV" and '2026' in key
2068 
2069 # ECAL Phase 2 workflow running on CPU
2070 upgradeWFs['ecalDevel'] = UpgradeWorkflow_ecalDevel(
2071     suffix = '_ecalDevel',
2072     offset = 0.61,
2073 )
2074 
2075 # ECAL Phase 2 workflow running on CPU or GPU (if available)
2076 upgradeWFs['ecalDevelGPU'] = UpgradeWorkflow_ecalDevel(
2077     reco = {'--procModifiers': 'gpu'},
2078     suffix = '_ecalDevelGPU',
2079     offset = 0.612,
2080 )
2081 
2082 # ECAL component
2083 class UpgradeWorkflow_ECalComponent(UpgradeWorkflow):
2084     def __init__(self, suffix, offset, ecalTPPh2, ecalMod,
2085                  steps = [
2086                      'GenSim',
2087                      'GenSimHLBeamSpot',
2088                      'GenSimHLBeamSpot14',
2089                      'GenSimHLBeamSpotHGCALCloseBy',
2090                      'Digi',
2091                      'DigiTrigger',
2092                      'RecoGlobal',
2093                      'HARVESTGlobal',
2094                      'ALCAPhase2',
2095                  ],
2096                  PU = [
2097                      'GenSim',
2098                      'GenSimHLBeamSpot',
2099                      'GenSimHLBeamSpot14',
2100                      'GenSimHLBeamSpotHGCALCloseBy',
2101                      'Digi',
2102                      'DigiTrigger',
2103                      'RecoGlobal',
2104                      'HARVESTGlobal',
2105                      'ALCAPhase2',
2106                  ]):
2107         super(UpgradeWorkflow_ECalComponent, self).__init__(steps, PU, suffix, offset)
2108         self.__ecalTPPh2 = ecalTPPh2
2109         self.__ecalMod = ecalMod
2110 
2111     def setup_(self, step, stepName, stepDict, k, properties):
2112         stepDict[stepName][k] = deepcopy(stepDict[step][k])
2113         if 'Sim' in step:
2114             if self.__ecalMod is not None:
2115                 stepDict[stepName][k] = merge([{'--procModifiers':self.__ecalMod},stepDict[step][k]])
2116         if 'Digi' in step and 'NoHLT' not in step:
2117             if self.__ecalMod is not None:
2118                 stepDict[stepName][k] = merge([{'--procModifiers':self.__ecalMod},stepDict[step][k]])
2119             if self.__ecalTPPh2 is not None:
2120                 mods = {'--era': stepDict[step][k]['--era']+',phase2_ecal_devel,phase2_ecalTP_devel'}
2121                 mods['-s'] = 'DIGI:pdigi_valid,DIGI2RAW,HLT:@fake2'
2122                 stepDict[stepName][k] = merge([mods, stepDict[step][k]])
2123         if 'RecoGlobal' in step:
2124             stepDict[stepName][k] = merge([{'-s': 'RAW2DIGI,RECO,RECOSIM,PAT',
2125                                             '--datatier':'GEN-SIM-RECO',
2126                                             '--eventcontent':'FEVTDEBUGHLT',
2127                                         }, stepDict[step][k]])
2128         if 'HARVESTGlobal' in step:
2129             stepDict[stepName][k] = None
2130         if 'ALCAPhase2' in step:
2131             stepDict[stepName][k] = None
2132 
2133     def condition(self, fragment, stepList, key, hasHarvest):
2134         return ('2021' in key or '2023' in key or '2026' in key)
2135 
2136 upgradeWFs['ECALComponent'] = UpgradeWorkflow_ECalComponent(
2137     suffix = '_ecalComponent',
2138     offset = 0.631,
2139     ecalTPPh2 = None,
2140     ecalMod = 'ecal_component',
2141 )
2142 
2143 upgradeWFs['ECALComponentFSW'] = UpgradeWorkflow_ECalComponent(
2144     suffix = '_ecalComponentFSW',
2145     offset = 0.632,
2146     ecalTPPh2 = None,
2147     ecalMod = 'ecal_component_finely_sampled_waveforms',
2148 )
2149 
2150 upgradeWFs['ECALTPPh2'] = UpgradeWorkflow_ECalComponent(
2151     suffix = '_ecalTPPh2',
2152     offset = 0.633,
2153     ecalTPPh2 = 'phase2_ecal_devel,phase2_ecalTP_devel',
2154     ecalMod = None,
2155 )
2156 
2157 upgradeWFs['ECALTPPh2Component'] = UpgradeWorkflow_ECalComponent(
2158     suffix = '_ecalTPPh2Component',
2159     offset = 0.634,
2160     ecalTPPh2 = 'phase2_ecal_devel,phase2_ecalTP_devel',
2161     ecalMod = 'ecal_component',
2162 )
2163 
2164 upgradeWFs['ECALTPPh2ComponentFSW'] = UpgradeWorkflow_ECalComponent(
2165     suffix = '_ecalTPPh2ComponentFSW',
2166     offset = 0.635,
2167     ecalTPPh2 = 'phase2_ecal_devel,phase2_ecalTP_devel',
2168     ecalMod = 'ecal_component_finely_sampled_waveforms',
2169 )
2170 
2171 class UpgradeWorkflow_0T(UpgradeWorkflow):
2172     def setup_(self, step, stepName, stepDict, k, properties):
2173         myGT=stepDict[step][k]['--conditions']
2174         myGT+="_0T"
2175         stepDict[stepName][k] = merge([{'-n':'1','--magField':'0T','--conditions':myGT}, stepDict[step][k]])
2176     def setupPU_(self, step, stepName, stepDict, k, properties):
2177         # override '-n' setting from PUDataSets in relval_steps.py
2178         stepDict[stepName][k] = merge([{'-n':'1'}, stepDict[step][k]])
2179     def condition(self, fragment, stepList, key, hasHarvest):
2180         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)
2181 upgradeWFs['0T'] = UpgradeWorkflow_0T(
2182     steps = [
2183         'GenSim',
2184         'Digi',
2185         'Reco',
2186         'RecoFakeHLT',
2187         'HARVEST',
2188         'HARVESTFakeHLT',
2189         'RecoNano',
2190         'RecoNanoFakeHLT',
2191         'HARVESTNano',
2192         'HARVESTNanoFakeHLT',
2193         'ALCA',
2194     ],
2195     PU = [
2196         'Digi',
2197         'Reco',
2198         'RecoFakeHLT',
2199         'HARVEST',
2200         'HARVESTFakeHLT',
2201         'RecoNano',
2202         'RecoNanoFakeHLT',
2203         'HARVESTNano',
2204         'HARVESTNanoFakeHLT',
2205     ],
2206     suffix = '_0T',
2207     offset = 0.24,
2208 )
2209 
2210 class UpgradeWorkflow_ParkingBPH(UpgradeWorkflow):
2211     def setup_(self, step, stepName, stepDict, k, properties):
2212         if 'Reco' in step and 'Run2_2018' in stepDict[step][k]['--era']:
2213             stepDict[stepName][k] = merge([{'--era': 'Run2_2018,bParking'}, stepDict[step][k]])
2214     def condition(self, fragment, stepList, key, hasHarvest):
2215         return fragment=="TTbar_13" and '2018' in key
2216 upgradeWFs['ParkingBPH'] = UpgradeWorkflow_ParkingBPH(
2217     steps = [
2218         'Reco',
2219         'RecoFakeHLT',
2220     ],
2221     PU = [],
2222     suffix = '_ParkingBPH',
2223     offset = 0.8,
2224 )
2225 
2226 ## Wf to add Heavy Flavor DQM to whichever DQM is already there
2227 class UpgradeWorkflow_HeavyFlavor(UpgradeWorkflow):
2228     def setup_(self, step, stepName, stepDict, k, properties):
2229         self.__frags = ["B0","Psi2S","Bu","Bd","Xi","Bs"]
2230         thisStep = stepDict[step][k]["-s"]
2231         if "Reco" in step:
2232             if "DQM:" in thisStep:
2233                 stepDict[stepName][k] = merge([{'-s': thisStep.replace("DQM:","DQM:@heavyFlavor+")}, stepDict[step][k]])
2234             elif "DQM" in thisStep:
2235                 stepDict[stepName][k] = merge([{'-s': thisStep.replace("DQM","DQM:@heavyFlavor")}, stepDict[step][k]])
2236             else:
2237                 stepDict[stepName][k] = merge([{'-s': thisStep + ",DQM:@heavyFlavor"}, stepDict[step][k]])
2238 
2239     def condition(self, fragment, stepList, key, hasHarvest):
2240         return any(frag in fragment for frag in self.__frags)
2241 
2242 upgradeWFs['HeavyFlavor'] = UpgradeWorkflow_HeavyFlavor(
2243     steps = [
2244         'Reco',
2245         'RecoFakeHLT',
2246         'RecoNano',
2247         'RecoNanoFakeHLT',
2248     ],
2249     PU = [],
2250     suffix = '_HeavyFlavor',
2251     offset = 0.81,
2252 )
2253 
2254 
2255 class UpgradeWorkflow_JMENano(UpgradeWorkflow):
2256     def setup_(self, step, stepName, stepDict, k, properties):
2257         if 'Nano' in step:
2258             stepDict[stepName][k] = merge([{'--customise': 'PhysicsTools/NanoAOD/custom_jme_cff.PrepJMECustomNanoAOD'}, stepDict[step][k]])
2259     def condition(self, fragment, stepList, key, hasHarvest):
2260         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)
2261 upgradeWFs['JMENano'] = UpgradeWorkflow_JMENano(
2262     steps = [
2263         'Nano',
2264         'RecoNano',
2265         'RecoNanoFakeHLT',
2266     ],
2267     PU = [],
2268     suffix = '_JMENano',
2269     offset = 0.15,
2270 )
2271 
2272 
2273 # common operations for aging workflows
2274 class UpgradeWorkflowAging(UpgradeWorkflow):
2275     def setup_(self, step, stepName, stepDict, k, properties):
2276         if 'Digi' in step or 'Reco' in step:
2277             stepDict[stepName][k] = merge([{'--customise': 'SLHCUpgradeSimulations/Configuration/aging.customise_aging_'+self.lumi}, stepDict[step][k]])
2278     def condition(self, fragment, stepList, key, hasHarvest):
2279         return '2026' in key
2280 # define several of them
2281 upgradeWFs['Aging1000'] = UpgradeWorkflowAging(
2282     steps =  [
2283         'Digi',
2284         'DigiTrigger',
2285         'RecoLocal',
2286         'Reco',
2287         'RecoFakeHLT',
2288         'RecoGlobal',
2289     ],
2290     PU =  [
2291         'Digi',
2292         'DigiTrigger',
2293         'RecoLocal',
2294         'Reco',
2295         'RecoFakeHLT',
2296         'RecoGlobal',
2297     ],
2298     suffix = 'Aging1000',
2299     offset = 0.101,
2300 )
2301 upgradeWFs['Aging1000'].lumi = '1000'
2302 upgradeWFs['Aging3000'] = deepcopy(upgradeWFs['Aging1000'])
2303 upgradeWFs['Aging3000'].suffix = 'Aging3000'
2304 upgradeWFs['Aging3000'].offset = 0.103
2305 upgradeWFs['Aging3000'].lumi = '3000'
2306 
2307 #
2308 # Simulates Bias Rail in Phase-2 OT PS modules and X% random bad Strips
2309 # in PS-s and SS sensors
2310 #
2311 class UpgradeWorkflow_OTInefficiency(UpgradeWorkflow):
2312     def setup_(self, step, stepName, stepDict, k, properties):
2313         if 'Digi' in step:
2314             stepDict[stepName][k] = merge([{'--customise': 'SimTracker/SiPhase2Digitizer/customizeForOTInefficiency.customizeSiPhase2OTInefficiency'+self.percent+'Percent'}, stepDict[step][k]])
2315     def condition(self, fragment, stepList, key, hasHarvest):
2316         return fragment=="TTbar_14TeV" and '2026' in key
2317 # define several of them
2318 upgradeWFs['OTInefficiency'] = UpgradeWorkflow_OTInefficiency(
2319     steps =  [
2320         'Digi',
2321         'DigiTrigger',
2322     ],
2323     PU =  [
2324         'Digi',
2325         'DigiTrigger',
2326     ],
2327     suffix = '_OTInefficiency',
2328     offset = 0.111,
2329 )
2330 upgradeWFs['OTInefficiency'].percent = 'Zero'
2331 
2332 # 1% bad strips
2333 upgradeWFs['OTInefficiency1PC'] = deepcopy(upgradeWFs['OTInefficiency'])
2334 upgradeWFs['OTInefficiency1PC'].suffix = '_OTInefficiency1PC'
2335 upgradeWFs['OTInefficiency1PC'].offset = 0.112
2336 upgradeWFs['OTInefficiency1PC'].percent = 'One'
2337 
2338 # 5% bad strips
2339 upgradeWFs['OTInefficiency5PC'] = deepcopy(upgradeWFs['OTInefficiency'])
2340 upgradeWFs['OTInefficiency5PC'].suffix = '_OTInefficiency5PC'
2341 upgradeWFs['OTInefficiency5PC'].offset = 0.113
2342 upgradeWFs['OTInefficiency5PC'].percent = 'Five'
2343 
2344 # 10% bad strips
2345 upgradeWFs['OTInefficiency10PC'] = deepcopy(upgradeWFs['OTInefficiency'])
2346 upgradeWFs['OTInefficiency10PC'].suffix = '_OTInefficiency10PC'
2347 upgradeWFs['OTInefficiency10PC'].offset = 0.114
2348 upgradeWFs['OTInefficiency10PC'].percent = 'Ten'
2349 
2350 #
2351 # Simulates CROC signal shape in IT modules
2352 #
2353 class UpgradeWorkflow_ITSignalShape(UpgradeWorkflow):
2354     def setup_(self, step, stepName, stepDict, k, properties):
2355         if 'Digi' in step:
2356             stepDict[stepName][k] = merge([{'--customise': 'SimTracker/SiPhase2Digitizer/customizeForPhase2TrackerSignalShape.customizeSiPhase2ITSignalShape'}, stepDict[step][k]])
2357     def condition(self, fragment, stepList, key, hasHarvest):
2358         return '2026' in key
2359 # define several of them
2360 upgradeWFs['ITSignalShape'] = UpgradeWorkflow_ITSignalShape(
2361     steps =  [
2362         'Digi',
2363         'DigiTrigger',
2364     ],
2365     PU =  [
2366         'Digi',
2367         'DigiTrigger',
2368     ],
2369     suffix = '_ITSignalShape',
2370     offset = 0.141
2371 )
2372 
2373 # Specifying explicitly the --filein is not nice but that was the
2374 # easiest way to "skip" the output of step2 (=premixing stage1) for
2375 # filein (as it goes to pileup_input). It works (a bit accidentally
2376 # though) also for "-i all" because in that case the --filein for DAS
2377 # input is after this one in the list of command line arguments to
2378 # cmsDriver, and gets then used in practice.
2379 digiPremixLocalPileup = {
2380     "--filein": "file:step1.root",
2381     "--pileup_input": "file:step2.root"
2382 }
2383 
2384 # for premix
2385 class UpgradeWorkflowPremix(UpgradeWorkflow):
2386     def setup_(self, step, stepName, stepDict, k, properties):
2387         # just copy steps
2388         stepDict[stepName][k] = merge([stepDict[step][k]])
2389     def setupPU_(self, step, stepName, stepDict, k, properties):
2390         # setup for stage 1
2391         if "GenSim" in stepName:
2392             stepNamePmx = stepName.replace('GenSim','Premix')
2393             if not stepNamePmx in stepDict: stepDict[stepNamePmx] = {}
2394             stepDict[stepNamePmx][k] = merge([
2395                 {
2396                     '-s': 'GEN,SIM,DIGI:pdigi_valid',
2397                     '--datatier': 'PREMIX',
2398                     '--eventcontent': 'PREMIX',
2399                     '--procModifiers': 'premix_stage1'
2400                 },
2401                 stepDict[stepName][k]
2402             ])
2403             if "ProdLike" in self.suffix:
2404                 stepDict[stepNamePmx][k] = merge([{'-s': 'GEN,SIM,DIGI'},stepDict[stepNamePmx][k]])
2405         # setup for stage 2
2406         elif "Digi" in step or "Reco" in step:
2407             # go back to non-PU step version
2408             d = merge([stepDict[self.getStepName(step)][k]])
2409             if d is None: return
2410             if "Digi" in step:
2411                 tmpsteps = []
2412                 for s in d["-s"].split(","):
2413                     if s == "DIGI" or "DIGI:" in s:
2414                         tmpsteps.extend([s, "DATAMIX"])
2415                     else:
2416                         tmpsteps.append(s)
2417                 d = merge([{"-s"             : ",".join(tmpsteps),
2418                             "--datamix"      : "PreMix",
2419                             "--procModifiers": "premix_stage2"},
2420                            d])
2421                 # for combined stage1+stage2
2422                 if "_PMXS1S2" in self.suffix:
2423                     d = merge([digiPremixLocalPileup, d])
2424             elif "Reco" in step:
2425                 if "--procModifiers" in d:
2426                     d["--procModifiers"] += ",premix_stage2"
2427                 else:
2428                     d["--procModifiers"] = "premix_stage2"
2429             stepDict[stepName][k] = d
2430         # Increase the input file step number by one for Nano in combined stage1+stage2
2431         elif "Nano"==step:
2432             # go back to non-PU step version
2433             d = merge([stepDict[self.getStepName(step)][k]])
2434             if "--filein" in d:
2435                 filein = d["--filein"]
2436                 m = re.search("step(?P<ind>\d+)_", filein)
2437                 if m:
2438                     d["--filein"] = filein.replace(m.group(), "step%d_"%(int(m.group("ind"))+1))
2439             stepDict[stepName][k] = d
2440             # run2/3 WFs use Nano (not NanoPU) in PU WF
2441             stepDict[self.getStepName(step)][k] = merge([d])
2442     def condition(self, fragment, stepList, key, hasHarvest):
2443         if not 'PU' in key:
2444             return False
2445         if not any(y in key for y in ['2021', '2023', '2024', '2026']):
2446             return False
2447         if self.suffix.endswith("S1"):
2448             return "NuGun" in fragment
2449         return True
2450     def workflow_(self, workflows, num, fragment, stepList, key):
2451         fragmentTmp = fragment
2452         if self.suffix.endswith("S1"):
2453             fragmentTmp = 'PREMIXUP' + key[2:].replace("PU", "").replace("Design", "") + '_PU25'
2454         super(UpgradeWorkflowPremix,self).workflow_(workflows, num, fragmentTmp, stepList, key)
2455 # Premix stage1
2456 upgradeWFs['PMXS1'] = UpgradeWorkflowPremix(
2457     steps = [
2458     ],
2459     PU = [
2460         'GenSim',
2461         'GenSimHLBeamSpot',
2462         'GenSimHLBeamSpot14',
2463     ],
2464     suffix = '_PMXS1',
2465     offset = 0.97,
2466 )
2467 # Premix stage2
2468 upgradeWFs['PMXS2'] = UpgradeWorkflowPremix(
2469     steps = [],
2470     PU = [
2471         'Digi',
2472         'DigiTrigger',
2473         'RecoLocal',
2474         'Reco',
2475         'RecoFakeHLT',
2476         'RecoGlobal',
2477         'RecoNano',
2478         'RecoNanoFakeHLT',
2479         'Nano',
2480     ],
2481     suffix = '_PMXS2',
2482     offset = 0.98,
2483 )
2484 # Premix combined stage1+stage2
2485 upgradeWFs['PMXS1S2'] = UpgradeWorkflowPremix(
2486     steps = [],
2487     PU = [
2488         'GenSim',
2489         'GenSimHLBeamSpot',
2490         'GenSimHLBeamSpot14',
2491         'Digi',
2492         'DigiTrigger',
2493         'RecoLocal',
2494         'Reco',
2495         'RecoFakeHLT',
2496         'RecoGlobal',
2497         'RecoNano',
2498         'RecoNanoFakeHLT',
2499         'Nano',
2500     ],
2501     suffix = '_PMXS1S2',
2502     offset = 0.99,
2503 )
2504 # Alternative version of above w/ less PU for PR tests
2505 class UpgradeWorkflowAdjustPU(UpgradeWorkflowPremix):
2506     def setupPU_(self, step, stepName, stepDict, k, properties):
2507         # adjust first, so it gets copied into new Premix step
2508         if '--pileup' in stepDict[stepName][k]:
2509             stepDict[stepName][k]['--pileup'] = 'AVE_50_BX_25ns_m3p3'
2510         super(UpgradeWorkflowAdjustPU,self).setupPU_(step, stepName, stepDict, k, properties)
2511     def condition(self, fragment, stepList, key, hasHarvest):
2512         # restrict to phase2
2513         return super(UpgradeWorkflowAdjustPU,self).condition(fragment, stepList, key, hasHarvest) and '2026' in key
2514 upgradeWFs['PMXS1S2PR'] = UpgradeWorkflowAdjustPU(
2515     steps = [],
2516     PU = [
2517         'GenSim',
2518         'GenSimHLBeamSpot',
2519         'GenSimHLBeamSpot14',
2520         'Digi',
2521         'DigiTrigger',
2522         'RecoLocal',
2523         'Reco',
2524         'RecoFakeHLT',
2525         'RecoGlobal',
2526         'Nano',
2527         'HARVEST',
2528         'HARVESTFakeHLT',
2529         'HARVESTGlobal',
2530     ],
2531     suffix = '_PMXS1S2PR',
2532     offset = 0.999,
2533 )
2534 
2535 class UpgradeWorkflowPremixProdLike(UpgradeWorkflowPremix,UpgradeWorkflow_ProdLike):
2536     def setup_(self, step, stepName, stepDict, k, properties):
2537         # copy steps, then apply specializations
2538         UpgradeWorkflowPremix.setup_(self, step, stepName, stepDict, k, properties)
2539         UpgradeWorkflow_ProdLike.setup_(self, step, stepName, stepDict, k, properties)
2540         #
2541         if 'Digi' in step:
2542             d = merge([stepDict[self.getStepName(step)][k]])
2543             tmpsteps = []
2544             for s in d["-s"].split(","):
2545                 if "DIGI:pdigi_valid" in s:
2546                     tmpsteps.append("DIGI")
2547                 else:
2548                     tmpsteps.append(s)
2549             d = merge([{"-s" : ",".join(tmpsteps),
2550                         "--eventcontent": "PREMIXRAW"},
2551                        d])
2552             stepDict[stepName][k] = d
2553         if 'Nano'==step:
2554             stepDict[stepName][k] = merge([{'--filein':'file:step5.root','-s':'NANO','--datatier':'NANOAODSIM','--eventcontent':'NANOEDMAODSIM'}, stepDict[step][k]])
2555     def condition(self, fragment, stepList, key, hasHarvest):
2556         # use both conditions
2557         return UpgradeWorkflowPremix.condition(self, fragment, stepList, key, hasHarvest) and UpgradeWorkflow_ProdLike.condition(self, fragment, stepList, key, hasHarvest)
2558 # premix stage2
2559 upgradeWFs['PMXS2ProdLike'] = UpgradeWorkflowPremixProdLike(
2560     steps = [],
2561     PU = [
2562         'Digi',
2563         'DigiTrigger',
2564         'RecoLocal',
2565         'Reco',
2566         'RecoFakeHLT',
2567         'RecoGlobal',
2568         'RecoNano',
2569         'RecoNanoFakeHLT',
2570         'Nano',
2571         'HARVEST',
2572         'HARVESTFakeHLT',
2573         'HARVESTGlobal',
2574         'HARVESTNano',
2575         'HARVESTNanoFakeHLT',
2576         'MiniAOD',
2577         'ALCA',
2578     ],
2579     suffix = '_PMXS2ProdLike',
2580     offset = 0.9821,
2581 )
2582 # premix combined stage1+stage2
2583 upgradeWFs['PMXS1S2ProdLike'] = UpgradeWorkflowPremixProdLike(
2584     steps = [],
2585     PU = [
2586         'GenSim',
2587         'GenSimHLBeamSpot',
2588         'GenSimHLBeamSpot14',
2589         'Digi',
2590         'DigiTrigger',
2591         'RecoLocal',
2592         'Reco',
2593         'RecoFakeHLT',
2594         'RecoGlobal',
2595         'RecoNano',
2596         'RecoNanoFakeHLT',
2597         'Nano',
2598         'HARVEST',
2599         'HARVESTFakeHLT',
2600         'HARVESTGlobal',
2601         'HARVESTNano',
2602         'HARVESTNanoFakeHLT',
2603         'MiniAOD',
2604         'ALCA',
2605     ],
2606     suffix = '_PMXS1S2ProdLike',
2607     offset = 0.9921,
2608 )
2609 
2610 class UpgradeWorkflow_Run3FStrackingOnly(UpgradeWorkflow):
2611     def setup_(self, step, stepName, stepDict, k, properties):
2612         if 'HARVESTFastRun3' in step:
2613             stepDict[stepName][k] = merge([{'-s':'HARVESTING:@trackingOnlyValidation+@trackingOnlyDQM',
2614                                             '--fast':'',
2615                                             '--era':'Run3_FastSim',
2616                                             '--filein':'file:step1_inDQM.root'}, stepDict[step][k]])
2617         else:
2618             stepDict[stepName][k] = merge([stepDict[step][k]])
2619     def condition(self, fragment, stepList, key, hasHarvest):
2620         return ('2021FS' in key or '2023FS' in key)
2621 upgradeWFs['Run3FStrackingOnly'] = UpgradeWorkflow_Run3FStrackingOnly(
2622     steps = [
2623         'Gen',
2624         'FastSimRun3',
2625         'HARVESTFastRun3'
2626     ],
2627     PU = [
2628         'FastSimRun3',
2629         'HARVESTFastRun3'
2630     ],
2631     suffix = '_Run3FSTrackingOnly',
2632     offset = 0.302,
2633 )
2634 
2635 class UpgradeWorkflow_Run3FSMBMixing(UpgradeWorkflow):
2636     def setup_(self, step, stepName, stepDict, k, properties):
2637         if 'Gen' in step and 'GenOnly' not in step:
2638             stepDict[stepName][k] = merge([{'-s':'GEN,SIM,RECOBEFMIX',
2639                                             '--fast':'',
2640                                             '--era':'Run3_FastSim',
2641                                             '--eventcontent':'FASTPU',
2642                                             '--datatier':'GEN-SIM-RECO',
2643                                             '--relval':'27000,3000'}, stepDict[step][k]])
2644         else:
2645             stepDict[stepName][k] = None
2646     def condition(self, fragment, stepList, key, hasHarvest):
2647         return ('2021FS' in key or '2023FS' in key) and fragment=="MinBias_14TeV"
2648 upgradeWFs['Run3FSMBMixing'] = UpgradeWorkflow_Run3FSMBMixing(
2649     steps = [
2650         'Gen',
2651         'FastSimRun3',
2652         'HARVESTFastRun3'
2653     ],
2654     PU = [],
2655     suffix = '_Run3FSMBMixing',
2656     offset = 0.303,
2657 )
2658 
2659 
2660 class UpgradeWorkflow_DD4hep(UpgradeWorkflow):
2661     def setup_(self, step, stepName, stepDict, k, properties):
2662         if 'Run3' in stepDict[step][k]['--era'] and 'Fast' not in stepDict[step][k]['--era']:
2663             if '2023' in stepDict[step][k]['--conditions']:
2664                 stepDict[stepName][k] = merge([{'--geometry': 'DD4hepExtended2023'}, stepDict[step][k]])
2665             else:
2666                 stepDict[stepName][k] = merge([{'--geometry': 'DD4hepExtended2021'}, stepDict[step][k]])
2667         elif 'Phase2' in stepDict[step][k]['--era']:
2668             dd4hepGeom="DD4hep"
2669             dd4hepGeom+=stepDict[step][k]['--geometry']
2670             stepDict[stepName][k] = merge([{'--geometry' : dd4hepGeom, '--procModifiers': 'dd4hep'}, stepDict[step][k]])
2671     def condition(self, fragment, stepList, key, hasHarvest):
2672         return ('2021' in key or '2023' in key or '2026' in key) and ('FS' not in key)
2673 upgradeWFs['DD4hep'] = UpgradeWorkflow_DD4hep(
2674     steps = [
2675         'GenSim',
2676         'GenSimHLBeamSpot',
2677         'GenSimHLBeamSpot14',
2678         'Digi',
2679         'DigiTrigger',
2680         'Reco',
2681         'RecoFakeHLT',
2682         'RecoGlobal',
2683         'RecoNano',
2684         'RecoNanoFakeHLT',
2685         'HARVEST',
2686         'HARVESTFakeHLT',
2687         'HARVESTGlobal',
2688         'HARVESTNano',
2689         'HARVESTNanoFakeHLT',
2690         'ALCA',
2691     ],
2692     PU = [],
2693     suffix = '_DD4hep',
2694     offset = 0.911,
2695 )
2696 upgradeWFs['DD4hep'].allowReuse = False
2697 
2698 #This workflow is now obsolete, it becomes default for Run-3.
2699 #Keep it for future use in Phase-2, then delete
2700 class UpgradeWorkflow_DD4hepDB(UpgradeWorkflow):
2701     def setup_(self, step, stepName, stepDict, k, properties):
2702         if 'Run3' in stepDict[step][k]['--era'] and 'Fast' not in stepDict[step][k]['--era']:
2703             stepDict[stepName][k] = merge([{'--conditions': 'auto:phase1_2022_realistic', '--geometry': 'DB:Extended'}, stepDict[step][k]])
2704     def condition(self, fragment, stepList, key, hasHarvest):
2705         return '2021' in key and 'FS' not in key
2706 upgradeWFs['DD4hepDB'] = UpgradeWorkflow_DD4hepDB(
2707     steps = [
2708         'GenSim',
2709         'GenSimHLBeamSpot',
2710         'GenSimHLBeamSpot14',
2711         'Digi',
2712         'DigiTrigger',
2713         'Reco',
2714         'RecoFakeHLT',
2715         'RecoGlobal',
2716         'RecoNano',
2717         'RecoNanoFakeHLT',
2718         'HARVEST',
2719         'HARVESTFakeHLT',
2720         'HARVESTGlobal',
2721         'HARVESTNano',
2722         'HARVESTNanoFakeHLT',
2723         'ALCA',
2724     ],
2725     PU = [],
2726     suffix = '_DD4hepDB',
2727     offset = 0.912,
2728 )
2729 upgradeWFs['DD4hepDB'].allowReuse = False
2730 
2731 class UpgradeWorkflow_DDDDB(UpgradeWorkflow):
2732     def setup_(self, step, stepName, stepDict, k, properties):
2733         the_era = stepDict[step][k]['--era']
2734         if 'Run3' in the_era and '2023' not in the_era and '2024' not in the_era and 'Fast' not in the_era and "Pb" not in the_era:
2735             # retain any other eras
2736             tmp_eras = the_era.split(',')
2737             tmp_eras[tmp_eras.index("Run3")] = 'Run3_DDD'
2738             tmp_eras = ','.join(tmp_eras)
2739             stepDict[stepName][k] = merge([{'--conditions': 'auto:phase1_2022_realistic_ddd', '--geometry': 'DB:Extended', '--era': tmp_eras}, stepDict[step][k]])
2740     def condition(self, fragment, stepList, key, hasHarvest):
2741         return '2021' in key and 'FS' not in key
2742 upgradeWFs['DDDDB'] = UpgradeWorkflow_DDDDB(
2743     steps = [
2744         'GenSim',
2745         'GenSimHLBeamSpot',
2746         'GenSimHLBeamSpot14',
2747         'Digi',
2748         'DigiTrigger',
2749         'Reco',
2750         'RecoFakeHLT',
2751         'RecoGlobal',
2752         'RecoNano',
2753         'RecoNanoFakeHLT',
2754         'HARVEST',
2755         'HARVESTFakeHLT',
2756         'HARVESTGlobal',
2757         'HARVESTNano',
2758         'HARVESTNanoFakeHLT',
2759         'ALCA',
2760     ],
2761     PU = [],
2762     suffix = '_DDDDB',
2763     offset = 0.914,
2764 )
2765 upgradeWFs['DDDDB'].allowReuse = False
2766 
2767 class UpgradeWorkflow_SonicTriton(UpgradeWorkflow):
2768     def setup_(self, step, stepName, stepDict, k, properties):
2769         stepDict[stepName][k] = merge([{'--procModifiers': 'allSonicTriton'}, stepDict[step][k]])
2770     def condition(self, fragment, stepList, key, hasHarvest):
2771         return ((fragment=='TTbar_13' or fragment=='TTbar_14TeV') and '2021' in key) \
2772             or (fragment=='TTbar_14TeV' and '2026' in key)
2773 upgradeWFs['SonicTriton'] = UpgradeWorkflow_SonicTriton(
2774     steps = [
2775         'GenSim',
2776         'GenSimHLBeamSpot',
2777         'GenSimHLBeamSpot14',
2778         'Digi',
2779         'DigiTrigger',
2780         'Reco',
2781         'RecoFakeHLT',
2782         'RecoGlobal',
2783         'RecoNano',
2784         'RecoNanoFakeHLT',
2785         'HARVEST',
2786         'HARVESTFakeHLT',
2787         'HARVESTGlobal',
2788         'HARVESTNano',
2789         'HARVESTNanoFakeHLT',
2790         'ALCA',
2791     ],
2792     PU = [
2793         'GenSim',
2794         'GenSimHLBeamSpot',
2795         'GenSimHLBeamSpot14',
2796         'Digi',
2797         'DigiTrigger',
2798         'Reco',
2799         'RecoFakeHLT',
2800         'RecoGlobal',
2801         'RecoNano',
2802         'RecoNanoFakeHLT',
2803         'HARVEST',
2804         'HARVESTFakeHLT',
2805         'HARVESTGlobal',
2806         'HARVESTNano',
2807         'HARVESTNanoFakeHLT',
2808         'ALCA',
2809     ],
2810     suffix = '_SonicTriton',
2811     offset = 0.9001,
2812 )
2813 
2814 # check for duplicate offsets
2815 offsets = [specialWF.offset for specialType,specialWF in upgradeWFs.items()]
2816 seen = set()
2817 dups = set(x for x in offsets if x in seen or seen.add(x))
2818 if len(dups)>0:
2819     raise ValueError("Duplicate special workflow offsets not allowed: "+','.join([str(x) for x in dups]))
2820 
2821 upgradeProperties = {}
2822 
2823 upgradeProperties[2017] = {
2824     '2017' : {
2825         'Geom' : 'DB:Extended',
2826         'GT' : 'auto:phase1_2017_realistic',
2827         'HLTmenu': '@relval2017',
2828         'Era' : 'Run2_2017',
2829         'ScenToRun' : ['GenSim','Digi','RecoFakeHLT','HARVESTFakeHLT','ALCA','Nano'],
2830     },
2831     '2017Design' : {
2832         'Geom' : 'DB:Extended',
2833         'GT' : 'auto:phase1_2017_design',
2834         'HLTmenu': '@relval2017',
2835         'Era' : 'Run2_2017',
2836         'BeamSpot': 'DBdesign',
2837         'ScenToRun' : ['GenSim','Digi','RecoFakeHLT','HARVESTFakeHLT'],
2838     },
2839     '2018' : {
2840         'Geom' : 'DB:Extended',
2841         'GT' : 'auto:phase1_2018_realistic',
2842         'HLTmenu': '@relval2018',
2843         'Era' : 'Run2_2018',
2844         'BeamSpot': 'DBrealistic',
2845         'ScenToRun' : ['GenSim','Digi','RecoFakeHLT','HARVESTFakeHLT','ALCA','Nano'],
2846     },
2847     '2018Design' : {
2848         'Geom' : 'DB:Extended',
2849         'GT' : 'auto:phase1_2018_design',
2850         'HLTmenu': '@relval2018',
2851         'Era' : 'Run2_2018',
2852         'BeamSpot': 'DBdesign',
2853         'ScenToRun' : ['GenSim','Digi','RecoFakeHLT','HARVESTFakeHLT'],
2854     },
2855     '2021' : {
2856         'Geom' : 'DB:Extended',
2857         'GT' : 'auto:phase1_2022_realistic',
2858         'HLTmenu': '@relval2022',
2859         'Era' : 'Run3',
2860         'BeamSpot': 'DBrealistic',
2861         'ScenToRun' : ['GenSim','Digi','RecoNanoFakeHLT','HARVESTNanoFakeHLT','ALCA'],
2862     },
2863     '2021Design' : {
2864         'Geom' : 'DB:Extended',
2865         'GT' : 'auto:phase1_2022_design',
2866         'HLTmenu': '@relval2022',
2867         'Era' : 'Run3',
2868         'BeamSpot': 'DBdesign',
2869         'ScenToRun' : ['GenSim','Digi','RecoNanoFakeHLT','HARVESTNanoFakeHLT'],
2870     },
2871     '2023' : {
2872         'Geom' : 'DB:Extended',
2873         'GT' : 'auto:phase1_2023_realistic',
2874         'HLTmenu': '@relval2023',
2875         'Era' : 'Run3_2023',
2876         'BeamSpot': 'DBrealistic',
2877         'ScenToRun' : ['GenSim','Digi','RecoNanoFakeHLT','HARVESTNanoFakeHLT','ALCA'],
2878     },
2879     '2024' : {
2880         'Geom' : 'DB:Extended',
2881         'GT' : 'auto:phase1_2024_realistic',
2882         'HLTmenu': '@relval2024',
2883         'Era' : 'Run3_2024',
2884         'BeamSpot': 'DBrealistic',
2885         'ScenToRun' : ['GenSim','Digi','RecoNano','HARVESTNano','ALCA'],
2886     },
2887     '2024HLTOnDigi' : {
2888         'Geom' : 'DB:Extended',
2889         'GT' : 'auto:phase1_2024_realistic',
2890         'HLTmenu': '@relval2024',
2891         'Era' : 'Run3',
2892         'BeamSpot': 'DBrealistic',
2893         'ScenToRun' : ['GenSim','DigiNoHLT','HLTOnly','RecoNano','HARVESTNano','ALCA'],
2894     },
2895     '2021FS' : {
2896         'Geom' : 'DB:Extended',
2897         'GT' : 'auto:phase1_2022_realistic',
2898         'HLTmenu': '@relval2022',
2899         'Era' : 'Run3_FastSim',
2900         'BeamSpot': 'DBrealistic',
2901         'ScenToRun' : ['Gen','FastSimRun3','HARVESTFastRun3'],
2902     },
2903     '2021postEE' : {
2904         'Geom' : 'DB:Extended',
2905         'GT' : 'auto:phase1_2022_realistic_postEE',
2906         'HLTmenu': '@relval2022',
2907         'Era' : 'Run3',
2908         'BeamSpot': 'DBrealistic',
2909         'ScenToRun' : ['GenSim','Digi','RecoNanoFakeHLT','HARVESTNanoFakeHLT','ALCA'],
2910     },
2911     '2023FS' : {
2912         'Geom' : 'DB:Extended',
2913         'GT' : 'auto:phase1_2023_realistic',
2914         'HLTmenu': '@relval2023',
2915         'Era' : 'Run3_2023_FastSim',
2916         'BeamSpot': 'DBrealistic',
2917         'ScenToRun' : ['Gen','FastSimRun3','HARVESTFastRun3'],
2918     },
2919     '2022HI' : {
2920         'Geom' : 'DB:Extended',
2921         'GT':'auto:phase1_2022_realistic_hi',
2922         'HLTmenu': '@fake2',
2923         'Era':'Run3_pp_on_PbPb',
2924         'BeamSpot': 'DBrealistic',
2925         'ScenToRun' : ['GenSim','Digi','RecoNano','HARVESTNano','ALCA'],
2926     },
2927     '2022HIRP' : {
2928         'Geom' : 'DB:Extended',
2929         'GT':'auto:phase1_2022_realistic_hi',
2930         'HLTmenu': '@fake2',
2931         'Era':'Run3_pp_on_PbPb_approxSiStripClusters',
2932         'BeamSpot': 'DBrealistic',
2933         'ScenToRun' : ['GenSim','Digi','RecoNano','HARVESTNano','ALCA'],
2934     },
2935     '2023HI' : {
2936         'Geom' : 'DB:Extended',
2937         'GT':'auto:phase1_2023_realistic_hi',
2938         'HLTmenu': '@fake2',
2939         'Era':'Run3_pp_on_PbPb',
2940         'BeamSpot': 'DBrealistic',
2941         'ScenToRun' : ['GenSim','Digi','RecoNano','HARVESTNano','ALCA'],
2942     },
2943     '2023HIRP' : {
2944         'Geom' : 'DB:Extended',
2945         'GT':'auto:phase1_2023_realistic_hi',
2946         'HLTmenu': '@fake2',
2947         'Era':'Run3_pp_on_PbPb_approxSiStripClusters',
2948         'BeamSpot': 'DBrealistic',
2949         'ScenToRun' : ['GenSim','Digi','RecoNano','HARVESTNano','ALCA'],
2950     },
2951     '2024GenOnly' : {
2952         'Geom' : 'DB:Extended',
2953         'GT' : 'auto:phase1_2024_realistic',
2954         'Era' : 'Run3',
2955         'BeamSpot': 'DBrealistic',
2956         'ScenToRun' : ['Gen'],
2957     },
2958     '2024SimOnGen' : {
2959         'Geom' : 'DB:Extended',
2960         'GT' : 'auto:phase1_2024_realistic',
2961         'HLTmenu': '@relval2024',
2962         'Era' : 'Run3',
2963         'BeamSpot': 'DBrealistic',
2964         'ScenToRun' : ['Gen','Sim','Digi','RecoNano','HARVESTNano','ALCA'],
2965     },
2966 }
2967 
2968 # standard PU sequences
2969 for key in list(upgradeProperties[2017].keys()):
2970     upgradeProperties[2017][key+'PU'] = deepcopy(upgradeProperties[2017][key])
2971     if 'FS' not in key:
2972         # update ScenToRun list
2973         scenToRun = upgradeProperties[2017][key+'PU']['ScenToRun']
2974         for idx,val in enumerate(scenToRun):
2975             # Digi -> DigiPU, Reco* -> Reco*PU, HARVEST* -> HARVEST*PU
2976             scenToRun[idx] += 'PU'*(val.startswith('Digi') or val.startswith('Reco') or val.startswith('HARVEST'))
2977         # remove ALCA
2978         upgradeProperties[2017][key+'PU']['ScenToRun'] = [foo for foo in scenToRun if foo != 'ALCA']
2979     else:
2980         upgradeProperties[2017][key+'PU']['ScenToRun'] = ['Gen','FastSimRun3PU','HARVESTFastRun3PU']
2981 
2982 upgradeProperties[2026] = {
2983     '2026D86' : {
2984         'Geom' : 'Extended2026D86',
2985         'HLTmenu': '@fake2',
2986         'GT' : 'auto:phase2_realistic_T21',
2987         'Era' : 'Phase2C17I13M9',
2988         'ScenToRun' : ['GenSimHLBeamSpot','DigiTrigger','RecoGlobal', 'HARVESTGlobal', 'ALCAPhase2'],
2989     },
2990     '2026D88' : {
2991         'Geom' : 'Extended2026D88',
2992         'HLTmenu': '@relval2026',
2993         'GT' : 'auto:phase2_realistic_T21',
2994         'Era' : 'Phase2C17I13M9',
2995         'ScenToRun' : ['GenSimHLBeamSpot','DigiTrigger','RecoGlobal', 'HARVESTGlobal', 'ALCAPhase2'],
2996     },
2997     '2026D91' : {
2998         'Geom' : 'Extended2026D91',
2999         'HLTmenu': '@fake2',
3000         'GT' : 'auto:phase2_realistic_T30',
3001         'Era' : 'Phase2C17I13M9',
3002         'ScenToRun' : ['GenSimHLBeamSpot','DigiTrigger','RecoGlobal', 'HARVESTGlobal', 'ALCAPhase2'],
3003     },
3004     '2026D92' : {
3005         'Geom' : 'Extended2026D92',
3006         'HLTmenu': '@fake2',
3007         'GT' : 'auto:phase2_realistic_T21',
3008         'Era' : 'Phase2C17I13M9',
3009         'ScenToRun' : ['GenSimHLBeamSpot','DigiTrigger','RecoGlobal', 'HARVESTGlobal', 'ALCAPhase2'],
3010     },
3011     '2026D93' : {
3012         'Geom' : 'Extended2026D93',
3013         'HLTmenu': '@fake2',
3014         'GT' : 'auto:phase2_realistic_T21',
3015         'Era' : 'Phase2C17I13M9',
3016         'ScenToRun' : ['GenSimHLBeamSpot','DigiTrigger','RecoGlobal', 'HARVESTGlobal', 'ALCAPhase2'],
3017     },
3018     '2026D94' : {
3019         'Geom' : 'Extended2026D94',
3020         'HLTmenu': '@fake2',
3021         'GT' : 'auto:phase2_realistic_T21',
3022         'Era' : 'Phase2C20I13M9',
3023         'ScenToRun' : ['GenSimHLBeamSpot','DigiTrigger','RecoGlobal', 'HARVESTGlobal', 'ALCAPhase2'],
3024     },
3025     '2026D95' : {
3026         'Geom' : 'Extended2026D95',
3027         'HLTmenu': '@relval2026',
3028         'GT' : 'auto:phase2_realistic_T21',
3029         'Era' : 'Phase2C17I13M9',
3030         'ScenToRun' : ['GenSimHLBeamSpot','DigiTrigger','RecoGlobal', 'HARVESTGlobal', 'ALCAPhase2'],
3031     },
3032     '2026D96' : {
3033         'Geom' : 'Extended2026D96',
3034         'HLTmenu': '@fake2',
3035         'GT' : 'auto:phase2_realistic_T21',
3036         'Era' : 'Phase2C17I13M9',
3037         'ScenToRun' : ['GenSimHLBeamSpot','DigiTrigger','RecoGlobal', 'HARVESTGlobal', 'ALCAPhase2'],
3038     },
3039     '2026D97' : {
3040         'Geom' : 'Extended2026D97',
3041         'HLTmenu': '@fake2',
3042         'GT' : 'auto:phase2_realistic_T25',
3043         'Era' : 'Phase2C17I13M9',
3044         'ScenToRun' : ['GenSimHLBeamSpot','DigiTrigger','RecoGlobal', 'HARVESTGlobal', 'ALCAPhase2'],
3045     },
3046     '2026D98' : {
3047         'Geom' : 'Extended2026D98',
3048         'HLTmenu': '@relval2026',
3049         'GT' : 'auto:phase2_realistic_T25',
3050         'Era' : 'Phase2C17I13M9',
3051         'ScenToRun' : ['GenSimHLBeamSpot','DigiTrigger','RecoGlobal', 'HARVESTGlobal', 'ALCAPhase2'],
3052     },
3053     '2026D99' : {
3054         'Geom' : 'Extended2026D99',
3055         'HLTmenu': '@relval2026',
3056         'GT' : 'auto:phase2_realistic_T25',
3057         'Era' : 'Phase2C17I13M9',
3058         'ScenToRun' : ['GenSimHLBeamSpot','DigiTrigger','RecoGlobal', 'HARVESTGlobal', 'ALCAPhase2'],
3059     },
3060     '2026D100' : {
3061         'Geom' : 'Extended2026D100',
3062         'HLTmenu': '@relval2026',
3063         'GT' : 'auto:phase2_realistic_T25',
3064         'Era' : 'Phase2C17I13M9',
3065         'ScenToRun' : ['GenSimHLBeamSpot','DigiTrigger','RecoGlobal', 'HARVESTGlobal', 'ALCAPhase2'],
3066     },
3067     '2026D101' : {
3068         'Geom' : 'Extended2026D101',
3069         'HLTmenu': '@relval2026',
3070         'GT' : 'auto:phase2_realistic_T25',
3071         'Era' : 'Phase2C17I13M9',
3072         'ScenToRun' : ['GenSimHLBeamSpot','DigiTrigger','RecoGlobal', 'HARVESTGlobal', 'ALCAPhase2'],
3073     },
3074     '2026D102' : {
3075         'Geom' : 'Extended2026D102',
3076         'HLTmenu': '@relval2026',
3077         'GT' : 'auto:phase2_realistic_T33',
3078         'Era' : 'Phase2C17I13M9',
3079         'ScenToRun' : ['GenSimHLBeamSpot','DigiTrigger','RecoGlobal', 'HARVESTGlobal', 'ALCAPhase2'],
3080     },
3081     '2026D103' : {
3082         'Geom' : 'Extended2026D103',
3083         'HLTmenu': '@relval2026',
3084         'GT' : 'auto:phase2_realistic_T25',
3085         'Era' : 'Phase2C17I13M9',
3086         'ScenToRun' : ['GenSimHLBeamSpot','DigiTrigger','RecoGlobal', 'HARVESTGlobal', 'ALCAPhase2'],
3087     },
3088     '2026D104' : {
3089         'Geom' : 'Extended2026D104',
3090         'HLTmenu': '@relval2026',
3091         'GT' : 'auto:phase2_realistic_T33',
3092         'Era' : 'Phase2C22I13M9',
3093         'ScenToRun' : ['GenSimHLBeamSpot','DigiTrigger','RecoGlobal', 'HARVESTGlobal', 'ALCAPhase2'],
3094     },
3095     '2026D105' : {
3096         'Geom' : 'Extended2026D105',
3097         'HLTmenu': '@relval2026',
3098         'GT' : 'auto:phase2_realistic_T33',
3099         'Era' : 'Phase2C17I13M9',
3100         'ScenToRun' : ['GenSimHLBeamSpot','DigiTrigger','RecoGlobal', 'HARVESTGlobal', 'ALCAPhase2'],
3101     },
3102     '2026D106' : {
3103         'Geom' : 'Extended2026D106',
3104         'HLTmenu': '@relval2026',
3105         'GT' : 'auto:phase2_realistic_T33',
3106         'Era' : 'Phase2C22I13M9',
3107         'ScenToRun' : ['GenSimHLBeamSpot','DigiTrigger','RecoGlobal', 'HARVESTGlobal', 'ALCAPhase2'],
3108     },
3109     '2026D107' : {
3110         'Geom' : 'Extended2026D107',
3111         'HLTmenu': '@relval2026',
3112         'GT' : 'auto:phase2_realistic_T25',
3113         'Era' : 'Phase2C17I13M9',
3114         'ScenToRun' : ['GenSimHLBeamSpot','DigiTrigger','RecoGlobal', 'HARVESTGlobal', 'ALCAPhase2'],
3115     },
3116     '2026D108' : {
3117         'Geom' : 'Extended2026D108',
3118         'HLTmenu': '@relval2026',
3119         'GT' : 'auto:phase2_realistic_T33',
3120         'Era' : 'Phase2C17I13M9',
3121         'ScenToRun' : ['GenSimHLBeamSpot','DigiTrigger','RecoGlobal', 'HARVESTGlobal', 'ALCAPhase2'],
3122     },
3123     '2026D109' : {
3124         'Geom' : 'Extended2026D109',
3125         'HLTmenu': '@relval2026',
3126         'GT' : 'auto:phase2_realistic_T33',
3127         'Era' : 'Phase2C22I13M9',
3128         'ScenToRun' : ['GenSimHLBeamSpot','DigiTrigger','RecoGlobal', 'HARVESTGlobal', 'ALCAPhase2'],
3129     },
3130     '2026D110' : {
3131         'Geom' : 'Extended2026D110',
3132         'HLTmenu': '@relval2026',
3133         'GT' : 'auto:phase2_realistic_T33',
3134         'Era' : 'Phase2C17I13M9',
3135         'ScenToRun' : ['GenSimHLBeamSpot','DigiTrigger','RecoGlobal', 'HARVESTGlobal', 'ALCAPhase2'],
3136     },
3137    '2026D111' : {
3138         'Geom' : 'Extended2026D111',
3139         'HLTmenu': '@relval2026',
3140         'GT' : 'auto:phase2_realistic_T36',
3141         'Era' : 'Phase2C22I13M9',
3142         'ScenToRun' : ['GenSimHLBeamSpot','DigiTrigger','RecoGlobal', 'HARVESTGlobal', 'ALCAPhase2'],
3143     },
3144     '2026D112' : {
3145         'Geom' : 'Extended2026D112',
3146         'HLTmenu': '@relval2026',
3147         'GT' : 'auto:phase2_realistic_T37',
3148         'Era' : 'Phase2C22I13M9',
3149         'ScenToRun' : ['GenSimHLBeamSpot','DigiTrigger','RecoGlobal', 'HARVESTGlobal', 'ALCAPhase2'],
3150     },
3151     '2026D113' : {
3152         'Geom' : 'Extended2026D113',
3153         'HLTmenu': '@relval2026',
3154         'GT' : 'auto:phase2_realistic_T38',
3155         'Era' : 'Phase2C22I13M9',
3156         'ScenToRun' : ['GenSimHLBeamSpot','DigiTrigger','RecoGlobal', 'HARVESTGlobal', 'ALCAPhase2'],
3157     },
3158     '2026D114' : {
3159         'Geom' : 'Extended2026D114',
3160         'HLTmenu': '@relval2026',
3161         'GT' : 'auto:phase2_realistic_T33',
3162         'Era' : 'Phase2C17I13M9',
3163         'ScenToRun' : ['GenSimHLBeamSpot','DigiTrigger','RecoGlobal', 'HARVESTGlobal', 'ALCAPhase2'],
3164     },
3165     '2026D110GenOnly' : {
3166         'Geom' : 'Extended2026D110',
3167         'Beamspot' : 'HLLHC',
3168         'GT' : 'auto:phase2_realistic_T33',
3169         'Era' : 'Phase2C17I13M9',
3170         'ScenToRun' : ['Gen'],
3171     },
3172     '2026D110SimOnGen' : {
3173         'Geom' : 'Extended2026D110',
3174         'HLTmenu': '@relval2026',
3175         'Beamspot' : 'HLLHC',
3176         'GT' : 'auto:phase2_realistic_T33',
3177         'Era' : 'Phase2C17I13M9',
3178         'ScenToRun' : ['Gen','Sim','DigiTrigger','RecoGlobal', 'HARVESTGlobal', 'ALCAPhase2'],
3179     },
3180     '2026D115' : {
3181         'Geom' : 'Extended2026D115',
3182         'HLTmenu': '@relval2026',
3183         'GT' : 'auto:phase2_realistic_T33',
3184         'Era' : 'Phase2C20I13M9',
3185         'ScenToRun' : ['GenSimHLBeamSpot','DigiTrigger','RecoGlobal', 'HARVESTGlobal', 'ALCAPhase2'],
3186     },
3187 }
3188 
3189 # standard PU sequences
3190 for key in list(upgradeProperties[2026].keys()):
3191     upgradeProperties[2026][key+'PU'] = deepcopy(upgradeProperties[2026][key])
3192     upgradeProperties[2026][key+'PU']['ScenToRun'] = ['GenSimHLBeamSpot','DigiTriggerPU','RecoGlobalPU', 'HARVESTGlobalPU']
3193 
3194 # for relvals
3195 defaultDataSets = {}
3196 for year in upgradeKeys:
3197     for key in upgradeKeys[year]:
3198         if 'PU' in key: continue
3199         defaultDataSets[key] = ''
3200 
3201 
3202 class UpgradeFragment(object):
3203     def __init__(self, howMuch, dataset):
3204         self.howMuch = howMuch
3205         self.dataset = dataset
3206 
3207 upgradeFragments = OrderedDict([
3208     ('FourMuPt_1_200_pythia8_cfi', UpgradeFragment(Kby(10,100),'FourMuPt1_200')),
3209     ('SingleElectronPt10_pythia8_cfi', UpgradeFragment(Kby(9,100),'SingleElectronPt10')),
3210     ('SingleElectronPt35_pythia8_cfi', UpgradeFragment(Kby(9,100),'SingleElectronPt35')),
3211     ('SingleElectronPt1000_pythia8_cfi', UpgradeFragment(Kby(9,50),'SingleElectronPt1000')),
3212     ('SingleGammaPt10_pythia8_cfi', UpgradeFragment(Kby(9,100),'SingleGammaPt10')),
3213     ('SingleGammaPt35_pythia8_cfi', UpgradeFragment(Kby(9,50),'SingleGammaPt35')),
3214     ('SingleMuPt1_pythia8_cfi', UpgradeFragment(Kby(25,100),'SingleMuPt1')),
3215     ('SingleMuPt10_Eta2p85_cfi', UpgradeFragment(Kby(9,100),'SingleMuPt10')),
3216     ('SingleMuPt100_Eta2p85_cfi', UpgradeFragment(Kby(9,100),'SingleMuPt100')),
3217     ('SingleMuPt1000_Eta2p85_cfi', UpgradeFragment(Kby(9,100),'SingleMuPt1000')),
3218     ('FourMuExtendedPt_1_200_pythia8_cfi', UpgradeFragment(Kby(10,100),'FourMuExtendedPt1_200')),
3219     ('TenMuExtendedE_0_200_pythia8_cfi', UpgradeFragment(Kby(10,100),'TenMuExtendedE_0_200')),
3220     ('DoubleElectronPt10Extended_pythia8_cfi', UpgradeFragment(Kby(9,100),'SingleElPt10Extended')),
3221     ('DoubleElectronPt35Extended_pythia8_cfi', UpgradeFragment(Kby(9,100),'SingleElPt35Extended')),
3222     ('DoubleElectronPt1000Extended_pythia8_cfi', UpgradeFragment(Kby(9,50),'SingleElPt1000Extended')),
3223     ('DoubleGammaPt10Extended_pythia8_cfi', UpgradeFragment(Kby(9,100),'SingleGammaPt10Extended')),
3224     ('DoubleGammaPt35Extended_pythia8_cfi', UpgradeFragment(Kby(9,50),'SingleGammaPt35Extended')),
3225     ('DoubleMuPt1Extended_pythia8_cfi', UpgradeFragment(Kby(25,100),'SingleMuPt1Extended')),
3226     ('DoubleMuPt10Extended_pythia8_cfi', UpgradeFragment(Kby(25,100),'SingleMuPt10Extended')),
3227     ('DoubleMuPt100Extended_pythia8_cfi', UpgradeFragment(Kby(9,100),'SingleMuPt100Extended')),
3228     ('DoubleMuPt1000Extended_pythia8_cfi', UpgradeFragment(Kby(9,100),'SingleMuPt1000Extended')),
3229     ('TenMuE_0_200_pythia8_cfi', UpgradeFragment(Kby(10,100),'TenMuE_0_200')),
3230     ('SinglePiE50HCAL_pythia8_cfi', UpgradeFragment(Kby(50,500),'SinglePiE50HCAL')),
3231     ('MinBias_13TeV_pythia8_TuneCUETP8M1_cfi', UpgradeFragment(Kby(90,100),'MinBias_13')),
3232     ('TTbar_13TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,50),'TTbar_13')),
3233     ('ZEE_13TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,100),'ZEE_13')),
3234     ('QCD_Pt_600_800_13TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,50),'QCD_Pt_600_800_13')),
3235     ('Wjet_Pt_80_120_14TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,100),'Wjet_Pt_80_120_14TeV')),
3236     ('Wjet_Pt_3000_3500_14TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,50),'Wjet_Pt_3000_3500_14TeV')),
3237     ('LM1_sfts_14TeV_cfi', UpgradeFragment(Kby(9,100),'LM1_sfts_14TeV')),
3238     ('QCD_Pt_3000_3500_14TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,50),'QCD_Pt_3000_3500_14TeV')),
3239     ('QCD_Pt_80_120_14TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,100),'QCD_Pt_80_120_14TeV')),
3240     ('H200ChargedTaus_Tauola_14TeV_cfi', UpgradeFragment(Kby(9,100),'Higgs200ChargedTaus_14TeV')),
3241     ('JpsiMM_14TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(66,100),'JpsiMM_14TeV')),
3242     ('TTbar_14TeV_TuneCP5_cfi', UpgradeFragment(Kby(9,100),'TTbar_14TeV')),
3243     ('WE_14TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,100),'WE_14TeV')),
3244     ('ZTT_Tauola_All_hadronic_14TeV_TuneCP5_cfi', UpgradeFragment(Kby(9,100),'ZTT_14TeV')),
3245     ('H130GGgluonfusion_14TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,100),'H130GGgluonfusion_14TeV')),
3246     ('PhotonJet_Pt_10_14TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,100),'PhotonJets_Pt_10_14TeV')),
3247     ('QQH1352T_Tauola_14TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,100),'QQH1352T_Tauola_14TeV')),
3248     ('MinBias_14TeV_pythia8_TuneCP5_cfi', UpgradeFragment(Kby(90,100),'MinBias_14TeV')),
3249     ('WToMuNu_14TeV_TuneCP5_pythia8_cfi', UpgradeFragment(Kby(9,100),'WToMuNu_14TeV')),
3250     ('ZMM_13TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(18,100),'ZMM_13')),
3251     ('QCDForPF_14TeV_TuneCP5_cfi', UpgradeFragment(Kby(50,100),'QCD_FlatPt_15_3000HS_14')),
3252     ('DYToLL_M-50_14TeV_pythia8_cff', UpgradeFragment(Kby(9,100),'DYToLL_M_50_14TeV')),
3253     ('DYToTauTau_M-50_14TeV_pythia8_tauola_cff', UpgradeFragment(Kby(9,100),'DYtoTauTau_M_50_14TeV')),
3254     ('ZEE_14TeV_TuneCP5_cfi', UpgradeFragment(Kby(9,100),'ZEE_14')),
3255     ('QCD_Pt_80_120_13TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,100),'QCD_Pt_80_120_13')),
3256     ('H125GGgluonfusion_13TeV_TuneCP5_cfi', UpgradeFragment(Kby(9,50),'H125GGgluonfusion_13')),
3257     ('QCD_Pt20toInf_MuEnrichedPt15_14TeV_TuneCP5_cff', UpgradeFragment(Kby(19565, 217391),'QCD_Pt20toInfMuEnrichPt15_14')), # effi = 4.6e-4,  local=8.000e-04
3258     ('ZMM_14TeV_TuneCP5_cfi', UpgradeFragment(Kby(18,100),'ZMM_14')),
3259     ('QCD_Pt15To7000_Flat_14TeV_TuneCP5_cff', UpgradeFragment(Kby(9,50),'QCD_Pt15To7000_Flat_14')),
3260     ('H125GGgluonfusion_14TeV_TuneCP5_cfi', UpgradeFragment(Kby(9,50),'H125GGgluonfusion_14')),
3261     ('QCD_Pt_600_800_14TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,50),'QCD_Pt_600_800_14')),
3262     ('UndergroundCosmicSPLooseMu_cfi', UpgradeFragment(Kby(9,50),'CosmicsSPLoose')),
3263     ('BeamHalo_13TeV_cfi', UpgradeFragment(Kby(9,50),'BeamHalo_13')),
3264     ('H200ChargedTaus_Tauola_13TeV_cfi', UpgradeFragment(Kby(9,50),'Higgs200ChargedTaus_13')),
3265     ('ADDMonoJet_13TeV_d3MD3_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,50),'ADDMonoJet_d3MD3_13')),
3266     ('ZpMM_13TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,50),'ZpMM_13')),
3267     ('QCD_Pt_3000_3500_13TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,50),'QCD_Pt_3000_3500_13')),
3268     ('WpM_13TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,50),'WpM_13')),
3269     ('SingleNuE10_cfi', UpgradeFragment(Kby(9,50),'NuGun')),
3270     ('TTbarLepton_13TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,50),'TTbarLepton_13')),
3271     ('WE_13TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,50),'WE_13')),
3272     ('WM_13TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,50),'WM_13')),
3273     ('ZTT_All_hadronic_13TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,50),'ZTT_13')),
3274     ('PhotonJet_Pt_10_13TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,50),'PhotonJets_Pt_10_13')),
3275     ('QQH1352T_13TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,50),'QQH1352T_13')),
3276     ('Wjet_Pt_80_120_13TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,50),'Wjet_Pt_80_120_13')),
3277     ('Wjet_Pt_3000_3500_13TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,50),'Wjet_Pt_3000_3500_13')),
3278     ('SMS-T1tttt_mGl-1500_mLSP-100_13TeV-pythia8_cfi', UpgradeFragment(Kby(9,50),'SMS-T1tttt_mGl-1500_mLSP-100_13')),
3279     ('QCDForPF_13TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(50,100),'QCD_FlatPt_15_3000HS_13')),
3280     ('PYTHIA8_PhiToMuMu_TuneCUETP8M1_13TeV_cff', UpgradeFragment(Kby(9,50),'PhiToMuMu_13')),
3281     ('RSKKGluon_m3000GeV_13TeV_TuneCUETP8M1_cff', UpgradeFragment(Kby(9,50),'RSKKGluon_m3000GeV_13')),
3282     ('ZpMM_2250_13TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,50),'ZpMM_2250_13')),
3283     ('ZpEE_2250_13TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,50),'ZpEE_2250_13')),
3284     ('ZpTT_1500_13TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,50),'ZpTT_1500_13')),
3285     ('Upsilon1SToMuMu_forSTEAM_13TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(9,50),'Upsilon1SToMuMu_13')),
3286     ('EtaBToJpsiJpsi_forSTEAM_TuneCUEP8M1_13TeV_cfi', UpgradeFragment(Kby(9,50),'EtaBToJpsiJpsi_13')),
3287     ('JpsiMuMu_Pt-8_forSTEAM_13TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(3100,100000),'JpsiMuMu_Pt-8')),
3288     ('BuMixing_BMuonFilter_forSTEAM_13TeV_TuneCUETP8M1_cfi', UpgradeFragment(Kby(900,10000),'BuMixing_13')),
3289     ('HSCPstop_M_200_TuneCUETP8M1_13TeV_pythia8_cff', UpgradeFragment(Kby(9,50),'HSCPstop_M_200_13')),
3290     ('RSGravitonToGammaGamma_kMpl01_M_3000_TuneCUETP8M1_13TeV_pythia8_cfi', UpgradeFragment(Kby(9,50),'RSGravitonToGaGa_13')),
3291     ('WprimeToENu_M-2000_TuneCUETP8M1_13TeV-pythia8_cff', UpgradeFragment(Kby(9,50),'WpToENu_M-2000_13')),
3292     ('DisplacedSUSY_stopToBottom_M_800_500mm_TuneCP5_13TeV_pythia8_cff', UpgradeFragment(Kby(9,50),'DisplacedSUSY_stopToB_M_800_500mm_13')),
3293     ('TenE_E_0_200_pythia8_cfi', UpgradeFragment(Kby(9,100),'TenE_0_200')),
3294     ('FlatRandomPtAndDxyGunProducer_cfi', UpgradeFragment(Kby(9,100),'DisplacedMuonsDxy_0_500')),
3295     ('TenTau_E_15_500_pythia8_cfi', UpgradeFragment(Kby(9,100),'TenTau_15_500')),
3296     ('SinglePiPt25Eta1p7_2p7_cfi', UpgradeFragment(Kby(9,100),'SinglePiPt25Eta1p7_2p7')),
3297     ('SingleMuPt15Eta1p7_2p7_cfi', UpgradeFragment(Kby(9,100),'SingleMuPt15Eta1p7_2p7')),
3298     ('SingleGammaPt25Eta1p7_2p7_cfi', UpgradeFragment(Kby(9,100),'SingleGammaPt25Eta1p7_2p7')),
3299     ('SingleElectronPt15Eta1p7_2p7_cfi', UpgradeFragment(Kby(9,100),'SingleElectronPt15Eta1p7_2p7')),
3300     ('ZTT_All_hadronic_14TeV_TuneCP5_cfi', UpgradeFragment(Kby(9,50),'ZTT_14')),
3301     ('CloseByParticle_Photon_ERZRanges_cfi', UpgradeFragment(Kby(9,100),'CloseByParticleGun')),
3302     ('CE_E_Front_300um_cfi', UpgradeFragment(Kby(9,100),'CloseByPGun_CE_E_Front_300um')),
3303     ('CE_E_Front_200um_cfi', UpgradeFragment(Kby(9,100),'CloseByPGun_CE_E_Front_200um')),
3304     ('CE_E_Front_120um_cfi', UpgradeFragment(Kby(9,100),'CloseByPGun_CE_E_Front_120um')),
3305     ('CE_H_Fine_300um_cfi', UpgradeFragment(Kby(9,100),'CloseByPGun_CE_H_Fine_300um')),
3306     ('CE_H_Fine_200um_cfi', UpgradeFragment(Kby(9,100),'CloseByPGun_CE_H_Fine_200um')),
3307     ('CE_H_Fine_120um_cfi', UpgradeFragment(Kby(9,100),'CloseByPGun_CE_H_Fine_120um')),
3308     ('CE_H_Coarse_Scint_cfi', UpgradeFragment(Kby(9,100),'CloseByPGun_CE_H_Coarse_Scint')),
3309     ('CE_H_Coarse_300um_cfi', UpgradeFragment(Kby(9,100),'CloseByPGun_CE_H_Coarse_300um')),
3310     ('SingleElectronFlatPt2To100_cfi', UpgradeFragment(Kby(9,100),'SingleEFlatPt2To100')),
3311     ('SingleMuFlatPt0p7To10_cfi', UpgradeFragment(Kby(9,100),'SingleMuFlatPt0p7To10')),
3312     ('SingleMuFlatPt2To100_cfi', UpgradeFragment(Kby(9,100),'SingleMuFlatPt2To100')),
3313     ('SingleGammaFlatPt8To150_cfi', UpgradeFragment(Kby(9,100),'SingleGammaFlatPt8To150')),
3314     ('SinglePiFlatPt0p7To10_cfi', UpgradeFragment(Kby(9,100),'SinglePiFlatPt0p7To10')),
3315     ('SingleTauFlatPt2To150_cfi', UpgradeFragment(Kby(9,100),'SingleTauFlatPt2To150')),
3316     ('FlatRandomPtAndDxyGunProducer_MuPt2To10_cfi', UpgradeFragment(Kby(9,100),'DisplacedMuPt2To10')),
3317     ('FlatRandomPtAndDxyGunProducer_MuPt10To30_cfi', UpgradeFragment(Kby(9,100),'DisplacedMuPt10To30')),
3318     ('FlatRandomPtAndDxyGunProducer_MuPt30To100_cfi', UpgradeFragment(Kby(9,100),'DisplacedMuPt30To100')),
3319     ('B0ToKstarMuMu_14TeV_TuneCP5_cfi', UpgradeFragment(Kby(304,3030),'B0ToKstarMuMu_14TeV')), # 3.3%
3320     ('BsToEleEle_14TeV_TuneCP5_cfi', UpgradeFragment(Kby(223,2222),'BsToEleEle_14TeV')), # 4.5%
3321     ('BsToJpsiGamma_14TeV_TuneCP5_cfi', UpgradeFragment(Kby(2500,25000),'BsToJpsiGamma_14TeV')), # 0.4%
3322     ('BsToJpsiPhi_mumuKK_14TeV_TuneCP5_cfi', UpgradeFragment(Kby(910,9090),'BsToJpsiPhi_mumuKK_14TeV')), # 1.1%
3323     ('BsToMuMu_14TeV_TuneCP5_cfi', UpgradeFragment(Kby(313,3125),'BsToMuMu_14TeV')), # 3.2%
3324     ('BsToPhiPhi_KKKK_14TeV_TuneCP5_cfi', UpgradeFragment(Kby(556,5555),'BsToPhiPhi_KKKK_14TeV')), # 1.8%
3325     ('TauToMuMuMu_14TeV_TuneCP5_cfi', UpgradeFragment(Kby(18939,189393),'TauToMuMuMu_14TeV')), # effi = 5.280e-04
3326     ('BdToKstarEleEle_14TeV_TuneCP5_cfi', UpgradeFragment(Kby(206,2061),'BdToKstarEleEle_14TeV')), #effi = 4.850e-02
3327     ('ZpTT_1500_14TeV_TuneCP5_cfi', UpgradeFragment(Kby(9,50),'ZpTT_1500_14')),
3328     ('BuMixing_BMuonFilter_forSTEAM_14TeV_TuneCP5_cfi', UpgradeFragment(Kby(900,10000),'BuMixing_14')),
3329     ('Upsilon1SToMuMu_forSTEAM_14TeV_TuneCP5_cfi', UpgradeFragment(Kby(9,50),'Upsilon1SToMuMu_14')),
3330     ('TenTau_E_15_500_Eta3p1_pythia8_cfi', UpgradeFragment(Kby(9,100),'TenTau_15_500_Eta3p1')),
3331     ('QCD_Pt_1800_2400_14TeV_TuneCP5_cfi', UpgradeFragment(Kby(9,50), 'QCD_Pt_1800_2400_14')),
3332     ('DisplacedSUSY_stopToBottom_M_800_500mm_TuneCP5_14TeV_pythia8_cff', UpgradeFragment(Kby(9,50),'DisplacedSUSY_14TeV')),
3333     ('GluGluTo2Jets_M_300_2000_14TeV_Exhume_cff',UpgradeFragment(Kby(9,100),'GluGluTo2Jets_14TeV')),
3334     ('TTbarToDilepton_mt172p5_TuneCP5_14TeV_pythia8_cfi',UpgradeFragment(Kby(9,50),'TTbarToDilepton_14TeV')),
3335     ('QQToHToTauTau_mh125_TuneCP5_14TeV_pythia8_cfi',UpgradeFragment(Kby(9,50),'QQToHToTauTau_14TeV')),
3336     ('ZpToEE_m6000_TuneCP5_14TeV_pythia8_cfi',UpgradeFragment(Kby(9,50),'ZpToEE_m6000_14TeV')),
3337     ('ZpToMM_m6000_TuneCP5_14TeV_pythia8_cfi',UpgradeFragment(Kby(9,50),'ZpToMM_m6000_14TeV')),
3338     ('SMS-T1tttt_mGl-1500_mLSP-100_TuneCP5_14TeV_pythia8_cfi',UpgradeFragment(Kby(9,50),'SMS-T1tttt_14TeV')),
3339     ('VBFHZZ4Nu_TuneCP5_14TeV_pythia8_cfi',UpgradeFragment(Kby(9,50),'VBFHZZ4Nu_14TeV')),
3340     ('EtaBToJpsiJpsi_14TeV_TuneCP5_pythia8_cfi',UpgradeFragment(Kby(9,50),'EtaBToJpsiJpsi_14TeV')),
3341     ('WToLNu_14TeV_TuneCP5_pythia8_cfi',UpgradeFragment(Kby(21,50),'WToLNu_14TeV')),
3342     ('WprimeToLNu_M2000_14TeV_TuneCP5_pythia8_cfi',UpgradeFragment(Kby(21,50),'WprimeToLNu_M2000_14TeV')),
3343     ('DoubleMuFlatPt1p5To8_cfi', UpgradeFragment(Kby(9,100),'SingleMuFlatPt1p5To8')),
3344     ('DoubleElectronFlatPt1p5To8_cfi', UpgradeFragment(Kby(9,100),'SingleElectronFlatPt1p5To8')),
3345     ('DoubleMuFlatPt1p5To8Dxy100GunProducer_cfi', UpgradeFragment(Kby(9,100),'DisplacedMuPt1p5To8Dxy100')),
3346     ('DoubleMuFlatPt2To100Dxy100GunProducer_cfi', UpgradeFragment(Kby(9,100),'DisplacedMuPt2To100Dxy100')),
3347     ('BuToJPsiPrimeKToJPsiPiPiK_14TeV_TuneCP5_pythia8_cfi', UpgradeFragment(Kby(223,2222),'BuToJPsiPrimeKToJPsiPiPiK_14TeV')), # 5.7%
3348     ('Psi2SToJPsiPiPi_14TeV_TuneCP5_pythia8_cfi', UpgradeFragment(Kby(45,500),'Psi2SToJPsiPiPi_14TeV')), # 24.6%
3349     ('XiMinus_13p6TeV_SoftQCDInel_TuneCP5_cfi', UpgradeFragment(Kby(8000,90000),'XiMinus_13p6TeV')), #2.8%
3350     ('Chib1PToUpsilon1SGamma_MuFilter_TuneCP5_14TeV-pythia8_evtgen_cfi', UpgradeFragment(Kby(3600,36000),'Chib1PToUpsilon1SGamma_14TeV')), #2.8%
3351     ('ChicToJpsiGamma_MuFilter_TuneCP5_14TeV_pythia8_evtgen_cfi', UpgradeFragment(Kby(2000,20000),'ChicToJpsiGamma_14TeV')), #5%
3352     ('B0ToJpsiK0s_JMM_Filter_DGamma0_TuneCP5_13p6TeV-pythia8-evtgen_cfi',UpgradeFragment(Kby(38000,38000),'B0ToJpsiK0s_DGamma0_13p6TeV')), #2.7%
3353     ('DStarToD0Pi_D0ToKsPiPi_inclusive_SoftQCD_TuneCP5_13p6TeV-pythia8-evtgen',UpgradeFragment(Kby(38000,38000),'DStarToD0Pi_D0ToKsPiPi_13p6TeV')), #1.3%
3354     ('LbToJpsiLambda_JMM_Filter_DGamma0_TuneCP5_13p6TeV-pythia8-evtgen_cfi',UpgradeFragment(Mby(66,660000),'LbToJpsiLambda_DGamma0_13p6TeV')), #0.3%
3355     ('LbToJpsiXiK0sPi_JMM_Filter_DGamma0_TuneCP5_13p6TeV-pythia8-evtgen_cfi',UpgradeFragment(Mby(50,500000),'LbToJpsiXiK0sPr_DGamma0_13p6TeV')), #0.6%
3356     ('OmegaMinus_13p6TeV_SoftQCDInel_TuneCP5_cfi',UpgradeFragment(Mby(100,1000000),'OmegaMinus_13p6TeV')), #0.1%
3357     ('Hydjet_Quenched_MinBias_5020GeV_cfi', UpgradeFragment(U2000by1,'HydjetQMinBias_5020GeV')),
3358     ('Hydjet_Quenched_MinBias_5362GeV_cfi', UpgradeFragment(U2000by1,'HydjetQMinBias_5362GeV'))
3359 ])