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/free_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 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   // first constructor
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   // second constructor
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   // Test the setters and subscript operator
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 }