From 6e71f0fb2bcdf603a1ba0618e3eb782473b38a8e Mon Sep 17 00:00:00 2001
From: Heather Russell <heather.russell@cern.ch>
Date: Thu, 30 Mar 2017 09:43:12 +0200
Subject: [PATCH] ATR-15909, Changes for BPhys CPU improvements.

Changing nomucomb to default in Bphys chains,
so the name is removed from chains in the menu.
---
 .../bphysics/generateBPhysicsChainDefs.py     | 669 +++++++++++++-----
 .../TriggerMenu/python/menu/MC_pp_v7.py       |  20 +-
 .../TriggerMenu/python/menu/Physics_pp_v7.py  |  42 +-
 .../TriggerMenu/python/menu/SignatureDicts.py |   6 +-
 .../TriggerMenu/python/menu/StreamInfo.py     |   3 +-
 .../TriggerMenu/python/muon/MuonDef.py        |  31 +-
 .../python/muon/generateMuonChainDefs.py      |   4 +-
 7 files changed, 575 insertions(+), 200 deletions(-)

diff --git a/Trigger/TriggerCommon/TriggerMenu/python/bphysics/generateBPhysicsChainDefs.py b/Trigger/TriggerCommon/TriggerMenu/python/bphysics/generateBPhysicsChainDefs.py
index 9d46f03550a9..cb7908b36c6b 100644
--- a/Trigger/TriggerCommon/TriggerMenu/python/bphysics/generateBPhysicsChainDefs.py
+++ b/Trigger/TriggerCommon/TriggerMenu/python/bphysics/generateBPhysicsChainDefs.py
@@ -13,25 +13,60 @@ log = logging.getLogger(__name__)
 from TriggerMenu.menu.MenuUtils import setupTopoStartFrom
 from TrigInDetConf.TrigInDetSequence import TrigInDetSequence
 
+
+log.bphysTrigWarning = True
+
+
 ###########################################################################
 ###########################################################################
 
 def generateChainDefs(chainDict):
     
     from TriggerMenu.muon.generateMuonChainDefs import generateChainDefs as genMuonChainDefs
-    theChainDef =     genMuonChainDefs(chainDict)
+    
+    from TriggerJobOpts.TriggerFlags import TriggerFlags
+    if TriggerFlags.run2Config=='2016':
+        thisIsBphysChain = False
+    else :
+        thisIsBphysChain = True
+
+
+    # OI - this is really should be managed in RunTier0Tests and not here!! 
+    menu_name = TriggerFlags.triggerMenuSetup()
+    if 'MC_pp_v6' in menu_name and TriggerFlags.run2Config!='2016' and log.bphysTrigWarning :
+        log.warning(menu_name+" is used with run2Config = "+str(TriggerFlags.run2Config)+" will use Bphys trigger config for 2016!!")
+        thisIsBphysChain = False
+        log.bphysTrigWarning = False
+
+    elif log.bphysTrigWarning :
+        log.bphysTrigWarning = False
+        log.info( "Bphys trigger will be setup for run2config = "+str(TriggerFlags.run2Config)+" as requested")
+        
+    
+    if "bBmumuxv3" in chainDict['chainName'] :  # OI this mc 2016 chain was never enabled, and is not needed in future
+        thisIsBphysChain = False
+    if 'legacyVtx' in chainDict['chainName'] :  # OI Drell-Yan chains are not migrated
+        thisIsBphysChain = False
+    if 'invm' in chainDict['chainName'] :  # OI Drell-Yan chains are not migrated
+        thisIsBphysChain = False
+    
+
+    theChainDef =     genMuonChainDefs(chainDict, thisIsBphysChain)
 
     if not chainDict["topo"]:
         log.error( "No topo given -> not a bphysics chain...")
     else:
-        theChainDef = _addTopoInfo(theChainDef,chainDict)    
+        if thisIsBphysChain : # new setup 
+            theChainDef = _addTopoInfo(theChainDef,chainDict, doL2MultiTrack = True)
+        else :
+            theChainDef = _addTopoInfo(theChainDef,chainDict, doL2MultiTrack = False)
 
     return theChainDef
 
 
 ###########################################################################
 ###########################################################################
-def _addTopoInfo(theChainDef,chainDict,doAtL2AndEF=True):
+def _addTopoInfo(theChainDef,chainDict,doAtL2AndEF=True, doL2MultiTrack = False):
 
     maxL2SignatureIndex = -1
     for signatureIndex,signature in enumerate(theChainDef.signatureList):
@@ -45,44 +80,34 @@ def _addTopoInfo(theChainDef,chainDict,doAtL2AndEF=True):
 
     SameConfigTopos = ['bJpsi', 'bDimu', 'bTau', 'bTauTrk', 'trkTau',
                        'bDsPhiXtight','bDsPhiX', 'bPhi', 
-                       'bBmumu', 'bJpsimumu', 'bUpsimumu', 'Zmumu','bUpsi']
+                       'bBmumu', 'bJpsimumu', 'bUpsimumu', 'Zmumu','bUpsi',
+                       'bNocut']
     ntopos = len(topoAlgs)
 
     topoThresh = chainDict['topoThreshold']
     topoStartFrom = setupTopoStartFrom(topoThresh,theChainDef) if topoThresh else None
-        
+
+            
     if ('bBmumux' in topoAlgs) | ('bBmumuxv2' in topoAlgs) | ('bBmumuxv3' in topoAlgs):
-        theChainDef = bBmumuxTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoStartFrom)
+        theChainDef = bBmumuxTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoStartFrom, doL2MultiTrack)
     elif ('Trkloose' in topoAlgs):
         theChainDef = bMuTrack(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoStartFrom)
+    elif ('TrkPEB' in topoAlgs):
+        theChainDef = bMuTrackPEB(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoStartFrom)
     elif (ntopos ==1) & (topoAlgs[0] in SameConfigTopos):
-        theChainDef = bSingleOptionTopos(theChainDef,chainDict, inputTEsL2, inputTEsEF, topoStartFrom)
+        theChainDef = bSingleOptionTopos(theChainDef,chainDict, inputTEsL2, inputTEsEF, topoStartFrom, doL2MultiTrack)
     else:
-        theChainDef = bMultipleOptionTopos(theChainDef,chainDict,inputTEsL2, inputTEsEF, topoStartFrom)
+        theChainDef = bMultipleOptionTopos(theChainDef,chainDict,inputTEsL2, inputTEsEF, topoStartFrom, doL2MultiTrack)
 
     return theChainDef
 
 
 ###################################################################################
-###################################################################################
-
-def bSingleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoStartFrom):
-    topoAlgs = chainDict["topo"]
-    mtopo = topoAlgs[0]
-    # TE naming deifnition
-    TEname = findL2teBaseName(chainDict['chainName'],topoAlgs)
-    L2TEname = "L2_" + TEname+'_'+mtopo+'_'+chainDict['L1item']
-    EFTEname = "EF_" + chainDict['chainName']
-    topo2StartFrom = None
-    if topoStartFrom:
-        L2TEname = "L2_" + TEname+'_'+mtopo+'_tsf_'+chainDict['L1item']
-        topo2StartFrom = L2TEname
-
-    chainParts = chainDict['chainParts']
+def getBphysThresholds(chainDict) :
     mult = 0
     trkmuons = []
     fexNameExt = ""
-    for part in chainParts :
+    for part in chainDict['chainParts'] :
         mult = mult + int(part['multiplicity'])
     for dictpart in chainDict['chainParts']:
         if 'mu' in dictpart['trigType']:
@@ -104,36 +129,81 @@ def bSingleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoStart
                     thr = 900.
                 trkmuons.append(thr)
                 fexNameExt = fexNameExt + "_"+str(int(dictpart['threshold']))
+    return fexNameExt, trkmuons, mult
+
+###################################################################################
+
+def bSingleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoStartFrom, doL2MultiTrack = False):
+    topoAlgs = chainDict["topo"]
+    mtopo = topoAlgs[0]
+    # TE naming deifnition
+    TEname = findL2teBaseName(chainDict['chainName'],topoAlgs)
+    L2TEname = "L2_" + TEname+'_'+mtopo+'_'+chainDict['L1item']
+    EFTEname = "EF_" + chainDict['chainName']
+    topo2StartFrom = None
+    if topoStartFrom:
+        L2TEname = "L2_" + TEname+'_'+mtopo+'_tsf_'+chainDict['L1item']
+        topo2StartFrom = L2TEname
+
+    chainParts = chainDict['chainParts']
 
-    if (mtopo == 'bJpsi'): 
-        from TrigBphysHypo.TrigL2MultiMuFexConfig import L2MultiMuFex_Jpsi
-        from TrigBphysHypo.TrigL2MultiMuHypoConfig import L2MultiMuHypo_Jpsi
+    fexNameExt,trkmuons, mult  = getBphysThresholds(chainDict)
+
+    from TrigBphysHypo.TrigMultiTrkFexConfig import TrigMultiTrkFex_DiMu,TrigMultiTrkFex_DiMu_noCut,TrigMultiTrkFex_DiMu_noVtx_noOS,TrigMultiTrkFex_DiMu_noVtx_noM_SS 
+    from TrigBphysHypo.TrigEFMultiMuHypoConfig import EFMultiMuHypo_DiMu_noCut,EFMultiMuHypo_DiMu_noVtx,EFMultiMuHypo_DiMu,EFMultiMuHypo_BMeson,EFMultiMuHypo_Jpsi,EFMultiMuHypo_Upsi,EFMultiMuHypo_2700
+    if (mtopo == 'bJpsi'):
+        if doL2MultiTrack :
+            from TrigBphysHypo.TrigMultiTrkFexConfig import TrigMultiTrkFex_DiMu
+            from TrigBphysHypo.TrigEFMultiMuHypoConfig import EFMultiMuHypo_DiMu
+            L2Fex = TrigMultiTrkFex_DiMu()
+            L2Hypo = EFMultiMuHypo_Jpsi("L2MultiMuTrkHypo_Jpsi")  
+            L2Hypo.bphysCollectionKey = "MultiTrkFex"
+        else :
+            from TrigBphysHypo.TrigL2MultiMuFexConfig import L2MultiMuFex_Jpsi
+            from TrigBphysHypo.TrigL2MultiMuHypoConfig import L2MultiMuHypo_Jpsi
+            L2Fex = L2MultiMuFex_Jpsi()
+            L2Hypo = L2MultiMuHypo_Jpsi()
+     
         from TrigBphysHypo.TrigEFMultiMuFexConfig import EFMultiMuFex_Jpsi
         from TrigBphysHypo.TrigEFMultiMuHypoConfig import EFMultiMuHypo_Jpsi
-        L2Fex = L2MultiMuFex_Jpsi()
-        L2Hypo = L2MultiMuHypo_Jpsi()
         EFFex = EFMultiMuFex_Jpsi()
         EFHypo = EFMultiMuHypo_Jpsi()
         
     elif (mtopo =='bDimu'):
         import re
         if ('3mu' in chainDict['chainName'] or re.search('2mu[0-9]+_mu[0-9]+',chainDict['chainName']) or re.search('mu[0-9]+_2mu[0-9]+',chainDict['chainName'])):
-            from TrigBphysHypo.TrigL2MultiMuFexConfig import L2MultiMuFex_DiMu
-            from TrigBphysHypo.TrigL2MultiMuHypoConfig import L2MultiMuHypo_DiMu
+            if doL2MultiTrack :
+                from TrigBphysHypo.TrigMultiTrkFexConfig import TrigMultiTrkFex_DiMu
+                from TrigBphysHypo.TrigEFMultiMuHypoConfig import EFMultiMuHypo_DiMu
+                L2Fex = TrigMultiTrkFex_DiMu()
+                L2Hypo = EFMultiMuHypo_DiMu("L2MultiMuTrkHypo_DiMu")  
+                L2Hypo.bphysCollectionKey = "MultiTrkFex"
+            else :
+                from TrigBphysHypo.TrigL2MultiMuFexConfig import L2MultiMuFex_DiMu
+                from TrigBphysHypo.TrigL2MultiMuHypoConfig import L2MultiMuHypo_DiMu
+                L2Fex = L2MultiMuFex_DiMu()
+                L2Hypo = L2MultiMuHypo_DiMu()        
+                
             from TrigBphysHypo.TrigEFMultiMuFexConfig import EFMultiMuFex_DiMu
             from TrigBphysHypo.TrigEFMultiMuHypoConfig import EFMultiMuHypo_DiMu
