File indexing completed on 2026-07-26 08:21:59
0001
0002
0003
0004
0005
0006
0007
0008 #pragma once
0009
0010
0011 #include "traccc/edm/measurement_collection.hpp"
0012 #include "traccc/edm/track_collection.hpp"
0013 #include "traccc/edm/track_container.hpp"
0014 #include "traccc/edm/track_state_collection.hpp"
0015 #include "traccc/edm/track_state_helpers.hpp"
0016 #include "traccc/fitting/status_codes.hpp"
0017
0018
0019 #include <vecmem/memory/memory_resource.hpp>
0020 #include <vecmem/utils/copy.hpp>
0021
0022 namespace traccc::host::details {
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035 template <typename algebra_t, typename fitter_t>
0036 typename edm::track_container<algebra_t>::host triplet_fitting(
0037 fitter_t& fitter,
0038 const typename edm::track_container<algebra_t>::const_view& track_container,
0039 vecmem::memory_resource& mr, vecmem::copy& copy) {
0040
0041 const edm::measurement_collection::const_device measurements{
0042 track_container.measurements};
0043 const typename edm::track_collection<algebra_t>::const_device
0044 track_candidates{track_container.tracks};
0045
0046
0047 typename edm::track_container<algebra_t>::host result{
0048 mr, track_container.measurements};
0049
0050
0051 for (unsigned int i = 0; i < track_candidates.size(); ++i) {
0052
0053 result.tracks.push_back({});
0054 auto fitted_track = result.tracks.at(result.tracks.size() - 1);
0055
0056
0057 vecmem::vector<unsigned int> measurement_idx;
0058
0059
0060 for (const edm::track_constituent_link& link :
0061 track_candidates.constituent_links().at(i)) {
0062 assert(link.type ==
0063 edm::track_constituent_link::measurement);
0064
0065
0066 measurement_idx.push_back(link.index);
0067 }
0068
0069 vecmem::data::vector_buffer<detray::geometry::identifier> seqs_buffer{};
0070 copy.setup(seqs_buffer)->wait();
0071
0072
0073 fitter.make_triplets(measurement_idx, measurements);
0074
0075
0076 auto first_state = fitter.fit(fitted_track, measurements);
0077
0078
0079 unsigned state_counter = 0;
0080 for (const edm::track_constituent_link& link :
0081 track_candidates.constituent_links().at(i)) {
0082 assert(link.type ==
0083 edm::track_constituent_link::measurement);
0084
0085
0086
0087 fitted_track.constituent_links().push_back(
0088 {edm::track_constituent_link::track_state,
0089 static_cast<unsigned int>(result.states.size())});
0090
0091
0092 if (state_counter == 0) {
0093 result.states.push_back(first_state);
0094 }
0095
0096 else {
0097
0098 result.states.push_back(
0099 edm::make_track_state<algebra_t>(measurements, link.index));
0100 }
0101 ++state_counter;
0102 }
0103 }
0104
0105
0106 return result;
0107 }
0108
0109 }