Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-09-29 09:09:25

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/VectorMultiTrajectory.hpp>
0007 #include <Acts/EventData/VectorTrackContainer.hpp>
0008 #include <Acts/Geometry/TrackingGeometry.hpp>
0009 #include <Acts/MagneticField/MagneticFieldProvider.hpp>
0010 #include <Acts/TrackFinding/CombinatorialKalmanFilter.hpp>
0011 #include <Acts/TrackFinding/MeasurementSelector.hpp>
0012 #include <Acts/Utilities/Logger.hpp>
0013 #include <Acts/Utilities/Result.hpp>
0014 #include <ActsExamples/EventData/Track.hpp>
0015 #include <algorithms/algorithm.h>
0016 #include <edm4eic/Measurement2DCollection.h>
0017 #include <edm4eic/TrackSeedCollection.h>
0018 #include <Eigen/Core>
0019 #include <memory>
0020 #include <string>
0021 #include <string_view>
0022 #include <vector>
0023 
0024 #include "CKFTrackingConfig.h"
0025 #include "algorithms/interfaces/ActsSvc.h"
0026 #include "algorithms/interfaces/WithPodConfig.h"
0027 #include "algorithms/tracking/ActsGeometryProvider.h"
0028 
0029 namespace eicrecon {
0030 
0031 using CKFTrackingAlgorithm = algorithms::Algorithm<
0032     algorithms::Input<edm4eic::TrackSeedCollection, edm4eic::Measurement2DCollection>,
0033     algorithms::Output<Acts::ConstVectorMultiTrajectory*, Acts::ConstVectorTrackContainer*>>;
0034 
0035 /** Fitting algorithm implementation .
0036  *
0037  * \ingroup tracking
0038  */
0039 
0040 class CKFTracking : public CKFTrackingAlgorithm, 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   using TrackFinderOptions = Acts::CombinatorialKalmanFilterOptions<ActsExamples::TrackContainer>;
0045   using TrackFinderResult  = Acts::Result<std::vector<ActsExamples::TrackContainer::TrackProxy>>;
0046 
0047   /// Find function that takes the above parameters
0048   /// @note This is separated into a virtual interface to keep compilation units
0049   /// small
0050   class CKFTrackingFunction {
0051   public:
0052     virtual ~CKFTrackingFunction() = default;
0053 
0054     virtual TrackFinderResult operator()(const ActsExamples::TrackParameters&,
0055                                          const TrackFinderOptions&,
0056                                          ActsExamples::TrackContainer&) const = 0;
0057   };
0058 
0059   /// Create the track finder function implementation.
0060   /// The magnetic field is intentionally given by-value since the variantresults
0061   /// contains shared_ptr anyways.
0062   static std::shared_ptr<CKFTrackingFunction>
0063   makeCKFTrackingFunction(std::shared_ptr<const Acts::TrackingGeometry> trackingGeometry,
0064                           std::shared_ptr<const Acts::MagneticFieldProvider> magneticField,
0065                           const Acts::Logger& logger);
0066 
0067   CKFTracking(std::string_view name)
0068       : CKFTrackingAlgorithm{name,
0069                              {"inputTrackParameters", "inputMeasurements"},
0070                              {"outputActsTrackStates", "outputActsTracks"},
0071                              "Combinatorial Kalman Filter track finding"} {}
0072 
0073   void init() final;
0074   void process(const Input&, const Output&) const final;
0075 
0076 private:
0077   std::shared_ptr<const Acts::Logger> m_acts_logger{nullptr};
0078   std::shared_ptr<CKFTrackingFunction> m_trackFinderFunc;
0079   std::shared_ptr<const ActsGeometryProvider> m_geoSvc{
0080       algorithms::ActsSvc::instance().acts_geometry_provider()};
0081   std::shared_ptr<const Acts::MagneticFieldProvider> m_BField{m_geoSvc->getFieldProvider()};
0082 
0083   Acts::MeasurementSelector::Config m_sourcelinkSelectorCfg;
0084 
0085   /// Private access to the logging instance
0086   const Acts::Logger& acts_logger() const { return *m_acts_logger; }
0087 };
0088 
0089 } // namespace eicrecon