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"));
97 extensionTemplate.updater.connect<&detail::FitterHelperFunctions::gainMatrixUpdate<MutableTrackStateBackend>>();
98 extensionTemplate.smoother.connect<&detail::FitterHelperFunctions::mbfSmoother<MutableTrackStateBackend>>();
100 extensionTemplate.outlierFinder.connect<&detail::FitterHelperFunctions::ATLASOutlierFinder::operator()
102 extensionTemplate.updater.connect<&detail::FitterHelperFunctions::gainMatrixUpdate<MutableTrackStateBackend>>();
109 configureMe = extensionTemplate;
110 configureMe.calibrator.connect<&detail::TrkMeasurementCalibrator::calibrate<MutableTrackStateBackend>>(&
m_trkCalibrator);
111 configureMe.surfaceAccessor.connect<&detail::TrkMeasSurfaceAccessor::operator()>(&
m_trkSurfAcc);
118 configureMe = extensionTemplate;
119 configureMe.calibrator.connect<&detail::TrkPrepRawDataCalibrator::calibrate<MutableTrackStateBackend>>(&
m_prdCalibrator);
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,
154 std::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");
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(),
210 std::move(multiTrajBackEnd));
213 auto result =
m_fitter->fit(trackSourceLinks.begin(), trackSourceLinks.end(),
214 scaledInitialParams, kfOptions, tracks);
222 std::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");
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);
270 std::unique_ptr<Trk::Track>
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);
314 std::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};
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) );
371 std::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");
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);
436 std::unique_ptr<Trk::Track>
443 ATH_MSG_DEBUG(
"Fit of Track with additional PrepRawDataSet not yet implemented");
449 std::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");
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(),
517 std::move(multiTrajBackEnd));
520 auto result =
m_fitter->fit(trackSourceLinks.begin(), trackSourceLinks.end(),
521 scaledInitialParams, kfOptions, tracks);
527 std::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;