00001 #ifndef GeometryVector_oldBasic3DVector_h
00002 #define GeometryVector_oldBasic3DVector_h
00003 #if defined(__CINT__) && !defined(__REFLEX__)
00004 #define __REFLEX__
00005 #endif
00006 #include "DataFormats/GeometryVector/interface/Basic2DVector.h"
00007 #include "DataFormats/GeometryVector/interface/Theta.h"
00008 #include "DataFormats/GeometryVector/interface/Phi.h"
00009 #include "DataFormats/GeometryVector/interface/PreciseFloatType.h"
00010 #include "DataFormats/GeometryVector/interface/CoordinateSets.h"
00011 #ifndef __REFLEX__
00012 #include "DataFormats/Math/interface/SSEVec.h"
00013 #endif
00014 #include <iosfwd>
00015 #include <cmath>
00016
00017 namespace detailsBasic3DVector {
00018 inline float __attribute__((always_inline)) __attribute__ ((pure))
00019 eta(float x, float y, float z) { float t(z/std::sqrt(x*x+y*y)); return ::asinhf(t);}
00020 inline double __attribute__((always_inline)) __attribute__ ((pure))
00021 eta(double x, double y, double z) { double t(z/std::sqrt(x*x+y*y)); return ::asinh(t);}
00022 inline long double __attribute__((always_inline)) __attribute__ ((pure))
00023 eta(long double x, long double y, long double z) { long double t(z/std::sqrt(x*x+y*y)); return ::asinhl(t);}
00024 }
00025
00026
00027 template < typename T>
00028 class Basic3DVector {
00029 public:
00030 typedef Basic3DVector<T> MathVector;
00031
00032
00033 typedef T ScalarType;
00034 typedef Geom::Cylindrical2Cartesian<T> Cylindrical;
00035 typedef Geom::Spherical2Cartesian<T> Spherical;
00036 typedef Spherical Polar;
00037
00042 Basic3DVector() : theX(0), theY(0), theZ(0), theW(0) {}
00043
00045 Basic3DVector( const Basic3DVector & p) :
00046 theX(p.x()), theY(p.y()), theZ(p.z()), theW(p.w()) {}
00047
00049 template <class U>
00050 Basic3DVector( const Basic3DVector<U> & p) :
00051 theX(p.x()), theY(p.y()), theZ(p.z()), theW(p.w()) {}
00052
00054 Basic3DVector( const Basic2DVector<T> & p) :
00055 theX(p.x()), theY(p.y()), theZ(0), theW(0) {}
00056
00065 template <class OtherPoint>
00066 explicit Basic3DVector( const OtherPoint& p) :
00067 theX(p.x()), theY(p.y()), theZ(p.z()), theW(0) {}
00068
00069
00070 #ifndef __REFLEX__
00071
00072 template<typename U>
00073 Basic3DVector(mathSSE::Vec4<U> const& iv) :
00074 theX(iv.arr[0]), theY(iv.arr[1]), theZ(iv.arr[2]), theW(0) {}
00075 #endif
00076
00077 #ifndef __REFLEX__
00078
00079 Basic3DVector( const T& x, const T& y, const T& z, const T& w=0) :
00080 theX(x), theY(y), theZ(z), theW(w) {}
00081 #else
00082
00083 Basic3DVector( const T& x, const T& y, const T& z) :
00084 theX(x), theY(y), theZ(z), theW(0) {}
00085 Basic3DVector( const T& x, const T& y, const T& z, const T& w) :
00086 theX(x), theY(y), theZ(z), theW(w) {}
00087 #endif
00088
00089
00090
00095 template <typename U>
00096 Basic3DVector( const Geom::Theta<U>& theta,
00097 const Geom::Phi<U>& phi, const T& r) {
00098 Polar p( theta.value(), phi.value(), r);
00099 theX = p.x(); theY = p.y(); theZ = p.z();
00100 }
00101
00103 T x() const { return theX;}
00104
00106 T y() const { return theY;}
00107
00109 T z() const { return theZ;}
00110
00111 T w() const { return theW;}
00112
00113
00114 Basic2DVector<T> xy() const { return Basic2DVector<T>(theX,theY);}
00115
00116
00117
00118 bool operator==(const Basic3DVector& rh) const {
00119 return x()==rh.x() && y()==rh.y() && z()==rh.z();
00120 }
00121
00123 T mag2() const { return x()*x() + y()*y()+z()*z();}
00124
00126 T mag() const { return std::sqrt( mag2());}
00127
00129 T perp2() const { return x()*x() + y()*y();}
00130
00132 T perp() const { return std::sqrt( perp2());}
00133
00135 T transverse() const { return perp();}
00136
00141 T barePhi() const {return std::atan2(y(),x());}
00142 Geom::Phi<T> phi() const {return Geom::Phi<T>(barePhi());}
00143
00148 T bareTheta() const {return std::atan2(perp(),z());}
00149 Geom::Theta<T> theta() const {return Geom::Theta<T>(std::atan2(perp(),z()));}
00150
00155
00156 T eta() const { return detailsBasic3DVector::eta(x(),y(),z());}
00157
00161 Basic3DVector unit() const {
00162 T my_mag = mag2();
00163 if (my_mag==0) return *this;
00164 my_mag = T(1)/std::sqrt(my_mag);
00165 return *this * my_mag;
00166 }
00167
00170 template <class U>
00171 Basic3DVector& operator+= ( const Basic3DVector<U>& p) {
00172 theX += p.x();
00173 theY += p.y();
00174 theZ += p.z();
00175 theW += p.w();
00176 return *this;
00177 }
00178
00181 template <class U>
00182 Basic3DVector& operator-= ( const Basic3DVector<U>& p) {
00183 theX -= p.x();
00184 theY -= p.y();
00185 theZ -= p.z();
00186 theW -= p.w();
00187 return *this;
00188 }
00189
00191 Basic3DVector operator-() const { return Basic3DVector(-x(),-y(),-z());}
00192
00194 Basic3DVector& operator*= ( T t) {
00195 theX *= t;
00196 theY *= t;
00197 theZ *= t;
00198 theW *= t;;
00199 return *this;
00200 }
00201
00203 Basic3DVector& operator/= ( T t) {
00204 t = T(1)/t;
00205 theX *= t;
00206 theY *= t;
00207 theZ *= t;
00208 theW *= t;;
00209 return *this;
00210 }
00211
00213 T dot( const Basic3DVector& v) const {
00214 return x()*v.x() + y()*v.y() + z()*v.z();
00215 }
00216
00222 template <class U>
00223 typename PreciseFloatType<T,U>::Type dot( const Basic3DVector<U>& v) const {
00224 return x()*v.x() + y()*v.y() + z()*v.z();
00225 }
00226
00228 Basic3DVector cross( const Basic3DVector& v) const {
00229 return Basic3DVector( y()*v.z() - v.y()*z(),
00230 z()*v.x() - v.z()*x(),
00231 x()*v.y() - v.x()*y());
00232 }
00233
00234
00240 template <class U>
00241 Basic3DVector<typename PreciseFloatType<T,U>::Type>
00242 cross( const Basic3DVector<U>& v) const {
00243 return Basic3DVector<typename PreciseFloatType<T,U>::Type>( y()*v.z() - v.y()*z(),
00244 z()*v.x() - v.z()*x(),
00245 x()*v.y() - v.x()*y());
00246 }
00247
00248 private:
00249 T theX;
00250 T theY;
00251 T theZ;
00252 T theW;
00253 }
00254 #ifndef __CINT__
00255 __attribute__ ((aligned (16)))
00256 #endif
00257 ;
00258
00259
00260 namespace geometryDetails {
00261 std::ostream & print3D(std::ostream& s, double x, double y, double z);
00262 }
00263
00265 template <class T>
00266 inline std::ostream & operator<<( std::ostream& s, const Basic3DVector<T>& v) {
00267 return geometryDetails::print3D(s, v.x(),v.y(), v.z());
00268 }
00269
00270
00272 template <class T, class U>
00273 inline Basic3DVector<typename PreciseFloatType<T,U>::Type>
00274 operator+( const Basic3DVector<T>& a, const Basic3DVector<U>& b) {
00275 typedef Basic3DVector<typename PreciseFloatType<T,U>::Type> RT;
00276 return RT(a.x()+b.x(), a.y()+b.y(), a.z()+b.z(), a.w()+b.w());
00277 }
00278
00279 template <class T, class U>
00280 inline Basic3DVector<typename PreciseFloatType<T,U>::Type>
00281 operator-( const Basic3DVector<T>& a, const Basic3DVector<U>& b) {
00282 typedef Basic3DVector<typename PreciseFloatType<T,U>::Type> RT;
00283 return RT(a.x()-b.x(), a.y()-b.y(), a.z()-b.z(), a.w()-b.w());
00284 }
00285
00287 template <class T>
00288 inline T operator*( const Basic3DVector<T>& v1, const Basic3DVector<T>& v2) {
00289 return v1.dot(v2);
00290 }
00291
00293 template <class T, class U>
00294 inline typename PreciseFloatType<T,U>::Type operator*( const Basic3DVector<T>& v1,
00295 const Basic3DVector<U>& v2) {
00296 return v1.x()*v2.x() + v1.y()*v2.y() + v1.z()*v2.z();
00297 }
00298
00302 template <class T>
00303 inline Basic3DVector<T> operator*( const Basic3DVector<T>& v, T t) {
00304 return Basic3DVector<T>(v.x()*t, v.y()*t, v.z()*t, v.w()*t);
00305 }
00306
00308 template <class T>
00309 inline Basic3DVector<T> operator*(T t, const Basic3DVector<T>& v) {
00310 return Basic3DVector<T>(v.x()*t, v.y()*t, v.z()*t, v.w()*t);
00311 }
00312
00313 template <class T, typename S>
00314 inline Basic3DVector<T> operator*(S t, const Basic3DVector<T>& v) {
00315 return static_cast<T>(t)*v;
00316 }
00317
00318 template <class T, typename S>
00319 inline Basic3DVector<T> operator*(const Basic3DVector<T>& v, S t) {
00320 return static_cast<T>(t)*v;
00321 }
00322
00323
00327 template <class T, typename S>
00328 inline Basic3DVector<T> operator/( const Basic3DVector<T>& v, S s) {
00329 T t = T(1)/s;
00330 return v*t;
00331 }
00332
00333
00334 typedef Basic3DVector<float> Basic3DVectorF;
00335 typedef Basic3DVector<double> Basic3DVectorD;
00336 typedef Basic3DVector<long double> Basic3DVectorLD;
00337
00338
00339 #endif // GeometryVector_Basic3DVector_h
00340
00341