CMS 3D CMS Logo

Vector3DBase.h

Go to the documentation of this file.
00001 #ifndef GeometryVector_Vector3DBase_h
00002 #define GeometryVector_Vector3DBase_h
00003 
00004 
00005 #include "DataFormats/GeometryVector/interface/VectorTag.h"
00006 #include "DataFormats/GeometryVector/interface/PV3DBase.h"
00007 
00008 template <class T, class FrameTag> 
00009 class Vector3DBase : public PV3DBase<T, VectorTag, FrameTag> {
00010 public:
00011 
00012   typedef PV3DBase<T, VectorTag, FrameTag>    BaseClass;
00013   typedef Vector3DBase< T, FrameTag>          VectorType;
00014   typedef typename BaseClass::Cylindrical     Cylindrical;
00015   typedef typename BaseClass::Spherical       Spherical;
00016   typedef typename BaseClass::Polar           Polar;
00017   typedef typename BaseClass::BasicVectorType BasicVectorType;
00018 
00023   Vector3DBase() {}
00024 
00028   template <class U> 
00029   Vector3DBase( const Vector3DBase<U,FrameTag>& v) : BaseClass( v.basicVector()) {}
00030 
00032   Vector3DBase(const T& x, const T& y, const T& z) : BaseClass(x, y, z) {}
00033 
00036   explicit Vector3DBase( const Cylindrical& set) : BaseClass( set) {}
00037 
00039   explicit Vector3DBase( const Polar& set) : BaseClass( set) {}
00040 
00044   Vector3DBase(const Geom::Theta<T>& th, 
00045                const Geom::Phi<T>& ph, const T& r) : BaseClass(th,ph,r) {}
00046 
00051   template <class U>
00052   explicit Vector3DBase( const Basic3DVector<U>& v) : BaseClass(v) {}
00053 
00057   Vector3DBase unit() const { return Vector3DBase( this->basicVector().unit());}
00058 
00062   template <class U> 
00063   Vector3DBase& operator+= ( const Vector3DBase< U, FrameTag>& v) {
00064     this->theVector += v.basicVector();
00065     return *this;
00066   } 
00067     
00071   template <class U> 
00072   Vector3DBase& operator-= ( const Vector3DBase< U, FrameTag>& v) {
00073     this->theVector -= v.basicVector();
00074     return *this;
00075   } 
00076     
00078   Vector3DBase operator-() const { return Vector3DBase(-this->basicVector());}
00079 
00080 
00082   Vector3DBase& operator*= ( const T& t) { 
00083     this->theVector *= t;
00084     return *this;
00085   } 
00086 
00088   Vector3DBase& operator/= ( const T& t) { 
00089     this->theVector /= t;
00090     return *this;
00091   } 
00092 
00099   template <class U> 
00100   typename PreciseFloatType<T,U>::Type 
00101   dot( const Vector3DBase< U, FrameTag>& v) const { 
00102     return this->theVector.dot( v.basicVector());
00103   }
00104 
00111   template <class U> 
00112   Vector3DBase< typename PreciseFloatType<T,U>::Type, FrameTag> 
00113   cross( const  Vector3DBase< U, FrameTag>& v) const {
00114     typedef Vector3DBase< typename PreciseFloatType<T,U>::Type, FrameTag> RT;
00115     return RT( this->theVector.cross( v.basicVector()));
00116   }
00117 
00118 };
00119 
00121 template <class T, class U, class FrameTag>
00122 inline Vector3DBase<typename PreciseFloatType<T,U>::Type, FrameTag>
00123 operator+( const Vector3DBase<T, FrameTag>& v1, const Vector3DBase<U, FrameTag>& v2) {
00124   typedef Vector3DBase<typename PreciseFloatType<T,U>::Type, FrameTag> RT;
00125   return RT(v1.basicVector() + v2.basicVector());
00126 }
00127 
00128 template <class T, class U, class FrameTag>
00129 inline Vector3DBase<typename PreciseFloatType<T,U>::Type, FrameTag>
00130 operator-( const Vector3DBase<T, FrameTag>& v1, const Vector3DBase<U, FrameTag>& v2) {
00131   typedef Vector3DBase<typename PreciseFloatType<T,U>::Type, FrameTag> RT;
00132   return RT(v1.basicVector() - v2.basicVector());
00133 }
00134 
00136 template <class T, class U, class FrameTag>
00137 inline typename PreciseFloatType<T,U>::Type
00138 operator*( const Vector3DBase<T, FrameTag>& v1, const Vector3DBase<U, FrameTag>& v2) {
00139   return v1.basicVector() * v2.basicVector();
00140 }
00141 
00145 template <class T, class FrameTag, class Scalar>
00146 inline Vector3DBase<T, FrameTag> 
00147 operator*( const Vector3DBase<T, FrameTag>& v, const Scalar& s) {
00148   return Vector3DBase<T, FrameTag>( v.basicVector() * s);
00149 }
00150 
00152 template <class T, class FrameTag, class Scalar>
00153 inline Vector3DBase<T, FrameTag> 
00154 operator*( const Scalar& s, const Vector3DBase<T, FrameTag>& v) {
00155   return Vector3DBase<T, FrameTag>( v.basicVector() * s);
00156 }
00157 
00161 template <class T, class FrameTag, class Scalar>
00162 inline Vector3DBase<T, FrameTag> 
00163 operator/( const Vector3DBase<T, FrameTag>& v, const Scalar& s) {
00164   return Vector3DBase<T, FrameTag>( v.basicVector() / s);
00165 }
00166 
00167 #endif // GeometryVector_Vector3DBase_h

Generated on Tue Jun 9 17:30:54 2009 for CMSSW by  doxygen 1.5.4