ATLAS Offline Software
Loading...
Searching...
No Matches
KalmanFitterTool.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
6
7// ACTS
8#include "Acts/Propagator/SympyStepper.hpp"
9#include "Acts/Propagator/Navigator.hpp"
10#include "Acts/Propagator/Propagator.hpp"
11#include "Acts/Surfaces/PerigeeSurface.hpp"
12#include "Acts/Surfaces/Surface.hpp"
13#include "Acts/TrackFitting/KalmanFitter.hpp"
14#include "Acts/Utilities/Helpers.hpp"
15#include "Acts/Utilities/Logger.hpp"
16#include "Acts/Utilities/CalibrationContext.hpp"
17#include "Acts/EventData/VectorTrackContainer.hpp"
18
21
22// PACKAGE
24#include "ActsInterop/Logger.h"
25
26#include "Acts/Propagator/DirectNavigator.hpp"
27
28namespace ActsTrk {
29
30
32
34 ATH_CHECK(m_geometryConvTool.retrieve());
35 ATH_CHECK(m_ROTcreator.retrieve(EnableTool{!m_ROTcreator.empty()}));
36 ATH_CHECK(m_muonCalibrator.retrieve(EnableTool{!m_muonCalibrator.empty()}));
37 m_logger = makeActsAthenaLogger(this, "KalmanRefit");
38
39
40 auto trkGeo = m_trackingGeometrySvc->trackingGeometry();
41 if (trkGeo->geometryVersion() == Acts::TrackingGeometry::GeometryVersion::Gen3) {
42 switch (m_envelopeConstraint.value()) {
43 using enum ActsTrk::SystemEnvelope;
44 case Acts::toUnderlying(ITkExit):
45 case Acts::toUnderlying(CaloExit): {
46 const Acts::TrackingVolume* volume = m_trackingGeometrySvc
47 ->getEnvelope(static_cast<SystemEnvelope>(m_envelopeConstraint.value()));
48 ATH_CHECK(volume != nullptr);
49 m_endOfWorldId = volume->motherVolume()->geometryId().volume();
50 break;
51 } case Acts::toUnderlying(MsExit) : {
52 break;
53 } default: {
54 ATH_MSG_ERROR("Invalid configuration "<<m_envelopeConstraint);
55 return StatusCode::FAILURE;
56 }
57 }
58 ATH_MSG_DEBUG("Abort propagation if "<<m_envelopeConstraint<<" is reached");
59
60 }
61 auto field = std::make_shared<ATLASMagneticFieldWrapper>();
62
63 // Fitter
64 Acts::SympyStepper stepper(field);
66 // Direct Fitter
67 Acts::DirectNavigator directNavigator( logger().cloneWithSuffix("DirectNavigator") );
68 Acts::Propagator<Acts::SympyStepper, Acts::DirectNavigator> directPropagator(std::move(stepper),
69 std::move(directNavigator),
70 logger().cloneWithSuffix("DirectPropagator"));
71
72 m_directFitter = std::make_unique<DirectFitter>(std::move(directPropagator),
73 logger().cloneWithSuffix("DirectKalmanFitter"));
74
75 } else {
76 Acts::Navigator navigator( Acts::Navigator::Config{trkGeo},
77 logger().cloneWithSuffix("Navigator"));
78 Acts::Propagator<Acts::SympyStepper, Acts::Navigator> propagator(stepper,
79 std::move(navigator),
80 logger().cloneWithSuffix("Prop"));
81
82 m_fitter = std::make_unique<Fitter>(std::move(propagator),
83 logger().cloneWithSuffix("KalmanFitter"));
84 }
85
87 m_outlierFinder.StateChiSquaredPerNumberDoFCut = m_option_outlierChi2Cut;
89
90 FitterExtension_t extensionTemplate{};
91 extensionTemplate.outlierFinder.connect<&detail::FitterHelperFunctions::ATLASOutlierFinder::operator()<MutableTrackStateBackend>>(&m_outlierFinder);
92 extensionTemplate.reverseFilteringLogic.connect<&detail::FitterHelperFunctions::ReverseFilteringLogic::operator()<MutableTrackStateBackend>>(&m_reverseFilteringLogic);
95
97 {
99
101 configureMe = extensionTemplate;
103 configureMe.surfaceAccessor.connect<&detail::TrkMeasSurfaceAccessor::operator()>(&m_trkSurfAcc);
104 }
106 {
109
111 configureMe = extensionTemplate;
113 configureMe.surfaceAccessor.connect<&detail::TrkPrepRawDataSurfaceAcc::operator()>(&m_prdSurfAcc);
114 }
116 {
118
119
121
123 using enum xAOD::UncalibMeasType;
124 if (m_muonCalibrator.isEnabled()) {
125 for (const auto muonType : {MdtDriftCircleType, RpcStripType, TgcStripType, MMClusterType, sTgcStripType}) {
127 }
128 }
129 for (const auto idType: {PixelClusterType, StripClusterType, HGTDClusterType}) {
131 }
132
134 configureMe = extensionTemplate;
135 configureMe.surfaceAccessor.connect<&detail::xAODUncalibMeasSurfAcc::operator()>(&m_unalibMeasSurfAcc);
137 }
138 return StatusCode::SUCCESS;
139}
140
141
143 KalmanFitterTool::configureFit(const Acts::GeometryContext& tgContext,
144 const Acts::MagneticFieldContext& mfContext,
145 const Acts::CalibrationContext& calContext,
146 const Acts::Surface* surface,
147 detail::SourceLinkType slType) const {
148
149 //slType = 3 is possible
150 const auto& kfExtensions = m_kfExtensions.at(Acts::toUnderlying(slType));
151
152 Acts::PropagatorPlainOptions propagationOption(tgContext, mfContext);
153 propagationOption.maxSteps = m_option_maxPropagationStep;
154 // Set the KalmanFitter options
155 FitterOptions_t options{tgContext, mfContext, calContext,
156 kfExtensions, propagationOption,
157 surface};
158 options.propagatorPlainOptions.endOfWorldVolumeIds.push_back(m_endOfWorldId);
159 return options;
160}
161
162// fit a set of PrepRawData objects
163// --------------------------------
164std::unique_ptr< MutableTrackContainer >
165KalmanFitterTool::fit(const std::vector< const xAOD::UncalibratedMeasurement*> & clusterList,
166 const Acts::BoundTrackParameters& initialParams,
167 const Acts::GeometryContext& tgContext,
168 const Acts::MagneticFieldContext& mfContext,
169 const Acts::CalibrationContext& calContext,
170 const Acts::Surface* targetSurface) const{
171 ATH_MSG_DEBUG("--> entering KalmanFitter::fit(xAODMeasure...things,TP,)");
172
173 std::vector<Acts::SourceLink> sourceLinks;
174 sourceLinks.reserve(clusterList.size());
175
176 detail::MeasurementCalibratorBase::pack(clusterList, sourceLinks);
177
178 return fit(sourceLinks, initialParams, tgContext, mfContext, calContext, targetSurface);
179}
180
181std::unique_ptr< MutableTrackContainer >
183 const Acts::BoundTrackParameters& initialParams,
184 const Acts::GeometryContext& tgContext,
185 const Acts::MagneticFieldContext& mfContext,
186 const Acts::CalibrationContext& calContext,
187 const Acts::Surface& targetSurface) const {
188
189 std::vector<const xAOD::UncalibratedMeasurement*> measList;
190 measList.reserve(6);
191
192 const auto& sps = seed.sp();
193 for (const xAOD::SpacePoint* sp : sps) {
194 const auto& measurements = sp->measurements();
195 for (const xAOD::UncalibratedMeasurement *umeas : measurements) {
196 measList.push_back(umeas);
197 }
198 }
199 return fit(measList, initialParams, tgContext, mfContext, calContext, &targetSurface);
200}
201
202 StatusCode
203 KalmanFitterTool::fit(const EventContext& /*ctx*/,
204 const TrackContainer::ConstTrackProxy& /*track*/,
205 MutableTrackContainer& /*trackContainer*/,
206 const Acts::PerigeeSurface& /*pSurface*/) const
207 {
208 ATH_MSG_ERROR("Track refit method not implemented in KalmanFitterTool yet");
209 return StatusCode::FAILURE;
210 }
211
212std::unique_ptr< MutableTrackContainer >
213KalmanFitterTool::fit(const std::vector<Acts::SourceLink>& sourceLinks,
214 const Acts::BoundTrackParameters& initialParams,
215 const Acts::GeometryContext& tgContext,
216 const Acts::MagneticFieldContext& mfContext,
217 const Acts::CalibrationContext& calContext,
218 const Acts::Surface* targetSurface) const {
219
220 if (sourceLinks.empty()) {
221 ATH_MSG_DEBUG("No measurements given. Nothing to do");
222 return nullptr;
223 }
224
225 // Construct a perigee surface as the target surface if none is provided
226 std::shared_ptr<Acts::Surface> pSurface{nullptr};
227 if (!targetSurface){
228 pSurface = Acts::Surface::makeShared<Acts::PerigeeSurface>(Acts::Vector3::Zero());
229 targetSurface = pSurface.get();
230 }
231
233
234 Acts::KalmanFitterOptions kfOptions = configureFit(tgContext, mfContext, calContext,
235 targetSurface, slType);
236
237 ActsTrk::MutableTrackBackend trackContainerBackEnd;
238 ActsTrk::MutableTrackStateBackend multiTrajBackEnd;
239 auto tracks = std::make_unique<MutableTrackContainer>(std::move(trackContainerBackEnd),
240 std::move(multiTrajBackEnd));
241
242 bool fitSuccess = false;
244
245 std::vector<const Acts::Surface*> surfaces;
246 surfaces.reserve(sourceLinks.size());
247 switch (slType) {
249 std::ranges::for_each(sourceLinks, [this, &surfaces](const Acts::SourceLink& sl) {
250 surfaces.push_back(m_trkSurfAcc(sl));
251 });
252 break;
253 }
255 std::ranges::for_each(sourceLinks, [this, &surfaces](const Acts::SourceLink& sl) {
256 surfaces.push_back(m_prdSurfAcc(sl));
257 });
258 break;
259 }
261 std::ranges::for_each(sourceLinks, [this, &surfaces](const Acts::SourceLink& sl) {
262 surfaces.push_back(m_unalibMeasSurfAcc(sl));
263 });
264 break;
265 }
266 default:
267 ATH_MSG_ERROR("Unsupported source link type for KalmanFitterTool::fit");
268 return nullptr;
269 }
270
271 fitSuccess = m_directFitter->fit(sourceLinks.begin(), sourceLinks.end(),
272 initialParams, kfOptions, surfaces, *tracks.get()).ok();
273
274 } else {
275
276 fitSuccess = m_fitter->fit(sourceLinks.begin(), sourceLinks.end(),
277 initialParams, kfOptions, *tracks.get()).ok();
278 }
279
280 if (!fitSuccess) {
281 ATH_MSG_VERBOSE("Kalman Fitter on Seed has failed");
282 return nullptr;
283 }
284
286 for (auto trkProxy : *tracks) {
288 }
289
290 return tracks;
291}
292
293}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_ERROR(x,...)
#define ATH_MSG_VERBOSE(x,...)
static Double_t sp
std::unique_ptr< const Acts::Logger > makeActsAthenaLogger(IMessageSvc *svc, const std::string &name, int level, std::optional< std::string > parent_name)
Definition Logger.cxx:64
ActsTrk::detail::FitterHelperFunctions::ReverseFilteringLogic m_reverseFilteringLogic
Acts::KalmanFitterExtensions< MutableTrackStateBackend > FitterExtension_t
Abbrivation of the fitter extensions.
ToolHandle< MuonR4::ISpacePointCalibrator > m_muonCalibrator
Gaudi::Property< std::uint32_t > m_envelopeConstraint
Stop the propagation as soon as the envelope is left (Gen3 only).
detail::TrkPrepRawDataCalibrator m_prdCalibrator
Calibrator for the Trk::PrepRawData track states (legacy EDM).
Gaudi::Property< bool > m_useDirectNavigation
detail::TrkPrepRawDataSurfaceAcc m_prdSurfAcc
Surface accessor for the Trk::PrepRawData track states (legacy EDM).
detail::xAODUncalibMeasSurfAcc m_unalibMeasSurfAcc
Accessor to fetch surfaces from the xAOD::UncalibratedMeasurements (Phase-II EDM).
detail::xAODUncalibMeasCalibrator m_uncalibMeasCalibrator
Calibrator for the uncalibrated xAOD::UnCalibratedMeasurement objects.
virtual std::unique_ptr< ActsTrk::MutableTrackContainer > fit(const std::vector< const xAOD::UncalibratedMeasurement * > &clusterList, const Acts::BoundTrackParameters &initialParams, const Acts::GeometryContext &tgContext, const Acts::MagneticFieldContext &mfContext, const Acts::CalibrationContext &calContext, const Acts::Surface *targetSurface=nullptr) const override
fit a set of xAOD uncalibrated Measurements
std::unique_ptr< const Acts::Logger > m_logger
logging instance
std::unique_ptr< Fitter > m_fitter
ActsTrk::detail::FitterHelperFunctions::ATLASOutlierFinder m_outlierFinder
ToolHandle< Trk::IRIO_OnTrackCreator > m_ROTcreator
std::array< FitterExtension_t, s_nExtensions > m_kfExtensions
PublicToolHandle< IGeometryRealmConvTool > m_geometryConvTool
detail::TrkMeasSurfaceAccessor m_trkSurfAcc
Accessor to fetch surfaces from the Trk::MeasurementBase track states (legacy EDM).
Acts::KalmanFitterOptions< MutableTrackStateBackend > FitterOptions_t
Abbrivation of the configuration to launch the fit.
xAODItkCalibrator_t m_idCalibrator
Gaudi::Property< double > m_option_outlierChi2Cut
std::unique_ptr< DirectFitter > m_directFitter
ServiceHandle< ITrackingGeometrySvc > m_trackingGeometrySvc
const Acts::Logger & logger() const
Private access to the logger.
detail::TrkMeasurementCalibrator m_trkCalibrator
Calibrator for the Trk::MeasurementBase track states (legacy EDM).
virtual StatusCode initialize() override
Gaudi::Property< double > m_option_ReverseFilteringPt
Gaudi::Property< int > m_option_maxPropagationStep
FitterOptions_t configureFit(const Acts::GeometryContext &tgContext, const Acts::MagneticFieldContext &mfContext, const Acts::CalibrationContext &calContext, const Acts::Surface *surface, detail::SourceLinkType slType) const
Helper method to pack the last information (Calibration, Alignment, B-Field, etc.) for the fit.
static Acts::SourceLink pack(const Ptr_t &measurement)
Pack the measurement type pointer to an Acts::SourceLink including the intermediate conversion into a...
static SourceLinkType getType(const Acts::SourceLink &sl)
Returns the enumeration corresponding to the object type cached within the Acts::SourceLink.
void calibrate(const Acts::GeometryContext &geoctx, const Acts::CalibrationContext &cctx, const Acts::SourceLink &link, TrackStateProxy state) const
static OnTrackCalibrator NoCalibration(const ActsTrk::ITrackingGeometrySvc *trackGeoSvc)
Helper class to access the Acts::Surface for a given Acts::SourceLink which is poiniting to a Trk::Me...
void calibrate(const Acts::GeometryContext &gctx, const Acts::CalibrationContext &cctx, const Acts::SourceLink &sl, proxy_t trackState) const
Calibrator delegate implementation to calibrate the ActsTrk fit from Trk::MeasurementBase objects.
Class to calibrate the Acts track states with uncalibrated Trk::PrepRaw data objects.
void calibrate(const Acts::GeometryContext &gctx, const Acts::CalibrationContext &cctx, const Acts::SourceLink &sl, proxy_t trackState) const
Calibrator delegate implementation to calibrate the ActsTrk fit from Trk::PrepRawData objects.
Helper class to access the Acts::surface associated with a Trk::PrepRawData measurement.
void calibrate(const Acts::GeometryContext &gctx, const Acts::CalibrationContext &cctx, const Acts::SourceLink &sl, const MutableTrackStateBackend::TrackStateProxy trackState) const
: Interface method for the Acts fitter to calibrate the trajectory track states from the source link ...
Helper class to access the Acts::surface associated with an Uncalibrated xAOD measurement.
virtual void calibrateSourceLink(const Acts::GeometryContext &geoctx, const Acts::CalibrationContext &cctx, const Acts::SourceLink &link, ActsTrk::MutableTrackStateBackend::TrackStateProxy state) const =0
Function that's hooked to the calibration delegate of the implemented Acts fitters.
Acts::Result< void > gainMatrixUpdate(const Acts::GeometryContext &gctx, typename trajectory_t::TrackStateProxy trackState, const Acts::Logger &logger)
Acts::Result< void > mbfSmoother(const Acts::GeometryContext &gctx, trajectory_t &trajectory, size_t entryIndex, const Acts::Logger &logger)
SourceLinkType
Enumeration to distinguish between the ATLAS EDM -> Acts::SourceLink variants.
@ xAODUnCalibMeas
UnCalibrated Trk::PrepRawData objects.
@ TrkPrepRawData
Calibrated Trk::MeasurementBase objects.
The AlignStoreProviderAlg loads the rigid alignment corrections and pipes them through the readout ge...
Acts::VectorMultiTrajectory MutableTrackStateBackend
Acts::TrackContainer< MutableTrackBackend, MutableTrackStateBackend, Acts::detail::ValueHolder > MutableTrackContainer
Acts::VectorTrackContainer MutableTrackBackend
SystemEnvelope
Define an enumeration to retrieve the envelope tracking volume from.
UncalibratedMeasurement_v1 UncalibratedMeasurement
Define the version of the uncalibrated measurement class.
@ KalmanFitter
tracks produced by the Kalman Fitter
UncalibMeasType
Define the type of the uncalibrated measurement.
static void addFitterTypeProperty(track_container_t &tracksContainer)
add fitter column to the track container
static void setFitterType(trackproxy_t &trackProxy, xAOD::TrackFitter fitterType)
set fitter type of a track