Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2024-09-28 07:03:49

0001 // SPDX-License-Identifier: LGPL-3.0-or-later
0002 // Copyright (C) 2022 Whitney Armstrong, Wouter Deconinck
0003 
0004 #ifndef JUGGLER_JUGRECO_CKFTracking_HH
0005 #define JUGGLER_JUGRECO_CKFTracking_HH
0006 
0007 #include <functional>
0008 #include <random>
0009 #include <stdexcept>
0010 #include <vector>
0011 
0012 #include "Gaudi/Property.h"
0013 #include "GaudiAlg/GaudiAlgorithm.h"
0014 #include "GaudiKernel/ToolHandle.h"
0015 
0016 #include <k4FWCore/DataHandle.h>
0017 #include <k4Interface/IGeoSvc.h>
0018 #include "JugTrack/IActsGeoSvc.h"
0019 #include "JugTrack/DD4hepBField.h"
0020 #include "ActsExamples/EventData/GeometryContainers.hpp"
0021 #include "ActsExamples/EventData/Index.hpp"
0022 #include "ActsExamples/EventData/IndexSourceLink.hpp"
0023 #include "ActsExamples/EventData/Measurement.hpp"
0024 #include "ActsExamples/EventData/Track.hpp"
0025 #include "ActsExamples/EventData/Trajectories.hpp"
0026 
0027 #include "edm4eic/TrackerHitCollection.h"
0028 
0029 #include "Acts/Definitions/Common.hpp"
0030 #include "Acts/Geometry/TrackingGeometry.hpp"
0031 #include "Acts/TrackFinding/CombinatorialKalmanFilter.hpp"
0032 #include "Acts/TrackFinding/MeasurementSelector.hpp"
0033 
0034 namespace Jug::Reco {
0035 
0036 /** Fitting algorithm implmentation .
0037  *
0038  * \ingroup tracking
0039  */
0040 class CKFTracking : public GaudiAlgorithm {
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 =
0045       Acts::CombinatorialKalmanFilterOptions<ActsExamples::IndexSourceLinkAccessor::Iterator,
0046                                              Acts::VectorMultiTrajectory>;
0047   using TrackFinderResult =
0048       Acts::Result<std::vector<ActsExamples::TrackContainer::TrackProxy>>;
0049 
0050   /// Find function that takes the above parameters
0051   /// @note This is separated into a virtual interface to keep compilation units
0052   /// small
0053   class CKFTrackingFunction {
0054    public:
0055     virtual ~CKFTrackingFunction() = default;
0056     virtual TrackFinderResult operator()(const ActsExamples::TrackParameters&,
0057                                          const TrackFinderOptions&,
0058                                          ActsExamples::TrackContainer&) const = 0;
0059   };
0060 
0061   /// Create the track finder function implementation.
0062   /// The magnetic field is intentionally given by-value since the variant
0063   /// contains shared_ptr anyways.
0064   static std::shared_ptr<CKFTrackingFunction> makeCKFTrackingFunction(
0065     std::shared_ptr<const Acts::TrackingGeometry> trackingGeometry,
0066     std::shared_ptr<const Acts::MagneticFieldProvider> magneticField);
0067 
0068 public:
0069   DataHandle<ActsExamples::IndexSourceLinkContainer> m_inputSourceLinks{"inputSourceLinks", Gaudi::DataHandle::Reader, this};
0070   DataHandle<ActsExamples::MeasurementContainer> m_inputMeasurements{"inputMeasurements", Gaudi::DataHandle::Reader, this};
0071   DataHandle<ActsExamples::TrackParametersContainer> m_inputInitialTrackParameters{"inputInitialTrackParameters",
0072                                                                      Gaudi::DataHandle::Reader, this};
0073   DataHandle<ActsExamples::ConstTrackContainer> m_outputTracks{"outputTracks", Gaudi::DataHandle::Writer, this};
0074   DataHandle<ActsExamples::TrajectoriesContainer> m_outputTrajectories{"outputTrajectories", Gaudi::DataHandle::Writer, this};
0075 
0076   Gaudi::Property<std::vector<double>> m_etaBins{this, "etaBins", {}};
0077   Gaudi::Property<std::vector<double>> m_chi2CutOff{this, "chi2CutOff", {15.}};
0078   Gaudi::Property<std::vector<size_t>> m_numMeasurementsCutOff{this, "numMeasurementsCutOff", {10}};
0079 
0080   std::shared_ptr<CKFTrackingFunction> m_trackFinderFunc;
0081   SmartIF<IGeoSvc> m_geoSvc;
0082   SmartIF<IActsGeoSvc> m_actsGeoSvc;
0083 
0084   std::shared_ptr<const Jug::BField::DD4hepBField> m_BField = nullptr;
0085   Acts::GeometryContext m_geoctx;
0086   Acts::CalibrationContext m_calibctx;
0087   Acts::MagneticFieldContext m_fieldctx;
0088 
0089   Acts::MeasurementSelector::Config m_sourcelinkSelectorCfg;
0090   Acts::Logging::Level m_actsLoggingLevel = Acts::Logging::INFO;
0091 
0092   CKFTracking(const std::string& name, ISvcLocator* svcLoc);
0093 
0094   StatusCode initialize() override;
0095 
0096   StatusCode execute() override;
0097 };
0098 
0099 } // namespace Jug::Reco
0100 
0101 #endif