1 //--------------------------------------------------------------------------
4 // This software is part of the EvtGen package developed jointly
5 // for the BaBar and CLEO collaborations. If you use all or part
6 // of it, please give an appropriate acknowledgement.
8 // Copyright Information: See EvtGen/COPYRIGHT
9 // Copyright (C) 1998 Caltech, UCSB
11 // Module: EvtGen/EvtVector4R.hh
13 // Description: Class to describe real 4 vectors
15 // Modification history:
17 // DJL/RYD September 25, 1996 Module created
19 //------------------------------------------------------------------------
21 #ifndef EVTVECTOR4R_HH
22 #define EVTVECTOR4R_HH
31 friend EvtVector4R rotateEuler(const EvtVector4R& rs,
32 double alpha,double beta,double gamma);
33 friend EvtVector4R boostTo(const EvtVector4R& rs,
34 const EvtVector4R& p4);
35 friend EvtVector4R boostTo(const EvtVector4R& rs,
36 const EvtVector3R& boost);
39 inline friend EvtVector4R operator*(double d,const EvtVector4R& v2);
40 inline friend EvtVector4R operator*(const EvtVector4R& v2,double d);
41 inline friend EvtVector4R operator/(const EvtVector4R& v2,double d);
42 inline friend double operator*(const EvtVector4R& v1,const EvtVector4R& v2);
43 inline friend EvtVector4R operator+(const EvtVector4R& v1,const EvtVector4R& v2);
44 inline friend EvtVector4R operator-(const EvtVector4R& v1,const EvtVector4R& v2);
48 EvtVector4R(double e,double px,double py ,double pz);
49 inline void set(int i,double d);
50 inline void set(double e,double px,double py ,double pz);
51 inline EvtVector4R& operator*=(double c);
52 inline EvtVector4R& operator/=(double c);
53 inline EvtVector4R& operator=(const EvtVector4R& v2);
54 inline EvtVector4R& operator+=(const EvtVector4R& v2);
55 inline EvtVector4R& operator-=(const EvtVector4R& v2);
56 inline double get(int i) const;
57 inline double cont(const EvtVector4R& v4) const;
58 friend std::ostream& operator<<(std::ostream& s, const EvtVector4R& v);
61 void applyRotateEuler(double alpha,double beta,double gamma);
62 void applyBoostTo(const EvtVector4R& p4);
63 void applyBoostTo(const EvtVector3R& boost);
64 EvtVector4R cross(const EvtVector4R& v2);
65 double dot(const EvtVector4R& v2) const;
68 // Added by AJB - calculate scalars in the rest frame of the current object
69 double scalartripler3( const EvtVector4R& p1, const EvtVector4R& p2,
70 const EvtVector4R& p3 ) const;
71 double dotr3( const EvtVector4R& p1, const EvtVector4R& p2 ) const;
72 double mag2r3( const EvtVector4R& p1 ) const;
73 double magr3( const EvtVector4R& p1 ) const;
80 inline double Square( double x ) const { return x*x; }
85 inline EvtVector4R& EvtVector4R::operator=(const EvtVector4R& v2){
95 inline EvtVector4R& EvtVector4R::operator+=(const EvtVector4R& v2){
105 inline EvtVector4R& EvtVector4R::operator-=(const EvtVector4R& v2){
115 inline double EvtVector4R::mass2() const{
117 return v[0]*v[0]-v[1]*v[1]-v[2]*v[2]-v[3]*v[3];
120 inline EvtVector4R operator*(double c,const EvtVector4R& v2){
122 return EvtVector4R(v2)*=c;
125 inline EvtVector4R operator*(const EvtVector4R& v2,double c){
127 return EvtVector4R(v2)*=c;
130 inline EvtVector4R operator/(const EvtVector4R& v2,double c){
132 return EvtVector4R(v2)/=c;
135 inline EvtVector4R& EvtVector4R::operator*=(double c){
145 inline EvtVector4R& EvtVector4R::operator/=(double c){
156 inline double operator*(const EvtVector4R& v1,const EvtVector4R& v2){
158 return v1.v[0]*v2.v[0]-v1.v[1]*v2.v[1]-
159 v1.v[2]*v2.v[2]-v1.v[3]*v2.v[3];
162 inline double EvtVector4R::cont(const EvtVector4R& v4) const {
164 return v[0]*v4.v[0]-v[1]*v4.v[1]-
165 v[2]*v4.v[2]-v[3]*v4.v[3];
168 inline EvtVector4R operator-(const EvtVector4R& v1,const EvtVector4R& v2){
170 return EvtVector4R(v1)-=v2;
173 inline EvtVector4R operator+(const EvtVector4R& v1,const EvtVector4R& v2){
175 return EvtVector4R(v1)+=v2;
178 inline double EvtVector4R::get(int i) const {
182 inline void EvtVector4R::set(int i,double d){
187 inline void EvtVector4R::set(double e,double p1,double p2, double p3){