From 76f2582d5b478e164ba3b4e5db285f76632e9906 Mon Sep 17 00:00:00 2001
From: Savanna Marie Shaw <savanna.marie.shaw@cern.ch>
Date: Mon, 8 Mar 2021 15:35:42 +0100
Subject: [PATCH] Add inside-out muon reco to trigger new JO test

Adding the inside-out reco to the muon triggers in the new JO test (ATR-20388):

- Add the inside-out reco algorithms to the muon trigger configuration, and run in a sequence only if we don't find any muons in the outside-in reco sequence
- Add the configuration for the algorithms that check for outside-in muons and merges the muon trigger containers
- Update the muon reco config to remove a couple cases of unneeded 'addPublicTools' and to use the correct track summary tool for a given use case (CombinedMuonTrackSummaryTool when looking at combined muons, and the MuonTrackSummaryTool otherwise)
---
 .../python/MuonCombinedRecToolsConfig.py      | 22 ++++++-----
 .../python/TrigMuonEFConfig_newJO.py          | 21 +++++++++++
 .../python/HLTMenuConfig/Muon/generateMuon.py | 37 +++++++++++++++++--
 3 files changed, 67 insertions(+), 13 deletions(-)

diff --git a/Reconstruction/MuonIdentification/MuonCombinedConfig/python/MuonCombinedRecToolsConfig.py b/Reconstruction/MuonIdentification/MuonCombinedConfig/python/MuonCombinedRecToolsConfig.py
index 130f05c5f45b..76b689a3e763 100644
--- a/Reconstruction/MuonIdentification/MuonCombinedConfig/python/MuonCombinedRecToolsConfig.py
+++ b/Reconstruction/MuonIdentification/MuonCombinedConfig/python/MuonCombinedRecToolsConfig.py
@@ -122,7 +122,7 @@ def MuonCombinedInDetDetailedTrackSelectorToolCfg(flags, name="MuonCombinedInDet
 
 def MuonCombinedParticleCreatorCfg(flags, name="MuonCombinedParticleCreator",**kwargs):
     result = ComponentAccumulator()    
-    if flags.Muon.MuonTrigger:
+    if flags.Muon.SAMuonTrigger:
         from MuonConfig.MuonRecToolsConfig import MuonTrackSummaryToolCfg
         acc = MuonTrackSummaryToolCfg(flags)
         kwargs.setdefault("TrackSummaryTool", acc.popPrivateTools())
@@ -140,7 +140,6 @@ def MuonCombinedParticleCreatorCfg(flags, name="MuonCombinedParticleCreator",**k
     if flags.Beam.Type=="cosmics":
         kwargs.setdefault("PerigeeExpression","Origin")
     tool = CompFactory.Trk.TrackParticleCreatorTool(name,**kwargs)
-    result.addPublicTool(tool)
     result.setPrivateTools(tool)
     return result
  
@@ -258,9 +257,12 @@ def MuonCreatorToolCfg(flags, name="MuonCreatorTool", **kwargs):
 
     kwargs.setdefault("TrackQuery",   result.popToolsAndMerge(MuonTrackQueryCfg(flags)) )
 
-    acc = MuonTrackSummaryToolCfg(flags)
-    kwargs.setdefault("TrackSummaryTool", acc.popPrivateTools())
-    result.merge(acc)
+    if flags.Muon.SAMuonTrigger:
+        acc = MuonTrackSummaryToolCfg(flags)
+        kwargs.setdefault("TrackSummaryTool", acc.popPrivateTools())
+        result.merge(acc)
+    else:
+        kwargs.setdefault("TrackSummaryTool", result.popToolsAndMerge(MuonCombinedTrackSummaryToolCfg(flags)))
 
     if flags.Muon.MuonTrigger:
         kwargs.setdefault('MakeTrackAtMSLink',True)
@@ -275,7 +277,6 @@ def MuonCreatorToolCfg(flags, name="MuonCreatorTool", **kwargs):
     result.addService(trackingVolSvc)
 
     tool = CompFactory.MuonCombined.MuonCreatorTool(name,**kwargs)
-    result.addPublicTool(tool)
     result.setPrivateTools(tool)
     return result 
 
@@ -417,6 +418,7 @@ def iPatFitterCfg(flags, name='iPatFitter', **kwargs):
     kwargs.setdefault("MaterialAllocator",result.popPrivateTools() )
     if flags.Muon.MuonTrigger:
         kwargs.setdefault("MaxIterations", 15)
+    if flags.Muon.SAMuonTrigger:
         from MuonConfig.MuonRecToolsConfig import MuonTrackSummaryToolCfg
         acc = MuonTrackSummaryToolCfg(flags)
         kwargs.setdefault("TrackSummaryTool", acc.popPrivateTools())
@@ -968,8 +970,8 @@ def MuonLayerSegmentMatchingToolCfg(flags, name="MuonLayerSegmentMatchingTool",
     return result
 
 def MuonInsideOutRecoToolCfg(flags, name="MuonInsideOutRecoTool", **kwargs ):
-#    if TriggerFlags.MuonSlice.doTrigMuonConfig:
-#       kwargs.setdefault("VertexContainer", "")
+    if flags.Muon.MuonTrigger:
+        kwargs.setdefault("VertexContainer", "")
     result = MuonLayerSegmentFinderToolCfg(flags, name= "MuonLayerSegmentFinderTool")
     layersegmentfindertool = result.popPrivateTools()
     kwargs.setdefault("MuonLayerSegmentFinderTool", layersegmentfindertool)
@@ -1006,8 +1008,8 @@ def MuonInsideOutRecoToolCfg(flags, name="MuonInsideOutRecoTool", **kwargs ):
     kwargs.setdefault("TrackAmbiguityProcessor", acc.getPrimary())
     result.merge(acc)
 
-    from MuonConfig.MuonRecToolsConfig import MuonTrackSummaryToolCfg
-    kwargs.setdefault("TrackSummaryTool", acc.popToolsAndMerge(  MuonTrackSummaryToolCfg(flags) ) )
+    kwargs.setdefault("TrackSummaryTool", acc.popToolsAndMerge(  MuonCombinedTrackSummaryToolCfg(flags) ) )
+
 
     tool = CompFactory.MuonCombined.MuonInsideOutRecoTool(name, **kwargs)
     result.setPrivateTools(tool)
diff --git a/Trigger/TrigAlgorithms/TrigMuonEF/python/TrigMuonEFConfig_newJO.py b/Trigger/TrigAlgorithms/TrigMuonEF/python/TrigMuonEFConfig_newJO.py
index a066728a0760..2e2f1f95657a 100644
--- a/Trigger/TrigAlgorithms/TrigMuonEF/python/TrigMuonEFConfig_newJO.py
+++ b/Trigger/TrigAlgorithms/TrigMuonEF/python/TrigMuonEFConfig_newJO.py
@@ -39,3 +39,24 @@ def TrigMuonEFTrackIsolationAlgCfg(flags, name = "TrigMuonEFTrackIsolation", **k
     acc.addEventAlgo(isoAlg)
 
     return acc
+
+def MuonFilterAlgCfg(flags, name="FilterZeroMuons", **kwargs):
+
+    filterZeroMuons = CompFactory.MuonFilterAlg
+    acc = ComponentAccumulator()
+    kwargs.setdefault("MuonContainerLocation", "MuonsCB")
+
+    acc.addEventAlgo(filterZeroMuons(name, **kwargs))
+
+    return acc
+
+def MergeEFMuonsAlgCfg(flags, name="MergeEFMuonsAlg", **kwargs):
+
+    mergeMuons = CompFactory.MergeEFMuonsAlg
+    acc = ComponentAccumulator()
+    kwargs.setdefault("MuonCBContainerLocation", "MuonsCB_outsideIn")
+    kwargs.setdefault("MuonInsideOutContainerLocation", "MuonsCB_insideOut")
+    kwargs.setdefault("MuonOutputLocation", "MuonsCB")
+
+    acc.addEventAlgo(mergeMuons(name, **kwargs))
+    return acc
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Muon/generateMuon.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Muon/generateMuon.py
index 811ff698a99e..ce4edf59be65 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Muon/generateMuon.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Muon/generateMuon.py
@@ -25,10 +25,11 @@ from LArGeoAlgsNV.LArGMConfig import LArGMCfg
 from TileGeoModel.TileGMConfig import TileGMCfg
 from MuonConfig.MuonSegmentFindingConfig import MooSegmentFinderAlgCfg
 from MuonConfig.MuonTrackBuildingConfig import MuonTrackBuildingCfg
-from MuonCombinedConfig.MuonCombinedReconstructionConfig import MuonCombinedMuonCandidateAlgCfg
+from MuonCombinedConfig.MuonCombinedReconstructionConfig import MuonCombinedMuonCandidateAlgCfg, MuonInsideOutRecoAlgCfg
 from MuonCombinedConfig.MuonCombinedReconstructionConfig import MuonCombinedInDetCandidateAlg, MuonCombinedAlgCfg, MuonCreatorAlgCfg
 
-from TrigMuonEF.TrigMuonEFConfig_newJO import TrigMuonEFTrackIsolationAlgCfg
+from TrigMuonEF.TrigMuonEFConfig_newJO import TrigMuonEFTrackIsolationAlgCfg, MuonFilterAlgCfg, MergeEFMuonsAlgCfg
+from AthenaCommon.CFElements import seqAND, parOR, seqOR
 
 import pprint
 from AthenaCommon.Logging import logging
@@ -43,6 +44,9 @@ def EFMuonCBViewDataVerifierCfg(name):
     EFMuonCBViewDataVerifier.DataObjects = [( 'Muon::MdtPrepDataContainer' , 'StoreGateSvc+MDT_DriftCircles' ),  
                                             ( 'Muon::TgcPrepDataContainer' , 'StoreGateSvc+TGC_Measurements' ),
                                             ( 'Muon::RpcPrepDataContainer' , 'StoreGateSvc+RPC_Measurements' ),
+                                            ( 'Muon::CscStripPrepDataContainer' , 'StoreGateSvc+CSC_Measurements' ),
+                                            ( 'Muon::CscPrepDataContainer' , 'StoreGateSvc+CSC_Clusters' ),
+                                            ( 'Muon::HoughDataPerSectorVec' , 'StoreGateSvc+HoughDataPerSectorVec' ),
                                             ( 'xAOD::EventInfo' , 'StoreGateSvc+EventInfo' )]
     if 'FS' in name:
         EFMuonCBViewDataVerifier.DataObjects += [( 'MuonCandidateCollection' , 'StoreGateSvc+MuonCandidates_FS' )]
@@ -71,6 +75,7 @@ def EFMuonViewDataVerifierCfg(name='RoI'):
     result.addEventAlgo(EFMuonViewDataVerifier)
     return result
 
+
 def MuFastViewDataVerifier():
     result = ComponentAccumulator()
     alg = CompFactory.AthViews.ViewDataVerifier( name = "VDVMuFast",
@@ -402,12 +407,38 @@ def muEFCBStep(flags, chainDict, name='RoI'):
                                          InDetCandidateLocation="IndetCandidates_"+name, MuonContainerLocation = "MuonsCB_"+name, SegmentContainerName = "xaodCBSegments", TrackSegmentContainerName = "TrkCBSegments",
                                          ExtrapolatedLocation = "CBExtrapolatedMuons", MSOnlyExtrapolatedLocation = "CBMSonlyExtrapolatedMuons", CombinedLocation = "HLT_CBCombinedMuon_"+name)
     recoCB.mergeReco(muonCreatorCBCfg)
+
+    #Inside out recovery
+    finalMuons = "MuonsCB_"+name
+    if 'FS' not in name:
+        acc = ComponentAccumulator()
+        seqIO = seqOR("muonInsideOutSeq")
+        acc.addSequence(seqIO)
+        seqFilter = seqAND("muonFilterSeq")
+        acc.addSequence(seqFilter, seqIO.name)
+        muonFilterCfg = MuonFilterAlgCfg(flags, name="FilterZeroMuons", MuonContainerLocation="MuonsCB_"+name)
+        acc.merge(muonFilterCfg, sequenceName=seqFilter.name)
+        seqIOreco = parOR("muonInsideOutRecoSeq")
+        acc.addSequence(seqIOreco, parentName=seqFilter.name)
+        muonInsideOutCfg = MuonInsideOutRecoAlgCfg(flags, name="TrigMuonInsideOutRecoAlg", InDetCandidateLocation = "IndetCandidates_"+name)
+        acc.merge(muonInsideOutCfg, sequenceName=seqIOreco.name)
+        insideOutCreatorAlgCfg = MuonCreatorAlgCfg(flags, name="TrigMuonCreatorAlgInsideOut", TagMaps=["muGirlTagMap"], InDetCandidateLocation="IndetCandidates_"+name,
+                                                   MuonContainerLocation = "MuonsInsideOut_"+name, SegmentContainerName = "xaodInsideOutCBSegments", 
+                                                   TrackSegmentContainerName = "TrkInsideOutCBSegments", ExtrapolatedLocation = "InsideOutCBExtrapolatedMuons",
+                                                   MSOnlyExtrapolatedLocation = "InsideOutCBMSOnlyExtrapolatedMuons", CombinedLocation = "InsideOutCBCombinedMuon")
+        acc.merge(insideOutCreatorAlgCfg, sequenceName=seqIOreco.name)
+
+        finalMuons = "MuonsCBMerged"
+        muonMergeCfg = MergeEFMuonsAlgCfg(flags, name="MergeEFMuons", MuonCBContainerLocation = "MuonsCB_"+name,
+                                          MuonInsideOutContainerLocation = "MuonsInsideOut_"+name, MuonOutputLocation = finalMuons)
+        acc.merge(muonMergeCfg, sequenceName=seqIO.name)
+        recoCB.mergeReco(acc)
     
     selAccEFCB.mergeReco(recoCB)
 
     efmuCBHypo = efMuHypoCfg( flags,
                               name = 'TrigMuonEFCBHypo_'+name,
-                              inputMuons = "MuonsCB_"+name )
+                              inputMuons = finalMuons )
 
     selAccEFCB.addHypoAlgo(efmuCBHypo)
 
-- 
GitLab