ACTS
Experiment-independent tracking
Loading...
Searching...
No Matches
generic_vector.hpp
1// This file is part of the ACTS project.
2//
3// Copyright (C) 2016 CERN for the benefit of the ACTS project
4//
5// This Source Code Form is subject to the terms of the Mozilla Public
6// License, v. 2.0. If a copy of the MPL was not distributed with this
7// file, You can obtain one at https://mozilla.org/MPL/2.0/.
8
9#pragma once
10
11// Project include(s).
12#include "detray/algebra/common/math.hpp"
13#include "detray/algebra/concepts.hpp"
14#include "detray/algebra/type_traits.hpp"
15#include "detray/definitions/detail/qualifiers.hpp"
16
17namespace detray::algebra::generic::math {
18
22template <concepts::vector vector_t>
23DETRAY_HOST_DEVICE constexpr detray::traits::scalar_t<vector_t> phi(
24 const vector_t &v) noexcept {
25 using element_getter_t = detray::traits::element_getter_t<vector_t>;
26
27 return algebra::math::atan2(element_getter_t{}(v, 1),
28 element_getter_t{}(v, 0));
29}
30
34template <concepts::vector vector_t>
35DETRAY_HOST_DEVICE constexpr detray::traits::scalar_t<vector_t> perp(
36 const vector_t &v) noexcept {
37 using element_getter_t = detray::traits::element_getter_t<vector_t>;
38
40 algebra::math::fma(element_getter_t{}(v, 0), element_getter_t{}(v, 0),
41 element_getter_t{}(v, 1) * element_getter_t{}(v, 1)));
42}
43
47template <concepts::vector vector_t>
48DETRAY_HOST_DEVICE constexpr detray::traits::scalar_t<vector_t> theta(
49 const vector_t &v) noexcept {
50 using element_getter_t = detray::traits::element_getter_t<vector_t>;
51
52 return algebra::math::atan2(perp(v), element_getter_t{}(v, 2));
53}
54
64template <typename vector1_t, typename vector2_t>
65 requires(
66 (concepts::vector3D<vector1_t> || concepts::column_matrix3D<vector1_t>) &&
67 (concepts::vector3D<vector2_t> || concepts::column_matrix3D<vector2_t>))
68DETRAY_HOST_DEVICE constexpr detray::traits::vector_t<vector1_t> cross(
69 const vector1_t &a, const vector2_t &b) {
70 using element_getter_t = detray::traits::element_getter_t<vector1_t>;
71
72 return {
73 algebra::math::fma(element_getter_t{}(a, 1), element_getter_t{}(b, 2),
74 -element_getter_t{}(b, 1) * element_getter_t{}(a, 2)),
75 algebra::math::fma(element_getter_t{}(a, 2), element_getter_t{}(b, 0),
76 -element_getter_t{}(b, 2) * element_getter_t{}(a, 0)),
77 algebra::math::fma(element_getter_t{}(a, 0), element_getter_t{}(b, 1),
78 -element_getter_t{}(b, 0) * element_getter_t{}(a, 1))};
79}
80
90template <typename vector1_t, typename vector2_t>
91 requires((concepts::vector<vector1_t> ||
92 concepts::column_matrix<vector1_t>) &&
93 (concepts::vector<vector2_t> || concepts::column_matrix<vector2_t>))
94DETRAY_HOST_DEVICE constexpr detray::traits::scalar_t<vector1_t> dot(
95 const vector1_t &a, const vector2_t &b) {
96 using scalar_t = detray::traits::scalar_t<vector1_t>;
97 using index_t = detray::traits::index_t<vector1_t>;
98 using element_getter_t = detray::traits::element_getter_t<vector1_t>;
99
100 scalar_t ret{element_getter_t{}(a, 0) * element_getter_t{}(b, 0)};
101
102 for (index_t i = 1; i < detray::traits::size<vector1_t>; i++) {
103 ret = std::fma(element_getter_t{}(a, i), element_getter_t{}(b, i), ret);
104 }
105
106 return ret;
107}
108
112template <concepts::vector vector_t>
113DETRAY_HOST_DEVICE constexpr detray::traits::scalar_t<vector_t> norm(
114 const vector_t &v) {
115 return algebra::math::sqrt(dot(v, v));
116}
117
122template <concepts::vector vector_t>
123DETRAY_HOST_DEVICE constexpr detray::traits::scalar_t<vector_t> eta(
124 const vector_t &v) noexcept {
125 using element_getter_t = detray::traits::element_getter_t<vector_t>;
126
127 return algebra::math::atanh(element_getter_t{}(v, 2) / norm(v));
128}
129
137template <concepts::vector vector_t>
138DETRAY_HOST_DEVICE constexpr vector_t normalize(const vector_t &v) {
139 using scalar_t = detray::traits::scalar_t<vector_t>;
140
141 return v * static_cast<scalar_t>(1.) / norm(v);
142}
143
144} // namespace detray::algebra::generic::math
constexpr decltype(auto) sqrt(T &&vec)
Definition vc_soa_math.hpp:78
constexpr decltype(auto) fma(T &&x, T &&y, T &&z)
Evaluate the fused multiply-add x * y + z lane by lane.
Definition vc_soa_math.hpp:168