Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2025-08-05 08:09:49

0001 // This file is part of the Acts project.
0002 //
0003 // Copyright (C) 2023 CERN for the benefit of the Acts project
0004 //
0005 // This Source Code Form is subject to the terms of the Mozilla Public
0006 // License, v. 2.0. If a copy of the MPL was not distributed with this
0007 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
0008 
0009 // TODO We still use some Kalman Fitter functionalities. Check for replacement
0010 
0011 #include "Acts/Definitions/Direction.hpp"
0012 #include "Acts/Definitions/TrackParametrization.hpp"
0013 #include "Acts/EventData/MultiTrajectory.hpp"
0014 #include "Acts/EventData/TrackContainer.hpp"
0015 #include "Acts/EventData/TrackStatePropMask.hpp"
0016 #include "Acts/EventData/VectorMultiTrajectory.hpp"
0017 #include "Acts/EventData/VectorTrackContainer.hpp"
0018 #include "Acts/EventData/detail/CorrectedTransformationFreeToBound.hpp"
0019 #include "Acts/Geometry/GeometryIdentifier.hpp"
0020 #include "Acts/Propagator/DirectNavigator.hpp"
0021 #include "Acts/Propagator/EigenStepper.hpp"
0022 #include "Acts/Propagator/Navigator.hpp"
0023 #include "Acts/Propagator/Propagator.hpp"
0024 #include "Acts/TrackFitting/GlobalChiSquareFitter.hpp"
0025 #include "Acts/TrackFitting/KalmanFitter.hpp"
0026 #include "Acts/Utilities/Delegate.hpp"
0027 #include "Acts/Utilities/Logger.hpp"
0028 #include "ActsExamples/EventData/IndexSourceLink.hpp"
0029 #include "ActsExamples/EventData/MeasurementCalibration.hpp"
0030 #include "ActsExamples/EventData/Track.hpp"
0031 #include "ActsExamples/TrackFitting/RefittingCalibrator.hpp"
0032 #include "ActsExamples/TrackFitting/TrackFitterFunction.hpp"
0033 
0034 #include <algorithm>
0035 #include <cmath>
0036 #include <functional>
0037 #include <memory>
0038 #include <utility>
0039 #include <vector>
0040 
0041 namespace Acts {
0042 class MagneticFieldProvider;
0043 class SourceLink;
0044 class Surface;
0045 class TrackingGeometry;
0046 }  // namespace Acts
0047 
0048 namespace {
0049 
0050 using Stepper = Acts::EigenStepper<>;
0051 using Propagator = Acts::Propagator<Stepper, Acts::Navigator>;
0052 using Fitter =
0053     Acts::Experimental::Gx2Fitter<Propagator, Acts::VectorMultiTrajectory>;
0054 using DirectPropagator = Acts::Propagator<Stepper, Acts::DirectNavigator>;
0055 using DirectFitter =
0056     Acts::KalmanFitter<DirectPropagator, Acts::VectorMultiTrajectory>;
0057 
0058 using TrackContainer =
0059     Acts::TrackContainer<Acts::VectorTrackContainer,
0060                          Acts::VectorMultiTrajectory, std::shared_ptr>;
0061 
0062 using namespace ActsExamples;
0063 
0064 struct GlobalChiSquareFitterFunctionImpl final : public TrackFitterFunction {
0065   Fitter fitter;
0066   DirectFitter directFitter;
0067 
0068   bool multipleScattering = false;
0069   bool energyLoss = false;
0070   Acts::FreeToBoundCorrection freeToBoundCorrection;
0071   std::size_t nUpdateMax = 5;
0072   bool zeroField = false;
0073   double relChi2changeCutOff = 1e-7;
0074 
0075   IndexSourceLink::SurfaceAccessor m_slSurfaceAccessor;
0076 
0077   GlobalChiSquareFitterFunctionImpl(Fitter&& f, DirectFitter&& df,
0078                                     const Acts::TrackingGeometry& trkGeo)
0079       : fitter(std::move(f)),
0080         directFitter(std::move(df)),
0081         m_slSurfaceAccessor{trkGeo} {}
0082 
0083   template <typename calibrator_t>
0084   auto makeGx2fOptions(const GeneralFitterOptions& options,
0085                        const calibrator_t& calibrator) const {
0086     Acts::Experimental::Gx2FitterExtensions<Acts::VectorMultiTrajectory>
0087         extensions;
0088     extensions.calibrator.connect<&calibrator_t::calibrate>(&calibrator);
0089 
0090     extensions.surfaceAccessor
0091         .connect<&IndexSourceLink::SurfaceAccessor::operator()>(
0092             &m_slSurfaceAccessor);
0093 
0094     const Acts::Experimental::Gx2FitterOptions gx2fOptions(
0095         options.geoContext, options.magFieldContext, options.calibrationContext,
0096         extensions, options.propOptions, &(*options.referenceSurface),
0097         multipleScattering, energyLoss, freeToBoundCorrection, nUpdateMax,
0098         zeroField, relChi2changeCutOff);
0099 
0100     return gx2fOptions;
0101   }
0102 
0103   TrackFitterResult operator()(const std::vector<Acts::SourceLink>& sourceLinks,
0104                                const TrackParameters& initialParameters,
0105                                const GeneralFitterOptions& options,
0106                                const MeasurementCalibratorAdapter& calibrator,
0107                                TrackContainer& tracks) const override {
0108     const auto gx2fOptions = makeGx2fOptions(options, calibrator);
0109     return fitter.fit(sourceLinks.begin(), sourceLinks.end(), initialParameters,
0110                       gx2fOptions, tracks);
0111   }
0112 
0113   // We need a placeholder for the directNavigator overload. Otherwise, we would
0114   // have an unimplemented pure virtual method in a final class.
0115   TrackFitterResult operator()(
0116       const std::vector<Acts::SourceLink>& /*sourceLinks*/,
0117       const TrackParameters& /*initialParameters*/,
0118       const GeneralFitterOptions& /*options*/,
0119       const RefittingCalibrator& /*calibrator*/,
0120       const std::vector<const Acts::Surface*>& /*surfaceSequence*/,
0121       TrackContainer& /*tracks*/) const override {
0122     throw std::runtime_error(
0123         "direct navigation with GX2 fitter is not implemented");
0124   }
0125 };
0126 
0127 }  // namespace
0128 
0129 std::shared_ptr<ActsExamples::TrackFitterFunction>
0130 ActsExamples::makeGlobalChiSquareFitterFunction(
0131     std::shared_ptr<const Acts::TrackingGeometry> trackingGeometry,
0132     std::shared_ptr<const Acts::MagneticFieldProvider> magneticField,
0133     bool multipleScattering, bool energyLoss,
0134     Acts::FreeToBoundCorrection freeToBoundCorrection, std::size_t nUpdateMax,
0135     bool zeroField, double relChi2changeCutOff, const Acts::Logger& logger) {
0136   // Stepper should be copied into the fitters
0137   const Stepper stepper(std::move(magneticField));
0138 
0139   // Standard fitter
0140   const auto& geo = *trackingGeometry;
0141   Acts::Navigator::Config cfg{std::move(trackingGeometry)};
0142   cfg.resolvePassive = false;
0143   cfg.resolveMaterial = true;
0144   cfg.resolveSensitive = true;
0145   Acts::Navigator navigator(cfg, logger.cloneWithSuffix("Navigator"));
0146   Propagator propagator(stepper, std::move(navigator),
0147                         logger.cloneWithSuffix("Propagator"));
0148   Fitter trackFitter(std::move(propagator), logger.cloneWithSuffix("Fitter"));
0149 
0150   // Direct fitter
0151   Acts::DirectNavigator directNavigator{
0152       logger.cloneWithSuffix("DirectNavigator")};
0153   DirectPropagator directPropagator(stepper, std::move(directNavigator),
0154                                     logger.cloneWithSuffix("DirectPropagator"));
0155   DirectFitter directTrackFitter(std::move(directPropagator),
0156                                  logger.cloneWithSuffix("DirectFitter"));
0157 
0158   // build the fitter function. owns the fitter object.
0159   auto fitterFunction = std::make_shared<GlobalChiSquareFitterFunctionImpl>(
0160       std::move(trackFitter), std::move(directTrackFitter), geo);
0161   fitterFunction->multipleScattering = multipleScattering;
0162   fitterFunction->energyLoss = energyLoss;
0163   fitterFunction->freeToBoundCorrection = freeToBoundCorrection;
0164   fitterFunction->nUpdateMax = nUpdateMax;
0165   fitterFunction->zeroField = zeroField;
0166   fitterFunction->relChi2changeCutOff = relChi2changeCutOff;
0167 
0168   return fitterFunction;
0169 }