Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-05-27 07:24:22

0001 // This file is part of the ACTS project.
0002 //
0003 // Copyright (C) 2016 CERN for the benefit of the ACTS project
0004 //
0005 // This Source Code Form is subject to the terms of the Mozilla Public
0006 // License, v. 2.0. If a copy of the MPL was not distributed with this
0007 // file, You can obtain one at https://mozilla.org/MPL/2.0/.
0008 
0009 // Project include(s)
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 // Detray test include(s)
0019 #include "detray/test/framework/types.hpp"
0020 
0021 // GTest include(s)
0022 #include <gtest/gtest.h>
0023 
0024 // System include(s)
0025 #include <limits>
0026 
0027 using namespace detray;
0028 
0029 // Three-dimensional definitions
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 // Test simplest case
0046 GTEST_TEST(detray_intersection, line_intersector_case1) {
0047   // tf3 with Identity rotation and no translation
0048   const transform3 tf{};
0049 
0050   // Create a track
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   // Infinite wire with 10 mm radial cell size
0057   const mask<line_circular, test_algebra> ln{
0058       0u, 10.f, std::numeric_limits<scalar>::infinity()};
0059 
0060   // Test intersect
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);  // right
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);  // left
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);  // right
0096   EXPECT_NEAR(is[2].local()[1], 1.f, tol);
0097 }
0098 
0099 // Test inclined wire
0100 GTEST_TEST(detray_intersection, line_intersector_case2) {
0101   // tf3 with skewed axis
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   // Create a track
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   // Infinite wire with 10 mm
0113   // radial cell size
0114   const mask<line_circular, test_algebra> ln{
0115       0u, 10.f, std::numeric_limits<scalar>::infinity()};
0116 
0117   // Test intersect
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);  // right
0128   EXPECT_NEAR(is.local()[1], -constant<scalar>::inv_sqrt2, tol);
0129 }
0130 
0131 GTEST_TEST(detray_intersection, line_intersector_square_scope) {
0132   // tf3 with Identity rotation and no translation
0133   const transform3 tf{};
0134 
0135   /// Create a track
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   // Infinite wire with 1 mm square cell size
0156   mask<line_square, test_algebra, std::uint_least16_t> ln{
0157       0u, 1.f, std::numeric_limits<scalar>::infinity()};
0158 
0159   // Test intersect
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 }