CLHEP 2.0.4.7 Reference Documentation
CLHEP Home Page CLHEP Documentation CLHEP Bug Reports |
00001 // -*- C++ -*- 00002 // $Id: BasicVector3D.h,v 1.3.4.4 2005/03/18 22:26:24 garren Exp $ 00003 // --------------------------------------------------------------------------- 00004 // 00005 // This file is a part of the CLHEP - a Class Library for High Energy Physics. 00006 // 00007 // History: 00008 // 12.06.01 E.Chernyaev - CLHEP-1.7: initial version 00009 // 14.03.03 E.Chernyaev - CLHEP-1.9: template version 00010 // 00011 00012 #ifndef BASIC_VECTOR3D_H 00013 #define BASIC_VECTOR3D_H 00014 00015 #include <iosfwd> 00016 #include "CLHEP/Geometry/defs.h" 00017 #include "CLHEP/Vector/ThreeVector.h" 00018 00019 namespace HepGeom { 00028 template<class T> class BasicVector3D { 00029 protected: 00030 T v_[3]; 00031 00036 BasicVector3D() { v_[0] = 0; v_[1] = 0; v_[2] = 0; } 00037 00038 public: 00042 enum { 00043 X = 0, 00044 Y = 1, 00045 Z = 2, 00046 NUM_COORDINATES = 3, 00047 SIZE = NUM_COORDINATES 00048 }; 00049 00052 BasicVector3D(T x, T y, T z) { v_[0] = x; v_[1] = y; v_[2] = z; } 00053 00061 BasicVector3D(const BasicVector3D<float> & v) { 00062 v_[0] = v.x(); v_[1] = v.y(); v_[2] = v.z(); 00063 } 00064 00067 virtual ~BasicVector3D() {} 00068 00069 // ------------------------- 00070 // Interface to "good old C" 00071 // ------------------------- 00072 00075 operator T * () { return v_; } 00076 00079 operator const T * () const { return v_; } 00080 00086 operator CLHEP::Hep3Vector () const { return CLHEP::Hep3Vector(x(),y(),z()); } 00087 00088 // ----------------------------- 00089 // General arithmetic operations 00090 // ----------------------------- 00091 00094 BasicVector3D<T> & operator= (const BasicVector3D<T> & v) { 00095 v_[0] = v.v_[0]; v_[1] = v.v_[1]; v_[2] = v.v_[2]; return *this; 00096 } 00099 BasicVector3D<T> & operator+=(const BasicVector3D<T> & v) { 00100 v_[0] += v.v_[0]; v_[1] += v.v_[1]; v_[2] += v.v_[2]; return *this; 00101 } 00104 BasicVector3D<T> & operator-=(const BasicVector3D<T> & v) { 00105 v_[0] -= v.v_[0]; v_[1] -= v.v_[1]; v_[2] -= v.v_[2]; return *this; 00106 } 00109 BasicVector3D<T> & operator*=(double a) { 00110 v_[0] *= a; v_[1] *= a; v_[2] *= a; return *this; 00111 } 00114 BasicVector3D<T> & operator/=(double a) { 00115 v_[0] /= a; v_[1] /= a; v_[2] /= a; return *this; 00116 } 00117 00118 // ------------ 00119 // Subscripting 00120 // ------------ 00121 00124 T operator()(int i) const { return v_[i]; } 00127 T operator[](int i) const { return v_[i]; } 00128 00131 T & operator()(int i) { return v_[i]; } 00134 T & operator[](int i) { return v_[i]; } 00135 00136 // ------------------------------------ 00137 // Cartesian coordinate system: x, y, z 00138 // ------------------------------------ 00139 00142 T x() const { return v_[0]; } 00145 T y() const { return v_[1]; } 00148 T z() const { return v_[2]; } 00149 00152 void setX(T a) { v_[0] = a; } 00155 void setY(T a) { v_[1] = a; } 00158 void setZ(T a) { v_[2] = a; } 00159 00162 void set(T x, T y, T z) { v_[0] = x; v_[1] = y; v_[2] = z; } 00163 00164 // ------------------------------------------ 00165 // Cylindrical coordinate system: rho, phi, z 00166 // ------------------------------------------ 00167 00170 T perp2() const { return x()*x()+y()*y(); } 00173 T perp() const { return sqrt(perp2()); } 00176 T rho() const { return perp(); } 00177 00180 void setPerp(T rh) { 00181 T factor = perp(); 00182 if (factor > 0) { 00183 factor = rh/factor; v_[0] *= factor; v_[1] *= factor; 00184 } 00185 } 00186 00187 // ------------------------------------------ 00188 // Spherical coordinate system: r, phi, theta 00189 // ------------------------------------------ 00190 00193 T mag2() const { return x()*x()+y()*y()+z()*z(); } 00196 T mag() const { return sqrt(mag2()); } 00199 T r() const { return mag(); } 00202 T phi() const { 00203 return x() == 0 && y() == 0 ? 0 : atan2(y(),x()); 00204 } 00207 T theta() const { 00208 return x() == 0 && y() == 0 && z() == 0 ? 0 : atan2(perp(),z()); 00209 } 00212 T cosTheta() const { T ma = mag(); return ma == 0 ? 1 : z()/ma; } 00213 00216 T getR() const { return r(); } 00219 T getPhi() const { return phi(); } 00222 T getTheta() const { return theta(); } 00223 00226 void setMag(T ma) { 00227 T factor = mag(); 00228 if (factor > 0) { 00229 factor = ma/factor; v_[0] *= factor; v_[1] *= factor; v_[2] *= factor; 00230 } 00231 } 00234 void setR(T ma) { setMag(ma); } 00237 void setPhi(T ph) { T xy = perp(); setX(xy*cos(ph)); setY(xy*sin(ph)); } 00240 void setTheta(T th) { 00241 T ma = mag(); 00242 T ph = phi(); 00243 set(ma*sin(th)*cos(ph), ma*sin(th)*sin(ph), ma*cos(th)); 00244 } 00245 00246 // --------------- 00247 // Pseudo rapidity 00248 // --------------- 00249 00252 T pseudoRapidity() const; 00255 T eta() const { return pseudoRapidity(); } 00258 T getEta() const { return pseudoRapidity(); } 00259 00262 void setEta(T a); 00263 00264 // ------------------- 00265 // Combine two vectors 00266 // ------------------- 00267 00270 T dot(const BasicVector3D<T> & v) const { 00271 return x()*v.x()+y()*v.y()+z()*v.z(); 00272 } 00273 00276 BasicVector3D<T> cross(const BasicVector3D<T> & v) const { 00277 return BasicVector3D<T>(y()*v.z()-v.y()*z(), 00278 z()*v.x()-v.z()*x(), 00279 x()*v.y()-v.x()*y()); 00280 } 00281 00284 T perp2(const BasicVector3D<T> & v) const { 00285 T tot = v.mag2(), s = dot(v); 00286 return tot > 0 ? mag2()-s*s/tot : mag2(); 00287 } 00288 00291 T perp(const BasicVector3D<T> & v) const { 00292 return sqrt(perp2(v)); 00293 } 00294 00297 T angle(const BasicVector3D<T> & v) const; 00298 00299 // --------------- 00300 // Related vectors 00301 // --------------- 00302 00305 BasicVector3D<T> unit() const { 00306 T len = mag(); 00307 return (len > 0) ? 00308 BasicVector3D<T>(x()/len, y()/len, z()/len) : BasicVector3D<T>(); 00309 } 00310 00313 BasicVector3D<T> orthogonal() const { 00314 T dx = x() < 0 ? -x() : x(); 00315 T dy = y() < 0 ? -y() : y(); 00316 T dz = z() < 0 ? -z() : z(); 00317 if (dx < dy) { 00318 return dx < dz ? 00319 BasicVector3D<T>(0,z(),-y()) : BasicVector3D<T>(y(),-x(),0); 00320 }else{ 00321 return dy < dz ? 00322 BasicVector3D<T>(-z(),0,x()) : BasicVector3D<T>(y(),-x(),0); 00323 } 00324 } 00325 00326 // --------- 00327 // Rotations 00328 // --------- 00329 00332 BasicVector3D<T> & rotateX(T a); 00335 BasicVector3D<T> & rotateY(T a); 00338 BasicVector3D<T> & rotateZ(T a); 00341 BasicVector3D<T> & rotate(T a, const BasicVector3D<T> & v); 00342 }; 00343 00344 /************************************************************************* 00345 * * 00346 * Non-member functions for BasicVector3D<float> * 00347 * * 00348 *************************************************************************/ 00349 00354 std::ostream & 00355 operator<<(std::ostream &, const BasicVector3D<float> &); 00356 00361 std::istream & 00362 operator>>(std::istream &, BasicVector3D<float> &); 00363 00368 inline BasicVector3D<float> 00369 operator+(const BasicVector3D<float> & v) { return v; } 00370 00375 inline BasicVector3D<float> 00376 operator+(const BasicVector3D<float> & a, const BasicVector3D<float> & b) { 00377 return BasicVector3D<float>(a.x()+b.x(), a.y()+b.y(), a.z()+b.z()); 00378 } 00379 00384 inline BasicVector3D<float> 00385 operator-(const BasicVector3D<float> & v) { 00386 return BasicVector3D<float>(-v.x(), -v.y(), -v.z()); 00387 } 00388 00393 inline BasicVector3D<float> 00394 operator-(const BasicVector3D<float> & a, const BasicVector3D<float> & b) { 00395 return BasicVector3D<float>(a.x()-b.x(), a.y()-b.y(), a.z()-b.z()); 00396 } 00397 00402 inline BasicVector3D<float> 00403 operator*(const BasicVector3D<float> & v, double a) { 00404 return BasicVector3D<float>(v.x()*static_cast<float>(a), v.y()*static_cast<float>(a), v.z()*static_cast<float>(a)); 00405 } 00406 00411 inline float 00412 operator*(const BasicVector3D<float> & a, const BasicVector3D<float> & b) { 00413 return a.dot(b); 00414 } 00415 00420 inline BasicVector3D<float> 00421 operator*(double a, const BasicVector3D<float> & v) { 00422 return BasicVector3D<float>(static_cast<float>(a)*v.x(), static_cast<float>(a)*v.y(), static_cast<float>(a)*v.z()); 00423 } 00424 00429 inline BasicVector3D<float> 00430 operator/(const BasicVector3D<float> & v, double a) { 00431 return BasicVector3D<float>(v.x()/static_cast<float>(a), v.y()/static_cast<float>(a), v.z()/static_cast<float>(a)); 00432 } 00433 00438 inline bool 00439 operator==(const BasicVector3D<float> & a, const BasicVector3D<float> & b) { 00440 return (a.x()==b.x() && a.y()==b.y() && a.z()==b.z()); 00441 } 00442 00447 inline bool 00448 operator!=(const BasicVector3D<float> & a, const BasicVector3D<float> & b) { 00449 return (a.x()!=b.x() || a.y()!=b.y() || a.z()!=b.z()); 00450 } 00451 00452 /************************************************************************* 00453 * * 00454 * Non-member functions for BasicVector3D<double> * 00455 * * 00456 *************************************************************************/ 00457 00462 std::ostream & 00463 operator<<(std::ostream &, const BasicVector3D<double> &); 00464 00469 std::istream & 00470 operator>>(std::istream &, BasicVector3D<double> &); 00471 00476 inline BasicVector3D<double> 00477 operator+(const BasicVector3D<double> & v) { return v; } 00478 00483 inline BasicVector3D<double> 00484 operator+(const BasicVector3D<double> & a,const BasicVector3D<double> & b) { 00485 return BasicVector3D<double>(a.x()+b.x(), a.y()+b.y(), a.z()+b.z()); 00486 } 00487 00492 inline BasicVector3D<double> 00493 operator-(const BasicVector3D<double> & v) { 00494 return BasicVector3D<double>(-v.x(), -v.y(), -v.z()); 00495 } 00496 00501 inline BasicVector3D<double> 00502 operator-(const BasicVector3D<double> & a,const BasicVector3D<double> & b) { 00503 return BasicVector3D<double>(a.x()-b.x(), a.y()-b.y(), a.z()-b.z()); 00504 } 00505 00510 inline BasicVector3D<double> 00511 operator*(const BasicVector3D<double> & v, double a) { 00512 return BasicVector3D<double>(v.x()*a, v.y()*a, v.z()*a); 00513 } 00514 00519 inline double 00520 operator*(const BasicVector3D<double> & a,const BasicVector3D<double> & b) { 00521 return a.dot(b); 00522 } 00523 00528 inline BasicVector3D<double> 00529 operator*(double a, const BasicVector3D<double> & v) { 00530 return BasicVector3D<double>(a*v.x(), a*v.y(), a*v.z()); 00531 } 00532 00537 inline BasicVector3D<double> 00538 operator/(const BasicVector3D<double> & v, double a) { 00539 return BasicVector3D<double>(v.x()/a, v.y()/a, v.z()/a); 00540 } 00541 00546 inline bool 00547 operator==(const BasicVector3D<double> & a, const BasicVector3D<double> & b) 00548 { 00549 return (a.x()==b.x() && a.y()==b.y() && a.z()==b.z()); 00550 } 00551 00556 inline bool 00557 operator!=(const BasicVector3D<double> & a, const BasicVector3D<double> & b) 00558 { 00559 return (a.x()!=b.x() || a.y()!=b.y() || a.z()!=b.z()); 00560 } 00561 } /* namespace HepGeom */ 00562 00563 #ifdef ENABLE_BACKWARDS_COMPATIBILITY 00564 // backwards compatibility will be enabled ONLY in CLHEP 1.9 00565 using namespace HepGeom; 00566 #endif 00567 00568 #endif /* BASIC_VECTOR3D_H */