Back to home page

EIC code displayed by LXR

 
 

    


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

0001 /** TRACCC library, part of the ACTS project (R&D line)
0002  *
0003  * (c) 2025-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/utils/detray_conversion.hpp"
0012 
0013 namespace traccc::edm {
0014 
0015 template <detray::concepts::algebra algebra_t, typename measurement_backend_t>
0016 TRACCC_HOST_DEVICE detray::dpoint2D<algebra_t> get_measurement_local(
0017     const edm::measurement<measurement_backend_t>& meas) {
0018   return utils::to_dpoint2D<algebra_t>(meas.local_position());
0019 }
0020 
0021 template <detray::concepts::algebra algebra_t, typename measurement_backend_t,
0022           std::integral size_t, size_t D>
0023 TRACCC_HOST_DEVICE void get_measurement_local(
0024     const edm::measurement<measurement_backend_t>& meas,
0025     detray::dmatrix<algebra_t, D, 1>& pos) {
0026   static_assert(((D == 1u) || (D == 2u)),
0027                 "The measurement dimension must be 1 or 2");
0028 
0029   assert((meas.subspace()[0] == detray::e_bound_loc0) ||
0030          (meas.subspace()[0] == detray::e_bound_loc1));
0031 
0032   switch (meas.subspace()[0]) {
0033     case detray::e_bound_loc0:
0034       getter::element(pos, 0, 0) =
0035           static_cast<typename algebra_t::value_type>(meas.local_position()[0]);
0036       if constexpr (D == 2u) {
0037         getter::element(pos, 1, 0) =
0038             static_cast<typename algebra_t::value_type>(
0039                 meas.local_position()[1]);
0040       }
0041       break;
0042     case detray::e_bound_loc1:
0043       getter::element(pos, 0, 0) =
0044           static_cast<typename algebra_t::value_type>(meas.local_position()[1]);
0045       if constexpr (D == 2u) {
0046         getter::element(pos, 1, 0) =
0047             static_cast<typename algebra_t::value_type>(
0048                 meas.local_position()[0]);
0049       }
0050       break;
0051     default:
0052 #if defined(__GNUC__)
0053       __builtin_unreachable();
0054 #endif
0055   }
0056 }
0057 
0058 template <detray::concepts::algebra algebra_t, typename measurement_backend_t>
0059 TRACCC_HOST_DEVICE detray::dvector2D<algebra_t> get_measurement_variance(
0060     const edm::measurement<measurement_backend_t>& meas) {
0061   return utils::to_dpoint2D<algebra_t>(meas.local_variance());
0062 }
0063 
0064 template <detray::concepts::algebra algebra_t, typename measurement_backend_t,
0065           std::integral size_t, size_t D>
0066 TRACCC_HOST_DEVICE void get_measurement_covariance(
0067     const edm::measurement<measurement_backend_t>& meas,
0068     detray::dmatrix<algebra_t, D, D>& cov) {
0069   static_assert(((D == 1u) || (D == 2u)),
0070                 "The measurement dimension must be 1 or 2");
0071 
0072   assert((meas.subspace()[0] == detray::e_bound_loc0) ||
0073          (meas.subspace()[0] == detray::e_bound_loc1));
0074 
0075   switch (meas.subspace()[0]) {
0076     case detray::e_bound_loc0:
0077       getter::element(cov, 0, 0) =
0078           static_cast<typename algebra_t::value_type>(meas.local_variance()[0]);
0079       if constexpr (D == 2u) {
0080         getter::element(cov, 0, 1) = 0.f;
0081         getter::element(cov, 1, 0) = 0.f;
0082         getter::element(cov, 1, 1) =
0083             static_cast<typename algebra_t::value_type>(
0084                 meas.local_variance()[1]);
0085       }
0086       break;
0087     case detray::e_bound_loc1:
0088       getter::element(cov, 0, 0) =
0089           static_cast<typename algebra_t::value_type>(meas.local_variance()[1]);
0090       if constexpr (D == 2u) {
0091         getter::element(cov, 0, 1) = 0.f;
0092         getter::element(cov, 1, 0) = 0.f;
0093         getter::element(cov, 1, 1) =
0094             static_cast<typename algebra_t::value_type>(
0095                 meas.local_variance()[0]);
0096       }
0097       break;
0098     default:
0099 #if defined(__GNUC__)
0100       __builtin_unreachable();
0101 #endif
0102   }
0103 }
0104 
0105 }  // namespace traccc::edm