12#include "detray/definitions/algebra.hpp"
13#include "detray/definitions/detail/qualifiers.hpp"
14#include "detray/definitions/indexing.hpp"
15#include "detray/definitions/math.hpp"
16#include "detray/definitions/track_parametrization.hpp"
17#include "detray/definitions/units.hpp"
18#include "detray/geometry/identifier.hpp"
28template <concepts::algebra algebra_t>
68 getter::set_block(m_vector, loc_p, e_bound_loc0, 0u);
69 getter::element(m_vector, e_bound_phi, 0u) =
phi;
70 getter::element(m_vector, e_bound_theta, 0u) =
theta;
71 getter::element(m_vector, e_bound_qoverp, 0u) =
qop;
72 getter::element(m_vector, e_bound_time, 0u) = t;
82 for (
unsigned int i = 0u; i < e_bound_size; i++) {
83 const auto lhs_val = getter::element(m_vector, i, 0u);
84 const auto rhs_val = getter::element(rhs.
vector(), i, 0u);
86 if (math::fabs(lhs_val - rhs_val) >
87 std::numeric_limits<scalar_type>::epsilon()) {
100 return getter::element(m_vector,
static_cast<unsigned int>(i), 0u);
107 decltype(
auto)
operator[](
const std::size_t i) {
108 return getter::element(m_vector,
static_cast<unsigned int>(i), 0u);
126 [[maybe_unused]]
const bool skip_check =
false) {
134 return {getter::element(m_vector, e_bound_loc0, 0u),
135 getter::element(m_vector, e_bound_loc1, 0u)};
142 assert(math::isfinite(pos[0]));
143 assert(math::isfinite(pos[1]));
144 getter::set_block(m_vector, pos, e_bound_loc0, 0u);
156 getter::element(m_vector, e_bound_phi, 0u) =
phi;
162 return getter::element(m_vector, e_bound_theta, 0u);
171 getter::element(m_vector, e_bound_theta, 0u) =
theta;
177 const scalar_type phi{getter::element(m_vector, e_bound_phi, 0u)};
181 return {math::cos(
phi) * sinTheta, math::sin(
phi) * sinTheta,
188 return getter::element(m_vector, e_bound_time, 0u);
195 assert(math::isfinite(t));
196 getter::element(m_vector, e_bound_time, 0u) = t;
202 return getter::element(m_vector, e_bound_qoverp, 0u);
209 assert(math::isfinite(
qop));
210 getter::element(m_vector, e_bound_qoverp, 0u) =
qop;
218 assert(sinTheta != 0.f);
219 return getter::element(m_vector, e_bound_qoverp, 0u) / sinTheta;
227 assert(cosTheta != 0.f);
228 return getter::element(m_vector, e_bound_qoverp, 0u) / cosTheta;
235 assert(
qop() != 0.f);
236 assert(q *
qop() > 0.f);
249 assert(
qop() != 0.f);
250 assert(q *
qop() > 0.f);
251 return math::fabs(q /
qop() * vector::perp(
dir()));
258 assert(
qop() != 0.f);
259 assert(q *
qop() > 0.f);
260 return math::fabs(q /
qop() *
dir()[2]);
267 constexpr bool is_invalid(
const bool do_check =
true)
const {
271 bool inv_elem{
false};
272 bool is_all_zero{
true};
273 for (std::size_t i = 0u; i < e_bound_size; ++i) {
274 inv_elem = inv_elem || !math::isfinite(getter::element(m_vector, i, 0u));
276 is_all_zero && (math::fabs(getter::element(m_vector, i, 0u)) == 0.f);
279 return (inv_elem || is_all_zero);
287 out_stream << bparam.m_vector;
291 vector_type m_vector = matrix::zero<vector_type>();
296template <concepts::algebra algebra_t>
332 :
base_type(vec), m_covariance(cov), m_identifier(sf_idx) {}
343 if (!base_type::operator==(rhs)) {
347 for (
unsigned int i = 0u; i < e_bound_size; i++) {
348 for (
unsigned int j = 0u; j < e_bound_size; j++) {
349 const auto lhs_val = getter::element(m_covariance, i, j);
350 const auto rhs_val = getter::element(rhs.
covariance(), i, j);
352 if (math::fabs(lhs_val - rhs_val) >
353 std::numeric_limits<scalar_type>::epsilon()) {
376 const bool skip_check =
false) {
397 constexpr bool is_invalid(
const bool do_check =
true)
const {
406 return (m_covariance == matrix::zero<covariance_type>());
414 out_stream <<
"Surface: " << bparam.m_identifier << std::endl;
417 out_stream <<
"Cov.:\n" << bparam.m_covariance;
432template <concepts::value value_t, concepts::algebra algebra_t>
433DETRAY_HOST_DEVICE
constexpr decltype(
auto) cast_to(
434 const bound_parameters_vector<algebra_t>& param_vec) {
437 if constexpr (std::same_as<new_algebra_t, algebra_t>) {
440 return bound_parameters_vector<new_algebra_t>{
441 ::detray::algebra::cast_to<value_t>(param_vec.to_vector())};
446template <concepts::value value_t, concepts::algebra algebra_t>
447DETRAY_HOST_DEVICE
constexpr decltype(
auto) cast_to(
448 const bound_track_parameters<algebra_t>& param) {
451 if constexpr (std::same_as<new_algebra_t, algebra_t>) {
454 const bound_parameters_vector<algebra_t>& param_vec = param;
455 return bound_track_parameters<new_algebra_t>{
456 param.surface_link(), ::detray::algebra::cast_to<value_t>(param_vec),
457 ::detray::algebra::cast_to<value_t>(param.covariance())};
Unique identifier for geometry objects, based on the ACTS GeometryIdentifier.
Definition identifier.hpp:36
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
get_algebra_t< A, T > dalgebra
Select the algebra backend with value type T.
Definition algebra.hpp:44
dmatrix< algebra_t, e_bound_size, 1 > bound_vector
Vector type for bound track parametrization.
Definition track_parametrization.hpp:77
get_vector3D_t< A, T > dvector3D
Three-dimensional vector type for algebra A and value type T.
Definition algebra.hpp:80
dmatrix< algebra_t, e_bound_size, e_bound_size > bound_matrix
Covariance matrix type for bound track parametrization.
Definition track_parametrization.hpp:81
get_point2D_t< A, T > dpoint2D
Two-dimensional point type for algebra A and value type T.
Definition algebra.hpp:68
scalar_type operator[](const std::size_t i) const
Convenience access to the track parameters - const.
Definition bound_track_parameters.hpp:99
algebra_t algebra_type
Algebra backend used for the vector operations.
Definition bound_track_parameters.hpp:33
scalar_type phi() const
Definition bound_track_parameters.hpp:149
point2_type bound_local() const
Definition bound_track_parameters.hpp:133
vector_type & vector()
Access the track parameters as a 6-dim vector - non-const.
Definition bound_track_parameters.hpp:119
dvector3D< algebra_t > vector3_type
Three-dimensional type for directions and momentum.
Definition bound_track_parameters.hpp:39
bound_parameters_vector()=default
Default constructor.
void set_bound_local(const point2_type &pos)
Set the bound local position.
Definition bound_track_parameters.hpp:141
bound_parameters_vector(const vector_type &vec)
Construct from a 6-dim vector of parameters.
Definition bound_track_parameters.hpp:53
void set_time(const scalar_type t)
Set the time.
Definition bound_track_parameters.hpp:194
bool operator==(const bound_parameters_vector &rhs) const
Compare all six bound parameters within scalar precision.
Definition bound_track_parameters.hpp:81
constexpr bool is_invalid(const bool do_check=true) const
Definition bound_track_parameters.hpp:267
scalar_type time() const
Definition bound_track_parameters.hpp:187
void set_qop(const scalar_type qop)
Set the q/p value.
Definition bound_track_parameters.hpp:208
const vector_type & vector() const
Access the track parameters as a 6-dim vector - const.
Definition bound_track_parameters.hpp:114
scalar_type p(const scalar_type q) const
Definition bound_track_parameters.hpp:234
vector3_type mom(const scalar_type q) const
Definition bound_track_parameters.hpp:243
bound_vector< algebra_t > vector_type
Fixed-size vector storing the six bound parameters.
Definition bound_track_parameters.hpp:43
dpoint2D< algebra_t > point2_type
Two-dimensional type for local surface coordinates.
Definition bound_track_parameters.hpp:37
friend std::ostream & operator<<(std::ostream &out_stream, const bound_parameters_vector &bparam)
Transform to a string for debugging output.
Definition bound_track_parameters.hpp:285
vector3_type dir() const
Definition bound_track_parameters.hpp:176
void set_vector(const vector_type &v, const bool skip_check=false)
Set the underlying vector.
Definition bound_track_parameters.hpp:125
scalar_type pT(const scalar_type q) const
Definition bound_track_parameters.hpp:248
scalar_type theta() const
Definition bound_track_parameters.hpp:161
scalar_type pz(const scalar_type q) const
Definition bound_track_parameters.hpp:257
void set_phi(const scalar_type phi)
Set the global phi angle.
Definition bound_track_parameters.hpp:154
scalar_type qopT() const
Definition bound_track_parameters.hpp:215
scalar_type qop() const
Definition bound_track_parameters.hpp:201
bound_parameters_vector(const point2_type &loc_p, const scalar_type phi, const scalar_type theta, const scalar_type qop, const scalar_type t)
Construct from single parameters.
Definition bound_track_parameters.hpp:65
void set_theta(const scalar_type theta)
Set the global theta angle.
Definition bound_track_parameters.hpp:168
dscalar< algebra_t > scalar_type
Scalar type used by the stored parameters.
Definition bound_track_parameters.hpp:35
scalar_type qopz() const
Definition bound_track_parameters.hpp:224
const geometry::identifier & surface_link() const
Definition bound_track_parameters.hpp:364
bound_parameters_vector< algebra_t > base_type
Base parameter-vector type inherited by this track state.
Definition bound_track_parameters.hpp:299
void set_parameter_vector(const parameter_vector_type &v, const bool skip_check=false)
Set the track parameter vector.
Definition bound_track_parameters.hpp:375
void set_surface_link(geometry::identifier link)
Set the identifier of the associated surface.
Definition bound_track_parameters.hpp:369
void set_covariance(const covariance_type &c)
Set the track parameter covariance.
Definition bound_track_parameters.hpp:391
constexpr bool is_invalid(const bool do_check=true) const
Definition bound_track_parameters.hpp:397
bound_parameters_vector< algebra_t > parameter_vector_type
Type of the bound track parameter vector.
Definition bound_track_parameters.hpp:314
covariance_type & covariance()
Definition bound_track_parameters.hpp:382
bool operator==(const bound_track_parameters &rhs) const
Compare all six bound parameters within scalar precision.
Definition bound_track_parameters.hpp:338
bound_track_parameters()=default
Default constructor sets the covaraicne to zero.
dpoint2D< algebra_t > point2_type
Two-dimensional type for local surface coordinates.
Definition bound_track_parameters.hpp:308
algebra_t algebra_type
Algebra backend used for the vector operations.
Definition bound_track_parameters.hpp:304
dvector3D< algebra_t > vector3_type
Three-dimensional type for directions and momentum.
Definition bound_track_parameters.hpp:310
bound_matrix< algebra_t > covariance_type
Matrix type storing covariance between bound parameters.
Definition bound_track_parameters.hpp:316
friend std::ostream & operator<<(std::ostream &out_stream, const bound_track_parameters &bparam)
Transform to a string for debugging output.
Definition bound_track_parameters.hpp:412
bound_track_parameters(const geometry::identifier sf_idx, const parameter_vector_type &vec, const covariance_type &cov)
Construct a bound state on a surface with a parameter vector and covariance.
Definition bound_track_parameters.hpp:329
dscalar< algebra_t > scalar_type
Scalar type used by the stored parameters.
Definition bound_track_parameters.hpp:306
const covariance_type & covariance() const
Definition bound_track_parameters.hpp:386
static constexpr scalar_t pi
π
Definition units.hpp:136