Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-07-26 08:21:59

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 // Project include(s).
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 // VecMem include(s).
0019 #include <vecmem/memory/memory_resource.hpp>
0020 #include <vecmem/utils/copy.hpp>
0021 
0022 namespace traccc::host::details {
0023 
0024 /// Specialization for Triplet-based track fitting
0025 ///
0026 ///
0027 /// @param[in] fitter           The triplet fitter object to use on the track
0028 /// candidates
0029 /// @param[in] track_container  Input track container
0030 /// @param[in] mr               Memory resource to use for the output container
0031 /// @param[in] copy             Copy object
0032 ///
0033 /// @return A container of the fitted track states
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   // Get the input collections(s).
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   // Create the output container.
0047   typename edm::track_container<algebra_t>::host result{
0048       mr, track_container.measurements};
0049 
0050   // Iterate over the tracks.
0051   for (unsigned int i = 0; i < track_candidates.size(); ++i) {
0052     // make empty track
0053     result.tracks.push_back({});
0054     auto fitted_track = result.tracks.at(result.tracks.size() - 1);
0055 
0056     // Input measurement indices to fitting
0057     vecmem::vector<unsigned int> measurement_idx;
0058 
0059     // Loop over links (measurements) in track candidate
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);  // all links are
0064                                                          // measurements
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     // Make triplets
0073     fitter.make_triplets(measurement_idx, measurements);
0074 
0075     // Run fitter
0076     auto first_state = fitter.fit(fitted_track, measurements);
0077 
0078     // Save track states in result
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);  // all links are
0084                                                          // measurements
0085 
0086       // make link in the track
0087       fitted_track.constituent_links().push_back(
0088           {edm::track_constituent_link::track_state,
0089            static_cast<unsigned int>(result.states.size())});
0090 
0091       // use fitted state
0092       if (state_counter == 0) {
0093         result.states.push_back(first_state);
0094       }
0095 
0096       else {
0097         // make a state from the measurement
0098         result.states.push_back(
0099             edm::make_track_state<algebra_t>(measurements, link.index));
0100       }
0101       ++state_counter;
0102     }
0103   }
0104 
0105   // Return the result container.
0106   return result;
0107 }
0108 
0109 }  // namespace traccc::host::details