From 95befe18e2fcbd53ee986addd290b081579c28b2 Mon Sep 17 00:00:00 2001
From: Savanna Marie Shaw <savanna.marie.shaw@cern.ch>
Date: Mon, 28 Sep 2020 15:27:06 +0200
Subject: [PATCH] Adding muComb to trigger new JO test

Adding the L2 combined muon step to the trigger new JO test (ATR-20242). The step runs:
- A view data verifier to pick up the L2 SA muons from the previous step
- The ID fast track finding
- the muComb algorithm

Currently it seems that the combined electron+muon chains need to have the same number of steps for electrons and muons, so I split the muon chains into two type. The default chains (used in combination with other signatures) run the L2 SA and combined steps, and the msonly chains run the L2 SA and precision SA steps (and the L2 combined and preicion SA steps are only created for the relevant chains).
---
 .../python/TrigmuCombConfig_newJO.py          |  10 +-
 .../python/HLTMenuConfig/Menu/LS2_v1_newJO.py |   6 +-
 .../python/HLTMenuConfig/Muon/generateMuon.py | 176 +++++++++++-------
 3 files changed, 123 insertions(+), 69 deletions(-)

diff --git a/Trigger/TrigAlgorithms/TrigmuComb/python/TrigmuCombConfig_newJO.py b/Trigger/TrigAlgorithms/TrigmuComb/python/TrigmuCombConfig_newJO.py
index 35c2417cf93c..f8bee288341d 100644
--- a/Trigger/TrigAlgorithms/TrigmuComb/python/TrigmuCombConfig_newJO.py
+++ b/Trigger/TrigAlgorithms/TrigmuComb/python/TrigmuCombConfig_newJO.py
@@ -38,7 +38,8 @@ def muCombCfg(flags, postFix="", useBackExtrp=True):
 
     from TrigmuComb.TrigmuCombMTConfig import muCombMT
     from TrigmuComb.TrigmuCombMonitoring import TrigMuCombMonitoring
-    muCombAlg = muCombMT(name                  = "Muon"+postFix,
+    muCombMT = CompFactory.muCombMT
+    muCombAlg = muCombMT(name                  = "MuComb"+postFix,
                          MuCombStrategy        = 0,
                          UseBackExtrapolatorG4 = useBackExtrp,
                          MinPtTRK              = 0.,
@@ -51,19 +52,20 @@ def muCombCfg(flags, postFix="", useBackExtrp=True):
                          IDSCANEndcap3Res      = idScanEndcap3Res,
                          IDSCANEndcap4Res      = idScanEndcap4Res,
                          IDalgo                = "InDetTrigTrackingxAODCnv_Muon_FTF",
-                         MonTool = TrigMuCombMonitoring() )
+                         MonTool = None)
 
     return acc, muCombAlg
 
     
-def l2MuCombRecoCfg(flags):
+def l2MuCombRecoCfg(flags, name="L2MuCombReco"):
 
     from TriggerMenuMT.HLTMenuConfig.Menu.MenuComponents import InViewReco
-    reco = InViewReco("L2MuCombReco")
+    reco = InViewReco(name)
 
     acc, alg = muCombCfg(flags)
     alg.L2StandAloneMuonContainerName=muFastInfo
     alg.L2CombinedMuonContainerName = muCombInfo