-            L2Fex = L2MultiMuFex_DiMu()
-            L2Hypo = L2MultiMuHypo_DiMu()        
             EFFex = EFMultiMuFex_DiMu()
             EFHypo = EFMultiMuHypo_DiMu()
         else:
             #This is a di-muon chain
-            from TrigBphysHypo.TrigL2BMuMuFexConfig import L2BMuMuFex_DiMu
-            from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu
+            if doL2MultiTrack :
+                from TrigBphysHypo.TrigMultiTrkFexConfig import TrigMultiTrkFex_DiMu
+                from TrigBphysHypo.TrigEFMultiMuHypoConfig import EFMultiMuHypo_DiMu
+                L2Fex = TrigMultiTrkFex_DiMu()
+                L2Hypo = EFMultiMuHypo_DiMu("L2MultiMuTrkHypo_DiMu")  
+                L2Hypo.bphysCollectionKey = "MultiTrkFex"
+            else :
+                from TrigBphysHypo.TrigL2BMuMuFexConfig import L2BMuMuFex_DiMu
+                from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu
+                L2Fex  = L2BMuMuFex_DiMu()
+                L2Hypo = L2BMuMuHypo_DiMu()
+                
             from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_DiMu
             from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_DiMu
-            L2Fex  = L2BMuMuFex_DiMu()
-            L2Hypo = L2BMuMuHypo_DiMu()
             EFFex  = EFBMuMuFex_DiMu()
             EFHypo = EFBMuMuHypo_DiMu()
     elif (mtopo == 'bTauTrk'):
@@ -157,6 +227,20 @@ def bSingleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoStart
             EFHypo = EFMultiMuHypo_2700("EFMultiMuHypo_Tau3")
             EFHypo.bphysCollectionKey = "EFMultiMuFex"
 
+    elif (mtopo == 'bNocut'):
+
+        from TrigBphysHypo.TrigMultiTrkFexConfig import  TrigMultiTrkFex_DiMu_noCut
+        from TrigBphysHypo.TrigBphysMuonCounterConfig import  TrigBphysMuonCounter_bNmu
+        from TrigBphysHypo.TrigEFMultiMuHypoConfig import EFMultiMuHypo_DiMu_noCut
+        # at level 2 just check that there is at least 2 tracks. One could cut this more down with multiplicity cut for 3mu_bNocut
+        # but because of 3mu_bJpsi items we will not gain anything 
+        L2Fex = TrigMultiTrkFex_DiMu_noCut()
+        L2Hypo = EFMultiMuHypo_DiMu_noCut("L2MultiMuTrkHypo_noCut")
+        L2Hypo.bphysCollectionKey = "MultiTrkFex"
+
+        EFFex = TrigBphysMuonCounter_bNmu("TrigBphysMuonCounter"+fexNameExt, trkmuons)
+        EFHypo = None
+
     elif (mtopo == 'bTau'):
 
         from TrigBphysHypo.TrigMultiTrkFexConfig import TrigMultiTrkFex_trkTau
@@ -164,8 +248,15 @@ def bSingleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoStart
         from TrigBphysHypo.TrigEFMultiMuFexConfig import EFMultiMuFex_Tau2
         from TrigBphysHypo.TrigEFMultiMuHypoConfig import EFMultiMuHypo_2700
 
-        L2Fex = None
-        L2Hypo = None
+        if doL2MultiTrack :
+            from TrigBphysHypo.TrigMultiTrkFexConfig import TrigMultiTrkFex_trkTau
+            from TrigBphysHypo.TrigEFMultiMuHypoConfig import EFMultiMuHypo_DiMu
+            L2Fex = TrigMultiTrkFex_trkTau()
+            L2Hypo = EFMultiMuHypo_2700("L2MultiMuHypo_bTau")
+            L2Hypo.bphysCollectionKey = "MultiTrkFex"
+        else :  # in 2016 there was no L2 part
+            L2Fex = None
+            L2Hypo = None
 
         if mult == 2 :
             EFFex = EFMultiMuFex_Tau2()
@@ -243,42 +334,72 @@ def bSingleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoStart
 
     
     elif (mtopo == 'bUpsi'):
-        from TrigBphysHypo.TrigL2MultiMuFexConfig import L2MultiMuFex_Upsi
-        from TrigBphysHypo.TrigL2MultiMuHypoConfig import L2MultiMuHypo_Upsi
+        if doL2MultiTrack :
+            from TrigBphysHypo.TrigMultiTrkFexConfig import TrigMultiTrkFex_DiMu
+            from TrigBphysHypo.TrigEFMultiMuHypoConfig import EFMultiMuHypo_DiMu
+            L2Fex = TrigMultiTrkFex_DiMu()
+            L2Hypo = EFMultiMuHypo_Upsi("L2MultiMuTrkHypo_Upsi")  
+            L2Hypo.bphysCollectionKey = "MultiTrkFex"
+        else:
+            from TrigBphysHypo.TrigL2MultiMuFexConfig import L2MultiMuFex_Upsi
+            from TrigBphysHypo.TrigL2MultiMuHypoConfig import L2MultiMuHypo_Upsi
+            L2Fex = L2MultiMuFex_Upsi()
+            L2Hypo = L2MultiMuHypo_Upsi()        
+            
         from TrigBphysHypo.TrigEFMultiMuFexConfig import EFMultiMuFex_Upsi
         from TrigBphysHypo.TrigEFMultiMuHypoConfig import EFMultiMuHypo_Upsi
-        L2Fex = L2MultiMuFex_Upsi()
-        L2Hypo = L2MultiMuHypo_Upsi()        
         EFFex = EFMultiMuFex_Upsi()
         EFHypo = EFMultiMuHypo_Upsi()
     
     elif (mtopo == 'bBmumu'):
-        from TrigBphysHypo.TrigL2BMuMuFexConfig import L2BMuMuFex_B
-        from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_B
+        if doL2MultiTrack :
+            from TrigBphysHypo.TrigMultiTrkFexConfig import TrigMultiTrkFex_DiMu
+            from TrigBphysHypo.TrigEFMultiMuHypoConfig import EFMultiMuHypo_BMeson
+            L2Fex = TrigMultiTrkFex_DiMu()
+            L2Hypo = EFMultiMuHypo_BMeson("L2MultiMuTrkHypo_BMeson")  
+            L2Hypo.bphysCollectionKey = "MultiTrkFex"
+        else :
+            from TrigBphysHypo.TrigL2BMuMuFexConfig import L2BMuMuFex_B
+            from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_B
+            L2Fex  = L2BMuMuFex_B()
+            L2Hypo = L2BMuMuHypo_B()
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_B
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_B
-        L2Fex  = L2BMuMuFex_B()
-        L2Hypo = L2BMuMuHypo_B()
         EFFex  = EFBMuMuFex_B()
         EFHypo = EFBMuMuHypo_B()
         
     elif (mtopo == 'bJpsimumu'):
-        from TrigBphysHypo.TrigL2BMuMuFexConfig import L2BMuMuFex_Jpsi
-        from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_Jpsi
+        if doL2MultiTrack :
+            from TrigBphysHypo.TrigMultiTrkFexConfig import TrigMultiTrkFex_DiMu
+            from TrigBphysHypo.TrigEFMultiMuHypoConfig import EFMultiMuHypo_DiMu
+            L2Fex = TrigMultiTrkFex_DiMu()
+            L2Hypo = EFMultiMuHypo_Jpsi("L2MultiMuTrkHypo_Jpsi")  
+            L2Hypo.bphysCollectionKey = "MultiTrkFex"
+        else :
+            from TrigBphysHypo.TrigL2BMuMuFexConfig import L2BMuMuFex_Jpsi
+            from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_Jpsi
+            L2Fex  = L2BMuMuFex_Jpsi()
+            L2Hypo = L2BMuMuHypo_Jpsi()
+            
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_Jpsi
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_Jpsi
-        L2Fex  = L2BMuMuFex_Jpsi()
-        L2Hypo = L2BMuMuHypo_Jpsi()
         EFFex  = EFBMuMuFex_Jpsi()
         EFHypo = EFBMuMuHypo_Jpsi()
 
     elif (mtopo == 'bUpsimumu'):
-        from TrigBphysHypo.TrigL2BMuMuFexConfig import L2BMuMuFex_Upsi
-        from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_Upsi
+        if doL2MultiTrack :
+            from TrigBphysHypo.TrigMultiTrkFexConfig import TrigMultiTrkFex_DiMu
+            from TrigBphysHypo.TrigEFMultiMuHypoConfig import EFMultiMuHypo_DiMu
+            L2Fex = TrigMultiTrkFex_DiMu()
+            L2Hypo = EFMultiMuHypo_Upsi("L2MultiMuTrkHypo_Upsi")
+        else :
+            from TrigBphysHypo.TrigL2BMuMuFexConfig import L2BMuMuFex_Upsi
+            from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_Upsi
+            L2Fex  = L2BMuMuFex_Upsi()
+            L2Hypo = L2BMuMuHypo_Upsi()
+            
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_Upsi
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_Upsi
-        L2Fex  = L2BMuMuFex_Upsi()
-        L2Hypo = L2BMuMuHypo_Upsi()
         EFFex  = EFBMuMuFex_Upsi()
         EFHypo = EFBMuMuHypo_Upsi()
 
@@ -298,7 +419,10 @@ def bSingleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoStart
     if  L2Fex != None :
         theChainDef.addSequence([L2Fex, L2Hypo], inputTEsL2, L2TEname, topo_start_from = topoStartFrom)
         theChainDef.addSignatureL2([L2TEname])
-    theChainDef.addSequence([EFFex, EFHypo],inputTEsEF, EFTEname, topo_start_from=topo2StartFrom)
+    if EFHypo != None :
+        theChainDef.addSequence([EFFex, EFHypo],inputTEsEF, EFTEname, topo_start_from=topo2StartFrom)
+    else :
+        theChainDef.addSequence([EFFex],inputTEsEF, EFTEname, topo_start_from=topo2StartFrom)
     theChainDef.addSignature(theChainDef.signatureList[-1]['signature_counter']+1, [EFTEname])    
 
     if 'idperf' in chainDict['chainName']:
@@ -313,7 +437,7 @@ def bSingleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoStart
 
 ###################################################################################
 ###################################################################################
-def bMultipleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoStartFrom):
+def bMultipleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoStartFrom, doL2MultiTrack = False):
 
     topoAlgs = chainDict["topo"]
     TEname = findL2teBaseName(chainDict['chainName'],topoAlgs)
@@ -331,31 +455,65 @@ def bMultipleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoSta
 
 
 
+        #from TrigBphysHypo.TrigMultiTrkFexConfig import TrigMultiTrkFex_DiMu
+        #from TrigBphysHypo.TrigEFMultiMuHypoConfig import EFMultiMuHypo_DiMu
+    from TrigBphysHypo.TrigMultiTrkFexConfig import TrigMultiTrkFex_DiMu,TrigMultiTrkFex_DiMu_noCut,TrigMultiTrkFex_DiMu_noVtx_noOS,TrigMultiTrkFex_DiMu_noVtx_noM_SS
+    from TrigBphysHypo.TrigEFMultiMuHypoConfig import EFMultiMuHypo_DiMu_noCut,EFMultiMuHypo_DiMu_noVtx,EFMultiMuHypo_DiMu,EFMultiMuHypo_BMeson,EFMultiMuHypo_Jpsi,EFMultiMuHypo_Upsi,EFMultiMuHypo_2700,EFMultiMuHypo_BMeson 
+
     if ('7invm9' in topoAlgs) & ('noos' in topoAlgs) & ('novtx' not in topoAlgs):
-        from TrigBphysHypo.TrigL2BMuMuFexConfig import L2BMuMuFex_DiMu_7invm9_noOS
-        from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu_7invm9
+        #if not doL2MultiTrack :
+        # OI do MultiTrk is not working yet for invm chains
+        if 1 :
+            from TrigBphysHypo.TrigL2BMuMuFexConfig import L2BMuMuFex_DiMu_7invm9_noOS
+            from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu_7invm9
+            L2Fex  = L2BMuMuFex_DiMu_7invm9_noOS()
+            L2Hypo = L2BMuMuHypo_DiMu_7invm9()
+        ## else :
+        ##     L2Fex = TrigMultiTrkFex_DiMu_noVtx_noOS()
+        ##     L2Hypo = EFMultiMuHypo_DiMu("L2MultiMuTrkHypo_DiMu_7invm9_noVtx")  
+        ##     L2Hypo.bphysCollectionKey = "MultiTrkFex"
+        ##     L2Hypo.LowerMassCut= 7000.
+        ##     L2Hypo.UpperMassCut= 9000.
+        
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_DiMu_7invm9_noOS
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_DiMu_7invm9
-        L2Fex  = L2BMuMuFex_DiMu_7invm9_noOS()
-        L2Hypo = L2BMuMuHypo_DiMu_7invm9()
         EFFex  = EFBMuMuFex_DiMu_7invm9_noOS()
         EFHypo = EFBMuMuHypo_DiMu_7invm9()
     elif ('7invm9' in topoAlgs) & ('noos' in topoAlgs) & ('novtx' in topoAlgs):
