diff --git a/MuonSpectrometer/MuonConfig/python/MuonBytestreamDecodeConfig.py b/MuonSpectrometer/MuonConfig/python/MuonBytestreamDecodeConfig.py index 28e9d8dc1a1337ba8c8f556e25f08c703debb3df..c8f42f6c464c50da1612802117ac47b161e6bb58 100644 --- a/MuonSpectrometer/MuonConfig/python/MuonBytestreamDecodeConfig.py +++ b/MuonSpectrometer/MuonConfig/python/MuonBytestreamDecodeConfig.py @@ -1,6 +1,5 @@ -# # Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration -# + from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator from AthenaCommon.Constants import DEBUG diff --git a/MuonSpectrometer/MuonConfig/python/MuonConfigFlags.py b/MuonSpectrometer/MuonConfig/python/MuonConfigFlags.py index 99d6610de9e7be92e70b849c60f15ec125f04d4f..c38ad35fe384705f35dc8e41b861d80b162fc864 100644 --- a/MuonSpectrometer/MuonConfig/python/MuonConfigFlags.py +++ b/MuonSpectrometer/MuonConfig/python/MuonConfigFlags.py @@ -63,6 +63,7 @@ def createMuonConfigFlags(): mcf.addFlag("Muon.useTGCPriorNextBC",False) # Use TGC measurements from Prior and Next Bunch Crossings. These measurements are available in the real data since somewhere in 2008. mcf.addFlag("Muon.useAlignmentCorrections",False) # Apply alignment corrections to MuonGeoModel. The corrections are read from a COOL database mcf.addFlag("Muon.useWireSagCorrections",False) # tApply wire sag corrections. + # doNSWNewThirdChain redundant - check e.g. Detector.GeometryCSC # makePRDs - surely this is top level and redundant with makeRIO? @@ -73,7 +74,6 @@ def createMuonConfigFlags(): mcf.addFlag("Muon.strategy", []) # CutSeedsOnTracks, CombineSegInStation, DynamicSeeding, PreferOutsideIn, AllowOneSharedHit, DoRefinement, DoAmbiSolving mcf.addFlag("Muon.trackBuilder", "Moore") # Allowed: 'Moore','TruthTracking','None' mcf.addFlag("Muon.refinementTool", "Moore") # Allowed: Moore TODO surely we can drop this if there is only one option? - mcf.addFlag("Muon.optimiseMomentumResolutionUsingChi2", False) mcf.addFlag("Muon.patternsOnly", False) # TODO probably can be dropped? Just disable later steps. mcf.addFlag("Muon.createTrackParticles", True ) # TODO do we ever turn this off? mcf.addFlag("Muon.straightLineFitMomentum", 2000.0 ) diff --git a/MuonSpectrometer/MuonConfig/python/MuonRIO_OnTrackCreatorConfig.py b/MuonSpectrometer/MuonConfig/python/MuonRIO_OnTrackCreatorConfig.py index 3bdf2d38e8c7f3d7b7e61c1492ba960a4317fc02..18a7b5157da427d6cadebd82bb5574a162ced945 100644 --- a/MuonSpectrometer/MuonConfig/python/MuonRIO_OnTrackCreatorConfig.py +++ b/MuonSpectrometer/MuonConfig/python/MuonRIO_OnTrackCreatorConfig.py @@ -6,6 +6,17 @@ from MuonCnvExample.MuonCnvUtils import mdtCalibWindowNumber # TODO should maybe from MdtDriftCircleOnTrackCreator.MdtDriftCircleOnTrackCreatorConf import Muon__MdtDriftCircleOnTrackCreator from MuonClusterOnTrackCreator.MuonClusterOnTrackCreatorConf import Muon__CscClusterOnTrackCreator, Muon__MuonClusterOnTrackCreator from TrkRIO_OnTrackCreator.TrkRIO_OnTrackCreatorConf import Trk__RIO_OnTrackCreator +from MuonCompetingClustersOnTrackCreator.MuonCompetingClustersOnTrackCreatorConf import Muon__TriggerChamberClusterOnTrackCreator + +def TriggerChamberClusterOnTrackCreatorCfg(flags, **kwargs): + result=ComponentAccumulator() + acc = MuonClusterOnTrackCreatorCfg(flags) + muon_cluster_creator=acc.getPrimary() + result.merge(acc) + kwargs.setdefault("ClusterCreator", muon_cluster_creator) + result.setPrivateTools(Muon__TriggerChamberClusterOnTrackCreator(**kwargs)) + return result + def CscClusterOnTrackCreatorCfg(flags,**kwargs): from MuonConfig.MuonSegmentFindingConfig import QratCscClusterFitterCfg diff --git a/MuonSpectrometer/MuonConfig/python/MuonRdoDecodeConfig.py b/MuonSpectrometer/MuonConfig/python/MuonRdoDecodeConfig.py index 8433f2d2b018f4f763288c309a7b69559ea5a93c..25cfd6739e90c821aa1efc4994b9816cabf6d5cb 100644 --- a/MuonSpectrometer/MuonConfig/python/MuonRdoDecodeConfig.py +++ b/MuonSpectrometer/MuonConfig/python/MuonRdoDecodeConfig.py @@ -1,6 +1,5 @@ -# # Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration -# + from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator from AthenaCommon.Constants import VERBOSE, DEBUG diff --git a/MuonSpectrometer/MuonConfig/python/MuonRecToolsConfig.py b/MuonSpectrometer/MuonConfig/python/MuonRecToolsConfig.py new file mode 100644 index 0000000000000000000000000000000000000000..af02ce1b63acafdaf4e3b91598d5e5bf0cf57f2d --- /dev/null +++ b/MuonSpectrometer/MuonConfig/python/MuonRecToolsConfig.py @@ -0,0 +1,354 @@ +# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration + +# Configuration of tools shared between Segment Finding and Track Building + +from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator + +# Tracking +from TrkDetDescrSvc.AtlasTrackingGeometrySvcConfig import TrackingGeometrySvcCfg + +def MuonSeededSegmentFinderCfg(flags,name="MuonSeededSegmentFinder", **kwargs): + from MuonTrackFinderTools.MuonTrackFinderToolsConf import Muon__MuonSeededSegmentFinder + from MuonSegmentFindingConfig import DCMathSegmentMakerCfg, MdtMathSegmentFinder # FIXME - should really shift this to RecTools then. + result = ComponentAccumulator() + + mdt_segment_finder = MdtMathSegmentFinder(flags, name="MCTBMdtMathSegmentFinder", UseChamberTheta = False, AssociationRoadWidth = 1.5) + result.addPublicTool(mdt_segment_finder) + + if "SegmentMaker" not in kwargs or "SegmentMakerNoHoles" not in kwargs: + seg_maker="" + acc={} + if flags.Beam.Type == 'collisions': + acc = DCMathSegmentMakerCfg( flags, MdtSegmentFinder = mdt_segment_finder, SinAngleCut = 0.04, DoGeometry = True) + else: # cosmics or singlebeam + acc = DCMathSegmentMakerCfg( flags, MdtSegmentFinder = mdt_segment_finder, SinAngleCut = 0.1, DoGeometry = False, AddUnassociatedPhiHits= True ) + seg_maker = acc.getPrimary() + result.merge(acc) + result.addPublicTool(seg_maker) + kwargs.setdefault("SegmentMaker", seg_maker) + kwargs.setdefault("SegmentMakerNoHoles", seg_maker) #FIXME. Just remove one. + if not flags.Detector.GeometryCSC: + kwargs.setdefault("CscPrepDataContainer","") + else: + kwargs.setdefault("sTgcPrepDataContainer","") + kwargs.setdefault("MMPrepDataContainer","") + + muon_seeded_segment_finder = Muon__MuonSeededSegmentFinder(name, **kwargs) + result.setPrivateTools(muon_seeded_segment_finder) + return result + + +def MuonSegmentMomentumFromFieldCfg(flags, name="MuonSegmentMomentumFromField", **kwargs): + from MuonSegmentMomentum.MuonSegmentMomentumConf import MuonSegmentMomentumFromField + from MagFieldServices.MagFieldServicesConfig import MagneticFieldSvcCfg + + result = ComponentAccumulator() + acc = MagneticFieldSvcCfg(flags) + magfieldsvc = acc.getPrimary() + result.merge(acc) + kwargs.setdefault("MagFieldSvc", magfieldsvc) + + navigator_ca = MuonNavigatorCfg(flags) + navigator = navigator_ca.popPrivateTools() + result.addPublicTool(navigator) + result.merge(navigator_ca) + kwargs.setdefault("NavigatorTool", navigator) + + acc = MuonSTEP_PropagatorCfg(flags) + muon_prop = acc.getPrimary() + result.merge(acc) + result.addPublicTool(muon_prop) + kwargs.setdefault("PropagatorTool", muon_prop) + + muon_seg_mom_from_field = MuonSegmentMomentumFromField(name=name, **kwargs) + result.setPrivateTools(muon_seg_mom_from_field) + return result + +def MuonTrackSummaryHelperToolCfg(flags, name="MuonTrackSummaryHelperTool", **kwargs): + # m_muonTgTool("MuonHolesOnTrack"), + # m_idHelperTool("Muon::MuonIdHelperTool/MuonIdHelperTool"), + # m_edmHelperTool("Muon::MuonEDMHelperSvc/MuonEDMHelperSvc"), + # m_extrapolator("Trk::Extrapolator/AtlasExtrapolator"), + # m_slExtrapolator("Trk::Extrapolator/MuonStraightLineExtrapolator"), + + result = ComponentAccumulator() + acc = TrackingGeometrySvcCfg(flags) + + result.merge(acc) + kwargs.setdefault("TrackingGeometryName", 'AtlasTrackingGeometry') # FIXME - get this from somewhere? + + acc = MuonExtrapolatorCfg(flags) + extrap = acc.getPrimary() + acc.addPublicTool(extrap) + result.merge(acc) + kwargs.setdefault("Extrapolator", extrap) + + from MuonTGRecTools.MuonTGRecToolsConf import Muon__MuonHolesOnTrackTool + holetool = Muon__MuonHolesOnTrackTool (ExtrapolatorName = extrap, + TrackingGeometryName = 'MuonStandaloneTrackingGeometry') + + kwargs.setdefault("DoHolesOnTrack", False) + kwargs.setdefault("CalculateCloseHits", True) + kwargs.setdefault("HoleOnTrackTool", holetool) + + from MuonTrackSummaryHelperTool.MuonTrackSummaryHelperToolConf import Muon__MuonTrackSummaryHelperTool + result.setPrivateTools(Muon__MuonTrackSummaryHelperTool(name=name,**kwargs)) + return result + +def MuonTrackSummaryToolCfg(flags, name="MuonTrackSummaryTool", **kwargs): + from TrkTrackSummaryTool.TrkTrackSummaryToolConf import Trk__TrackSummaryTool + + result = ComponentAccumulator() + acc = MuonTrackSummaryHelperToolCfg(flags) + track_summary_helper = acc.getPrimary() + acc.addPublicTool(track_summary_helper) + result.merge(acc) + kwargs.setdefault("MuonSummaryHelperTool", track_summary_helper ) + kwargs.setdefault("doSharedHits", False ) + kwargs.setdefault("AddDetailedMuonSummary", True ) + result.setPrivateTools(Trk__TrackSummaryTool(name=name,**kwargs)) + return result + +def MuonTrackScoringToolCfg(flags, name="MuonTrackScoringTool", **kwargs): + from MuonTrackFinderTools.MuonTrackFinderToolsConf import Muon__MuonTrackScoringTool + + # m_trkSummaryTool("Trk::TrackSummaryTool"), + # m_printer("Muon::MuonEDMPrinterTool/MuonEDMPrinterTool"), + result = ComponentAccumulator() + acc = MuonTrackSummaryToolCfg(flags) + track_summary = acc.getPrimary( ) + acc.addPublicTool(track_summary) + result.merge(acc) + kwargs.setdefault('SumHelpTool', track_summary) + result.setPrivateTools(Muon__MuonTrackScoringTool(name=name,**kwargs)) + return result + +def MuonAmbiProcessorCfg(flags, name="MuonAmbiProcessor", **kwargs): + from TrkAmbiguityProcessor.TrkAmbiguityProcessorConf import Trk__TrackSelectionProcessorTool + from MuonAmbiTrackSelectionTool.MuonAmbiTrackSelectionToolConf import Muon__MuonAmbiTrackSelectionTool + + #m_scoringTool("Trk::TrackScoringTool/TrackScoringTool"), + #m_selectionTool("InDet::InDetAmbiTrackSelectionTool/InDetAmbiTrackSelectionTool") + result = ComponentAccumulator() + kwargs.setdefault('DropDouble', False) + acc = MuonTrackScoringToolCfg( flags ) + scoring_tool = acc.getPrimary() + acc.addPublicTool(scoring_tool) + result.merge(acc) + kwargs.setdefault('ScoringTool', scoring_tool ) + muon_ami_selection_tool = Muon__MuonAmbiTrackSelectionTool() + result.addPublicTool(muon_ami_selection_tool) + kwargs.setdefault('SelectionTool', muon_ami_selection_tool) + result.setPrivateTools(Trk__TrackSelectionProcessorTool(name=name,**kwargs)) + return result + +def MuonTrackCleanerCfg(flags, **kwargs): + from MuonTrackFinderTools.MuonTrackFinderToolsConf import Muon__MuonTrackCleaner + from MuonConfig.MuonRIO_OnTrackCreatorConfig import MdtDriftCircleOnTrackCreatorCfg, TriggerChamberClusterOnTrackCreatorCfg + # declareProperty("IdHelper",m_idHelper); + # declareProperty("Helper",m_edmHelperSvc); + # declareProperty("Printer",m_printer); + # declareProperty("MdtRotCreator", m_mdtRotCreator ); + # declareProperty("CompRotCreator", m_compRotCreator ); + # declareProperty("PullCalculator", m_pullCalculator ); + # declareProperty("Extrapolator", m_extrapolator ); + # declareProperty("MagFieldSvc", m_magFieldSvc ); + # declareProperty("MeasurementUpdator", m_measurementUpdator ); + result=ComponentAccumulator() + + acc = MdtDriftCircleOnTrackCreatorCfg(flags) + mdt_creator=acc.getPrimary() + result.merge(acc) + kwargs.setdefault("MdtRotCreator", mdt_creator) + + acc = TriggerChamberClusterOnTrackCreatorCfg(flags) + muon_cluster_creator=acc.getPrimary() + result.merge(acc) + kwargs.setdefault("CompRotCreator", muon_cluster_creator) + + # For PullCalculator, just let it get default for moment. FIXME + + extrapolator_CA = MuonExtrapolatorCfg(flags) + extrapolator = extrapolator_CA.getPrimary() + acc.addPublicTool( extrapolator ) # TODO remove + result.merge( extrapolator_CA ) + kwargs.setdefault("Extrapolator", extrapolator) + + acc = MCTBFitterCfg(flags, name = "SLFitter", StraightLine=True) + slfitter = acc.getPrimary() + acc.addPublicTool(slfitter) + result.merge(acc) + kwargs.setdefault("SLFitter", slfitter) + + acc = MCTBFitterCfg(flags, name = "CurvedFitter") + fitter = acc.getPrimary() + + acc.addPublicTool(fitter) + result.merge(acc) + kwargs.setdefault("Fitter", fitter) + + # kwargs.setdefault("MagFieldSvc", mag_field_svc) Default for moment + + # FIXME - do remaining tools + + result.setPrivateTools(Muon__MuonTrackCleaner(**kwargs)) + + return result + +def MuonStationIntersectSvcCfg(flags, name='MuonStationIntersectSvc',**kwargs): + from MuonStationIntersectSvc.MuonStationIntersectSvcConf import MuonStationIntersectSvc + from MuonConfig.MuonCondSvcConfig import MDTCondSummarySvcCfg + # Has dependency on MDTCondSummarySvc and IdHelperTool (which we ignore for now) + result = ComponentAccumulator() + acc = MDTCondSummarySvcCfg(flags) + mdt_cond_summary_svc = acc.getPrimary() + result.merge(acc) + kwargs.setdefault("MDTCondSummarySvc", mdt_cond_summary_svc) + muon_station_intersect_svc = MuonStationIntersectSvc(name=name, **kwargs) + result.addService(muon_station_intersect_svc, primary=True) + return result + +# default muon navigator +def MuonNavigatorCfg(flags, name="MuonNavigator", **kwargs): + from TrkExTools.TrkExToolsConf import Trk__Navigator + + result = ComponentAccumulator() + + acc = TrackingGeometrySvcCfg(flags) + result.merge(acc) + kwargs.setdefault("TrackingGeometrySvc", acc.getPrimary() ) + + navigator = Trk__Navigator(name=name, **kwargs) + result.setPrivateTools(navigator) + return result + +def MuonExtrapolatorCfg(flags,name = "MuonExtrapolator", **kwargs): + from TrkExTools.TrkExToolsConf import Trk__MaterialEffectsUpdator, Trk__EnergyLossUpdator, Trk__MultipleScatteringUpdator + + from TrkExTools.TrkExToolsConf import Trk__Extrapolator + result = ComponentAccumulator() + + energy_loss_updator = Trk__EnergyLossUpdator() # Not really sure these should be tools... + result.addPublicTool(energy_loss_updator) # TODO remove + + # This one has a dependency on RndNumberService + mult_scat_updator = Trk__MultipleScatteringUpdator() + result.addPublicTool(mult_scat_updator) # TODO remove + + material_effects_updator = Trk__MaterialEffectsUpdator( EnergyLossUpdator=energy_loss_updator, MultipleScatteringUpdator=mult_scat_updator) + result.addPublicTool(material_effects_updator) + kwargs.setdefault("MaterialEffectsUpdators", [material_effects_updator]) + + navigator_ca = MuonNavigatorCfg(flags) + navigator = navigator_ca.popPrivateTools() + result.addPublicTool(navigator) + result.merge(navigator_ca) + kwargs.setdefault("Navigator", navigator) + + acc = MuonSTEP_PropagatorCfg(flags, Tolerance = 0.00001, MaterialEffects=True, IncludeBgradients=True) + muon_prop = acc.getPrimary() + result.merge(acc) + + result.addPublicTool(muon_prop) + + kwargs.setdefault("Propagators", [muon_prop]) + kwargs.setdefault("ResolveMuonStation", True) + kwargs.setdefault("Tolerance", 0.0011) # must be > 1um to avoid missing MTG intersections + extrap = Trk__Extrapolator(name=name, **kwargs) + result.setPrivateTools(extrap) + return result + +def MuonChi2TrackFitterCfg(flags, name='MuonChi2TrackFitter', **kwargs): + from TrkMeasurementUpdator.TrkMeasurementUpdatorConf import Trk__KalmanUpdator + from TrkGlobalChi2Fitter.TrkGlobalChi2FitterConf import Trk__GlobalChi2Fitter + import MuonConfig.MuonRIO_OnTrackCreatorConfig # Trying to avoid circular dependencies here + + result = ComponentAccumulator() + + extrapolator_CA = MuonExtrapolatorCfg(flags) + extrapolator= extrapolator_CA.getPrimary() + + result.addPublicTool(extrapolator) # TODO remove + result.merge(extrapolator_CA) + + acc = MuonConfig.MuonRIO_OnTrackCreatorConfig.MuonRotCreatorCfg(flags) + rotcreator=acc.getPrimary() + result.merge(acc) + + measurement_updater = Trk__KalmanUpdator() + result.addPublicTool(measurement_updater) #FIXME + + kwargs.setdefault("ExtrapolationTool" , extrapolator) + kwargs.setdefault("RotCreatorTool" , rotcreator) + kwargs.setdefault("MeasurementUpdateTool", measurement_updater) + kwargs.setdefault("StraightLine" , False) + kwargs.setdefault("OutlierCut" , 3.0) + kwargs.setdefault("GetMaterialFromTrack" , False) + kwargs.setdefault("RejectLargeNScat" , True) + + # take propagator and navigator from the extrapolator + extrapolator_CA = MuonExtrapolatorCfg(flags) + result.addPublicTool(extrapolator_CA.getPrimary()) # TODO remove + result.merge(extrapolator_CA) + + kwargs["ExtrapolationTool"] = extrapolator + kwargs["PropagatorTool"] = extrapolator.Propagators[0] + kwargs["NavigatorTool"] = extrapolator.Navigator + + fitter = Trk__GlobalChi2Fitter(name=name, **kwargs) + result.setPrivateTools(fitter) + # print fitter + return result + +def MuonSTEP_PropagatorCfg(flags, name='MuonSTEP_Propagator', **kwargs): + # Really there should be a central configuration for the STEP propagator. FIXME + # In the old ConfigDb this was named MuonStraightLinePropagator (!) + from TrkExSTEP_Propagator.TrkExSTEP_PropagatorConf import Trk__STEP_Propagator + from MagFieldServices.MagFieldServicesConfig import MagneticFieldSvcCfg + result = ComponentAccumulator() + + acc = MagneticFieldSvcCfg(flags) + magfieldsvc = acc.getPrimary() + result.merge(acc) + + kwargs.setdefault("Tolerance", 0.00001 ) + kwargs.setdefault("MaterialEffects", True ) + kwargs.setdefault("IncludeBgradients", True ) + kwargs.setdefault("MagFieldSvc", magfieldsvc ) + + propagator = Trk__STEP_Propagator(name=name, **kwargs) + result.setPrivateTools(propagator) + return result + +def MCTBExtrapolatorCfg(flags, name='MCTBExtrapolator',**kwargs): + result = ComponentAccumulator() + + acc = MuonSTEP_PropagatorCfg(flags) + prop = acc.getPrimary() + result.addPublicTool(prop) + result.merge(acc) + kwargs.setdefault("Propagators", [ prop ]) + kwargs.setdefault("ResolveMuonStation", False) + acc = MuonExtrapolatorCfg(flags, name=name, **kwargs) + result.setPrivateTools(acc.getPrimary()) + result.merge(acc) + + return result + +def MCTBFitterCfg(flags, name='MCTBFitter', **kwargs): + # didn't bother with MCTBSLFitter, since this seems redundant. Just set "StraightLine" = True since the kwargs are passed on to MuonChi2TrackFitterCfg + result = ComponentAccumulator() + + acc = MCTBExtrapolatorCfg(flags) + mctbExtrapolator = acc.getPrimary() + result.merge(acc) + + kwargs.setdefault("ExtrapolationTool", mctbExtrapolator) + kwargs.setdefault("GetMaterialFromTrack", True) + kwargs.setdefault("Momentum", flags.Muon.straightLineFitMomentum) + acc = MuonChi2TrackFitterCfg(flags, name=name, **kwargs) + mctbfitter = acc.getPrimary() + result.merge(acc) + # print mctbfitter + result.setPrivateTools(mctbfitter) + return result \ No newline at end of file diff --git a/MuonSpectrometer/MuonConfig/python/MuonReconstructionConfig.py b/MuonSpectrometer/MuonConfig/python/MuonReconstructionConfig.py index 16478b8ba6ee7b7911c48235ab74ecf7d6d553a7..cb12b377e5fe51168460966e6feca3e21bec47aa 100644 --- a/MuonSpectrometer/MuonConfig/python/MuonReconstructionConfig.py +++ b/MuonSpectrometer/MuonConfig/python/MuonReconstructionConfig.py @@ -5,6 +5,7 @@ from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator # Local from MuonConfig.MuonSegmentFindingConfig import MuonSegmentFindingCfg +from MuonConfig.MuonTrackBuildingConfig import MuonTrackBuildingCfg def MuonReconstructionCfg(flags): @@ -12,6 +13,7 @@ def MuonReconstructionCfg(flags): # https://gitlab.cern.ch/atlas/athena/blob/master/MuonSpectrometer/MuonReconstruction/MuonRecExample/python/MuonStandalone.py result=ComponentAccumulator() result.merge( MuonSegmentFindingCfg(flags) ) + result.merge( MuonTrackBuildingCfg(flags) ) return result if __name__=="__main__": diff --git a/MuonSpectrometer/MuonConfig/python/MuonSegmentFindingConfig.py b/MuonSpectrometer/MuonConfig/python/MuonSegmentFindingConfig.py index f293155352d18680591e6888b55d9a92d32e6889..1bc90666a963f5665c2193c4defbef85e2421c25 100644 --- a/MuonSpectrometer/MuonConfig/python/MuonSegmentFindingConfig.py +++ b/MuonSpectrometer/MuonConfig/python/MuonSegmentFindingConfig.py @@ -12,221 +12,21 @@ # When porting it I have tried to remove anything redundant, and I have tried to simplify the number of configuration techniques # used, so for example I'm no longer using CfgGetter, and am minimising the use of CfgMgr, -# There is now quite a lot in here not solely needed for SegmentFinding, so probably need to spit into another fragment. # Core from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator -# Tracking -from TrkMeasurementUpdator.TrkMeasurementUpdatorConf import Trk__KalmanUpdator -from TrkExTools.TrkExToolsConf import Trk__MaterialEffectsUpdator, Trk__EnergyLossUpdator, Trk__MultipleScatteringUpdator, Trk__Navigator -from TrkDetDescrSvc.AtlasTrackingGeometrySvcConfig import TrackingGeometrySvcCfg -from TrkExSTEP_Propagator.TrkExSTEP_PropagatorConf import Trk__STEP_Propagator -from TrkAmbiguityProcessor.TrkAmbiguityProcessorConf import Trk__TrackSelectionProcessorTool -from TrkTrackSummaryTool.TrkTrackSummaryToolConf import Trk__TrackSummaryTool - # Muon -from CscSegmentMakers.CscSegmentMakersConf import Csc2dSegmentMaker, Csc4dSegmentMaker +# from CscSegmentMakers.CscSegmentMakersConf import Csc2dSegmentMaker, Csc4dSegmentMaker from DCMathSegmentMaker.DCMathSegmentMakerConf import Muon__DCMathSegmentMaker, Muon__MdtMathSegmentFinder, Muon__MuonSegmentFittingTool, Muon__MuonClusterSegmentFinderTool -from MuonTrackFinderTools.MuonTrackFinderToolsConf import Muon__MuonTrackCleaner, Muon__MuonTrackScoringTool -from MuonCompetingClustersOnTrackCreator.MuonCompetingClustersOnTrackCreatorConf import Muon__TriggerChamberClusterOnTrackCreator -from MuonStationIntersectSvc.MuonStationIntersectSvcConf import MuonStationIntersectSvc from MuonSegmentSelectionTools.MuonSegmentSelectionToolsConf import Muon__MuonSegmentSelectionTool -from MdtSegmentT0Fitter.MdtSegmentT0FitterConf import TrkDriftCircleMath__MdtSegmentT0Fitter from MuonClusterSegmentMakerTools.MuonClusterSegmentMakerToolsConf import Muon__MuonClusterSegmentFinder -from MuonAmbiTrackSelectionTool.MuonAmbiTrackSelectionToolConf import Muon__MuonAmbiTrackSelectionTool from MuonCnvExample.MuonCnvUtils import mdtCalibWindowNumber # TODO - should maybe move this somewhere else? #Local import MuonConfig.MuonRIO_OnTrackCreatorConfig # Trying to avoid circular dependencies here -from MuonConfig.MuonCondSvcConfig import MDTCondSummarySvcCfg +# from MuonConfig.MuonCondSvcConfig import MDTCondSummarySvcCfg from MuonConfig.MuonCalibConfig import MdtCalibrationDbSvcCfg - -def MuonTrackSummaryHelperToolCfg(flags, **kwargs): - # m_muonTgTool("MuonHolesOnTrack"), - # m_idHelperTool("Muon::MuonIdHelperTool/MuonIdHelperTool"), - # m_edmHelperTool("Muon::MuonEDMHelperSvc/MuonEDMHelperSvc"), - # m_extrapolator("Trk::Extrapolator/AtlasExtrapolator"), - # m_slExtrapolator("Trk::Extrapolator/MuonStraightLineExtrapolator"), - - result = ComponentAccumulator() - acc = TrackingGeometrySvcCfg(flags) - - result.merge(acc) - kwargs.setdefault("TrackingGeometryName", 'AtlasTrackingGeometry') # FIXME - get this from somewhere? - - acc = MuonExtrapolatorCfg(flags) - extrap = acc.getPrimary() - acc.addPublicTool(extrap) - result.merge(acc) - kwargs.setdefault("Extrapolator", extrap) - - from MuonTGRecTools.MuonTGRecToolsConf import Muon__MuonHolesOnTrackTool - holetool = Muon__MuonHolesOnTrackTool (ExtrapolatorName = extrap, - TrackingGeometryName = 'MuonStandaloneTrackingGeometry') - - kwargs.setdefault("DoHolesOnTrack", False) - kwargs.setdefault("CalculateCloseHits", True) - kwargs.setdefault("HoleOnTrackTool", holetool) - - from MuonTrackSummaryHelperTool.MuonTrackSummaryHelperToolConf import Muon__MuonTrackSummaryHelperTool - result.setPrivateTools(Muon__MuonTrackSummaryHelperTool(**kwargs)) - return result - -def MuonTrackSummaryToolCfg(flags, **kwargs): - result = ComponentAccumulator() - acc = MuonTrackSummaryHelperToolCfg(flags) - track_summary_helper = acc.getPrimary() - acc.addPublicTool(track_summary_helper) - result.merge(acc) - kwargs.setdefault("MuonSummaryHelperTool", track_summary_helper ) - kwargs.setdefault("doSharedHits", False ) - kwargs.setdefault("AddDetailedMuonSummary", True ) - result.setPrivateTools(Trk__TrackSummaryTool(**kwargs)) - return result - -def MuonTrackScoringToolCfg(flags, **kwargs): - # m_trkSummaryTool("Trk::TrackSummaryTool"), - # m_printer("Muon::MuonEDMPrinterTool/MuonEDMPrinterTool"), - result = ComponentAccumulator() - acc = MuonTrackSummaryToolCfg(flags) - track_summary = acc.getPrimary( ) - acc.addPublicTool(track_summary) - result.merge(acc) - kwargs.setdefault('SumHelpTool', track_summary) - result.setPrivateTools(Muon__MuonTrackScoringTool(**kwargs)) - return result - -def MuonAmbiProcessorCfg(flags, **kwargs): - #m_scoringTool("Trk::TrackScoringTool/TrackScoringTool"), - #m_selectionTool("InDet::InDetAmbiTrackSelectionTool/InDetAmbiTrackSelectionTool") - result = ComponentAccumulator() - kwargs.setdefault('DropDouble', False) - acc = MuonTrackScoringToolCfg( flags ) - scoring_tool = acc.getPrimary() - acc.addPublicTool(scoring_tool) - result.merge(acc) - kwargs.setdefault('ScoringTool', scoring_tool ) - muon_ami_selection_tool = Muon__MuonAmbiTrackSelectionTool() - result.addPublicTool(muon_ami_selection_tool) - kwargs.setdefault('SelectionTool', muon_ami_selection_tool) - result.setPrivateTools(Trk__TrackSelectionProcessorTool(**kwargs)) - return result - -# This probably doesn't belong here. -def MuonStationIntersectSvcCfg(flags, **kwargs): - # Has dependency on MDTCondSummarySvc and IdHelperTool (which we ignore for now) - result = ComponentAccumulator() - acc = MDTCondSummarySvcCfg(flags) - mdt_cond_summary_svc = acc.getPrimary() - result.merge(acc) - kwargs.setdefault("MDTCondSummarySvc", mdt_cond_summary_svc) - muon_station_intersect_svc = MuonStationIntersectSvc(**kwargs) - result.addService(muon_station_intersect_svc, primary=True) - return result - -# default muon navigator -def MuonNavigatorCfg(flags, **kwargs): - result = ComponentAccumulator() - - acc = TrackingGeometrySvcCfg(flags) - result.merge(acc) - kwargs.setdefault("TrackingGeometrySvc", acc.getPrimary() ) - - navigator = Trk__Navigator(**kwargs) - result.setPrivateTools(navigator) - return result - -def MuonExtrapolatorCfg(flags,**kwargs): - from TrkExTools.TrkExToolsConf import Trk__Extrapolator - result = ComponentAccumulator() - - energy_loss_updator = Trk__EnergyLossUpdator() # Not really sure these should be tools... - result.addPublicTool(energy_loss_updator) # TODO remove - - # This one has a dependency on RndNumberService - mult_scat_updator = Trk__MultipleScatteringUpdator() - result.addPublicTool(mult_scat_updator) # TODO remove - - material_effects_updator = Trk__MaterialEffectsUpdator( EnergyLossUpdator=energy_loss_updator, MultipleScatteringUpdator=mult_scat_updator) - result.addPublicTool(material_effects_updator) - kwargs.setdefault("MaterialEffectsUpdators", [material_effects_updator]) - - navigator_ca = MuonNavigatorCfg(flags) - navigator = navigator_ca.popPrivateTools() - result.addPublicTool(navigator) - result.merge(navigator_ca) - kwargs.setdefault("Navigator", navigator) - - muon_prop = Trk__STEP_Propagator(Tolerance = 0.00001, MaterialEffects=True, IncludeBgradients=True) - result.addPublicTool(muon_prop) - - kwargs.setdefault("Propagators", [muon_prop]) - kwargs.setdefault("ResolveMuonStation", True) - kwargs.setdefault("Tolerance", 0.0011) # must be > 1um to avoid missing MTG intersections - extrap = Trk__Extrapolator(**kwargs) - result.setPrivateTools(extrap) - return result - -def MuonChi2TrackFitterCfg(flags,**kwargs): - result = ComponentAccumulator() - from TrkGlobalChi2Fitter.TrkGlobalChi2FitterConf import Trk__GlobalChi2Fitter - - extrapolator_CA = MuonExtrapolatorCfg(flags) - extrapolator= extrapolator_CA.getPrimary() - - result.addPublicTool(extrapolator) # TODO remove - result.merge(extrapolator_CA) - - acc = MuonConfig.MuonRIO_OnTrackCreatorConfig.MuonRotCreatorCfg(flags) - rotcreator=acc.getPrimary() - result.merge(acc) - - measurement_updater = Trk__KalmanUpdator() - result.addPublicTool(measurement_updater) #FIXME - - kwargs.setdefault("ExtrapolationTool" , extrapolator) - kwargs.setdefault("RotCreatorTool" , rotcreator) - kwargs.setdefault("MeasurementUpdateTool", measurement_updater) - kwargs.setdefault("StraightLine" , False) - kwargs.setdefault("OutlierCut" , 3.0) - kwargs.setdefault("GetMaterialFromTrack" , False) - kwargs.setdefault("RejectLargeNScat" , True) - - # take propagator and navigator from the extrapolator - extrapolator_CA = MuonExtrapolatorCfg(flags) - result.addPublicTool(extrapolator_CA.getPrimary()) # TODO remove - result.merge(extrapolator_CA) - - kwargs["ExtrapolationTool"] = extrapolator - kwargs["PropagatorTool"] = extrapolator.Propagators[0] - kwargs["NavigatorTool"] = extrapolator.Navigator - - fitter = Trk__GlobalChi2Fitter(**kwargs) - result.setPrivateTools(fitter) - # print fitter - return result - - -def MCTBExtrapolatorCfg(flags, name='MCTBExtrapolator',**kwargs): - result = ComponentAccumulator() - kwargs.setdefault("Propagators", ["MCTBPropagator"]) # FIXME! - kwargs.setdefault("ResolveMuonStation", False) - extrap = MuonExtrapolatorCfg(flags, **kwargs) - result.setPrivateTools(extrap) - return result - -def MCTBFitterCfg(flags, **kwargs): - # didn't bother with MCTBSLFitter, since this seems redundant. Just set "StraightLine" = True - result = ComponentAccumulator() - kwargs.setdefault("ExtrapolationTool", "MCTBExtrapolator") - kwargs.setdefault("GetMaterialFromTrack", True) - kwargs.setdefault("Momentum", flags.Muon.straightLineFitMomentum) - acc = MuonChi2TrackFitterCfg(flags, **kwargs) - mctbfitter = acc.getPrimary() - result.merge(acc) - # print mctbfitter - result.setPrivateTools(mctbfitter) - return result +from MuonConfig.MuonRecToolsConfig import MCTBFitterCfg, MuonAmbiProcessorCfg, MuonStationIntersectSvcCfg, MuonTrackCleanerCfg def MuonHoughPatternFinderTool(flags, **kwargs): # Taken from https://gitlab.cern.ch/atlas/athena/blob/master/MuonSpectrometer/MuonReconstruction/MuonRecExample/python/MuonRecTools.py#L173 from MuonHoughPatternTools/MuonHoughPatternToolsConf import Muon__MuonHoughPatternFinderTool @@ -276,7 +76,7 @@ def AdjustableT0Tool(flags,**kwargs): from MdtDriftCircleOnTrackCreator.MdtDriftCircleOnTrackCreatorConf import AdjT0__AdjustableT0Tool return AdjT0__AdjustableT0Tool(**kwargs) -def MdtMathSegmentFinder(flags,**kwargs): +def MdtMathSegmentFinder(flags,name="MdtMathSegmentFinder", **kwargs): # beamType = getattr(extraFlags,"beamType", beamFlags.beamType()) # doSegmentT0Fit = getattr(extraFlags,"doSegmentT0Fit",muonRecFlags.doSegmentT0Fit()) # enableCurvedSegmentFinding = getattr(extraFlags,"enableCurvedSegmentFinding", muonStandaloneFlags.enableCurvedSegmentFinding()) @@ -295,67 +95,7 @@ def MdtMathSegmentFinder(flags,**kwargs): if flags.Muon.enableCurvedSegmentFinding: kwargs.setdefault("DoCurvedSegmentFinder",True) - return Muon__MdtMathSegmentFinder(**kwargs) - -def TriggerChamberClusterOnTrackCreatorCfg(flags, **kwargs): - result=ComponentAccumulator() - acc = MuonConfig.MuonRIO_OnTrackCreatorConfig.MuonClusterOnTrackCreatorCfg(flags) - muon_cluster_creator=acc.getPrimary() - result.merge(acc) - kwargs.setdefault("ClusterCreator", muon_cluster_creator) - result.setPrivateTools(Muon__TriggerChamberClusterOnTrackCreator(**kwargs)) - return result - -def MuonTrackCleanerCfg(flags, **kwargs): - # declareProperty("IdHelper",m_idHelper); - # declareProperty("Helper",m_edmHelperSvc); - # declareProperty("Printer",m_printer); - # declareProperty("MdtRotCreator", m_mdtRotCreator ); - # declareProperty("CompRotCreator", m_compRotCreator ); - # declareProperty("PullCalculator", m_pullCalculator ); - # declareProperty("Extrapolator", m_extrapolator ); - # declareProperty("MagFieldSvc", m_magFieldSvc ); - # declareProperty("MeasurementUpdator", m_measurementUpdator ); - result=ComponentAccumulator() - - acc = MuonConfig.MuonRIO_OnTrackCreatorConfig.MdtDriftCircleOnTrackCreatorCfg(flags) - mdt_creator=acc.getPrimary() - result.merge(acc) - kwargs.setdefault("MdtRotCreator", mdt_creator) - - acc = TriggerChamberClusterOnTrackCreatorCfg(flags) - muon_cluster_creator=acc.getPrimary() - result.merge(acc) - kwargs.setdefault("CompRotCreator", muon_cluster_creator) - - # For PullCalculator, just let it get default for moment. FIXME - - extrapolator_CA = MuonExtrapolatorCfg(flags) - extrapolator = extrapolator_CA.getPrimary() - acc.addPublicTool( extrapolator ) # TODO remove - result.merge( extrapolator_CA ) - kwargs.setdefault("Extrapolator", extrapolator) - - acc = MCTBFitterCfg(flags, name = "SLFitter", StraightLine=True) - slfitter = acc.getPrimary() - acc.addPublicTool(slfitter) - result.merge(acc) - kwargs.setdefault("SLFitter", slfitter) - - acc = MCTBFitterCfg(flags, name = "CurvedFitter") - fitter = acc.getPrimary() - - acc.addPublicTool(fitter) - result.merge(acc) - kwargs.setdefault("Fitter", fitter) - - # kwargs.setdefault("MagFieldSvc", mag_field_svc) Default for moment - - # FIXME - do remaining tools - - result.setPrivateTools(Muon__MuonTrackCleaner(**kwargs)) - - return result + return Muon__MdtMathSegmentFinder(name=name,**kwargs) def MuonSegmentFittingToolCfg(flags, **kwargs): # declareProperty("SLPropagator", m_slPropagator); @@ -393,6 +133,7 @@ def MuonSegmentFittingToolCfg(flags, **kwargs): return result def DCMathSegmentMakerCfg(flags, **kwargs): + from MdtSegmentT0Fitter.MdtSegmentT0FitterConf import TrkDriftCircleMath__MdtSegmentT0Fitter # This in general is a pretty problematic piece of code. It seems to have a lot of potential issues, because it has loads of mutables / subtools etc # https://gitlab.cern.ch/atlas/athena/blob/master/MuonSpectrometer/MuonReconstruction/MuonSegmentMakers/MuonSegmentMakerTools/DCMathSegmentMaker/src/DCMathSegmentMaker.h # ToolHandle<IMdtDriftCircleOnTrackCreator> m_mdtCreator; //<! mdt rio ontrack creator @@ -420,6 +161,7 @@ def DCMathSegmentMakerCfg(flags, **kwargs): acc = MdtCalibrationDbSvcCfg(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) @@ -471,13 +213,18 @@ def DCMathSegmentMakerCfg(flags, **kwargs): acc=MuonConfig.MuonRIO_OnTrackCreatorConfig.MuonClusterOnTrackCreatorCfg(flags) muon_cluster_creator=acc.getPrimary() + result.addPublicTool(muon_cluster_creator) # FIXME - declare property for muon_cluster_creator is missing from the tool. + result.merge(acc) + + acc = MuonConfig.MuonRIO_OnTrackCreatorConfig.TriggerChamberClusterOnTrackCreatorCfg(flags) + muon_comp_cluster_creator = acc.getPrimary() + result.addPublicTool(muon_comp_cluster_creator) + result.merge(acc) - muon_comp_cluster_creator = Muon__TriggerChamberClusterOnTrackCreator(ClusterCreator=muon_cluster_creator) - acc.addPublicTool(muon_comp_cluster_creator) kwargs.setdefault("MuonCompetingClustersCreator", muon_comp_cluster_creator) - acc = MuonSegmentFittingToolCfg(flags, name="NewMuonSegmentFittingTool") + acc = MuonSegmentFittingToolCfg(flags, name="MuonSegmentFittingTool") segment_fitter=acc.getPrimary() result.addPublicTool(segment_fitter) @@ -661,6 +408,7 @@ def CscSegmentUtilToolCfg(flags, **kwargs): return result def Csc2dSegmentMakerCfg(flags, **kwargs): + from CscSegmentMakers.CscSegmentMakersConf import Csc2dSegmentMaker result=ComponentAccumulator() acc = CscSegmentUtilToolCfg(flags) csc_segment_util_tool = acc.getPrimary() @@ -673,6 +421,8 @@ def Csc2dSegmentMakerCfg(flags, **kwargs): return result def Csc4dSegmentMakerCfg(flags, **kwargs): + from CscSegmentMakers.CscSegmentMakersConf import Csc4dSegmentMaker + result=ComponentAccumulator() acc= CscSegmentUtilToolCfg(flags) csc_segment_util_tool = acc.getPrimary() @@ -818,7 +568,7 @@ def MuonClusterSegmentFinderCfg(flags, **kwargs): result.addPublicTool(Muon__MuonClusterSegmentFinder(**kwargs),primary=True) return result -def MuonSegmentFindingCfg(flags, **kwargs): +def MuonSegmentFindingCfg(flags, name = "MuonSegmentMaker", **kwargs): # This is based on https://gitlab.cern.ch/atlas/athena/blob/master/MuonSpectrometer/MuonReconstruction/MuonRecExample/python/MuonStandalone.py#L113 from MooSegmentCombinationFinder.MooSegmentCombinationFinderConf import MooSegmentFinderAlg result=ComponentAccumulator() @@ -841,7 +591,7 @@ def MuonSegmentFindingCfg(flags, **kwargs): if not flags.Muon.useTGCPriorNextBC and not flags.Muon.useTGCPriorNextBC: tgc_meas_key = 'TGC_MeasurementsAllBCs' - moo_segment_finder_alg = MooSegmentFinderAlg( "MuonSegmentMaker", + moo_segment_finder_alg = MooSegmentFinderAlg( name, SegmentFinder = segment_finder_tool, MuonClusterSegmentFinderTool=muon_cluster_segment_finder, MuonSegmentOutputLocation = segment_location, diff --git a/MuonSpectrometer/MuonConfig/python/MuonTrackBuildingConfig.py b/MuonSpectrometer/MuonConfig/python/MuonTrackBuildingConfig.py new file mode 100644 index 0000000000000000000000000000000000000000..b4007ad3674eafa8cd04c01c98848aba8038f293 --- /dev/null +++ b/MuonSpectrometer/MuonConfig/python/MuonTrackBuildingConfig.py @@ -0,0 +1,355 @@ +# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration + +from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator +from MuonRecToolsConfig import MCTBFitterCfg, MuonSTEP_PropagatorCfg, MuonTrackCleanerCfg, MuonSegmentMomentumFromFieldCfg, MuonSeededSegmentFinderCfg +from MuonConfig.MuonSegmentFindingConfig import MuonSegmentFittingToolCfg + +def MooTrackFitterCfg(flags, name = 'MooTrackFitter', **kwargs): + # Based on https://gitlab.cern.ch/atlas/athena/blob/release/22.0.3/MuonSpectrometer/MuonReconstruction/MuonRecExample/python/MooreTools.py#L179 + # (Tons of explicit configuration missing from there though) + from MuonTrackSteeringTools.MuonTrackSteeringToolsConf import Muon__MooTrackFitter + from MuonSegmentMomentum.MuonSegmentMomentumConf import MuonSegmentMomentum + + result = MCTBFitterCfg(flags) + mctb_fitter = result.getPrimary() + result.addPublicTool(mctb_fitter) + kwargs.setdefault("Fitter", mctb_fitter) + + acc = MuonSTEP_PropagatorCfg(flags) + muon_prop = acc.getPrimary() + result.addPublicTool(muon_prop) + result.merge(acc) + + kwargs.setdefault("Propagator", muon_prop) + # kwargs.setdefault("SLFit" , ) # Was "not jobproperties.BField.allToroidOn()" but do not have access to Field here. + kwargs.setdefault("ReducedChi2Cut", flags.Muon.Chi2NDofCut) + + momentum_estimator="" + if flags.Beam.Type == 'cosmics': + momentum_estimator = MuonSegmentMomentum(DoCosmics = True) + else: + acc = MuonSegmentMomentumFromFieldCfg(flags) + momentum_estimator=acc.getPrimary() + result.merge(acc) + + result.addPublicTool(momentum_estimator) + kwargs.setdefault("SegmentMomentum", momentum_estimator ) + + kwargs.setdefault("CleanPhiHits", True) + kwargs.setdefault("UsePreciseHits", True) + kwargs.setdefault("UsePrefit", False) + kwargs.setdefault("SeedAtStartOfTrack", False) + + acc = MuonTrackCleanerCfg(flags) + track_cleaner = acc.getPrimary() + result.merge(acc) + result.addPublicTool(track_cleaner) + kwargs.setdefault("TrackCleaner", track_cleaner) + + fitter = Muon__MooTrackFitter(name, **kwargs) + result.setPrivateTools(fitter) + return result + +def MooTrackBuilderCfg(flags, name="MooTrackBuilderTemplate", **kwargs): + from MuonTrackSteeringTools.MuonTrackSteeringToolsConf import Muon__MooTrackBuilder + from TrkExSTEP_Propagator.TrkExSTEP_PropagatorConf import Trk__STEP_Propagator + + # Based on this: https://gitlab.cern.ch/atlas/athena/blob/release/22.0.3/MuonSpectrometer/MuonReconstruction/MuonRecExample/python/MooreTools.py#L221 + # ignoring all the name_prefix stuff for the moment, since I'm not sure it's necessary any more. + result=MooTrackFitterCfg(flags) + moo_track_fitter = result.getPrimary() + result.addPublicTool(moo_track_fitter) + kwargs.setdefault("Fitter", moo_track_fitter) + + # Now setup SL fitter (MooSLTrackFitter as defined here: + # https://gitlab.cern.ch/atlas/athena/blob/release/22.0.3/MuonSpectrometer/MuonReconstruction/MuonRecExample/python/MuonRecExampleConfigDb.py#L203) + acc = MCTBFitterCfg(flags, name='MCTBSLFitter', StraightLine=True) + mctbslfitter = acc.getPrimary() + result.addPublicTool(mctbslfitter) + + result.merge(acc) + + # Just take the default configuration, as per https://gitlab.cern.ch/atlas/athena/blob/release/22.0.3/MuonSpectrometer/MuonReconstruction/MuonRecExample/python/MuonRecExampleConfigDb.py#L56 + # FIXME - this should be updated once there is a proper CA implementation for the STEP_Propagator + prop = Trk__STEP_Propagator(name = 'MuonStraightLinePropagator') + result.addPublicTool(prop) + + # TODO - check why Fitter and FitterPreFit are identical + acc = MooTrackFitterCfg( flags, name="MooSLTrackFitter", Fitter = mctbslfitter, FitterPreFit=mctbslfitter, Propagator=prop, ReducedChi2Cut=10.0, SLFit=True) + moo_sl_track_fitter = acc.getPrimary() + result.addPublicTool(moo_sl_track_fitter) + result.merge(acc) + + kwargs.setdefault("SLFitter", moo_sl_track_fitter) + kwargs.setdefault("RecalibrateMDTHitsOnTrack", ( (not flags.Muon.doSegmentT0Fit) and flags.Beam.Type == 'collisions') ) + + + acc = MuonSeededSegmentFinderCfg(flags) + muon_seeded_segment_finder = acc.getPrimary() + result.addPublicTool(muon_seeded_segment_finder) + result.merge(acc) + kwargs.setdefault("SeededSegmentFinder", muon_seeded_segment_finder) + + builder = Muon__MooTrackBuilder(name, **kwargs) + result.setPrivateTools(builder) + return result + +# Taken from https://gitlab.cern.ch/atlas/athena/blob/release/22.0.3/MuonSpectrometer/MuonReconstruction/MuonRecExample/python/MooreTools.py#L268 +# Not bothering with MuonSegmentMatchingToolTight - just pass in TightSegmentMatching=True +def MuonSegmentMatchingToolCfg(flags, name="MuonSegmentMatchingTool", **kwargs): + from MuonSegmentMatchingTools.MuonSegmentMatchingToolsConf import Muon__MuonSegmentMatchingTool + from MagFieldServices.MagFieldServicesConfig import MagneticFieldSvcCfg + + kwargs.setdefault( "doThetaMatching", flags.Muon.useSegmentMatching) + kwargs.setdefault( "doPhiMatching", False ) + if flags.Beam.Type == 'cosmics': + kwargs.setdefault("OverlapMatchAveragePhiHitPullCut", 200.) + + # There are two tools which this depends on which aren't properties and which weren't defined in old configuration + # Ignore for now, but FIXME one day + # m_overlapResolvingTool("Muon::MuonSegmentInOverlapResolvingTool/MuonSegmentInOverlapResolvingTool"), + # m_pairMatchingTool("Muon::MuonSegmentPairMatchingTool/MuonSegmentPairMatchingTool"), + # Also, residual pull calculator not yet configured. #FIXME + + result = MagneticFieldSvcCfg(flags) + magfieldsvc = result.getPrimary() + + kwargs.setdefault( "MagFieldSvc", magfieldsvc ) + + matching = Muon__MuonSegmentMatchingTool(name, **kwargs) + result.setPrivateTools(matching) + return result + +def MooCandidateMatchingToolCfg(flags, name="MooCandidateMatchingTool", doSegmentPhiMatching=True, **kwargs): + from MuonTrackSteeringTools.MuonTrackSteeringToolsConf import Muon__MooCandidateMatchingTool + result = ComponentAccumulator() + if doSegmentPhiMatching is not None: + acc = MuonSegmentMatchingToolCfg(flags, doPhiMatching = doSegmentPhiMatching) + muon_seg_matching = acc.getPrimary() + result.addPublicTool(muon_seg_matching) + result.merge(acc) + kwargs.setdefault("SegmentMatchingTool", muon_seg_matching) + + acc = MuonSegmentMatchingToolCfg(flags, name = "MuonSegmentMatchingToolTight", TightSegmentMatching=True, doPhiMatching = doSegmentPhiMatching) + muon_seg_matching_tight = acc.getPrimary() + result.addPublicTool(muon_seg_matching_tight) + result.merge(acc) + kwargs.setdefault("SegmentMatchingToolTight", muon_seg_matching_tight) + + kwargs.setdefault("DoTrackSegmentMatching", flags.Muon.useTrackSegmentMatching) + kwargs.setdefault("RequireSameSide", flags.Beam.Type != 'collisions') + if flags.Muon.useAlignmentCorrections: + kwargs.setdefault("AlignmentErrorPosX", 5.0) + kwargs.setdefault("AlignmentErrorPosY", 0.2) + kwargs.setdefault("AlignmentErrorAngleX", 0.002) + kwargs.setdefault("AlignmentErrorAngleY", 0.001) + + else: # no alignment corrections + kwargs.setdefault("AlignmentErrorPosX", 10.0) + kwargs.setdefault("AlignmentErrorPosY", 5.0) + kwargs.setdefault("AlignmentErrorAngleX", 0.004) + kwargs.setdefault("AlignmentErrorAngleY", 0.002) + + moo_cand_matching_tool = Muon__MooCandidateMatchingTool(name,**kwargs) + result.setPrivateTools(moo_cand_matching_tool) + return result + +def MuonSegmentRegionRecoveryToolCfg(flags, name="MuonSegmentRegionRecoveryTool", **kwargs): + from MuonTrackFinderTools.MuonTrackFinderToolsConf import Muon__MuonSegmentRegionRecoveryTool + # Based on https://gitlab.cern.ch/atlas/athena/blob/release/22.0.3/MuonSpectrometer/MuonReconstruction/MuonRecExample/python/MooreTools.py#L426 + result = MCTBFitterCfg(flags) + mctbfitter = result.getPrimary() + result.addPublicTool(mctbfitter) + kwargs.setdefault("Fitter", mctbfitter) + + acc = MooCandidateMatchingToolCfg(flags) + track_segment_matching_tool=acc.getPrimary() + result.addPublicTool(track_segment_matching_tool) + result.merge(acc) + kwargs.setdefault("TrackSegmentMatchingTool", track_segment_matching_tool) + + segment_region_recovery_tool = Muon__MuonSegmentRegionRecoveryTool(name, **kwargs) + result.setPrivateTools(segment_region_recovery_tool) + return result + +def MuPatCandidateToolCfg(flags, name="MuPatCandidateTool", **kwargs): + from MuonTrackSteeringTools.MuonTrackSteeringToolsConf import 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 + result = MdtDriftCircleOnTrackCreatorCfg(flags) + mdt_dcot_creator = result.getPrimary() + kwargs.setdefault("MdtRotCreator", mdt_dcot_creator) + + acc = CscClusterOnTrackCreatorCfg(flags) + csc_cluster_creator = acc.getPrimary() + result.merge(acc) + kwargs.setdefault("CscRotCreator", csc_cluster_creator) + + kwargs.setdefault("SegmentExtender", "") #FIXME If this is always empty, can it be removed? + + mu_pat_cand_tool = Muon__MuPatCandidateTool(name, **kwargs) + result.setPrivateTools(mu_pat_cand_tool) + return result + +def MuonTrackSteeringCfg(flags, name="MuonTrackSteering", **kwargs): + from MuonTrackSteeringTools.MuonTrackSteeringToolsConf import Muon__MuonTrackSteering + # This is based on https://gitlab.cern.ch/atlas/athena/blob/release/22.0.3/MuonSpectrometer/MuonReconstruction/MuonRecExample/python/MuonStandalone.py#L35 + result=ComponentAccumulator() + + # This was originally defined here: https://gitlab.cern.ch/atlas/athena/blob/release/22.0.3/MuonSpectrometer/MuonReconstruction/MuonRecExample/python/MuonStandaloneFlags.py#L137 + MoorelikeStrategy=[ + "BarrelCombined[CombineSegInStation,DoRefinement,DoAmbiSolving,CutSeedsOnTracks]:BML,BMS;BOL,BOS;BIL,BIS", + "EndcapCombined[CombineSegInStation,DoRefinement,DoAmbiSolving,CutSeedsOnTracks]:EML,EMS;EOL,EOS;EIL,EIS;CSL,CSS;EEL,EES;BEE", + "BarrelEndcap[CombineSegInStation,DoRefinement,DoAmbiSolving,CutSeedsOnTracks,BarrelEndcapFilter]:EML,EMS;EEL,EES;BML,BMS;EIL,EIS;BIL,BIS;BOL,BOS"] + + kwargs.setdefault("StrategyList", MoorelikeStrategy) + + # Set properties which were set in MuonStandalone.py, and which aren't default (fix this later, because we don't want to break existing configuration) + # extraFlags are ignored (don't believe they're necessary) + + result = MCTBFitterCfg(flags, name='MCTBSLFitter', StraightLine=True) + mctbslfitter = result.getPrimary() + result.addPublicTool(mctbslfitter) + + acc = MuonSegmentRegionRecoveryToolCfg(flags, name='MuonEORecoveryTool', OnlyEO = True, Fitter=mctbslfitter, UseFitterOutlierLogic=False) + muon_eo_recovery_tool = acc.getPrimary() + result.addPublicTool(muon_eo_recovery_tool) + result.merge(acc) + + kwargs.setdefault("HoleRecoveryTool", muon_eo_recovery_tool) + kwargs.setdefault("SegSeedQCut", 2) + kwargs.setdefault("Seg2ndQCut", 1) + + kwargs.setdefault("OutputSingleStationTracks", True) # default is False + + if "TrackBuilderTool" not in kwargs: + #Old config had: kwargs["TrackBuilderTool"] = getPublicToolClone("MooMuonTrackBuilder", "MooTrackBuilderTemplate", + # extraFlags=extraFlags) + # For some strange reason, MooTrackBuilderTemplate was just a MooTrackBuilder i.e. they had: + # addTool( "MuonRecExample.MooreTools.MooTrackBuilder", "MooTrackBuilderTemplate") + # I have simplified this. Also, in the old configuration there was the possiblity to set optimiseMomentumResolutionUsingChi2 to true in extraflags (which were passed to TrackBuilderTool but not TrackRefinementTool) - however I don't think this was used, and have removed it. + # However some other things were set in extraFlags here: https://gitlab.cern.ch/atlas/athena/blob/release/22.0.3/MuonSpectrometer/MuonReconstruction/MuonRecExample/python/MuonStandalone.py#L39 + # So I might well have made a mistake. TODO check + acc = MooTrackBuilderCfg(flags) + builder = acc.getPrimary() + kwargs["TrackBuilderTool"] = builder + result.merge(acc) + + if "TrackRefinementTool" not in kwargs: + kwargs["TrackRefinementTool"] = builder + # FIXME. Need to see if TrackRefinementTool is actually used & possibly remove. + + # --- Now let's setup tools which were ignored in the old configuration. Just want to get this working for the moment. Will clean it up later. + + acc=MuPatCandidateToolCfg(flags) + cand_tool = acc.getPrimary() + result.merge(acc) + result.addPublicTool(cand_tool) + kwargs.setdefault("MuPatCandidateTool", cand_tool) + + from MuonConfig.MuonRecToolsConfig import MuonAmbiProcessorCfg + acc = MuonAmbiProcessorCfg(flags, name='MuonAmbiProcessor') + ambi = acc.getPrimary() + result.merge(acc) + result.addPublicTool(ambi) + kwargs.setdefault("AmbiguityTool", ambi) + + kwargs.setdefault("MooBuilderTool", builder) + kwargs.setdefault("TrackRefinementTool", builder) + + acc = MooCandidateMatchingToolCfg(flags) + cand_matching_tool = acc.getPrimary() + kwargs["CandidateMatchingTool"] = cand_matching_tool + result.merge(acc) + + acc = MuonSegmentFittingToolCfg(flags) + seg_fitting_tool = acc.getPrimary() + result.merge(acc) + + kwargs.setdefault("MuonSegmentFittingTool", seg_fitting_tool) + kwargs.setdefault("MuonTrackSelector", MuonTrackSelector(flags)) + + track_maker_steering = Muon__MuonTrackSteering(name,**kwargs) + result.setPrivateTools(track_maker_steering) + return result + +def MuonTrackSelector(flags, name = "MuonTrackSelectorTool", **kwargs): + from MuonTrackFinderTools.MuonTrackFinderToolsConf import Muon__MuonTrackSelectorTool + # In MooreTools this is: + # if beamFlags.beamType() == 'cosmics' or beamFlags.beamType() == 'singlebeam' or globalflags.DataSource() == 'data' : + # Hopefully this is good enough + if flags.Beam.Type == 'cosmics' or not flags.Input.isMC: + kwargs.setdefault("UseRPCHoles", False) + kwargs.setdefault("UseTGCHoles", False) + kwargs.setdefault("MaxMdtHolesOnTwoStationTrack", 10) + kwargs.setdefault("MaxMdtHolesOnTrack", 30) + kwargs.setdefault("HolesToHitsRatioCutPerStation", 2) + kwargs.setdefault("CountMDTOutlierAsHoles", False) + else: + kwargs.setdefault("MaxMdtHolesOnTwoStationTrack", 4) + kwargs.setdefault("MaxMdtHolesOnTrack", 5) + kwargs.setdefault("CountMDTOutlierAsHoles", True) + + return Muon__MuonTrackSelectorTool(name, **kwargs) + +def MuonTrackBuildingCfg(flags): + from MuonSegmentTrackMaker.MuonSegmentTrackMakerConf import MuPatTrackBuilder + # This is based on https://gitlab.cern.ch/atlas/athena/blob/release/22.0.3/MuonSpectrometer/MuonReconstruction/MuonRecExample/python/MuonStandalone.py#L162 + result=ComponentAccumulator() + + #Arguably this should be somewhere deeper - not quite sure where yet though. FIXME + from MuonConfig.MuonGeometryConfig import MuonGeoModelCfg + result.merge( MuonGeoModelCfg(flags) ) + + acc = MuonTrackSteeringCfg(flags) + track_steering = acc.getPrimary() + result.merge(acc) + result.addPublicTool(track_steering) + + track_builder = MuPatTrackBuilder("MuPatTrackBuilder", TrackSteering = track_steering ) + result.addEventAlgo( track_builder ) + return result + + +if __name__=="__main__": + # To run this, do e.g. + # python ../athena/MuonSpectrometer/MuonConfig/python/MuonTrackBuildingConfig.py + from AthenaCommon.Configurable import Configurable + Configurable.configurableRun3Behavior=1 + + from AthenaCommon.Logging import log + from AthenaConfiguration.AllConfigFlags import ConfigFlags + + ConfigFlags.Concurrency.NumThreads = 1 + + ConfigFlags.Detector.GeometryMDT = True + ConfigFlags.Detector.GeometryTGC = True + ConfigFlags.Detector.GeometryCSC = True + ConfigFlags.Detector.GeometryRPC = True + + from AthenaConfiguration.TestDefaults import defaultTestFiles + ConfigFlags.Input.Files = defaultTestFiles.ESD + # from AthenaCommon.Constants import DEBUG + #log.setLevel(DEBUG) + log.debug('About to set up Muon Track Building.') + + ConfigFlags.Input.isMC = True + # ConfigFlags.Muon.doCSCs = False + ConfigFlags.lock() + + cfg=ComponentAccumulator() + + # This is a temporary fix! Should be private! + from MuonRecHelperTools.MuonRecHelperToolsConf import Muon__MuonEDMHelperSvc + muon_edm_helper_svc = Muon__MuonEDMHelperSvc("MuonEDMHelperSvc") + cfg.addService( muon_edm_helper_svc ) + + from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg + cfg.merge(PoolReadCfg(ConfigFlags)) + + cfg.merge(MuonTrackBuildingCfg(ConfigFlags)) + + f=open("MuonTrackBuilding.pkl","w") + cfg.store(f) + f.close()