12#if defined(__GNUC__) && !defined(__clang__)
13#pragma GCC diagnostic warning "-Wmaybe-uninitialized"
17#include "detray/definitions/algebra.hpp"
18#include "detray/definitions/math.hpp"
19#include "detray/tracks/free_track_parameters.hpp"
20#include "detray/utils/invalid_values.hpp"
25namespace detray::detail {
32template <concepts::algebra algebra_t>
50 template <std::
size_t ROWS, std::
size_t COLS>
71 _B{vector::norm(mag_field)},
72 _h0{vector::normalize(mag_field)},
74 assert((math::fabs(vector::norm(_t0) - 1.f) < 1e-5f) &&
75 "The helix direction must be normalized");
82 _n0 = vector::normalize(vector::cross(_h0, _t0));
85 _alpha = vector::norm(vector::cross(_h0, _t0));
88 _delta = vector::dot(_h0, _t0);
100 _R = vector::norm(pT) / _B;
103 if (vector::norm(pT) < 1e-6f) {
104 _vz_over_vt = detail::invalid_value<scalar_type>();
107 _vz_over_vt = pz / vector::norm(pT);
116 : helix(track.
pos(), track.
time(), track.
dir(), track.
qop(), mag_field) {
124 template <
typename field_view_t>
127 const field_view_t mag_field)
129 sample_field(mag_field, track.
pos())) {}
147 if (_vz_over_vt == detail::invalid_value<scalar_type>()) {
148 return _pos + s * _h0;
152 ret = ret + _delta / _K * (_K * s - math::sin(_K * s)) * _h0;
153 ret = ret + math::sin(_K * s) / _K * _t0;
154 ret = ret + _alpha / _K * (1.f - math::cos(_K * s)) * _n0;
170 if (_vz_over_vt == detail::invalid_value<scalar_type>()) {
176 ret = ret + _delta * (1 - math::cos(_K * s)) * _h0;
177 ret = ret + math::cos(_K * s) * _t0;
178 ret = ret + _alpha * math::sin(_K * s) * _n0;
180 return vector::normalize(ret);
225 getter::set_block(ret, drdr, e_free_pos0, e_free_pos0);
229 getter::set_block(ret, dtdr, e_free_dir0, e_free_pos0);
236 drdt = drdt + sin_ks / _K * I33;
239 getter::element(H0, 0u, 0u) = _h0[0u];
240 getter::element(H0, 1u, 0u) = _h0[1u];
241 getter::element(H0, 2u, 0u) = _h0[2u];
245 drdt = drdt + (_K * s - sin_ks) / _K * H0H0_T;
247 drdt = drdt + (cos_ks - 1.f) / _K * matrix::column_wise_cross(I33, _h0);
249 getter::set_block(ret, drdt, e_free_pos0, e_free_dir0);
253 dtdt = dtdt + cos_ks * I33;
254 dtdt = dtdt + (1 - cos_ks) * H0H0_T;
255 dtdt = dtdt - sin_ks * matrix::column_wise_cross(I33, _h0);
257 getter::set_block(ret, dtdt, e_free_dir0, e_free_dir0);
262 getter::set_block(ret, drdl, e_free_pos0, e_free_qoverp);
267 (sin_ks * ((H0H0_T - I33) * _t0) + cos_ks * vector::cross(_h0, _t0));
269 getter::set_block(ret, dtdl, e_free_dir0, e_free_qoverp);
272 getter::element(ret, e_free_time, e_free_time) = 1.f;
273 getter::element(ret, e_free_qoverp, e_free_qoverp) = 1.f;
281 friend std::ostream &
operator<<(std::ostream &os,
const helix &h) {
283 os <<
"ori = " << h._pos;
284 os <<
", dir = " << h._t0 << std::endl;
290 template <
typename field_view_t>
291 constexpr vector3_type sample_field(
const field_view_t field,
293 const auto bvec = field.at(
pos[0],
pos[1],
pos[2]);
295 return {bvec[0], bvec[1], bvec[2]};
335template <concepts::algebra algebra_t,
typename field_view_t>
336 requires(!concepts::vector3D<field_view_t>)
337DETRAY_HOST_DEVICE_DEDUCTION_GUIDE
helix(
describes a helical trajectory in a given B-field.
Definition helix.hpp:33
scalar_type time() const
Definition helix.hpp:191
vector3_type b_field() const
Return the uniform magnetic field vector.
Definition helix.hpp:206
free_matrix< algebra_t > free_matrix_t
Definition helix.hpp:53
point3_type dir() const
Return the initial unit tangent direction.
Definition helix.hpp:186
point3_type operator()(const scalar_type s) const
Evaluate the helix at a path length.
Definition helix.hpp:139
dvector3D< algebra_t > vector3_type
Definition helix.hpp:42
dmatrix< algebra_t, ROWS, COLS > matrix_type
Definition helix.hpp:51
helix(const free_track_parameters_type &track, const field_view_t mag_field)
Build a helix using a field view sampled at the track position.
Definition helix.hpp:126
free_matrix_t jacobian(const scalar_type s) const
Compute the free-parameter transport Jacobian at a path length.
Definition helix.hpp:212
dpoint3D< algebra_t > point3_type
Definition helix.hpp:40
scalar_type radius() const
Definition helix.hpp:133
algebra_t algebra_type
Definition helix.hpp:36
vector3_type dir(const scalar_type s) const
Definition helix.hpp:168
helix(const point3_type &pos, const scalar_type time, const vector3_type &dir, const scalar_type qop, const vector3_type &mag_field)
Parametrized constructor.
Definition helix.hpp:66
friend std::ostream & operator<<(std::ostream &os, const helix &h)
Print.
Definition helix.hpp:281
free_track_parameters< algebra_t > free_track_parameters_type
Definition helix.hpp:47
scalar_type qop() const
Definition helix.hpp:196
scalar_type B() const
Return the magnitude of the uniform magnetic field.
Definition helix.hpp:201
dtransform3D< algebra_t > transform3_type
Definition helix.hpp:44
point3_type pos() const
Return the initial position of the helix.
Definition helix.hpp:162
dscalar< algebra_t > scalar_type
Definition helix.hpp:38
point3_type pos(const scalar_type s) const
Definition helix.hpp:145
helix(const free_track_parameters_type &track, const vector3_type &mag_field)
Build a helix from a free track state and a uniform field vector.
Definition helix.hpp:115
Definition concepts.hpp:65
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, e_free_size > free_matrix
Covariance matrix type for free track parametrization.
Definition track_parametrization.hpp:73
get_vector3D_t< A, T > dvector3D
Three-dimensional vector type for algebra A and value type T.
Definition algebra.hpp:80
get_transform3D_t< A, T > dtransform3D
Three-dimensional transform type for algebra A and value type T.
Definition algebra.hpp:84
get_matrix_t< A, R, C, T > dmatrix
R by C matrix type for algebra A and value type T.
Definition algebra.hpp:88
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
constexpr bool is_invalid() const
Definition free_track_parameters.hpp:225
vector3_type dir() const
Definition free_track_parameters.hpp:128
scalar_type time() const
Definition free_track_parameters.hpp:149
point3_type pos() const
Definition free_track_parameters.hpp:110
scalar_type qop() const
Definition free_track_parameters.hpp:163