17 #ifndef ROOT_Math_GenVector_PositionVector3D
18 #define ROOT_Math_GenVector_PositionVector3D 1
52 template <
class CoordSystem,
class Tag = DefaultCoordinateSystemTag >
53 class PositionVector3D {
57 typedef typename CoordSystem::Scalar Scalar;
58 typedef CoordSystem CoordinateType;
59 typedef Tag CoordinateSystemTag;
67 PositionVector3D() : fCoordinates() { }
74 PositionVector3D(
const Scalar & a,
const Scalar & b,
const Scalar & c) :
75 fCoordinates ( a , b, c) { }
82 explicit PositionVector3D(
const PositionVector3D<T,Tag> & v) :
83 fCoordinates ( v.Coordinates() ) { }
89 explicit PositionVector3D(
const DisplacementVector3D<T,Tag> & p) :
90 fCoordinates ( p.Coordinates() ) { }
96 template <
class ForeignVector>
97 explicit PositionVector3D(
const ForeignVector & v) :
98 fCoordinates ( Cartesian3D<Scalar>( v.x(), v.y(), v.z() ) ) { }
109 template <
class LAVector>
110 PositionVector3D(
const LAVector & v,
size_t index0 ) {
111 fCoordinates = CoordSystem ( v[index0], v[index0+1], v[index0+2] );
122 template <
class OtherCoords>
123 PositionVector3D &
operator=
124 (
const PositionVector3D<OtherCoords,Tag> & v) {
125 fCoordinates = v.Coordinates();
132 template <
class OtherCoords>
133 PositionVector3D &
operator=
134 (
const DisplacementVector3D<OtherCoords,Tag> & v) {
135 fCoordinates = v.Coordinates();
143 template <
class ForeignVector>
144 PositionVector3D & operator= (
const ForeignVector & v) {
145 SetXYZ( v.x(), v.y(), v.z() );
158 template <
class LAVector>
159 PositionVector3D & assignFrom(
const LAVector & v,
size_t index0 = 0) {
160 fCoordinates = CoordSystem ( v[index0], v[index0+1], v[index0+2] );
168 const CoordSystem & Coordinates()
const {
175 PositionVector3D<CoordSystem, Tag>& SetCoordinates(
const Scalar src[] )
176 { fCoordinates.SetCoordinates(src);
return *
this; }
181 PositionVector3D<CoordSystem, Tag>& SetCoordinates( Scalar a, Scalar b, Scalar c )
182 { fCoordinates.SetCoordinates(a, b, c);
return *
this; }
189 PositionVector3D<CoordSystem, Tag>& SetCoordinates( IT begin, IT end )
191 PositionVector3D<CoordSystem, Tag>& SetCoordinates( IT begin, IT )
193 { IT a = begin; IT b = ++begin; IT c = ++begin;
194 assert (++begin==end);
195 SetCoordinates (*a,*b,*c);
202 void GetCoordinates( Scalar& a, Scalar& b, Scalar& c )
const
203 { fCoordinates.GetCoordinates(a, b, c); }
208 void GetCoordinates( Scalar dest[] )
const
209 { fCoordinates.GetCoordinates(dest); }
216 void GetCoordinates( IT begin, IT end )
const
218 void GetCoordinates( IT begin, IT ) const
220 { IT a = begin; IT b = ++begin; IT c = ++begin;
221 assert (++begin==end);
222 GetCoordinates (*a,*b,*c);
229 void GetCoordinates( IT begin )
const {
230 Scalar a = Scalar(0);
231 Scalar b = Scalar(0);
232 Scalar c = Scalar(0);
233 GetCoordinates(a, b, c);
244 PositionVector3D<CoordSystem, Tag>& SetXYZ (Scalar a, Scalar b, Scalar c) {
245 fCoordinates.SetXYZ(a,b,c);
254 bool operator==(
const PositionVector3D & rhs)
const {
255 return fCoordinates==rhs.fCoordinates;
257 bool operator!= (
const PositionVector3D & rhs)
const {
258 return !(operator==(rhs));
266 Scalar X()
const {
return fCoordinates.X(); }
271 Scalar Y()
const {
return fCoordinates.Y(); }
276 Scalar Z()
const {
return fCoordinates.Z(); }
281 Scalar R()
const {
return fCoordinates.R(); }
286 Scalar Theta()
const {
return fCoordinates.Theta(); }
291 Scalar Phi()
const {
return fCoordinates.Phi(); }
296 Scalar Eta()
const {
return fCoordinates.Eta(); }
301 Scalar Rho()
const {
return fCoordinates.Rho(); }
308 Scalar Mag2()
const {
return fCoordinates.Mag2();}
313 Scalar Perp2()
const {
return fCoordinates.Perp2();}
323 PositionVector3D<CoordSystem, Tag>& SetX (Scalar xx) { fCoordinates.SetX(xx);
return *
this;}
328 PositionVector3D<CoordSystem, Tag>& SetY (Scalar yy) { fCoordinates.SetY(yy);
return *
this;}
333 PositionVector3D<CoordSystem, Tag>& SetZ (Scalar zz) { fCoordinates.SetZ(zz);
return *
this;}
338 PositionVector3D<CoordSystem, Tag>& SetR (Scalar rr) { fCoordinates.SetR(rr);
return *
this;}
343 PositionVector3D<CoordSystem, Tag>& SetTheta (Scalar ang) { fCoordinates.SetTheta(ang);
return *
this;}
348 PositionVector3D<CoordSystem, Tag>& SetPhi (Scalar ang) { fCoordinates.SetPhi(ang);
return *
this;}
353 PositionVector3D<CoordSystem, Tag>& SetRho (Scalar rr) { fCoordinates.SetRho(rr);
return *
this;}
358 PositionVector3D<CoordSystem, Tag>& SetEta (Scalar etaval) { fCoordinates.SetEta(etaval);
return *
this;}
367 template<
class OtherCoords >
368 Scalar Dot(
const DisplacementVector3D<OtherCoords,Tag> & v)
const {
369 return X()*v.x() + Y()*v.y() + Z()*v.z();
377 template<
class OtherCoords >
378 PositionVector3D Cross(
const DisplacementVector3D<OtherCoords,Tag> & v)
const {
379 PositionVector3D result;
380 result.SetXYZ ( Y()*v.z() - v.y()*Z(),
381 Z()*v.x() - v.z()*X(),
382 X()*v.y() - v.x()*Y() );
396 template <
class OtherCoords>
397 PositionVector3D & operator+= (
const DisplacementVector3D<OtherCoords,Tag> & v)
399 SetXYZ( X() + v.X(), Y() + v.Y(), Z() + v.Z() );
406 template <
class OtherCoords>
407 PositionVector3D & operator-= (
const DisplacementVector3D<OtherCoords,Tag> & v)
409 SetXYZ( X() - v.X(), Y() - v.Y(), Z() - v.Z() );
416 PositionVector3D & operator *= (Scalar a) {
417 fCoordinates.Scale(a);
424 PositionVector3D & operator /= (Scalar a) {
425 fCoordinates.Scale(1/a);
434 PositionVector3D operator * ( Scalar a )
const {
435 PositionVector3D tmp(*
this);
443 PositionVector3D operator / (Scalar a)
const {
444 PositionVector3D tmp(*
this);
451 Scalar x()
const {
return fCoordinates.X(); }
452 Scalar y()
const {
return fCoordinates.Y(); }
453 Scalar z()
const {
return fCoordinates.Z(); }
454 Scalar r()
const {
return fCoordinates.R(); }
455 Scalar theta()
const {
return fCoordinates.Theta(); }
456 Scalar phi()
const {
return fCoordinates.Phi(); }
457 Scalar eta()
const {
return fCoordinates.Eta(); }
458 Scalar rho()
const {
return fCoordinates.Rho(); }
459 Scalar mag2()
const {
return fCoordinates.Mag2(); }
460 Scalar perp2()
const {
return fCoordinates.Perp2(); }
464 CoordSystem fCoordinates;
470 template <
class OtherCoords,
class OtherTag>
471 explicit PositionVector3D(
const PositionVector3D<OtherCoords, OtherTag> & );
473 template <
class OtherCoords,
class OtherTag>
474 explicit PositionVector3D(
const DisplacementVector3D<OtherCoords, OtherTag> & );
476 template <
class OtherCoords,
class OtherTag>
477 PositionVector3D & operator=(
const PositionVector3D<OtherCoords, OtherTag> & );
479 template <
class OtherCoords,
class OtherTag>
480 PositionVector3D & operator=(
const DisplacementVector3D<OtherCoords, OtherTag> & );
482 template <
class OtherCoords,
class OtherTag>
483 PositionVector3D & operator+=(
const DisplacementVector3D<OtherCoords, OtherTag> & );
485 template <
class OtherCoords,
class OtherTag>
486 PositionVector3D & operator-=(
const DisplacementVector3D<OtherCoords, OtherTag> & );
510 template <
class CoordSystem,
class U>
512 PositionVector3D<CoordSystem>
513 operator * (
typename PositionVector3D<CoordSystem,U>::Scalar a,
514 PositionVector3D<CoordSystem,U> v) {
527 template <
class CoordSystem1,
class CoordSystem2,
class U>
529 DisplacementVector3D<CoordSystem1,U>
530 operator-(
const PositionVector3D<CoordSystem1,U> & v1,
531 const PositionVector3D<CoordSystem2,U> & v2) {
532 return DisplacementVector3D<CoordSystem1,U>( Cartesian3D<typename CoordSystem1::Scalar>(
533 v1.X()-v2.X(), v1.Y()-v2.Y(),v1.Z()-v2.Z() )
542 template <
class CoordSystem1,
class CoordSystem2,
class U>
544 PositionVector3D<CoordSystem2,U>
545 operator+( PositionVector3D<CoordSystem2,U> p1,
546 const DisplacementVector3D<CoordSystem1,U> & v2) {
555 template <
class CoordSystem1,
class CoordSystem2,
class U>
557 PositionVector3D<CoordSystem2,U>
558 operator+( DisplacementVector3D<CoordSystem1,U>
const & v1,
559 PositionVector3D<CoordSystem2,U> p2) {
568 template <
class CoordSystem1,
class CoordSystem2,
class U>
570 PositionVector3D<CoordSystem2,U>
571 operator-( PositionVector3D<CoordSystem2,U> p1,
572 DisplacementVector3D<CoordSystem1,U>
const & v2) {
581 class char_t,
class traits_t,
class T,
class U,
582 typename std::enable_if<std::is_arithmetic<typename PositionVector3D<T, U>::Scalar>::value>::type * =
nullptr>
583 std::basic_ostream<char_t, traits_t> &operator<<(std::basic_ostream<char_t, traits_t> &os,
584 PositionVector3D<T, U>
const &v)
588 typename T::Scalar a = 0;
589 typename T::Scalar b = 0;
590 typename T::Scalar c = 0;
591 v.GetCoordinates(a, b, c);
593 if (detail::get_manip(os, detail::bitforbit)) {
594 detail::set_manip(os, detail::bitforbit,
'\00');
595 typedef GenVector_detail::BitReproducible BR;
600 os << detail::get_manip(os, detail::open) << a << detail::get_manip(os, detail::sep) << b
601 << detail::get_manip(os, detail::sep) << c << detail::get_manip(os, detail::close);
608 class char_t,
class traits_t,
class T,
class U,
609 typename std::enable_if<!std::is_arithmetic<typename PositionVector3D<T, U>::Scalar>::value>::type * =
nullptr>
610 std::basic_ostream<char_t, traits_t> &operator<<(std::basic_ostream<char_t, traits_t> &os,
611 PositionVector3D<T, U>
const &v)
615 for (std::size_t i = 0; i < PositionVector3D<T, U>::Scalar::Size; ++i) {
616 os <<
"(" << v.x()[i] <<
"," << v.y()[i] <<
"," << v.z()[i] <<
") ";
623 template<
class char_t,
class traits_t,
class T,
class U >
625 std::basic_istream<char_t,traits_t> &
626 operator >> ( std::basic_istream<char_t,traits_t> & is
627 , PositionVector3D<T,U> & v
632 typename T::Scalar a, b, c;
634 if( detail::get_manip( is, detail::bitforbit ) ) {
635 detail::set_manip( is, detail::bitforbit,
'\00' );
636 typedef GenVector_detail::BitReproducible BR;
642 detail::require_delim( is, detail::open ); is >> a;
643 detail::require_delim( is, detail::sep ); is >> b;
644 detail::require_delim( is, detail::sep ); is >> c;
645 detail::require_delim( is, detail::close );
649 v.SetCoordinates(a, b, c);