File indexing completed on 2025-08-06 08:18:07
0001 #include "ActsTrackFittingAlgorithm.h"
0002
0003 #include <Acts/Definitions/TrackParametrization.hpp>
0004
0005 #include <Acts/Geometry/GeometryIdentifier.hpp>
0006 #include <Acts/Geometry/TrackingGeometry.hpp>
0007
0008 #include <Acts/EventData/VectorTrackContainer.hpp>
0009 #include <Acts/Propagator/Navigator.hpp>
0010 #include <Acts/Propagator/Propagator.hpp>
0011 #include <Acts/Surfaces/Surface.hpp>
0012 #include <Acts/TrackFitting/BetheHeitlerApprox.hpp>
0013 #include <Acts/TrackFitting/GainMatrixSmoother.hpp>
0014 #include <Acts/TrackFitting/GainMatrixUpdater.hpp>
0015
0016 #pragma GCC diagnostic push
0017 #pragma GCC diagnostic ignored "-Wunused-local-typedefs"
0018 #include <Acts/TrackFitting/GaussianSumFitter.hpp>
0019 #pragma GCC diagnostic pop
0020 #include <Acts/TrackFitting/GsfMixtureReduction.hpp>
0021 #include <Acts/Utilities/Helpers.hpp>
0022
0023 enum class MixtureReductionAlgorithm
0024 {
0025 weightCut,
0026 KLDistance
0027 };
0028
0029 namespace
0030 {
0031 using BetheHeitlerApprox = Acts::AtlasBetheHeitlerApprox<6, 5>;
0032 using MultiStepper = Acts::MultiEigenStepperLoop<>;
0033 using Propagator = Acts::Propagator<MultiStepper, Acts::Navigator>;
0034 using DirectPropagator = Acts::Propagator<MultiStepper, Acts::DirectNavigator>;
0035
0036 using Fitter =
0037 Acts::GaussianSumFitter<Propagator,
0038 BetheHeitlerApprox,
0039 Acts::VectorMultiTrajectory>;
0040 using DirectFitter =
0041 Acts::GaussianSumFitter<DirectPropagator,
0042 BetheHeitlerApprox,
0043 Acts::VectorMultiTrajectory>;
0044 using TrackContainer =
0045 Acts::TrackContainer<Acts::VectorTrackContainer,
0046 Acts::VectorMultiTrajectory, std::shared_ptr>;
0047
0048
0049
0050 struct GsfFitterFunctionImpl
0051 : public ActsTrackFittingAlgorithm::TrackFitterFunction
0052 {
0053 Fitter fitter;
0054
0055 Acts::GainMatrixUpdater updater;
0056
0057 std::size_t maxComponents = 0;
0058 double weightCutoff = 0;
0059 bool abortOnError = false;
0060 bool disableAllMaterialHandling = false;
0061 MixtureReductionAlgorithm reductionAlg =
0062 MixtureReductionAlgorithm::KLDistance;
0063 Acts::ComponentMergeMethod mergeMethod =
0064 Acts::ComponentMergeMethod::eMaxWeight;
0065
0066 ActsSourceLink::SurfaceAccessor m_slSurfaceAccessor;
0067
0068 GsfFitterFunctionImpl(Fitter&& f,
0069 const Acts::TrackingGeometry& trkGeo)
0070 : fitter(std::move(f))
0071 , m_slSurfaceAccessor{trkGeo}
0072 {
0073 }
0074
0075 template <typename calibrator_t>
0076 auto makeGsfOptions(
0077 const ActsTrackFittingAlgorithm::GeneralFitterOptions& options,
0078 const calibrator_t& calibrator)
0079 const
0080 {
0081 Acts::GsfExtensions<Acts::VectorMultiTrajectory> extensions;
0082
0083 extensions.updater.connect<&Acts::GainMatrixUpdater::operator()<Acts::VectorMultiTrajectory>>(&updater);
0084
0085 Acts::GsfOptions<Acts::VectorMultiTrajectory> gsfOptions{
0086 options.geoContext,
0087 options.magFieldContext,
0088 options.calibrationContext,
0089 extensions,
0090 options.propOptions,
0091 &(*options.referenceSurface),
0092 maxComponents,
0093 weightCutoff,
0094 abortOnError,
0095 disableAllMaterialHandling};
0096 gsfOptions.componentMergeMethod = mergeMethod;
0097 gsfOptions.extensions.calibrator.connect<&calibrator_t::calibrate>(
0098 &calibrator);
0099 gsfOptions.extensions.surfaceAccessor.connect<&ActsSourceLink::SurfaceAccessor::operator()>(&m_slSurfaceAccessor);
0100 switch (reductionAlg)
0101 {
0102 case MixtureReductionAlgorithm::weightCut:
0103 {
0104 gsfOptions.extensions.mixtureReducer
0105 .connect<&Acts::reduceMixtureLargestWeights>();
0106 }
0107 break;
0108 case MixtureReductionAlgorithm::KLDistance:
0109 {
0110 gsfOptions.extensions.mixtureReducer
0111 .connect<&Acts::reduceMixtureWithKLDistance>();
0112 }
0113 break;
0114 }
0115
0116 return gsfOptions;
0117 }
0118
0119 ActsTrackFittingAlgorithm::TrackFitterResult operator()(
0120 const std::vector<Acts::SourceLink>& sourceLinks,
0121 const ActsTrackFittingAlgorithm::TrackParameters& initialParameters,
0122 const ActsTrackFittingAlgorithm::GeneralFitterOptions& options,
0123 const CalibratorAdapter& calibrator,
0124 ActsTrackFittingAlgorithm::TrackContainer& tracks) const override
0125 {
0126 const auto gsfOptions = makeGsfOptions(options, calibrator);
0127 using namespace Acts::GsfConstants;
0128 if (not tracks.hasColumn(Acts::hashString(kFinalMultiComponentStateColumn)))
0129 {
0130 std::string key(kFinalMultiComponentStateColumn);
0131 tracks.template addColumn<FinalMultiComponentState>(key);
0132 }
0133
0134 return fitter.fit(sourceLinks.begin(), sourceLinks.end(), initialParameters,
0135 gsfOptions, tracks);
0136 }
0137 };
0138
0139 }
0140
0141
0142
0143 class ActsGsfTrackFittingAlgorithm
0144 {
0145 public:
0146 friend class ActsTrackFittingAlgorithm;
0147
0148 std::shared_ptr<ActsTrackFittingAlgorithm::TrackFitterFunction>
0149 makeGsfFitterFunction(
0150 const std::shared_ptr<const Acts::TrackingGeometry>& trackingGeometry,
0151 std::shared_ptr<const Acts::MagneticFieldProvider> magneticField,
0152 BetheHeitlerApprox betheHeitlerApprox, std::size_t maxComponents,
0153 double weightCutoff,
0154 MixtureReductionAlgorithm finalReductionMethod, bool abortOnError,
0155 bool disableAllMaterialHandling, const Acts::Logger& logger = *Acts::getDefaultLogger("GSF", Acts::Logging::FATAL));
0156 };