ATLAS Offline Software
Loading...
Searching...
No Matches
ActsTrk::KalmanFitterTool Class Reference

#include <KalmanFitterTool.h>

Inheritance diagram for ActsTrk::KalmanFitterTool:

Public Member Functions

virtual ~KalmanFitterTool ()=default
virtual StatusCode initialize () override
virtual std::unique_ptr< Trk::Trackfit (const EventContext &ctx, const Trk::Track &, const Trk::RunOutlierRemoval runOutlier=false, const Trk::ParticleHypothesis matEffects=Trk::nonInteracting) const override
 refit a track
virtual std::unique_ptr< Trk::Trackfit (const EventContext &ctx, const Trk::PrepRawDataSet &, const Trk::TrackParameters &, const Trk::RunOutlierRemoval runOutlier=false, const Trk::ParticleHypothesis matEffects=Trk::nonInteracting) const override
 fit a set of PrepRawData objects
virtual std::unique_ptr< Trk::Trackfit (const EventContext &ctx, const Trk::MeasurementSet &, const Trk::TrackParameters &, const Trk::RunOutlierRemoval runOutlier=false, const Trk::ParticleHypothesis matEffects=Trk::nonInteracting) const override
 fit a set of MeasurementBase objects
virtual std::unique_ptr< Trk::Trackfit (const EventContext &ctx, const Trk::Track &, const Trk::PrepRawDataSet &, const Trk::RunOutlierRemoval runOutlier=false, const Trk::ParticleHypothesis matEffects=Trk::nonInteracting) const override
 extend a track fit including a new set of PrepRawData objects
virtual std::unique_ptr< ActsTrk::MutableTrackContainerfit (const std::vector< ActsTrk::ATLASUncalibSourceLink > &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
virtual std::unique_ptr< Trk::Trackfit (const EventContext &ctx, const Trk::Track &, const Trk::MeasurementSet &, const Trk::RunOutlierRemoval runOutlier=false, const Trk::ParticleHypothesis matEffects=Trk::nonInteracting) const override
 extend a track fit including a new set of MeasurementBase objects
virtual std::unique_ptr< Trk::Trackfit (const EventContext &ctx, const Trk::Track &intrk1, const Trk::Track &intrk2, const Trk::RunOutlierRemoval runOutlier=false, const Trk::ParticleHypothesis matEffects=Trk::nonInteracting) const override
 combined track fit
virtual std::unique_ptr< ActsTrk::MutableTrackContainerfit (const ActsTrk::Seed &seed, const Acts::BoundTrackParameters &initialParams, const Acts::GeometryContext &tgContext, const Acts::MagneticFieldContext &mfContext, const Acts::CalibrationContext &calContext, const Acts::Surface &targetSurface) const override
 Acts seed fit.
virtual StatusCode fit (const EventContext &ctx, const ActsTrk::TrackContainer::ConstTrackProxy &track, ActsTrk::MutableTrackContainer &trackContainer, const Acts::PerigeeSurface &pSurface) const override

Private Types

using FitterExtension_t = Acts::KalmanFitterExtensions<MutableTrackStateBackend>
 Abbrivation of the fitter extensions.
using FitterOptions_t = Acts::KalmanFitterOptions<MutableTrackStateBackend>
 Abbrivation of the configuration to launch the fit.
using xAODUnCalibrator_t = detail::OnTrackCalibrator<ActsTrk::MutableTrackStateBackend>
 Calibrator of the uncalibrated measurements.
using Fitter = Acts::KalmanFitter<Acts::Propagator<Acts::SympyStepper, Acts::Navigator>, ActsTrk::MutableTrackStateBackend>
 Type erased track fitter function.
using DirectFitter = Acts::KalmanFitter<Acts::Propagator<Acts::SympyStepper, Acts::DirectNavigator>, ActsTrk::MutableTrackStateBackend>

Private Member Functions

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.
const Acts::Logger & logger () const
 Private access to the logger.

Private Attributes

ToolHandle< ActsTrk::IExtrapolationToolm_extrapolationTool {this, "ExtrapolationTool", ""}
PublicToolHandle< ActsTrk::ITrackingGeometryToolm_trackingGeometryTool {this, "TrackingGeometryTool", ""}
ToolHandle< ActsTrk::IActsToTrkConverterToolm_ATLASConverterTool {this, "ATLASConverterTool", ""}
Gaudi::Property< double > m_option_outlierChi2Cut
Gaudi::Property< double > m_option_ReverseFilteringPt
Gaudi::Property< int > m_option_maxPropagationStep
Gaudi::Property< double > m_option_seedCovarianceScale
detail::TrkMeasurementCalibrator m_trkCalibrator {}
 Calibrator for the Trk::MeasurementBase track states (legacy EDM)
detail::TrkMeasSurfaceAccessor m_trkSurfAcc {}
 Accessor to fetch surfaces from the Trk::MeasurementBase track states (legacy EDM)
detail::TrkPrepRawDataCalibrator m_prdCalibrator {}
 Calibrator for the Trk::PrepRawData track states (legacy EDM)
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)
xAODUnCalibrator_t m_uncalibMeasCalibrator {}
std::unique_ptr< Fitterm_fitter {nullptr}
std::unique_ptr< DirectFitterm_directFitter {nullptr}
std::array< FitterExtension_t, s_nExtensionsm_kfExtensions {}
ActsTrk::detail::FitterHelperFunctions::ATLASOutlierFinder m_outlierFinder {0}
ActsTrk::detail::FitterHelperFunctions::ReverseFilteringLogic m_reverseFilteringLogic {0}
std::unique_ptr< const Acts::Logger > m_logger
 logging instance
