Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2025-08-05 08:09:49

0001 // This file is part of the Acts project.
0002 //
0003 // Copyright (C) 2020 CERN for the benefit of the Acts project
0004 //
0005 // This Source Code Form is subject to the terms of the Mozilla Public
0006 // License, v. 2.0. If a copy of the MPL was not distributed with this
0007 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
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 }  // namespace ActsExamples
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     /// Map will now be sorted by truth hit time
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 }