File indexing completed on 2026-05-27 07:24:23
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include "detray/tracks/bound_track_parameters.hpp"
0011
0012
0013 #include "detray/test/framework/types.hpp"
0014
0015
0016 #include <gtest/gtest.h>
0017
0018 using namespace detray;
0019
0020 using test_algebra = test::algebra;
0021 using scalar = test::scalar;
0022 using point2 = test::point2;
0023 using vector3 = test::vector3;
0024 using point3 = test::point3;
0025
0026 using covariance_t =
0027 typename bound_track_parameters<test_algebra>::covariance_type;
0028
0029 constexpr scalar tol{1e-5f};
0030
0031 GTEST_TEST(detray_tracks, bound_track_parameters) {
0032 constexpr scalar charge = -1.f;
0033
0034
0035 dindex sf_idx1 = 0u;
0036 point2 bound_local{1.f, 2.f};
0037 scalar phi{0.1f};
0038 scalar theta{0.2f};
0039 scalar qop{-0.1f};
0040 scalar t{0.1f};
0041
0042
0043 bound_parameters_vector<test_algebra> bound_vec1{bound_local, phi, theta, qop,
0044 t};
0045
0046 auto bound_cov1 = matrix::zero<covariance_t>();
0047
0048 bound_track_parameters<test_algebra> bound_param1(
0049 geometry::identifier{}.set_index(sf_idx1), bound_vec1, bound_cov1);
0050 EXPECT_NEAR(bound_param1.pT(charge),
0051 1.f / std::abs(bound_vec1.qop()) * std::sin(bound_vec1.theta()),
0052 tol);
0053 EXPECT_NEAR(bound_param1.qopT(), -1.f / bound_param1.pT(charge), tol);
0054 EXPECT_NEAR(bound_param1.pz(charge),
0055 1.f / std::abs(bound_vec1.qop()) * std::cos(bound_vec1.theta()),
0056 tol);
0057 EXPECT_NEAR(bound_param1.qopz(), -1.f / bound_param1.pz(charge), tol);
0058
0059
0060 dindex sf_idx2 = 1u;
0061 bound_local = {4.f, 20.f};
0062 phi = 0.8f;
0063 theta = 1.4f;
0064 qop = -1.f;
0065 t = 0.f;
0066
0067 bound_parameters_vector<test_algebra> bound_vec2{bound_local, phi, theta, qop,
0068 t};
0069
0070 auto bound_cov2 = matrix::zero<covariance_t>();
0071
0072 bound_track_parameters<test_algebra> bound_param2(
0073 geometry::identifier{}.set_index(sf_idx2), bound_vec2, bound_cov2);
0074 bound_track_parameters<test_algebra> bound_param3(
0075 geometry::identifier{}.set_index(sf_idx2), bound_vec2, bound_cov2);
0076
0077
0078
0079
0080 EXPECT_NEAR(bound_param1.bound_local()[0], bound_vec1.bound_local()[0], tol);
0081 EXPECT_NEAR(bound_param1.bound_local()[1], bound_vec1.bound_local()[1], tol);
0082 EXPECT_NEAR(bound_param1.phi(), bound_vec1.phi(), tol);
0083 EXPECT_NEAR(bound_param1.theta(), bound_vec1.theta(), tol);
0084 EXPECT_NEAR(bound_param1.qop(), bound_vec1.qop(), tol);
0085 EXPECT_NEAR(bound_param1.time(), bound_vec1.time(), tol);
0086 EXPECT_NEAR(bound_param1.mom(charge)[0],
0087 bound_param1.p(charge) * std::sin(bound_param1.theta()) *
0088 std::cos(bound_param1.phi()),
0089 tol);
0090 EXPECT_NEAR(bound_param1.mom(charge)[1],
0091 bound_param1.p(charge) * std::sin(bound_param1.theta()) *
0092 std::sin(bound_param1.phi()),
0093 tol);
0094 EXPECT_NEAR(bound_param1.mom(charge)[2],
0095 bound_param1.p(charge) * std::cos(bound_param1.theta()), tol);
0096
0097
0098 EXPECT_NEAR(bound_param2.bound_local()[0], bound_vec2.bound_local()[0], tol);
0099 EXPECT_NEAR(bound_param2.bound_local()[1], bound_vec2.bound_local()[1], tol);
0100 EXPECT_NEAR(bound_param2.phi(), bound_vec2.phi(), tol);
0101 EXPECT_NEAR(bound_param2.theta(), bound_vec2.theta(), tol);
0102 EXPECT_NEAR(bound_param2.qop(), bound_vec2.qop(), tol);
0103 EXPECT_NEAR(bound_param2.time(), bound_vec2.time(), tol);
0104 EXPECT_NEAR(bound_param2.mom(charge)[0],
0105 bound_param2.p(charge) * std::sin(bound_param2.theta()) *
0106 std::cos(bound_param2.phi()),
0107 tol);
0108 EXPECT_NEAR(bound_param2.mom(charge)[1],
0109 bound_param2.p(charge) * std::sin(bound_param2.theta()) *
0110 std::sin(bound_param2.phi()),
0111 tol);
0112 EXPECT_NEAR(bound_param2.mom(charge)[2],
0113 bound_param2.p(charge) * std::cos(bound_param2.theta()), tol);
0114
0115 EXPECT_TRUE(!(bound_param2 == bound_param1));
0116 EXPECT_TRUE(bound_param2 == bound_param3);
0117
0118 bound_param2.set_qop(0.127f);
0119 EXPECT_FLOAT_EQ(static_cast<float>(bound_param2.qop()), 0.127f);
0120 }