-        from TrigBphysHypo.TrigL2BMuMuFexConfig import L2BMuMuFex_DiMu_7invm9_noOS
-        from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu_7invm9_noVtx
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_DiMu_7invm9_noOS
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_DiMu_7invm9_noVtx
-        L2Fex  = L2BMuMuFex_DiMu_7invm9_noOS()
-        L2Hypo = L2BMuMuHypo_DiMu_7invm9_noVtx()
+#        if not doL2MultiTrack :
+        # OI do MultiTrk is not working yet for invm chains
+        if 1 :
+            from TrigBphysHypo.TrigL2BMuMuFexConfig import L2BMuMuFex_DiMu_7invm9_noOS
+            from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu_7invm9_noVtx
+            L2Fex  = L2BMuMuFex_DiMu_7invm9_noOS()
+            L2Hypo = L2BMuMuHypo_DiMu_7invm9_noVtx()
+        ## else :
+        ##     L2Fex = TrigMultiTrkFex_DiMu_noVtx_noOS()
+        ##     L2Hypo = EFMultiMuHypo_DiMu_noVtx("L2MultiMuTrkHypo_DiMu_noVtx_7invm9")  
+        ##     L2Hypo.bphysCollectionKey = "MultiTrkFex"
+        ##     L2Hypo.LowerMassCut= 7000.
+        ##     L2Hypo.UpperMassCut= 9000.
+
         EFFex  = EFBMuMuFex_DiMu_7invm9_noOS()
         EFHypo = EFBMuMuHypo_DiMu_7invm9_noVtx()
     elif ('18invm60' in topoAlgs) & ('noos' in topoAlgs):
-        from TrigBphysHypo.TrigL2BMuMuFexConfig import L2BMuMuFex_DiMu_18invm60_noOS
-        from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu_18invm60_noVtx           
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_DiMu_18invm60_noOS
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_DiMu_18invm60_noVtx           
-        L2Fex  = L2BMuMuFex_DiMu_18invm60_noOS()
-        L2Hypo = L2BMuMuHypo_DiMu_18invm60_noVtx()
+#        if not doL2MultiTrack :
+        # OI do MultiTrk is not working yet for invm chains
+        if 1 :
+            from TrigBphysHypo.TrigL2BMuMuFexConfig import L2BMuMuFex_DiMu_18invm60_noOS
+            from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu_18invm60_noVtx           
+            L2Fex  = L2BMuMuFex_DiMu_18invm60_noOS()
+            L2Hypo = L2BMuMuHypo_DiMu_18invm60_noVtx()
+        ## else :
+        ##     L2Fex = TrigMultiTrkFex_DiMu_noVtx_noOS()
+        ##     L2Hypo = EFMultiMuHypo_DiMu("L2MultiMuTrkHypo_DiMu_18invm60")  
+        ##     L2Hypo.bphysCollectionKey = "MultiTrkFex"
+        ##     L2Hypo.LowerMassCut= 18000.
+        ##     L2Hypo.UpperMassCut= 60000.
         EFFex  = EFBMuMuFex_DiMu_18invm60_noOS()
         EFHypo = EFBMuMuHypo_DiMu_18invm60_noVtx()
     elif ('11invm60' in topoAlgs) & ('noos' in topoAlgs) & ('novtx' not in topoAlgs):
@@ -363,8 +521,17 @@ def bMultipleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoSta
         from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu_11invm60
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_DiMu_11invm60_noOS
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_DiMu_11invm60
-        L2Fex  = L2BMuMuFex_DiMu_11invm60_noOS()
-        L2Hypo = L2BMuMuHypo_DiMu_11invm60()
+#        if not doL2MultiTrack :
+        # OI do MultiTrk is not working yet for invm chains
+        if 1 :
+            L2Fex  = L2BMuMuFex_DiMu_11invm60_noOS()
+            L2Hypo = L2BMuMuHypo_DiMu_11invm60()
+        ## else:
+        ##     L2Fex = TrigMultiTrkFex_DiMu_noVtx_noOS()
+        ##     L2Hypo = EFMultiMuHypo_DiMu("L2MultiMuTrkHypo_DiMu_11invm60")  
+        ##     L2Hypo.bphysCollectionKey = "MultiTrkFex"
+        ##     L2Hypo.LowerMassCut= 11000.
+        ##     L2Hypo.UpperMassCut= 60000.
         EFFex  = EFBMuMuFex_DiMu_11invm60_noOS()
         EFHypo = EFBMuMuHypo_DiMu_11invm60()                   
     elif ('11invm24' in topoAlgs) & ('noos' in topoAlgs) & ('novtx' not in topoAlgs):
@@ -372,8 +539,18 @@ def bMultipleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoSta
         from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu_11invm24
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_DiMu_11invm24_noOS
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_DiMu_11invm24
-        L2Fex  = L2BMuMuFex_DiMu_11invm24_noOS()
-        L2Hypo = L2BMuMuHypo_DiMu_11invm24()
+#        if not doL2MultiTrack :
+        # OI do MultiTrk is not working yet for invm chains
+        if 1 :
+            L2Fex  = L2BMuMuFex_DiMu_11invm24_noOS()
+            L2Hypo = L2BMuMuHypo_DiMu_11invm24()
+        ## else :
+        ##     L2Fex = TrigMultiTrkFex_DiMu_noVtx_noOS()
+        ##     L2Hypo = EFMultiMuHypo_DiMu("L2MultiMuTrkHypo_DiMu_11invm24")  
+        ##     L2Hypo.bphysCollectionKey = "MultiTrkFex"
+        ##     L2Hypo.LowerMassCut= 11000.
+        ##     L2Hypo.UpperMassCut= 24000.
+        
         EFFex  = EFBMuMuFex_DiMu_11invm24_noOS()
         EFHypo = EFBMuMuHypo_DiMu_11invm24()
     elif ('24invm60' in topoAlgs) & ('noos' in topoAlgs) & ('novtx' not in topoAlgs):
@@ -381,8 +558,17 @@ def bMultipleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoSta
         from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu_24invm60
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_DiMu_24invm60_noOS
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_DiMu_24invm60
-        L2Fex  = L2BMuMuFex_DiMu_24invm60_noOS()
-        L2Hypo = L2BMuMuHypo_DiMu_24invm60()
+        ## if  doL2MultiTrack :
+        ##     L2Fex = TrigMultiTrkFex_DiMu_noVtx_noOS()
+        ##     L2Hypo = EFMultiMuHypo_DiMu("L2MultiMuTrkHypo_DiMu_24invm60")  
+        ##     L2Hypo.bphysCollectionKey = "MultiTrkFex"
+        ##     L2Hypo.LowerMassCut= 24000.
+        ##     L2Hypo.UpperMassCut= 60000.
+        ## else :
+        # OI do MultiTrk is not working yet for invm chains
+        if 1 :
+            L2Fex  = L2BMuMuFex_DiMu_24invm60_noOS()
+            L2Hypo = L2BMuMuHypo_DiMu_24invm60()
         EFFex  = EFBMuMuFex_DiMu_24invm60_noOS()
         EFHypo = EFBMuMuHypo_DiMu_24invm60()
     elif ('11invm60' in topoAlgs) & ('noos' in topoAlgs) & ('novtx' in topoAlgs):
@@ -390,8 +576,17 @@ def bMultipleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoSta
         from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu_11invm60_noVtx           
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_DiMu_11invm60_noOS
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_DiMu_11invm60_noVtx           
-        L2Fex  = L2BMuMuFex_DiMu_11invm60_noOS()
-        L2Hypo = L2BMuMuHypo_DiMu_11invm60_noVtx()
+#        if not doL2MultiTrack :
+        # OI do MultiTrk is not working yet for invm chains
+        if 1 :
+            L2Fex  = L2BMuMuFex_DiMu_11invm60_noOS()
+            L2Hypo = L2BMuMuHypo_DiMu_11invm60_noVtx()
+        ## else :
+        ##     L2Fex = TrigMultiTrkFex_DiMu_noVtx_noOS()
+        ##     L2Hypo = EFMultiMuHypo_DiMu_noVtx("L2MultiMuTrkHypo_DiMu_noVtx_11invm60")  
+        ##     L2Hypo.bphysCollectionKey = "MultiTrkFex"
+        ##     L2Hypo.LowerMassCut= 11000.
+        ##     L2Hypo.UpperMassCut= 60000.
         EFFex  = EFBMuMuFex_DiMu_11invm60_noOS()
         EFHypo = EFBMuMuHypo_DiMu_11invm60_noVtx()                   
     elif ('11invm24' in topoAlgs) & ('noos' in topoAlgs) & ('novtx' in topoAlgs):
@@ -399,8 +594,18 @@ def bMultipleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoSta
         from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu_11invm24_noVtx           
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_DiMu_11invm24_noOS
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_DiMu_11invm24_noVtx           
-        L2Fex  = L2BMuMuFex_DiMu_11invm24_noOS()
-        L2Hypo = L2BMuMuHypo_DiMu_11invm24_noVtx()
+#        if not doL2MultiTrack :
+        # OI do MultiTrk is not working yet for invm chains
+        if 1 :
+            L2Fex  = L2BMuMuFex_DiMu_11invm24_noOS()
+            L2Hypo = L2BMuMuHypo_DiMu_11invm24_noVtx()
+        ## else :
+        ##     L2Fex = TrigMultiTrkFex_DiMu_noVtx_noOS()
+        ##     L2Hypo = EFMultiMuHypo_DiMu_noVtx("L2MultiMuTrkHypo_DiMu_noVtx_11invm24")  
+        ##     L2Hypo.bphysCollectionKey = "MultiTrkFex"
+        ##     L2Hypo.LowerMassCut= 11000.
+        ##     L2Hypo.UpperMassCut= 24000.
+       
         EFFex  = EFBMuMuFex_DiMu_11invm24_noOS()
         EFHypo = EFBMuMuHypo_DiMu_11invm24_noVtx()
     elif ('24invm60' in topoAlgs) & ('noos' in topoAlgs) & ('novtx' in topoAlgs):
@@ -408,8 +613,17 @@ def bMultipleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoSta
         from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu_24invm60_noVtx           
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_DiMu_24invm60_noOS
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_DiMu_24invm60_noVtx           
-        L2Fex  = L2BMuMuFex_DiMu_24invm60_noOS()
-        L2Hypo = L2BMuMuHypo_DiMu_24invm60_noVtx()
+#        if not doL2MultiTrack :
+        # OI do MultiTrk is not working yet for invm chains
+        if 1 :
+            L2Fex  = L2BMuMuFex_DiMu_24invm60_noOS()
+            L2Hypo = L2BMuMuHypo_DiMu_24invm60_noVtx()
+        ## else :
+        ##     L2Fex = TrigMultiTrkFex_DiMu_noVtx_noOS()
+        ##     L2Hypo = EFMultiMuHypo_DiMu_noVtx("L2MultiMuTrkHypo_DiMu_noVtx_24invm60")  
+        ##     L2Hypo.bphysCollectionKey = "MultiTrkFex"
+        ##     L2Hypo.LowerMassCut= 24000.
+        ##     L2Hypo.UpperMassCut= 60000.
         EFFex  = EFBMuMuFex_DiMu_24invm60_noOS()
         EFHypo = EFBMuMuHypo_DiMu_24invm60_noVtx()
    
@@ -436,32 +650,47 @@ def bMultipleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoSta
             EFHypo.bphysCollectionKey = "EFMultiMuFex"
      
     elif ('bDimu' in topoAlgs) & ('novtx' in topoAlgs) & ('noos' in topoAlgs) & ('noL2' in topoAlgs):
