Back to home page

sPhenix code displayed by LXR

 
 

    


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 // needed for local Act compilation
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       // cppcheck-suppress constStatement
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 }  // namespace
0140 
0141 // Have a separate class befriend the main class to ensure that GSF specific
0142 // track fitting headers only stay here to avoid library clashes
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 };