Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-07-09 08:30:21

0001 // SPDX-License-Identifier: LGPL-3.0-or-later
0002 // Copyright (C) 2022 Whitney Armstrong, Wouter Deconinck
0003 
0004 #pragma once
0005 
0006 #include <Acts/EventData/TrackStatePropMask.hpp>
0007 #include <Acts/EventData/VectorMultiTrajectory.hpp>
0008 #include <Acts/Geometry/GeometryContext.hpp>
0009 #include <Acts/Geometry/TrackingGeometry.hpp>
0010 #include <Acts/MagneticField/MagneticFieldContext.hpp>
0011 #include <Acts/MagneticField/MagneticFieldProvider.hpp>
0012 #include <Acts/TrackFinding/CombinatorialKalmanFilter.hpp>
0013 #include <Acts/TrackFinding/MeasurementSelector.hpp>
0014 #include <Acts/Utilities/CalibrationContext.hpp>
0015 #include <Acts/Utilities/Logger.hpp>
0016 #include <Acts/Utilities/Result.hpp>
0017 #include <ActsExamples/EventData/IndexSourceLink.hpp>
0018 #include <ActsExamples/EventData/Track.hpp>
0019 #include <ActsExamples/EventData/Trajectories.hpp>
0020 #include <edm4eic/Measurement2DCollection.h>
0021 #include <edm4eic/TrackParametersCollection.h>
0022 #include <spdlog/logger.h>
0023 #include <memory>
0024 #include <tuple>
0025 #include <vector>
0026 
0027 #include "CKFTrackingConfig.h"
0028 #include "DD4hepBField.h"
0029 #include "algorithms/interfaces/WithPodConfig.h"
0030 
0031 class ActsGeometryProvider;
0032 
0033 namespace eicrecon {
0034 
0035 /** Fitting algorithm implementation .
0036  *
0037  * \ingroup tracking
0038  */
0039 
0040 class CKFTracking : public WithPodConfig<eicrecon::CKFTrackingConfig> {
0041 public:
0042   /// Track finder function that takes input measurements, initial trackstate
0043   /// and track finder options and returns some track-finder-specific result.
0044 #if Acts_VERSION_MAJOR >= 39
0045   using TrackFinderOptions = Acts::CombinatorialKalmanFilterOptions<ActsExamples::TrackContainer>;
0046 #elif Acts_VERSION_MAJOR >= 36
0047   using TrackFinderOptions =
0048       Acts::CombinatorialKalmanFilterOptions<ActsExamples::IndexSourceLinkAccessor::Iterator,
0049                                              ActsExamples::TrackContainer>;
0050 #else
0051   using TrackFinderOptions =
0052       Acts::CombinatorialKalmanFilterOptions<ActsExamples::IndexSourceLinkAccessor::Iterator,
0053                                              Acts::VectorMultiTrajectory>;
0054 #endif
0055   using TrackFinderResult = Acts::Result<std::vector<ActsExamples::TrackContainer::TrackProxy>>;
0056 
0057   /// Find function that takes the above parameters
0058   /// @note This is separated into a virtual interface to keep compilation units
0059   /// small
0060   class CKFTrackingFunction {
0061   public:
0062     virtual ~CKFTrackingFunction() = default;
0063 
0064     virtual TrackFinderResult operator()(const ActsExamples::TrackParameters&,
0065                                          const TrackFinderOptions&,
0066                                          ActsExamples::TrackContainer&) const = 0;
0067   };
0068 
0069   /// Create the track finder function implementation.
0070   /// The magnetic field is intentionally given by-value since the variantresults
0071   /// contains shared_ptr anyways.
0072   static std::shared_ptr<CKFTrackingFunction>
0073   makeCKFTrackingFunction(std::shared_ptr<const Acts::TrackingGeometry> trackingGeometry,
0074                           std::shared_ptr<const Acts::MagneticFieldProvider> magneticField,
0075                           const Acts::Logger& logger);
0076 
0077   CKFTracking();
0078 
0079   void init(std::shared_ptr<const ActsGeometryProvider> geo_svc,
0080             std::shared_ptr<spdlog::logger> log);
0081 
0082   std::tuple<std::vector<ActsExamples::Trajectories*>,
0083              std::vector<ActsExamples::ConstTrackContainer*>>
0084   process(const edm4eic::TrackParametersCollection& init_trk_params,
0085           const edm4eic::Measurement2DCollection& meas2Ds);
0086 
0087 private:
0088   std::shared_ptr<spdlog::logger> m_log;
0089   std::shared_ptr<const Acts::Logger> m_acts_logger{nullptr};
0090   std::shared_ptr<CKFTrackingFunction> m_trackFinderFunc;
0091   std::shared_ptr<const ActsGeometryProvider> m_geoSvc;
0092 
0093   std::shared_ptr<const eicrecon::BField::DD4hepBField> m_BField = nullptr;
0094   Acts::GeometryContext m_geoctx;
0095   Acts::CalibrationContext m_calibctx;
0096   Acts::MagneticFieldContext m_fieldctx;
0097 
0098   Acts::MeasurementSelector::Config m_sourcelinkSelectorCfg;
0099 
0100   /// Private access to the logging instance
0101   const Acts::Logger& logger() const { return *m_acts_logger; }
0102 };
0103 
0104 } // namespace eicrecon