19 #ifndef ROOT_Math_GenVector_Cartesian3D
20 #define ROOT_Math_GenVector_Cartesian3D 1
43 template <
class T =
double>
53 Cartesian3D() : fX(0.0), fY(0.0), fZ(0.0) { }
58 Cartesian3D(Scalar xx, Scalar yy, Scalar zz) : fX(xx), fY(yy), fZ(zz) { }
64 template <
class CoordSystem>
65 explicit Cartesian3D(
const CoordSystem & v)
66 : fX(v.X()), fY(v.Y()), fZ(v.Z()) { }
73 Cartesian3D(
const Cartesian3D & v) :
74 fX(v.X()), fY(v.Y()), fZ(v.Z()) { }
79 Cartesian3D & operator= (
const Cartesian3D & v) {
89 void SetCoordinates(
const Scalar src[] ) { fX=src[0]; fY=src[1]; fZ=src[2]; }
94 void GetCoordinates( Scalar dest[] )
const
95 { dest[0] = fX; dest[1] = fY; dest[2] = fZ; }
100 void SetCoordinates(Scalar xx, Scalar yy, Scalar zz) { fX=xx; fY=yy; fZ=zz; }
105 void GetCoordinates(Scalar& xx, Scalar& yy, Scalar& zz)
const {xx=fX; yy=fY; zz=fZ;}
107 Scalar X()
const {
return fX;}
108 Scalar Y()
const {
return fY;}
109 Scalar Z()
const {
return fZ;}
110 Scalar Mag2()
const {
return fX*fX + fY*fY + fZ*fZ;}
111 Scalar Perp2()
const {
return fX*fX + fY*fY ;}
112 Scalar Rho()
const {
return sqrt(Perp2()); }
113 Scalar R()
const {
return sqrt(Mag2()); }
114 Scalar Theta()
const {
return atan2(Rho(), Z()); }
115 Scalar Phi()
const {
return atan2(fY, fX); }
119 return Impl::Eta_FromRhoZ( Rho(), fZ );
125 void SetX(Scalar xx) { fX = xx; }
130 void SetY(Scalar yy) { fY = yy; }
135 void SetZ(Scalar zz) { fZ = zz; }
140 void SetXYZ(Scalar xx, Scalar yy, Scalar zz) {
159 void Negate() { fX = -fX; fY = -fY; fZ = -fZ; }
165 template <
class CoordSystem>
166 Cartesian3D & operator = (
const CoordSystem & v) {
176 bool operator == (
const Cartesian3D & rhs)
const {
177 return fX == rhs.fX && fY == rhs.fY && fZ == rhs.fZ;
179 bool operator != (
const Cartesian3D & rhs)
const {
return !(operator==(rhs));}
186 T x()
const {
return X();}
187 T y()
const {
return Y();}
188 T z()
const {
return Z(); }
193 explicit Cartesian3D(
const Polar3D<T2> & v ) : fZ (v.Z())
195 const T rho = v.Rho();
198 fX = rho * std::cos(v.Phi());
199 fY = rho * std::sin(v.Phi());
207 Cartesian3D & operator = (
const Polar3D<T2> & v)
209 const T rho = v.Rho();
210 fX = rho * cos(v.Phi());
211 fY = rho * sin(v.Phi());
218 #if defined(__MAKECINT__) || defined(G__DICTIONARY)
224 void SetTheta(Scalar theta);
226 void SetPhi(Scalar phi);
228 void SetRho(Scalar rho);
230 void SetEta(Scalar eta);
248 #if defined(__MAKECINT__) || defined(G__DICTIONARY)
263 void Cartesian3D<T>::SetR(Scalar r) {
264 GenVector_exception e(
"Cartesian3D::SetR() is not supposed to be called");
266 Polar3D<Scalar> v(*
this); v.SetR(r); *
this = Cartesian3D<Scalar>(v);
270 void Cartesian3D<T>::SetTheta(Scalar theta) {
271 GenVector_exception e(
"Cartesian3D::SetTheta() is not supposed to be called");
273 Polar3D<Scalar> v(*
this); v.SetTheta(theta); *
this = Cartesian3D<Scalar>(v);
277 void Cartesian3D<T>::SetPhi(Scalar phi) {
278 GenVector_exception e(
"Cartesian3D::SetPhi() is not supposed to be called");
280 Polar3D<Scalar> v(*
this); v.SetPhi(phi); *
this = Cartesian3D<Scalar>(v);
284 void Cartesian3D<T>::SetRho(Scalar rho) {
285 GenVector_exception e(
"Cartesian3D::SetRho() is not supposed to be called");
287 CylindricalEta3D<Scalar> v(*
this); v.SetRho(rho);
288 *
this = Cartesian3D<Scalar>(v);
292 void Cartesian3D<T>::SetEta(Scalar eta) {
293 GenVector_exception e(
"Cartesian3D::SetEta() is not supposed to be called");
295 CylindricalEta3D<Scalar> v(*
this); v.SetEta(eta);
296 *
this = Cartesian3D<Scalar>(v);