+    alg.TrackParticlesContainerName="TrigFastTrackFinder_Tracks__Muon"
 
     muCombAcc = ComponentAccumulator()
     muCombAcc.addEventAlgo(alg)
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1_newJO.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1_newJO.py
index 4d7d83583376..7c4c3d12940e 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1_newJO.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1_newJO.py
@@ -41,7 +41,11 @@ def setupMenu(flags):
     flags.Trigger.menu.muon = [        
         ChainProp(name='HLT_mu20_L1MU20', groups=SingleMuonGroup),
         ChainProp(name='HLT_mu10_L1MU10', groups=SingleMuonGroup),
-        ChainProp(name='HLT_mu8_L1MU6',   groups=SingleMuonGroup)
+        ChainProp(name='HLT_mu8_L1MU6',   groups=SingleMuonGroup),
+
+        ChainProp(name='HLT_mu20_msonly_L1MU20', groups=SingleMuonGroup),
+        ChainProp(name='HLT_mu10_msonly_L1MU10', groups=SingleMuonGroup),
+        ChainProp(name='HLT_mu8_msonly_L1MU6',   groups=SingleMuonGroup)
     ]
 
     flags.Trigger.menu.electron = [
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Muon/generateMuon.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Muon/generateMuon.py
index 5780500ccf8a..a65743bad2dc 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Muon/generateMuon.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Muon/generateMuon.py
@@ -4,7 +4,9 @@ from TriggerMenuMT.HLTMenuConfig.Menu.MenuComponents import CAMenuSequence, Chai
 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
 
 from TrigL2MuonSA.TrigL2MuonSAConfig_newJO import l2MuFastAlgCfg, l2MuFastHypoCfg
-from TrigMuonHypoMT.TrigMuonHypoMTConfig import TrigMufastHypoToolFromDict, TrigMuonEFMSonlyHypoToolFromDict
+from TrigmuComb.TrigmuCombConfig_newJO import l2MuCombRecoCfg, l2MuCombHypoCfg
+from TrigMuonHypoMT.TrigMuonHypoMTConfig import TrigMufastHypoToolFromDict, TrigmuCombHypoToolFromDict, TrigMuonEFMSonlyHypoToolFromDict
+from TrigInDetConfig.TrigInDetConfig import TrigInDetConfig
 
 from TriggerMenuMT.HLTMenuConfig.Menu.ChainDictTools import splitChainDict
 
@@ -47,6 +49,13 @@ def MuFastViewDataVerifier():
     result.addEventAlgo(alg)
     return result
 
+def MuCombViewDataVerifier():
+    result = ComponentAccumulator()
+    alg = CompFactory.AthViews.ViewDataVerifier( name = "VDVMuComb",
+                                                 DataObjects = [( 'xAOD::L2StandAloneMuonContainer' , 'StoreGateSvc+MuonL2SAInfo' )])
+    result.addEventAlgo(alg)
+    return result
+
 #Not the ideal place to keep the track cnv alg configuration. Temproarily adding it here 
 #until a better location can be found
 def MuonTrackCollectionCnvToolCfg(flags, name = "MuonTrackCollectionCnvTool", **kwargs):
@@ -210,82 +219,119 @@ def generateChains( flags, chainDict ):
 
     l2muFastStep = ChainStep( name=stepName, Sequences=[l2muFastSequence], chainDicts=[chainDict] )
 
-    ### Set muon step2 ###
-    # Please set up L2muComb step here
-
-    #EF MS only
-    stepEFMSName = 'EFMSMuon'
-    stepEFMSReco, stepEFMSView = createStepView(stepEFMSName)
-
-    #Clone and replace offline flags so we can set muon trigger specific values
-    muonflags = flags.cloneAndReplace('Muon', 'Trigger.Offline.Muon')
-    muonflags.Muon.useTGCPriorNextBC=True
-    muonflags.Muon.enableErrorTuning=False
-    muonflags.Muon.MuonTrigger=True
-    muonflags.Muon.SAMuonTrigger=True
-    muonflags.lock()
-
-    accMS = ComponentAccumulator()
-    accMS.addSequence(stepEFMSView)
-
-    from TriggerMenuMT.HLTMenuConfig.Menu.MenuComponents import InViewReco
-    recoMS = InViewReco("EFMuMSReco")
-    recoMS.inputMaker().RequireParentView = True
+    if 'msonly' not in chainDict['chainName']: 
+        #only run in combined muon chains
+        ### Set muon step2 - L2muComb ###
+        stepL2CBName = 'L2MuonCB'
+        stepL2CBReco, stepL2CBView = createStepView(stepL2CBName)
+
+        accL2CB = ComponentAccumulator()
+        accL2CB.addSequence(stepL2CBView)
+        
+        # Set EventViews for L2MuonCB step
+        recoL2CB = l2MuCombRecoCfg(flags)
+        #external data loading to view
+        recoL2CB.inputMaker().RequireParentView = True
+        recoL2CB.mergeReco( MuCombViewDataVerifier() )
+
+        #ID tracking
+        #(Using electron specific flags for now until muon specific flags are available)
+        flagsID = flags.cloneAndReplace("InDet.Tracking", "Trigger.InDetTracking.Electron")
+        accID = TrigInDetConfig( flagsID, roisKey=recoL2CB.inputMaker().InViewRoIs, signatureName="Muon" )
+        recoL2CB.mergeReco(accID)
+        
+        accL2CB.merge(recoL2CB, sequenceName = stepL2CBReco.getName())
+
+        l2muCombHypo = l2MuCombHypoCfg( flags,
+                                        name = 'TrigL2MuCombHypo',
+                                        muCombInfo = 'HLT_MuonL2CBInfo' )
+
+        accL2CB.addEventAlgo(l2muCombHypo, sequenceName=stepL2CBView.getName())
+
+        l2muCombSequence = CAMenuSequence( Sequence = recoL2CB.sequence(),
+                                           Maker = recoL2CB.inputMaker(),
+                                           Hypo = l2muCombHypo,
+                                           HypoToolGen = TrigmuCombHypoToolFromDict,
+                                           CA = accL2CB )
+
+        l2muCombStep = ChainStep( name=stepL2CBName, Sequences=[l2muCombSequence], chainDicts=[chainDict] )
     
-    #Probably this block will eventually need to move somewhere more central
-    from BeamPipeGeoModel.BeamPipeGMConfig import BeamPipeGeometryCfg
-    accMS.merge( BeamPipeGeometryCfg(flags) ) 
-    
-    from PixelGeoModel.PixelGeoModelConfig import PixelGeometryCfg
-    accMS.merge(PixelGeometryCfg(flags))
+
+    if 'msonly' in chainDict['chainName']: 
+        #only runningn in MS-only chains for now
+        #EF MS only
+        stepEFMSName = 'EFMSMuon'
+        stepEFMSReco, stepEFMSView = createStepView(stepEFMSName)
+
+        #Clone and replace offline flags so we can set muon trigger specific values
+        muonflags = flags.cloneAndReplace('Muon', 'Trigger.Offline.Muon')
+        muonflags.Muon.useTGCPriorNextBC=True
+        muonflags.Muon.enableErrorTuning=False
+        muonflags.Muon.MuonTrigger=True
+        muonflags.Muon.SAMuonTrigger=True
+        muonflags.lock()
+        
+        accMS = ComponentAccumulator()
+        accMS.addSequence(stepEFMSView)
+
+        from TriggerMenuMT.HLTMenuConfig.Menu.MenuComponents import InViewReco
+        recoMS = InViewReco("EFMuMSReco")
+        recoMS.inputMaker().RequireParentView = True
     
-    from SCT_GeoModel.SCT_GeoModelConfig import SCT_GeometryCfg
-    accMS.merge(SCT_GeometryCfg(flags))
+        #Probably this block will eventually need to move somewhere more central
+        from BeamPipeGeoModel.BeamPipeGMConfig import BeamPipeGeometryCfg
+        accMS.merge( BeamPipeGeometryCfg(flags) ) 
+        
+        from PixelGeoModel.PixelGeoModelConfig import PixelGeometryCfg
+        accMS.merge(PixelGeometryCfg(flags))
     
-    from TRT_GeoModel.TRT_GeoModelConfig import TRT_GeometryCfg
-    accMS.merge(TRT_GeometryCfg(flags))
+        from SCT_GeoModel.SCT_GeoModelConfig import SCT_GeometryCfg
+        accMS.merge(SCT_GeometryCfg(flags))
+        
+        from TRT_GeoModel.TRT_GeoModelConfig import TRT_GeometryCfg
+        accMS.merge(TRT_GeometryCfg(flags))
     
-    from TrkConfig.AtlasTrackingGeometrySvcConfig import TrackingGeometrySvcCfg
-    accMS.merge(TrackingGeometrySvcCfg(flags))
-    ###################
+        from TrkConfig.AtlasTrackingGeometrySvcConfig import TrackingGeometrySvcCfg
+        accMS.merge(TrackingGeometrySvcCfg(flags))
+        ###################
     
-    EFMuonViewDataVerifier = EFMuonViewDataVerifierCfg()
-    recoMS.mergeReco(EFMuonViewDataVerifier)
+        EFMuonViewDataVerifier = EFMuonViewDataVerifierCfg()
+        recoMS.mergeReco(EFMuonViewDataVerifier)
 
-    from MuonConfig.MuonSegmentFindingConfig import MooSegmentFinderAlgCfg
-    segCfg = MooSegmentFinderAlgCfg(muonflags,name="TrigMooSegmentFinder",UseTGCNextBC=False, UseTGCPriorBC=False)
-    recoMS.mergeReco(segCfg)
+        from MuonConfig.MuonSegmentFindingConfig import MooSegmentFinderAlgCfg
+        segCfg = MooSegmentFinderAlgCfg(muonflags,name="TrigMooSegmentFinder",UseTGCNextBC=False, UseTGCPriorBC=False)
+        recoMS.mergeReco(segCfg)
 
-    from MuonConfig.MuonTrackBuildingConfig import MuonTrackBuildingCfg
-    trkCfg = MuonTrackBuildingCfg(muonflags, name="TrigMuPatTrackBuilder")
-    recoMS.mergeReco(trkCfg)
+        from MuonConfig.MuonTrackBuildingConfig import MuonTrackBuildingCfg
+        trkCfg = MuonTrackBuildingCfg(muonflags, name="TrigMuPatTrackBuilder")
+        recoMS.mergeReco(trkCfg)
 
-    cnvCfg = MuonTrackParticleCnvCfg(muonflags, name = "TrigMuonTrackParticleCnvAlg")
-    recoMS.mergeReco(cnvCfg)
+        cnvCfg = MuonTrackParticleCnvCfg(muonflags, name = "TrigMuonTrackParticleCnvAlg")
+        recoMS.mergeReco(cnvCfg)
 
-    from MuonCombinedConfig.MuonCombinedReconstructionConfig import MuonCombinedMuonCandidateAlgCfg
-    candCfg = MuonCombinedMuonCandidateAlgCfg(muonflags, name = "TrigMuonCandidateAlg")
-    recoMS.mergeReco(candCfg)
+        from MuonCombinedConfig.MuonCombinedReconstructionConfig import MuonCombinedMuonCandidateAlgCfg
+        candCfg = MuonCombinedMuonCandidateAlgCfg(muonflags, name = "TrigMuonCandidateAlg")
+        recoMS.mergeReco(candCfg)
 
-    from MuonCombinedConfig.MuonCombinedReconstructionConfig import MuonCreatorAlgCfg
-    creatorCfg = MuonCreatorAlgCfg(muonflags, name = "TrigMuonCreatorAlg")
-    recoMS.mergeReco(creatorCfg)
+        from MuonCombinedConfig.MuonCombinedReconstructionConfig import MuonCreatorAlgCfg
+        creatorCfg = MuonCreatorAlgCfg(muonflags, name = "TrigMuonCreatorAlg")
+        recoMS.mergeReco(creatorCfg)
 
-    accMS.merge(recoMS, sequenceName=stepEFMSReco.getName())
+        accMS.merge(recoMS, sequenceName=stepEFMSReco.getName())
 
-    efmuMSHypo = efMuMSHypoCfg( muonflags,
-                                name = 'TrigMuonEFMSonlyHypo',
-                                inputMuons = "Muons" )
+        efmuMSHypo = efMuMSHypoCfg( muonflags,
+                                    name = 'TrigMuonEFMSonlyHypo',
+                                    inputMuons = "Muons" )
 
-    accMS.addEventAlgo(efmuMSHypo, sequenceName=stepEFMSView.getName())
+        accMS.addEventAlgo(efmuMSHypo, sequenceName=stepEFMSView.getName())
 
-    efmuMSSequence = CAMenuSequence( Sequence = recoMS.sequence(),
-                                     Maker = recoMS.inputMaker(),
-                                     Hypo = efmuMSHypo, 
-                                     HypoToolGen = TrigMuonEFMSonlyHypoToolFromDict,
-                                     CA = accMS )
+        efmuMSSequence = CAMenuSequence( Sequence = recoMS.sequence(),
+                                         Maker = recoMS.inputMaker(),
+                                         Hypo = efmuMSHypo, 
+                                         HypoToolGen = TrigMuonEFMSonlyHypoToolFromDict,
+                                         CA = accMS )
 
-    efmuMSStep = ChainStep( name=stepEFMSName, Sequences=[efmuMSSequence], chainDicts=[chainDict] )
+        efmuMSStep = ChainStep( name=stepEFMSName, Sequences=[efmuMSSequence], chainDicts=[chainDict] )
 
     l1Thresholds=[]
     for part in chainDict['chainParts']:
@@ -293,7 +339,9 @@ def generateChains( flags, chainDict ):
     
     log.debug('dictionary is: %s\n', pprint.pformat(chainDict))
 
-
-    chain = Chain( name=chainDict['chainName'], L1Thresholds=l1Thresholds, ChainSteps=[ l2muFastStep, efmuMSStep ] )
+    if 'msonly' in chainDict['chainName']: 
+        chain = Chain( name=chainDict['chainName'], L1Thresholds=l1Thresholds, ChainSteps=[ l2muFastStep, efmuMSStep ] )
+    else:
+        chain = Chain( name=chainDict['chainName'], L1Thresholds=l1Thresholds, ChainSteps=[ l2muFastStep, l2muCombStep ] )
     return chain
 
-- 
GitLab