Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-09-17 08:55:20

0001 // SPDX-License-Identifier: LGPL-3.0-or-later
0002 // Copyright (C) 2022 - 2024, Dmitry Romanov, Wouter Deconinck
0003 
0004 #pragma once
0005 
0006 #include <Acts/EventData/TrackParameters.hpp>
0007 #include <Acts/Geometry/GeometryContext.hpp>
0008 #include <Acts/Geometry/GeometryIdentifier.hpp>
0009 #include <Acts/MagneticField/MagneticFieldContext.hpp>
0010 #include <Acts/Surfaces/Surface.hpp>
0011 #include <Acts/Utilities/Result.hpp>
0012 #include <ActsExamples/EventData/Track.hpp>
0013 #include <ActsExamples/EventData/Trajectories.hpp>
0014 #include <DD4hep/Detector.h>
0015 #include <edm4eic/TrackCollection.h>
0016 #include <edm4eic/TrackPoint.h>
0017 #include <edm4eic/TrackSegmentCollection.h>
0018 #include <fmt/core.h>
0019 #include <fmt/format.h>
0020 #include <spdlog/logger.h>
0021 #include <cstddef>
0022 #include <memory>
0023 #include <tuple>
0024 #include <variant>
0025 #include <vector>
0026 
0027 #include "algorithms/interfaces/WithPodConfig.h"
0028 #include "algorithms/tracking/ActsGeometryProvider.h"
0029 #include "algorithms/tracking/TrackPropagationConfig.h"
0030 
0031 namespace eicrecon {
0032 
0033 using ActsTrackPropagationResult = Acts::Result<std::unique_ptr<const Acts::BoundTrackParameters>>;
0034 
0035 /** Extract the particles form fit trajectories.
0036      *
0037      * \ingroup tracking
0038      */
0039 class TrackPropagation : public eicrecon::WithPodConfig<TrackPropagationConfig> {
0040 
0041 public:
0042   /** Initialize algorithm */
0043   void init(const dd4hep::Detector* detector, std::shared_ptr<const ActsGeometryProvider> geo_svc,
0044             std::shared_ptr<spdlog::logger> logger);
0045 
0046   void process(const std::tuple<const edm4eic::TrackCollection&,
0047                                 const std::vector<const ActsExamples::Trajectories*>,
0048                                 const std::vector<const ActsExamples::ConstTrackContainer*>>
0049                    input,
0050                const std::tuple<edm4eic::TrackSegmentCollection*> output) const {
0051 
0052     const auto [tracks, acts_trajectories, acts_tracks] = input;
0053     auto [propagated_tracks]                            = output;
0054 
0055     for (std::size_t i = 0; auto traj : acts_trajectories) {
0056       auto this_propagated_track = propagated_tracks->create();
0057       if (tracks.size() == acts_trajectories.size()) {
0058         m_log->trace("track segment connected to track {}", i);
0059         this_propagated_track.setTrack(tracks[i]);
0060       }
0061       for (auto& surf : m_target_surfaces) {
0062         auto prop_point = propagate(
0063             tracks.size() == acts_trajectories.size() ? tracks[i] : edm4eic::Track{}, traj, surf);
0064         if (!prop_point)
0065           continue;
0066         prop_point->surface = surf->geometryId().layer();
0067         prop_point->system  = surf->geometryId().extra();
0068         this_propagated_track.addToPoints(*prop_point);
0069       }
0070       ++i;
0071     }
0072   }
0073 
0074   /** Propagates a single trajectory to a given surface */
0075   std::unique_ptr<edm4eic::TrackPoint>
0076   propagate(const edm4eic::Track&, const ActsExamples::Trajectories*,
0077             const std::shared_ptr<const Acts::Surface>& targetSurf) const;
0078 
0079   /** Propagates a collection of trajectories to a list of surfaces, and returns the full `TrackSegment`;
0080          * @param trajectories the input collection of trajectories
0081          * @return the resulting collection of propagated tracks
0082          */
0083   void propagateToSurfaceList(
0084       const std::tuple<const edm4eic::TrackCollection&,
0085                        const std::vector<const ActsExamples::Trajectories*>,
0086                        const std::vector<const ActsExamples::ConstTrackContainer*>>
0087           input,
0088       const std::tuple<edm4eic::TrackSegmentCollection*> output) const;
0089 
0090 private:
0091   Acts::GeometryContext m_geoContext;
0092   Acts::MagneticFieldContext m_fieldContext;
0093   std::shared_ptr<const ActsGeometryProvider> m_geoSvc;
0094   std::shared_ptr<spdlog::logger> m_log;
0095 
0096   std::vector<std::shared_ptr<Acts::Surface>> m_filter_surfaces;
0097   std::vector<std::shared_ptr<Acts::Surface>> m_target_surfaces;
0098 };
0099 } // namespace eicrecon