12#include "algebra/impl/detail/smatrix_errorcheck.hpp"
13#include "detray/algebra/utils/approximately_equal.hpp"
14#include "detray/definitions/detail/qualifiers.hpp"
17#include "Math/SMatrix.h"
18#include "Math/SVector.h"
25namespace detray::algebra::smatrix::math {
28template <concepts::scalar scalar_t>
37 template <
unsigned int N>
50 using matrix44 = ROOT::Math::SMatrix<scalar_type, 4, 4>;
53 template <concepts::scalar o_scalar_t>
64 ROOT::Math::SMatrixIdentity();
78 const vector3 &
z,
bool get_inverse =
true) {
107 bool get_inverse =
true)
121 SMATRIX_CHECK(ifail);
133 SMATRIX_CHECK(ifail);
144 if constexpr (std::floating_point<scalar_type>) {
145 [[maybe_unused]]
constexpr auto epsilon{
146 std::numeric_limits<scalar_type>::epsilon()};
147 assert(algebra::approx_equal(
matrix44(m * m_inv),
148 matrix44(ROOT::Math::SMatrixIdentity()),
149 16.f * epsilon, 1e-6f));
162 _data(3, 0) = ma[12];
166 _data(3, 1) = ma[13];
169 _data(2, 2) = ma[10];
170 _data(3, 2) = ma[14];
173 _data(2, 3) = ma[11];
174 _data(3, 3) = ma[15];
201 return (
_data.template Sub<ROOT::Math::SMatrix<scalar_type, 3, 3> >(0, 0));
207 constexpr point3 x()
const {
return (
_data.template SubCol<vector3>(0, 0)); }
212 constexpr point3 y()
const {
return (
_data.template SubCol<vector3>(1, 0)); }
217 constexpr point3 z()
const {
return (
_data.template SubCol<vector3>(2, 0)); }
223 return (
_data.template SubCol<vector3>(3, 0));
242 ROOT::Math::SVector<scalar_type, 4> vector_4;
243 vector_4.Place_at(v, 0);
245 return ROOT::Math::SVector<scalar_type, 4>(
_data * vector_4)
246 .template Sub<point3>(0);
255 ROOT::Math::SVector<scalar_type, 4> vector_4;
256 vector_4.Place_at(v, 0);
258 return ROOT::Math::SVector<scalar_type, 4>(
_data * vector_4)
259 .template Sub<point3>(0);
267 ROOT::Math::SVector<scalar_type, 4> vector_4;
268 vector_4.Place_at(v, 0);
270 return ROOT::Math::SVector<scalar_type, 4>(
_data_inv * vector_4)
271 .template Sub<point3>(0);
280 ROOT::Math::SVector<scalar_type, 4> vector_4;
281 vector_4.Place_at(v, 0);
282 return ROOT::Math::SVector<scalar_type, 4>(
_data * vector_4)
283 .template Sub<point3>(0);
292 ROOT::Math::SVector<scalar_type, 4> vector_4;
293 vector_4.Place_at(v, 0);
294 return ROOT::Math::SVector<scalar_type, 4>(
_data * vector_4)
295 .template Sub<point3>(0);
304 ROOT::Math::SVector<scalar_type, 4> vector_4;
305 vector_4.Place_at(v, 0);
306 return ROOT::Math::SVector<scalar_type, 4>(
_data_inv * vector_4)
307 .template Sub<point3>(0);