From 5b7f59aeaf9e312fc8879d64a83b0481bc72d1eb Mon Sep 17 00:00:00 2001
From: Edward Moyse <edward.moyse@cern.ch>
Date: Wed, 4 Nov 2020 14:51:32 +0000
Subject: [PATCH] Attempt to clean up MuonCalibConfig I don't think that the
 approach of modifying the class, rather than an instance, is a good idea. I
 also worry that private tools are not being configured at all (specifically,
 the MdtCalibrationTool and MdtCalibrationDbTool). Attempting to fix this.
 This causes q431 changes, but this is probably expected.

---
 .../MdtCalibSvc/MdtCalibrationDbTool.h        |   3 +-
 .../MdtCalibSvc/src/MdtCalibrationDbTool.cxx  |   4 +
 .../MuonCnvExample/python/MuonCalibConfig.py  | 287 ++++++++++++++++--
 .../python/MuonCalibrationConfig.py           |  11 +-
 .../python/MuonRIO_OnTrackCreatorConfig.py    |  15 +-
 .../MuonConfig/python/MuonRdoDecodeConfig.py  |   8 +-
 .../MuonConfig/python/MuonRecToolsConfig.py   |   8 +-
 .../python/MuonSegmentFindingConfig.py        | 138 ++++-----
 .../python/MuonTrackBuildingConfig.py         |  20 +-
 .../python/MdtDigitizationConfig.py           |   6 +-
 .../CMakeLists.txt                            |   1 -
 .../MdtDriftCircleOnTrackCreator.h            |   5 +-
 .../share/MdtDriftCircleOnTrackCreator.py     |   5 -
 .../src/MdtDriftCircleOnTrackCreator.cxx      |   4 +
 .../python/MuonPrdProviderToolsConfig.py      |   1 +
 .../MuonRecExample/python/MuonRecTools.py     |   5 +-
 .../python/MuonCombinedRecToolsConfig.py      |  92 ++++--
 .../python/MuGirlTagTool.py                   |   3 +
 .../TrigL2MuonSA/python/TrigL2MuonSAConfig.py |  12 +-
 .../python/TrigL2MuonSAConfig_newJO.py        |   4 +-
 .../TrigMuonEF/python/TrigMuonEFConfig.py     |   4 +-
 .../python/HLTMenuConfig/Muon/MuonSetup.py    |   5 +-
 22 files changed, 453 insertions(+), 188 deletions(-)
 delete mode 100644 MuonSpectrometer/MuonReconstruction/MuonRIO_OnTrackCreators/MdtDriftCircleOnTrackCreator/share/MdtDriftCircleOnTrackCreator.py

diff --git a/MuonSpectrometer/MuonCalib/MdtCalib/MdtCalibSvc/MdtCalibSvc/MdtCalibrationDbTool.h b/MuonSpectrometer/MuonCalib/MdtCalib/MdtCalibSvc/MdtCalibSvc/MdtCalibrationDbTool.h
index b388cb86552c..f0fec1632a79 100644
--- a/MuonSpectrometer/MuonCalib/MdtCalib/MdtCalibSvc/MdtCalibSvc/MdtCalibrationDbTool.h
+++ b/MuonSpectrometer/MuonCalib/MdtCalib/MdtCalibSvc/MdtCalibSvc/MdtCalibrationDbTool.h
@@ -99,7 +99,8 @@ private:
   SG::ReadCondHandleKey<MdtRtRelationCollection> m_readKeyRt{this,"MdtRtRelationCollection","MdtRtRelationCollection","MDT RT relations"};
   SG::ReadCondHandleKey<MdtTubeCalibContainerCollection> m_readKeyTube{this,"MdtTubeCalibContainerCollection","MdtTubeCalibContainerCollection","MDT tube calib"};
   SG::ReadCondHandleKey<MdtCorFuncSetCollection> m_readKeyCor{this,"MdtCorFuncSetCollection","MdtCorFuncSetCollection","MDT cor Funcs"};
-
+  
+  Gaudi::Property<bool>               m_wasConfigured {this,"WasConfigured",false,"This tool is too complicated to rely on defaults. Will fail if not configured."};
 };
 
 #endif // MDTCALIBSVC_MDTCALIBRATIONDBTOOL_H
diff --git a/MuonSpectrometer/MuonCalib/MdtCalib/MdtCalibSvc/src/MdtCalibrationDbTool.cxx b/MuonSpectrometer/MuonCalib/MdtCalib/MdtCalibSvc/src/MdtCalibrationDbTool.cxx
index c438cb0cdbaa..f16d455e4b36 100644
--- a/MuonSpectrometer/MuonCalib/MdtCalib/MdtCalibSvc/src/MdtCalibrationDbTool.cxx
+++ b/MuonSpectrometer/MuonCalib/MdtCalib/MdtCalibSvc/src/MdtCalibrationDbTool.cxx
@@ -55,6 +55,10 @@ StatusCode MdtCalibrationDbTool::initialize() {
   ATH_CHECK(m_readKeyRt.initialize());
   ATH_CHECK(m_readKeyTube.initialize());
   ATH_CHECK(m_readKeyCor.initialize (m_createSlewingFunction || m_createWireSagFunction || m_create_b_field_function));
+  
+  if (!m_wasConfigured){
+    ATH_MSG_WARNING( "This tool is too complicated to rely on defaults. Potential configuration issue." );
+  }
 
   return StatusCode::SUCCESS;
 }  //end MdtCalibrationDbTool::initialize
diff --git a/MuonSpectrometer/MuonCnv/MuonCnvExample/python/MuonCalibConfig.py b/MuonSpectrometer/MuonCnv/MuonCnvExample/python/MuonCalibConfig.py
index 94608b056c31..084fcafe7551 100644
--- a/MuonSpectrometer/MuonCnv/MuonCnvExample/python/MuonCalibConfig.py
+++ b/MuonSpectrometer/MuonCnv/MuonCnvExample/python/MuonCalibConfig.py
@@ -162,48 +162,275 @@ def setupMdtCondDB():
         condSequence += MdtCalibDbAlg("MdtCalibDbAlg")
 
     if conddb.isOnline and not conddb.isMC:
-        MdtCalibDbAlg.TubeFolder = "/MDT/T0"
-        MdtCalibDbAlg.RtFolder = "/MDT/RT"
-        MdtCalibDbAlg.ReadKeyTube = "/MDT/T0"
-        MdtCalibDbAlg.ReadKeyRt = "/MDT/RT"
+        condSequence.MdtCalibDbAlg.TubeFolder = "/MDT/T0"
+        condSequence.MdtCalibDbAlg.RtFolder = "/MDT/RT"
+        condSequence.MdtCalibDbAlg.ReadKeyTube = "/MDT/T0"
+        condSequence.MdtCalibDbAlg.ReadKeyRt = "/MDT/RT"
     else:
-        MdtCalibDbAlg.TubeFolder = "/MDT/T0" + mdt_folder_name_appendix
-        MdtCalibDbAlg.RtFolder = "/MDT/RT" + mdt_folder_name_appendix
-        MdtCalibDbAlg.ReadKeyTube = "/MDT/T0" + mdt_folder_name_appendix
-        MdtCalibDbAlg.ReadKeyRt = "/MDT/RT" + mdt_folder_name_appendix
-    MdtCalibDbAlg.RT_InputFiles = ["Muon_RT_default.data"]
+        condSequence.MdtCalibDbAlg.TubeFolder = "/MDT/T0" + mdt_folder_name_appendix
+        condSequence.MdtCalibDbAlg.RtFolder = "/MDT/RT" + mdt_folder_name_appendix
+        condSequence.MdtCalibDbAlg.ReadKeyTube = "/MDT/T0" + mdt_folder_name_appendix
+        condSequence.MdtCalibDbAlg.ReadKeyRt = "/MDT/RT" + mdt_folder_name_appendix
+    condSequence.MdtCalibDbAlg.RT_InputFiles = ["Muon_RT_default.data"]
     if globalflags.DataSource == 'data':
-        MdtCalibDbAlg.defaultT0 = 40
+        condSequence.MdtCalibDbAlg.defaultT0 = 40
     elif globalflags.DataSource == 'geant4':
-        MdtCalibDbAlg.defaultT0 = 799
-    MdtCalibDbAlg.UseMLRt = mdtCalibFlags.useMLRt()
-    MdtCalibDbAlg.TimeSlewingCorrection = mdtCalibFlags.correctMdtRtForTimeSlewing()
-    MdtCalibDbAlg.MeanCorrectionVsR = [ -5.45973, -4.57559, -3.71995, -3.45051, -3.4505, -3.4834, -3.59509, -3.74869, -3.92066, -4.10799, -4.35237, -4.61329, -4.84111, -5.14524 ]
-    MdtCalibDbAlg.PropagationSpeedBeta = mdtCalibFlags.mdtPropagationSpeedBeta()
+        condSequence.MdtCalibDbAlg.defaultT0 = 799
+    condSequence.MdtCalibDbAlg.UseMLRt = mdtCalibFlags.useMLRt()
+    condSequence.MdtCalibDbAlg.TimeSlewingCorrection = mdtCalibFlags.correctMdtRtForTimeSlewing()
+    condSequence.MdtCalibDbAlg.MeanCorrectionVsR = [ -5.45973, -4.57559, -3.71995, -3.45051, -3.4505, -3.4834, -3.59509, -3.74869, -3.92066, -4.10799, -4.35237, -4.61329, -4.84111, -5.14524 ]
+    condSequence.MdtCalibDbAlg.PropagationSpeedBeta = mdtCalibFlags.mdtPropagationSpeedBeta()
     # the same as MdtCalibrationDbTool
-    MdtCalibDbAlg.CreateBFieldFunctions = mdtCalibFlags.correctMdtRtForBField()
-    MdtCalibDbAlg.CreateWireSagFunctions = mdtCalibFlags.correctMdtRtWireSag()
-    MdtCalibDbAlg.CreateSlewingFunctions = mdtCalibFlags.correctMdtRtForTimeSlewing()
+    condSequence.MdtCalibDbAlg.CreateBFieldFunctions = mdtCalibFlags.correctMdtRtForBField()
+    condSequence.MdtCalibDbAlg.CreateWireSagFunctions = mdtCalibFlags.correctMdtRtWireSag()
+    condSequence.MdtCalibDbAlg.CreateSlewingFunctions = mdtCalibFlags.correctMdtRtForTimeSlewing()
 
+def MdtCalibrationTool(name="MdtCalibrationTool", **kwargs):
     from MdtCalibSvc.MdtCalibSvcConf import MdtCalibrationTool
-    MdtCalibrationTool.DoSlewingCorrection = mdtCalibFlags.correctMdtRtForTimeSlewing()
+    kwargs.setdefault("DoSlewingCorrection", mdtCalibFlags.correctMdtRtForTimeSlewing())
+
     # Hack to use DoTemperatureCorrection for applyRtScaling; but applyRtScaling should not be used anyway, since MLRT can be used
-    MdtCalibrationTool.DoTemperatureCorrection = mdtCalibFlags.applyRtScaling()
-    MdtCalibrationTool.DoWireSagCorrection = mdtCalibFlags.correctMdtRtWireSag()
+    kwargs.setdefault("DoTemperatureCorrection", mdtCalibFlags.applyRtScaling())
+    kwargs.setdefault("DoWireSagCorrection", mdtCalibFlags.correctMdtRtWireSag())
+
     # for collisions cut away hits that are far outside of the MDT time window
     if beamFlags.beamType() == 'collisions':
