File indexing completed on 2026-07-26 08:21:57
0001
0002
0003
0004
0005
0006
0007
0008 #pragma once
0009
0010
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 }