00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef EVTVECTOR4R_HH
00022 #define EVTVECTOR4R_HH
00023
00024 #include <iostream>
00025 #include <math.h>
00026
00027 class EvtVector3R;
00028
00029 class EvtVector4R {
00030
00031 friend EvtVector4R rotateEuler(const EvtVector4R& rs,
00032 double alpha,double beta,double gamma);
00033 friend EvtVector4R boostTo(const EvtVector4R& rs,
00034 const EvtVector4R& p4);
00035 friend EvtVector4R boostTo(const EvtVector4R& rs,
00036 const EvtVector3R& boost);
00037
00038
00039 inline friend EvtVector4R operator*(double d,const EvtVector4R& v2);
00040 inline friend EvtVector4R operator*(const EvtVector4R& v2,double d);
00041 inline friend EvtVector4R operator/(const EvtVector4R& v2,double d);
00042 inline friend double operator*(const EvtVector4R& v1,const EvtVector4R& v2);
00043 inline friend EvtVector4R operator+(const EvtVector4R& v1,const EvtVector4R& v2);
00044 inline friend EvtVector4R operator-(const EvtVector4R& v1,const EvtVector4R& v2);
00045
00046 public:
00047 EvtVector4R(){}
00048 EvtVector4R(double e,double px,double py ,double pz);
00049 inline void set(int i,double d);
00050 inline void set(double e,double px,double py ,double pz);
00051 inline EvtVector4R& operator*=(double c);
00052 inline EvtVector4R& operator/=(double c);
00053 inline EvtVector4R& operator=(const EvtVector4R& v2);
00054 inline EvtVector4R& operator+=(const EvtVector4R& v2);
00055 inline EvtVector4R& operator-=(const EvtVector4R& v2);
00056 inline double get(int i) const;
00057 inline double cont(const EvtVector4R& v4) const;
00058 friend std::ostream& operator<<(std::ostream& s, const EvtVector4R& v);
00059 double mass2() const;
00060 double mass() const;
00061 void applyRotateEuler(double alpha,double beta,double gamma);
00062 void applyBoostTo(const EvtVector4R& p4);
00063 void applyBoostTo(const EvtVector3R& boost);
00064 EvtVector4R cross(const EvtVector4R& v2);
00065 double dot(const EvtVector4R& v2) const;
00066 double d3mag() const;
00067
00068
00069 double scalartripler3( const EvtVector4R& p1, const EvtVector4R& p2,
00070 const EvtVector4R& p3 ) const;
00071 double dotr3( const EvtVector4R& p1, const EvtVector4R& p2 ) const;
00072 double mag2r3( const EvtVector4R& p1 ) const;
00073 double magr3( const EvtVector4R& p1 ) const;
00074 double theta();
00075 double phi();
00076
00077 private:
00078
00079 double v[4];
00080
00081 inline double Square( double x ) const { return x*x; }
00082
00083 };
00084
00085
00086 inline EvtVector4R& EvtVector4R::operator=(const EvtVector4R& v2){
00087
00088 v[0]=v2.v[0];
00089 v[1]=v2.v[1];
00090 v[2]=v2.v[2];
00091 v[3]=v2.v[3];
00092
00093 return *this;
00094 }
00095
00096 inline EvtVector4R& EvtVector4R::operator+=(const EvtVector4R& v2){
00097
00098 v[0]+=v2.v[0];
00099 v[1]+=v2.v[1];
00100 v[2]+=v2.v[2];
00101 v[3]+=v2.v[3];
00102
00103 return *this;
00104 }
00105
00106 inline EvtVector4R& EvtVector4R::operator-=(const EvtVector4R& v2){
00107
00108 v[0]-=v2.v[0];
00109 v[1]-=v2.v[1];
00110 v[2]-=v2.v[2];
00111 v[3]-=v2.v[3];
00112
00113 return *this;
00114 }
00115
00116 inline double EvtVector4R::mass2() const{
00117
00118 return v[0]*v[0]-v[1]*v[1]-v[2]*v[2]-v[3]*v[3];
00119 }
00120
00121 inline EvtVector4R operator*(double c,const EvtVector4R& v2){
00122
00123 return EvtVector4R(v2)*=c;
00124 }
00125
00126 inline EvtVector4R operator*(const EvtVector4R& v2,double c){
00127
00128 return EvtVector4R(v2)*=c;
00129 }
00130
00131 inline EvtVector4R operator/(const EvtVector4R& v2,double c){
00132
00133 return EvtVector4R(v2)/=c;
00134 }
00135
00136 inline EvtVector4R& EvtVector4R::operator*=(double c){
00137
00138 v[0]*=c;
00139 v[1]*=c;
00140 v[2]*=c;
00141 v[3]*=c;
00142
00143 return *this;
00144 }
00145
00146 inline EvtVector4R& EvtVector4R::operator/=(double c){
00147
00148 double cinv=1.0/c;
00149 v[0]*=cinv;
00150 v[1]*=cinv;
00151 v[2]*=cinv;
00152 v[3]*=cinv;
00153
00154 return *this;
00155 }
00156
00157 inline double operator*(const EvtVector4R& v1,const EvtVector4R& v2){
00158
00159 return v1.v[0]*v2.v[0]-v1.v[1]*v2.v[1]-
00160 v1.v[2]*v2.v[2]-v1.v[3]*v2.v[3];
00161 }
00162
00163 inline double EvtVector4R::cont(const EvtVector4R& v4) const {
00164
00165 return v[0]*v4.v[0]-v[1]*v4.v[1]-
00166 v[2]*v4.v[2]-v[3]*v4.v[3];
00167 }
00168
00169 inline EvtVector4R operator-(const EvtVector4R& v1,const EvtVector4R& v2){
00170
00171 return EvtVector4R(v1)-=v2;
00172 }
00173
00174 inline EvtVector4R operator+(const EvtVector4R& v1,const EvtVector4R& v2){
00175
00176 return EvtVector4R(v1)+=v2;
00177 }
00178
00179 inline double EvtVector4R::get(int i) const {
00180 return v[i];
00181 }
00182
00183 inline void EvtVector4R::set(int i,double d){
00184
00185 v[i]=d;
00186 }
00187
00188 inline void EvtVector4R::set(double e,double p1,double p2, double p3){
00189
00190 v[0]=e;
00191 v[1]=p1;
00192 v[2]=p2;
00193 v[3]=p3;
00194 }
00195
00196 #endif
00197