ATLAS Offline Software
Loading...
Searching...
No Matches
MuonStauRecoTool.h
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
5#ifndef MUON_MUONSTAURECOTOOL_H
6#define MUON_MUONSTAURECOTOOL_H
7
8#include <iostream>
9#include <string>
10#include <vector>
11
13#include "GaudiKernel/PhysicalConstants.h"
38#include "TrkTrack/Track.h"
39
40namespace Muon {
42 struct RpcClusterObj;
43}
44
45namespace MuonCombined {
55 public:
56 typedef std::vector<const MuonHough::MuonLayerHough::Maximum*> MaximumVec;
57 typedef std::vector<const MuonHough::MuonPhiLayerHough::Maximum*> PhiMaximumVec;
58
59 struct BetaSeed {
60 BetaSeed(float beta_, float error_) : beta(beta_), error(error_) {}
61 float beta{0.f};
62 float error{0.f};
63 };
64
66 std::vector<std::shared_ptr<const Muon::RpcClusterOnTrack>> rpcClusters;
67 float time{0.f};
68 float error{0.f};
69 };
70 typedef std::vector<RpcTimeMeasurement> RpcTimeMeasurementVec;
71
72 struct MaximumData {
75 const std::vector<std::shared_ptr<const Muon::MuonClusterOnTrack>> & phiClusterOnTracks_) :
76 intersection(intersection_), maximum(maximum_), phiClusterOnTracks(phiClusterOnTracks_) {}
79 std::vector<std::shared_ptr<const Muon::MuonClusterOnTrack>> phiClusterOnTracks;
80
81 std::vector<std::shared_ptr<const Muon::MuonSegment>> t0fittedSegments;
83 std::vector<BetaSeed> betaSeeds;
84 };
85 using MaximumDataVec = std::vector<std::shared_ptr<MaximumData>>;
91 typedef std::vector<LayerData> LayerDataVec;
92
97
98 struct Candidate {
99 Candidate(const BetaSeed& betaSeed_) : betaSeed(betaSeed_) {}
100
101 // inital parameters
103
104 // information filled by createCandidates: associated layers with MaximumData, time measurements and final beta fit result
108
109 // information filled by refineCandidates: segments found using the beta of the final fit
110 std::vector<Muon::MuonLayerRecoData> allLayers;
111
112 // information filled by the final tracking: MuonCandidate and the track
113 std::unique_ptr<const Muon::MuonCandidate> muonCandidate;
114 std::unique_ptr<Trk::Track> combinedTrack;
118 };
119 typedef std::vector<std::shared_ptr<Candidate>> CandidateVec;
120
121 struct TruthInfo {
122 TruthInfo(int pdgId_, float mass_, float beta_) : pdgId(pdgId_), mass(mass_), beta(beta_) {}
123 int pdgId{0};
124 float mass{0.f};
125 float beta{0.f};
126 std::string toString() const {
127 std::ostringstream sout;
128 sout << " pdgId " << pdgId << " mass " << mass << " beta " << beta;
129 return sout.str();
130 }
131 };
132
134 MuonStauRecoTool(const std::string& type, const std::string& name, const IInterface* parent);
135 virtual ~MuonStauRecoTool() = default;
136 virtual StatusCode initialize() override;
137
139 virtual void extend(const InDetCandidateCollection& inDetCandidates, InDetCandidateToTagMap* tagMap, TrackCollection* combTracks,
140 TrackCollection* meTracks, Trk::SegmentCollection* segments, const EventContext& ctx) const override;
141
142 virtual void extendWithPRDs(const InDetCandidateCollection& inDetCandidates, InDetCandidateToTagMap* tagMap,
144 TrackCollection* meTracks, Trk::SegmentCollection* segments, const EventContext& ctx) const override;
145
146 private:
148 void handleCandidate(const EventContext& ctx, const InDetCandidate& inDetCandidate, InDetCandidateToTagMap* tagMap,
149 TrackCollection* combTracks, Trk::SegmentCollection* segments) const;
150
152 void associateHoughMaxima(const EventContext& ctx, LayerData& layerData) const;
153
156
159 const std::vector<Muon::RpcClusterObj>& clusterObjects,
160 RpcTimeMeasurementVec& rpcTimeMeasurements) const;
161
164 std::vector<std::shared_ptr<const Muon::MuonSegment>>& t0fittedSegments,
165 const ToolHandle<Muon::IMuonPRDSelectionTool>& muonPRDSelectionTool,
166 const ToolHandle<Muon::IMuonSegmentMaker>& segmentMaker,
167 float beta = 1.) const;
168
170 bool extractTimeMeasurements(const EventContext& ctx, const Muon::MuonSystemExtension& muonSystemExtension,
171 AssociatedData& associatedData) const;
172
174 bool createCandidates(const AssociatedData& associatedData, CandidateVec& candidates) const;
175
177 void extendCandidates(CandidateVec& candidates, std::set<const MaximumData*>& usedMaximumData, LayerDataVec::const_iterator it,
178 LayerDataVec::const_iterator it_end) const;
179
181 void getBetaSeeds(MaximumData& maximumData) const;
182
184 bool extractTimeHits(const MaximumData& maximumData, Muon::TimePointBetaFitter::HitVec& hits, const BetaSeed* seed = 0) const;
185
187 bool refineCandidates(const EventContext& ctx, CandidateVec& candidates) const;
188
190 bool combineCandidates(const EventContext& ctx, const xAOD::TrackParticle& indetTrackParticle, CandidateVec& candidates) const;
191
193 bool resolveAmbiguities(CandidateVec& candidates) const;
194
196 void addTag(const InDetCandidate& inDetCandidate, Candidate& candidate, InDetCandidateToTagMap* tagMap, TrackCollection* combTracks,
197 Trk::SegmentCollection* segments) const;
198
200 void extractTimeMeasurementsFromTrack(const EventContext& ctx, Candidate& candidate) const;
201
203 std::unique_ptr<TruthInfo> getTruth(const xAOD::TrackParticle& indetTrackParticle) const;
204
206 bool selectTruth(const TruthInfo* truthInfo) const {
207 if (!m_useTruthMatching) return true;
208 if (truthInfo && m_selectedPdgs.count(truthInfo->pdgId)) return true;
209 return false;
210 }
211
213 void addCandidatesToNtuple(const xAOD::TrackParticle& indetTrackParticle, const CandidateVec& candidates, int stage) const;
214
216 bool processMuonSystemExtension(const xAOD::TrackParticle& indetTrackParticle, const Muon::MuonSystemExtension& muonSystemExtension,
217 CandidateVec& candidates);
218
220 void mdtTimeCalibration(const Identifier& id, float& time, float& error) const;
221 void rpcTimeCalibration(const Identifier& id, float& time, float& error) const;
222 void segmentTimeCalibration(const Identifier& id, float& time, float& error) const;
223
224 float calculateTof(const float beta, const float dist) const;
225 float calculateBeta(const float time, const float dist) const;
226
229 this, "Key_MuonLayerHoughToolHoughDataPerSectorVec", "HoughDataPerSectorVec", "HoughDataPerSectorVec key"};
230
231 ServiceHandle<Muon::IMuonIdHelperSvc> m_idHelperSvc{this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"};
232 ServiceHandle<Muon::IMuonEDMHelperSvc> m_edmHelperSvc{this, "edmHelper", "Muon::MuonEDMHelperSvc/MuonEDMHelperSvc",
233 "Handle to the service providing the IMuonEDMHelperSvc interface"};
234
235 PublicToolHandle<Muon::MuonEDMPrinterTool> m_printer{this, "MuonEDMPrinterTool", ""};
236 ToolHandle<Muon::IMuonSegmentMaker> m_segmentMaker{this, "MuonSegmentMaker", "Muon::DCMathSegmentMaker/DCMathSegmentMaker"};
237 ToolHandle<Muon::IMuonSegmentMaker> m_segmentMakerT0Fit{this, "MuonSegmentMakerT0Fit",
238 "Muon::DCMathSegmentMaker/DCMathT0FitSegmentMaker"};
239 ToolHandle<Muon::IMuonLayerSegmentMatchingTool> m_segmentMatchingTool{
240 this, "MuonLayerSegmentMatchingTool", "Muon::MuonLayerSegmentMatchingTool/MuonLayerSegmentMatchingTool"};
241
242 ToolHandle<Muon::IMuonRecoValidationTool> m_recoValidationTool{this, "MuonRecoValidationTool", ""};
243 ToolHandle<Trk::ITrackAmbiguityProcessorTool> m_trackAmbibuityResolver{this, "TrackAmbiguityProcessor",
244 "Trk::TrackSelectionProcessorTool/MuonAmbiProcessor"};
245 ToolHandle<Muon::IMuonHitTimingTool> m_hitTimingTool{this, "MuonHitTimingTool", "Muon::MuonHitTimingTool/MuonHitTimingTool"};
246 ToolHandle<Muon::IMuonPRDSelectionTool> m_muonPRDSelectionTool{this, "MuonPRDSelectionTool", ""};
247 ToolHandle<Muon::IMuonPRDSelectionTool> m_muonPRDSelectionToolStau{this, "MuonPRDSelectionToolStau", ""};
248 ToolHandle<Muon::IMdtDriftCircleOnTrackCreator> m_mdtCreator{this, "MdtDriftCircleOnTrackCreator",
249 "Muon::MdtDriftCircleOnTrackCreator/MdtDriftCircleOnTrackCreator"};
250 ToolHandle<Muon::IMdtDriftCircleOnTrackCreator> m_mdtCreatorStau{
251 this, "MdtDriftCircleOnTrackCreatorStau", "Muon::MdtDriftCircleOnTrackCreator/MdtDriftCircleOnTrackCreatorStau"};
252 ToolHandle<MuonCombined::MuonInsideOutRecoTool> m_insideOutRecoTool{this, "MuonInsideOutRecoTool",
253 "MuonCombined::MuonInsideOutRecoTool/MuonInsideOutRecoTool"};
254 ToolHandle<Trk::IUpdator> m_updator{this, "Updator", "Trk::KalmanUpdator/KalmanUpdator"};
256 "Conditions object containing the calibrations"};
257
259
260 Gaudi::Property<bool> m_doSummary{this, "DoSummary", false, "enable summary output"};
261 Gaudi::Property<bool> m_useTruthMatching{this, "UseTruthMatching", false, "enable usage of truth info for reconstruction"};
262 Gaudi::Property<bool> m_doTruth{this, "DoTruth", false, "enable truth matching"};
263 Gaudi::Property<bool> m_segmentMDTT{this, "UseSegmentMDTT", true};
264 Gaudi::Property<bool> m_ignoreSiAssocated{this, "IgnoreSiAssociatedCandidates", true};
265 Gaudi::Property<std::vector<int>> m_pdgsToBeConsidered{this, "ConsideredPDGs", {}, "PDG IDs considered in truth matching"};
266 Gaudi::Property<double> m_ptThreshold{this, "PtThreshold", 10000};
267 Gaudi::Property<double> m_houghAssociationPullCut{this, "HoughAssociationPullCut", 5};
268 Gaudi::Property<double> m_mdttBetaAssociationCut{this, "MDTTAssocationCut", 0.4};
269 Gaudi::Property<double> m_rpcBetaAssociationCut{this, "RPCAssocationCut", 0.2};
270 Gaudi::Property<double> m_segmentBetaAssociationCut{this, "SegmentAssocationCut", 0.2};
271 Gaudi::Property<bool> m_addMDTExtrasMuGirlLowBeta{this, "AddMDTExtrasMuGirlLowBeta", false};
272
273 std::set<int> m_selectedPdgs; // set storing particle PDG's considered for matching
274
275 };
276
277} // namespace MuonCombined
278
279#endif
DataVector< MuonCombined::InDetCandidate > InDetCandidateCollection
This typedef represents a collection of InDetCandidate objects.
DataVector< Trk::Track > TrackCollection
This typedef represents a collection of Trk::Track objects.
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
interface for tools buildingmuons from ID candidates
void addTag(const InDetCandidate &inDetCandidate, Candidate &candidate, InDetCandidateToTagMap *tagMap, TrackCollection *combTracks, Trk::SegmentCollection *segments) const
create final tag object and add it to the inDetCandidate
Gaudi::Property< bool > m_useTruthMatching
bool extractTimeHits(const MaximumData &maximumData, Muon::TimePointBetaFitter::HitVec &hits, const BetaSeed *seed=0) const
extract hits for the beta fit, returns true if hits were added
bool refineCandidates(const EventContext &ctx, CandidateVec &candidates) const
refine candidates: find segments for the given beta
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
ServiceHandle< Muon::IMuonEDMHelperSvc > m_edmHelperSvc
bool combineCandidates(const EventContext &ctx, const xAOD::TrackParticle &indetTrackParticle, CandidateVec &candidates) const
combine reconstruction
ToolHandle< Trk::ITrackAmbiguityProcessorTool > m_trackAmbibuityResolver
ToolHandle< Muon::IMuonPRDSelectionTool > m_muonPRDSelectionToolStau
void rpcTimeCalibration(const Identifier &id, float &time, float &error) const
virtual void extendWithPRDs(const InDetCandidateCollection &inDetCandidates, InDetCandidateToTagMap *tagMap, IMuonCombinedInDetExtensionTool::MuonPrdData prdData, TrackCollection *combTracks, TrackCollection *meTracks, Trk::SegmentCollection *segments, const EventContext &ctx) const override
void extractTimeMeasurementsFromTrack(const EventContext &ctx, Candidate &candidate) const
extract time measurements from the track associated with the candidate
ToolHandle< Muon::IMuonSegmentMaker > m_segmentMaker
ToolHandle< Muon::IMuonRecoValidationTool > m_recoValidationTool
Gaudi::Property< double > m_ptThreshold
std::vector< std::shared_ptr< Candidate > > CandidateVec
Gaudi::Property< bool > m_doSummary
virtual StatusCode initialize() override
Gaudi::Property< double > m_mdttBetaAssociationCut
PublicToolHandle< Muon::MuonEDMPrinterTool > m_printer
ToolHandle< Muon::IMuonSegmentMaker > m_segmentMakerT0Fit
void handleCandidate(const EventContext &ctx, const InDetCandidate &inDetCandidate, InDetCandidateToTagMap *tagMap, TrackCollection *combTracks, Trk::SegmentCollection *segments) const
handle a single candidate
virtual void extend(const InDetCandidateCollection &inDetCandidates, InDetCandidateToTagMap *tagMap, TrackCollection *combTracks, TrackCollection *meTracks, Trk::SegmentCollection *segments, const EventContext &ctx) const override
IMuonCombinedInDetExtensionTool interface: extend ID candidate.
void getBetaSeeds(MaximumData &maximumData) const
calculate the beta seeds for a give MaximumData
bool createCandidates(const AssociatedData &associatedData, CandidateVec &candidates) const
create candidates from the beta seeds
Gaudi::Property< bool > m_segmentMDTT
std::vector< const MuonHough::MuonLayerHough::Maximum * > MaximumVec
ToolHandle< Trk::IUpdator > m_updator
ToolHandle< Muon::IMuonLayerSegmentMatchingTool > m_segmentMatchingTool
bool processMuonSystemExtension(const xAOD::TrackParticle &indetTrackParticle, const Muon::MuonSystemExtension &muonSystemExtension, CandidateVec &candidates)
match extension to Hough maxima, extract time measurements, create candidates, run segment finding
SG::ReadHandleKey< Muon::HoughDataPerSectorVec > m_houghDataPerSectorVecKey
storegate
ToolHandle< Muon::IMdtDriftCircleOnTrackCreator > m_mdtCreator
bool extractTimeMeasurements(const EventContext &ctx, const Muon::MuonSystemExtension &muonSystemExtension, AssociatedData &associatedData) const
associate Hough maxima and associate time measurements
void extractRpcTimingFromMaximum(const Muon::MuonSystemExtension::Intersection &intersection, MaximumData &maximumData) const
extract RPC hit timing
ToolHandle< Muon::IMdtDriftCircleOnTrackCreator > m_mdtCreatorStau
std::unique_ptr< TruthInfo > getTruth(const xAOD::TrackParticle &indetTrackParticle) const
extract truth from the indetTrackParticle
Gaudi::Property< double > m_segmentBetaAssociationCut
void extendCandidates(CandidateVec &candidates, std::set< const MaximumData * > &usedMaximumData, LayerDataVec::const_iterator it, LayerDataVec::const_iterator it_end) const
extend a CandidateVec with the next LayerData
Muon::MuonSectorMapping m_muonSectorMapping
Gaudi::Property< bool > m_doTruth
void associateHoughMaxima(const EventContext &ctx, LayerData &layerData) const
associate Hough maxima to intersection
void findSegments(const Muon::MuonSystemExtension::Intersection &intersection, MaximumData &maximumData, std::vector< std::shared_ptr< const Muon::MuonSegment > > &t0fittedSegments, const ToolHandle< Muon::IMuonPRDSelectionTool > &muonPRDSelectionTool, const ToolHandle< Muon::IMuonSegmentMaker > &segmentMaker, float beta=1.) const
find segments for a given maximum
ToolHandle< MuonCombined::MuonInsideOutRecoTool > m_insideOutRecoTool
std::vector< const MuonHough::MuonPhiLayerHough::Maximum * > PhiMaximumVec
MuonStauRecoTool(const std::string &type, const std::string &name, const IInterface *parent)
Default AlgTool functions.
ToolHandle< Muon::IMuonHitTimingTool > m_hitTimingTool
void segmentTimeCalibration(const Identifier &id, float &time, float &error) const
std::vector< std::shared_ptr< MaximumData > > MaximumDataVec
Gaudi::Property< bool > m_ignoreSiAssocated
float calculateTof(const float beta, const float dist) const
Calcualte for zero betas.
bool resolveAmbiguities(CandidateVec &candidates) const
resolve ambiguities between the candidates
void mdtTimeCalibration(const Identifier &id, float &time, float &error) const
void createRpcTimeMeasurementsFromClusters(const Muon::MuonSystemExtension::Intersection &intersection, const std::vector< Muon::RpcClusterObj > &clusterObjects, RpcTimeMeasurementVec &rpcTimeMeasurements) const
create Rpc hit timing for a set of clusters
Gaudi::Property< std::vector< int > > m_pdgsToBeConsidered
Gaudi::Property< double > m_houghAssociationPullCut
std::vector< LayerData > LayerDataVec
bool selectTruth(const TruthInfo *truthInfo) const
if truth tracking is enabled, return whether the pdg is selected
virtual ~MuonStauRecoTool()=default
ToolHandle< Muon::IMuonPRDSelectionTool > m_muonPRDSelectionTool
Gaudi::Property< bool > m_addMDTExtrasMuGirlLowBeta
Gaudi::Property< double > m_rpcBetaAssociationCut
SG::ReadCondHandleKey< MuonCalib::MdtCalibDataContainer > m_calibDbKey
std::vector< RpcTimeMeasurement > RpcTimeMeasurementVec
float calculateBeta(const float time, const float dist) const
In cases of invalid times just return an phyisical value of 20 times the speed of light The subsequen...
void addCandidatesToNtuple(const xAOD::TrackParticle &indetTrackParticle, const CandidateVec &candidates, int stage) const
helper function to add Candidate to ntuple
Tracking class to hold the extrapolation from a particle from the calo entry to the end of muon syste...
Class to represent calibrated clusters formed from RPC strips.
Property holding a SG store/key/clid from which a ReadHandle is made.
std::vector< std::string > intersection(std::vector< std::string > &v1, std::vector< std::string > &v2)
std::vector< StauMDTHitExtra > StauMDTHitExtras
std::vector< StauHit > StauHits
The MuonTagToSegMap is an auxillary construct that links the MuonSegments associated with a combined ...
NRpcCablingAlg reads raw condition data and writes derived condition data to the condition store.
DataVector< Trk::Segment > SegmentCollection
TrackParticle_v1 TrackParticle
Reference the current persistent version:
Muon::TimePointBetaFitter::HitVec hits
Muon::TimePointBetaFitter::FitResult betaFitResult
std::unique_ptr< Trk::Track > combinedTrack
std::vector< Muon::MuonLayerRecoData > allLayers
MuGirlNS::StauMDTHitExtras stauMDTHitExtras
std::unique_ptr< const Muon::MuonCandidate > muonCandidate
Muon::TimePointBetaFitter::FitResult finalBetaFitResult
Muon::MuonSystemExtension::Intersection intersection
LayerData(const Muon::MuonSystemExtension::Intersection &intersection_)
Muon::MuonSystemExtension::Intersection intersection
std::vector< std::shared_ptr< const Muon::MuonSegment > > t0fittedSegments
MaximumData(const Muon::MuonSystemExtension::Intersection &intersection_, const MuonHough::MuonLayerHough::Maximum *maximum_, const std::vector< std::shared_ptr< const Muon::MuonClusterOnTrack > > &phiClusterOnTracks_)
std::vector< std::shared_ptr< const Muon::MuonClusterOnTrack > > phiClusterOnTracks
const MuonHough::MuonLayerHough::Maximum * maximum
std::vector< std::shared_ptr< const Muon::RpcClusterOnTrack > > rpcClusters
TruthInfo(int pdgId_, float mass_, float beta_)
struct representing the maximum in the hough space
simple struct holding the fit result