-        MdtCalibrationTool.DoTofCorrection = True
-        if globalflags.DataSource() == 'geant4':
-            MdtCalibrationTool.TimeWindowSetting = mdtCalibWindowNumber('Collision_G4')
-        elif globalflags.DataSource() == 'data':
-            MdtCalibrationTool.TimeWindowSetting = mdtCalibWindowNumber('Collision_G4')
+        kwargs.setdefault("DoTofCorrection", True)
+
+        if globalflags.DataSource() == 'geant4' or globalflags.DataSource() == 'data':
+            kwargs.setdefault("TimeWindowSetting", mdtCalibWindowNumber('Collision_G4'))
     else: # cosmics or single beam
-        MdtCalibrationTool.DoTofCorrection = False
+        kwargs.setdefault("DoTofCorrection", False)
+    
+    kwargs.setdefault("CalibrationDbTool", MdtCalibrationDbTool())
 
+    return MdtCalibrationTool(name, **kwargs)
+
+def MdtCalibrationDbTool(name="MdtCalibrationDbTool", **kwargs):
     from MdtCalibSvc.MdtCalibSvcConf import MdtCalibrationDbTool
-    MdtCalibrationDbTool.CreateBFieldFunctions = mdtCalibFlags.correctMdtRtForBField()
-    MdtCalibrationDbTool.CreateWireSagFunctions = mdtCalibFlags.correctMdtRtWireSag()
-    MdtCalibrationDbTool.CreateSlewingFunctions = mdtCalibFlags.correctMdtRtForTimeSlewing()
+    kwargs.setdefault("CreateBFieldFunctions", mdtCalibFlags.correctMdtRtForBField())
+    kwargs.setdefault("CreateWireSagFunctions", mdtCalibFlags.correctMdtRtWireSag())
+    kwargs.setdefault("CreateSlewingFunctions", mdtCalibFlags.correctMdtRtForTimeSlewing())
+    kwargs.setdefault("WasConfigured", True)
+
+    return MdtCalibrationDbTool(name, **kwargs)
+
+
+# return a list of dictionaires containing the calib config info (keys etc)
+def getCalibConfigs():
+    global muonRecFlags,rec
+    configs = []
+    if muonRecFlags.calibMuonStandalone and (muonRecFlags.doStandalone or rec.readESD):
+#        try:
+            configs.append( muonRec.getConfig("MuonStandalone").getCalibConfig() )
+#        except KeyError:
+#            logMuon.warning("Could not get calibration config for MuonStandAlone - not adding MuonStandAlone info to calibration")
+#            muonRecFlags.calibMuonStandalone = False
+    else:
+        muonRecFlags.calibMuonStandalone = False
+
+    return configs
+        
+    
+
+## Setup MuonSegmenToCalibSegment algorithm.
+# @param[in] segmentKeys list of segment keys to use or single segments key (string)
+def getMuonSegmentToCalibSegment():
+    global topSequence,muonRecFlags
+    try:
+        return topSequence.MuonSegmentToCalibSegment
+    except AttributeError:
+            
+        from MuonCalibPatRec.MuonCalibPatRecConf import MuonCalib__MuonSegmentToCalibSegment
+        MuonSegmentToCalibSegment = MuonCalib__MuonSegmentToCalibSegment("MuonSegmentToCalibSegment")
+        # set consistent time-of-flight correction with MdtDriftCircleOnTrackCreator
+        mdtCreator = getPublicTool("MdtDriftCircleOnTrackCreator")
+        MuonSegmentToCalibSegment.DoTOF = getProperty(mdtCreator,"DoTofCorrection")
+        # when doing segment fits with floating t0's
+        MuonSegmentToCalibSegment.UpdateForT0Shift = type(MuonSegmentToCalibSegment.getDefaultProperty("UpdateForT0Shift")) (muonRecFlags.doSegmentT0Fit())
+        MuonSegmentToCalibSegment.UseCscSegments = False
+        MuonSegmentToCalibSegment.SegmentLocations = [ "MuonSegments" ]
+        MuonSegmentToCalibSegment.SegmentAuthors = [ 4,8 ] 
+        MuonSegmentToCalibSegment.ReadSegments = True # rather than SegmentCombinations
+
+        from MuonCnvExample import MuonCalibConfig
+        MuonCalibConfig.setupMdtCondDB()
+
+        MuonSegmentToCalibSegment.CalibrationTool = MuonCalibConfig.MdtCalibrationTool()
+
+        # finally add it to topSequence
+        topSequence += MuonSegmentToCalibSegment
+
+    return topSequence.MuonSegmentToCalibSegment
+
+
+## Setup the basic MuonCalibAlg algorithm. Needs further configuration after this call
+# depending on the use-case.
+# @param[in] evenTag The event tag written to file
+def getMuonCalibAlg(eventTag):
+    global topSequence,beamFlags
+    try:
+        return topSequence.MuonCalibAlg
+    except AttributeError:
+        from MuonCalibAlgs.MuonCalibAlgsConf import MuonCalib__MuonCalibAlg
+        MuonCalibAlg = MuonCalib__MuonCalibAlg("MuonCalibAlg",
+                                               doMDTs = muonRecFlags.doMDTs(),
+                                               doCSCs = muonRecFlags.doCSCs(),
+                                               doRPCs = muonRecFlags.doRPCs(),
+                                               doTGCs = (muonRecFlags.doTGCs() and muonRecFlags.calibNtupleRawTGC()),
+                                               doTGCCoinData = (muonRecFlags.doTGCs() and muonRecFlags.calibNtupleRawTGC()),
+                                               doTruth = rec.doTruth(),
+                                               DoPrdSelect = muonRecFlags.doPrdSelect(),  # optional cutting away of PRD hits to simulate dead channels
+                                               NtupleName = muonRecFlags.calibNtupleOutput(),  # set the name of the output calibration ntuple
+                                               EventTag = eventTag )
+
+        if beamFlags.beamType == 'singlebeam' or beamFlags.beamType == 'cosmics':
+            MuonCalibAlg.addTriggerTag = False
+        else:
+            MuonCalibAlg.addTriggerTag = rec.doTrigger()
+        MuonCalibAlg.doTruth=rec.doTruth()
+        topSequence += MuonCalibAlg
+        return topSequence.MuonCalibAlg
+
+
+def setupMuonCalibNtuple():
+    global topSequence,muonRecFlags,beamFlags,ToolSvc,rec,DetFlags
+    if not rec.doMuon() or not DetFlags.Muon_on():
+        logMuon.warning("Not setting up requested Muon Calibration Ntuple because Muons are off")
+        return
+    
+    logMuon.info("Setting up Muon Calibration Ntuple")
+    try:
+        configs = getCalibConfigs()
+        # MuonSegmentToCalibSegment is only needed if we want segments
+        if muonRecFlags.calibNtupleSegments and muonRecFlags.calibMuonStandalone:
+            MuonSegmentToCalibSegment = getMuonSegmentToCalibSegment()
+
+        # MuonCalibAlg is always needed
+        eventTag="UNKNOWN"
+        if (muonRecFlags.calibNtupleSegments or muonRecFlags.calibNtupleTracks) and muonRecFlags.calibMuonStandalone:
+            if len(configs) >= 1:
+                eventTag = configs[0]["eventTag"]
+        elif muonRecFlags.calibNtupleTrigger:
+            eventTag = "TRIG"
+        else:
+            eventTag = "HITS"
+
+        MuonCalibAlg = getMuonCalibAlg(eventTag)
+        # configure for writing ntuple
+        from MuonCalibTools.MuonCalibToolsConf import MuonCalib__PatternNtupleMaker
+        MuonCalibTool = MuonCalib__PatternNtupleMaker("MuonCalibPatternNtupleMaker")
+        MuonCalibTool.FillTruth = rec.doTruth()
+        MuonCalibTool.DoRawTGC = (muonRecFlags.doTGCs() and muonRecFlags.calibNtupleRawTGC())
+        ToolSvc += MuonCalibTool
+        MuonCalibAlg.MuonCalibTool = MuonCalibTool
+
+        # MuonCalibExtraTree only if we want to write tracks
+        if muonRecFlags.calibNtupleTracks:
+            MuonCalibTool.DelayFinish = True
+            from MuonCalibExtraTreeAlg.MuonCalibExtraTreeAlgConf import MuonCalib__MuonCalibExtraTreeAlg
+            MuonCalibExtraTreeAlg = MuonCalib__MuonCalibExtraTreeAlg("MuonCalibExtraTreeAlg",
+                                                                     NtupleName = "PatternNtupleMaker",
+                                                                     )
+            segmentOnTrackSelector=None
+            if hasattr(topSequence, "MuonSegmentToCalibSegment"):
+              from MuonCalibExtraTreeAlg.MuonCalibExtraTreeAlgConf import MuonCalib__SegmentOnTrackSelector
+              segmentOnTrackSelector=MuonCalib__SegmentOnTrackSelector()
+              segmentOnTrackSelector.PattternLocation = "PatternsForCalibration"
+              ToolSvc+=segmentOnTrackSelector
+              MuonCalibExtraTreeAlg.SegmentOnTrackSelector= segmentOnTrackSelector
+            if not rec.doMuonCombined():
+               tool_nr=0
+               from MuonCalibExtraTreeAlg.MuonCalibExtraTreeAlgConf import MuonCalib__ExtraTreeTrackFillerTool
+               resPullCalc=getPublicTool("ResidualPullCalculator")
+               for config in configs:
+                 trackDumpTool = MuonCalib__ExtraTreeTrackFillerTool("ExtraTreeTrackFillerTool" + str(tool_nr))
+                 trackDumpTool.TrackCollectionKey = config['tracksKey']
+                 trackDumpTool.SegmentAuthors = [config['segmentAuthor']]
+                 trackDumpTool.TrackAuthor = config['trackAuthor']
+                 trackDumpTool.PullCalculator = resPullCalc
+                 ToolSvc+=trackDumpTool
+                 MuonCalibExtraTreeAlg.TrackFillerTools.append(trackDumpTool)
+                 tool_nr+=1
+            # configure needed tools
+
+
+            # add to topSequence
+            topSequence += MuonCalibExtraTreeAlg
+
+
+        # MuonCalibExtraTreeTriggerAlg only if trigger is available
+        if muonRecFlags.calibNtupleTrigger: # and DetFlags.detdescr.LVL1_on() and DetFlags.haveRDO.LVL1_on():
+            # protect against running without AtlasTrigger project
+            doMuCTPI = True
+            if doMuCTPI:
+                try:
+                    from TrigT1RPCRecRoiSvc import TrigT1RPCRecRoiConfig
+                    from TrigT1TGCRecRoiSvc import TrigT1TGCRecRoiConfig
+                except ImportError:
+                    logMuon.warning("MuonCalibExtraTreeTriggerAlg.doMuCTPI = False because AtlasTrigger is not available")
+                    doMuCTPI = False
+
+            # delay writing of MuonCalibAlg
+            MuonCalibTool.DelayFinish = True
+            # also delay MuonCalibExtraTreeAlg if it is running
+            try:
+                topSequence.MuonCalibExtraTreeAlg.DelayFinish = True
+            except AttributeError:
+                pass
+            
+            from MuonCalibExtraTreeAlg.MuonCalibExtraTreeAlgConf import MuonCalib__MuonCalibExtraTreeTriggerAlg
+            topSequence += MuonCalib__MuonCalibExtraTreeTriggerAlg( 'MuonCalibExtraTreeTriggerAlg',
+                                                                    doMuCTPI   = doMuCTPI,
+                                                                    doLVL1Calo = rec.doTile() or rec.doLArg() or DetFlags.haveRDO.Calo_on(),
+                                                                    doMBTS     = rec.doTile() or DetFlags.haveRDO.Tile_on() )
+
+
+    except:
+        from AthenaCommon.Resilience import treatException
+        treatException("Problem in MuonCalib - Muon Calibration Ntuple configuration probably incomplete")
+
+
+
+def setupMuonCalib():
+    global topSequence,ToolSvc
+    if not rec.doMuon() or not DetFlags.Muon_on():
+        logMuon.warning("Not setting up requested Muon Calibration because Muons are off")
+        return
+
+    logMuon.info("Setting up Muon Calibration")
+    try:
+        from MuonCnvExample.MuonCalibFlags import muonCalibFlags
+        muonCalibFlags.setDefaults()
+
+        configs = getCalibConfigs()
+        #
+        # MuonSegmentToCalibSegment
+        #
+        calibConfig = muonRec.allConfigs()[0].getCalibConfig() #muonRec.getConfig(muonCalibFlags.EventTag()).getCalibConfig()
+        MuonSegmentToCalibSegment = getMuonSegmentToCalibSegment()
+        #
+        # MuonCalibAlg
+        #
+        MuonCalibAlg = getMuonCalibAlg(muonCalibFlags.EventTag())
+
+        from MdtCalibTools.MdtCalibToolsConf import MuonCalib__MdtCalibTool
+        MuonCalibTool = MuonCalib__MdtCalibTool()
+        calibMode = muonCalibFlags.Mode()
+        if calibMode == 'regionNtuple':
+            from MdtCalibTools.MdtCalibToolsConf import MuonCalib__MdtCalibNtupleMakerTool
+            MdtCalibTool = MuonCalib__MdtCalibNtupleMakerTool()
+        else:
+            raise RuntimeError( "Unknown Muon Calibration Mode: %r" % calibMode )
+
+        ToolSvc += MdtCalibTool
+        MuonCalibTool.MdtCalibTool = MdtCalibTool
+
+        ToolSvc += MuonCalibTool
+        MuonCalibAlg.MuonCalibTool = MuonCalibTool
+    except:
+        from AthenaCommon.Resilience import treatException
+        treatException("Problem in MuonCalib - Muon Calibration configuration probably incomplete")
 
 
 # return a list of dictionaires containing the calib config info (keys etc)