ToolHandle< Trk::IRIO_OnTrackCreatorm_ROTcreator {this, "RotCreatorTool", ""}
Gaudi::Property< bool > m_doReFitFromPRD {this, "DoReFitFromPRD", false, "Do Refit From PRD instead of ROT"}

Static Private Attributes

static constexpr unsigned s_nExtensions = static_cast<unsigned>(detail::SourceLinkType::nTypes)
 Array of all configured fitter extensions depending on which source link type is in use.

Detailed Description

Definition at line 60 of file KalmanFitterTool.h.

Member Typedef Documentation

◆ DirectFitter

using ActsTrk::KalmanFitterTool::DirectFitter = Acts::KalmanFitter<Acts::Propagator<Acts::SympyStepper, Acts::DirectNavigator>, ActsTrk::MutableTrackStateBackend>
private

Definition at line 201 of file KalmanFitterTool.h.

◆ Fitter

using ActsTrk::KalmanFitterTool::Fitter = Acts::KalmanFitter<Acts::Propagator<Acts::SympyStepper, Acts::Navigator>, ActsTrk::MutableTrackStateBackend>
private

Type erased track fitter function.

Definition at line 198 of file KalmanFitterTool.h.

◆ FitterExtension_t

using ActsTrk::KalmanFitterTool::FitterExtension_t = Acts::KalmanFitterExtensions<MutableTrackStateBackend>
private

Abbrivation of the fitter extensions.

Definition at line 151 of file KalmanFitterTool.h.

◆ FitterOptions_t

using ActsTrk::KalmanFitterTool::FitterOptions_t = Acts::KalmanFitterOptions<MutableTrackStateBackend>
private

Abbrivation of the configuration to launch the fit.

Definition at line 153 of file KalmanFitterTool.h.

◆ xAODUnCalibrator_t

Constructor & Destructor Documentation

◆ ~KalmanFitterTool()

virtual ActsTrk::KalmanFitterTool::~KalmanFitterTool ( )
virtualdefault

Member Function Documentation

◆ configureFit()

KalmanFitterTool::FitterOptions_t ActsTrk::KalmanFitterTool::configureFit ( const Acts::GeometryContext & tgContext,
const Acts::MagneticFieldContext & mfContext,
const Acts::CalibrationContext & calContext,
const Acts::Surface * surface,
detail::SourceLinkType slType ) const
private

Helper method to pack the last information (Calibration, Alignment, B-Field, etc.) for the fit.

The parsed context objects need to prevail the call of the fit

Parameters
tgContextReference to the geometry context
mfContextReference to the passed magnetic field context
calContextReference to the calibration context
surfaceTarget surface on which the fit result is expressed.
slTypeSwitch of which source link type shall be used to access the surfaces from the measurements & for calibration

Definition at line 136 of file KalmanFitterTool.cxx.

140 {
141
142
143 const auto& kfExtensions = m_kfExtensions[static_cast<int>(slType)];
144
145 Acts::PropagatorPlainOptions propagationOption(tgContext, mfContext);
146 propagationOption.maxSteps = m_option_maxPropagationStep;
147 // Set the KalmanFitter options
148 return FitterOptions_t{tgContext, mfContext, calContext,
149 kfExtensions, propagationOption,
150 surface};
151}
std::array< FitterExtension_t, s_nExtensions > m_kfExtensions
Acts::KalmanFitterOptions< MutableTrackStateBackend > FitterOptions_t
Abbrivation of the configuration to launch the fit.
Gaudi::Property< int > m_option_maxPropagationStep

◆ fit() [1/9]

std::unique_ptr< MutableTrackContainer > ActsTrk::KalmanFitterTool::fit ( const ActsTrk::Seed & seed,
const Acts::BoundTrackParameters & initialParams,
const Acts::GeometryContext & tgContext,
const Acts::MagneticFieldContext & mfContext,
const Acts::CalibrationContext & calContext,
const Acts::Surface & targetSurface ) const
overridevirtual

Acts seed fit.

Definition at line 528 of file KalmanFitterTool.cxx.

533 {
534
535 std::vector<ATLASUncalibSourceLink> sourceLinks;
536 sourceLinks.reserve(6);
537
538 const auto& sps = seed.sp();
539 for (const xAOD::SpacePoint* sp : sps) {
540 const auto& measurements = sp->measurements();
541 for (const xAOD::UncalibratedMeasurement *umeas : measurements) {
542 sourceLinks.emplace_back(umeas);
543 }
544 }
545 return fit(sourceLinks, initialParams, tgContext, mfContext, calContext, &targetSurface);
546}
static Double_t sp
virtual std::unique_ptr< Trk::Track > fit(const EventContext &ctx, const Trk::Track &, const Trk::RunOutlierRemoval runOutlier=false, const Trk::ParticleHypothesis matEffects=Trk::nonInteracting) const override
refit a track
UncalibratedMeasurement_v1 UncalibratedMeasurement
Define the version of the uncalibrated measurement class.

◆ fit() [2/9]

virtual StatusCode ActsTrk::KalmanFitterTool::fit ( const EventContext & ctx,
const ActsTrk::TrackContainer::ConstTrackProxy & track,
ActsTrk::MutableTrackContainer & trackContainer,
const Acts::PerigeeSurface & pSurface ) const
overridevirtual

◆ fit() [3/9]

std::unique_ptr< Trk::Track > ActsTrk::KalmanFitterTool::fit ( const EventContext & ctx,
const Trk::MeasurementSet & inputMeasSet,
const Trk::TrackParameters & estimatedStartParameters,
const Trk::RunOutlierRemoval runOutlier = false,
const Trk::ParticleHypothesis matEffects = Trk::nonInteracting ) const
overridevirtual

fit a set of MeasurementBase objects

Definition at line 223 of file KalmanFitterTool.cxx.

