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< 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
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 TrackState_t = MutableTrackStateBackend::TrackStateProxy
 Abrivate the track state proxy.
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< IExtrapolationToolm_extrapolationTool {this, "ExtrapolationTool", ""}
PublicToolHandle< ITrackingGeometryToolm_trackingGeometryTool {this, "TrackingGeometryTool", ""}
PublicToolHandle< IGeometryRealmConvToolm_geometryConvTool {this, "GeometryRealmConvTool", ""}
ToolHandle< ITrackConverterToolm_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 61 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 204 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 201 of file KalmanFitterTool.h.

◆ FitterExtension_t

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

Abbrivation of the fitter extensions.

Definition at line 153 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 155 of file KalmanFitterTool.h.

◆ TrackState_t

using ActsTrk::KalmanFitterTool::TrackState_t = MutableTrackStateBackend::TrackStateProxy
private

Abrivate the track state proxy.

Definition at line 151 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[Acts::toUnderlying(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 523 of file KalmanFitterTool.cxx.

528 {
529
530 std::vector<const xAOD::UncalibratedMeasurement*> sourceLinks;
531 sourceLinks.reserve(6);
532
533 const auto& sps = seed.sp();
534 for (const xAOD::SpacePoint* sp : sps) {
535 const auto& measurements = sp->measurements();
536 for (const xAOD::UncalibratedMeasurement *umeas : measurements) {
537 sourceLinks.push_back(umeas);
538 }
539 }
540 return fit(sourceLinks, initialParams, tgContext, mfContext, calContext, &targetSurface);
541}
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 222 of file KalmanFitterTool.cxx.

226 {
227
228 // protection against not having measurements on the input track
229 if (inputMeasSet.size() < 2) {
230 ATH_MSG_DEBUG("called to refit empty measurement set or a measurement set with too little information, reject fit");
231 return nullptr;
232 }
233
234 // Construct a perigee surface as the target surface
235 auto pSurface = Acts::Surface::makeShared<Acts::PerigeeSurface>(Acts::Vector3::Zero());
236
237 const Acts::GeometryContext tgContext = m_trackingGeometryTool->getGeometryContext(ctx).context();
238 const Acts::MagneticFieldContext mfContext = m_extrapolationTool->getMagneticFieldContext(ctx);
239 const Acts::CalibrationContext calContext{getCalibrationContext(ctx)};
240
241 Acts::KalmanFitterOptions kfOptions = configureFit(tgContext, mfContext, calContext, pSurface.get(),
243
244 std::vector<Acts::SourceLink> trackSourceLinks;
245 detail::MeasurementCalibratorBase::pack(inputMeasSet, trackSourceLinks);
246 // protection against error in the conversion from Atlas masurement to Acts source link
247 if (trackSourceLinks.empty()) {
248 ATH_MSG_DEBUG("input contain measurement but no source link created, probable issue with the converter, reject fit ");
249 return nullptr;
250 }
251
252 const auto initialParams = m_geometryConvTool->convertTrackParametersToActs(ctx, estimatedStartParameters);
253
254 ActsTrk::MutableTrackBackend trackContainerBackEnd;
255 ActsTrk::MutableTrackStateBackend multiTrajBackEnd;
256 ActsTrk::MutableTrackContainer tracks( std::move(trackContainerBackEnd),
257 std::move(multiTrajBackEnd));
258
259 // Perform the fit
260 auto result = m_fitter->fit(trackSourceLinks.begin(), trackSourceLinks.end(),
261 initialParams, kfOptions, tracks);
262 return m_ATLASConverterTool->convertFitResult(ctx, result,
264}
#define ATH_MSG_DEBUG(x)
ToolHandle< ITrackConverterTool > m_ATLASConverterTool
std::unique_ptr< Fitter > m_fitter
PublicToolHandle< IGeometryRealmConvTool > m_geometryConvTool
PublicToolHandle< ITrackingGeometryTool > m_trackingGeometryTool
ToolHandle< 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.
static Acts::SourceLink pack(const Ptr_t &measurement)
Pack the measurement type pointer to an Acts::SourceLink including the intermediate conversion into a...
@ 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 269 of file KalmanFitterTool.cxx.

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

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

438{
439 ATH_MSG_DEBUG("Fit of Track with additional PrepRawDataSet not yet implemented");
440 return nullptr;
441}

◆ 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_geometryConvTool->convertTrackParametersToActs(ctx, *inputTrack.perigeeParameters());
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::BoundMatrix scaledCov = Acts::BoundMatrix::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, result,
217}
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 446 of file KalmanFitterTool.cxx.

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

◆ fit() [9/9]

std::unique_ptr< MutableTrackContainer > ActsTrk::KalmanFitterTool::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
overridevirtual

fit a set of xAOD uncalibrated Measurements

Definition at line 312 of file KalmanFitterTool.cxx.

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

◆ 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 57 of file KalmanFitterTool.cxx.

57 {
58
59 ATH_MSG_DEBUG(name() << "::" << __FUNCTION__);
63 ATH_CHECK(m_geometryConvTool.retrieve());
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_geometryConvTool.get()};
107
109 configureMe = extensionTemplate;
111 configureMe.surfaceAccessor.connect<&detail::TrkMeasSurfaceAccessor::operator()>(&m_trkSurfAcc);
112 }
114 {
115 m_prdCalibrator = detail::TrkPrepRawDataCalibrator{m_geometryConvTool.get(), m_ROTcreator.get()};
116 m_prdSurfAcc = detail::TrkPrepRawDataSurfaceAcc{m_geometryConvTool.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, proxy_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, proxy_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 215 of file KalmanFitterTool.h.

215 {
216 return *m_logger;
217 }

Member Data Documentation

◆ m_ATLASConverterTool

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

Definition at line 174 of file KalmanFitterTool.h.

174{this, "ATLASConverterTool", ""};

◆ m_directFitter

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

Definition at line 205 of file KalmanFitterTool.h.

205{nullptr};

◆ m_doReFitFromPRD

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

Definition at line 224 of file KalmanFitterTool.h.

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

◆ m_extrapolationTool

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

Definition at line 171 of file KalmanFitterTool.h.

171{this, "ExtrapolationTool", ""};

◆ m_fitter

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

Definition at line 202 of file KalmanFitterTool.h.

202{nullptr};

◆ m_geometryConvTool

PublicToolHandle<IGeometryRealmConvTool> ActsTrk::KalmanFitterTool::m_geometryConvTool {this, "GeometryRealmConvTool", ""}
private

Definition at line 173 of file KalmanFitterTool.h.

173{this, "GeometryRealmConvTool", ""};

◆ m_kfExtensions

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

Definition at line 209 of file KalmanFitterTool.h.

209{};

◆ m_logger

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

logging instance

Definition at line 220 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 180 of file KalmanFitterTool.h.

180 {this, "MaxPropagationStep", 5000,
181 "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 176 of file KalmanFitterTool.h.

176 {this, "OutlierChi2Cut", 12.5,
177 "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 178 of file KalmanFitterTool.h.

178 {this, "ReverseFilteringPt", 1.0 * Acts::UnitConstants::GeV,
179 "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 182 of file KalmanFitterTool.h.

182 {this, "SeedCovarianceScale", 100.,
183 "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 211 of file KalmanFitterTool.h.

211{0};

◆ m_prdCalibrator

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

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

Definition at line 190 of file KalmanFitterTool.h.

190{};

◆ m_prdSurfAcc

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

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

Definition at line 192 of file KalmanFitterTool.h.

192{};

◆ m_reverseFilteringLogic

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

Definition at line 212 of file KalmanFitterTool.h.

212{0};

◆ m_ROTcreator

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

Definition at line 222 of file KalmanFitterTool.h.

222{this, "RotCreatorTool", ""};

◆ m_trackingGeometryTool

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

Definition at line 172 of file KalmanFitterTool.h.

172{this, "TrackingGeometryTool", ""};

◆ m_trkCalibrator

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

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

Definition at line 186 of file KalmanFitterTool.h.

186{};

◆ m_trkSurfAcc

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

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

Definition at line 188 of file KalmanFitterTool.h.

188{};

◆ m_unalibMeasSurfAcc

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

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

Definition at line 194 of file KalmanFitterTool.h.

194{};

◆ m_uncalibMeasCalibrator

xAODUnCalibrator_t ActsTrk::KalmanFitterTool::m_uncalibMeasCalibrator {}
private

Definition at line 197 of file KalmanFitterTool.h.

197{};

◆ 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 208 of file KalmanFitterTool.h.


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