diff --git a/MuonSpectrometer/MuonConfig/python/MuonCalibrationConfig.py b/MuonSpectrometer/MuonConfig/python/MuonCalibrationConfig.py
index e54e9fe9ecda..20d1669aab84 100644
--- a/MuonSpectrometer/MuonConfig/python/MuonCalibrationConfig.py
+++ b/MuonSpectrometer/MuonConfig/python/MuonCalibrationConfig.py
@@ -69,10 +69,10 @@ def _setupMdtCondDB(flags):
 # end of function setupMdtCondDB()
 
 def MdtCalibrationToolCfg(flags, **kwargs):
-    result=MdtCalibrationDbToolCfg(flags, **kwargs)
-    mdt_calibibration_db_tool = result.getPrimary()
+    result=MdtCalibrationDbToolCfg(flags)
+    mdt_calibration_db_tool = result.getPrimary()
     
-    kwargs.setdefault("CalibrationDbTool", mdt_calibibration_db_tool)
+    kwargs.setdefault("CalibrationDbTool", mdt_calibration_db_tool)
     kwargs.setdefault("DoSlewingCorrection", flags.Muon.Calib.correctMdtRtForTimeSlewing)
     kwargs.setdefault("DoTemperatureCorrection", flags.Muon.Calib.applyRtScaling)
     kwargs.setdefault("DoWireSagCorrection", flags.Muon.Calib.correctMdtRtWireSag)
@@ -80,7 +80,7 @@ def MdtCalibrationToolCfg(flags, **kwargs):
     
     acc = MagneticFieldSvcCfg(flags)
     result.merge(acc)
-    
+
     MdtCalibrationTool = CompFactory.MdtCalibrationTool
     mdt_calibration_tool = MdtCalibrationTool(**kwargs)
     result.setPrivateTools(mdt_calibration_tool)
@@ -93,7 +93,8 @@ def MdtCalibrationDbToolCfg(flags, **kwargs):
     kwargs.setdefault("CreateBFieldFunctions", flags.Muon.Calib.correctMdtRtForBField)
     kwargs.setdefault("CreateWireSagFunctions", flags.Muon.Calib.correctMdtRtWireSag)
     kwargs.setdefault("CreateSlewingFunctions", flags.Muon.Calib.correctMdtRtForTimeSlewing)
-    
+    kwargs.setdefault("WasConfigured", True)
+
     MdtCalibrationDbTool = CompFactory.MdtCalibrationDbTool
     mdt_calibration_db_tool = MdtCalibrationDbTool(**kwargs)
     result.setPrivateTools(mdt_calibration_db_tool)
