File indexing completed on 2025-08-05 08:09:49
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include "ActsExamples/TrackFitting/SurfaceSortingAlgorithm.hpp"
0010
0011 #include "ActsExamples/EventData/ProtoTrack.hpp"
0012 #include "ActsExamples/EventData/SimHit.hpp"
0013 #include "ActsFatras/EventData/Hit.hpp"
0014
0015 #include <cstddef>
0016 #include <memory>
0017 #include <stdexcept>
0018 #include <utility>
0019 #include <vector>
0020
0021 namespace ActsExamples {
0022 struct AlgorithmContext;
0023 }
0024
0025 ActsExamples::SurfaceSortingAlgorithm::SurfaceSortingAlgorithm(
0026 Config cfg, Acts::Logging::Level level)
0027 : ActsExamples::IAlgorithm("SurfaceSortingAlgorithm", level),
0028 m_cfg(std::move(cfg)) {
0029 if (m_cfg.inputProtoTracks.empty()) {
0030 throw std::invalid_argument("Missing input proto track collection");
0031 }
0032 if (m_cfg.inputSimHits.empty()) {
0033 throw std::invalid_argument("Missing input simulated hits collection");
0034 }
0035 if (m_cfg.inputMeasurementSimHitsMap.empty()) {
0036 throw std::invalid_argument("Missing input measurement sim hits map");
0037 }
0038 if (m_cfg.outputProtoTracks.empty()) {
0039 throw std::invalid_argument("Missing output proto track collection");
0040 }
0041
0042 m_inputProtoTracks.initialize(m_cfg.inputProtoTracks);
0043 m_inputSimHits.initialize(m_cfg.inputSimHits);
0044 m_inputMeasurementSimHitsMap.initialize(m_cfg.inputMeasurementSimHitsMap);
0045 m_outputProtoTracks.initialize(m_cfg.outputProtoTracks);
0046 }
0047
0048 ActsExamples::ProcessCode ActsExamples::SurfaceSortingAlgorithm::execute(
0049 const ActsExamples::AlgorithmContext& ctx) const {
0050 const auto& protoTracks = m_inputProtoTracks(ctx);
0051 const auto& simHits = m_inputSimHits(ctx);
0052 const auto& simHitsMap = m_inputMeasurementSimHitsMap(ctx);
0053
0054 ProtoTrackContainer sortedTracks;
0055 sortedTracks.reserve(protoTracks.size());
0056 TrackHitList trackHitList;
0057
0058 for (std::size_t itrack = 0; itrack < protoTracks.size(); ++itrack) {
0059 const auto& protoTrack = protoTracks[itrack];
0060
0061 ProtoTrack sortedProtoTrack;
0062 sortedProtoTrack.reserve(protoTrack.size());
0063 trackHitList.clear();
0064
0065 if (protoTrack.empty()) {
0066 continue;
0067 }
0068
0069 for (const auto hit : protoTrack) {
0070 const auto simHitIndex = simHitsMap.find(hit)->second;
0071 auto simHit = simHits.nth(simHitIndex);
0072 auto simHitTime = simHit->time();
0073 trackHitList.insert(std::make_pair(simHitTime, hit));
0074 }
0075
0076
0077 for (auto const& [time, hit] : trackHitList) {
0078 sortedProtoTrack.emplace_back(hit);
0079 }
0080
0081 sortedTracks.emplace_back(std::move(sortedProtoTrack));
0082 }
0083
0084 m_outputProtoTracks(ctx, std::move(sortedTracks));
0085
0086 return ActsExamples::ProcessCode::SUCCESS;
0087 }