File indexing completed on 2024-09-27 07:03:01
0001
0002
0003 #include "AmbiguitySolver.h"
0004
0005 #include <Acts/AmbiguityResolution/GreedyAmbiguityResolution.hpp>
0006 #include <Acts/EventData/GenericBoundTrackParameters.hpp>
0007 #include <Acts/EventData/MultiTrajectory.hpp>
0008 #include <Acts/EventData/ParticleHypothesis.hpp>
0009 #include <Acts/EventData/SourceLink.hpp>
0010 #include <Acts/EventData/TrackContainer.hpp>
0011 #include <Acts/EventData/TrackProxy.hpp>
0012 #include <Acts/EventData/TrackStatePropMask.hpp>
0013 #include <Acts/EventData/VectorMultiTrajectory.hpp>
0014 #include <Acts/EventData/VectorTrackContainer.hpp>
0015 #include <Acts/Surfaces/Surface.hpp>
0016 #include <ActsExamples/EventData/IndexSourceLink.hpp>
0017 #include <ActsExamples/EventData/Track.hpp>
0018 #include <ActsExamples/EventData/Trajectories.hpp>
0019 #include <boost/container/flat_set.hpp>
0020 #include <boost/container/vector.hpp>
0021 #include <edm4eic/Measurement2DCollection.h>
0022 #include <Eigen/Core>
0023 #include <cstddef>
0024 #include <functional>
0025 #include <utility>
0026
0027 #include "Acts/Utilities/Logger.hpp"
0028 #include "AmbiguitySolverConfig.h"
0029 #include "extensions/spdlog/SpdlogFormatters.h" // IWYU pragma: keep
0030 #include "extensions/spdlog/SpdlogToActs.h"
0031
0032 namespace eicrecon {
0033
0034 Acts::GreedyAmbiguityResolution::Config
0035 transformConfig(const eicrecon::AmbiguitySolverConfig& cfg) {
0036 Acts::GreedyAmbiguityResolution::Config result;
0037 result.maximumSharedHits = cfg.maximum_shared_hits;
0038 result.maximumIterations = cfg.maximum_iterations;
0039 result.nMeasurementsMin = cfg.n_measurements_min;
0040 return result;
0041 }
0042
0043 static std::size_t sourceLinkHash(const Acts::SourceLink& a) {
0044 return static_cast<std::size_t>(a.get<ActsExamples::IndexSourceLink>().index());
0045 }
0046
0047 static bool sourceLinkEquality(const Acts::SourceLink& a, const Acts::SourceLink& b) {
0048 return a.get<ActsExamples::IndexSourceLink>().index() ==
0049 b.get<ActsExamples::IndexSourceLink>().index();
0050 }
0051
0052
0053 AmbiguitySolver::AmbiguitySolver() {}
0054
0055
0056 void AmbiguitySolver::init(std::shared_ptr<spdlog::logger> log) {
0057
0058 m_log = log;
0059 m_acts_logger = eicrecon::getSpdlogLogger("AmbiguitySolver", m_log);
0060 m_acts_cfg = transformConfig(m_cfg);
0061 m_core = std::make_unique<Acts::GreedyAmbiguityResolution>(m_acts_cfg, logger().clone());
0062 }
0063
0064
0065 std::tuple<std::vector<ActsExamples::ConstTrackContainer*>, std::vector<ActsExamples::Trajectories*>>
0066 AmbiguitySolver::process(std::vector<const ActsExamples::ConstTrackContainer*> input_container,
0067 const edm4eic::Measurement2DCollection& meas2Ds) {
0068
0069
0070
0071 std::vector<ActsExamples::Trajectories*> output_trajectories;
0072 std::vector<ActsExamples::ConstTrackContainer*> output_tracks;
0073
0074 auto& input_trks = input_container.front();
0075 Acts::GreedyAmbiguityResolution::State state;
0076 m_core->computeInitialState(*input_trks, state, &sourceLinkHash, &sourceLinkEquality);
0077 m_core->resolve(state);
0078
0079 ActsExamples::TrackContainer solvedTracks{std::make_shared<Acts::VectorTrackContainer>(),
0080 std::make_shared<Acts::VectorMultiTrajectory>()};
0081 solvedTracks.ensureDynamicColumns(*input_trks);
0082
0083 for (auto iTrack : state.selectedTracks) {
0084
0085 auto destProxy = solvedTracks.getTrack(solvedTracks.addTrack());
0086 auto srcProxy = input_trks->getTrack(state.trackTips.at(iTrack));
0087 destProxy.copyFrom(srcProxy, false);
0088 destProxy.tipIndex() = srcProxy.tipIndex();
0089
0090 }
0091
0092 output_tracks.push_back(new ActsExamples::ConstTrackContainer(
0093 std::make_shared<Acts::ConstVectorTrackContainer>(std::move(solvedTracks.container())),
0094 input_trks->trackStateContainerHolder()));
0095
0096
0097 ActsExamples::Trajectories::IndexedParameters parameters;
0098 std::vector<Acts::MultiTrajectoryTraits::IndexType> tips;
0099
0100 for (const auto& track : *(output_tracks.front())) {
0101
0102 tips.clear();
0103 parameters.clear();
0104
0105 tips.push_back(track.tipIndex());
0106 parameters.emplace(
0107 std::pair{track.tipIndex(),
0108 ActsExamples::TrackParameters{track.referenceSurface().getSharedPtr(),
0109 track.parameters(), track.covariance(),
0110 track.particleHypothesis()}});
0111
0112 output_trajectories.push_back(new ActsExamples::Trajectories(
0113 ((*output_tracks.front())).trackStateContainer(),
0114 tips, parameters));
0115
0116 }
0117
0118 return std::make_tuple(std::move(output_tracks), std::move(output_trajectories));
0119 }
0120
0121 }