20 #ifndef ROOT_Math_GenVector_DisplacementVector3D
21 #define ROOT_Math_GenVector_DisplacementVector3D 1
66 template <
class CoordSystem,
class Tag = DefaultCoordinateSystemTag >
67 class DisplacementVector3D {
71 typedef typename CoordSystem::Scalar Scalar;
72 typedef CoordSystem CoordinateType;
73 typedef Tag CoordinateSystemTag;
80 DisplacementVector3D ( ) : fCoordinates() { }
88 DisplacementVector3D(Scalar a, Scalar b, Scalar c) :
89 fCoordinates ( a , b, c ) { }
95 template <
class OtherCoords>
96 explicit DisplacementVector3D(
const DisplacementVector3D<OtherCoords, Tag> & v) :
97 fCoordinates ( v.Coordinates() ) { }
104 template <
class OtherCoords>
105 explicit DisplacementVector3D(
const PositionVector3D<OtherCoords,Tag> & p) :
106 fCoordinates ( p.Coordinates() ) { }
113 template <
class ForeignVector>
114 explicit DisplacementVector3D(
const ForeignVector & v) :
115 fCoordinates ( Cartesian3D<Scalar>( v.x(), v.y(), v.z() ) ) { }
127 template <
class LAVector>
128 DisplacementVector3D(
const LAVector & v,
size_t index0 ) {
129 fCoordinates = CoordSystem ( v[index0], v[index0+1], v[index0+2] );
140 template <
class OtherCoords>
141 DisplacementVector3D &
operator=
142 (
const DisplacementVector3D<OtherCoords, Tag> & v) {
143 fCoordinates = v.Coordinates();
151 template <
class OtherCoords>
152 DisplacementVector3D &
operator=
153 (
const PositionVector3D<OtherCoords,Tag> & rhs) {
154 SetXYZ(rhs.x(), rhs.y(), rhs.z());
163 template <
class ForeignVector>
164 DisplacementVector3D & operator= (
const ForeignVector & v) {
165 SetXYZ( v.x(), v.y(), v.z() );
179 template <
class LAVector>
180 DisplacementVector3D & assignFrom(
const LAVector & v,
size_t index0 = 0) {
181 fCoordinates = CoordSystem ( v[index0], v[index0+1], v[index0+2] );
191 CoordSystem Coordinates()
const {
198 DisplacementVector3D<CoordSystem, Tag>& SetCoordinates(
const Scalar src[] )
199 { fCoordinates.SetCoordinates(src);
return *
this; }
204 DisplacementVector3D<CoordSystem, Tag>& SetCoordinates( Scalar a, Scalar b, Scalar c )
205 { fCoordinates.SetCoordinates(a, b, c);
return *
this; }
212 DisplacementVector3D<CoordSystem, Tag>& SetCoordinates( IT begin, IT end )
214 DisplacementVector3D<CoordSystem, Tag>& SetCoordinates( IT begin, IT )
216 { IT a = begin; IT b = ++begin; IT c = ++begin;
217 assert (++begin==end);
218 SetCoordinates (*a,*b,*c);
225 void GetCoordinates( Scalar& a, Scalar& b, Scalar& c )
const
226 { fCoordinates.GetCoordinates(a, b, c); }
231 void GetCoordinates( Scalar dest[] )
const
232 { fCoordinates.GetCoordinates(dest); }
239 void GetCoordinates( IT begin, IT end )
const
241 void GetCoordinates( IT begin, IT ) const
243 { IT a = begin; IT b = ++begin; IT c = ++begin;
244 assert (++begin==end);
245 GetCoordinates (*a,*b,*c);
251 void GetCoordinates( IT begin)
const {
252 Scalar a = Scalar(0);
253 Scalar b = Scalar(0);
254 Scalar c = Scalar(0);
255 GetCoordinates(a, b, c);
266 DisplacementVector3D<CoordSystem, Tag>& SetXYZ (Scalar a, Scalar b, Scalar c) {
267 fCoordinates.SetXYZ(a, b, c);
276 bool operator==(
const DisplacementVector3D & rhs)
const {
277 return fCoordinates==rhs.fCoordinates;
279 bool operator!= (
const DisplacementVector3D & rhs)
const {
280 return !(operator==(rhs));
288 Scalar X()
const {
return fCoordinates.X(); }
293 Scalar Y()
const {
return fCoordinates.Y(); }
298 Scalar Z()
const {
return fCoordinates.Z(); }
303 Scalar R()
const {
return fCoordinates.R(); }
308 Scalar Theta()
const {
return fCoordinates.Theta(); }
313 Scalar Phi()
const {
return fCoordinates.Phi(); }
318 Scalar Eta()
const {
return fCoordinates.Eta(); }
323 Scalar Rho()
const {
return fCoordinates.Rho(); }
330 Scalar Mag2()
const {
return fCoordinates.Mag2();}
335 Scalar Perp2()
const {
return fCoordinates.Perp2();}
340 template <typename SCALAR = Scalar, typename std::enable_if<std::is_arithmetic<SCALAR>::value>::type * =
nullptr>
341 DisplacementVector3D Unit()
const
343 const auto tot = R();
344 return tot == 0 ? *
this : DisplacementVector3D(*
this) / tot;
350 template <typename SCALAR = Scalar, typename std::enable_if<!std::is_arithmetic<SCALAR>::value>::type * =
nullptr>
351 DisplacementVector3D Unit()
const
354 tot(tot == SCALAR(0)) = SCALAR(1);
355 return DisplacementVector3D(*
this) / tot;
363 DisplacementVector3D<CoordSystem, Tag>& SetX (Scalar xx) { fCoordinates.SetX(xx);
return *
this;}
368 DisplacementVector3D<CoordSystem, Tag>& SetY (Scalar yy) { fCoordinates.SetY(yy);
return *
this;}
373 DisplacementVector3D<CoordSystem, Tag>& SetZ (Scalar zz) { fCoordinates.SetZ(zz);
return *
this;}
378 DisplacementVector3D<CoordSystem, Tag>& SetR (Scalar rr) { fCoordinates.SetR(rr);
return *
this;}
383 DisplacementVector3D<CoordSystem, Tag>& SetTheta (Scalar ang) { fCoordinates.SetTheta(ang);
return *
this;}
388 DisplacementVector3D<CoordSystem, Tag>& SetPhi (Scalar ang) { fCoordinates.SetPhi(ang);
return *
this;}
393 DisplacementVector3D<CoordSystem, Tag>& SetRho (Scalar rr) { fCoordinates.SetRho(rr);
return *
this;}
398 DisplacementVector3D<CoordSystem, Tag>& SetEta (Scalar etaval) { fCoordinates.SetEta(etaval);
return *
this;}
409 template<
class OtherCoords >
410 Scalar Dot(
const DisplacementVector3D<OtherCoords,Tag> & v)
const {
411 return X()*v.X() + Y()*v.Y() + Z()*v.Z();
418 template<
class OtherVector >
419 Scalar Dot(
const OtherVector & v)
const {
420 return X()*v.x() + Y()*v.y() + Z()*v.z();
429 template <
class OtherCoords>
430 DisplacementVector3D Cross(
const DisplacementVector3D<OtherCoords,Tag> & v)
const {
431 DisplacementVector3D result;
432 result.SetXYZ ( Y()*v.Z() - v.Y()*Z(),
433 Z()*v.X() - v.Z()*X(),
434 X()*v.Y() - v.X()*Y() );
443 template <
class OtherVector>
444 DisplacementVector3D Cross(
const OtherVector & v)
const {
445 DisplacementVector3D result;
446 result.SetXYZ ( Y()*v.z() - v.y()*Z(),
447 Z()*v.x() - v.z()*X(),
448 X()*v.y() - v.x()*Y() );
457 template <
class OtherCoords>
458 DisplacementVector3D &
operator+=
459 (
const DisplacementVector3D<OtherCoords,Tag> & v) {
460 SetXYZ( X() + v.X(), Y() + v.Y(), Z() + v.Z() );
467 template <
class OtherCoords>
468 DisplacementVector3D &
operator-=
469 (
const DisplacementVector3D<OtherCoords,Tag> & v) {
470 SetXYZ( x() - v.x(), y() - v.y(), z() - v.z() );
478 DisplacementVector3D & operator*= (Scalar a) {
479 fCoordinates.Scale(a);
486 DisplacementVector3D & operator/= (Scalar a) {
487 fCoordinates.Scale(1/a);
497 DisplacementVector3D operator * ( Scalar a )
const {
498 DisplacementVector3D tmp(*
this);
506 DisplacementVector3D operator - ( )
const {
507 return operator*( Scalar(-1) );
513 DisplacementVector3D operator + ( )
const {
return *
this;}
518 DisplacementVector3D operator/ (Scalar a)
const {
519 DisplacementVector3D tmp(*
this);
527 Scalar x()
const {
return fCoordinates.X(); }
528 Scalar y()
const {
return fCoordinates.Y(); }
529 Scalar z()
const {
return fCoordinates.Z(); }
530 Scalar r()
const {
return fCoordinates.R(); }
531 Scalar theta()
const {
return fCoordinates.Theta(); }
532 Scalar phi()
const {
return fCoordinates.Phi(); }
533 Scalar eta()
const {
return fCoordinates.Eta(); }
534 Scalar rho()
const {
return fCoordinates.Rho(); }
535 Scalar mag2()
const {
return fCoordinates.Mag2(); }
536 Scalar perp2()
const {
return fCoordinates.Perp2(); }
537 DisplacementVector3D unit()
const {
return Unit();}
542 CoordSystem fCoordinates;
544 #ifdef NOT_SURE_THIS_SHOULD_BE_FORBIDDEN
549 DisplacementVector3D Cross(
const PositionVector3D<T2> & )
const;
555 template <
class OtherCoords,
class OtherTag>
556 explicit DisplacementVector3D(
const DisplacementVector3D<OtherCoords, OtherTag> & ) {}
558 template <
class OtherCoords,
class OtherTag>
559 explicit DisplacementVector3D(
const PositionVector3D<OtherCoords, OtherTag> & ) {}
561 template <
class OtherCoords,
class OtherTag>
562 DisplacementVector3D & operator=(
const DisplacementVector3D<OtherCoords, OtherTag> & );
565 template <
class OtherCoords,
class OtherTag>
566 DisplacementVector3D & operator=(
const PositionVector3D<OtherCoords, OtherTag> & );
568 template <
class OtherCoords,
class OtherTag>
569 DisplacementVector3D & operator+=(
const DisplacementVector3D<OtherCoords, OtherTag> & );
571 template <
class OtherCoords,
class OtherTag>
572 DisplacementVector3D & operator-=(
const DisplacementVector3D<OtherCoords, OtherTag> & );
574 template<
class OtherCoords,
class OtherTag >
575 Scalar Dot(
const DisplacementVector3D<OtherCoords, OtherTag> & )
const;
577 template<
class OtherCoords,
class OtherTag >
578 DisplacementVector3D Cross(
const DisplacementVector3D<OtherCoords, OtherTag> & )
const;
593 template <
class CoordSystem1,
class CoordSystem2,
class U>
595 DisplacementVector3D<CoordSystem1,U>
596 operator+( DisplacementVector3D<CoordSystem1,U> v1,
597 const DisplacementVector3D<CoordSystem2,U> & v2) {
606 template <
class CoordSystem1,
class CoordSystem2,
class U>
608 DisplacementVector3D<CoordSystem1,U>
609 operator-( DisplacementVector3D<CoordSystem1,U> v1,
610 DisplacementVector3D<CoordSystem2,U>
const & v2) {
619 template <
class CoordSystem,
class U>
621 DisplacementVector3D<CoordSystem,U>
622 operator * (
typename DisplacementVector3D<CoordSystem,U>::Scalar a,
623 DisplacementVector3D<CoordSystem,U> v) {
637 template <
class char_t,
class traits_t,
class T,
class U,
638 typename std::enable_if<std::is_arithmetic<typename DisplacementVector3D<T, U>::Scalar>::value>::type * =
640 std::basic_ostream<char_t, traits_t> &operator<<(std::basic_ostream<char_t, traits_t> &os,
641 DisplacementVector3D<T, U>
const &v)
645 typename T::Scalar a, b, c;
646 v.GetCoordinates(a, b, c);
648 if (detail::get_manip(os, detail::bitforbit)) {
649 detail::set_manip(os, detail::bitforbit,
'\00');
650 typedef GenVector_detail::BitReproducible BR;
655 os << detail::get_manip(os, detail::open) << a << detail::get_manip(os, detail::sep) << b
656 << detail::get_manip(os, detail::sep) << c << detail::get_manip(os, detail::close);
662 template <
class char_t,
class traits_t,
class T,
class U,
663 typename std::enable_if<!std::is_arithmetic<typename DisplacementVector3D<T, U>::Scalar>::value>::type * =
665 std::basic_ostream<char_t, traits_t> &operator<<(std::basic_ostream<char_t, traits_t> &os,
666 DisplacementVector3D<T, U>
const &v)
670 for (std::size_t i = 0; i < PositionVector3D<T, U>::Scalar::Size; ++i) {
671 os <<
"(" << v.x()[i] <<
"," << v.y()[i] <<
"," << v.z()[i] <<
") ";
678 template<
class char_t,
class traits_t,
class T,
class U >
680 std::basic_istream<char_t,traits_t> &
681 operator >> ( std::basic_istream<char_t,traits_t> & is
682 , DisplacementVector3D<T,U> & v
687 typename T::Scalar a, b, c;
689 if( detail::get_manip( is, detail::bitforbit ) ) {
690 detail::set_manip( is, detail::bitforbit,
'\00' );
691 typedef GenVector_detail::BitReproducible BR;
697 detail::require_delim( is, detail::open ); is >> a;
698 detail::require_delim( is, detail::sep ); is >> b;
699 detail::require_delim( is, detail::sep ); is >> c;
700 detail::require_delim( is, detail::close );
704 v.SetCoordinates(a, b, c);