![]() |
![]() |
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