-        from TrigBphysHypo.TrigL2BMuMuFexConfig  import L2BMuMuFex_DiMu_passL2
-        from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu_passL2
         from TrigBphysHypo.TrigEFBMuMuFexConfig  import EFBMuMuFex_DiMu_noOS
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_DiMu_noVtx
-        L2Fex  = L2BMuMuFex_DiMu_passL2() 
-        L2Hypo = L2BMuMuHypo_DiMu_passL2()
+        if not doL2MultiTrack :
+            from TrigBphysHypo.TrigL2BMuMuFexConfig  import L2BMuMuFex_DiMu_passL2
+            from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu_passL2
+            L2Fex  = L2BMuMuFex_DiMu_passL2() 
+            L2Hypo = L2BMuMuHypo_DiMu_passL2()
+        else :
+            L2Fex = TrigMultiTrkFex_DiMu_noCut()
+            L2Hypo = EFMultiMuHypo_DiMu_noCut("L2MultiMuTrkHypo_noCut")
+            L2Hypo.bphysCollectionKey = "MultiTrkFex"
         EFFex  = EFBMuMuFex_DiMu_noOS()
         EFHypo = EFBMuMuHypo_DiMu_noVtx()        
     elif ('bDimu' in topoAlgs) & ('novtx' in topoAlgs) & ('noos' in topoAlgs):
-        from TrigBphysHypo.TrigL2BMuMuFexConfig  import L2BMuMuFex_DiMu_noOS
-        from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu_noVtx
+        if not doL2MultiTrack :
+            from TrigBphysHypo.TrigL2BMuMuFexConfig  import L2BMuMuFex_DiMu_noOS
+            from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu_noVtx
+            L2Fex  = L2BMuMuFex_DiMu_noOS() 
+            L2Hypo = L2BMuMuHypo_DiMu_noVtx()
+        else :
+            L2Fex = TrigMultiTrkFex_DiMu_noVtx_noOS()
+            L2Hypo = EFMultiMuHypo_DiMu_noVtx("L2MultiMuTrkHypo_noVtx")
+            L2Hypo.bphysCollectionKey = "MultiTrkFex"
         from TrigBphysHypo.TrigEFBMuMuFexConfig  import EFBMuMuFex_DiMu_noOS
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_DiMu_noVtx
-        L2Fex  = L2BMuMuFex_DiMu_noOS() 
-        L2Hypo = L2BMuMuHypo_DiMu_noVtx()
         EFFex  = EFBMuMuFex_DiMu_noOS()
         EFHypo = EFBMuMuHypo_DiMu_noVtx()        
     elif ('bDimu' in topoAlgs) & ('noinvm' in topoAlgs) & ('novtx' in topoAlgs) & ('ss' in topoAlgs):
-        from TrigBphysHypo.TrigL2BMuMuFexConfig  import L2BMuMuFex_DiMu_noinvm_SS
-        from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu_noinvm_noVtx
         from TrigBphysHypo.TrigEFBMuMuFexConfig  import EFBMuMuFex_DiMu_noinvm_SS
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_DiMu_noinvm_noVtx
-        L2Fex  = L2BMuMuFex_DiMu_noinvm_SS() 
-        L2Hypo = L2BMuMuHypo_DiMu_noinvm_noVtx()
+        if not doL2MultiTrack :
+            from TrigBphysHypo.TrigL2BMuMuFexConfig  import L2BMuMuFex_DiMu_noinvm_SS
+            from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu_noinvm_noVtx
+            L2Fex  = L2BMuMuFex_DiMu_noinvm_SS() 
+            L2Hypo = L2BMuMuHypo_DiMu_noinvm_noVtx()
+        else :
+            L2Fex = TrigMultiTrkFex_DiMu_noVtx_noM_SS()
+            L2Hypo = EFMultiMuHypo_DiMu_noCut("L2MultiMuTrkHypo_noCut")
+            L2Hypo.bphysCollectionKey = "MultiTrkFex"
         EFFex  = EFBMuMuFex_DiMu_noinvm_SS()
-        EFHypo = EFBMuMuHypo_DiMu_noinvm_noVtx()	
+        EFHypo = EFBMuMuHypo_DiMu_noinvm_noVtx()    
     elif ('bJpsimumu' in topoAlgs) & ('noid' in topoAlgs):
         from TrigBphysHypo.TrigL2BMuMuFexConfig import L2BMuMuFex_noId
         from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_Jpsi_noId
@@ -476,8 +705,13 @@ def bMultipleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoSta
         from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu_passL2
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_DiMu
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_DiMu
-        L2Fex  = L2BMuMuFex_DiMu_passL2() 
-        L2Hypo = L2BMuMuHypo_DiMu_passL2()
+        if not doL2MultiTrack :
+            L2Fex  = L2BMuMuFex_DiMu_passL2() 
+            L2Hypo = L2BMuMuHypo_DiMu_passL2()
+        else :
+            L2Fex = TrigMultiTrkFex_DiMu_noCut()
+            L2Hypo = EFMultiMuHypo_DiMu_noCut("L2MultiMuTrkHypo_noCut")
+            L2Hypo.bphysCollectionKey = "MultiTrkFex"
         EFFex  = EFBMuMuFex_DiMu()
         EFHypo = EFBMuMuHypo_DiMu() 
         if ('nscan' in chainDict['chainName'] ): # do not do L2 at all; expect one TE
@@ -490,8 +724,13 @@ def bMultipleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoSta
         from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_Jpsi_passL2
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_Jpsi
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_Jpsi
-        L2Fex  = L2BMuMuFex_Jpsi_passL2()
-        L2Hypo = L2BMuMuHypo_Jpsi_passL2()
+        if not doL2MultiTrack :
+            L2Fex  = L2BMuMuFex_Jpsi_passL2()
+            L2Hypo = L2BMuMuHypo_Jpsi_passL2()
+        else :
+            L2Fex = TrigMultiTrkFex_DiMu_noCut()
+            L2Hypo = EFMultiMuHypo_DiMu_noCut("L2MultiMuTrkHypo_noCut")
+            L2Hypo.bphysCollectionKey = "MultiTrkFex"
         EFFex  = EFBMuMuFex_Jpsi()
         EFHypo = EFBMuMuHypo_Jpsi() 
         if ('nscan' in chainDict['chainName'] ): # do not do L2 at all; expect one TE
@@ -504,8 +743,13 @@ def bMultipleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoSta
         from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu_passL2
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_B
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_B
-        L2Fex  = L2BMuMuFex_DiMu_passL2()
-        L2Hypo = L2BMuMuHypo_DiMu_passL2()
+        if not doL2MultiTrack :
+            L2Fex  = L2BMuMuFex_DiMu_passL2()
+            L2Hypo = L2BMuMuHypo_DiMu_passL2()
+        else :
+            L2Fex = TrigMultiTrkFex_DiMu_noCut()
+            L2Hypo = EFMultiMuHypo_DiMu_noCut("L2MultiMuTrkHypo_noCut")
+            L2Hypo.bphysCollectionKey = "MultiTrkFex"
         EFFex  = EFBMuMuFex_B()
         EFHypo = EFBMuMuHypo_B() 
     elif ('bDimu' in topoAlgs) & ('noEFbph' in topoAlgs):
@@ -513,8 +757,14 @@ def bMultipleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoSta
         from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_passEF
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_passEF
-        L2Fex  = L2BMuMuFex_DiMu() 
-        L2Hypo = L2BMuMuHypo_DiMu()
+        if not doL2MultiTrack :
+            L2Fex  = L2BMuMuFex_DiMu() 
+            L2Hypo = L2BMuMuHypo_DiMu()
+        else :
+            L2Fex = TrigMultiTrkFex_DiMu()
+            L2Hypo = EFMultiMuHypo_DiMu("L2MultiMuTrkHypo_DiMu")
+            L2Hypo.bphysCollectionKey = "MultiTrkFex"
+
         EFFex  = EFBMuMuFex_passEF()
         EFHypo = EFBMuMuHypo_passEF() 
     elif ('bJpsimumu' in topoAlgs) & ('noEFbph' in topoAlgs):
@@ -522,8 +772,13 @@ def bMultipleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoSta
         from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_Jpsi
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_passEF
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_passEF
-        L2Fex  = L2BMuMuFex_Jpsi()
-        L2Hypo = L2BMuMuHypo_Jpsi()
+        if not doL2MultiTrack :
+            L2Fex  = L2BMuMuFex_Jpsi()
+            L2Hypo = L2BMuMuHypo_Jpsi()
+        else :
+            L2Fex = TrigMultiTrkFex_DiMu()
+            L2Hypo = EFMultiMuHypo_Jpsi("L2MultiMuTrkHypo_Jpsi")  
+            L2Hypo.bphysCollectionKey = "MultiTrkFex"
         EFFex  = EFBMuMuFex_passEF()
         EFHypo = EFBMuMuHypo_passEF() 
     # Tight Chi2 variants
@@ -532,8 +787,13 @@ def bMultipleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoSta
         from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_Jpsi
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_Jpsi
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_Jpsi_tightChi2
-        L2Fex  = L2BMuMuFex_Jpsi()
-        L2Hypo = L2BMuMuHypo_Jpsi()
+        if not doL2MultiTrack :
+            L2Fex  = L2BMuMuFex_Jpsi()
+            L2Hypo = L2BMuMuHypo_Jpsi()
+        else :
+            L2Fex = TrigMultiTrkFex_DiMu()
+            L2Hypo = EFMultiMuHypo_Jpsi("L2MultiMuTrkHypo_Jpsi")  
+            L2Hypo.bphysCollectionKey = "MultiTrkFex"
         EFFex  = EFBMuMuFex_Jpsi()
         EFHypo = EFBMuMuHypo_Jpsi_tightChi2() 
     elif ('bDimu' in topoAlgs) & ('tightChi2' in topoAlgs):
@@ -541,8 +801,14 @@ def bMultipleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoSta
         from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_DiMu
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_DiMu_tightChi2
-        L2Fex  = L2BMuMuFex_DiMu()
-        L2Hypo = L2BMuMuHypo_DiMu()
+        if not doL2MultiTrack :
+            L2Fex  = L2BMuMuFex_DiMu()
+            L2Hypo = L2BMuMuHypo_DiMu()
+        else :
+            L2Fex = TrigMultiTrkFex_DiMu()
+            L2Hypo = EFMultiMuHypo_DiMu("L2MultiMuTrkHypo_DiMu")  
+            L2Hypo.bphysCollectionKey = "MultiTrkFex"
+
         EFFex  = EFBMuMuFex_DiMu()
         EFHypo = EFBMuMuHypo_DiMu_tightChi2() 
     elif ('bBmumu' in topoAlgs) & ('tightChi2' in topoAlgs):
@@ -550,8 +816,13 @@ def bMultipleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoSta
         from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_B
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_B
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_B_tightChi2
-        L2Fex  = L2BMuMuFex_B()
-        L2Hypo = L2BMuMuHypo_B()
+        if not doL2MultiTrack :
+            L2Fex  = L2BMuMuFex_B()
+            L2Hypo = L2BMuMuHypo_B()
+        else :
+            L2Fex = TrigMultiTrkFex_DiMu()
+            L2Hypo = EFMultiMuHypo_BMeson("L2MultiMuTrkHypo_BMeson")  
+            L2Hypo.bphysCollectionKey = "MultiTrkFex"
         EFFex  = EFBMuMuFex_B()
         EFHypo = EFBMuMuHypo_B_tightChi2() 
     elif ('bUpsimumu' in topoAlgs) & ('tightChi2' in topoAlgs):
@@ -559,8 +830,14 @@ def bMultipleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoSta
         from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_Upsi
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_Upsi
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_Upsi_tightChi2
-        L2Fex  = L2BMuMuFex_Upsi()
-        L2Hypo = L2BMuMuHypo_Upsi()
+        if not doL2MultiTrack :
+            L2Fex  = L2BMuMuFex_Upsi()
+            L2Hypo = L2BMuMuHypo_Upsi()
+        else :
+            L2Fex = TrigMultiTrkFex_DiMu()
+            L2Hypo = EFMultiMuHypo_Upsi("L2MultiMuTrkHypo_Upsi")  
+            L2Hypo.bphysCollectionKey = "MultiTrkFex"
+
         EFFex  = EFBMuMuFex_Upsi()
         EFHypo = EFBMuMuHypo_Upsi_tightChi2() 
     # Lxy > 0 variants
@@ -569,8 +846,13 @@ def bMultipleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoSta
         from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_Jpsi
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_Jpsi
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_Jpsi_Lxy0
-        L2Fex  = L2BMuMuFex_Jpsi()
-        L2Hypo = L2BMuMuHypo_Jpsi()
+        if not doL2MultiTrack :
+            L2Fex  = L2BMuMuFex_Jpsi()
+            L2Hypo = L2BMuMuHypo_Jpsi()
+        else :
+            L2Fex = TrigMultiTrkFex_DiMu()
+            L2Hypo = EFMultiMuHypo_Jpsi("L2MultiMuTrkHypo_Jpsi")  
+            L2Hypo.bphysCollectionKey = "MultiTrkFex"
         EFFex  = EFBMuMuFex_Jpsi()
         EFHypo = EFBMuMuHypo_Jpsi_Lxy0() 
     elif ('bDimu' in topoAlgs) & ('Lxy0' in topoAlgs):
