Back to home page

EIC code displayed by LXR

 
 

    


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

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/tracks/bound_track_parameters.hpp"
0011 
0012 // Detray test include(s)
0013 #include "detray/test/framework/types.hpp"
0014 
0015 // Google Test include(s)
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   /// Declare track parameters
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   // first track
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   // second track
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   /// Check the elements
0078 
0079   // first track
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   // second track
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 }