227 {
228
229 // protection against not having measurements on the input track
230 if (inputMeasSet.size() < 2) {
231 ATH_MSG_DEBUG("called to refit empty measurement set or a measurement set with too little information, reject fit");
232 return nullptr;
233 }
234
235 // Construct a perigee surface as the target surface
236 auto pSurface = Acts::Surface::makeShared<Acts::PerigeeSurface>(Acts::Vector3::Zero());
237
238 const Acts::GeometryContext tgContext = m_trackingGeometryTool->getGeometryContext(ctx).context();
239 const Acts::MagneticFieldContext mfContext = m_extrapolationTool->getMagneticFieldContext(ctx);
240 const Acts::CalibrationContext calContext{getCalibrationContext(ctx)};
241
242 Acts::KalmanFitterOptions kfOptions = configureFit(tgContext, mfContext, calContext, pSurface.get(),
244
245 std::vector<Acts::SourceLink> trackSourceLinks;
246 m_ATLASConverterTool->toSourceLinks(inputMeasSet, trackSourceLinks);
247 // protection against error in the conversion from Atlas masurement to Acts source link
248 if (trackSourceLinks.empty()) {
249 ATH_MSG_DEBUG("input contain measurement but no source link created, probable issue with the converter, reject fit ");
250 return nullptr;
251 }
252
253 const auto initialParams = m_ATLASConverterTool->trkTrackParametersToActsParameters(estimatedStartParameters, tgContext);
254
255 ActsTrk::MutableTrackBackend trackContainerBackEnd;
256 ActsTrk::MutableTrackStateBackend multiTrajBackEnd;
257 ActsTrk::MutableTrackContainer tracks( std::move(trackContainerBackEnd),
258 std::move(multiTrajBackEnd));
259
260 // Perform the fit
261 auto result = m_fitter->fit(trackSourceLinks.begin(), trackSourceLinks.end(),
262 initialParams, kfOptions, tracks);
263 return m_ATLASConverterTool->convertFitResult(ctx, tracks, result,
266}
#define ATH_MSG_DEBUG(x)
ToolHandle< ActsTrk::IActsToTrkConverterTool > m_ATLASConverterTool
std::unique_ptr< Fitter > m_fitter
PublicToolHandle< ActsTrk::ITrackingGeometryTool > m_trackingGeometryTool
ToolHandle< ActsTrk::IExtrapolationTool > m_extrapolationTool
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.
@ KalmanFitter
tracks produced by the Kalman Fitter
Acts::VectorMultiTrajectory MutableTrackStateBackend
Acts::TrackContainer< MutableTrackBackend, MutableTrackStateBackend, Acts::detail::ValueHolder > MutableTrackContainer
Acts::CalibrationContext getCalibrationContext(const EventContext &ctx)
The Acts::Calibration context is piped through the Acts fitters to (re)calibrate the Acts::SourceLink...
Acts::VectorTrackContainer MutableTrackBackend

◆ fit() [4/9]

std::unique_ptr< Trk::Track > ActsTrk::KalmanFitterTool::fit ( const EventContext & ctx,
const Trk::PrepRawDataSet & inputPRDColl,
const Trk::TrackParameters & estimatedStartParameters,
const Trk::RunOutlierRemoval runOutlier = false,
const Trk::ParticleHypothesis matEffects = Trk::nonInteracting ) const
overridevirtual

fit a set of PrepRawData objects

Definition at line 271 of file KalmanFitterTool.cxx.

275 {
276 ATH_MSG_DEBUG("--> entering KalmanFitter::fit(PRDS,TP,)");
277
278 // Construct a perigee surface as the target surface
279 auto pSurface = Acts::Surface::makeShared<Acts::PerigeeSurface>(Acts::Vector3::Zero());
280
281 const Acts::GeometryContext tgContext = m_trackingGeometryTool->getGeometryContext(ctx).context();
282 const Acts::MagneticFieldContext mfContext = m_extrapolationTool->getMagneticFieldContext(ctx);
283 const Acts::CalibrationContext calContext{getCalibrationContext(ctx)};
284
285 Acts::KalmanFitterOptions kfOptions = configureFit(tgContext, mfContext, calContext, pSurface.get(),
287
288 std::vector<Acts::SourceLink> trackSourceLinks;
289 m_ATLASConverterTool->toSourceLinks(inputPRDColl, trackSourceLinks);
290 // protection against error in the conversion from Atlas masurement to Acts source link
291 if (trackSourceLinks.empty()) {
292 ATH_MSG_WARNING("input contain measurement but no source link created, probable issue with the converter, reject fit ");
293 return nullptr;
294 }
295 //
296
297 const auto initialParams = m_ATLASConverterTool->trkTrackParametersToActsParameters(estimatedStartParameters, tgContext);
298
299 ActsTrk::MutableTrackBackend trackContainerBackEnd;
300 ActsTrk::MutableTrackStateBackend multiTrajBackEnd;
301 ActsTrk::MutableTrackContainer tracks( std::move(trackContainerBackEnd),
302 std::move(multiTrajBackEnd));
303
304 // Perform the fit
305 auto result = m_fitter->fit(trackSourceLinks.begin(), trackSourceLinks.end(),
306 initialParams, kfOptions, tracks);
307 return m_ATLASConverterTool->convertFitResult(ctx, tracks, result,
310}
#define ATH_MSG_WARNING(x)
@ TrkPrepRawData
Calibrated Trk::MeasurementBase objects.

◆ fit() [5/9]

std::unique_ptr< Trk::Track > ActsTrk::KalmanFitterTool::fit ( const EventContext & ctx,
const Trk::Track & inputTrack,
const Trk::MeasurementSet & addMeasColl,
const Trk::RunOutlierRemoval runOutlier = false,
const Trk::ParticleHypothesis matEffects = Trk::nonInteracting ) const
overridevirtual

extend a track fit including a new set of MeasurementBase objects

Definition at line 372 of file KalmanFitterTool.cxx.

377{
378 ATH_MSG_VERBOSE ("--> enter KalmanFitter::fit(Track,Meas'BaseSet,,)");
379 ATH_MSG_VERBOSE (" with Track from author = " << inputTrack.info().dumpInfo());
380
381 // protection, if empty MeasurementSet
382 if (addMeasColl.empty()) {
383 ATH_MSG_DEBUG( "client tries to add an empty MeasurementSet to the track fit." );
384 return fit(ctx,inputTrack);
385 }
386
387 // protection against not having measurements on the input track
388 if (!inputTrack.measurementsOnTrack() || (inputTrack.measurementsOnTrack()->size() < 2 && addMeasColl.empty())) {
389 ATH_MSG_DEBUG("called to refit empty track or track with too little information, reject fit");
390 return nullptr;
391 }
392
393 // protection against not having track parameters on the input track
394 if (!inputTrack.trackParameters() || inputTrack.trackParameters()->empty()) {
395 ATH_MSG_DEBUG("input fails to provide track parameters for seeding the KF, reject fit");
396 return nullptr;
397 }
398
399
400 // Construct a perigee surface as the target surface
401 auto pSurface = Acts::Surface::makeShared<Acts::PerigeeSurface>(Acts::Vector3::Zero());
402
403 const Acts::GeometryContext tgContext = m_trackingGeometryTool->getGeometryContext(ctx).context();
404 const Acts::MagneticFieldContext mfContext = m_extrapolationTool->getMagneticFieldContext(ctx);
405 const Acts::CalibrationContext calContext{getCalibrationContext(ctx)};
406
407 // Set the KalmanFitter options
408 Acts::KalmanFitterOptions kfOptions = configureFit(tgContext, mfContext, calContext, pSurface.get(),
410
411 std::vector<Acts::SourceLink> trackSourceLinks = m_ATLASConverterTool->trkTrackToSourceLinks(inputTrack);
412 m_ATLASConverterTool->toSourceLinks(addMeasColl, trackSourceLinks);
413
414 // protection against error in the conversion from Atlas masurement to Acts source link
415 if (trackSourceLinks.empty()) {
416 ATH_MSG_DEBUG("input contain measurement but no source link created, probable issue with the converter, reject fit ");
417 return nullptr;
418 }
419 const auto initialParams = m_ATLASConverterTool->trkTrackParametersToActsParameters(*(inputTrack.perigeeParameters()), tgContext);
420
421 ActsTrk::MutableTrackBackend trackContainerBackEnd;
422 ActsTrk::MutableTrackStateBackend multiTrajBackEnd;
423 ActsTrk::MutableTrackContainer tracks( std::move(trackContainerBackEnd),
424 std::move(multiTrajBackEnd));
425
426 // Perform the fit
427 auto result = m_fitter->fit(trackSourceLinks.begin(), trackSourceLinks.end(),
428 initialParams, kfOptions, tracks);
429 return m_ATLASConverterTool->convertFitResult(ctx, tracks, result,
432}
#define ATH_MSG_VERBOSE(x)
std::string dumpInfo() const
Returns a string with the name of the fitter of this track (i.e.
const DataVector< const MeasurementBase > * measurementsOnTrack() const
return a pointer to a vector of MeasurementBase (NOT including any that come from outliers).
const DataVector< const TrackParameters > * trackParameters() const
Return a pointer to a vector of TrackParameters.
const TrackInfo & info() const
Returns a const ref to info of a const tracks.
const Perigee * perigeeParameters() const
return Perigee.

◆ fit() [6/9]

std::unique_ptr< Trk::Track > ActsTrk::KalmanFitterTool::fit ( const EventContext & ctx,
const Trk::Track & ,
const Trk::PrepRawDataSet & ,
const Trk::RunOutlierRemoval runOutlier = false,
const Trk::ParticleHypothesis matEffects = Trk::nonInteracting ) const
overridevirtual

extend a track fit including a new set of PrepRawData objects

Definition at line 437 of file KalmanFitterTool.cxx.

442{
443 ATH_MSG_DEBUG("Fit of Track with additional PrepRawDataSet not yet implemented");
444 return nullptr;
445}

◆ fit() [7/9]

std::unique_ptr< Trk::Track > ActsTrk::KalmanFitterTool::fit ( const EventContext & ctx,
const Trk::Track & inputTrack,
const Trk::RunOutlierRemoval runOutlier = false,
const Trk::ParticleHypothesis matEffects = Trk::nonInteracting ) const
overridevirtual

refit a track

Definition at line 155 of file KalmanFitterTool.cxx.

158 {
159
160 ATH_MSG_VERBOSE ("--> enter KalmanFitter::fit(Track,,) with Track from author = "
161 << inputTrack.info().dumpInfo()<<", "<<hypothesis);
162
163 // protection against not having measurements on the input track
164 if (!inputTrack.measurementsOnTrack() || inputTrack.measurementsOnTrack()->size() < 2) {
165 ATH_MSG_DEBUG("called to refit empty track or track with too little information, reject fit");
166 return nullptr;
167 }
168
169 // protection against not having track parameters on the input track
170 if (!inputTrack.trackParameters() || inputTrack.trackParameters()->empty()) {
171 ATH_MSG_DEBUG("input fails to provide track parameters for seeding the KF, reject fit");
172 return nullptr;
173 }
174
175 // Construct a perigee surface as the target surface
176 auto pSurface = Acts::Surface::makeShared<Acts::PerigeeSurface>(Acts::Vector3::Zero());
177
178 const Acts::GeometryContext tgContext = m_trackingGeometryTool->getGeometryContext(ctx).context();
179 const Acts::MagneticFieldContext mfContext = m_extrapolationTool->getMagneticFieldContext(ctx);
180 const Acts::CalibrationContext calContext{getCalibrationContext(ctx)};
181 // Set the KalmanFitter options
182 Acts::KalmanFitterOptions kfOptions = configureFit(tgContext, mfContext, calContext, pSurface.get(),
184
185 std::vector<Acts::SourceLink> trackSourceLinks = m_ATLASConverterTool->trkTrackToSourceLinks(inputTrack);
186 // protection against error in the conversion from Atlas masurement to Acts source link
187 if (trackSourceLinks.empty()) {
188 ATH_MSG_DEBUG("input contain measurement but no source link created, probable issue with the converter, reject fit ");
189 return nullptr;
190 }
191
192 const auto initialParams = m_ATLASConverterTool->trkTrackParametersToActsParameters((*inputTrack.perigeeParameters()), tgContext);
193
194 // The covariance from already fitted track are too small and would result an incorect smoothing.
195 // We scale up the input covaraiance to avoid this.
196 Acts::BoundSquareMatrix scaledCov = Acts::BoundSquareMatrix::Identity();
197 for (int i=0; i<6; ++i) {
199 (scaledCov)(i,i) = scale * initialParams.covariance().value()(i,i);
200 }
201
202 const Acts::BoundTrackParameters scaledInitialParams(initialParams.referenceSurface().getSharedPtr(),
203 initialParams.parameters(),
204 scaledCov,
205 Acts::ParticleHypothesis::pion());
206
207 ActsTrk::MutableTrackBackend trackContainerBackEnd;
208 ActsTrk::MutableTrackStateBackend multiTrajBackEnd;
209 ActsTrk::MutableTrackContainer tracks( std::move(trackContainerBackEnd),
210 std::move(multiTrajBackEnd));
211
212 // Perform the fit
213 auto result = m_fitter->fit(trackSourceLinks.begin(), trackSourceLinks.end(),
214 scaledInitialParams, kfOptions, tracks);
215 return m_ATLASConverterTool->convertFitResult(ctx, tracks, result,
218}
Gaudi::Property< double > m_option_seedCovarianceScale

◆ fit() [8/9]

std::unique_ptr< Trk::Track > ActsTrk::KalmanFitterTool::fit ( const EventContext & ctx,
const Trk::Track & intrk1,
const Trk::Track & intrk2,
const Trk::RunOutlierRemoval runOutlier = false,
const Trk::ParticleHypothesis matEffects = Trk::nonInteracting ) const
overridevirtual

combined track fit

Definition at line 450 of file KalmanFitterTool.cxx.

455{
456 ATH_MSG_VERBOSE ("--> enter KalmanFitter::fit(Track,Track,)");
457 ATH_MSG_VERBOSE (" with Tracks from #1 = " << intrk1.info().dumpInfo()
458 << " and #2 = " << intrk2.info().dumpInfo()<<", "<<hypothesis);
459
460 // protection, if empty track2
461 if (!intrk2.measurementsOnTrack()) {
462 ATH_MSG_DEBUG( "input #2 is empty try to fit track 1 alone" );
463 return fit(ctx,intrk1);
464 }
465
466 // protection, if empty track1
467 if (!intrk1.measurementsOnTrack()) {
468 ATH_MSG_DEBUG( "input #1 is empty try to fit track 2 alone" );
469 return fit(ctx,intrk2);
470 }
471
472 // protection against not having track parameters on the input track
473 if (!intrk1.trackParameters() || intrk1.trackParameters()->empty()) {
474 ATH_MSG_DEBUG("input #1 fails to provide track parameters for seeding the KF, reject fit");
475 return nullptr;
476 }
477
478 // Construct a perigee surface as the target surface
479 auto pSurface = Acts::Surface::makeShared<Acts::PerigeeSurface>(Acts::Vector3::Zero());
480
481 const Acts::GeometryContext tgContext = m_trackingGeometryTool->getGeometryContext(ctx).context();
482 const Acts::MagneticFieldContext mfContext = m_extrapolationTool->getMagneticFieldContext(ctx);
483 const Acts::CalibrationContext calContext{getCalibrationContext(ctx)};
484
485 // Set the KalmanFitter options
486 Acts::KalmanFitterOptions kfOptions = configureFit(tgContext, mfContext, calContext, pSurface.get(),
488
489 std::vector<Acts::SourceLink> trackSourceLinks = m_ATLASConverterTool->trkTrackToSourceLinks(intrk1);
490 std::vector<Acts::SourceLink> trackSourceLinks2 = m_ATLASConverterTool->trkTrackToSourceLinks(intrk2);
491 trackSourceLinks.insert(trackSourceLinks.end(), std::make_move_iterator(trackSourceLinks2.begin()),
492 std::make_move_iterator(trackSourceLinks2.end()));
493 // protection against error in the conversion from Atlas masurement to Acts source link
494 if (trackSourceLinks.empty()) {
495 ATH_MSG_DEBUG("input contain measurement but no source link created, probable issue with the converter, reject fit ");
496 return nullptr;
497 }
498
499 const auto &initialParams = m_ATLASConverterTool->trkTrackParametersToActsParameters(*(intrk1.perigeeParameters()), tgContext);
500
501 // The covariance from already fitted track are too small and would result an incorect smoothing.
502 // We scale up the input covaraiance to avoid this.
503 Acts::BoundSquareMatrix scaledCov = Acts::BoundSquareMatrix::Identity();
504 for (int i=0; i<6; ++i) {
506 (scaledCov)(i,i) = scale * initialParams.covariance().value()(i,i);
507 }
508
509 const Acts::BoundTrackParameters scaledInitialParams(initialParams.referenceSurface().getSharedPtr(),
510 initialParams.parameters(),
511 scaledCov, Acts::ParticleHypothesis::pion());
512
513
514 ActsTrk::MutableTrackBackend trackContainerBackEnd;
515 ActsTrk::MutableTrackStateBackend multiTrajBackEnd;
516 ActsTrk::MutableTrackContainer tracks( std::move(trackContainerBackEnd),
517 std::move(multiTrajBackEnd));
518
519 // Perform the fit
520 auto result = m_fitter->fit(trackSourceLinks.begin(), trackSourceLinks.end(),
521 scaledInitialParams, kfOptions, tracks);
522 return m_ATLASConverterTool->convertFitResult(ctx, tracks, result,
525}

◆ fit() [9/9]

std::unique_ptr< MutableTrackContainer > ActsTrk::KalmanFitterTool::fit ( const std::vector< ActsTrk::ATLASUncalibSourceLink > & clusterList,
const Acts::BoundTrackParameters & initialParams,
const Acts::GeometryContext & tgContext,
const Acts::MagneticFieldContext & mfContext,
const Acts::CalibrationContext & calContext,
const Acts::Surface * targetSurface = nullptr ) const
overridevirtual

fit a set of xAOD uncalibrated Measurements

Definition at line 315 of file KalmanFitterTool.cxx.

320 {
321 ATH_MSG_DEBUG("--> entering KalmanFitter::fit(xAODMeasure...things,TP,)");
322
323 std::vector<Acts::SourceLink> sourceLinks;
324 sourceLinks.reserve(clusterList.size());
325
326 std::vector<const Acts::Surface*> surfaces;
327 surfaces.reserve(clusterList.size());
328
329
330 for (const ATLASUncalibSourceLink& el : clusterList) {
331 sourceLinks.emplace_back( el );
332 surfaces.push_back(m_unalibMeasSurfAcc.get(el));
333 }
334
335 // Construct a perigee surface as the target surface if none is provided
336 std::shared_ptr<Acts::Surface> pSurface{nullptr};
337 if (!targetSurface){
338 pSurface = Acts::Surface::makeShared<Acts::PerigeeSurface>(Acts::Vector3::Zero());
339 targetSurface = pSurface.get();
340 }
341
342 // Set the KalmanFitter options
343
344 Acts::KalmanFitterOptions kfOptions = configureFit(tgContext, mfContext, calContext, targetSurface,
346
347 ActsTrk::MutableTrackBackend trackContainerBackEnd;
348 ActsTrk::MutableTrackStateBackend multiTrajBackEnd;
349 std::unique_ptr< MutableTrackContainer > tracks = std::make_unique< MutableTrackContainer >( std::move(trackContainerBackEnd),
350 std::move(multiTrajBackEnd) );
351
352
353 auto result = m_directFitter->fit(sourceLinks.begin(),
354 sourceLinks.end(),
355 initialParams,
356 kfOptions,
357 surfaces,
358 *tracks.get());
359
360 if (not result.ok()) {
361 ATH_MSG_VERBOSE("Kalman Fitter on Seed has failed");
362 return nullptr;
363 }
364 return tracks;
365}
detail::xAODUncalibMeasSurfAcc m_unalibMeasSurfAcc
Accessor to fetch surfaces from the xAOD::UncalibratedMeasurements (Phase-II EDM)
std::unique_ptr< DirectFitter > m_directFitter
@ xAODUnCalibMeas
UnCalibrated Trk::PrepRawData objects.
const xAOD::UncalibratedMeasurement * ATLASUncalibSourceLink

◆ initialize()

StatusCode ActsTrk::KalmanFitterTool::initialize ( )
overridevirtual

Configure the fit extensions for Trk::MeasuremenBase pass through fits.

Configure the fit extensions for the Trk::PrepRawData fits

Configure the fit extensions for the uncalibrated measurement fits

Definition at line 58 of file KalmanFitterTool.cxx.

58 {
59
60 ATH_MSG_DEBUG(name() << "::" << __FUNCTION__);
64 ATH_CHECK(m_ROTcreator.retrieve(EnableTool{m_doReFitFromPRD}));
65 m_logger = makeActsAthenaLogger(this, "KalmanRefit");
66
67 auto field = std::make_shared<ATLASMagneticFieldWrapper>();
68
69 // Fitter
70 Acts::SympyStepper stepper(field);
71 Acts::Navigator navigator( Acts::Navigator::Config{ m_trackingGeometryTool->trackingGeometry() },
72 logger().cloneWithSuffix("Navigator"));
73 Acts::Propagator<Acts::SympyStepper, Acts::Navigator> propagator(stepper,
74 std::move(navigator),
75 logger().cloneWithSuffix("Prop"));
76
77 m_fitter = std::make_unique<Fitter>(std::move(propagator),
78 logger().cloneWithSuffix("KalmanFitter"));
79
80 // Direct Fitter
81 Acts::DirectNavigator directNavigator( logger().cloneWithSuffix("DirectNavigator") );
82 Acts::Propagator<Acts::SympyStepper, Acts::DirectNavigator> directPropagator(std::move(stepper),
83 std::move(directNavigator),
84 logger().cloneWithSuffix("DirectPropagator"));
85
86 m_directFitter = std::make_unique<DirectFitter>(std::move(directPropagator),
87 logger().cloneWithSuffix("DirectKalmanFitter"));
88
90
91 m_outlierFinder.StateChiSquaredPerNumberDoFCut = m_option_outlierChi2Cut;
93
94 FitterExtension_t extensionTemplate{};
95 extensionTemplate.outlierFinder.connect<&detail::FitterHelperFunctions::ATLASOutlierFinder::operator()<MutableTrackStateBackend>>(&m_outlierFinder);
96 extensionTemplate.reverseFilteringLogic.connect<&detail::FitterHelperFunctions::ReverseFilteringLogic::operator()<MutableTrackStateBackend>>(&m_reverseFilteringLogic);
99
100 extensionTemplate.outlierFinder.connect<&detail::FitterHelperFunctions::ATLASOutlierFinder::operator()
103
105 {
106 m_trkSurfAcc = detail::TrkMeasSurfaceAccessor{m_ATLASConverterTool.get()};
107
109 configureMe = extensionTemplate;
111 configureMe.surfaceAccessor.connect<&detail::TrkMeasSurfaceAccessor::operator()>(&m_trkSurfAcc);
112 }
114 {
115 m_prdCalibrator = detail::TrkPrepRawDataCalibrator{m_ATLASConverterTool.get(), m_ROTcreator.get()};
116 m_prdSurfAcc = detail::TrkPrepRawDataSurfaceAcc{m_ATLASConverterTool.get()};
118 configureMe = extensionTemplate;
120 configureMe.surfaceAccessor.connect<&detail::TrkPrepRawDataSurfaceAcc::operator()>(&m_prdSurfAcc);
121 }
123 {
124 m_unalibMeasSurfAcc = detail::xAODUncalibMeasSurfAcc{m_trackingGeometryTool.get()};
127 configureMe = extensionTemplate;
128 configureMe.surfaceAccessor.connect<&detail::xAODUncalibMeasSurfAcc::operator()>(&m_unalibMeasSurfAcc);
129 configureMe.calibrator.connect<&xAODUnCalibrator_t::calibrate>(&m_uncalibMeasCalibrator);
130 }
131 return StatusCode::SUCCESS;
132}
#define ATH_CHECK
Evaluate an expression and check for errors.
std::unique_ptr< const Acts::Logger > makeActsAthenaLogger(IMessageSvc *svc, const std::string &name, int level, std::optional< std::string > parent_name)
ActsTrk::detail::FitterHelperFunctions::ReverseFilteringLogic m_reverseFilteringLogic
Acts::KalmanFitterExtensions< MutableTrackStateBackend > FitterExtension_t
Abbrivation of the fitter extensions.
detail::TrkPrepRawDataCalibrator m_prdCalibrator
Calibrator for the Trk::PrepRawData track states (legacy EDM)
detail::TrkPrepRawDataSurfaceAcc m_prdSurfAcc
Surface accessor for the Trk::PrepRawData track states (legacy EDM)
std::unique_ptr< const Acts::Logger > m_logger
logging instance
ActsTrk::detail::FitterHelperFunctions::ATLASOutlierFinder m_outlierFinder
ToolHandle< Trk::IRIO_OnTrackCreator > m_ROTcreator
detail::TrkMeasSurfaceAccessor m_trkSurfAcc
Accessor to fetch surfaces from the Trk::MeasurementBase track states (legacy EDM)
Gaudi::Property< double > m_option_outlierChi2Cut
const Acts::Logger & logger() const
Private access to the logger.
detail::TrkMeasurementCalibrator m_trkCalibrator
Calibrator for the Trk::MeasurementBase track states (legacy EDM)
xAODUnCalibrator_t m_uncalibMeasCalibrator
Gaudi::Property< double > m_option_ReverseFilteringPt
void calibrate(const Acts::GeometryContext &geoctx, const Acts::CalibrationContext &cctx, const Acts::SourceLink &link, TrackStateProxy state) const
static OnTrackCalibrator NoCalibration(const ActsTrk::ITrackingGeometryTool *trackGeoTool)
void calibrate(const Acts::GeometryContext &gctx, const Acts::CalibrationContext &cctx, const Acts::SourceLink &sl, TrackState_t< trajectory_t > trackState) const
Calibrator delegate implementation to calibrate the ActsTrk fit from Trk::MeasurementBase objects.
void calibrate(const Acts::GeometryContext &gctx, const Acts::CalibrationContext &cctx, const Acts::SourceLink &sl, TrackState_t< trajectory_t > trackState) const
Calibrator delegate implementation to calibrate the ActsTrk fit from Trk::PrepRawData objects.
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)

◆ logger()

const Acts::Logger & ActsTrk::KalmanFitterTool::logger ( ) const
inlineprivate

Private access to the logger.

Definition at line 212 of file KalmanFitterTool.h.

212 {
213 return *m_logger;
214 }

Member Data Documentation

◆ m_ATLASConverterTool

ToolHandle<ActsTrk::IActsToTrkConverterTool> ActsTrk::KalmanFitterTool::m_ATLASConverterTool {this, "ATLASConverterTool", ""}
private

Definition at line 171 of file KalmanFitterTool.h.

171{this, "ATLASConverterTool", ""};

◆ m_directFitter

std::unique_ptr<DirectFitter> ActsTrk::KalmanFitterTool::m_directFitter {nullptr}
private

Definition at line 202 of file KalmanFitterTool.h.

202{nullptr};

◆ m_doReFitFromPRD

Gaudi::Property<bool> ActsTrk::KalmanFitterTool::m_doReFitFromPRD {this, "DoReFitFromPRD", false, "Do Refit From PRD instead of ROT"}
private

Definition at line 221 of file KalmanFitterTool.h.

221{this, "DoReFitFromPRD", false, "Do Refit From PRD instead of ROT"};

◆ m_extrapolationTool

ToolHandle<ActsTrk::IExtrapolationTool> ActsTrk::KalmanFitterTool::m_extrapolationTool {this, "ExtrapolationTool", ""}
private

Definition at line 169 of file KalmanFitterTool.h.

169{this, "ExtrapolationTool", ""};

◆ m_fitter

std::unique_ptr<Fitter> ActsTrk::KalmanFitterTool::m_fitter {nullptr}
private

Definition at line 199 of file KalmanFitterTool.h.

199{nullptr};

◆ m_kfExtensions

std::array<FitterExtension_t, s_nExtensions> ActsTrk::KalmanFitterTool::m_kfExtensions {}
private

Definition at line 206 of file KalmanFitterTool.h.

206{};

◆ m_logger

std::unique_ptr<const Acts::Logger> ActsTrk::KalmanFitterTool::m_logger
private

logging instance

Definition at line 217 of file KalmanFitterTool.h.

◆ m_option_maxPropagationStep

Gaudi::Property< int > ActsTrk::KalmanFitterTool::m_option_maxPropagationStep
private
Initial value:
{this, "MaxPropagationStep", 5000,
"Maximum number of steps for one propagate call"}

Definition at line 177 of file KalmanFitterTool.h.

177 {this, "MaxPropagationStep", 5000,
178 "Maximum number of steps for one propagate call"};

◆ m_option_outlierChi2Cut

Gaudi::Property< double > ActsTrk::KalmanFitterTool::m_option_outlierChi2Cut
private
Initial value:
{this, "OutlierChi2Cut", 12.5,
"Chi2 cut used by the outlier finder" }

Definition at line 173 of file KalmanFitterTool.h.

173 {this, "OutlierChi2Cut", 12.5,
174 "Chi2 cut used by the outlier finder" };

◆ m_option_ReverseFilteringPt

Gaudi::Property< double > ActsTrk::KalmanFitterTool::m_option_ReverseFilteringPt
private
Initial value:
{this, "ReverseFilteringPt", 1.0 * Acts::UnitConstants::GeV,
"Pt cut used for the ReverseFiltering logic"}

Definition at line 175 of file KalmanFitterTool.h.

175 {this, "ReverseFilteringPt", 1.0 * Acts::UnitConstants::GeV,
176 "Pt cut used for the ReverseFiltering logic"};

◆ m_option_seedCovarianceScale

Gaudi::Property< double > ActsTrk::KalmanFitterTool::m_option_seedCovarianceScale
private
Initial value:
{this, "SeedCovarianceScale", 100.,
"Scale factor for the input seed covariance when doing refitting"}

Definition at line 179 of file KalmanFitterTool.h.

179 {this, "SeedCovarianceScale", 100.,
180 "Scale factor for the input seed covariance when doing refitting"};

◆ m_outlierFinder

ActsTrk::detail::FitterHelperFunctions::ATLASOutlierFinder ActsTrk::KalmanFitterTool::m_outlierFinder {0}
private

Definition at line 208 of file KalmanFitterTool.h.

208{0};

◆ m_prdCalibrator

detail::TrkPrepRawDataCalibrator ActsTrk::KalmanFitterTool::m_prdCalibrator {}
private

Calibrator for the Trk::PrepRawData track states (legacy EDM)

Definition at line 187 of file KalmanFitterTool.h.

187{};

◆ m_prdSurfAcc

detail::TrkPrepRawDataSurfaceAcc ActsTrk::KalmanFitterTool::m_prdSurfAcc {}
private

Surface accessor for the Trk::PrepRawData track states (legacy EDM)

Definition at line 189 of file KalmanFitterTool.h.

189{};

◆ m_reverseFilteringLogic

ActsTrk::detail::FitterHelperFunctions::ReverseFilteringLogic ActsTrk::KalmanFitterTool::m_reverseFilteringLogic {0}
private

Definition at line 209 of file KalmanFitterTool.h.

209{0};

◆ m_ROTcreator

ToolHandle<Trk::IRIO_OnTrackCreator> ActsTrk::KalmanFitterTool::m_ROTcreator {this, "RotCreatorTool", ""}
private

Definition at line 219 of file KalmanFitterTool.h.

219{this, "RotCreatorTool", ""};

◆ m_trackingGeometryTool

PublicToolHandle<ActsTrk::ITrackingGeometryTool> ActsTrk::KalmanFitterTool::m_trackingGeometryTool {this, "TrackingGeometryTool", ""}
private

Definition at line 170 of file KalmanFitterTool.h.

170{this, "TrackingGeometryTool", ""};

◆ m_trkCalibrator

detail::TrkMeasurementCalibrator ActsTrk::KalmanFitterTool::m_trkCalibrator {}
private

Calibrator for the Trk::MeasurementBase track states (legacy EDM)

Definition at line 183 of file KalmanFitterTool.h.

183{};

◆ m_trkSurfAcc

detail::TrkMeasSurfaceAccessor ActsTrk::KalmanFitterTool::m_trkSurfAcc {}
private

Accessor to fetch surfaces from the Trk::MeasurementBase track states (legacy EDM)

Definition at line 185 of file KalmanFitterTool.h.

185{};

◆ m_unalibMeasSurfAcc

detail::xAODUncalibMeasSurfAcc ActsTrk::KalmanFitterTool::m_unalibMeasSurfAcc {}
private

Accessor to fetch surfaces from the xAOD::UncalibratedMeasurements (Phase-II EDM)

Definition at line 191 of file KalmanFitterTool.h.

191{};

◆ m_uncalibMeasCalibrator

xAODUnCalibrator_t ActsTrk::KalmanFitterTool::m_uncalibMeasCalibrator {}
private

Definition at line 194 of file KalmanFitterTool.h.

194{};

◆ s_nExtensions

unsigned ActsTrk::KalmanFitterTool::s_nExtensions = static_cast<unsigned>(detail::SourceLinkType::nTypes)
staticconstexprprivate

Array of all configured fitter extensions depending on which source link type is in use.

Definition at line 205 of file KalmanFitterTool.h.


The documentation for this class was generated from the following files: