17#ifndef ROOT_Math_GenVector_PositionVector3D
18#define ROOT_Math_GenVector_PositionVector3D 1
54 template <
class CoordSystem,
class Tag = DefaultCoordinateSystemTag >
59 typedef typename CoordSystem::Scalar
Scalar;
97 template <
class ForeignVector>
110 template <
class LAVector>
123 template <
class OtherCoords>
133 template <
class OtherCoords>
144 template <
class ForeignVector>
159 template <
class LAVector>
190 { IT
a = begin; IT
b = ++begin; IT
c = ++begin;
192 assert (++begin==end);
214 { IT
a = begin; IT
b = ++begin; IT
c = ++begin;
216 assert (++begin==end);
370 template<
class OtherCoords >
372 return X()*
v.x() +
Y()*
v.y() +
Z()*
v.z();
380 template<
class OtherCoords >
384 Z()*
v.x() -
v.z()*
X(),
385 X()*
v.y() -
v.x()*
Y() );
399 template <
class OtherCoords>
409 template <
class OtherCoords>
474 template <
class OtherCoords,
class OtherTag>
477 template <
class OtherCoords,
class OtherTag>
480 template <
class OtherCoords,
class OtherTag>
483 template <
class OtherCoords,
class OtherTag>
486 template <
class OtherCoords,
class OtherTag>
489 template <
class OtherCoords,
class OtherTag>
514 template <
class CoordSystem,
class U>
531 template <
class CoordSystem1,
class CoordSystem2,
class U>
533 DisplacementVector3D<CoordSystem1,U>
546 template <
class CoordSystem1,
class CoordSystem2,
class U>
548 PositionVector3D<CoordSystem2,U>
559 template <
class CoordSystem1,
class CoordSystem2,
class U>
561 PositionVector3D<CoordSystem2,U>
572 template <
class CoordSystem1,
class CoordSystem2,
class U>
574 PositionVector3D<CoordSystem2,U>
585 class char_t,
class traits_t,
class T,
class U,
586 typename std::enable_if<std::is_arithmetic<typename PositionVector3D<T, U>::Scalar>::value>
::type * =
nullptr>
587 std::basic_ostream<char_t, traits_t> &
operator<<(std::basic_ostream<char_t, traits_t> &os,
588 PositionVector3D<T, U>
const &
v)
592 typename T::Scalar
a = 0;
593 typename T::Scalar
b = 0;
594 typename T::Scalar
c = 0;
595 v.GetCoordinates(
a,
b,
c);
599 typedef GenVector_detail::BitReproducible BR;
612 class char_t,
class traits_t,
class T,
class U,
613 typename std::enable_if<!std::is_arithmetic<typename PositionVector3D<T, U>::Scalar>::value>
::type * =
nullptr>
614 std::basic_ostream<char_t, traits_t> &
operator<<(std::basic_ostream<char_t, traits_t> &os,
619 for (std::size_t i = 0; i < PositionVector3D<T, U>::Scalar::size(); ++i) {
620 os <<
"(" <<
v.x()[i] <<
"," <<
v.y()[i] <<
"," <<
v.z()[i] <<
") ";
627 template<
class char_t,
class traits_t,
class T,
class U >
629 std::basic_istream<char_t,traits_t> &
636 typename T::Scalar
a,
b,
c;
653 v.SetCoordinates(
a,
b,
c);
Class describing a 3D cartesian coordinate system (x, y, z coordinates).
static constexpr unsigned int Dimension
Class describing a generic displacement vector in 3 dimensions.
Class describing a generic position vector (point) in 3 dimensions.
PositionVector3D & operator+=(const DisplacementVector3D< OtherCoords, Tag > &v)
Self Addition with a displacement vector.
unsigned int Dimension() const
Dimension.
constexpr PositionVector3D() noexcept=default
Default constructor.
PositionVector3D< CoordSystem, Tag > & SetZ(Scalar zz)
Change Z - Cartesian3D coordinates only.
Scalar Y() const
Cartesian Y, converting if necessary from internal coordinate system.
Scalar Z() const
Cartesian Z, converting if necessary from internal coordinate system.
Cartesian3D< T > fCoordinates
constexpr PositionVector3D(const PositionVector3D< OtherCoords, OtherTag > &)
PositionVector3D< CoordSystem, Tag > & SetR(Scalar rr)
Change R - Polar3D coordinates only.
bool operator!=(const PositionVector3D &rhs) const
void GetCoordinates(Scalar dest[]) const
get internal data into a C-style array of 3 Scalar numbers
PositionVector3D< CoordSystem, Tag > & SetEta(Scalar etaval)
Change Eta - CylindricalEta3D coordinates only.
void GetCoordinates(IT begin, IT end) const
get internal data into 3 Scalars at *begin to *end (3 past begin)
Cartesian3D< T > CoordinateType
PositionVector3D & operator-=(const DisplacementVector3D< OtherCoords, OtherTag > &)
PositionVector3D< CoordSystem, Tag > & SetPhi(Scalar ang)
Change Phi - Polar3D or CylindricalEta3D coordinates.
Scalar X() const
Cartesian X, converting if necessary from internal coordinate system.
PositionVector3D & operator-=(const DisplacementVector3D< OtherCoords, Tag > &v)
Self Difference with a displacement vector.
PositionVector3D< CoordSystem, Tag > & SetRho(Scalar rr)
Change Rho - CylindricalEta3D coordinates only.
PositionVector3D operator*(Scalar a) const
Multiply a vector by a real number.
PositionVector3D & operator=(const DisplacementVector3D< OtherCoords, OtherTag > &)
PositionVector3D & operator=(const PositionVector3D< OtherCoords, Tag > &v)
Assignment operator from a position vector of arbitrary type.
PositionVector3D< CoordSystem, Tag > & SetCoordinates(const Scalar src[])
Set internal data based on a C-style array of 3 Scalar numbers.
constexpr PositionVector3D(const DisplacementVector3D< OtherCoords, OtherTag > &)
PositionVector3D & operator+=(const DisplacementVector3D< OtherCoords, OtherTag > &)
PositionVector3D< CoordSystem, Tag > & SetY(Scalar yy)
Change Y - Cartesian3D coordinates only.
PositionVector3D & operator/=(Scalar a)
divide this vector by a scalar quantity
Scalar Theta() const
Polar theta, converting if necessary from internal coordinate system.
constexpr PositionVector3D(const PositionVector3D< T, Tag > &v)
Construct from a position vector expressed in different coordinates, or using a different Scalar type...
Cartesian3D< T >::Scalar Scalar
PositionVector3D< CoordSystem, Tag > & SetXYZ(Scalar a, Scalar b, Scalar c)
set the values of the vector from the cartesian components (x,y,z) (if the vector is held in polar or...
PositionVector3D operator/(Scalar a) const
Division of a vector with a real number.
constexpr PositionVector3D(const ForeignVector &v)
Construct from a foreign 3D vector type, for example, Hep3Vector Precondition: v must implement metho...
bool operator==(const PositionVector3D &rhs) const
Exact equality.
Scalar Phi() const
Polar phi, converting if necessary from internal coordinate system.
void GetCoordinates(Scalar &a, Scalar &b, Scalar &c) const
get internal data into 3 Scalar numbers
PositionVector3D< CoordSystem, Tag > & SetCoordinates(Scalar a, Scalar b, Scalar c)
Set internal data based on 3 Scalar numbers.
Scalar Rho() const
Cylindrical transverse component rho.
PositionVector3D Cross(const DisplacementVector3D< OtherCoords, Tag > &v) const
Return vector (Cross) product of this point with a displacement, as a point vector in this coordinate...
PositionVector3D & operator=(const PositionVector3D< OtherCoords, OtherTag > &)
Scalar Perp2() const
Transverse component squared (rho^2 in cylindrical coordinates.
Scalar Mag2() const
Magnitute squared ( r^2 in spherical coordinate).
PositionVector3D< CoordSystem, Tag > & SetTheta(Scalar ang)
Change Theta - Polar3D coordinates only.
PositionVector3D & operator*=(Scalar a)
multiply this vector by a scalar quantity
DefaultCoordinateSystemTag CoordinateSystemTag
Scalar Eta() const
Polar eta, converting if necessary from internal coordinate system.
Scalar Dot(const DisplacementVector3D< OtherCoords, Tag > &v) const
Return the scalar (Dot) product of this with a displacement vector in any coordinate system,...
PositionVector3D< CoordSystem, Tag > & SetCoordinates(IT begin, IT end)
Set internal data based on 3 Scalars at *begin to *end.
PositionVector3D< CoordSystem, Tag > & SetX(Scalar xx)
Change X - Cartesian3D coordinates only.
void GetCoordinates(IT begin) const
get internal data into 3 Scalars at *begin
static constexpr unsigned int fDimension
const Cartesian3D< T > & Coordinates() const
constexpr PositionVector3D(const DisplacementVector3D< T, Tag > &p)
Construct from an arbitrary displacement vector.
Scalar R() const
Polar R, converting if necessary from internal coordinate system.
char_t get_manip(std::basic_ios< char_t, traits_t > &ios, manip_t m)
std::basic_istream< char_t, traits_t > & require_delim(std::basic_istream< char_t, traits_t > &is, manip_t m)
void set_manip(std::basic_ios< char_t, traits_t > &ios, manip_t m, char_t ch)
std::ostream & operator<<(std::ostream &os, const AxisAngle &a)
Stream Output and Input.
std::basic_istream< char_t, traits_t > & operator>>(std::basic_istream< char_t, traits_t > &is, DisplacementVector2D< T, U > &v)
DisplacementVector2D< CoordSystem1, U > operator+(DisplacementVector2D< CoordSystem1, U > v1, const DisplacementVector2D< CoordSystem2, U > &v2)
Addition of DisplacementVector2D vectors.
DisplacementVector2D< CoordSystem1, U > operator-(DisplacementVector2D< CoordSystem1, U > v1, DisplacementVector2D< CoordSystem2, U > const &v2)
Difference between two DisplacementVector2D vectors.
AxisAngle operator*(RotationX const &r1, AxisAngle const &r2)
Multiplication of an axial rotation by an AxisAngle.