diff --git a/MuonSpectrometer/MuonConfig/python/MuonRIO_OnTrackCreatorConfig.py b/MuonSpectrometer/MuonConfig/python/MuonRIO_OnTrackCreatorConfig.py
index 94d30a541ef2..ba4b344dc0dc 100644
--- a/MuonSpectrometer/MuonConfig/python/MuonRIO_OnTrackCreatorConfig.py
+++ b/MuonSpectrometer/MuonConfig/python/MuonRIO_OnTrackCreatorConfig.py
@@ -72,15 +72,8 @@ def MdtDriftCircleOnTrackCreatorCfg(flags,name="MdtDriftCircleOnTrackCreator", *
     # acc = MdtCalibrationDbSvcCfg(flags)
     # result.merge(acc)
     
-    acc = MdtCalibrationDbToolCfg(flags)
-    mdt_calibibration_db_tool = acc.getPrimary()
-    result.merge(acc)
-    kwargs.setdefault("CalibrationDbTool", mdt_calibibration_db_tool)
-
-    acc = MdtCalibrationToolCfg(flags)
-    mdt_calibibration_tool = acc.getPrimary()
-    result.merge(acc)
-    kwargs.setdefault("CalibrationTool", mdt_calibibration_tool)
+    kwargs.setdefault("CalibrationDbTool", result.popToolsAndMerge( MdtCalibrationDbToolCfg(flags)))
+    kwargs.setdefault("CalibrationTool", result.popToolsAndMerge( MdtCalibrationToolCfg(flags)) )
 
     kwargs.setdefault("DoMagneticFieldCorrection", flags.Muon.Calib.correctMdtRtForBField)
     kwargs.setdefault("DoWireSag", flags.Muon.useWireSagCorrections)
@@ -107,8 +100,8 @@ def MdtDriftCircleOnTrackCreatorCfg(flags,name="MdtDriftCircleOnTrackCreator", *
 
     if flags.Muon.MuonTrigger:
         kwargs.setdefault("doMDT", False)
-                 
-    result.addPublicTool(Muon__MdtDriftCircleOnTrackCreator(name, **kwargs),primary=True)
+
+    result.addPublicTool(Muon__MdtDriftCircleOnTrackCreator(name, WasConfigured=True, **kwargs),primary=True)
     return result
     
 def MuonClusterOnTrackCreatorCfg(flags,name="MuonClusterOnTrackCreator", **kwargs):
diff --git a/MuonSpectrometer/MuonConfig/python/MuonRdoDecodeConfig.py b/MuonSpectrometer/MuonConfig/python/MuonRdoDecodeConfig.py
index b78e56be7379..fc3cacf94098 100644
--- a/MuonSpectrometer/MuonConfig/python/MuonRdoDecodeConfig.py
+++ b/MuonSpectrometer/MuonConfig/python/MuonRdoDecodeConfig.py
@@ -121,6 +121,7 @@ def TgcRDODecodeCfg(flags, forTrigger=False):
 
 def MdtRDODecodeCfg(flags, forTrigger=False):
     acc = ComponentAccumulator()
+    from MuonConfig.MuonCalibrationConfig import MdtCalibrationToolCfg
 
     # We need the MDT cabling to be setup
     from MuonConfig.MuonCablingConfig import MDTCablingConfigCfg
@@ -135,13 +136,14 @@ def MdtRDODecodeCfg(flags, forTrigger=False):
 
     # Get the RDO -> PRD tool
     Muon__MdtRdoToPrepDataToolMT=CompFactory.Muon.MdtRdoToPrepDataToolMT
-    MdtRdoToMdtPrepDataTool = Muon__MdtRdoToPrepDataToolMT(name = "MdtRdoToMdtPrepDataTool")
-    
+    calibTool =  acc.popToolsAndMerge( MdtCalibrationToolCfg(flags)) 
+    MdtRdoToMdtPrepDataTool = Muon__MdtRdoToPrepDataToolMT(name = "MdtRdoToMdtPrepDataTool", CalibrationTool = calibTool)
+
     # Get the RDO -> PRD alorithm
     MdtRdoToMdtPrepData=CompFactory.MdtRdoToMdtPrepData
     MdtRdoToMdtPrepData = MdtRdoToMdtPrepData(name          = "MdtRdoToMdtPrepData",
                                               DecodingTool  = MdtRdoToMdtPrepDataTool,
-                                              PrintPrepData = False )
+                                              PrintPrepData = False)
     # add RegSelTool
     from RegionSelector.RegSelToolConfig import regSelTool_MDT_Cfg
     MdtRdoToMdtPrepData.RegSel_MDT = acc.popToolsAndMerge( regSelTool_MDT_Cfg( flags ) )
diff --git a/MuonSpectrometer/MuonConfig/python/MuonRecToolsConfig.py b/MuonSpectrometer/MuonConfig/python/MuonRecToolsConfig.py
index 11021421ac1b..e6931c765db9 100644
--- a/MuonSpectrometer/MuonConfig/python/MuonRecToolsConfig.py
+++ b/MuonSpectrometer/MuonConfig/python/MuonRecToolsConfig.py
@@ -37,10 +37,11 @@ def MuonTrackToSegmentToolCfg(flags,name="MuonTrackToSegmentTool", **kwargs):
 
 def MuonSeededSegmentFinderCfg(flags,name="MuonSeededSegmentFinder", **kwargs):
     Muon__MuonSeededSegmentFinder=CompFactory.Muon.MuonSeededSegmentFinder
-    from MuonConfig.MuonSegmentFindingConfig import DCMathSegmentMakerCfg, MdtMathSegmentFinder # FIXME - should really shift this to RecTools then.
+    from MuonConfig.MuonSegmentFindingConfig import DCMathSegmentMakerCfg, MdtMathSegmentFinderCfg # FIXME - should really shift this to RecTools then.
+    from MuonConfig.MuonRIO_OnTrackCreatorConfig import MdtDriftCircleOnTrackCreatorCfg
     result = ComponentAccumulator()
     
-    mdt_segment_finder = MdtMathSegmentFinder(flags, name="MCTBMdtMathSegmentFinder", UseChamberTheta = False, AssociationRoadWidth = 1.5)
+    mdt_segment_finder = result.popToolsAndMerge( MdtMathSegmentFinderCfg(flags, name="MCTBMdtMathSegmentFinder", UseChamberTheta = False, AssociationRoadWidth = 1.5) )
     result.addPublicTool(mdt_segment_finder)
     
     if "SegmentMaker" not in kwargs or "SegmentMakerNoHoles" not in kwargs:
@@ -62,6 +63,9 @@ def MuonSeededSegmentFinderCfg(flags,name="MuonSeededSegmentFinder", **kwargs):
         kwargs.setdefault("MMPrepDataContainer","")
     
     kwargs.setdefault("Printer", MuonEDMPrinterTool(flags) )
+    acc = MdtDriftCircleOnTrackCreatorCfg(flags)
+    kwargs.setdefault("MdtRotCreator", acc.getPrimary())
+    result.merge(acc)
 
     kwargs.setdefault('TgcPrepDataContainer', 'TGC_MeasurementsAllBCs' if not flags.Muon.useTGCPriorNextBC and not flags.Muon.useTGCPriorNextBC else 'TGC_Measurements')
     
diff --git a/MuonSpectrometer/MuonConfig/python/MuonSegmentFindingConfig.py b/MuonSpectrometer/MuonConfig/python/MuonSegmentFindingConfig.py
index 01f3e5942990..65126bb8a945 100644
--- a/MuonSpectrometer/MuonConfig/python/MuonSegmentFindingConfig.py
+++ b/MuonSpectrometer/MuonConfig/python/MuonSegmentFindingConfig.py
@@ -23,7 +23,7 @@ Muon__MuonSegmentSelectionTool=CompFactory.getComp("Muon::MuonSegmentSelectionTo
 Muon__MuonClusterSegmentFinder=CompFactory.getComp("Muon::MuonClusterSegmentFinder")
 
 #Local
-from MuonConfig.MuonCalibrationConfig import MdtCalibDbAlgCfg
+from MuonConfig.MuonCalibrationConfig import MdtCalibrationDbToolCfg
 from MuonConfig.MuonRecToolsConfig import MCTBFitterCfg, MuonAmbiProcessorCfg, MuonStationIntersectSvcCfg, MuonTrackCleanerCfg, MuonTrackSummaryToolCfg, MuonEDMPrinterTool
 from MuonConfig.MuonRIO_OnTrackCreatorConfig import MdtCalibWindowNumber
 
@@ -76,16 +76,17 @@ def AdjustableT0Tool(flags,**kwargs):
     AdjT0__AdjustableT0Tool=CompFactory.getComp("AdjT0::AdjustableT0Tool")
     return AdjT0__AdjustableT0Tool(**kwargs)
 
-def MdtMathSegmentFinder(flags,name="MdtMathSegmentFinder", **kwargs):
+def MdtMathSegmentFinderCfg(flags,name="MdtMathSegmentFinder", **kwargs):
     # beamType       = getattr(extraFlags,"beamType", beamFlags.beamType())
     # doSegmentT0Fit = getattr(extraFlags,"doSegmentT0Fit",muonRecFlags.doSegmentT0Fit())
     # enableCurvedSegmentFinding = getattr(extraFlags,"enableCurvedSegmentFinding", muonStandaloneFlags.enableCurvedSegmentFinding())
+    result = ComponentAccumulator()
 
     if flags.Muon.doSegmentT0Fit:
         kwargs.setdefault("AssociationRoadWidth", 3.)
         kwargs.setdefault("MDTAssocationPullcut", 3.)
         kwargs.setdefault("RecoverMdtOutliers", False)
-        kwargs.setdefault("DCFitProvider", "MdtSegmentT0Fitter" )
+        kwargs.setdefault("DCFitProvider", result.popToolsAndMerge(MdtSegmentT0FitterCfg(flags) ) )
 
     if flags.Beam.Type == 'singlebeam' or flags.Beam.Type == 'cosmics' or flags.Input.isMC is False:
         kwargs.setdefault("AssociationRoadWidth", 2.)
@@ -94,8 +95,8 @@ def MdtMathSegmentFinder(flags,name="MdtMathSegmentFinder", **kwargs):
 
     if flags.Muon.enableCurvedSegmentFinding:
         kwargs.setdefault("DoCurvedSegmentFinder",True)
-
-    return Muon__MdtMathSegmentFinder(name=name,**kwargs)
+    result.setPrivateTools(Muon__MdtMathSegmentFinder(name=name,**kwargs))
+    return result
 
 def MuonSegmentFittingToolCfg(flags, **kwargs):
     # declareProperty("SLPropagator",   m_slPropagator);
@@ -131,8 +132,13 @@ def MuonSegmentFittingToolCfg(flags, **kwargs):
     result.setPrivateTools(Muon__MuonSegmentFittingTool(**kwargs))    
     return result
 
+def MdtSegmentT0FitterCfg(flags, name="MdtSegmentT0Fitter", **kwargs):
+    result = MdtCalibrationDbToolCfg(flags) # Needed by MdtSegmentT0Fitter
+    kwargs.setdefault("CalibrationDbTool", result.popPrivateTools())
+    result.setPrivateTools(CompFactory.TrkDriftCircleMath.MdtSegmentT0Fitter(name, **kwargs))    
+    return result
+
 def DCMathSegmentMakerCfg(flags, **kwargs):    
-    TrkDriftCircleMath__MdtSegmentT0Fitter=CompFactory.TrkDriftCircleMath.MdtSegmentT0Fitter
     from MuonConfig.MuonRIO_OnTrackCreatorConfig import MdtDriftCircleOnTrackCreatorCfg, MuonClusterOnTrackCreatorCfg, TriggerChamberClusterOnTrackCreatorCfg
     from MuonConfig.MuonCondAlgConfig import MdtCondDbAlgCfg
      
@@ -160,12 +166,7 @@ def DCMathSegmentMakerCfg(flags, **kwargs):
     kwargs.setdefault("AssumePointingPhi", beamType != 'cosmics')
     kwargs.setdefault("OutputFittedT0", True)
 
-    acc = MdtCalibDbAlgCfg(flags) # Needed by MdtSegmentT0Fitter
-    result.merge(acc)
-
-    mdt_segment_t0_fitter = TrkDriftCircleMath__MdtSegmentT0Fitter()
-    result.addPublicTool(mdt_segment_t0_fitter)
-    kwargs.setdefault("DCFitProvider", mdt_segment_t0_fitter)
+    kwargs.setdefault("DCFitProvider", result.popToolsAndMerge(MdtSegmentT0FitterCfg(flags)))
     #kwargs.setdefault("CurvedErrorScaling", False)
     kwargs.setdefault("UsePreciseError", True)
     kwargs.setdefault("SinAngleCut", 0.4)
@@ -183,11 +184,10 @@ def DCMathSegmentMakerCfg(flags, **kwargs):
         mdt_dcot_CA = MdtDriftCircleOnTrackCreatorCfg(flags, name="MdtDriftCircleOnTrackCreatorAdjustableT0", TimingMode=3, \
                    DoTofCorrection=True, TimeWindowSetting=MdtCalibWindowNumber('Collision_data'))
         result.merge(mdt_dcot_CA)
-        mdt_creator=acc.getPrimary()
-        kwargs.setdefault("MdtCreatorT0", mdt_creator) # TODO - is this correct? 
-        mdt_math_segment_finder = MdtMathSegmentFinder(flags, doSegmentT0Fit=True)
+        kwargs.setdefault("MdtCreatorT0", mdt_dcot_CA.getPrimary()) # TODO - is this correct? 
+        mdt_math_segment_finder = result.popToolsAndMerge(MdtMathSegmentFinderCfg(flags, doSegmentT0Fit=True))
     else:
-        mdt_math_segment_finder = MdtMathSegmentFinder(flags)
+        mdt_math_segment_finder = result.popToolsAndMerge(MdtMathSegmentFinderCfg(flags))
         
     result.addPublicTool(mdt_math_segment_finder)
     kwargs.setdefault("MdtSegmentFinder", mdt_math_segment_finder )
@@ -522,81 +522,52 @@ def MooSegmentFinderCfg(flags, name='MooSegmentFinder', **kwargs):
     return result
 
 def MuonClusterSegmentFinderToolCfg(flags, **kwargs):
-    #m_slTrackFitter("Trk::GlobalChi2Fitter/MCTBSLFitter"),
-    #m_ambiTool("Trk::SimpleAmbiguityProcessorTool/MuonAmbiProcessor"),
-    #m_trackToSegmentTool("Muon::MuonTrackToSegmentTool/MuonTrackToSegmentTool"),
-    #m_printer("Muon::MuonEDMPrinterTool/MuonEDMPrinterTool"),
-    #m_edmHelperSvc("Muon::MuonEDMHelperSvc/MuonEDMHelperSvc"),
-    #m_trackCleaner("Muon::MuonTrackCleaner/MuonTrackCleaner") {
-    #declareProperty("SLFitter",            m_slTrackFitter);
-    #declareProperty("SegmentAmbiguityTool",m_ambiTool);
-    #declareProperty("TrackToSegmentTool",  m_trackToSegmentTool);
-    #declareProperty("TrackCleaner",        m_trackCleaner);
+    from MuonConfig.MuonRecToolsConfig import MuonTrackToSegmentToolCfg
     result=ComponentAccumulator()
+    # Won't explicitly configure MuonIdHelperSvc
+    # Won't explicitly configure MuonEDMHelperSvc
+    kwargs.setdefault('SegmentAmbiguityTool', result.popToolsAndMerge( MuonAmbiProcessorCfg(flags) ) ) 
+    kwargs.setdefault('SLFitter', result.popToolsAndMerge( MCTBFitterCfg(flags, name = "SLFitter", StraightLine=True) ) ) 
+    kwargs.setdefault("TrackToSegmentTool", result.popToolsAndMerge( MuonTrackToSegmentToolCfg(flags) ) )
+    kwargs.setdefault("Printer", MuonEDMPrinterTool(flags) )
+    kwargs.setdefault('TrackCleaner', result.popToolsAndMerge( MuonTrackCleanerCfg(flags) ) ) 
+    kwargs.setdefault('TrackSummaryTool', result.popToolsAndMerge( MuonTrackSummaryToolCfg(flags) ) ) 
 
-    acc = MCTBFitterCfg(flags, name = "SLFitter", StraightLine=True)
-    slfitter = acc.getPrimary()      
-    result.addPublicTool(slfitter)
-    result.merge(acc)
-    kwargs.setdefault("SLFitter", slfitter)
-
-    acc = MuonTrackCleanerCfg(flags)
-    cleaner = acc.getPrimary()      
-    result.addPublicTool(cleaner)
-    kwargs.setdefault("TrackCleaner", cleaner)
-    result.merge(acc)
-
-    acc = MuonTrackSummaryToolCfg(flags)
-    track_summary = acc.getPrimary( )
-    result.addPublicTool(track_summary)
-    kwargs.setdefault('TrackSummaryTool', track_summary)
-    result.merge(acc)
-
-    acc  = MuonAmbiProcessorCfg(flags, name='MuonAmbiProcessor')
-    ambi = acc.popPrivateTools()      
-    acc.addPublicTool(ambi)
-    result.merge(acc)
-    kwargs.setdefault("SegmentAmbiguityTool", ambi)
-
-    # FIXME - remaining tools
     result.setPrivateTools(Muon__MuonClusterSegmentFinderTool(**kwargs))
     return result
-    
-def MuonClusterSegmentFinderCfg(flags, **kwargs):
-    #declareProperty("MuonClusterizationTool", m_clusterTool);
-    #declareProperty("MuonEDMPrinterTool",m_printer );    
-    #declareProperty("MuonPRDSelectionTool", m_muonPRDSelectionTool );
-    #declareProperty("MdtSegmentMaker",m_segmentMaker);
-    #declareProperty("SLFitter",            m_slTrackFitter);
-    #declareProperty("TrackToSegmentTool",  m_trackToSegmentTool);
-    #declareProperty("AmbiguityProcessor",m_ambiguityProcessor);
-    #declareProperty("TrackCleaner",        m_trackCleaner);
-    result=ComponentAccumulator()
-    # FIXME - rest of the tools.
 
-    acc = DCMathSegmentMakerCfg(flags,name="DCMathSegmentMaker")
-    segment_maker = acc.getPrimary()      
-    acc.addPublicTool(segment_maker)
-    kwargs.setdefault('MdtSegmentMaker', segment_maker)
+def MuonPRDSelectionToolCfg( flags, name="MuonPRDSelectionTool", **kwargs):
+    from MuonConfig.MuonRIO_OnTrackCreatorConfig import MuonClusterOnTrackCreatorCfg, MdtDriftCircleOnTrackCreatorCfg
+    # Won't explicitly configure MuonIdHelperSvc
+    result=MdtDriftCircleOnTrackCreatorCfg(flags)
+    kwargs.setdefault("MdtDriftCircleOnTrackCreator", result.getPrimary())
+    acc = MuonClusterOnTrackCreatorCfg(flags)
+    kwargs.setdefault("MuonClusterOnTrackCreator", acc.getPrimary() )
     result.merge(acc)
+    # Won't explicitly configure MuonRecoValidationTool (but it would need configuration if used)
+    result.setPrivateTools(CompFactory.Muon.MuonPRDSelectionTool(**kwargs))
+    return result
 
-    acc = MCTBFitterCfg(flags, name = "SLFitter", StraightLine=True)
-    slfitter = acc.getPrimary()      
-    acc.addPublicTool(slfitter)
-    result.merge(acc)
-    kwargs.setdefault("SLFitter", slfitter)
-    
-    acc  = MuonAmbiProcessorCfg(flags, name='NewMuonAmbiProcessor')
-    ambi = acc.getPrimary()      
-    acc.addPublicTool(ambi)
-    result.merge(acc)
-    kwargs.setdefault("AmbiguityProcessor", ambi)
+def MuonClusterSegmentFinderCfg(flags, **kwargs):
+    from MuonConfig.MuonRecToolsConfig import MuonTrackToSegmentToolCfg
+    from MuonConfig.MuonRIO_OnTrackCreatorConfig import MuonClusterOnTrackCreatorCfg
 
-    acc = MuonTrackCleanerCfg(flags)
-    cleaner = acc.getPrimary()      
-    acc.addPublicTool(cleaner)
+    result=ComponentAccumulator()
+
+    # Won't explicitly configure MuonIdHelperSvc
+    kwargs.setdefault("MuonEDMPrinterTool", MuonEDMPrinterTool(flags) )
+    # Won't explicitly configure MuonLayerHashProviderTool
+    kwargs.setdefault("MuonPRDSelectionTool", result.popToolsAndMerge( MuonPRDSelectionToolCfg(flags) ) )
+    kwargs.setdefault('MdtSegmentMaker', result.popToolsAndMerge( DCMathSegmentMakerCfg(flags,name="DCMathSegmentMaker") ) ) 
+    # Won't explicitly configure MuonClusterizationTool
+    acc = MuonClusterOnTrackCreatorCfg(flags) # This only sets a public tool at the moment, so need to it like this. FIXME
+    kwargs.setdefault("MuonClusterOnTrackCreator", acc.getPrimary() )
     result.merge(acc)
-    kwargs.setdefault("TrackCleaner", cleaner)
+    kwargs.setdefault("TrackToSegmentTool", result.popToolsAndMerge( MuonTrackToSegmentToolCfg(flags) ) )
+    kwargs.setdefault('SLFitter', result.popToolsAndMerge( MCTBFitterCfg(flags, name = "SLFitter", StraightLine=True) ) ) 
+    kwargs.setdefault('AmbiguityProcessor', result.popToolsAndMerge( MuonAmbiProcessorCfg(flags) ) ) 
+    kwargs.setdefault('TrackCleaner', result.popToolsAndMerge( MuonTrackCleanerCfg(flags) ) ) 
+    # Won't explicitly configure MuonSegmentOverlapRemovalTool (though it possibly needs it)
 
     result.addPublicTool(Muon__MuonClusterSegmentFinder(**kwargs),primary=True)
     return result
@@ -738,8 +709,7 @@ if __name__=="__main__":
     
     itemsToRecord = ["Trk::SegmentCollection#MuonSegments", "Trk::SegmentCollection#NCB_MuonSegments"]
     SetupMuonStandaloneOutput(cfg, ConfigFlags, itemsToRecord)
-    
-    
+
     # cfg.getService("StoreGateSvc").Dump = True
     cfg.printConfig()
     f=open("MuonSegmentFinding.pkl","wb")
diff --git a/MuonSpectrometer/MuonConfig/python/MuonTrackBuildingConfig.py b/MuonSpectrometer/MuonConfig/python/MuonTrackBuildingConfig.py
index 04fdddd8b1a2..db3bdc49f100 100644
--- a/MuonSpectrometer/MuonConfig/python/MuonTrackBuildingConfig.py
+++ b/MuonSpectrometer/MuonConfig/python/MuonTrackBuildingConfig.py
@@ -18,9 +18,7 @@ def MooTrackFitterCfg(flags, name = 'MooTrackFitter', **kwargs):
     result.addPublicTool(mctb_fitter)
     kwargs.setdefault("Fitter",          mctb_fitter)
     kwargs.setdefault("FitterPreFit",          mctb_fitter)
-    
-    # FIXME MuPatHitTool currently isn't configured, but should be.
-    MuPatHitToolCfg
+        
     acc = MuPatHitToolCfg(flags)
     mu_pat_hit_tool = acc.getPrimary()
     result.addPublicTool(mu_pat_hit_tool)
@@ -341,6 +339,8 @@ def MuPatCandidateToolCfg(flags, name="MuPatCandidateTool", **kwargs):
     Muon__MuPatCandidateTool=CompFactory.Muon.MuPatCandidateTool
     # https://gitlab.cern.ch/atlas/athena/blob/release/22.0.3/MuonSpectrometer/MuonReconstruction/MuonRecExample/python/MuPatTools.py#L32
     from MuonConfig.MuonRIO_OnTrackCreatorConfig import CscClusterOnTrackCreatorCfg,MdtDriftCircleOnTrackCreatorCfg
+    from MuonConfig.MuonRecToolsConfig import MuPatHitToolCfg
+
     result = MdtDriftCircleOnTrackCreatorCfg(flags)
     mdt_dcot_creator = result.getPrimary()
     kwargs.setdefault("MdtRotCreator", mdt_dcot_creator)
@@ -352,16 +352,28 @@ def MuPatCandidateToolCfg(flags, name="MuPatCandidateTool", **kwargs):
         
     kwargs.setdefault("MuonPrinterTool", MuonEDMPrinterTool(flags) )
 
+    acc = MuPatHitToolCfg(flags)
+    mu_pat_hit_tool = acc.getPrimary()
+    result.merge(acc)
+    kwargs.setdefault("HitTool",          mu_pat_hit_tool)
+
     mu_pat_cand_tool = Muon__MuPatCandidateTool(name, **kwargs)
     result.setPrivateTools(mu_pat_cand_tool)
     return result
     
 def MuonChamberHoleRecoveryToolCfg(flags, name="MuonChamberHoleRecoveryTool", **kwargs):
+    from MuonConfig.MuonRIO_OnTrackCreatorConfig import CscClusterOnTrackCreatorCfg,MdtDriftCircleOnTrackCreatorCfg
+
     Muon__MuonChamberHoleRecoveryTool=CompFactory.Muon.MuonChamberHoleRecoveryTool
     result=ComponentAccumulator()
+    # Not setting explicitly MuonStationIntersectSvc
+    acc = MdtDriftCircleOnTrackCreatorCfg(flags)
+    mdt_dcot_creator = acc.getPrimary()
+    kwargs.setdefault("MdtRotCreator", mdt_dcot_creator)
+    result.merge(acc)
+
     kwargs.setdefault("AddMeasurements",  not flags.Muon.doSegmentT0Fit )
     if flags.Detector.GeometryCSC:
-        from MuonConfig.MuonRIO_OnTrackCreatorConfig import CscClusterOnTrackCreatorCfg
         extrakwargs={}
         if flags.Muon.enableErrorTuning or not flags.Input.isMC:
             extrakwargs["ErrorScalerBeta"] = 0.200
diff --git a/MuonSpectrometer/MuonDigitization/MDT_Digitization/python/MdtDigitizationConfig.py b/MuonSpectrometer/MuonDigitization/MDT_Digitization/python/MdtDigitizationConfig.py
index e82b1c285072..b8217bc24629 100644
--- a/MuonSpectrometer/MuonDigitization/MDT_Digitization/python/MdtDigitizationConfig.py
+++ b/MuonSpectrometer/MuonDigitization/MDT_Digitization/python/MdtDigitizationConfig.py
@@ -19,7 +19,9 @@ def MDT_LastXing():
     return 150
 
 def MdtDigitizationTool(name="MdtDigitizationTool",**kwargs):
-   import MuonCondAlg.MdtCondDbAlgConfig # noqa: F401 (MT-safe conditions access)
+   import MuonCondAlg.MdtCondDbAlgConfig # noqa: F401 MT-safe conditions access 
+   from MuonCnvExample import MuonCalibConfig
+
    kwargs.setdefault("MaskedStations", [])
    kwargs.setdefault("UseDeadChamberSvc", True)
    kwargs.setdefault("DiscardEarlyHits", True)
@@ -50,6 +52,8 @@ def MdtDigitizationTool(name="MdtDigitizationTool",**kwargs):
       kwargs.setdefault("OutputSDOName", overlayFlags.bkgPrefix() + "MDT_SDO")
    else:
       kwargs.setdefault("OutputSDOName", "MDT_SDO")
+   
+   kwargs.setdefault("CalibrationDbTool", MuonCalibConfig.MdtCalibrationDbTool()) 
 
    return CfgMgr.MdtDigitizationTool(name,**kwargs)
       #return CfgMgr.MDT_PileUpTool(name,**kwargs)
diff --git a/MuonSpectrometer/MuonReconstruction/MuonRIO_OnTrackCreators/MdtDriftCircleOnTrackCreator/CMakeLists.txt b/MuonSpectrometer/MuonReconstruction/MuonRIO_OnTrackCreators/MdtDriftCircleOnTrackCreator/CMakeLists.txt
index a6936e0f8d83..f2f9a3a07ab7 100644
--- a/MuonSpectrometer/MuonReconstruction/MuonRIO_OnTrackCreators/MdtDriftCircleOnTrackCreator/CMakeLists.txt
+++ b/MuonSpectrometer/MuonReconstruction/MuonRIO_OnTrackCreators/MdtDriftCircleOnTrackCreator/CMakeLists.txt
@@ -17,5 +17,4 @@ atlas_add_component( MdtDriftCircleOnTrackCreator
 
 # Install files from the package:
 atlas_install_headers( MdtDriftCircleOnTrackCreator )
-atlas_install_joboptions( share/*.py )
 
diff --git a/MuonSpectrometer/MuonReconstruction/MuonRIO_OnTrackCreators/MdtDriftCircleOnTrackCreator/MdtDriftCircleOnTrackCreator/MdtDriftCircleOnTrackCreator.h b/MuonSpectrometer/MuonReconstruction/MuonRIO_OnTrackCreators/MdtDriftCircleOnTrackCreator/MdtDriftCircleOnTrackCreator/MdtDriftCircleOnTrackCreator.h
index 77f8091767c2..151382ed3b35 100644
--- a/MuonSpectrometer/MuonReconstruction/MuonRIO_OnTrackCreators/MdtDriftCircleOnTrackCreator/MdtDriftCircleOnTrackCreator/MdtDriftCircleOnTrackCreator.h
+++ b/MuonSpectrometer/MuonReconstruction/MuonRIO_OnTrackCreators/MdtDriftCircleOnTrackCreator/MdtDriftCircleOnTrackCreator/MdtDriftCircleOnTrackCreator.h
@@ -189,8 +189,8 @@ namespace Muon {
       double muonErrorStrategy(const MuonDriftCircleErrorStrategy* myStrategy, double sigmaR, const Identifier& id) const;
       
       ServiceHandle<Muon::IMuonIdHelperSvc> m_idHelperSvc {this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"};
-      ToolHandle<MdtCalibrationTool> m_mdtCalibrationTool{this,"CalibrationTool","MdtCalibrationTool"};
-      ToolHandle<MdtCalibrationDbTool> m_mdtCalibrationDbTool{this,"CalibrationDbTool","MdtCalibrationDbTool"};
+      ToolHandle<MdtCalibrationTool>        m_mdtCalibrationTool{this,"CalibrationTool","MdtCalibrationTool"};
+      ToolHandle<MdtCalibrationDbTool>      m_mdtCalibrationDbTool{this,"CalibrationDbTool","MdtCalibrationDbTool"};
 
       // Configuration variables
       bool                                 m_doMdt; //!< Process MDT ROTs
@@ -218,6 +218,7 @@ namespace Muon {
       bool                                m_doIndividualChamberReweights; //!< Deweight individual chambers
       bool                                m_isMC; //!< toggle between MC and data alignment errors (to be removed in rel. 21!)
       bool                                m_looseErrors; //!< toggle between loose errors (initial before alignment) and tight after alignment
+      Gaudi::Property<bool>               m_wasConfigured {this,"WasConfigured",false,"This tool is too complicated to rely on defaults. Will fail if not configured."};
     
       const double m_inverseSpeedOfLight = 1 / Gaudi::Units::c_light; // need 1/299.792458, needed inside timeOfFlight()
     };
diff --git a/MuonSpectrometer/MuonReconstruction/MuonRIO_OnTrackCreators/MdtDriftCircleOnTrackCreator/share/MdtDriftCircleOnTrackCreator.py b/MuonSpectrometer/MuonReconstruction/MuonRIO_OnTrackCreators/MdtDriftCircleOnTrackCreator/share/MdtDriftCircleOnTrackCreator.py
deleted file mode 100644
index 1d5dfaa87b2b..000000000000
--- a/MuonSpectrometer/MuonReconstruction/MuonRIO_OnTrackCreators/MdtDriftCircleOnTrackCreator/share/MdtDriftCircleOnTrackCreator.py
+++ /dev/null
@@ -1,5 +0,0 @@
-print "***** WARNING ******************************************************************"
-print " The file MdtDriftCircleOnTrackCreator/MdtDriftCircleOnTrackCreator.py"
-print "          is currently obsolete."
-print "********************************************************************************"
-
diff --git a/MuonSpectrometer/MuonReconstruction/MuonRIO_OnTrackCreators/MdtDriftCircleOnTrackCreator/src/MdtDriftCircleOnTrackCreator.cxx b/MuonSpectrometer/MuonReconstruction/MuonRIO_OnTrackCreators/MdtDriftCircleOnTrackCreator/src/MdtDriftCircleOnTrackCreator.cxx
index d7d7affb396f..832872863f90 100644
--- a/MuonSpectrometer/MuonReconstruction/MuonRIO_OnTrackCreators/MdtDriftCircleOnTrackCreator/src/MdtDriftCircleOnTrackCreator.cxx
+++ b/MuonSpectrometer/MuonReconstruction/MuonRIO_OnTrackCreators/MdtDriftCircleOnTrackCreator/src/MdtDriftCircleOnTrackCreator.cxx
@@ -137,6 +137,10 @@ StatusCode Muon::MdtDriftCircleOnTrackCreator::initialize()
     ATH_MSG_ERROR( "Time Correction Type too large! Aborting." );
     return StatusCode::FAILURE;
   }
+
+  if (!m_wasConfigured){
+    ATH_MSG_WARNING( "This tool is too complicated to rely on defaults. Potential configuration issue." );
+  }
   
   return StatusCode::SUCCESS; 
 } 
diff --git a/MuonSpectrometer/MuonReconstruction/MuonRecExample/python/MuonPrdProviderToolsConfig.py b/MuonSpectrometer/MuonReconstruction/MuonRecExample/python/MuonPrdProviderToolsConfig.py
index edd0358ebe33..dc084832971d 100644
--- a/MuonSpectrometer/MuonReconstruction/MuonRecExample/python/MuonPrdProviderToolsConfig.py
+++ b/MuonSpectrometer/MuonReconstruction/MuonRecExample/python/MuonPrdProviderToolsConfig.py
@@ -36,6 +36,7 @@ def MdtPrepDataProviderTool(name="MdtPrepDataProviderTool", **kwargs):
   
   if globalflags.DataSource.is_data():
     kwargs.setdefault("UseTwin", True)
+  kwargs.setdefault("CalibrationTool", MuonCalibConfig.MdtCalibrationTool())
 
   from MuonMDT_CnvTools.MuonMDT_CnvToolsConf import Muon__MdtRdoToPrepDataToolMT
   return Muon__MdtRdoToPrepDataToolMT(name,**kwargs)
diff --git a/MuonSpectrometer/MuonReconstruction/MuonRecExample/python/MuonRecTools.py b/MuonSpectrometer/MuonReconstruction/MuonRecExample/python/MuonRecTools.py
index 49b060b6f886..dfadaae81f8a 100644
--- a/MuonSpectrometer/MuonReconstruction/MuonRecExample/python/MuonRecTools.py
+++ b/MuonSpectrometer/MuonReconstruction/MuonRecExample/python/MuonRecTools.py
@@ -78,6 +78,8 @@ def MdtDriftCircleOnTrackCreator(name="MdtDriftCircleOnTrackCreator",**kwargs):
     kwargs.setdefault("DoMagneticFieldCorrection", mdtCalibFlags.correctMdtRtForBField())
     kwargs.setdefault("DoWireSag", muonRecFlags.useWireSagCorrections())
     kwargs.setdefault("DoSlewingCorrection", mdtCalibFlags.correctMdtRtForTimeSlewing())
+    kwargs.setdefault("CalibrationTool", MuonCalibConfig.MdtCalibrationTool())
+    kwargs.setdefault("CalibrationDbTool", MuonCalibConfig.MdtCalibrationDbTool())
 
     if beamFlags.beamType() == 'cosmics' or beamFlags.beamType() == 'singlebeam' :
         kwargs.setdefault("DoTofCorrection", False)
@@ -104,7 +106,7 @@ def MdtDriftCircleOnTrackCreator(name="MdtDriftCircleOnTrackCreator",**kwargs):
     if TriggerFlags.MuonSlice.doTrigMuonConfig:
         kwargs.setdefault("doMDT", True)
 
-    return CfgMgr.Muon__MdtDriftCircleOnTrackCreator(name,**kwargs)
+    return CfgMgr.Muon__MdtDriftCircleOnTrackCreator(name, WasConfigured=True, **kwargs)
 # end of factory function MdtDriftCircleOnTrackCreator
 
 
@@ -349,6 +351,7 @@ def MdtSegmentT0Fitter(name="MdtSegmentT0Fitter",**kwargs):
     from MuonRecExample import MuonAlignConfig  # noqa: F401
     from MuonCnvExample import MuonCalibConfig  # noqa: F401
     MuonCalibConfig.setupMdtCondDB()
+    kwargs.setdefault("CalibrationDbTool", MuonCalibConfig.MdtCalibrationDbTool())
     return CfgMgr.TrkDriftCircleMath__MdtSegmentT0Fitter(name,**kwargs)
 
 def MdtMathSegmentFinder(name="MdtMathSegmentFinder",extraFlags=None,**kwargs):
diff --git a/Reconstruction/MuonIdentification/MuonCombinedConfig/python/MuonCombinedRecToolsConfig.py b/Reconstruction/MuonIdentification/MuonCombinedConfig/python/MuonCombinedRecToolsConfig.py
index 1b39bc031dfd..715ded49b3b0 100644
--- a/Reconstruction/MuonIdentification/MuonCombinedConfig/python/MuonCombinedRecToolsConfig.py
+++ b/Reconstruction/MuonIdentification/MuonCombinedConfig/python/MuonCombinedRecToolsConfig.py
@@ -211,14 +211,13 @@ def MuonMaterialProviderToolCfg(flags,  name = "MuonMaterialProviderTool"):
 
 def MuonCreatorToolCfg(flags, name="MuonCreatorTool", **kwargs):
     from TrackToCalo.TrackToCaloConfig import ParticleCaloExtensionToolCfg
-    result = MuonMaterialProviderToolCfg(flags)
-    kwargs.setdefault( "CaloMaterialProvider", result.getPrimary() )
-    if flags.Muon.MuonTrigger:
-        kwargs.setdefault('MakeTrackAtMSLink',True)
-        kwargs.setdefault("FillTimingInformation",False)
-        kwargs.setdefault("MuonSelectionTool", "")
-        kwargs.setdefault("UseCaloCells", False)
-        kwargs.setdefault("TrackSegmentAssociationTool", "")
+    result = ComponentAccumulator()
+    # Not explicitly setting up MuonIdHelperSvc, nor MuonEDMHelperSvc
+    kwargs.setdefault("Printer", MuonEDMPrinterTool(flags) )
+    # Not explicitly setting up MuonPrintingTool
+    acc = ParticleCaloExtensionToolCfg(flags,StartFromPerigee=True)
+    kwargs.setdefault("ParticleCaloExtensionTool", acc.getPrimary() )
+    result.merge(acc)
 
     acc = MuonCombinedParticleCreatorCfg(flags)
     kwargs.setdefault("TrackParticleCreator", acc.getPrimary() )
@@ -237,10 +236,29 @@ def MuonCreatorToolCfg(flags, name="MuonCreatorTool", **kwargs):
     kwargs.setdefault("AmbiguityProcessor", acc.popPrivateTools())
     result.merge(acc)
 
+    kwargs.setdefault("Propagator", CompFactory.Trk.RungeKuttaPropagator(name = 'AtlasRungeKuttaPropagator'))# FIXME - there should be a CA for this!
+    # Not explicitly setting up MuonDressingTool (but probably should FIXME)
+    # Not explicitly setting up MomentumBalanceTool nor ScatteringAngleTool
+    # Not explicitly setting up MuonSegmentConverterTool (but probably should FIXME)
+    # Not explicitly setting up MeanMDTdADCTool (but probably should FIXME)
+
+    kwargs.setdefault( "CaloMaterialProvider", result.popToolsAndMerge( MuonMaterialProviderToolCfg(flags) ) )
+
+    # Not explicitly setting up TrackSegmentAssociationTool 
+
+    kwargs.setdefault("TrackQuery",   result.popToolsAndMerge(MuonTrackQueryCfg(flags)) )
+
     acc = MuonTrackSummaryToolCfg(flags)
     kwargs.setdefault("TrackSummaryTool", acc.popPrivateTools())
     result.merge(acc)
 
+    if flags.Muon.MuonTrigger:
+        kwargs.setdefault('MakeTrackAtMSLink',True)
+        kwargs.setdefault("FillTimingInformation",False)
+        kwargs.setdefault("MuonSelectionTool", "")
+        kwargs.setdefault("UseCaloCells", False)
+        kwargs.setdefault("TrackSegmentAssociationTool", "")
+
     # This tool needs MuonScatteringAngleSignificanceTool... which in turn needs TrackingVolumeSvc.
     # FIXME - probably this should be someplace central.
     trackingVolSvc = CompFactory.Trk.TrackingVolumesSvc(name="TrackingVolumesSvc")
@@ -303,6 +321,14 @@ def MuonCandidateToolCfg(flags, name="MuonCandidateTool",**kwargs):
     result.setPrivateTools(tool)
     return result 
 
+def MuonCombinedDebuggerToolCfg( flags, name="MuonCombinedDebuggerTool",**kwargs ):
+    result=ComponentAccumulator()
+    match_quality = CompFactory.Rec.MuonMatchQuality(TrackQuery = result.popToolsAndMerge( MuonTrackQueryCfg(flags) ) )
+    kwargs.setdefault("MuonMatchQuality",match_quality )
+    tool = CompFactory.MuonCombined.MuonCombinedDebuggerTool(name, **kwargs)
+    result.setPrivateTools(tool)
+    return result    
+
 def MuonCombinedToolCfg(flags, name="MuonCombinedTool",**kwargs):
     tools = []
     result=ComponentAccumulator()
@@ -320,6 +346,8 @@ def MuonCombinedToolCfg(flags, name="MuonCombinedTool",**kwargs):
         result.merge(acc)
 
     kwargs.setdefault("MuonCombinedTagTools", tools )
+    kwargs.setdefault("MuonCombinedDebuggerTool", result.popToolsAndMerge( MuonCombinedDebuggerToolCfg(flags) ) )
+
     tool = CompFactory.MuonCombined.MuonCombinedTool(name,**kwargs)
     result.setPrivateTools(tool)
     return result 
@@ -337,9 +365,7 @@ def MuonCombinedFitTagToolCfg(flags, name="MuonCombinedFitTagTool",**kwargs):
     result.addPublicTool(tool)
     kwargs.setdefault("TrackBuilder",  tool )
 
-    acc = MuonTrackQueryCfg(flags)
-    kwargs.setdefault("TrackQuery",           acc.popPrivateTools() )
-    result.merge(acc)
+    kwargs.setdefault("TrackQuery",   result.popToolsAndMerge(MuonTrackQueryCfg(flags)) )
 
     acc = MuonMatchQualityCfg(flags)
     kwargs.setdefault("MatchQuality",           acc.popPrivateTools() )
@@ -412,6 +438,7 @@ def iPatSLFitterCfg(flags, name='iPatSLFitter', **kwargs):
 
 # track cleaner configured to use the same fitter
 def MuidTrackCleanerCfg(flags, name='MuidTrackCleaner', **kwargs ):
+    from MuonConfig.MuonRecToolsConfig import MuonTrackCleanerCfg
     if flags.Beam.Type == 'cosmics':
         kwargs.setdefault("PullCut"     , 5.0)
         kwargs.setdefault("PullCutPhi"  , 10.0)
@@ -422,17 +449,7 @@ def MuidTrackCleanerCfg(flags, name='MuidTrackCleaner', **kwargs ):
     if flags.Muon.MuonTrigger:
         kwargs.setdefault("Iterate", False)
         kwargs.setdefault("RecoverOutliers", False)
-    result = iPatFitterCfg(flags)
-    kwargs.setdefault("Fitter"      , result.popPrivateTools() )
-    acc= iPatSLFitterCfg(flags)
-    kwargs.setdefault("SLFitter"    , acc.popPrivateTools() )
-    result.merge(acc)
-  
-    kwargs.setdefault("Printer", MuonEDMPrinterTool(flags) )
-
-    tool = CompFactory.Muon.MuonTrackCleaner(name,**kwargs) #FIXME this is also in MuonConfig - check to see whether we can just use this.
-    result.setPrivateTools(tool)
-    return result
+    return MuonTrackCleanerCfg(flags, name, **kwargs)
     
 def MuidCaloEnergyParam(flags, name='MuidCaloEnergyParam', **kwargs ):
     kwargs.setdefault("Cosmics", flags.Beam.Type == 'cosmics' )
@@ -648,6 +665,8 @@ def CombinedMuonTrackBuilderCfg(flags, name='CombinedMuonTrackBuilder', **kwargs
     kwargs.setdefault( "CaloMaterialProvider", acc.getPrimary() )
     result.merge(acc)
  
+    kwargs.setdefault("TrackQuery",   result.popToolsAndMerge(MuonTrackQueryCfg(flags)) )
+
     if flags.Muon.SAMuonTrigger:
         acc = MuonTrackSummaryToolCfg(flags)
         kwargs.setdefault("TrackSummaryTool", acc.popPrivateTools())
@@ -724,6 +743,8 @@ def CombinedMuonTrackBuilderFitCfg(flags, name='CombinedMuonTrackBuilderFit', **
 def MuonMatchQualityCfg(flags, name='MuonMatchQuality', **kwargs ):
     result = CombinedMuonTagTestToolCfg(flags)
     kwargs.setdefault("TagTool", result.popPrivateTools() )
+    kwargs.setdefault("TrackQuery", result.popToolsAndMerge(MuonTrackQueryCfg(flags)) )
+
     tool = CompFactory.Rec.MuonMatchQuality(name,**kwargs)
     result.setPrivateTools(tool)
     return result
@@ -889,7 +910,7 @@ def MuonCaloTagToolCfg(flags, name='MuonCaloTagTool', **kwargs ):
 
 # Misc 
 def MuonLayerSegmentFinderToolCfg(flags, name="MuonLayerSegmentFinderTool", **kwargs ):
-    from MuonConfig.MuonSegmentFindingConfig import DCMathSegmentMakerCfg, MuonClusterSegmentFinderToolCfg
+    from MuonConfig.MuonSegmentFindingConfig import DCMathSegmentMakerCfg, MuonClusterSegmentFinderToolCfg, MuonPRDSelectionToolCfg
     result = ComponentAccumulator() 
 
     csc2d=""
@@ -907,13 +928,15 @@ def MuonLayerSegmentFinderToolCfg(flags, name="MuonLayerSegmentFinderTool", **kw
     kwargs.setdefault("Csc2DSegmentMaker",               csc2d )
     kwargs.setdefault("Csc4DSegmentMaker",               csc4d )
 
+    kwargs.setdefault("MuonPRDSelectionTool", result.popToolsAndMerge( MuonPRDSelectionToolCfg(flags) ) )
+
     acc = DCMathSegmentMakerCfg(flags, name = "DCMathSegmentMaker")
     segmentmaker = acc.popPrivateTools()
     kwargs.setdefault("SegmentMaker",               segmentmaker )
     result.addPublicTool(segmentmaker)
     result.merge(acc)
 
-    acc = MuonClusterSegmentFinderCfg(flags, name = "MuonClusterSegmentFinderEJWM")
+    acc = MuonClusterSegmentFinderCfg(flags, name = "MuonClusterSegmentFinder")
     clustersegmentfinder = acc.getPrimary() #Already adds it as a public tool.
     kwargs.setdefault("MuonClusterSegmentFinder",               clustersegmentfinder )
     result.merge(acc)
@@ -940,10 +963,16 @@ def MuonLayerSegmentMatchingToolCfg(flags, name="MuonLayerSegmentMatchingTool",
 def MuonInsideOutRecoToolCfg(flags, name="MuonInsideOutRecoTool", **kwargs ):
 #    if TriggerFlags.MuonSlice.doTrigMuonConfig:
 #       kwargs.setdefault("VertexContainer", "")
-    result = MuonLayerSegmentFinderToolCfg(flags, name= "MuonLayerSegmentFinderToolEJWM")
+    result = MuonLayerSegmentFinderToolCfg(flags, name= "MuonLayerSegmentFinderTool")
     layersegmentfindertool = result.popPrivateTools()
     kwargs.setdefault("MuonLayerSegmentFinderTool", layersegmentfindertool)
     result.addPublicTool(layersegmentfindertool)
+    
+    acc = MuonLayerSegmentMatchingToolCfg(flags)
+    muon_layer_segment_matching = acc.popPrivateTools()
+    kwargs.setdefault("MuonLayerSegmentMatchingTool", muon_layer_segment_matching)
+    acc.addPublicTool(muon_layer_segment_matching)
+    result.merge(acc)
 
     acc = MuonLayerAmbiguitySolverToolCfg(flags)
     muon_layer_ambiguity_solver = acc.popPrivateTools()
@@ -951,12 +980,6 @@ def MuonInsideOutRecoToolCfg(flags, name="MuonInsideOutRecoTool", **kwargs ):
     acc.addPublicTool(muon_layer_ambiguity_solver)
     result.merge(acc)
 
-    acc = MuonLayerSegmentMatchingToolCfg(flags)
-    muon_layer_segment_matching = acc.popPrivateTools()
-    kwargs.setdefault("MuonLayerSegmentMatchingTool", muon_layer_segment_matching)
-    acc.addPublicTool(muon_layer_segment_matching)
-    result.merge(acc)
-
     acc = MuonCandidateTrackBuilderToolCfg(flags)
     muon_candidate_track_builder = acc.popPrivateTools()
     kwargs.setdefault("MuonCandidateTrackBuilderTool", muon_candidate_track_builder)
@@ -976,6 +999,9 @@ 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) ) )
+
     tool = CompFactory.MuonCombined.MuonInsideOutRecoTool(name, **kwargs)
     result.setPrivateTools(tool)
     return result
@@ -1047,6 +1073,7 @@ def MuonStauRecoToolCfg(flags,  name="MuonStauRecoTool", **kwargs ):
     from MuonConfig.MuonSegmentFindingConfig import DCMathSegmentMakerCfg
     from MuonConfig.MuonTrackBuildingConfig import MuonChamberHoleRecoveryToolCfg
     from MuonConfig.MuonRecToolsConfig import MuonAmbiProcessorCfg, MuonSeededSegmentFinderCfg
+    from MuonConfig.MuonCalibrationConfig import MdtCalibrationDbToolCfg
 
     kwargs.setdefault("ConsideredPDGs", [13,-13,1000015,-1000015])
     kwargs.setdefault("DoTruth", flags.Input.isMC )
@@ -1092,4 +1119,7 @@ def MuonStauRecoToolCfg(flags,  name="MuonStauRecoTool", **kwargs ):
     result.merge(acc)
     tool = CompFactory.MuonCombined.MuonStauRecoTool(name, **kwargs)
     result.setPrivateTools(tool)
+
+    kwargs.setdefault("CalibrationDbTool", result.popToolsAndMerge( MdtCalibrationDbToolCfg(flags)))
+
     return result
diff --git a/Reconstruction/MuonIdentification/MuonCombinedRecExample/python/MuGirlTagTool.py b/Reconstruction/MuonIdentification/MuonCombinedRecExample/python/MuGirlTagTool.py
index 967db99b0a3a..ff9f2002549c 100644
--- a/Reconstruction/MuonIdentification/MuonCombinedRecExample/python/MuGirlTagTool.py
+++ b/Reconstruction/MuonIdentification/MuonCombinedRecExample/python/MuGirlTagTool.py
@@ -97,12 +97,15 @@ def MuonStauInsideOutRecoTool( name="MuonStauInsideOutRecoTool", **kwargs ):
    return CfgMgr.MuonCombined__MuonInsideOutRecoTool(name,**kwargs )
 
 def MuonStauRecoTool( name="MuonStauRecoTool", **kwargs ):
+   from MuonCnvExample.MuonCalibConfig import MdtCalibrationDbTool
+
    kwargs.setdefault("ConsideredPDGs", [13,-13,1000015,-1000015])
    kwargs.setdefault("DoTruth", rec.doTruth() )
    kwargs.setdefault("DoSummary", muonCombinedRecFlags.printSummary() )
    kwargs.setdefault("MuonSegmentMaker", getPublicTool("DCMathStauSegmentMaker") )
    kwargs.setdefault("MuonInsideOutRecoTool", getPublicTool("MuonStauInsideOutRecoTool") )
    kwargs.setdefault("TrackAmbiguityProcessor", getPublicTool("MuonAmbiProcessor") )
+   kwargs.setdefault("MdtCalibrationDbTool", MdtCalibrationDbTool())
    return CfgMgr.MuonCombined__MuonStauRecoTool(name,**kwargs )
 
 
diff --git a/Trigger/TrigAlgorithms/TrigL2MuonSA/python/TrigL2MuonSAConfig.py b/Trigger/TrigAlgorithms/TrigL2MuonSA/python/TrigL2MuonSAConfig.py
index b7cd89d341ae..04fcae2901a4 100644
--- a/Trigger/TrigAlgorithms/TrigL2MuonSA/python/TrigL2MuonSAConfig.py
+++ b/Trigger/TrigAlgorithms/TrigL2MuonSA/python/TrigL2MuonSAConfig.py
@@ -41,7 +41,11 @@ if not MuonGeometryFlags.hasCSC():
 #Need different PRD collection names to run offline and Run 2 trigger in same job
 if not TriggerFlags.doMT():
     from MuonMDT_CnvTools.MuonMDT_CnvToolsConf import Muon__MdtRdoToPrepDataTool
-    MdtRdoToMdtPrepDataTool = Muon__MdtRdoToPrepDataTool(name = "TrigMdtRdoToPrepDataTool",OutputCollection="TrigMDT_DriftCircles")
+    from MuonCnvExample import MuonCalibConfig
+
+    MdtRdoToMdtPrepDataTool = Muon__MdtRdoToPrepDataTool(name = "TrigMdtRdoToPrepDataTool",
+                                                         OutputCollection="TrigMDT_DriftCircles",
+                                                         CalibrationTool=MuonCalibConfig.MdtCalibrationTool())
     ToolSvc += MdtRdoToMdtPrepDataTool
     theDataPreparator.MDTDataPreparator.MdtPrepDataProvider =  MdtRdoToMdtPrepDataTool
     theDataPreparator.MDTDataPreparator.MDTPrepDataContainer = MdtRdoToMdtPrepDataTool.OutputCollection
@@ -143,7 +147,8 @@ class TrigL2MuonSAMTConfig(MuonSA.MuFastSteering):
         super( TrigL2MuonSAMTConfig, self ).__init__( name )
 
         self.DataPreparator    = theDataPreparator
-        self.PatternFinder     = MuonSA.TrigL2MuonSA__MuFastPatternFinder()
+        from MuonCnvExample.MuonCalibConfig import MdtCalibrationTool
+        self.PatternFinder     = MuonSA.TrigL2MuonSA__MuFastPatternFinder(CalibrationTool=MdtCalibrationTool())
         self.StationFitter     = theStationFitter
         self.TrackFitter       = MuonSA.TrigL2MuonSA__MuFastTrackFitter()
         self.TrackExtrapolator = MuonSA.TrigL2MuonSA__MuFastTrackExtrapolator()
@@ -231,7 +236,8 @@ class TrigL2MuonSAConfig(MuonSA.MuFastSteering):
         super( TrigL2MuonSAConfig, self ).__init__( name )
 
         self.DataPreparator    = theDataPreparator
-        self.PatternFinder     = MuonSA.TrigL2MuonSA__MuFastPatternFinder()
+        from MuonCnvExample.MuonCalibConfig import MdtCalibrationTool
+        self.PatternFinder     = MuonSA.TrigL2MuonSA__MuFastPatternFinder(CalibrationTool=MdtCalibrationTool())
         self.StationFitter     = theStationFitter
         self.TrackFitter       = MuonSA.TrigL2MuonSA__MuFastTrackFitter()
         self.TrackExtrapolator = MuonSA.TrigL2MuonSA__MuFastTrackExtrapolator()
diff --git a/Trigger/TrigAlgorithms/TrigL2MuonSA/python/TrigL2MuonSAConfig_newJO.py b/Trigger/TrigAlgorithms/TrigL2MuonSA/python/TrigL2MuonSAConfig_newJO.py
index 624b7307acfc..8a610a1ecef4 100644
--- a/Trigger/TrigAlgorithms/TrigL2MuonSA/python/TrigL2MuonSAConfig_newJO.py
+++ b/Trigger/TrigAlgorithms/TrigL2MuonSA/python/TrigL2MuonSAConfig_newJO.py
@@ -115,6 +115,7 @@ def MmDataPreparatorCfg( flags, roisKey ):
 
 # Based on TrigL2MuonSAMTConfig at TrigL2MuonSA/TrigL2MuonSAConfig.py
 def muFastSteeringCfg( flags, roisKey, setup="" ):
+    from MuonConfig.MuonCalibrationConfig import MdtCalibrationToolCfg
 
     acc = ComponentAccumulator()
 
@@ -171,9 +172,8 @@ def muFastSteeringCfg( flags, roisKey, setup="" ):
         PtFromAlphaBeta.AvoidMisalignedCSCs = True
 
     MuFastStationFitter = TrigL2MuonSA__MuFastStationFitter( PtFromAlphaBeta = PtFromAlphaBeta )
-
     TrigL2MuonSA__MuFastPatternFinder,TrigL2MuonSA__MuFastTrackFitter,TrigL2MuonSA__MuFastTrackExtrapolator,TrigL2MuonSA__MuCalStreamerTool,TrigL2MuonSA__CscSegmentMaker=CompFactory.getComps("TrigL2MuonSA::MuFastPatternFinder","TrigL2MuonSA::MuFastTrackFitter","TrigL2MuonSA::MuFastTrackExtrapolator","TrigL2MuonSA::MuCalStreamerTool","TrigL2MuonSA::CscSegmentMaker")
-    MuFastPatternFinder     = TrigL2MuonSA__MuFastPatternFinder()
+    MuFastPatternFinder     = TrigL2MuonSA__MuFastPatternFinder(CalibrationTool=acc.popToolsAndMerge( MdtCalibrationToolCfg(flags)))
     MuFastTrackFitter       = TrigL2MuonSA__MuFastTrackFitter()
     MuFastTrackExtrapolator = TrigL2MuonSA__MuFastTrackExtrapolator()
     MuCalStreamerTool       = TrigL2MuonSA__MuCalStreamerTool()
diff --git a/Trigger/TrigAlgorithms/TrigMuonEF/python/TrigMuonEFConfig.py b/Trigger/TrigAlgorithms/TrigMuonEF/python/TrigMuonEFConfig.py
index 2db8347a2972..243f1cae90b7 100755
--- a/Trigger/TrigAlgorithms/TrigMuonEF/python/TrigMuonEFConfig.py
+++ b/Trigger/TrigAlgorithms/TrigMuonEF/python/TrigMuonEFConfig.py
@@ -538,7 +538,9 @@ class TrigMuonEFStandaloneTrackToolConfig (TrigMuonEFConf.TrigMuonEFStandaloneTr
         from MuonCSC_CnvTools.MuonCSC_CnvToolsConf import Muon__CscRdoToCscPrepDataTool
         from MuonTGC_CnvTools.MuonTGC_CnvToolsConf import Muon__TgcRdoToPrepDataTool
         from MuonRPC_CnvTools.MuonRPC_CnvToolsConf import Muon__RpcRdoToPrepDataTool
-        MdtRdoToMdtPrepDataTool = Muon__MdtRdoToPrepDataTool(name = "TrigEFMdtRdoToPrepDataTool")
+        from MuonCnvExample import MuonCalibConfig
+
+        MdtRdoToMdtPrepDataTool = Muon__MdtRdoToPrepDataTool(name = "TrigEFMdtRdoToPrepDataTool", CalibrationTool=MuonCalibConfig.MdtCalibrationTool())
         CscRdoToCscPrepDataTool = Muon__CscRdoToCscPrepDataTool(name = "TrigEFCscRdoToPrepDataTool")
         TgcRdoToTgcPrepDataTool = Muon__TgcRdoToPrepDataTool(name = "TrigEFTgcRdoToPrepDataTool")
         RpcRdoToRpcPrepDataTool = Muon__RpcRdoToPrepDataTool(name = "TrigEFRpcRdoToPrepDataTool")
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Muon/MuonSetup.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Muon/MuonSetup.py
index a4e2acacb564..0934aaaf8fdd 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Muon/MuonSetup.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Muon/MuonSetup.py
@@ -198,8 +198,11 @@ def makeMuonPrepDataAlgs(RoIs="MURoIs", forFullScan=False):
   ToolSvc += MuonMdtRawDataProviderTool
 
   from MuonMDT_CnvTools.MuonMDT_CnvToolsConf import Muon__MdtRdoToPrepDataToolMT
+  from MuonCnvExample import MuonCalibConfig
+
   MdtRdoToMdtPrepDataTool = Muon__MdtRdoToPrepDataToolMT(name                     = "MdtRdoToPrepDataTool",
-                                                         MdtPrdContainerCacheKey = MuonPrdCacheNames.MdtCache)
+                                                         MdtPrdContainerCacheKey = MuonPrdCacheNames.MdtCache,
+                                                         CalibrationTool=MuonCalibConfig.MdtCalibrationTool())
 
   ToolSvc += MdtRdoToMdtPrepDataTool
 
-- 
GitLab