ATLAS Offline Software
Loading...
Searching...
No Matches
MooTrackFitter.h
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4#ifndef MUON_MOOTRACKFITTER_H
5#define MUON_MOOTRACKFITTER_H
6
8
9// Misc
11
12// Tracking EDM
14#include "TrkTrack/TrackInfo.h"
15
16// Tools & tool interfaces
31
32// Local
33#include <set>
34
35#include "MuPatHitTool.h"
38
39namespace Trk {
40 class PrepRawData;
41 class Track;
42 class MeasurementBase;
43 class Layer;
44} // namespace Trk
45
46namespace Muon {
47 class MuPatTrack;
48}
49
50
51namespace Muon {
52
59 class MooTrackFitter : public AthAlgTool {
60 public:
61 typedef std::vector<const Trk::MeasurementBase*> MeasVec;
62 typedef MeasVec::iterator MeasIt;
63 typedef MeasVec::const_iterator MeasCit;
64
65 typedef std::vector<const Trk::PrepRawData*> PrepVec;
66 typedef PrepVec::iterator PrepIt;
67 typedef PrepVec::const_iterator PrepCit;
68
69 typedef std::pair<int, int> SmallLargeChambers;
70 typedef std::map<MuonStationIndex::StIndex, SmallLargeChambers> SLStationMap;
71
72 typedef std::vector<std::pair<const Trk::TrackParameters*, const Trk::Layer*> > MaterialLayers;
73
74
75
76 public:
78 MooTrackFitter(const std::string&, const std::string&, const IInterface*);
79
81 ~MooTrackFitter() = default;
82
84 StatusCode initialize();
85
87 StatusCode finalize();
88
90 static const InterfaceID& interfaceID() {
91 static const InterfaceID IID_MooTrackFitter("Muon::MooTrackFitter", 1, 0);
92 return IID_MooTrackFitter;
93 }
94
101 std::unique_ptr<Trk::Track> fit(const EventContext& ctx, const MuPatCandidateBase& firstEntry, const MuPatCandidateBase& secondEntry,
102 const PrepVec& externalPhiHits) const;
103
105 std::unique_ptr<Trk::Track> refit(const EventContext& ctx, const MuPatTrack& trkCan) const;
106
108 std::unique_ptr<Trk::Track> refit(const EventContext& ctx, const Trk::Track& track) const;
109
111 static double restrictedMomentum(double momentum) ;
112
114 std::unique_ptr<Trk::Perigee> createPerigee(const EventContext& ctx, const Trk::TrackParameters& firstPars, const Trk::MeasurementBase& firstMeas) const;
115
117 std::unique_ptr<Trk::Track> fit(const EventContext& ctx, const Trk::Perigee& startPars, MeasVec& hits,
118 Trk::ParticleHypothesis partHypo, bool prefit) const;
119
121 std::unique_ptr<Trk::Track> fitWithRefit(const EventContext& ctx, const Trk::Perigee& startPars, MeasVec& hits) const;
122
126 std::pair<std::unique_ptr<Trk::Track>, std::unique_ptr<Trk::Track> > splitTrack(const EventContext& ctx, const Trk::Track& track) const;
127
129 std::unique_ptr<Trk::Track> fitSplitTrack(const EventContext& ctx, const Trk::TrackParameters& startPars,
130 const std::vector<const Trk::TrackStateOnSurface*>& tsos) const;
131
132 private:
133 struct FitterData {
134 FitterData() = default;
135 ~FitterData() = default;
136
141
142 int nOverlaps{-1};
143 int nSmall{-1};
144 int nLarge{-1};
146
147 double avePhi{0.};
148 double phiMin{0.};
149 double phiMax{0.};
150
151 bool hasBarrel{false};
152 bool hasEndcap{false};
155 std::set<MuonStationIndex::StIndex> stations{};
157
158 std::unique_ptr<Trk::Perigee> startPars{nullptr};
159
160 std::vector<std::unique_ptr<const Trk::MeasurementBase>> garbage{};
161
162 bool firstIsTrack{false};
163 bool secondIsTrack{false};
164 bool firstHasMomentum{false};
165 bool secondHasMomentum{false};
166 std::set<Identifier> mdtIdsFirst{};
167 std::set<Identifier> mdtIdsSecond{};
168
170 // check if already initialized
171 if (nOverlaps == -1) {
172 nOverlaps = 0;
173 nSmall = 0;
174 nLarge = 0;
175 // loop over SLStationMap and count the number of times there is a station with both S and L
176 SLStationMap::iterator it = smallLargeChambersPerStation.begin();
177 SLStationMap::iterator it_end = smallLargeChambersPerStation.end();
178 for (; it != it_end; ++it) {
179 if (it->second.first) ++nSmall;
180 if (it->second.second) ++nLarge;
181 if (it->second.first && it->second.second) ++nOverlaps;
182 }
183 }
184 return nOverlaps;
185 }
187 if (nSmall < 0) numberOfSLOverlaps();
188 return nSmall;
189 }
191 if (nLarge < 0) numberOfSLOverlaps();
192 return nLarge;
193 }
194
196 };
197
200 std::unique_ptr<Trk::Track> cleanAndEvaluateTrack(const EventContext& ctx, Trk::Track& track, const std::set<Identifier>& excludedChambers) const;
201
203 bool extractData(const MuPatCandidateBase& entry1, const MuPatCandidateBase& entry2, FitterData& fitterData) const;
204
206 bool extractData(FitterData& fitterData, bool usePreciseHits) const;
207
209 bool addFakePhiHits(const EventContext& ctx, FitterData& fitterData, const Trk::TrackParameters& referenceParameter) const;
210
212 bool corruptEntry(const MuPatCandidateBase& entry) const;
213
215 bool getMaterial(const Trk::TrackParameters& pars, FitterData& fitterData) const;
216
218 void createStartParameters(const EventContext& ctx, FitterData& inputData) const;
219
221 std::shared_ptr<const MuonSegment> segmentFromEntry(const EventContext& ctx, const MuPatCandidateBase& entry) const;
222
224 unsigned int hasPhiConstrain(FitterData& inputData) const;
225
227 unsigned int hasPhiConstrain(Trk::Track* track) const;
228
230 std::unique_ptr<Trk::MeasurementBase> createFakePhiForMeasurement(const Trk::MeasurementBase& measurement, const Amg::Vector3D* overlapPos,
231 const Amg::Vector3D* phiPos, double error) const;
232
234 static double qOverPFromEntry(const MuPatCandidateBase& entry) ;
235
237 double qOverPFromEntries(const EventContext& ctx, const MuPatCandidateBase& firstEntry, const MuPatCandidateBase& secondEntry) const;
238
240 double phiSeeding(const EventContext& ctx, FitterData& fitterData) const;
241
243 double thetaSeeding(const MuPatCandidateBase& entry, MeasVec& etaHits) const;
244
246 bool cleanPhiHits(const EventContext& ctx, double momentum, FitterData& phiHits, const PrepVec& patternPhiHits) const;
247
249 bool validMomentum(const Trk::TrackParameters& pars) const;
250
252 bool getMinMaxPhi(FitterData& fitterData) const;
253
254 void removeSegmentOutliers(FitterData& fitterData) const;
255 void cleanEntry(const MuPatCandidateBase& entry, std::set<Identifier>& removedIdentifiers) const;
256 void cleanSegment(const MuonSegment& seg, std::set<Identifier>& removedIdentifiers) const;
257
258 std::pair<double, double> getElementHalfLengths(const Identifier& id, const Trk::TrkDetElementBase* ele) const;
259
260 ToolHandle<Trk::IPropagator> m_propagator{this, "Propagator",
261 "Trk::RungeKuttaPropagator/AtlasRungeKuttaPropagator"};
262 ToolHandle<Trk::ITrackFitter> m_trackFitter{this, "Fitter", "Trk::GlobalChi2Fitter/MCTBFitter"};
263 PublicToolHandle<MuPatHitTool> m_hitHandler{this, "HitTool", "Muon::MuPatHitTool/MuPatHitTool"};
264 ToolHandle<IMuonSegmentMomentumEstimator> m_momentumEstimator{
265 this, "SegmentMomentum", "MuonSegmentMomentum/MuonSegmentMomentum"};
266
267 Gaudi::Property<Trk::RunOutlierRemoval> m_runOutlier{this, "RunOutlier", false, "Switch whether to run outlier logics or not"};
268 Gaudi::Property<int> m_matEffects{this, "MatEffects", 2, "type of material interaction in extrapolation"};
272 ServiceHandle<Muon::IMuonIdHelperSvc> m_idHelperSvc{this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"};
274 this, "edmHelper", "Muon::MuonEDMHelperSvc/MuonEDMHelperSvc",
275 "Handle to the service providing the IMuonEDMHelperSvc interface"};
276 PublicToolHandle<MuonEDMPrinterTool> m_printer{this, "MuonPrinterTool",
277 "Muon::MuonEDMPrinterTool/MuonEDMPrinterTool"};
278 ToolHandle<IMuonTrackToSegmentTool> m_trackToSegmentTool{
279 this, "TrackToSegmentTool",
280 "Muon::MuonTrackToSegmentTool/MuonTrackToSegmentTool"};
281
282 ToolHandle<IMuonHitSelector> m_phiHitSelector{this, "PhiHitSelector",
283 "MuonPhiHitSelector/MuonPhiHitSelector"};
284 ToolHandle<IMuonTrackCleaner> m_cleaner{this, "TrackCleaner", "Muon::MuonTrackCleaner/MuonTrackCleaner"};
285 ToolHandle<IMuonSegmentInOverlapResolvingTool> m_overlapResolver{
286 this, "SegmentInOverlapTool", "Muon::MuonSegmentInOverlapResolvingTool/MuonSegmentInOverlapResolvingTool"};
287 ToolHandle<Trk::ITrackSummaryHelperTool> m_trackSummaryTool{
288 this, "TrackSummaryTool", "Muon::MuonTrackSummaryHelperTool/MuonTrackSummaryHelperTool"}; //<! muon track summary helper
289
290 Gaudi::Property<bool> m_slFit{this, "SLFit", true, "Perform sl fit"};
291 Gaudi::Property<bool> m_slProp{this, "SLProp", false, "Enable straight line propagation"};
292 Gaudi::Property<bool> m_seedWithSegmentTheta{this, "SeedWithSegmentTheta", true, "Seed with theta connecting first + last eta hit"};
293 Gaudi::Property<bool> m_seedWithAvePhi{this, "SeedWithAvePhi", true, "Seed with average phi of all phi hits"};
294 Gaudi::Property<bool> m_seedPhiWithEtaHits{this, "SeedPhiWithEtaHits", false, "Seed phi from positions first last eta hit"};
295 Gaudi::Property<bool> m_usePreciseHits{this, "UsePreciseHits", false, "Use actual measurement error"};
296 Gaudi::Property<bool> m_usePrefit{this, "UsePrefit", true, "Use prefit"};
297 Gaudi::Property<bool> m_allowFirstFit{this, "AllowFirstFitResult", false, "Return the result of the prefit is final fit fails"};
298 Gaudi::Property<double> m_pThreshold{this, "PThreshold", 500.,
299 "Momentum cut-off. Seeds below the threshold will not be fitted"}; //<!
300 Gaudi::Property<bool> m_cosmics{this, "Cosmics", false, "Special treatment for cosmics"};
301 Gaudi::Property<bool> m_cleanPhiHits{this, "CleanPhiHits", true, "Special flag to switch off phi hit cleaning"};
302 Gaudi::Property<unsigned int> m_phiHitsMax{this, "MaxPatternPhiHits", 40,
303 "If more than maximum number of phi hits on pattern, no hits will be added"};
304 Gaudi::Property<bool> m_seedAtStartOfTrack{this, "SeedAtStartOfTrack", true, "Provide seed parameters at the start of the track"};
305 Gaudi::Property<bool> m_preciseFirstStation{this, "UsePreciseHitsInFirstStation", false,
306 "use precise hits in first station to stabalise the fit"};
307
308 Gaudi::Property<double> m_openingAngleCut{this, "OpeningAngleCut", 0.3,
309 "cut on the maximum difference in phi between measurements on the track"};
310 Gaudi::Property<double> m_preCleanChi2Cut{this, "PreCleaningReducedChi2Cut", 500.,
311 "minimum chi2/ndof for a track to be passed to cleaner"};
312 Gaudi::Property<double> m_chi2Cut{this, "ReducedChi2Cut", 100., "minimum chi2/ndof for a track to be accepted"};
313
314 mutable std::atomic_uint m_nfits{0};
315 mutable std::atomic_uint m_nfailedExtractInital{0};
316 mutable std::atomic_uint m_nfailedMinMaxPhi{0};
317 mutable std::atomic_uint m_nfailedParsInital{0};
318 mutable std::atomic_uint m_nfailedExtractCleaning{0};
319 mutable std::atomic_uint m_nfailedFakeInitial{0};
320 mutable std::atomic_uint m_nfailedTubeFit{0};
321 mutable std::atomic_uint m_noPerigee{0};
322 mutable std::atomic_uint m_nlowMomentum{0};
323 mutable std::atomic_uint m_nfailedExtractPrecise{0};
324 mutable std::atomic_uint m_nfailedFakePrecise{0};
325 mutable std::atomic_uint m_nfailedFitPrecise{0};
326 mutable std::atomic_uint m_nsuccess{0};
327
329 unsigned int nphiHits{0};
330 unsigned int nSmallChambers{0};
331 unsigned int nLargeChambers{0};
332 };
333 };
334
335} // namespace Muon
336
337#endif
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
std::atomic_uint m_nfailedTubeFit
std::map< MuonStationIndex::StIndex, SmallLargeChambers > SLStationMap
double phiSeeding(const EventContext &ctx, FitterData &fitterData) const
calculate phi used to for seeding the fit
static double qOverPFromEntry(const MuPatCandidateBase &entry)
get q/p from entry
std::pair< int, int > SmallLargeChambers
Gaudi::Property< double > m_chi2Cut
bool validMomentum(const Trk::TrackParameters &pars) const
check whether mometum of start parameter is ok
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
PrepVec::const_iterator PrepCit
Gaudi::Property< unsigned int > m_phiHitsMax
std::shared_ptr< const MuonSegment > segmentFromEntry(const EventContext &ctx, const MuPatCandidateBase &entry) const
get segment from entry
bool cleanPhiHits(const EventContext &ctx, double momentum, FitterData &phiHits, const PrepVec &patternPhiHits) const
clean phi hits, returns true if anything happened during the cleaning
std::atomic_uint m_nfits
Gaudi::Property< Trk::RunOutlierRemoval > m_runOutlier
std::atomic_uint m_nsuccess
std::atomic_uint m_nfailedFakePrecise
ToolHandle< Trk::ITrackFitter > m_trackFitter
fitter
Gaudi::Property< bool > m_cleanPhiHits
MeasVec::iterator MeasIt
ToolHandle< IMuonSegmentMomentumEstimator > m_momentumEstimator
tool to estimate track momentum
bool corruptEntry(const MuPatCandidateBase &entry) const
sanity check for entries
static const InterfaceID & interfaceID()
access to tool interface
Gaudi::Property< bool > m_seedWithSegmentTheta
ToolHandle< IMuonHitSelector > m_phiHitSelector
tool to clean phi hits
PrepVec::iterator PrepIt
Trk::MagneticFieldProperties m_magFieldProperties
magnetic field properties
double qOverPFromEntries(const EventContext &ctx, const MuPatCandidateBase &firstEntry, const MuPatCandidateBase &secondEntry) const
get q/p using angle + position of the two entries
Gaudi::Property< bool > m_seedPhiWithEtaHits
std::pair< std::unique_ptr< Trk::Track >, std::unique_ptr< Trk::Track > > splitTrack(const EventContext &ctx, const Trk::Track &track) const
split given track if it crosses the calorimeter volume, code assumes that the track was already extra...
ToolHandle< IMuonSegmentInOverlapResolvingTool > m_overlapResolver
Gaudi::Property< bool > m_allowFirstFit
void createStartParameters(const EventContext &ctx, FitterData &inputData) const
create a perigee parameter give the input data
StatusCode finalize()
finialize method, method taken from bass-class AlgTool
~MooTrackFitter()=default
destructor
std::atomic_uint m_nfailedFakeInitial
std::unique_ptr< Trk::Track > fitWithRefit(const EventContext &ctx, const Trk::Perigee &startPars, MeasVec &hits) const
fit track, refit if needed
std::unique_ptr< Trk::MeasurementBase > createFakePhiForMeasurement(const Trk::MeasurementBase &measurement, const Amg::Vector3D *overlapPos, const Amg::Vector3D *phiPos, double error) const
create fake phi hit on the surface of the give measurement
Trk::ParticleHypothesis m_ParticleHypothesis
nomen est omen
Trk::TrackInfo::TrackPatternRecoInfo m_patRecInfo
Gaudi::Property< int > m_matEffects
std::unique_ptr< Trk::Track > fitSplitTrack(const EventContext &ctx, const Trk::TrackParameters &startPars, const std::vector< const Trk::TrackStateOnSurface * > &tsos) const
construct a track from a list of TSOS and a start parameters
Gaudi::Property< bool > m_usePreciseHits
Gaudi::Property< bool > m_seedWithAvePhi
double thetaSeeding(const MuPatCandidateBase &entry, MeasVec &etaHits) const
calculate theta used for seeding the fit
std::unique_ptr< Trk::Track > fit(const EventContext &ctx, const MuPatCandidateBase &firstEntry, const MuPatCandidateBase &secondEntry, const PrepVec &externalPhiHits) const
fit the hits of two MuPatCandidateBase
std::unique_ptr< Trk::Perigee > createPerigee(const EventContext &ctx, const Trk::TrackParameters &firstPars, const Trk::MeasurementBase &firstMeas) const
create perigee parameter to initialize fit
bool getMinMaxPhi(FitterData &fitterData) const
calculate the minimum and maximum phi value a track could have to pass all eta channels
std::atomic_uint m_nfailedExtractCleaning
Gaudi::Property< bool > m_slFit
Gaudi::Property< bool > m_cosmics
std::atomic_uint m_nlowMomentum
std::vector< const Trk::MeasurementBase * > MeasVec
Gaudi::Property< double > m_pThreshold
ToolHandle< IMuonTrackToSegmentTool > m_trackToSegmentTool
helper tool to convert tracks into segments
std::atomic_uint m_nfailedParsInital
ServiceHandle< IMuonEDMHelperSvc > m_edmHelperSvc
multi purpose helper tool
std::vector< std::pair< const Trk::TrackParameters *, const Trk::Layer * > > MaterialLayers
std::pair< double, double > getElementHalfLengths(const Identifier &id, const Trk::TrkDetElementBase *ele) const
void cleanSegment(const MuonSegment &seg, std::set< Identifier > &removedIdentifiers) const
std::atomic_uint m_nfailedExtractPrecise
Gaudi::Property< bool > m_seedAtStartOfTrack
Gaudi::Property< bool > m_slProp
static double restrictedMomentum(double momentum)
impose upper and lower bound on momentum
MeasVec::const_iterator MeasCit
Gaudi::Property< bool > m_usePrefit
std::atomic_uint m_nfailedExtractInital
PublicToolHandle< MuPatHitTool > m_hitHandler
hit handler
Gaudi::Property< double > m_openingAngleCut
ToolHandle< IMuonTrackCleaner > m_cleaner
bool addFakePhiHits(const EventContext &ctx, FitterData &fitterData, const Trk::TrackParameters &referenceParameter) const
check fitterData, add fake phi hits if needed.
unsigned int hasPhiConstrain(FitterData &inputData) const
check whether data has sufficient phi constraints
Gaudi::Property< bool > m_preciseFirstStation
void cleanEntry(const MuPatCandidateBase &entry, std::set< Identifier > &removedIdentifiers) const
Gaudi::Property< double > m_preCleanChi2Cut
bool extractData(const MuPatCandidateBase &entry1, const MuPatCandidateBase &entry2, FitterData &fitterData) const
extract all information needed for the fit from the track
bool getMaterial(const Trk::TrackParameters &pars, FitterData &fitterData) const
get material
StatusCode initialize()
initialize method, method taken from bass-class AlgTool
std::atomic_uint m_nfailedMinMaxPhi
std::unique_ptr< Trk::Track > refit(const EventContext &ctx, const MuPatTrack &trkCan) const
refit a MuPatTrack
std::atomic_uint m_nfailedFitPrecise
std::atomic_uint m_noPerigee
std::vector< const Trk::PrepRawData * > PrepVec
void removeSegmentOutliers(FitterData &fitterData) const
MooTrackFitter(const std::string &, const std::string &, const IInterface *)
default AlgTool constructor
std::unique_ptr< Trk::Track > cleanAndEvaluateTrack(const EventContext &ctx, Trk::Track &track, const std::set< Identifier > &excludedChambers) const
clean and evaluate the track,
PublicToolHandle< MuonEDMPrinterTool > m_printer
tool to print out EDM objects
ToolHandle< Trk::IPropagator > m_propagator
propagator
ToolHandle< Trk::ITrackSummaryHelperTool > m_trackSummaryTool
track candidate entry object.
track candidate object.
Definition MuPatTrack.h:37
This is the common class for 3D segments used in the muon spectrometer.
Base Class for a Detector Layer in the Tracking realm.
Definition Layer.h:72
magnetic field properties to steer the behavior of the extrapolation
This class is the pure abstract base class for all fittable tracking measurements.
This is the base class for all tracking detector elements with read-out relevant information.
Eigen::Matrix< double, 3, 1 > Vector3D
NRpcCablingAlg reads raw condition data and writes derived condition data to the condition store.
std::vector< MuPatHitPtr > MuPatHitList
Definition MuPatHit.h:26
NSWSeed::MeasVec MeasVec
Stereo seeds can be formed using hits from 4 independent layers by solving the following system of eq...
Ensure that the ATLAS eigen extensions are properly loaded.
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
@ FullField
Field is set to be realistic, but within a given Volume.
ParticleHypothesis
Enumeration for Particle hypothesis respecting the interaction with material.
ParametersBase< TrackParametersDim, Charged > TrackParameters
std::set< MuonStationIndex::StIndex > stations
const MuPatCandidateBase * firstEntry
std::unique_ptr< Trk::Perigee > startPars
std::set< Identifier > mdtIdsFirst
const MuPatCandidateBase * secondEntry
std::vector< std::unique_ptr< const Trk::MeasurementBase > > garbage
std::set< Identifier > mdtIdsSecond