ACTS
Experiment-independent tracking
Loading...
Searching...
No Matches
free_track_parameters.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/definitions/algebra.hpp"
13#include "detray/definitions/detail/qualifiers.hpp"
14#include "detray/definitions/math.hpp"
15#include "detray/definitions/track_parametrization.hpp"
16
17// System include(s)
18#include <limits>
19#include <ostream>
20
21namespace detray {
22
24template <concepts::algebra algebra_t>
28
29 using algebra_type = algebra_t;
36
37 // Shorthand vector type related to free track parameters.
40
42
45
48 DETRAY_HOST_DEVICE
49 explicit free_parameters_vector(const vector_type& vec) : m_vector(vec) {
50 assert(!this->is_invalid());
51 }
52
59 DETRAY_HOST_DEVICE
61 const vector3_type& mom, const scalar_type q) {
62 getter::set_block(m_vector, pos, e_free_pos0, 0u);
63 getter::element(m_vector, e_free_time, 0u) = time;
64
65 scalar_type p = vector::norm(mom);
66 vector3_type mom_norm = vector::normalize(mom);
67 getter::set_block(m_vector, mom_norm, e_free_dir0, 0u);
68 getter::element(m_vector, e_free_qoverp, 0u) = q / p;
69
70 assert(!this->is_invalid());
71 }
72
76 DETRAY_HOST_DEVICE
77 bool operator==(const free_parameters_vector& rhs) const {
78 for (unsigned int i = 0u; i < e_free_size; i++) {
79 if (math::fabs((*this)[i] - rhs[i]) >
80 std::numeric_limits<scalar_type>::epsilon()) {
81 return false;
82 }
83 }
84
85 return true;
86 }
87
91 DETRAY_HOST_DEVICE
92 scalar_type operator[](std::size_t i) const {
93 return getter::element(m_vector, static_cast<unsigned int>(i), 0u);
94 }
95
99 DETRAY_HOST_DEVICE
100 decltype(auto) operator[](std::size_t i) {
101 return getter::element(m_vector, static_cast<unsigned int>(i), 0u);
102 }
103
105 DETRAY_HOST_DEVICE
106 const vector_type& vector() const { return m_vector; }
107
109 DETRAY_HOST_DEVICE
110 point3_type pos() const {
111 return {getter::element(m_vector, e_free_pos0, 0u),
112 getter::element(m_vector, e_free_pos1, 0u),
113 getter::element(m_vector, e_free_pos2, 0u)};
114 }
115
118 DETRAY_HOST_DEVICE
119 void set_pos(const vector3_type& pos) {
120 assert(math::isfinite(pos[0]));
121 assert(math::isfinite(pos[1]));
122 assert(math::isfinite(pos[2]));
123 getter::set_block(m_vector, pos, e_free_pos0, 0u);
124 }
125
127 DETRAY_HOST_DEVICE
129 return {getter::element(m_vector, e_free_dir0, 0u),
130 getter::element(m_vector, e_free_dir1, 0u),
131 getter::element(m_vector, e_free_dir2, 0u)};
132 }
133
137 DETRAY_HOST_DEVICE
138 void set_dir(const vector3_type& dir) {
139 assert(math::isfinite(dir[0]));
140 assert(math::isfinite(dir[1]));
141 assert(math::isfinite(dir[2]));
142 assert(algebra::approx_equal(vector::norm(dir), scalar_type{1},
143 scalar_type{1e-5f}));
144 getter::set_block(m_vector, dir, e_free_dir0, 0u);
145 }
146
148 DETRAY_HOST_DEVICE
150 return getter::element(m_vector, e_free_time, 0u);
151 }
152
155 DETRAY_HOST_DEVICE
156 void set_time(const scalar_type t) {
157 assert(math::isfinite(t));
158 getter::element(m_vector, e_free_time, 0u) = t;
159 }
160
162 DETRAY_HOST_DEVICE
163 scalar_type qop() const {
164 return getter::element(m_vector, e_free_qoverp, 0u);
165 }
166
169 DETRAY_HOST_DEVICE
170 void set_qop(const scalar_type qop) {
171 assert(math::isfinite(qop));
172 getter::element(m_vector, e_free_qoverp, 0u) = qop;
173 }
174
176 DETRAY_HOST_DEVICE
178 const vector3_type dir = this->dir();
179 assert(vector::perp(dir) != 0.f);
180 return getter::element(m_vector, e_free_qoverp, 0u) / vector::perp(dir);
181 }
182
184 DETRAY_HOST_DEVICE
186 const vector3_type dir = this->dir();
187 return getter::element(m_vector, e_free_qoverp, 0u) / dir[2];
188 }
189
192 DETRAY_HOST_DEVICE
193 scalar_type p(const scalar_type q) const {
194 assert(qop() != 0.f);
195 assert(q * qop() > 0.f);
196 return q / qop();
197 }
198
201 DETRAY_HOST_DEVICE
202 vector3_type mom(const scalar_type q) const { return p(q) * dir(); }
203
206 DETRAY_HOST_DEVICE
207 scalar_type pT(const scalar_type q) const {
208 assert(this->qop() != 0.f);
209 assert(q * qop() > 0.f);
210 return math::fabs(q / this->qop() * vector::perp(this->dir()));
211 }
212
215 DETRAY_HOST_DEVICE
216 scalar_type pz(const scalar_type q) const {
217 assert(this->qop() != 0.f);
218 assert(q * qop() > 0.f);
219 return math::fabs(q / this->qop() * this->dir()[2]);
220 }
221
224 DETRAY_HOST_DEVICE
225 constexpr bool is_invalid() const {
226 bool inv_elem{false};
227 for (std::size_t i = 0u; i < e_free_size; ++i) {
228 inv_elem = inv_elem || !math::isfinite(getter::element(m_vector, i, 0u));
229 }
230 return inv_elem ||
231 !algebra::approx_equal(vector::norm(dir()), scalar_type{1},
232 scalar_type{1e-5f});
233 }
234
235 private:
237 DETRAY_HOST
238 friend std::ostream& operator<<(std::ostream& out_stream,
239 const free_parameters_vector& fparam) {
240 out_stream << fparam.m_vector;
241 return out_stream;
242 }
243
244 vector_type m_vector = matrix::zero<vector_type>();
245};
246
248template <concepts::algebra algebra_t>
250
251namespace algebra {
252
254template <concepts::value value_t, concepts::algebra algebra_t>
255DETRAY_HOST_DEVICE constexpr decltype(auto) cast_to(
257 using new_algebra_t = dalgebra<algebra_t, value_t>;
258
259 if constexpr (std::same_as<new_algebra_t, algebra_t>) {
260 return param;
261 } else {
263 ::detray::algebra::cast_to<value_t>(param.vector())};
264 }
265}
266
267} // namespace algebra
268
269} // namespace detray
Detray include(s).
Definition array_operators.hpp:18
get_scalar_t< A, T > dscalar
Scalar type for algebra A and value type T.
Definition algebra.hpp:64
dmatrix< algebra_t, e_free_size, 1 > free_vector
Vector type for free track parametrization.
Definition track_parametrization.hpp:69
get_algebra_t< A, T > dalgebra
Select the algebra backend with value type T.
Definition algebra.hpp:44
get_vector3D_t< A, T > dvector3D
Three-dimensional vector type for algebra A and value type T.
Definition algebra.hpp:80
get_point3D_t< A, T > dpoint3D
Three-dimensional point type for algebra A and value type T.
Definition algebra.hpp:72
free_parameters_vector< algebra_t > free_track_parameters
The free track parameters consist only of the parameter vector.
Definition free_track_parameters.hpp:249
Six-component parameter vector expressed in global Cartesian coordinates.
Definition free_track_parameters.hpp:25
void set_time(const scalar_type t)
Set the time.
Definition free_track_parameters.hpp:156
friend std::ostream & operator<<(std::ostream &out_stream, const free_parameters_vector &fparam)
Transform to a string for debugging output.
Definition free_track_parameters.hpp:238
constexpr bool is_invalid() const
Definition free_track_parameters.hpp:225
vector3_type dir() const
Definition free_track_parameters.hpp:128
scalar_type pT(const scalar_type q) const
Definition free_track_parameters.hpp:207
scalar_type qopT() const
Definition free_track_parameters.hpp:177
free_parameters_vector(const vector_type &vec)
Construct from a 6-dim vector of parameters.
Definition free_track_parameters.hpp:49
scalar_type time() const
Definition free_track_parameters.hpp:149
scalar_type p(const scalar_type q) const
Definition free_track_parameters.hpp:193
bool operator==(const free_parameters_vector &rhs) const
Compare all free parameters within scalar precision.
Definition free_track_parameters.hpp:77
scalar_type pz(const scalar_type q) const
Definition free_track_parameters.hpp:216
free_parameters_vector()=default
Default constructor.
point3_type pos() const
Definition free_track_parameters.hpp:110
void set_dir(const vector3_type &dir)
Set the global track direction.
Definition free_track_parameters.hpp:138
scalar_type qopz() const
Definition free_track_parameters.hpp:185
scalar_type operator[](std::size_t i) const
Convenience access to the track parameters - const.
Definition free_track_parameters.hpp:92
free_vector< algebra_t > vector_type
Fixed-size vector storing the free parameters.
Definition free_track_parameters.hpp:39
void set_pos(const vector3_type &pos)
Set the global track position.
Definition free_track_parameters.hpp:119
dpoint3D< algebra_t > point3_type
Three-dimensional type for global positions.
Definition free_track_parameters.hpp:33
scalar_type qop() const
Definition free_track_parameters.hpp:163
dscalar< algebra_t > scalar_type
Scalar type used by the stored parameters.
Definition free_track_parameters.hpp:31
vector3_type mom(const scalar_type q) const
Definition free_track_parameters.hpp:202
void set_qop(const scalar_type qop)
Set the q/p value.
Definition free_track_parameters.hpp:170
free_parameters_vector(const point3_type &pos, const scalar_type time, const vector3_type &mom, const scalar_type q)
Construct from single parameters.
Definition free_track_parameters.hpp:60
algebra_t algebra_type
Algebra backend used for the vector operations.
Definition free_track_parameters.hpp:29
dvector3D< algebra_t > vector3_type
Three-dimensional type for directions and momentum.
Definition free_track_parameters.hpp:35
const vector_type & vector() const
Definition free_track_parameters.hpp:106