Warning, file /EICrecon/src/algorithms/tracking/AmbiguitySolver.cc was not indexed
or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
0001
0002
0003 #include "AmbiguitySolver.h"
0004
0005 #include <Acts/AmbiguityResolution/GreedyAmbiguityResolution.hpp>
0006 #include <Acts/EventData/MeasurementHelpers.hpp>
0007 #include <Acts/EventData/SourceLink.hpp>
0008 #include <Acts/EventData/TrackStatePropMask.hpp>
0009 #include <Acts/EventData/VectorMultiTrajectory.hpp>
0010 #include <Acts/EventData/VectorTrackContainer.hpp>
0011 #include <ActsExamples/EventData/IndexSourceLink.hpp>
0012 #include <ActsExamples/EventData/Track.hpp>
0013 #include <boost/container/flat_set.hpp>
0014 #include <spdlog/common.h>
0015 #include <Eigen/Core>
0016 #include <Eigen/LU> // IWYU pragma: keep
0017 #include <any>
0018 #include <cstddef>
0019 #include <string>
0020 #include <tuple>
0021 #include <utility>
0022 #include <vector>
0023
0024 #include "Acts/Utilities/Logger.hpp"
0025 #include "AmbiguitySolverConfig.h"
0026 #include "extensions/spdlog/SpdlogFormatters.h" // IWYU pragma: keep
0027 #include "extensions/spdlog/SpdlogToActs.h"
0028
0029 namespace eicrecon {
0030
0031 Acts::GreedyAmbiguityResolution::Config
0032 transformConfig(const eicrecon::AmbiguitySolverConfig& cfg) {
0033 Acts::GreedyAmbiguityResolution::Config result;
0034 result.maximumSharedHits = cfg.maximum_shared_hits;
0035 result.maximumIterations = cfg.maximum_iterations;
0036 result.nMeasurementsMin = cfg.n_measurements_min;
0037 return result;
0038 }
0039
0040 static std::size_t sourceLinkHash(const Acts::SourceLink& a) {
0041 return static_cast<std::size_t>(a.get<ActsExamples::IndexSourceLink>().index());
0042 }
0043
0044 static bool sourceLinkEquality(const Acts::SourceLink& a, const Acts::SourceLink& b) {
0045 return a.get<ActsExamples::IndexSourceLink>().index() ==
0046 b.get<ActsExamples::IndexSourceLink>().index();
0047 }
0048
0049 void AmbiguitySolver::init() {
0050
0051 const auto spdlog_level = static_cast<spdlog::level::level_enum>(this->level());
0052 const auto acts_level = eicrecon::SpdlogToActsLevel(spdlog_level);
0053
0054
0055 m_acts_logger = Acts::getDefaultLogger("AmbiguitySolver", acts_level);
0056 m_acts_cfg = transformConfig(m_cfg);
0057 m_core = std::make_unique<Acts::GreedyAmbiguityResolution>(m_acts_cfg, acts_logger().clone());
0058 }
0059
0060 void AmbiguitySolver::process(const Input& input, const Output& output) const {
0061 const auto [input_track_states, input_tracks] = input;
0062 auto [output_track_states, output_tracks] = output;
0063
0064
0065 auto trackStateContainer =
0066 std::make_shared<Acts::ConstVectorMultiTrajectory>(*input_track_states);
0067 auto trackContainer = std::make_shared<Acts::ConstVectorTrackContainer>(*input_tracks);
0068 ActsExamples::ConstTrackContainer input_trks(trackContainer, trackStateContainer);
0069
0070 Acts::GreedyAmbiguityResolution::State state;
0071 m_core->computeInitialState(input_trks, state, &sourceLinkHash, &sourceLinkEquality);
0072 m_core->resolve(state);
0073
0074 ActsExamples::TrackContainer solvedTracks{std::make_shared<Acts::VectorTrackContainer>(),
0075 std::make_shared<Acts::VectorMultiTrajectory>()};
0076 solvedTracks.ensureDynamicColumns(input_trks);
0077
0078 for (auto iTrack : state.selectedTracks) {
0079 auto destProxy = solvedTracks.makeTrack();
0080 auto srcProxy = input_trks.getTrack(state.trackTips.at(iTrack));
0081 destProxy.copyFrom(srcProxy);
0082 }
0083
0084
0085 *output_track_states =
0086 new Acts::ConstVectorMultiTrajectory(std::move(solvedTracks.trackStateContainer()));
0087 *output_tracks = new Acts::ConstVectorTrackContainer(std::move(solvedTracks.container()));
0088 }
0089
0090 }