File indexing completed on 2026-05-27 07:24:23
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include "detray/tracks/free_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 vector3 = test::vector3;
0023 using point3 = test::point3;
0024
0025 using free_vector_t = typename free_track_parameters<test_algebra>::vector_type;
0026
0027 constexpr scalar tol{1e-5f};
0028
0029 GTEST_TEST(detray_tracks, free_track_parameters) {
0030 constexpr scalar charge = -1.f;
0031
0032 point3 pos = {4.f, 10.f, 2.f};
0033 scalar time = 0.1f;
0034 vector3 mom = {10.f, 20.f, 30.f};
0035 vector3 norm_mom = vector::normalize(mom);
0036
0037 auto free_vec = matrix::zero<free_vector_t>();
0038 getter::element(free_vec, e_free_pos0, 0u) = pos[0];
0039 getter::element(free_vec, e_free_pos1, 0u) = pos[1];
0040 getter::element(free_vec, e_free_pos2, 0u) = pos[2];
0041 getter::element(free_vec, e_free_time, 0u) = time;
0042 getter::element(free_vec, e_free_dir0, 0u) = norm_mom[0];
0043 getter::element(free_vec, e_free_dir1, 0u) = norm_mom[1];
0044 getter::element(free_vec, e_free_dir2, 0u) = norm_mom[2];
0045 getter::element(free_vec, e_free_qoverp, 0u) = charge / vector::norm(mom);
0046
0047
0048 free_track_parameters<test_algebra> free_param1(free_vec);
0049 EXPECT_NEAR(free_param1.pos()[0], pos[0], tol);
0050 EXPECT_NEAR(free_param1.pos()[1], pos[1], tol);
0051 EXPECT_NEAR(free_param1.pos()[2], pos[2], tol);
0052 EXPECT_NEAR(free_param1.dir()[0], norm_mom[0], tol);
0053 EXPECT_NEAR(free_param1.dir()[1], norm_mom[1], tol);
0054 EXPECT_NEAR(free_param1.dir()[2], norm_mom[2], tol);
0055 EXPECT_NEAR(free_param1.time(), time, tol);
0056 EXPECT_NEAR(free_param1.qop(), charge / vector::norm(mom), tol);
0057
0058 EXPECT_NEAR(vector::norm(free_param1.mom(charge)), vector::norm(mom), tol);
0059 EXPECT_NEAR(free_param1.pT(charge), vector::perp(mom), tol);
0060 EXPECT_NEAR(free_param1.qopT(), charge / free_param1.pT(charge), tol);
0061 EXPECT_NEAR(free_param1.pz(charge), mom[2], tol);
0062 EXPECT_NEAR(free_param1.qopz(), charge / free_param1.pz(charge), tol);
0063 EXPECT_NEAR(free_param1.mom(charge)[0],
0064 free_param1.p(charge) * free_param1.dir()[0], tol);
0065 EXPECT_NEAR(free_param1.mom(charge)[1],
0066 free_param1.p(charge) * free_param1.dir()[1], tol);
0067 EXPECT_NEAR(free_param1.mom(charge)[2],
0068 free_param1.p(charge) * free_param1.dir()[2], tol);
0069
0070
0071 free_track_parameters<test_algebra> free_param2(pos, time, mom, charge);
0072 EXPECT_NEAR(free_param2.pos()[0], pos[0], tol);
0073 EXPECT_NEAR(free_param2.pos()[1], pos[1], tol);
0074 EXPECT_NEAR(free_param2.pos()[2], pos[2], tol);
0075 EXPECT_NEAR(free_param2.dir()[0], norm_mom[0], tol);
0076 EXPECT_NEAR(free_param2.dir()[1], norm_mom[1], tol);
0077 EXPECT_NEAR(free_param2.dir()[2], norm_mom[2], tol);
0078 EXPECT_NEAR(free_param2.time(), time, tol);
0079 EXPECT_NEAR(free_param2.qop(), charge / vector::norm(mom), tol);
0080
0081 EXPECT_NEAR(vector::norm(free_param2.mom(charge)), vector::norm(mom), tol);
0082 EXPECT_NEAR(free_param2.pT(charge), vector::perp(mom), tol);
0083 EXPECT_NEAR(free_param2.mom(charge)[0],
0084 free_param2.p(charge) * free_param2.dir()[0], tol);
0085 EXPECT_NEAR(free_param2.mom(charge)[1],
0086 free_param2.p(charge) * free_param2.dir()[1], tol);
0087 EXPECT_NEAR(free_param2.mom(charge)[2],
0088 free_param2.p(charge) * free_param2.dir()[2], tol);
0089
0090 EXPECT_TRUE(free_param2 == free_param1);
0091
0092
0093 pos = {1.f, 2.f, 3.f};
0094 time = 0.5f;
0095 const vector3 dir{vector::normalize(vector3{40.f, 50.f, 60.f})};
0096 const scalar qop{0.634f};
0097
0098 free_param2.set_pos(pos);
0099 free_param2.set_dir(dir);
0100 free_param2.set_time(time);
0101 free_param2.set_qop(qop);
0102
0103 EXPECT_NEAR(free_param2[e_free_pos0], pos[0], tol);
0104 EXPECT_NEAR(free_param2[e_free_pos1], pos[1], tol);
0105 EXPECT_NEAR(free_param2[e_free_pos2], pos[2], tol);
0106 EXPECT_NEAR(free_param2[e_free_time], time, tol);
0107 EXPECT_NEAR(free_param2[e_free_dir0], dir[0], tol);
0108 EXPECT_NEAR(free_param2[e_free_dir1], dir[1], tol);
0109 EXPECT_NEAR(free_param2[e_free_dir2], dir[2], tol);
0110 EXPECT_NEAR(free_param2[e_free_qoverp], qop, tol);
0111 }