@@ -578,8 +860,13 @@ def bMultipleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoSta
         from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_DiMu
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_DiMu_Lxy0
-        L2Fex  = L2BMuMuFex_DiMu()
-        L2Hypo = L2BMuMuHypo_DiMu()
+        if not doL2MultiTrack :
+            L2Fex  = L2BMuMuFex_DiMu()
+            L2Hypo = L2BMuMuHypo_DiMu()
+        else :
+            L2Fex = TrigMultiTrkFex_DiMu()
+            L2Hypo = EFMultiMuHypo_DiMu("L2MultiMuTrkHypo_DiMu") 
+            L2Hypo.bphysCollectionKey = "MultiTrkFex"
         EFFex  = EFBMuMuFex_DiMu()
         EFHypo = EFBMuMuHypo_DiMu_Lxy0() 
     elif ('bBmumu' in topoAlgs) & ('Lxy0' in topoAlgs):
@@ -587,8 +874,13 @@ def bMultipleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoSta
         from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_B
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_B
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_B_Lxy0
-        L2Fex  = L2BMuMuFex_B()
-        L2Hypo = L2BMuMuHypo_B()
+        if not doL2MultiTrack :
+            L2Fex  = L2BMuMuFex_B()
+            L2Hypo = L2BMuMuHypo_B()
+        else :
+            L2Fex = TrigMultiTrkFex_DiMu()
+            L2Hypo = EFMultiMuHypo_BMeson("L2MultiMuTrkHypo_BMeson")  
+            L2Hypo.bphysCollectionKey = "MultiTrkFex"
         EFFex  = EFBMuMuFex_B()
         EFHypo = EFBMuMuHypo_B_Lxy0() 
     # legacy vertexing
