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"
24template <concepts::algebra algebra_t>
62 getter::set_block(m_vector,
pos, e_free_pos0, 0u);
63 getter::element(m_vector, e_free_time, 0u) =
time;
67 getter::set_block(m_vector, mom_norm, e_free_dir0, 0u);
68 getter::element(m_vector, e_free_qoverp, 0u) = q /
p;
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()) {
93 return getter::element(m_vector,
static_cast<unsigned int>(i), 0u);
100 decltype(
auto)
operator[](std::size_t i) {
101 return getter::element(m_vector,
static_cast<unsigned int>(i), 0u);
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)};
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);
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)};
139 assert(math::isfinite(
dir[0]));
140 assert(math::isfinite(
dir[1]));
141 assert(math::isfinite(
dir[2]));
144 getter::set_block(m_vector,
dir, e_free_dir0, 0u);
150 return getter::element(m_vector, e_free_time, 0u);
157 assert(math::isfinite(t));
158 getter::element(m_vector, e_free_time, 0u) = t;
164 return getter::element(m_vector, e_free_qoverp, 0u);
171 assert(math::isfinite(
qop));
172 getter::element(m_vector, e_free_qoverp, 0u) =
qop;
179 assert(vector::perp(
dir) != 0.f);
180 return getter::element(m_vector, e_free_qoverp, 0u) / vector::perp(
dir);
187 return getter::element(m_vector, e_free_qoverp, 0u) /
dir[2];
194 assert(
qop() != 0.f);
195 assert(q *
qop() > 0.f);
208 assert(this->
qop() != 0.f);
209 assert(q *
qop() > 0.f);
210 return math::fabs(q / this->
qop() * vector::perp(this->
dir()));
217 assert(this->
qop() != 0.f);
218 assert(q *
qop() > 0.f);
219 return math::fabs(q / this->
qop() * this->
dir()[2]);
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));
240 out_stream << fparam.m_vector;
244 vector_type m_vector = matrix::zero<vector_type>();
248template <concepts::algebra algebra_t>
254template <concepts::value value_t, concepts::algebra algebra_t>
255DETRAY_HOST_DEVICE
constexpr decltype(
auto) cast_to(
259 if constexpr (std::same_as<new_algebra_t, algebra_t>) {
263 ::detray::algebra::cast_to<value_t>(param.
vector())};
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