File indexing completed on 2026-05-27 07:24:22
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include "detray/geometry/mask.hpp"
0011 #include "detray/geometry/shapes/line.hpp"
0012 #include "detray/geometry/surface_descriptor.hpp"
0013 #include "detray/navigation/intersection/intersection.hpp"
0014 #include "detray/navigation/intersection/ray_intersector.hpp"
0015 #include "detray/tracks/ray.hpp"
0016 #include "detray/tracks/tracks.hpp"
0017
0018
0019 #include "detray/test/framework/types.hpp"
0020
0021
0022 #include <gtest/gtest.h>
0023
0024
0025 #include <limits>
0026
0027 using namespace detray;
0028
0029
0030 using test_algebra = test::algebra;
0031 using transform3 = test::transform3;
0032 using vector3 = test::vector3;
0033 using point3 = test::point3;
0034 using point2 = test::point2;
0035 using scalar = test::scalar;
0036
0037 using cartesian = cartesian2D<test_algebra>;
0038 using intersection_t = intersection2D<surface_descriptor<>, test_algebra,
0039 intersection::contains_pos>;
0040 using line_intersector_type =
0041 ray_intersector<line_circular, test_algebra, true>;
0042
0043 constexpr scalar tol{1e-5f};
0044
0045
0046 GTEST_TEST(detray_intersection, line_intersector_case1) {
0047
0048 const transform3 tf{};
0049
0050
0051 std::vector<free_track_parameters<test_algebra>> trks;
0052 trks.emplace_back(point3{1.f, -1.f, 0.f}, 0.f, vector3{0.f, 1.f, 0.f}, -1.f);
0053 trks.emplace_back(point3{-1.f, -1.f, 0.f}, 0.f, vector3{0.f, 1.f, 0.f}, -1.f);
0054 trks.emplace_back(point3{1.f, -1.f, 2.f}, 0.f, vector3{0.f, 1.f, -1.f}, -1.f);
0055
0056
0057 const mask<line_circular, test_algebra> ln{
0058 0u, 10.f, std::numeric_limits<scalar>::infinity()};
0059
0060
0061 std::vector<intersection_t> is(3u);
0062 is[0] = line_intersector_type()(detail::ray(trks[0]), surface_descriptor<>{},
0063 ln, tf, tol);
0064 is[1] = line_intersector_type()(detail::ray(trks[1]), surface_descriptor<>{},
0065 ln, tf, tol);
0066 is[2] = line_intersector_type()(detail::ray(trks[2]), surface_descriptor<>{},
0067 ln, tf, tol);
0068
0069 EXPECT_TRUE(is[0].is_inside());
0070 EXPECT_EQ(is[0].path(), 1.f);
0071
0072 const point3 global0 = ln.to_global_frame(tf, is[0].local());
0073 point3 x{1.f, 0.f, 0.f};
0074 EXPECT_NEAR(global0[0], x[0], tol);
0075 EXPECT_NEAR(global0[1], x[1], tol);
0076 EXPECT_NEAR(global0[2], x[2], tol);
0077 EXPECT_EQ(is[0].local()[0], -1.f);
0078 EXPECT_EQ(is[0].local()[1], 0.f);
0079
0080 EXPECT_TRUE(is[1].is_inside());
0081 EXPECT_EQ(is[1].path(), 1.f);
0082 const auto global1 = ln.to_global_frame(tf, is[1].local());
0083 EXPECT_NEAR(global1[0], -1.f, tol);
0084 EXPECT_NEAR(global1[1], 0.f, tol);
0085 EXPECT_NEAR(global1[2], 0.f, tol);
0086 EXPECT_EQ(is[1].local()[0], 1.f);
0087 EXPECT_EQ(is[1].local()[1], 0.f);
0088
0089 EXPECT_TRUE(is[2].is_inside());
0090 EXPECT_NEAR(is[2].path(), constant<scalar>::sqrt2, tol);
0091 const auto global2 = ln.to_global_frame(tf, is[2].local());
0092 EXPECT_NEAR(global2[0], 1.f, tol);
0093 EXPECT_NEAR(global2[1], 0.f, tol);
0094 EXPECT_NEAR(global2[2], 1.f, tol);
0095 EXPECT_NEAR(is[2].local()[0], -1.f, tol);
0096 EXPECT_NEAR(is[2].local()[1], 1.f, tol);
0097 }
0098
0099
0100 GTEST_TEST(detray_intersection, line_intersector_case2) {
0101
0102 const vector3 x{1.f, 0.f, -1.f};
0103 const vector3 z{1.f, 0.f, 1.f};
0104 const vector3 t{1.f, 1.f, 1.f};
0105 const transform3 tf{t, vector::normalize(z), vector::normalize(x)};
0106
0107
0108 const point3 pos{1.f, -1.f, 0.f};
0109 const vector3 dir{0.f, 1.f, 0.f};
0110 const free_track_parameters<test_algebra> trk(pos, 0.f, dir, -1.f);
0111
0112
0113
0114 const mask<line_circular, test_algebra> ln{
0115 0u, 10.f, std::numeric_limits<scalar>::infinity()};
0116
0117
0118 const intersection_t is = line_intersector_type()(
0119 detail::ray<test_algebra>(trk), surface_descriptor<>{}, ln, tf, tol);
0120
0121 EXPECT_TRUE(is.is_inside());
0122 EXPECT_NEAR(is.path(), 2.f, tol);
0123 const auto global = ln.to_global_frame(tf, is.local());
0124 EXPECT_NEAR(global[0], 1.f, tol);
0125 EXPECT_NEAR(global[1], 1.f, tol);
0126 EXPECT_NEAR(global[2], 0.f, tol);
0127 EXPECT_NEAR(is.local()[0], -constant<scalar>::inv_sqrt2, tol);
0128 EXPECT_NEAR(is.local()[1], -constant<scalar>::inv_sqrt2, tol);
0129 }
0130
0131 GTEST_TEST(detray_intersection, line_intersector_square_scope) {
0132
0133 const transform3 tf{};
0134
0135
0136 std::vector<free_track_parameters<test_algebra>> trks;
0137 trks.emplace_back(point3{2.f, 0.f, 0.f}, 0.f, vector3{-1.f, 1.f, 0.f}, -1.f);
0138 trks.emplace_back(point3{1.9f, 0.f, 0.f}, 0.f, vector3{-1.f, 1.f, 0.f}, -1.f);
0139 trks.emplace_back(point3{2.1f, 0.f, 0.f}, 0.f, vector3{-1.f, 1.f, 0.f}, -1.f);
0140
0141 trks.emplace_back(point3{-2.f, 0.f, 0.f}, 0.f, vector3{1.f, 1.f, 0.f}, -1.f);
0142 trks.emplace_back(point3{-1.9f, 0.f, 0.f}, 0.f, vector3{1.f, 1.f, 0.f}, -1.f);
0143 trks.emplace_back(point3{-2.1f, 0.f, 0.f}, 0.f, vector3{1.f, 1.f, 0.f}, -1.f);
0144
0145 trks.emplace_back(point3{0.f, -2.f, 0.f}, 0.f, vector3{-1.f, 1.f, 0.f}, -1.f);
0146 trks.emplace_back(point3{0.f, -1.9f, 0.f}, 0.f, vector3{-1.f, 1.f, 0.f},
0147 -1.f);
0148 trks.emplace_back(point3{0.f, -2.1f, 0.f}, 0.f, vector3{-1.f, 1.f, 0.f},
0149 -1.f);
0150
0151 trks.emplace_back(point3{0.f, -2.f, 0.f}, 0.f, vector3{1.f, 1.f, 0.f}, -1.f);
0152 trks.emplace_back(point3{0.f, -1.9f, 0.f}, 0.f, vector3{1.f, 1.f, 0.f}, -1.f);
0153 trks.emplace_back(point3{0.f, -2.1f, 0.f}, 0.f, vector3{1.f, 1.f, 0.f}, -1.f);
0154
0155
0156 mask<line_square, test_algebra, std::uint_least16_t> ln{
0157 0u, 1.f, std::numeric_limits<scalar>::infinity()};
0158
0159
0160 std::vector<intersection_t> is;
0161 for (const auto& trk : trks) {
0162 is.push_back(line_intersector_type()(detail::ray<test_algebra>(trk),
0163 surface_descriptor<>{}, ln, tf, tol));
0164 }
0165
0166 ASSERT_TRUE(is.size() >= 12);
0167
0168 EXPECT_TRUE(is[0].is_inside());
0169 EXPECT_NEAR(is[0].path(), constant<scalar>::sqrt2, tol);
0170 const auto local0 = ln.to_local_frame3D(
0171 tf,
0172 detail::ray(trks[0]).pos() + is[0].path() * detail::ray(trks[0]).dir(),
0173 detail::ray(trks[0]).dir());
0174 const auto global0 = ln.to_global_frame(tf, local0);
0175 EXPECT_NEAR(global0[0], 1.f, tol);
0176 EXPECT_NEAR(global0[1], 1.f, tol);
0177 EXPECT_NEAR(global0[2], 0.f, tol);
0178 EXPECT_NEAR(is[0].local()[0], -constant<scalar>::sqrt2, tol);
0179 EXPECT_NEAR(is[0].local()[1], 0.f, tol);
0180
0181 EXPECT_TRUE(is[1].is_inside());
0182 EXPECT_TRUE(std::signbit(is[1].local()[0]));
0183 EXPECT_FALSE(is[2].is_inside());
0184 EXPECT_TRUE(std::signbit(is[2].local()[0]));
0185
0186 EXPECT_TRUE(is[3].is_inside());
0187 EXPECT_FALSE(std::signbit(is[3].local()[0]));
0188 EXPECT_TRUE(is[4].is_inside());
0189 EXPECT_FALSE(std::signbit(is[4].local()[0]));
0190 EXPECT_FALSE(is[5].is_inside());
0191 EXPECT_FALSE(std::signbit(is[5].local()[0]));
0192
0193 EXPECT_TRUE(is[6].is_inside());
0194 EXPECT_FALSE(std::signbit(is[6].local()[0]));
0195 EXPECT_TRUE(is[7].is_inside());
0196 EXPECT_FALSE(std::signbit(is[7].local()[0]));
0197 EXPECT_FALSE(is[8].is_inside());
0198 EXPECT_FALSE(std::signbit(is[8].local()[0]));
0199
0200 EXPECT_TRUE(is[9].is_inside());
0201 EXPECT_TRUE(std::signbit(is[9].local()[0]));
0202 EXPECT_TRUE(is[10].is_inside());
0203 EXPECT_TRUE(std::signbit(is[10].local()[0]));
0204 EXPECT_FALSE(is[11].is_inside());
0205 EXPECT_TRUE(std::signbit(is[11].local()[0]));
0206 }