Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-07-26 08:22:06

0001 /** TRACCC library, part of the ACTS project (R&D line)
0002  *
0003  * (c) 2022-2026 CERN for the benefit of the ACTS project
0004  *
0005  * Mozilla Public License Version 2.0
0006  */
0007 
0008 #pragma once
0009 
0010 // Local include(s).
0011 #include "traccc/device/global_index.hpp"
0012 #include "traccc/fitting/device/fit_payload.hpp"
0013 #include "traccc/fitting/status_codes.hpp"
0014 
0015 // Project include(s).
0016 #include "traccc/edm/track_container.hpp"
0017 #include "traccc/edm/track_state_helpers.hpp"
0018 
0019 // VecMem include(s).
0020 #include <vecmem/containers/data/vector_view.hpp>
0021 
0022 namespace traccc::device {
0023 
0024 /// Payload for the @c traccc::device::fit_prelude function
0025 struct fit_prelude_payload {
0026   /// Input track parameter IDs
0027   vecmem::data::vector_view<const unsigned int> track_indices;
0028   /// Input tracks
0029   edm::track_container<default_algebra>::const_view input_tracks;
0030   /// Output tracks
0031   edm::track_container<default_algebra>::view output_tracks;
0032   /// Output track liveness
0033   vecmem::data::vector_view<unsigned int> track_liveness;
0034 
0035 };  // struct fit_prelude_payload
0036 
0037 /// Function to prepare the fitting payloads for the fitting algorithm
0038 TRACCC_HOST_DEVICE inline void fit_prelude(const global_index_t globalIndex,
0039                                            const fit_prelude_payload& payload) {
0040   edm::track_collection<default_algebra>::device tracks(
0041       payload.output_tracks.tracks);
0042 
0043   if (globalIndex >= tracks.size()) {
0044     return;
0045   }
0046 
0047   edm::track_state_collection<default_algebra>::device track_states(
0048       payload.output_tracks.states);
0049 
0050   vecmem::device_vector<const unsigned int> track_indices(
0051       payload.track_indices);
0052   vecmem::device_vector<unsigned int> track_liveness(payload.track_liveness);
0053 
0054   const unsigned int param_id = track_indices.at(globalIndex);
0055 
0056   edm::track track = tracks.at(param_id);
0057 
0058   const edm::track_collection<default_algebra>::const_device track_candidates{
0059       payload.input_tracks.tracks};
0060   const edm::track track_candidate = track_candidates.at(param_id);
0061   const auto track_candidate_constituent_links =
0062       track_candidate.constituent_links();
0063   const edm::measurement_collection::const_device measurements{
0064       payload.input_tracks.measurements};
0065   for (const edm::track_constituent_link& link :
0066        track_candidate_constituent_links) {
0067     assert(link.type == edm::track_constituent_link::measurement);
0068     const unsigned int track_state_index = track_states.push_back(
0069         edm::make_track_state<default_algebra>(measurements, link.index));
0070     track.constituent_links().push_back(
0071         {edm::track_constituent_link::track_state, track_state_index});
0072   }
0073 
0074   // TODO: Set other stuff in the header?
0075   track.params() = track_candidate.params();
0076   track_liveness.at(param_id) = 1u;
0077 }
0078 }  // namespace traccc::device