CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
newBasic3DVector.h
Go to the documentation of this file.
1 #ifndef GeometryVector_newBasic3DVector_h
2 #define GeometryVector_newBasic3DVector_h
3 
10 #include <iosfwd>
11 #include <cmath>
12 
13 namespace detailsBasic3DVector {
14  inline float __attribute__((always_inline)) __attribute__ ((pure))
15  eta(float x, float y, float z) { float t(z/std::sqrt(x*x+y*y)); return ::asinhf(t);}
16  inline double __attribute__((always_inline)) __attribute__ ((pure))
17  eta(double x, double y, double z) { double t(z/std::sqrt(x*x+y*y)); return ::asinh(t);}
18  inline long double __attribute__((always_inline)) __attribute__ ((pure))
19  eta(long double x, long double y, long double z) { long double t(z/std::sqrt(x*x+y*y)); return ::asinhl(t);}
20 }
21 
22 
23 template < typename T>
25 public:
26 
27  typedef T ScalarType;
32  typedef Spherical Polar; // synonym
33 
39 
42  v(p.v) {}
43 
45  template <class U>
47  v(p.v) {}
48 
49 
52  v(p.x(),p.y(),0) {}
53 
54 
63  template <class OtherPoint>
64  explicit Basic3DVector( const OtherPoint& p) :
65  v(p.x(),p.y(),p.z()) {}
66 
67 
68  // constructor from Vec4
69  template<class U>
70  Basic3DVector(mathSSE::Vec4<U> const& iv) : v(iv){}
71 
73  Basic3DVector( const T& x, const T& y, const T& z, const T&w=0) :
74  v(x,y,z,w){}
75 
80  template <typename U>
82  const Geom::Phi<U>& phi, const T& r) {
83  Polar p( theta.value(), phi.value(), r);
84  v.o.theX = p.x(); v.o.theY = p.y(); v.o.theZ = p.z();
85  }
86 
87  MathVector const & mathVector() const { return v;}
88  MathVector & mathVector() { return v;}
89 
90 
92  T x() const { return v.o.theX;}
93 
95  T y() const { return v.o.theY;}
96 
98  T z() const { return v.o.theZ;}
99 
100  T w() const { return v.o.theW;}
101 
102  Basic2DVector<T> xy() const { return v.xy();}
103 
104  // equality
105  bool operator==(const Basic3DVector& rh) const {
106  return v==rh.v;
107  }
108 
110  T mag2() const { return ::dot(v,v);}
111 
113  T mag() const { return std::sqrt( mag2());}
114 
116  T perp2() const { return ::dotxy(v,v);}
117 
119  T perp() const { return std::sqrt( perp2());}
120 
122  T transverse() const { return perp();}
123 
128  T barePhi() const {return std::atan2(y(),x());}
129  Geom::Phi<T> phi() const {return Geom::Phi<T>(barePhi());}
130 
135  T bareTheta() const {return std::atan2(perp(),z());}
136  Geom::Theta<T> theta() const {return Geom::Theta<T>(std::atan2(perp(),z()));}
137 
142  // T eta() const { return -log( tan( theta()/2.));}
143  T eta() const { return detailsBasic3DVector::eta(x(),y(),z());} // correct
144 
148  Basic3DVector unit() const {
149  T my_mag = mag2();
150  return (0!=my_mag) ? (*this)*(T(1)/std::sqrt(my_mag)) : *this;
151  }
152 
155  template <class U>
157  v = v + p.v;
158  return *this;
159  }
160 
163  template <class U>
165  v = v - p.v;
166  return *this;
167  }
168 
170  Basic3DVector operator-() const { return Basic3DVector(-v);}
171 
174  v = t*v;
175  return *this;
176  }
177 
180  //t = T(1)/t;
181  v = v/t;
182  return *this;
183  }
184 
186  T dot( const Basic3DVector& rh) const {
187  return ::dot(v,rh.v);
188  }
189 
195  template <class U>
199  }
200 
202  Basic3DVector cross( const Basic3DVector& lh) const {
203  return ::cross(v,lh.v);
204  }
205 
206 
212  template <class U>
214  cross( const Basic3DVector<U>& lh) const {
217  }
218 
219 public:
221 } __attribute__ ((aligned (16)));
222 
223 
224 namespace geometryDetails {
225  std::ostream & print3D(std::ostream& s, double x, double y, double z);
226 }
227 
229 template <class T>
230 inline std::ostream & operator<<( std::ostream& s, const Basic3DVector<T>& v) {
231  return geometryDetails::print3D(s, v.x(),v.y(), v.z());
232 }
233 
236 template <class T>
237 inline Basic3DVector<T>
239  return a.v+b.v;
240 }
241 template <class T>
242 inline Basic3DVector<T>
244  return a.v-b.v;
245 }
246 
247 template <class T, class U>
251  return RT(a).v+RT(b).v;
252 }
254 template <class T, class U>
258  return RT(a).v-RT(b).v;
259 }
260 
262 template <class T>
263 inline T operator*( const Basic3DVector<T>& v1, const Basic3DVector<T>& v2) {
264  return v1.dot(v2);
265 }
266 
268 template <class T, class U>
270  const Basic3DVector<U>& v2) {
271  return v1.dot(v2);
272 }
273 
277 template <class T>
279  return v.v*t;
280 }
281 
283 template <class T>
285  return v.v*t;
286 }
287 
288 
289 
290 template <class T, typename S>
292  return static_cast<T>(t)*v;
293 }
294 
295 template <class T, typename S>
297  return static_cast<T>(t)*v;
298 }
299 
300 
304 template <class T>
306  return v.v/t;
307 }
308 
309 template <class T, typename S>
311  // T t = S(1)/s; return v*t;
312  T t = s;
313  return v/t;
314 }
315 
316 
319 
321 // add long double specialization
322 #include "Basic3DVectorLD.h"
323 
324 #endif // GeometryVector_Basic3DVector_h
325 
326 
Basic2DVector< T > xy() const
T y() const
Cartesian y coordinate.
T x() const
Cartesian x coordinate.
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
Basic3DVector(const T &x, const T &y, const T &z, const T &w=0)
construct from cartesian coordinates
MatrixMeschach operator+(const MatrixMeschach &mat1, const MatrixMeschach &mat2)
T perp2() const
Squared magnitude of transverse component.
Geom::Theta< T > theta() const
T barePhi() const
Basic3DVector unit() const
MatrixMeschach operator-(const MatrixMeschach &mat1, const MatrixMeschach &mat2)
Basic3DVector cross(const Basic3DVector &lh) const
Vector product, or &quot;cross&quot; product, with a vector of same type.
Basic3DVector< typename PreciseFloatType< T, U >::Type > cross(const Basic3DVector< U > &lh) const
bool operator==(const Basic3DVector &rh) const
Basic3DVector(const Basic3DVector &p)
Copy constructor from same type. Should not be needed but for gcc bug 12685.
Geom::Phi< T > phi() const
mathSSE::Vec4< T > MathVector
bool int lh
Definition: SSEVec.h:55
T eta() const
double double double z
Basic3DVector< long double > operator/(const Basic3DVector< long double > &v, S s)
Basic3DVector(mathSSE::Vec4< U > const &iv)
Basic3DVector< float > Basic3DVectorF
Basic3DVector & operator/=(T t)
Scaling by a scalar value (division)
Basic3DVector(const Geom::Theta< U > &theta, const Geom::Phi< U > &phi, const T &r)
float float float z float t(z/std::sqrt(x *x+y *y))
T z() const
Cartesian z coordinate.
T sqrt(T t)
Definition: SSEVec.h:46
Basic3DVector & operator*=(T t)
Scaling by a scalar value (multiplication)
Basic3DVector & operator+=(const Basic3DVector< U > &p)
mathSSE::Vec4< T > v
MathVector const & mathVector() const
T perp() const
Magnitude of transverse component.
Basic3DVector< double > Basic3DVectorD
Basic3DVector & operator-=(const Basic3DVector< U > &p)
T value() const
Explicit access to value in case implicit conversion not OK.
Definition: Theta.h:25
T value() const
Explicit access to value in case implicit conversion not OK.
Definition: Phi.h:38
Basic3DVector(const Basic3DVector< U > &p)
Copy constructor and implicit conversion from Basic3DVector of different precision.
Basic3DVector(const Basic2DVector< T > &p)
constructor from 2D vector (X and Y from 2D vector, z set to zero)
Geom::Spherical2Cartesian< T > Spherical
double b
Definition: hdecay.h:120
MathVector & mathVector()
Geom::Cylindrical2Cartesian< T > Cylindrical
T dot(const Basic3DVector &v) const
Scalar product, or &quot;dot&quot; product, with a vector of same type.
float __attribute__((always_inline)) __attribute__((pure)) eta(float x
double a
Definition: hdecay.h:121
T transverse() const
Another name for perp()
T bareTheta() const
MatrixMeschach operator*(const MatrixMeschach &mat1, const MatrixMeschach &mat2)
Definition: DDAxes.h:10
std::ostream & print3D(std::ostream &s, double x, double y, double z)
Definition: print.cc:5
Basic3DVector operator-() const
Unary minus, returns a vector with components (-x(),-y(),-z())
long double T
Basic3DVector(const OtherPoint &p)
Definition: Phi.h:20
class Geom::Polar2Cartesian __attribute__
PreciseFloatType< T, U >::Type dot(const Basic3DVector< U > &lh) const
mathSSE::Vec4< T > v
T mag2() const
The vector magnitude squared. Equivalent to vec.dot(vec)
Basic3DVector cross(const Basic3DVector &v) const
Vector product, or &quot;cross&quot; product, with a vector of same type.
T dot(const Basic3DVector &rh) const
Scalar product, or &quot;dot&quot; product, with a vector of same type.
mathSSE::Vec4< T > VectorType