Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-08-05 08:28:51

0001 // SPDX-License-Identifier: LGPL-3.0-or-later
0002 // Copyright (C) 2023  - 2025 Joe Osborn, Dmitry Romanov, Wouter Deconinck// Created by Dmitry Romanov
0003 
0004 #pragma once
0005 
0006 #include <Acts/EventData/Seed.hpp>
0007 #include <Acts/EventData/SpacePointContainer.hpp>
0008 #include <Acts/Seeding/SeedFilterConfig.hpp>
0009 #include <Acts/Seeding/SeedFinderConfig.hpp>
0010 #include <Acts/Seeding/SeedFinderOrthogonalConfig.hpp>
0011 #include <Acts/Utilities/HashedString.hpp>
0012 #include <Acts/Utilities/Holders.hpp>
0013 #if __has_include(<ActsExamples/EventData/SpacePointContainer.hpp>)
0014 #include <ActsExamples/EventData/SpacePointContainer.hpp>
0015 #else
0016 #include <any>
0017 #include <stdexcept>
0018 #endif
0019 #include <algorithms/algorithm.h>
0020 #include <edm4eic/TrackParametersCollection.h>
0021 #include <edm4eic/TrackSeedCollection.h>
0022 #include <edm4eic/TrackerHitCollection.h>
0023 #include <cmath>
0024 #include <cstddef>
0025 #include <iterator>
0026 #include <memory>
0027 #include <optional>
0028 #include <string>
0029 #include <string_view>
0030 #include <tuple>
0031 #include <utility>
0032 #include <variant>
0033 #include <vector>
0034 
0035 #include "ActsGeometryProvider.h"
0036 #include "OrthogonalTrackSeedingConfig.h"
0037 #include "SpacePoint.h"
0038 #include "algorithms/interfaces/ActsSvc.h"
0039 #include "algorithms/interfaces/WithPodConfig.h"
0040 
0041 namespace eicrecon {
0042 
0043 #if !__has_include(<ActsExamples/EventData/SpacePointContainer.hpp>)
0044 /// Adapter to wrap a collection of space points for use with Acts::SpacePointContainer.
0045 /// This replaces ActsExamples::SpacePointContainer<T>, which was removed in Acts >= 46
0046 /// (see https://github.com/acts-project/acts/pull/5088).
0047 template <typename collection_t> class SpacePointContainerAdapter {
0048 public:
0049   using CollectionType = collection_t;
0050   using ValueType      = typename CollectionType::value_type;
0051 
0052   friend class Acts::SpacePointContainer<SpacePointContainerAdapter<collection_t>,
0053                                          Acts::detail::RefHolder>;
0054 
0055   SpacePointContainerAdapter() = delete;
0056   explicit SpacePointContainerAdapter(CollectionType& container) : m_storage(container) {}
0057 
0058 private:
0059   std::size_t size_impl() const { return storage().size(); }
0060   float x_impl(std::size_t idx) const { return storage()[idx]->x(); }
0061   float y_impl(std::size_t idx) const { return storage()[idx]->y(); }
0062   float z_impl(std::size_t idx) const { return storage()[idx]->z(); }
0063   float varianceR_impl(std::size_t idx) const { return storage()[idx]->varianceR(); }
0064   float varianceZ_impl(std::size_t idx) const { return storage()[idx]->varianceZ(); }
0065   const ValueType& get_impl(std::size_t idx) const { return storage()[idx]; }
0066   std::any component_impl(Acts::HashedString /*key*/, std::size_t /*n*/) const {
0067     throw std::runtime_error(
0068         "SpacePointContainerAdapter does not support detailed double measurement "
0069         "information (useDetailedDoubleMeasurementInfo). Use Acts::SpacePointContainer2 "
0070         "if this feature is required.");
0071   }
0072 
0073   const CollectionType& storage() const { return *m_storage; }
0074 
0075   Acts::detail::RefHolder<CollectionType> m_storage;
0076 };
0077 #endif
0078 
0079 using TrackSeedingAlgorithm = algorithms::Algorithm<
0080     algorithms::Input<edm4eic::TrackerHitCollection>,
0081     algorithms::Output<edm4eic::TrackSeedCollection, edm4eic::TrackParametersCollection>>;
0082 
0083 class TrackSeeding : public TrackSeedingAlgorithm,
0084                      public WithPodConfig<OrthogonalTrackSeedingConfig> {
0085 public:
0086 #if __has_include(<ActsExamples/EventData/SpacePointContainer.hpp>)
0087   using SpacePointContainerType = ActsExamples::SpacePointContainer<std::vector<const SpacePoint*>>;
0088 #else
0089   using SpacePointContainerType = SpacePointContainerAdapter<std::vector<const SpacePoint*>>;
0090 #endif
0091   using proxy_type =
0092       typename Acts::SpacePointContainer<SpacePointContainerType,
0093                                          Acts::detail::RefHolder>::SpacePointProxyType;
0094 
0095   TrackSeeding(std::string_view name)
0096       : TrackSeedingAlgorithm{name,
0097                               {"inputTrackerHits"},
0098                               {"outputTrackParameters"},
0099                               "create track seeds from tracker hits"} {}
0100 
0101   void init() final;
0102   void process(const Input&, const Output&) const final;
0103 
0104 private:
0105   const algorithms::ActsSvc& m_actsSvc{algorithms::ActsSvc::instance()};
0106   const std::shared_ptr<const ActsGeometryProvider> m_geoSvc{m_actsSvc.acts_geometry_provider()};
0107 
0108   Acts::SeedFilterConfig m_seedFilterConfig;
0109   Acts::SeedFinderOptions m_seedFinderOptions;
0110   Acts::SeedFinderOrthogonalConfig<proxy_type> m_seedFinderConfig;
0111 
0112   static int determineCharge(std::vector<std::pair<float, float>>& positions,
0113                              const std::pair<float, float>& PCA,
0114                              std::tuple<float, float, float>& RX0Y0);
0115   static std::pair<float, float> findPCA(std::tuple<float, float, float>& circleParams);
0116   static std::vector<const eicrecon::SpacePoint*>
0117   getSpacePoints(const edm4eic::TrackerHitCollection& trk_hits);
0118   std::optional<edm4eic::MutableTrackParameters>
0119   estimateTrackParamsFromSeed(const Acts::Seed<SpacePoint>& seed) const;
0120 
0121   static std::tuple<float, float, float> circleFit(std::vector<std::pair<float, float>>& positions);
0122   static std::tuple<float, float> lineFit(std::vector<std::pair<float, float>>& positions);
0123 };
0124 } // namespace eicrecon