8#include "Acts/EventData/Types.hpp"
9#include "GaudiKernel/TypeNameString.h"
14#include "GaudiKernel/EventContext.h"
20#include "Acts/EventData/Types.hpp"
21#include "Acts/Definitions/TrackParametrization.hpp"
22#include "Acts/Definitions/Units.hpp"
23#include "Acts/Propagator/SympyStepper.hpp"
24#include "Acts/Propagator/Navigator.hpp"
25#include "Acts/Propagator/Propagator.hpp"
26#include "Acts/Surfaces/PerigeeSurface.hpp"
27#include "Acts/Surfaces/Surface.hpp"
28#include "Acts/TrackFitting/KalmanFitter.hpp"
29#include "Acts/Utilities/Helpers.hpp"
30#include "Acts/Utilities/Logger.hpp"
31#include "Acts/Utilities/CalibrationContext.hpp"
32#include "Acts/EventData/VectorTrackContainer.hpp"
49#include "Acts/Propagator/DirectNavigator.hpp"
67 auto field = std::make_shared<ATLASMagneticFieldWrapper>();
70 Acts::SympyStepper stepper(field);
72 logger().cloneWithSuffix(
"Navigator"));
73 Acts::Propagator<Acts::SympyStepper, Acts::Navigator> propagator(stepper,
75 logger().cloneWithSuffix(
"Prop"));
77 m_fitter = std::make_unique<Fitter>(std::move(propagator),
78 logger().cloneWithSuffix(
"KalmanFitter"));
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"));
86 m_directFitter = std::make_unique<DirectFitter>(std::move(directPropagator),
87 logger().cloneWithSuffix(
"DirectKalmanFitter"));
100 extensionTemplate.outlierFinder.connect<&detail::FitterHelperFunctions::ATLASOutlierFinder::operator()
109 configureMe = extensionTemplate;
111 configureMe.surfaceAccessor.connect<&detail::TrkMeasSurfaceAccessor::operator()>(&
m_trkSurfAcc);
118 configureMe = extensionTemplate;
120 configureMe.surfaceAccessor.connect<&detail::TrkPrepRawDataSurfaceAcc::operator()>(&
m_prdSurfAcc);
127 configureMe = extensionTemplate;
128 configureMe.surfaceAccessor.connect<&detail::xAODUncalibMeasSurfAcc::operator()>(&
m_unalibMeasSurfAcc);
131 return StatusCode::SUCCESS;
137 const Acts::MagneticFieldContext& mfContext,
138 const Acts::CalibrationContext& calContext,
139 const Acts::Surface* surface,
143 const auto& kfExtensions =
m_kfExtensions[
static_cast<int>(slType)];
145 Acts::PropagatorPlainOptions propagationOption(tgContext, mfContext);
149 kfExtensions, propagationOption,
154std::unique_ptr<Trk::Track>
160 ATH_MSG_VERBOSE (
"--> enter KalmanFitter::fit(Track,,) with Track from author = "
165 ATH_MSG_DEBUG(
"called to refit empty track or track with too little information, reject fit");
171 ATH_MSG_DEBUG(
"input fails to provide track parameters for seeding the KF, reject fit");
176 auto pSurface = Acts::Surface::makeShared<Acts::PerigeeSurface>(Acts::Vector3::Zero());
179 const Acts::MagneticFieldContext mfContext =
m_extrapolationTool->getMagneticFieldContext(ctx);
182 Acts::KalmanFitterOptions kfOptions =
configureFit(tgContext, mfContext, calContext, pSurface.get(),
185 std::vector<Acts::SourceLink> trackSourceLinks =
m_ATLASConverterTool->trkTrackToSourceLinks(inputTrack);
187 if (trackSourceLinks.empty()) {
188 ATH_MSG_DEBUG(
"input contain measurement but no source link created, probable issue with the converter, reject fit ");
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);
202 const Acts::BoundTrackParameters scaledInitialParams(initialParams.referenceSurface().getSharedPtr(),
203 initialParams.parameters(),
205 Acts::ParticleHypothesis::pion());
210 std::move(multiTrajBackEnd));
213 auto result =
m_fitter->fit(trackSourceLinks.begin(), trackSourceLinks.end(),
214 scaledInitialParams, kfOptions, tracks);
222std::unique_ptr<Trk::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");
236 auto pSurface = Acts::Surface::makeShared<Acts::PerigeeSurface>(Acts::Vector3::Zero());
239 const Acts::MagneticFieldContext mfContext =
m_extrapolationTool->getMagneticFieldContext(ctx);
242 Acts::KalmanFitterOptions kfOptions =
configureFit(tgContext, mfContext, calContext, pSurface.get(),
245 std::vector<Acts::SourceLink> trackSourceLinks;
248 if (trackSourceLinks.empty()) {
249 ATH_MSG_DEBUG(
"input contain measurement but no source link created, probable issue with the converter, reject fit ");
253 const auto initialParams =
m_ATLASConverterTool->trkTrackParametersToActsParameters(estimatedStartParameters, tgContext);
258 std::move(multiTrajBackEnd));
261 auto result =
m_fitter->fit(trackSourceLinks.begin(), trackSourceLinks.end(),
262 initialParams, kfOptions, tracks);
270std::unique_ptr<Trk::Track>
279 auto pSurface = Acts::Surface::makeShared<Acts::PerigeeSurface>(Acts::Vector3::Zero());
282 const Acts::MagneticFieldContext mfContext =
m_extrapolationTool->getMagneticFieldContext(ctx);
285 Acts::KalmanFitterOptions kfOptions =
configureFit(tgContext, mfContext, calContext, pSurface.get(),
288 std::vector<Acts::SourceLink> trackSourceLinks;
291 if (trackSourceLinks.empty()) {
292 ATH_MSG_WARNING(
"input contain measurement but no source link created, probable issue with the converter, reject fit ");
297 const auto initialParams =
m_ATLASConverterTool->trkTrackParametersToActsParameters(estimatedStartParameters, tgContext);
302 std::move(multiTrajBackEnd));
305 auto result =
m_fitter->fit(trackSourceLinks.begin(), trackSourceLinks.end(),
306 initialParams, kfOptions, tracks);
314std::unique_ptr< MutableTrackContainer >
316 const Acts::BoundTrackParameters& initialParams,
317 const Acts::GeometryContext& tgContext,
318 const Acts::MagneticFieldContext& mfContext,
319 const Acts::CalibrationContext& calContext,
320 const Acts::Surface* targetSurface)
const{
321 ATH_MSG_DEBUG(
"--> entering KalmanFitter::fit(xAODMeasure...things,TP,)");
323 std::vector<Acts::SourceLink> sourceLinks;
324 sourceLinks.reserve(clusterList.size());
326 std::vector<const Acts::Surface*> surfaces;
327 surfaces.reserve(clusterList.size());
331 sourceLinks.emplace_back( el );
336 std::shared_ptr<Acts::Surface> pSurface{
nullptr};
338 pSurface = Acts::Surface::makeShared<Acts::PerigeeSurface>(Acts::Vector3::Zero());
339 targetSurface = pSurface.get();
344 Acts::KalmanFitterOptions kfOptions =
configureFit(tgContext, mfContext, calContext, targetSurface,
349 std::unique_ptr< MutableTrackContainer > tracks = std::make_unique< MutableTrackContainer >( std::move(trackContainerBackEnd),
350 std::move(multiTrajBackEnd) );
371std::unique_ptr<Trk::Track>
382 if (addMeasColl.empty()) {
383 ATH_MSG_DEBUG(
"client tries to add an empty MeasurementSet to the track fit." );
384 return fit(ctx,inputTrack);
389 ATH_MSG_DEBUG(
"called to refit empty track or track with too little information, reject fit");
395 ATH_MSG_DEBUG(
"input fails to provide track parameters for seeding the KF, reject fit");
401 auto pSurface = Acts::Surface::makeShared<Acts::PerigeeSurface>(Acts::Vector3::Zero());
404 const Acts::MagneticFieldContext mfContext =
m_extrapolationTool->getMagneticFieldContext(ctx);
408 Acts::KalmanFitterOptions kfOptions =
configureFit(tgContext, mfContext, calContext, pSurface.get(),
411 std::vector<Acts::SourceLink> trackSourceLinks =
m_ATLASConverterTool->trkTrackToSourceLinks(inputTrack);
415 if (trackSourceLinks.empty()) {
416 ATH_MSG_DEBUG(
"input contain measurement but no source link created, probable issue with the converter, reject fit ");
424 std::move(multiTrajBackEnd));
427 auto result =
m_fitter->fit(trackSourceLinks.begin(), trackSourceLinks.end(),
428 initialParams, kfOptions, tracks);
436std::unique_ptr<Trk::Track>
443 ATH_MSG_DEBUG(
"Fit of Track with additional PrepRawDataSet not yet implemented");
449std::unique_ptr<Trk::Track>
458 <<
" and #2 = " << intrk2.
info().
dumpInfo()<<
", "<<hypothesis);
462 ATH_MSG_DEBUG(
"input #2 is empty try to fit track 1 alone" );
463 return fit(ctx,intrk1);
468 ATH_MSG_DEBUG(
"input #1 is empty try to fit track 2 alone" );
469 return fit(ctx,intrk2);
474 ATH_MSG_DEBUG(
"input #1 fails to provide track parameters for seeding the KF, reject fit");
479 auto pSurface = Acts::Surface::makeShared<Acts::PerigeeSurface>(Acts::Vector3::Zero());
482 const Acts::MagneticFieldContext mfContext =
m_extrapolationTool->getMagneticFieldContext(ctx);
486 Acts::KalmanFitterOptions kfOptions =
configureFit(tgContext, mfContext, calContext, pSurface.get(),
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()));
494 if (trackSourceLinks.empty()) {
495 ATH_MSG_DEBUG(
"input contain measurement but no source link created, probable issue with the converter, reject fit ");
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);
509 const Acts::BoundTrackParameters scaledInitialParams(initialParams.referenceSurface().getSharedPtr(),
510 initialParams.parameters(),
511 scaledCov, Acts::ParticleHypothesis::pion());
517 std::move(multiTrajBackEnd));
520 auto result =
m_fitter->fit(trackSourceLinks.begin(), trackSourceLinks.end(),
521 scaledInitialParams, kfOptions, tracks);
527std::unique_ptr< MutableTrackContainer >
529 const Acts::BoundTrackParameters& initialParams,
530 const Acts::GeometryContext& tgContext,
531 const Acts::MagneticFieldContext& mfContext,
532 const Acts::CalibrationContext& calContext,
533 const Acts::Surface& targetSurface)
const {
535 std::vector<ATLASUncalibSourceLink> sourceLinks;
536 sourceLinks.reserve(6);
538 const auto& sps = seed.sp();
540 const auto& measurements =
sp->measurements();
542 sourceLinks.emplace_back(umeas);
545 return fit(sourceLinks, initialParams, tgContext, mfContext, calContext, &targetSurface);
550 const TrackContainer::ConstTrackProxy& ,
552 const Acts::PerigeeSurface& )
const
554 ATH_MSG_ERROR(
"Track refit method not implemented in KalmanFitterTool yet");
555 return StatusCode::FAILURE;
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
std::unique_ptr< const Acts::Logger > makeActsAthenaLogger(IMessageSvc *svc, const std::string &name, int level, std::optional< std::string > parent_name)
void calibrate(const Acts::GeometryContext &geoctx, const Acts::CalibrationContext &cctx, const Acts::SourceLink &link, TrackStateProxy state) const
static OnTrackCalibrator NoCalibration(const ActsTrk::ITrackingGeometryTool *trackGeoTool)
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, TrackState_t< trajectory_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, TrackState_t< trajectory_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.
Helper class to access the Acts::surface associated with an Uncalibrated xAOD measurement.
std::string dumpInfo() const
Returns a string with the name of the fitter of this track (i.e.
@ KalmanFitter
tracks produced by the Kalman Fitter
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.
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::CalibrationContext getCalibrationContext(const EventContext &ctx)
The Acts::Calibration context is piped through the Acts fitters to (re)calibrate the Acts::SourceLink...
Acts::VectorTrackContainer MutableTrackBackend
const xAOD::UncalibratedMeasurement * ATLASUncalibSourceLink
std::vector< const MeasurementBase * > MeasurementSet
vector of fittable measurements
bool RunOutlierRemoval
switch to toggle quality processing after fit
ParticleHypothesis
Enumeration for Particle hypothesis respecting the interaction with material.
ParametersBase< TrackParametersDim, Charged > TrackParameters
std::vector< const PrepRawData * > PrepRawDataSet
vector of clusters and drift circles
UncalibratedMeasurement_v1 UncalibratedMeasurement
Define the version of the uncalibrated measurement class.