def MuonLayerAmbiguitySolverToolCfg(flags, name="MuonLayerAmbiguitySolverTool", **kwargs): result = MuonSegmentSelectionToolCfg(flags) segment_selection_tool = result.popPrivateTools() kwargs.setdefault("MuonSegmentSelectionTool",segment_selection_tool) result.addPublicTool(segment_selection_tool) from MuonConfig.MuonTrackBuildingConfig import MuonSegmentMatchingToolCfg acc = MuonSegmentMatchingToolCfg(flags) muon_segment_matching = acc.popPrivateTools() kwargs.setdefault("MuonSegmentMatchingTool", muon_segment_matching) acc.addPublicTool(muon_segment_matching) result.merge(acc) from MuonConfig.MuonTrackBuildingConfig import MooTrackBuilderCfg acc = MooTrackBuilderCfg(flags) muon_segment_track_builder = acc.popPrivateTools() kwargs.setdefault("MuonSegmentTrackBuilder", muon_segment_track_builder) acc.addPublicTool(muon_segment_track_builder) result.merge(acc) kwargs.setdefault("MuonEDMPrinterTool", MuonEDMPrinterTool(flags) ) result.setPrivateTools(CompFactory.Muon.MuonLayerAmbiguitySolverTool(name, **kwargs)) return result
def MooCandidateMatchingToolCfg(flags, name="MooCandidateMatchingTool", doSegmentPhiMatching=True, **kwargs): Muon__MooCandidateMatchingTool = CompFactory.Muon.MooCandidateMatchingTool from TrkConfig.AtlasExtrapolatorConfig import AtlasExtrapolatorCfg from MuonConfig.MuonRecToolsConfig import MuonExtrapolatorCfg result = ComponentAccumulator() # Won't explicitly configure MuonEDMHelperSvc kwargs.setdefault("MuonPrinterTool", MuonEDMPrinterTool(flags)) acc = MuonExtrapolatorCfg(flags, name="MuonStraightLineExtrapolator") slextrap = acc.getPrimary() result.merge(acc) kwargs.setdefault("SLExtrapolator", slextrap) acc = AtlasExtrapolatorCfg(flags) extrap = acc.getPrimary() result.merge(acc) kwargs.setdefault("Extrapolator", extrap) acc = MuonSegmentMatchingToolCfg(flags, doPhiMatching=doSegmentPhiMatching) muon_seg_matching = acc.getPrimary() 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.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) acc = MuPatCandidateToolCfg(flags) cand_tool = acc.getPrimary() result.merge(acc) kwargs.setdefault("MuPatCandidateTool", cand_tool) moo_cand_matching_tool = Muon__MooCandidateMatchingTool(name, **kwargs) result.setPrivateTools(moo_cand_matching_tool) return result
def MuonCombinedStacoTagToolCfg(flags, name="MuonCombinedStacoTagTool",**kwargs): from TrackToCalo.TrackToCaloConfig import ParticleCaloExtensionToolCfg result = ParticleCaloExtensionToolCfg(flags) kwargs.setdefault("ParticleCaloExtensionTool", result.getPrimary() ) kwargs.setdefault("Printer", MuonEDMPrinterTool(flags) ) tool = CompFactory.MuonCombined.MuonCombinedStacoTagTool(name,**kwargs) result.setPrivateTools(tool) return result
def Csc2dSegmentMakerCfg(flags, name="Csc2dSegmentMaker", **kwargs): Csc2dSegmentMaker = CompFactory.Csc2dSegmentMaker result = ComponentAccumulator() if 'segmentTool' not in kwargs: acc = CscSegmentUtilToolCfg(flags) csc_segment_util_tool = acc.getPrimary() result.addPublicTool(csc_segment_util_tool) kwargs.setdefault('segmentTool', csc_segment_util_tool) result.merge(acc) kwargs.setdefault("printerTool", MuonEDMPrinterTool(flags)) csc_segment_maker = Csc2dSegmentMaker(name=name, **kwargs) result.setPrivateTools(csc_segment_maker) return result
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 result = MdtDriftCircleOnTrackCreatorCfg(flags) mdt_dcot_creator = result.getPrimary() kwargs.setdefault("MdtRotCreator", mdt_dcot_creator) acc = CscClusterOnTrackCreatorCfg(flags) csc_cluster_creator = acc.popPrivateTools() result.merge(acc) kwargs.setdefault("CscRotCreator", csc_cluster_creator) kwargs.setdefault("MuonPrinterTool", MuonEDMPrinterTool(flags)) mu_pat_cand_tool = Muon__MuPatCandidateTool(name, **kwargs) result.setPrivateTools(mu_pat_cand_tool) return result
def MuidTrackCleanerCfg(flags, name='MuidTrackCleaner', **kwargs ): if flags.Beam.Type == 'cosmics': kwargs.setdefault("PullCut" , 5.0) kwargs.setdefault("PullCutPhi" , 10.0) else: kwargs.setdefault("PullCut" , 4.0) kwargs.setdefault("PullCutPhi" , 4.0) 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
def MuonCandidateToolCfg(flags, name="MuonCandidateTool",**kwargs): from MuonConfig.MuonRecToolsConfig import MuonAmbiProcessorCfg kwargs.setdefault("Printer", MuonEDMPrinterTool(flags) ) result = CombinedMuonTrackBuilderCfg(flags, name="CombinedMuonTrackBuilder") kwargs.setdefault("TrackBuilder", result.popPrivateTools() ) # Why was this dependent on cosmics? will now always create this # if flags.Beam.Type=="cosmics": if flags.Muon.MuonTrigger and flags.Beam.Type!="cosmics": #trigger definitely only uses the ExtrapolateToIPtool in cosmics mode kwargs.setdefault("TrackExtrapolationTool", "") else: acc = ExtrapolateMuonToIPToolCfg(flags) extrapolator = acc.popPrivateTools() result.addPublicTool(extrapolator) kwargs.setdefault("TrackExtrapolationTool", extrapolator ) result.merge(acc) # if cosmics was until here acc = MuonAmbiProcessorCfg(flags) ambiguityprocessor = acc.popPrivateTools() result.addPublicTool(ambiguityprocessor) kwargs.setdefault("AmbiguityProcessor", ambiguityprocessor ) result.merge(acc) from MuonConfig.MuonRecToolsConfig import MuonTrackSummaryToolCfg acc = MuonTrackSummaryToolCfg(flags) track_summary = acc.getPrimary() result.merge(acc) kwargs.setdefault("TrackSummaryTool", track_summary) if flags.Beam.Type=="cosmics": kwargs.setdefault("ExtrapolationStrategy", 1 ) tool = CompFactory.MuonCombined.MuonCandidateTool(name,**kwargs) result.setPrivateTools(tool) return result
def MooTrackBuilderCfg(flags, name="MooTrackBuilderTemplate", **kwargs): Muon__MooTrackBuilder = CompFactory.Muon.MooTrackBuilder Trk__STEP_Propagator = CompFactory.Trk.STEP_Propagator from MuonConfig.MuonRIO_OnTrackCreatorConfig import MdtDriftCircleOnTrackCreatorCfg, TriggerChamberClusterOnTrackCreatorCfg from MuonConfig.MuonRecToolsConfig import MuonTrackToSegmentToolCfg from MagFieldServices.MagFieldServicesConfig import MagneticFieldSvcCfg # 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) acc = MdtDriftCircleOnTrackCreatorCfg(flags) mdt_dcot_creator = acc.getPrimary() kwargs.setdefault("MdtRotCreator", mdt_dcot_creator) result.merge(acc) acc = TriggerChamberClusterOnTrackCreatorCfg(flags) muon_comp_cluster_creator = acc.getPrimary() kwargs.setdefault("CompetingClustersCreator", muon_comp_cluster_creator) result.merge(acc) acc = MuonSTEP_PropagatorCfg(flags) muon_prop = acc.getPrimary() kwargs.setdefault("Propagator", muon_prop) result.merge(acc) acc = MuonChamberHoleRecoveryToolCfg(flags) hole_recovery_tool = acc.getPrimary() result.addPublicTool(hole_recovery_tool) result.merge(acc) kwargs.setdefault("HitRecoveryTool", hole_recovery_tool) kwargs.setdefault("ChamberHoleRecoveryTool", hole_recovery_tool) # FIXME? Remove duplicate from cxx? acc = MagneticFieldSvcCfg(flags) result.merge(acc) acc = MuonTrackToSegmentToolCfg(flags) track_to_segment_tool = acc.getPrimary() kwargs.setdefault("TrackToSegmentTool", track_to_segment_tool) result.merge(acc) kwargs.setdefault("Printer", MuonEDMPrinterTool(flags)) # FIXME - remove ErrorOptimisationTool from cxx? # declareProperty("ErrorOptimisationTool","" ); acc = MuPatCandidateToolCfg(flags) cand_tool = acc.getPrimary() result.merge(acc) kwargs.setdefault("CandidateTool", cand_tool) acc = MooCandidateMatchingToolCfg(flags) track_segment_matching_tool = acc.getPrimary() result.merge(acc) kwargs.setdefault("CandidateMatchingTool", track_segment_matching_tool) from MuonConfig.MuonRecToolsConfig import MuonTrackSummaryToolCfg acc = MuonTrackSummaryToolCfg(flags) track_summary = acc.getPrimary() result.merge(acc) kwargs.setdefault("TrackSummaryTool", track_summary) builder = Muon__MooTrackBuilder(name, **kwargs) result.setPrivateTools(builder) return result
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) Muon__MooTrackFitter = CompFactory.Muon.MooTrackFitter MuonSegmentMomentum = CompFactory.MuonSegmentMomentum from MuonConfig.MuonRecToolsConfig import MuonPhiHitSelector, MuonTrackToSegmentToolCfg, MuonTrackSummaryHelperToolCfg, MuPatHitToolCfg from MuonConfig.MuonRIO_OnTrackCreatorConfig import MdtDriftCircleOnTrackCreatorCfg result = MCTBFitterCfg(flags) mctb_fitter = result.getPrimary() 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) result.merge(acc) kwargs.setdefault("HitTool", mu_pat_hit_tool) 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("MuonPrinterTool", MuonEDMPrinterTool(flags)) acc = MuonTrackToSegmentToolCfg(flags) track_to_segment_tool = acc.getPrimary() kwargs.setdefault("TrackToSegmentTool", track_to_segment_tool) result.merge(acc) acc = MdtDriftCircleOnTrackCreatorCfg(flags) mdt_dcot_creator = acc.getPrimary() kwargs.setdefault("MdtRotCreator", mdt_dcot_creator) result.merge(acc) kwargs.setdefault("PhiHitSelector", MuonPhiHitSelector(flags)) acc = MuonTrackCleanerCfg(flags) track_cleaner = acc.getPrimary() result.merge(acc) result.addPublicTool(track_cleaner) kwargs.setdefault("TrackCleaner", track_cleaner) # Leaving "SegmentInOverlapTool" as default, which is what happens in the current configuration. acc = MuonTrackSummaryHelperToolCfg(flags) track_summary_helper = acc.getPrimary() result.merge(acc) kwargs.setdefault("TrackSummaryTool", track_summary_helper) kwargs.setdefault("CleanPhiHits", True) kwargs.setdefault("UsePreciseHits", True) kwargs.setdefault("UsePrefit", False) kwargs.setdefault("SeedAtStartOfTrack", False) fitter = Muon__MooTrackFitter(name, **kwargs) result.setPrivateTools(fitter) return result
def DCMathSegmentMakerCfg(flags, **kwargs): TrkDriftCircleMath__MdtSegmentT0Fitter = CompFactory.TrkDriftCircleMath.MdtSegmentT0Fitter from MuonConfig.MuonRIO_OnTrackCreatorConfig import MdtDriftCircleOnTrackCreatorCfg, MuonClusterOnTrackCreatorCfg, TriggerChamberClusterOnTrackCreatorCfg from MuonConfig.MuonCondAlgConfig import MdtCondDbAlgCfg # 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 # ToolHandle<IMdtDriftCircleOnTrackCreator> m_mdtCreatorT0; //<! mdt rio ontrack creator # ToolHandle<IMuonClusterOnTrackCreator> m_clusterCreator; //<! cluster rio ontrack creator # ToolHandle<IMuonCompetingClustersOnTrackCreator> m_compClusterCreator; //<! competing clusters rio ontrack creator # ToolHandle<MuonEDMPrinterTool> m_printer; //<! printer helper tool # ServiceHandle<IMuonEDMHelperSvc> m_edmHelperSvc; //<! printer helper tool # ToolHandle<IMdtSegmentFinder> m_segmentFinder; //<! segment finder tool MdtSegmentFinder # ToolHandle<IMuonSegmentFittingTool> m_segmentFitter; //<! segment fitting tool # ToolHandle<IMuonSegmentSelectionTool> m_segmentSelectionTool; //<! segment selection tool # ToolHandle<IDCSLFitProvider> m_dcslFitProvider; result = ComponentAccumulator() beamType = flags.Beam.Type doSegmentT0Fit = flags.Muon.doSegmentT0Fit updateSegmentSecondCoordinate = flags.Muon.updateSegmentSecondCoordinate enableCurvedSegmentFinding = flags.Muon.enableCurvedSegmentFinding kwargs.setdefault("RefitSegment", True) 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("CurvedErrorScaling", False) kwargs.setdefault("UsePreciseError", True) kwargs.setdefault("SinAngleCut", 0.4) if (beamType == 'singlebeam' or beamType == 'cosmics'): kwargs.setdefault("SinAngleCut", 0.9) kwargs.setdefault("AddUnassociatedPhiHits", True) kwargs.setdefault("RecoverBadRpcCabling", True) kwargs.setdefault("CurvedErrorScaling", False) elif not flags.Input.isMC: # collisions real data kwargs.setdefault("AddUnassociatedPhiHits", True) kwargs.setdefault("RecoverBadRpcCabling", True) if doSegmentT0Fit: 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) else: mdt_math_segment_finder = MdtMathSegmentFinder(flags) result.addPublicTool(mdt_math_segment_finder) kwargs.setdefault("MdtSegmentFinder", mdt_math_segment_finder) if updateSegmentSecondCoordinate: kwargs.setdefault("UpdatePhiUsingPhiHits", True) if enableCurvedSegmentFinding: kwargs.setdefault("CurvedErrorScaling", False) kwargs.setdefault("PreciseErrorScale", 1) kwargs.setdefault("UsePreciseError", True) # Now stuff that wasn't explicitly configured before. acc = MuonStationIntersectSvcCfg(flags) muon_station_intersect_svc = acc.getPrimary() result.merge(acc) kwargs.setdefault("MuonStationIntersectSvc", muon_station_intersect_svc) acc = MdtDriftCircleOnTrackCreatorCfg(flags) kwargs.setdefault("MdtCreator", acc.getPrimary()) result.merge(acc) acc = 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 = TriggerChamberClusterOnTrackCreatorCfg(flags) muon_comp_cluster_creator = acc.getPrimary() result.addPublicTool(muon_comp_cluster_creator) result.merge(acc) kwargs.setdefault("MuonCompetingClustersCreator", muon_comp_cluster_creator) acc = MuonSegmentFittingToolCfg(flags, name="MuonSegmentFittingTool") segment_fitter = acc.getPrimary() result.addPublicTool(segment_fitter) kwargs.setdefault("EDMPrinter", MuonEDMPrinterTool(flags)) result.merge(acc) kwargs.setdefault("SegmentFitter", segment_fitter) segment_selector = Muon__MuonSegmentSelectionTool() result.addPublicTool(segment_selector) kwargs.setdefault("SegmentSelector", segment_selector) # Needs MdtCondDbData acc = MdtCondDbAlgCfg(flags) result.merge(acc) kwargs.setdefault( 'TgcPrepDataContainer', 'TGC_MeasurementsAllBCs' if not flags.Muon.useTGCPriorNextBC and not flags.Muon.useTGCPriorNextBC else 'TGC_Measurements') dc_segment_maker = Muon__DCMathSegmentMaker(**kwargs) result.setPrivateTools(dc_segment_maker) return result