CLHEP 2.0.4.7 Reference Documentation
   
CLHEP Home Page     CLHEP Documentation     CLHEP Bug Reports

BasicVector3D.h

Go to the documentation of this file.
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 */

Generated on Thu Jul 1 22:02:30 2010 for CLHEP by  doxygen 1.4.7