@@ -615,6 +907,58 @@ def bMultipleOptionTopos(theChainDef, chainDict, inputTEsL2, inputTEsEF, topoSta
 
 
 ###################################################################################
+###################################################################################
+def bMuTrackPEB(theChainDef,chainDict, inputTEsL2, inputTEsEF, topoStartFrom):
+
+    EFChainName = "EF_" + chainDict['chainName']
+    topoAlgs = chainDict["topo"]
+
+    mtopo = topoAlgs[0]
+    TEname = findL2teBaseName(chainDict['chainName'],topoAlgs)
+    L2TEname = "L2_" + TEname+'_'+mtopo+'_'+chainDict['L1item']
+
+    #--- 1: L2 first add large cone before duing superEF
+    #[trkfast, trkprec] = TrigInDetSequence("Bphysics", "bphysics", "IDTrig").getSequence()
+    [trkfast, trkprec] = TrigInDetSequence("BphysHighPt", "bphysHighPt", "IDTrig").getSequence()
+    L2TEcount = 0; L2outTEsfast = [];  L2outTEsprec = [];
+    for L2inputTE in inputTEsL2:
+        L2TEcount = L2TEcount + 1
+        L2outputTEfast = L2inputTE+'_idfast_'+str(L2TEcount)
+        L2outTEsfast.append(L2outputTEfast)
+        theChainDef.addSequence(trkfast,L2inputTE, L2outputTEfast)
+        if not "L2Trk2" in chainDict['chainName'] :
+            L2outputTEprec = L2inputTE+'_idprec_'+str(L2TEcount)
+            L2outTEsprec.append(L2outputTEprec)
+            theChainDef.addSequence(trkprec,L2outputTEfast, L2outputTEprec)
+
+    theChainDef.addSignatureL2( L2outTEsfast)
+    theChainDef.addSignatureL2( L2outTEsprec)
+    theChainDef.addSequence([L2outTEsfast,L2outTEsprec],L2outputTEprec, L2TEname+"Trk")
+
+
+    #--- 2: then add L2 multi trk fex+hypo for Jpsi
+        
+    from TrigBphysHypo.TrigMultiTrkFexConfig import TrigMultiTrkFex_Jpsi
+    from TrigBphysHypo.TrigEFMultiMuHypoConfig import EFMultiMuHypo_Jpsi
+    L2Fex = TrigMultiTrkFex_Jpsi()
+    #L2Fex.trackCollectionKey = "InDetTrigTrackingxAODCnv_Bphysics_IDTrig"
+    L2Hypo = EFMultiMuHypo_Jpsi("L2MultiMuTrkHypo_Jpsi")
+    L2Hypo.bphysCollectionKey = "MultiTrkFex"
+    theChainDef.addSequence([L2Fex, L2Hypo], L2outTEsprec , L2TEname+"MultiTrk")
+    theChainDef.addSignatureL2([L2TEname+"MultiTrk"])
+
+    
+    #---- 3 : last step - setup PEB
+    from TrigDetCalib.TrigDetCalibConfig import TrigCheckForMuons_peb075
+    bphysROBWriter = TrigCheckForMuons_peb075("bphysROBWriter_peb075")
+
+    EFTEname = "EF_" + chainDict['chainName']+"_1"
+    inputTEsEF = theChainDef.signatureList[-1]['listOfTriggerElements']
+    theChainDef.addSequence([bphysROBWriter],inputTEsEF, EFTEname)
+    theChainDef.addSignature(theChainDef.signatureList[-1]['signature_counter']+1, [EFTEname])
+
+    return theChainDef
+
 ###################################################################################
 def bMuTrack(theChainDef,chainDict, inputTEsL2, inputTEsEF, topoStartFrom):
 
@@ -626,7 +970,7 @@ def bMuTrack(theChainDef,chainDict, inputTEsL2, inputTEsEF, topoStartFrom):
 
     if ('bJpsi' in topoAlgs) & ('Trkloose' in topoAlgs):
         from TrigBphysHypo.TrigEFTrkMassFexConfig  import EFTrkMassFex_Jpsimumu_loose
-        from TrigBphysHypo.TrigEFTrkMassHypoConfig import EFTrkMassHypo_Jpsimumu_loose        
+        from TrigBphysHypo.TrigEFTrkMassHypoConfig import EFTrkMassHypo_Jpsimumu_loose
         EFFex  = EFTrkMassFex_Jpsimumu_loose()
         EFHypo = EFTrkMassHypo_Jpsimumu_loose()
 
@@ -639,31 +983,30 @@ def bMuTrack(theChainDef,chainDict, inputTEsL2, inputTEsEF, topoStartFrom):
     #        L2TEcount = L2TEcount+1
     #        L2outputTE = L2inputTE+'_idl2fast_'+str(L2TEcount)
     #        L2outTEs.append(L2outputTE)
-    #        #theChainDef.addSequence([theTrigIdscan],L2inputTE, L2outputTE)            
-    #        theChainDef.addSequence(trkfast,L2inputTE, L2outputTE)            
+    #        #theChainDef.addSequence([theTrigIdscan],L2inputTE, L2outputTE)
     #    theChainDef.addSignatureL2(L2outTEs)
-    #        
+    #
     #    theChainDef.addSequence( [L2Fex,  L2Hypo], L2outTEs, L2ChainName)
     ##    theChainDef.addSequence( [L2Fex,  L2Hypo], inputTEsL2, L2ChainName)
     #    theChainDef.addSignatureL2([L2ChainName])
     #
     #
     #
-    #    EFTEcount = 0; EFoutTEsprec = []; 
+    #    EFTEcount = 0; EFoutTEsprec = [];
     #    for EFinputTE in inputTEsEF:
-    #        EFTEcount = EFTEcount + 1        
+    #        EFTEcount = EFTEcount + 1
     #        EFoutputTEprec = EFinputTE+'_idefprec_'+str(EFTEcount)
     #        EFoutTEsprec.append(EFoutputTEprec)
     #        theChainDef.addSequence(trkprec,EFinputTE, EFoutputTEprec)
     #    theChainDef.addSignature(theChainDef.signatureList[-1]['signature_counter']+1, EFoutTEsprec)
     #
     #    theChainDef.addSequence([EFFex, EFHypo],EFoutTEsprec,EFChainName)
-    #    theChainDef.addSignature(theChainDef.signatureList[-1]['signature_counter']+1, [EFChainName])       
+    #    theChainDef.addSignature(theChainDef.signatureList[-1]['signature_counter']+1, [EFChainName])
 
 
     # Sequence where only the EF mu+track stage is run. FTF+prec tracking run first
     #------- EF Sequences -------
-    EFTEcount = 0; EFoutTEsfast = []; 
+    EFTEcount = 0; EFoutTEsfast = [];
     for EFinputTE in inputTEsEF:
         EFTEcount = EFTEcount + 1
         EFoutputTEfast = EFinputTE+'_idfast_'+str(EFTEcount)
@@ -671,10 +1014,10 @@ def bMuTrack(theChainDef,chainDict, inputTEsL2, inputTEsEF, topoStartFrom):
         theChainDef.addSequence(trkfast,EFinputTE, EFoutputTEfast)
 
     theChainDef.addSignature(theChainDef.signatureList[-1]['signature_counter']+1, EFoutTEsfast)
-    
-    EFTEcount = 0; EFoutTEsprec = []; 
+
+    EFTEcount = 0; EFoutTEsprec = [];
     for EFinputTE in inputTEsEF:
-        EFTEcount = EFTEcount + 1        
+        EFTEcount = EFTEcount + 1
         EFinputTEprec  = EFinputTE+'_idfast_'+str(EFTEcount)
         EFoutputTEprec = EFinputTE+'_idprec_'+str(EFTEcount)
         EFoutTEsprec.append(EFoutputTEprec)
@@ -691,7 +1034,7 @@ def bMuTrack(theChainDef,chainDict, inputTEsL2, inputTEsEF, topoStartFrom):
 
 ###################################################################################
 ###################################################################################
-def bBmumuxTopos(theChainDef,chainDict, inputTEsL2, inputTEsEF, topoStartFrom):
+def bBmumuxTopos(theChainDef,chainDict, inputTEsL2, inputTEsEF, topoStartFrom, doL2MultiTrack = False):
     L2ChainName = "L2_" + chainDict['chainName']
     EFChainName = "EF_" + chainDict['chainName']
     topoAlgs = chainDict["topo"]
@@ -708,6 +1051,8 @@ def bBmumuxTopos(theChainDef,chainDict, inputTEsL2, inputTEsEF, topoStartFrom):
         L2TEname = "L2_" + TEname+myTopoString+'_tsf_'+chainDict['L1item']
         topo2StartFrom = L2TEname
 
+    from TrigBphysHypo.TrigMultiTrkFexConfig import TrigMultiTrkFex_DiMu,TrigMultiTrkFex_DiMu_noCut,TrigMultiTrkFex_DiMu_noVtx_noOS,TrigMultiTrkFex_DiMu_noVtx_noM_SS 
+    from TrigBphysHypo.TrigEFMultiMuHypoConfig import EFMultiMuHypo_DiMu_noCut,EFMultiMuHypo_DiMu_noVtx,EFMultiMuHypo_DiMu,EFMultiMuHypo_BMeson,EFMultiMuHypo_Jpsi,EFMultiMuHypo_Upsi,EFMultiMuHypo_2700, EFMultiMuHypo_Bmumux
     # replace L2 Te (and EF tsf) with bBmumuxv2 naming
     # same underlying sequence is used
     # Warning if ever switch to v3 implementation -- this should be changed / tested 
@@ -742,55 +1087,40 @@ def bBmumuxTopos(theChainDef,chainDict, inputTEsL2, inputTEsEF, topoStartFrom):
 #    from InDetTrigRecExample.EFInDetConfig import *
 #    theTrigEFIDInsideOut = TrigEFIDInsideOut_Bphysics().getSequence()
 
-    #JWW: Remove Bmumux L2 Fex and Hypo. Use a simple BMuMu Fex and Hypo instead
-    #from TrigBphysHypo.TrigL2BMuMuXHypoConfig import L2BMuMuXHypo_1
-    #L2Hypo = L2BMuMuXHypo_1()
 
     if 'BcmumuDsloose' in topoAlgs:
-        #from TrigBphysHypo.TrigL2BMuMuXFexConfig import L2BMuMuXFex_BcMuMuDs
         from TrigBphysHypo.TrigEFBMuMuXFexConfig import EFBMuMuXFex_BcMuMuDs
         from TrigBphysHypo.TrigEFBMuMuXHypoConfig import EFBMuMuXHypo_BcMuMuDs
-        #L2Fex = L2BMuMuXFex_BcMuMuDs()
         EFFex = EFBMuMuXFex_BcMuMuDs()
         EFHypo = EFBMuMuXHypo_BcMuMuDs()
         
     elif 'LbmumuLambda' in topoAlgs:
-        #from TrigBphysHypo.TrigL2BMuMuXFexConfig import L2BMuMuXFex_BcMuMuDs
         from TrigBphysHypo.TrigEFBMuMuXFexConfig import EFBMuMuXFex_LbMuMuLambda
         from TrigBphysHypo.TrigEFBMuMuXHypoConfig import EFBMuMuXHypo_LbMuMuLambda
-        #L2Fex = L2BMuMuXFex_BcMuMuDs()
         EFFex = EFBMuMuXFex_LbMuMuLambda()
         EFHypo = EFBMuMuXHypo_LbMuMuLambda()
         
     elif 'BpmumuKp' in topoAlgs:
-        #from TrigBphysHypo.TrigL2BMuMuXFexConfig import L2BMuMuXFex_BplusMuMuKplus
         from TrigBphysHypo.TrigEFBMuMuXFexConfig import EFBMuMuXFex_BplusMuMuKplus
         from TrigBphysHypo.TrigEFBMuMuXHypoConfig import EFBMuMuXHypo_BplusMuMuKplus
-        #L2Fex = L2BMuMuXFex_BplusMuMuKplus()
         EFFex = EFBMuMuXFex_BplusMuMuKplus()
         EFHypo = EFBMuMuXHypo_BplusMuMuKplus()
         
     elif 'BsmumuPhi' in topoAlgs:
-        #from TrigBphysHypo.TrigL2BMuMuXFexConfig import L2BMuMuXFex_BplusMuMuKplus
         from TrigBphysHypo.TrigEFBMuMuXFexConfig import EFBMuMuXFex_BsMuMuPhi
         from TrigBphysHypo.TrigEFBMuMuXHypoConfig import EFBMuMuXHypo_BsMuMuPhi
-        #L2Fex = L2BMuMuXFex_BplusMuMuKplus()
         EFFex = EFBMuMuXFex_BsMuMuPhi()
         EFHypo = EFBMuMuXHypo_BsMuMuPhi()
         
     elif 'BsJpsiPhi' in topoAlgs:
-        #from TrigBphysHypo.TrigL2BMuMuXFexConfig import L2BMuMuXFex_BplusMuMuKplus
         from TrigBphysHypo.TrigEFBMuMuXFexConfig import EFBMuMuXFex_BsJpsiPhi
         from TrigBphysHypo.TrigEFBMuMuXHypoConfig import EFBMuMuXHypo_BsJpsiPhi
-        #L2Fex = L2BMuMuXFex_BplusMuMuKplus()
         EFFex = EFBMuMuXFex_BsJpsiPhi()
         EFHypo = EFBMuMuXHypo_BsJpsiPhi()
 
     elif 'Taumumux' in topoAlgs:
-        #from TrigBphysHypo.TrigL2BMuMuXFexConfig import L2BMuMuXFex_TauMuMuX
         from TrigBphysHypo.TrigEFBMuMuXFexConfig import EFBMuMuXFex_TauMuMuX
         from TrigBphysHypo.TrigEFBMuMuXHypoConfig import EFBMuMuXHypo_TauMuMuX
-        #L2Fex = L2BMuMuXFex_TauMuMuX()
         EFFex = EFBMuMuXFex_TauMuMuX()
         EFHypo = EFBMuMuXHypo_TauMuMuX()
 
@@ -808,12 +1138,8 @@ def bBmumuxTopos(theChainDef,chainDict, inputTEsL2, inputTEsEF, topoStartFrom):
            EFFex  =  EFBMuMuXFex_FTK()
            EFHypo = EFBMuMuXHypo_FTK()
         else:
-           #from TrigBphysHypo.TrigL2BMuMuFexConfig import L2BMuMuFex_1
-           #from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_1
            from TrigBphysHypo.TrigEFBMuMuXFexConfig import EFBMuMuXFex_1
            from TrigBphysHypo.TrigEFBMuMuXHypoConfig import EFBMuMuXHypo_1  
-           #L2Fex  = L2BMuMuFex_1()
-           #L2Hypo = L2BMuMuHypo_1()  
            EFFex  =  EFBMuMuXFex_1()
            EFHypo = EFBMuMuXHypo_1()
            # legacy vertexing
@@ -822,41 +1148,54 @@ def bBmumuxTopos(theChainDef,chainDict, inputTEsL2, inputTEsEF, topoStartFrom):
                EFFex  =  EFBMuMuXFex_1_legacyVtx()
         
     elif 'bBmumuxv3' in topoAlgs:
-        print 'MOOOO in bBmumuxv3'
+#        print 'MOOOO in bBmumuxv3'
         from TrigBphysHypo.TrigL2BMuMuXHypoConfig import L2BMuMuXHypo_EF
         from TrigBphysHypo.TrigL2BMuMuXFexConfig import L2BMuMuXFex_EF
         EFFex  =  L2BMuMuXFex_EF()
         EFHypo = L2BMuMuXHypo_EF()
         
     else:
-        #from TrigBphysHypo.TrigL2BMuMuXFexConfig import L2BMuMuXFex_1
         from TrigBphysHypo.TrigEFBMuMuFexConfig import EFBMuMuFex_Jpsi
         from TrigBphysHypo.TrigEFBMuMuHypoConfig import EFBMuMuHypo_Jpsi
-        #L2Fex = L2BMuMuXFex_1()
         EFFex = EFBMuMuFex_Jpsi()
         EFHypo = EFBMuMuHypo_Jpsi()
        
 
+    from TrigBphysHypo.TrigEFMultiMuHypoConfig import EFMultiMuHypo_Bmumux
     # Use simple di-muon fex/hypo for L2
     # Note - may need to change oppsign and vtx requirements
-    if 'bBmumuxv3' in topoAlgs:
-        print 'MOOOO2 in bBmumuxv3'
+    # noL2 option to skip dimuon selection at L2
+
+    if 'noL2' in topoAlgs:
+        if doL2MultiTrack :
+            L2Fex = TrigMultiTrkFex_DiMu_noCut()
+            L2Hypo = EFMultiMuHypo_DiMu_noCut("L2MultiMuTrkHypo_DiMu_noCut")  
+            L2Hypo.bphysCollectionKey = "MultiTrkFex"
+        else :
+            from TrigBphysHypo.TrigL2BMuMuFexConfig import L2BMuMuFex_DiMu_passL2
+            from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu_passL2
+            L2Fex  = L2BMuMuFex_DiMu_passL2()
+            L2Hypo = L2BMuMuHypo_DiMu_passL2()
+    elif 'bBmumuxv3' in topoAlgs:
+#        print 'MOOOO2 in bBmumuxv3'
         from TrigBphysHypo.TrigL2BMuMuXHypoConfig import L2BMuMuXHypo_1
         from TrigBphysHypo.TrigL2BMuMuXFexConfig import L2BMuMuXFex_1
         L2Fex = L2BMuMuXFex_1()
         L2Hypo = L2BMuMuXHypo_1()
-    else:
-        from TrigBphysHypo.TrigL2BMuMuFexConfig import L2BMuMuFex_1
-        from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_1
-        L2Fex  = L2BMuMuFex_1()
-        L2Hypo = L2BMuMuHypo_1()
+
+    else :
+        if  doL2MultiTrack :
+            from TrigBphysHypo.TrigMultiTrkFexConfig import TrigMultiTrkFex_DiMu
+            from TrigBphysHypo.TrigEFMultiMuHypoConfig import EFMultiMuHypo_Bmumux
+            L2Fex = TrigMultiTrkFex_DiMu()
+            L2Hypo = EFMultiMuHypo_Bmumux("EFMultiMuHypo_Bmumux")  
+            L2Hypo.bphysCollectionKey = "MultiTrkFex"
+        else :
+            from TrigBphysHypo.TrigL2BMuMuFexConfig import L2BMuMuFex_1
+            from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_1
+            L2Fex  = L2BMuMuFex_1()
+            L2Hypo = L2BMuMuHypo_1()
         
-    # noL2 option to skip dimuon selection at L2
-    if 'noL2' in topoAlgs:
-        from TrigBphysHypo.TrigL2BMuMuFexConfig import L2BMuMuFex_DiMu_passL2
-        from TrigBphysHypo.TrigL2BMuMuHypoConfig import L2BMuMuHypo_DiMu_passL2
-        L2Fex  = L2BMuMuFex_DiMu_passL2()
-        L2Hypo = L2BMuMuHypo_DiMu_passL2()
 
     if 'bBmumuxv3' in topoAlgs:
         L2TEcount = 0; L2outTEs = []
diff --git a/Trigger/TriggerCommon/TriggerMenu/python/menu/MC_pp_v7.py b/Trigger/TriggerCommon/TriggerMenu/python/menu/MC_pp_v7.py
index 7584b1c9bb34..b0d79b41c458 100644
--- a/Trigger/TriggerCommon/TriggerMenu/python/menu/MC_pp_v7.py
+++ b/Trigger/TriggerCommon/TriggerMenu/python/menu/MC_pp_v7.py
@@ -1299,6 +1299,16 @@ def setupMenu():
         ['3mu6_wOvlpRm_bDimu',                   'L1_3MU6', [], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
         ['2mu4_wOvlpRm_bDimu_noinvm_novtx_ss',    'L1_2MU4',     [], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],    
         
+        # chains with smart overlap removal , based on EF muons
+        ['mu4_bNocut',                    'L1_MU4',            [], [PhysicsStream], ['RATE:SingleMuon', 'BW:Muon'], -1],
+        ['2mu4_bNocut',                    'L1_2MU4',  [], [PhysicsStream], ['RATE:MultiMuon', 'BW:Muon'], -1],
+        ['3mu4_bNocut',          'L1_3MU4',           [], [PhysicsStream], ['RATE:MultiMuon', 'BW:Muon'], -1],
+        ['3mu4_mu2noL1_bNocut', 'L1_3MU4', ['L1_3MU4',''], [PhysicsStream], ['RATE:MultiMuon','BW:Muon'], -1,['serial',-1,['3mu4','mu2noL1']]],
+        ['2mu4_mu3_mu2noL1_bNocut_L13MU4', 'L1_3MU4', ['L1_2MU4','L1_MU4',''], [PhysicsStream], ['RATE:MultiMuon','BW:Muon'], -1,['serial',-1,['2mu4','mu3','mu2noL1']]],
+        ['3mu3_mu3noL1_bNocut_L13MU4', 'L1_3MU4', ['L1_3MU4',''], [PhysicsStream], ['RATE:MultiMuon','BW:Muon'], -1,['serial',-1,['3mu3','mu3noL1']]],
+        ['3mu4_mu4noL1_bNocut', 'L1_3MU4', ['L1_3MU4',''], [PhysicsStream], ['RATE:MultiMuon','BW:Muon'], -1,['serial',-1,['3mu4','mu4noL1']]],
+        ['4mu4_bNocut', 'L1_4MU4', ['L1_4MU4',''], [PhysicsStream], ['RATE:MultiMuon','BW:Muon'], -1,['serial',-1,['4mu4','']]],
+
         # chains with EF B-physics selection skipped
         ['2mu4_bJpsimumu_noEFbph',                    'L1_2MU4', [], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
         ['mu6_mu4_bJpsimumu_noEFbph',                 'L1_MU6_2MU4', ['L1_MU6','L1_MU4'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
@@ -1473,8 +1483,8 @@ def setupMenu():
         ['mu6_mu4_bJpsimumu_noL2',                 'L1_MU6_2MU4', ['L1_MU6','L1_MU4'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
         ['2mu6_bDimu_noL2',                    'L1_2MU6', [], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
         ['2mu6_bJpsimumu_noL2',                    'L1_2MU6', [], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
-        ## moved to phys (ATR-14352) ['mu11_nomucomb_2mu4noL1_nscan03_L1LFV-MU_bTau', 'L1_LFV-MU', ['L1_MU10','L2_mu11_nomucomb'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1,['serial',-1,['mu11_nomucomb','2mu4noL1_nscan03']]],
-        ## moved to phys (ATR-14352) ['mu11_nomucomb_mu6noL1_nscan03_L1LFV-MU_bTau', 'L1_LFV-MU', ['L1_MU10','L2_mu6_nomucomb'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1,['serial',-1,['mu11_nomucomb','mu6noL1_nscan03']]],
+        ## moved to phys (ATR-14352) ['mu11_2mu4noL1_nscan03_L1LFV-MU_bTau', 'L1_LFV-MU', ['L1_MU10','L2_mu11'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1,['serial',-1,['mu11','2mu4noL1_nscan03']]],
+        ## moved to phys (ATR-14352) ['mu11_mu6noL1_nscan03_L1LFV-MU_bTau', 'L1_LFV-MU', ['L1_MU10','L2_mu6'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1,['serial',-1,['mu11','mu6noL1_nscan03']]],
  
 # L1 topo # Simple OneBarrel and BarrelOnly #
 
@@ -1654,9 +1664,9 @@ def setupMenu():
        ['mu6_mu4_bDimu_L1BPH-2M9-MU6MU4_BPH-0DR15-MU6MU4','L1_BPH-2M9-MU6MU4_BPH-0DR15-MU6MU4', ['L1_MU6','L1_MU4'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1, False],
        ['mu6_mu4_bDimu_novtx_noos_L1BPH-2M9-MU6MU4_BPH-0DR15-MU6MU4','L1_BPH-2M9-MU6MU4_BPH-0DR15-MU6MU4', ['L1_MU6','L1_MU4'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1, False],
        
-       ['2mu6_nomucomb_L1LFV-MU6_bTau_delayed',  'L1_LFV-MU6', ['L1_2MU6'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1, False],
-       ['2mu6noL1_nomucomb_nscan03_L1LFV-MU6_bTau_delayed',  'L1_LFV-MU6', ['L1_2MU6'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1, False],
-       ['2mu6_nomucomb_L1LFV-MU6_bPhi',  'L1_LFV-MU6', ['L1_2MU6'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1, False],
+       ['2mu6_bTau_L1LFV-MU6_delayed',  'L1_LFV-MU6', ['L1_2MU6'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1, False],
+       ['2mu6noL1_bTau_L1LFV-MU6_delayed',  'L1_LFV-MU6', ['L1_2MU6'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1, False],
+       ['2mu6_bPhi_L1LFV-MU6',  'L1_LFV-MU6', ['L1_2MU6'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1, False],
 
        ### ATR-15263
        ['2mu4_bBmumux_LbmumuLambda', 'L1_2MU4', [], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
diff --git a/Trigger/TriggerCommon/TriggerMenu/python/menu/Physics_pp_v7.py b/Trigger/TriggerCommon/TriggerMenu/python/menu/Physics_pp_v7.py
index 7b1a6b2e1ef9..693c98251cd5 100644
--- a/Trigger/TriggerCommon/TriggerMenu/python/menu/Physics_pp_v7.py
+++ b/Trigger/TriggerCommon/TriggerMenu/python/menu/Physics_pp_v7.py
@@ -1840,15 +1840,14 @@ def setupMenu():
 
     TriggerFlags.BphysicsSlice.signatures = [
 
-        ['2mu6_nomucomb_bPhi',                     'L1_2MU6', [], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
-        ['mu11_nomucomb_mu6_nomucomb_bPhi',        'L1_MU11_2MU6', ['L1_MU11','L1_MU6'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1,['serial',-1,['mu11_nomucomb','mu6_nomucomb_bPhi']]],
-        ['mu11_nomucomb_mu6noL1_nscan03_L1MU11_2MU6_bPhi', 'L1_MU11_2MU6', ['L1_MU11','L2_mu6_nomucomb'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1,['serial',-1,['mu11_nomucomb','mu6noL1_nscan03_bPhi']]],
+        ['2mu6_bPhi',                     'L1_2MU6', [], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
+        ['mu11_mu6_bPhi',        'L1_MU11_2MU6', ['L1_MU11','L1_MU6'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1,['serial',-1,['mu11','mu6_bPhi']]],
+        ['mu11_mu6noL1_bPhi_L1MU11_2MU6', 'L1_MU11_2MU6', ['L1_MU11','L2_mu6'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1,['serial',-1,['mu11','mu6noL1_bPhi']]],
 
         ['mu6_mu4_bBmumux_BsmumuPhi_delayed',                    'L1_MU6_2MU4', ['L1_MU6','L1_MU4'], ['BphysDelayed'], ['RATE:BphysDelayed','BW:Bphys'], -1],
         ['2mu6_bBmumux_BsmumuPhi_delayed',                    'L1_2MU6', [], ['BphysDelayed'], ['RATE:BphysDelayed','BW:Bphys'], -1],
         ['mu10_mu6_bBmumux_BsmumuPhi_delayed',            'L1_MU10_2MU6', ['L1_MU10','L1_MU6'],['BphysDelayed'], ['RATE:BphysDelayed','BW:Bphys'], -1],
 
-        ['3mu4_nomucomb_bTau',            'L1_3MU4', [], [PhysicsStream], ['RATE:Bphysics', 'BW:Bphys'], -1],
         ['2mu4_bDimu',                    'L1_2MU4', [], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1], 
         ['2mu4_bDimu_noinvm_novtx_ss',    'L1_2MU4', [], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
         ['2mu4_bDimu_novtx_noos',         'L1_2MU4', [], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],  
@@ -1894,6 +1893,7 @@ def setupMenu():
         ['3mu4_bDimu',                    'L1_3MU4', [], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
         ['3mu4_bJpsi',                    'L1_3MU4', [], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
         ['3mu4_bTau',                     'L1_3MU4', [], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
+        ['3mu4_nomucomb_bTau',                     'L1_3MU4', [], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
         ['3mu4_bUpsi',                    'L1_3MU4', [], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
 
         ['3mu6_bDimu',                   'L1_3MU6', [], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
@@ -1959,14 +1959,14 @@ def setupMenu():
         ['2mu10_bUpsimumu',               'L1_2MU10', [], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
 
 
-        ['mu11_nomucomb_2mu4noL1_nscan03_L1MU11_2MU6_bTau', 'L1_MU11_2MU6', ['L1_MU11','L2_mu11_nomucomb'], [PhysicsStream, 'express'], ['RATE:Bphysics','BW:Bphys'], -1,['serial',-1,['mu11_nomucomb','2mu4noL1_nscan03']]],
-        ['mu11_nomucomb_mu6noL1_nscan03_L1MU11_2MU6_bTau', 'L1_MU11_2MU6', ['L1_MU11','L2_mu6_nomucomb'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1,['serial',-1,['mu11_nomucomb','mu6noL1_nscan03']]],
-        ['mu20_nomucomb_mu6noL1_nscan03_bTau', 'L1_MU20', ['L1_MU20','L2_mu20_nomucomb'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1,['serial',-1,['mu20_nomucomb','mu6noL1_nscan03']]],
+        ['mu11_2mu4noL1_bTau_L1MU11_2MU6', 'L1_MU11_2MU6', ['L1_MU11','L2_mu11'], [PhysicsStream, 'express'], ['RATE:Bphysics','BW:Bphys'], -1,['serial',-1,['mu11','2mu4noL1']]],
+        ['mu11_mu6noL1_bTau_L1MU11_2MU6', 'L1_MU11_2MU6', ['L1_MU11','L2_mu6'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1,['serial',-1,['mu11','mu6noL1']]],
+        ['mu20_mu6noL1_bTau', 'L1_MU20', ['L1_MU20','L2_mu20'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1,['serial',-1,['mu20','mu6noL1']]],
         ## LFV topo based nscan (ATR-14352)
-        ['mu11_nomucomb_2mu4noL1_nscan03_L1LFV-MU_bTau', 'L1_LFV-MU', ['L1_MU10','L2_mu11_nomucomb'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1,['serial',-1,['mu11_nomucomb','2mu4noL1_nscan03']]],      
+        ['mu11_2mu4noL1_bTau_L1LFV-MU', 'L1_LFV-MU', ['L1_MU10','L2_mu11'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1,['serial',-1,['mu11','2mu4noL1']]],    
 
-        ['mu6_nomucomb_2mu4_nomucomb_bTau_L1MU6_3MU4' , 'L1_MU6_3MU4',  ['L1_MU6','L1_2MU4'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
-        ['2mu6_nomucomb_mu4_nomucomb_bTau_L12MU6_3MU4', 'L1_2MU6_3MU4', ['L1_2MU6','L1_MU4'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
+        ['mu6_2mu4_bTau_L1MU6_3MU4' , 'L1_MU6_3MU4',  ['L1_MU6','L1_2MU4'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
+        ['2mu6_mu4_bTau_L12MU6_3MU4', 'L1_2MU6_3MU4', ['L1_2MU6','L1_MU4'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
         
         ['mu6_iloose_mu6_24invm60_noos_L1DY-BOX-2MU6', 'L1_DY-BOX-2MU6', ['L1_MU6','L1_MU6'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1, False],
         ['mu4_iloose_mu4_11invm60_noos_L1MU6_2MU4',    'L1_MU6_2MU4',    ['L1_MU4','L1_MU4'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
@@ -2159,17 +2159,29 @@ def setupMenu():
         ['3mu4_bUpsi_delayed',     									               'L1_3MU4', [], ['BphysDelayed'], ['RATE:BphysDelayed','BW:Bphys'], -1],
         ['mu6_2mu4_bJpsi_delayed', 																 'L1_MU6_3MU4', ['L1_MU6','L1_3MU4'], ['BphysDelayed'], ['RATE:BphysDelayed', 'BW:Bphys'], -1],
         ['mu6_2mu4_bUpsi_delayed', 																 'L1_MU6_3MU4', ['L1_MU6','L1_3MU4'], ['BphysDelayed'], ['RATE:BphysDelayed', 'BW:Bphys'], -1],
-        ['mu11_nomucomb_mu6noL1_nscan03_L1MU11_2MU6_bTau_delayed', 'L1_MU11_2MU6', ['L1_MU11','L2_mu6_nomucomb'], ['BphysDelayed'], ['RATE:BphysDelayed','BW:Bphys'], -1,['serial',-1,['mu11_nomucomb','mu6noL1_nscan03']]],
-        #moved to muons slice ['mu6_nomucomb_2mu4_nomucomb_delayed_L1MU6_3MU4',          'L1_MU6_3MU4',  ['L1_MU6','L1_2MU4'],          ['BphysDelayed'], ['RATE:BphysDelayed','BW:Bphys'], -1],
+        ['mu11_mu6noL1_bTau_L1MU11_2MU6_delayed', 'L1_MU11_2MU6', ['L1_MU11','L2_mu6'], ['BphysDelayed'], ['RATE:BphysDelayed','BW:Bphys'], -1,['serial',-1,['mu11','mu6noL1']]],
+        #moved to muons slice ['mu6_2mu4_delayed_L1MU6_3MU4',          'L1_MU6_3MU4',  ['L1_MU6','L1_2MU4'],          ['BphysDelayed'], ['RATE:BphysDelayed','BW:Bphys'], -1],
         ['2mu10_bBmumux_BcmumuDsloose_delayed',                    'L1_2MU10', [], ['BphysDelayed'], ['RATE:BphysDelayed','BW:Bphys'], -1],
         ['2mu10_bJpsimumu_delayed',                                'L1_2MU10', [], ['BphysDelayed'], ['RATE:BphysDelayed','BW:Bphys'], -1],
         ['2mu10_bUpsimumu_delayed',                                'L1_2MU10', [], ['BphysDelayed'], ['RATE:BphysDelayed','BW:Bphys'], -1],
         ['2mu10_bBmumuxv2_delayed',                                'L1_2MU10', [], ['BphysDelayed'], ['RATE:BphysDelayed','BW:Bphys'], -1],
 
         ## LFV topo based *delayed* nscan (ATR-14352)
-        ## original proposed item: ['mu11_nomucomb_mu6noL1_nscan03_L1LFV-MU_bTau', 'L1_LFV-MU', ['L1_MU10','L2_mu6_nomucomb'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1,['serial',-1,['mu11_nomucomb','mu6noL1_nscan03']]],
-        ['mu11_nomucomb_mu6noL1_nscan03_L1LFV-MU_bTau_delayed', 'L1_LFV-MU', ['L1_MU10','L2_mu6_nomucomb'], ['BphysDelayed'], ['RATE:BphysDelayed','BW:Bphys'], -1,['serial',-1,['mu11_nomucomb','mu6noL1_nscan03']]],
-			 ]
+        ## original proposed item: ['mu11_mu6noL1_L1LFV-MU_bTau', 'L1_LFV-MU', ['L1_MU10','L2_mu6'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1,['serial',-1,['mu11','mu6noL1']]],
+        ['mu11_mu6noL1_bTau_L1LFV-MU_delayed', 'L1_LFV-MU', ['L1_MU10','L2_mu6'], ['BphysDelayed'], ['RATE:BphysDelayed','BW:Bphys'], -1,['serial',-1,['mu11','mu6noL1']]],
+
+
+        # new baseline triggers, ATR-15503
+        ['mu11_mu6_bBmumuxv2', 'L1_MU11_2MU6', ['L1_MU11','L1_MU6'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
+        ['mu11_mu6_bBmumux_BcmumuDsloose', 'L1_MU11_2MU6', ['L1_MU11','L1_MU6'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
+        ['mu11_mu6_bBmumux_BpmumuKp',      'L1_MU11_2MU6', ['L1_MU11','L1_MU6'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
+        ['mu11_mu6_bJpsimumu_Lxy0', 'L1_MU11_2MU6', ['L1_MU11','L1_MU6'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
+        ['mu11_mu6_bJpsimumu', 'L1_MU11_2MU6', ['L1_MU11','L1_MU6'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
+        ['mu11_mu6_bUpsimumu', 'L1_MU11_2MU6', ['L1_MU11','L1_MU6'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
+        ['mu11_mu6_bDimu_noinvm_novtx_ss', 'L1_MU11_2MU6', ['L1_MU11','L1_MU6'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
+        ['mu11_mu6_bDimu_novtx_noos', 'L1_MU11_2MU6', ['L1_MU11','L1_MU6'], [PhysicsStream], ['RATE:Bphysics','BW:Bphys'], -1],
+
+            ]
 
     TriggerFlags.CombinedSlice.signatures = [
 
diff --git a/Trigger/TriggerCommon/TriggerMenu/python/menu/SignatureDicts.py b/Trigger/TriggerCommon/TriggerMenu/python/menu/SignatureDicts.py
index 87f31fce9cff..f2a69836400f 100644
--- a/Trigger/TriggerCommon/TriggerMenu/python/menu/SignatureDicts.py
+++ b/Trigger/TriggerCommon/TriggerMenu/python/menu/SignatureDicts.py
@@ -54,7 +54,7 @@ ChainDictTemplate = {
 AllowedTopos_e = ["Jpsiee","Zeg","Zee","Heg"]
 AllowedTopos_mu = ['Jpsimumu']
 AllowedTopos_xe = ['1dphi10', '2dphi05', '6dphi05', '6dphi15', '2dphi05', '2dphi15', 'mt25', 'mt35', 'razor140', 'razor170', 'razor200','razor220','razor100','razor185','razor195']
-AllowedTopos_bphys = ['bJpsi', 'bTau', 'bDimu', 
+AllowedTopos_bphys = ['bJpsi', 'bTau', 'bDimu', 'bNocut',
                       'bJpsimumu', 'bUpsimumu', 
                       'bBmumu', 'bBmumux', 
                       'bBmumuxv2', 'bBmumuxv3',
@@ -62,7 +62,7 @@ AllowedTopos_bphys = ['bJpsi', 'bTau', 'bDimu',
                       'BcmumuDs' ,   'BcmumuDsloose' ,
                       '7invm9', 'noos', 'noid', 'novtx',
                       '11invm60','18invm60', 'bUpsi',
-                      'Trkloose', 'Zmumu', 'noL2', 'noEFbph',
+                      'Trkloose', 'TrkPEB', 'Zmumu', 'noL2', 'noEFbph',
                       'noinvm', 'ss', 'BpmumuKp', 'Taumumux', 'Dsmumux', 'LbmumuLambda',
                       'trkTau', 'bTauTrk', 'bDsPhiX', 'bPhi','bDsPhiXtight',
                       '11invm24', '24invm60',
@@ -243,11 +243,13 @@ MuonChainParts_Default = {
 BphysicsChainParts = deepcopy(MuonChainParts)
 #BphysicsChainParts['bTracking'] = ['FTK']
 BphysicsChainParts['signature'] = ['Bphysics']
+BphysicsChainParts['peb'] = ['peb075']
 BphysicsChainParts['topo'] = AllowedTopos_bphys
 # ---- Bphysics Dictinary of default Values ----
 BphysicsChainParts_Default = deepcopy(MuonChainParts_Default)
 BphysicsChainParts_Default['signature'] = ['Bphysics']
 BphysicsChainParts_Default['topo'] = []
+BphysicsChainParts['peb'] = []
 BphysicsChainParts_Default['overlapRemoval'] = ['noOvlpRm']
 
 #==========================================================
diff --git a/Trigger/TriggerCommon/TriggerMenu/python/menu/StreamInfo.py b/Trigger/TriggerCommon/TriggerMenu/python/menu/StreamInfo.py
index f5eb3c833cb0..22e8da8d8e63 100644
--- a/Trigger/TriggerCommon/TriggerMenu/python/menu/StreamInfo.py
+++ b/Trigger/TriggerCommon/TriggerMenu/python/menu/StreamInfo.py
@@ -58,7 +58,8 @@ calibStreams = [
                 'IDFwd',
                 'BeamSpot',
                 'zdcCalib',
-                'AFP'
+                'AFP',
+                'BphysPEB'
                 ]
 
 ##NOTE: DataScouting_xx_NAME: 
diff --git a/Trigger/TriggerCommon/TriggerMenu/python/muon/MuonDef.py b/Trigger/TriggerCommon/TriggerMenu/python/muon/MuonDef.py
index adae3518e4d2..7593f1f3bb15 100755
--- a/Trigger/TriggerCommon/TriggerMenu/python/muon/MuonDef.py
+++ b/Trigger/TriggerCommon/TriggerMenu/python/muon/MuonDef.py
@@ -49,7 +49,7 @@ class L2EFChain_mu(L2EFChainDef):
   fullScanSeqMap = getFullScanCaloSequences()
   # ----------------------------------------------------------------
 
-  def __init__(self, chainDict, asymDiMuonChain = False, AllMuons = []):
+  def __init__(self, chainDict, asymDiMuonChain = False, AllMuons = [], thisIsBphysChain=False):
     self.L2sequenceList   = []
     self.EFsequenceList   = []
     self.L2signatureList  = []
@@ -79,6 +79,9 @@ class L2EFChain_mu(L2EFChainDef):
     # --- used to configure hypos for FS muon chains
     self.allMuThrs=AllMuons
 
+    # --- used to set default for Bphys chains
+    self.thisIsBphysChain = thisIsBphysChain
+
     # --- when to run with ovlp removal ---
     self.ovlpRm = self.chainPart['overlapRemoval']
     self.asymDiMuonChain = asymDiMuonChain
@@ -90,7 +93,7 @@ class L2EFChain_mu(L2EFChainDef):
       self.setup_muXX_noL1FTK()
     elif (self.mult > 1) & ('wOvlpRm' in self.ovlpRm):
       self.doOvlpRm = True
-    elif "bJpsi" in self.chainName or "bDimu" in self.chainName or "bUpsi" in self.chainName :
+    elif "bJpsi" in self.chainName or "bDimu" in self.chainName or "bUpsi" in self.chainName or self.thisIsBphysChain :
       self.doOvlpRm = False
     elif (self.asymDiMuonChain) and (self.mult > 1) and not self.chainPart['extra'] and not self.chainPart['reccalibInfo'] :
       self.doOvlpRm = True
@@ -102,7 +105,8 @@ class L2EFChain_mu(L2EFChainDef):
           and not self.chainPart['FSinfo'] \
           and not self.chainPart['hypoInfo'] \
           and not self.chainPart['reccalibInfo'] \
-          and "cosmicEF" not in self.chainPart['addInfo']:
+          and "cosmicEF" not in self.chainPart['addInfo'] \
+          and not self.thisIsBphysChain :
       self.setup_muXX_ID()
     elif "muL2" in self.chainPart['reccalibInfo']:
       self.setup_muXX_muL2()
@@ -132,6 +136,8 @@ class L2EFChain_mu(L2EFChainDef):
     elif self.chainPart['reccalibInfo'] == "muoncalib"  and "cosmicEF" not in self.chainPart['addInfo'] \
           and "ds3" in self.chainPart['addInfo'] :
       self.setup_muXX_muoncalib_ds3()
+    elif self.thisIsBphysChain  and "cosmicEF" not in self.chainPart['addInfo'] :  ## Keep this  at the end, in case non-default chain is requested
+        self.setup_muXX_nomucomb()
     elif "cosmicEF" in self.chainPart['addInfo']:
       self.setup_muXX_cosmicEF()
     elif "mucombTag" in self.chainPart['reccalibInfo'] and "noEF" in self.chainPart['addInfo'] :
@@ -2127,17 +2133,12 @@ class L2EFChain_mu(L2EFChainDef):
                              [theTrigMuSuperEF, theTrigMuonEFCombinerHypoConfig],
                              'EF_mu_step2']]
     
-    self.EFsequenceList += [[['EF_mu_step2'],
-                             [theTrigMuonIDTrackMultiHypoConfig_Muon],
-                             'EF_mu_step3']]
-    
     
     self.L2signatureList += [ [['L2_mu_step1']*self.mult] ]
     self.L2signatureList += [ [['L2_mu_step2']*self.mult] ]
     self.L2signatureList += [ [['L2_mu_step3']          ] ]
     self.EFsignatureList += [ [['EF_mu_step1']*self.mult] ]
     self.EFsignatureList += [ [['EF_mu_step2']*self.mult] ]
-    self.EFsignatureList += [ [['EF_mu_step3']          ] ]
     
     self.TErenamingDict = {
       'L2_mu_step1': mergeRemovingOverlap('L2_mu_SA_',  L2AlgName+muFastThresh+'_'+self.L2InputTE),
@@ -2149,6 +2150,16 @@ class L2EFChain_mu(L2EFChainDef):
       #--> replaced 'EF_mu_step3': mergeRemovingOverlap('EF_mutrkmulti_', idmulti+'_'+self.chainPartNameNoMult+'_'+self.L2InputTE),
       'EF_mu_step1': mergeRemovingOverlap('EF_EFIDInsideOut_', idmulti+'_'+self.chainPartNameNoMult.replace(self.chainPart['specialStream'], '')+'_'+self.L2InputTE).replace('__', '_'),
       'EF_mu_step2': mergeRemovingOverlap('EF_SuperEF_',   idmulti+'_'+self.chainPartNameNoMult.replace(self.chainPart['specialStream'], '')+'_'+self.L2InputTE).replace('__', '_'),
-      'EF_mu_step3': mergeRemovingOverlap('EF_mutrkmulti_', idmulti+'_'+self.chainPartNameNoMult.replace(self.chainPart['specialStream'], '')+'_'+self.L2InputTE).replace('__', '_'),
       }
-    
+
+    # OI this makes no sense , as we already cut on good tracks at L2, there is no rejection, skip it (at least in 2017)
+    from TriggerJobOpts.TriggerFlags import TriggerFlags
+    if TriggerFlags.run2Config=='2016':
+      self.EFsequenceList += [[['EF_mu_step2'],
+                              [theTrigMuonIDTrackMultiHypoConfig_Muon],
+                              'EF_mu_step3']]
+      self.EFsignatureList += [ [['EF_mu_step3']          ] ]
+      self.TErenamingDict += {
+        'EF_mu_step3': mergeRemovingOverlap('EF_mutrkmulti_', idmulti+'_'+self.chainPartNameNoMult.replace(self.chainPart['specialStream'], '')+'_'+self.L2InputTE).replace('__', '_'),
+      }
+
diff --git a/Trigger/TriggerCommon/TriggerMenu/python/muon/generateMuonChainDefs.py b/Trigger/TriggerCommon/TriggerMenu/python/muon/generateMuonChainDefs.py
index 12eee488766a..f2f778cecb89 100644
--- a/Trigger/TriggerCommon/TriggerMenu/python/muon/generateMuonChainDefs.py
+++ b/Trigger/TriggerCommon/TriggerMenu/python/muon/generateMuonChainDefs.py
@@ -40,7 +40,7 @@ def GetAllMuonThresholds(chainDict):
 
     return muons
 
-def generateChainDefs(chainDict):
+def generateChainDefs(chainDict, thisIsBphysChain=False):
     
     listOfChainDicts = splitChainDict(chainDict)
     listOfChainDefs = []
@@ -62,7 +62,7 @@ def generateChainDefs(chainDict):
             else:
                 AllMuons=[]
 
-            Muon = L2EFChain_mu(subChainDict, asymDiMuonChain, AllMuons)
+            Muon = L2EFChain_mu(subChainDict, asymDiMuonChain, AllMuons, thisIsBphysChain)
 
         listOfChainDefs += [Muon.generateHLTChainDef()]
         
-- 
GitLab