ATLAS Offline Software
Loading...
Searching...
No Matches
TrackFindingAlg.h
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
5#ifndef ACTSTRACKRECONSTRUCTION_TRACKFINDINGALG_H
6#define ACTSTRACKRECONSTRUCTION_TRACKFINDINGALG_H
7
8// Base Class
10
11// ACTS
12#include "Acts/TrackFinding/TrackStateCreator.hpp"
13#include "Acts/AmbiguityResolution/GreedyAmbiguityResolution.hpp"
14#include "Acts/Surfaces/Surface.hpp"
15#include "Acts/Surfaces/PerigeeSurface.hpp"
16
17// ActsTrk
22
23// Athena
24#include "GaudiKernel/EventContext.h"
29
30// STL
31#include <string>
32#include <vector>
33#include <optional>
34
35// Handle Keys
39
40namespace ActsTrk
41{
43 using DefaultTrackStateCreator = Acts::TrackStateCreator<ActsTrk::detail::UncalibSourceLinkAccessor::Iterator,detail::RecoTrackContainer>;
44
46 {
47 public:
48
49 TrackFindingAlg(const std::string &name,
50 ISvcLocator *pSvcLocator);
51 virtual ~TrackFindingAlg() = default;
52
53 virtual StatusCode initialize() override;
54 virtual StatusCode finalize() override;
55 virtual StatusCode execute(const EventContext &ctx) const override;
56
57 using ExpectedLayerPattern = std::array<unsigned int, 4>;
58
59 private:
60 std::size_t getSeedCategory(std::size_t typeIndex,
61 const ActsTrk::Seed& seed,
62 bool useTopSp) const;
63
64 void printSeed(unsigned int iseed,
65 const DetectorContextHolder& detContext,
66 const ActsTrk::SeedContainer& seeds,
67 const Acts::BoundTrackParameters &seedParameters,
68 const detail::MeasurementIndex &measurementIndex,
69 std::size_t& nPrinted,
70 const char *seedType,
71 bool isKF = false) const;
72
73 StatusCode addTrack(const DetectorContextHolder& detContext,
75 const Acts::Surface& pSurface,
76 const Acts::TrackExtrapolationStrategy& extrapolationStrategy,
77 detail::SharedHitCounter &sharedHits,
78 detail::RecoTrackContainer &actsTracksContainer,
79 const detail::MeasurementIndex& measurementIndex,
80 const detail::RecoTrackContainer& tracksContainerTemp,
81 detail::DuplicateSeedDetector& duplicateSeedDetector,
82 std::vector<int>* destiny,
83 EventStats& event_stat,
84 std::size_t& ntracks,
85 std::size_t iseed,
86 std::size_t category_i,
87 const char *seedType,
88 std::optional<std::vector<unsigned int>>& trackCategories) const;
89
90 StatusCode storeTrackCollectionToStoreGate(const EventContext& ctx,
91 Acts::VectorTrackContainer&& originalTrackBackend,
92 Acts::VectorMultiTrajectory&& originalTrackStateBackend) const;
93
94 private:
95 // Tool Handles
96 ToolHandleArray<ActsTrk::ITrackParamsEstimationTool> m_paramEstimationTool{this, "TrackParamsEstimationTool", {}, "Track Param Estimation from Seeds (one tool per seed type)"};
97
98 // Handle Keys
99 // Seed collections. These 2 vectors must match element for element.
100 SG::ReadHandleKeyArray<ActsTrk::SeedContainer> m_seedContainerKeys{this, "SeedContainerKeys", {}, "Seed containers"};
101
102 // Measurement collections. These 2 vectors must match element for element.
103 SG::ReadHandleKeyArray<xAOD::UncalibratedMeasurementContainer> m_uncalibratedMeasurementContainerKeys{this, "UncalibratedMeasurementContainerKeys", {}, "input cluster collections"};
105 {this, "ActsVolumeIdToDetectorElementCollectionMapKey", "ActsVolumeIdToDetectorElementCollectionMap",
106 "Map which associates Acts geometry volume IDs to detector element collections."};
107
109 {this, "DetElStatus", {}, "Keys for detector element status conditions data."};
110
111 bool m_storeDestinies {false};
113 SG::ReadCondHandleKey< InDet::BeamSpotData > m_beamSpotKey {this, "BeamSpotKey", "BeamSpotData", "SG key for beam spot"};
114
115 // Configuration
116 Gaudi::Property<bool> m_skipDuplicateSeeds{this, "skipDuplicateSeeds", true, "skip duplicate seeds before calling CKF"};
117 Gaudi::Property<unsigned int> m_seedMeasOffset{this,"seedMeasOffset", 0, "Reduce the requirement on the space points on seed to mark a seed as duplicate, e.g seedMeasOffset=1, only N-1 measurements on seed are sufficient deduplicate the seed"};
118 Gaudi::Property<std::vector<double>> m_useTopSpRZboundary {this, "useTopSpRZboundary", {350. * Acts::UnitConstants::mm, 1060. * Acts::UnitConstants::mm}, "R/Z boundary for using the top space point in the track parameter estimation"};
119 Gaudi::Property<bool> m_autoReverseSearch{this, "autoReverseSearch", false, "Whether to run the finding in seed parameter direction (false or not specified) or reverse direction (true), automatically determined by the param estimation tool"};
120 Gaudi::Property<bool> m_countSharedHits{this, "countSharedHits", true, "add shared hit flags to tracks"};
121 Gaudi::Property<bool> m_forceTrackOnSeed{this, "forceTrackOnSeed", true, "force track to use measurements from the seed"};
122
123
124 // Ambiguity resolution
125 Gaudi::Property<unsigned int> m_maximumSharedHits
126 {this, "MaximumSharedHits", 3u, "Maximum number of shared hits per track."};
127 Gaudi::Property<unsigned int> m_maximumIterations
128 {this, "MaximumIterations", 10000u, "Maximum number of iterations to resolve ambiguities among all tracks."};
129 Gaudi::Property<unsigned int> m_nMeasurementsMin
130 {this, "NMeasurementsMin", 7u, "Minimum number of measurements per track."};
131 Gaudi::Property<std::size_t> m_ambiStrategy {this, "ambiStrategy", 0, "0 - Do ambiguity resolution outside track finding; 1 - Do ambiguity in track finding using GreedyAmbiguitySolver tool; 2 - Do shared hit cut during track candidate selection"};
132
133
135 const std::vector< const InDet::SiDetectorElementStatus *> &det_el_status_arr,
136 detail::TrackFindingMeasurements &measurements) const;
137
138 bool shouldReverseSearch(const ActsTrk::Seed& seed) const;
139
140 std::optional<Acts::GreedyAmbiguityResolution> m_ambi;
141
142
143 Acts::Result<void> extrapolateTrackToReferenceSurface(
144 const DetectorContextHolder& detContext,
146 const Acts::Surface &referenceSurface,
147 const detail::Extrapolator &propagator,
148 Acts::TrackExtrapolationStrategy strategy,
149 ExpectedLayerPattern& expectedLayerPattern) const;
150
166 StatusCode
167 findTracks(const EventContext &ctx,
168 const DetectorContextHolder& detContext,
169 const detail::TrackFindingMeasurements &measurements,
170 const detail::MeasurementIndex &measurementIndex,
171 detail::SharedHitCounter &sharedHits,
172 detail::DuplicateSeedDetector &duplicateSeedDetector,
173 const ActsTrk::SeedContainer &seeds,
174 detail::RecoTrackContainer &actsTracksContainer,
175 std::size_t seedCollectionIndex,
176 const char *seedType,
177 EventStats &event_stat,
178 std::vector<int>* destiny,
179 const Acts::PerigeeSurface& pSurface,
180 std::optional<std::vector<unsigned int>>& trackCategories) const;
181
182 // Create tracks from one seed's CKF result, appending to tracksContainer
183 void storeSeedInfo(const detail::RecoTrackContainer &tracksContainer,
185 detail::DuplicateSeedDetector &duplicateSeedDetector,
186 const detail::MeasurementIndex &measurementIndex) const;
187
189
191
192 Gaudi::Property< float > m_memorySafetyMargin {this, "MemorySafetyMargin", 1.2};
193 mutable std::size_t m_nTrackReserve ATLAS_THREAD_SAFE {0ul};
194 mutable std::size_t m_nTrackStateReserve ATLAS_THREAD_SAFE {0ul};
195 mutable std::mutex m_mutex ATLAS_THREAD_SAFE {};
196 };
197
198} // namespace
199
200#endif
SG::WriteHandleKeyArray< std::vector< int > > m_seedDestiny
StatusCode findTracks(const EventContext &ctx, const DetectorContextHolder &detContext, const detail::TrackFindingMeasurements &measurements, const detail::MeasurementIndex &measurementIndex, detail::SharedHitCounter &sharedHits, detail::DuplicateSeedDetector &duplicateSeedDetector, const ActsTrk::SeedContainer &seeds, detail::RecoTrackContainer &actsTracksContainer, std::size_t seedCollectionIndex, const char *seedType, EventStats &event_stat, std::vector< int > *destiny, const Acts::PerigeeSurface &pSurface, std::optional< std::vector< unsigned int > > &trackCategories) const
invoke track finding procedure
Gaudi::Property< bool > m_countSharedHits
Gaudi::Property< unsigned int > m_maximumSharedHits
Gaudi::Property< float > m_memorySafetyMargin
SG::ReadHandleKeyArray< xAOD::UncalibratedMeasurementContainer > m_uncalibratedMeasurementContainerKeys
SG::ReadHandleKeyArray< ActsTrk::SeedContainer > m_seedContainerKeys
std::size_t getSeedCategory(std::size_t typeIndex, const ActsTrk::Seed &seed, bool useTopSp) const
SG::ReadCondHandleKey< ActsTrk::ActsVolumeIdToDetectorElementCollectionMap > m_volumeIdToDetectorElementCollMapKey
TrackFindingAlg(const std::string &name, ISvcLocator *pSvcLocator)
void printSeed(unsigned int iseed, const DetectorContextHolder &detContext, const ActsTrk::SeedContainer &seeds, const Acts::BoundTrackParameters &seedParameters, const detail::MeasurementIndex &measurementIndex, std::size_t &nPrinted, const char *seedType, bool isKF=false) const
void storeSeedInfo(const detail::RecoTrackContainer &tracksContainer, const detail::RecoTrackContainerProxy &track, detail::DuplicateSeedDetector &duplicateSeedDetector, const detail::MeasurementIndex &measurementIndex) const
std::optional< Acts::GreedyAmbiguityResolution > m_ambi
StatusCode propagateDetectorElementStatusToMeasurements(const ActsTrk::ActsVolumeIdToDetectorElementCollectionMap &volume_id_to_det_el_coll, const std::vector< const InDet::SiDetectorElementStatus * > &det_el_status_arr, detail::TrackFindingMeasurements &measurements) const
Gaudi::Property< unsigned int > m_nMeasurementsMin
Gaudi::Property< unsigned int > m_seedMeasOffset
virtual StatusCode initialize() override
Gaudi::Property< std::vector< double > > m_useTopSpRZboundary
Acts::Result< void > extrapolateTrackToReferenceSurface(const DetectorContextHolder &detContext, detail::RecoTrackContainerProxy &track, const Acts::Surface &referenceSurface, const detail::Extrapolator &propagator, Acts::TrackExtrapolationStrategy strategy, ExpectedLayerPattern &expectedLayerPattern) const
Gaudi::Property< bool > m_autoReverseSearch
StatusCode storeTrackCollectionToStoreGate(const EventContext &ctx, Acts::VectorTrackContainer &&originalTrackBackend, Acts::VectorMultiTrajectory &&originalTrackStateBackend) const
Gaudi::Property< unsigned int > m_maximumIterations
std::size_t m_nTrackReserve ATLAS_THREAD_SAFE
std::array< unsigned int, 4 > ExpectedLayerPattern
Gaudi::Property< bool > m_forceTrackOnSeed
Gaudi::Property< bool > m_skipDuplicateSeeds
SG::ReadCondHandleKey< InDet::BeamSpotData > m_beamSpotKey
ToolHandleArray< ActsTrk::ITrackParamsEstimationTool > m_paramEstimationTool
virtual StatusCode execute(const EventContext &ctx) const override
virtual StatusCode finalize() override
StatusCode addTrack(const DetectorContextHolder &detContext, detail::RecoTrackContainerProxy &track, const Acts::Surface &pSurface, const Acts::TrackExtrapolationStrategy &extrapolationStrategy, detail::SharedHitCounter &sharedHits, detail::RecoTrackContainer &actsTracksContainer, const detail::MeasurementIndex &measurementIndex, const detail::RecoTrackContainer &tracksContainerTemp, detail::DuplicateSeedDetector &duplicateSeedDetector, std::vector< int > *destiny, EventStats &event_stat, std::size_t &ntracks, std::size_t iseed, std::size_t category_i, const char *seedType, std::optional< std::vector< unsigned int > > &trackCategories) const
Gaudi::Property< std::size_t > m_ambiStrategy
bool shouldReverseSearch(const ActsTrk::Seed &seed) const
virtual ~TrackFindingAlg()=default
SG::ReadHandleKeyArray< InDet::SiDetectorElementStatus > m_detElStatus
TrackFindingBaseAlg(const std::string &name, ISvcLocator *pSvcLocator)
std::vector< std::array< unsigned int, kNStat > > EventStats
GenUncalibSourceLinkAccessor< MeasurementRangeList > UncalibSourceLinkAccessor
Acts::TrackContainer< Acts::VectorTrackContainer, Acts::VectorMultiTrajectory > RecoTrackContainer
The AlignStoreProviderAlg loads the rigid alignment corrections and pipes them through the readout ge...
detail::UncalibSourceLinkAccessor AtlUncalibSourceLinkAccessor
Acts::TrackStateCreator< ActsTrk::detail::UncalibSourceLinkAccessor::Iterator, detail::RecoTrackContainer > DefaultTrackStateCreator
HandleKeyArray< ReadHandle< T >, ReadHandleKey< T >, Gaudi::DataHandle::Reader > ReadHandleKeyArray
HandleKeyArray< WriteHandle< T >, WriteHandleKey< T >, Gaudi::DataHandle::Writer > WriteHandleKeyArray