00001
00002
00004 #ifndef HEPMC_SIMPLEVECTOR_H
00005 #define HEPMC_SIMPLEVECTOR_H
00006
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00024
00025
00026 #include "HepMC/enable_if.h"
00027 #include "HepMC/is_arithmetic.h"
00028
00029
00030 namespace HepMC {
00031
00033
00042 class FourVector {
00043
00044 public:
00045
00047 FourVector( double xin, double yin, double zin, double tin=0)
00048 : m_x(xin), m_y(yin), m_z(zin), m_t(tin) {}
00049
00051 FourVector(double t)
00052 : m_x(0), m_y(0), m_z(0), m_t(t) {}
00053
00054 FourVector()
00055 : m_x(0), m_y(0), m_z(0), m_t(0) {}
00056
00059 template <class T >
00060 FourVector( const T& v,
00061 typename detail::disable_if< detail::is_arithmetic<T>::value, void >::type * = 0 )
00062 : m_x(v.x()), m_y(v.y()), m_z(v.z()), m_t(v.t()) {}
00063
00065 FourVector(const FourVector & v)
00066 : m_x(v.x()), m_y(v.y()), m_z(v.z()), m_t(v.t()) {}
00067
00068 void swap( FourVector & other );
00069
00070 double px() const { return m_x; }
00071 double py() const { return m_y; }
00072 double pz() const { return m_z; }
00073 double e() const { return m_t; }
00074
00075 double x() const { return m_x; }
00076 double y() const { return m_y; }
00077 double z() const { return m_z; }
00078 double t() const { return m_t; }
00079
00080 double m2() const;
00081 double m() const;
00082
00083 double perp2() const;
00084 double perp() const;
00085 double mag() const;
00086
00087
00088 double theta() const;
00089 double phi() const;
00090 double rho() const;
00091
00092 FourVector & operator = (const FourVector &);
00093
00094 bool operator == (const FourVector &) const;
00095 bool operator != (const FourVector &) const;
00096
00097 double pseudoRapidity() const;
00098 double eta() const;
00099
00101 void set (double x, double y, double z, double t);
00102
00103 void setX(double x) { m_x=x; }
00104 void setY(double y) { m_y=y; }
00105 void setZ(double z) { m_z=z; }
00106 void setT(double t) { m_t=t; }
00107
00108 void setPx(double x) { m_x=x; }
00109 void setPy(double y) { m_y=y; }
00110 void setPz(double z) { m_z=z; }
00111 void setE(double t) { m_t=t; }
00112
00113 private:
00114
00115 double m_x;
00116 double m_y;
00117 double m_z;
00118 double m_t;
00119
00120 };
00121
00123
00132 class ThreeVector {
00133
00134 public:
00135
00137 ThreeVector( double xin, double yin =0, double zin =0 )
00138 : m_x(xin), m_y(yin), m_z(zin) {}
00139
00140 ThreeVector( )
00141 : m_x(0), m_y(0), m_z(0) {}
00142
00145 template <class T >
00146 ThreeVector( const T& v,
00147 typename detail::disable_if< detail::is_arithmetic<T>::value, void >::type * = 0 )
00148 : m_x(v.x()), m_y(v.y()), m_z(v.z()) {}
00149
00151 ThreeVector(const ThreeVector & v)
00152 : m_x(v.x()), m_y(v.y()), m_z(v.z()) {}
00153
00154 void swap( ThreeVector & other );
00155
00156 double x() const { return m_x; }
00157 double y() const { return m_y; }
00158 double z() const { return m_z; }
00159
00160 void setX(double x) { m_x=x; }
00161 void setY(double y) { m_y=y; }
00162 void setZ(double z) { m_z=z; }
00163 void set( double x, double y, double z);
00164
00165 double phi() const;
00166 double theta() const;
00167 double r() const;
00168
00169 double mag() const;
00170
00171 void setPhi(double);
00172 void setTheta(double);
00173
00174 double perp2() const;
00175 double perp() const;
00176
00177 ThreeVector & operator = (const ThreeVector &);
00178
00179 bool operator == (const ThreeVector &) const;
00180 bool operator != (const ThreeVector &) const;
00181
00182 private:
00183
00184 double m_x;
00185 double m_y;
00186 double m_z;
00187
00188 };
00189
00190
00191 }
00192
00193 #include "HepMC/SimpleVector.icc"
00194
00195 #endif // HEPMC_SIMPLEVECTOR_H
00196