]> git.uio.no Git - u/mrichter/AliRoot.git/blob - TEvtGen/EvtGenBase/EvtVector4R.hh
Corrections for secondaries
[u/mrichter/AliRoot.git] / TEvtGen / EvtGenBase / EvtVector4R.hh
1 //--------------------------------------------------------------------------
2 //
3 // Environment:
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.
7 //
8 // Copyright Information: See EvtGen/COPYRIGHT
9 //      Copyright (C) 1998      Caltech, UCSB
10 //
11 // Module: EvtGen/EvtVector4R.hh
12 //
13 // Description: Class to describe real 4 vectors
14 //
15 // Modification history:
16 //
17 //    DJL/RYD     September 25, 1996         Module created
18 //
19 //------------------------------------------------------------------------
20
21 #ifndef EVTVECTOR4R_HH
22 #define EVTVECTOR4R_HH
23
24 #include <iostream>
25 #include <math.h>
26
27 class EvtVector3R;
28
29 class EvtVector4R {
30
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);
37   
38
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); 
45   
46 public:
47   EvtVector4R(){}
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);  
59   double mass2() const;     
60   double mass() const;
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;
66   double d3mag() const;
67
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;
74
75
76 private:
77
78   double v[4];
79
80   inline double Square( double x ) const { return x*x; }
81
82 };
83
84
85 inline EvtVector4R& EvtVector4R::operator=(const EvtVector4R& v2){
86
87   v[0]=v2.v[0];
88   v[1]=v2.v[1];
89   v[2]=v2.v[2];
90   v[3]=v2.v[3];
91   
92   return *this; 
93 }
94
95 inline EvtVector4R& EvtVector4R::operator+=(const EvtVector4R& v2){
96
97   v[0]+=v2.v[0];
98   v[1]+=v2.v[1];
99   v[2]+=v2.v[2];
100   v[3]+=v2.v[3];
101   
102   return *this; 
103 }
104
105 inline EvtVector4R& EvtVector4R::operator-=(const EvtVector4R& v2){
106
107   v[0]-=v2.v[0];
108   v[1]-=v2.v[1];
109   v[2]-=v2.v[2];
110   v[3]-=v2.v[3];
111   
112   return *this; 
113 }
114
115 inline double EvtVector4R::mass2() const{
116
117   return v[0]*v[0]-v[1]*v[1]-v[2]*v[2]-v[3]*v[3];
118 }
119
120 inline EvtVector4R operator*(double c,const EvtVector4R& v2){
121   
122   return EvtVector4R(v2)*=c;
123 }
124
125 inline EvtVector4R operator*(const EvtVector4R& v2,double c){
126   
127   return EvtVector4R(v2)*=c;
128 }
129
130 inline EvtVector4R operator/(const EvtVector4R& v2,double c){
131   
132   return EvtVector4R(v2)/=c;
133 }
134
135 inline EvtVector4R& EvtVector4R::operator*=(double c){
136
137   v[0]*=c;  
138   v[1]*=c;  
139   v[2]*=c;  
140   v[3]*=c;  
141
142   return *this;
143 }
144
145 inline EvtVector4R& EvtVector4R::operator/=(double c){
146
147   double cinv=1.0/c;  
148   v[0]*=cinv;  
149   v[1]*=cinv;  
150   v[2]*=cinv;  
151   v[3]*=cinv;  
152
153   return *this;
154 }
155
156 inline double operator*(const EvtVector4R& v1,const EvtVector4R& v2){
157
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];
160 }
161
162 inline double EvtVector4R::cont(const EvtVector4R& v4) const {
163   
164   return v[0]*v4.v[0]-v[1]*v4.v[1]-
165          v[2]*v4.v[2]-v[3]*v4.v[3];
166 }
167
168 inline EvtVector4R operator-(const EvtVector4R& v1,const EvtVector4R& v2){
169   
170   return EvtVector4R(v1)-=v2;
171 }
172
173 inline EvtVector4R operator+(const EvtVector4R& v1,const EvtVector4R& v2){
174   
175   return EvtVector4R(v1)+=v2;
176 }
177
178 inline double EvtVector4R::get(int i) const {
179   return v[i];
180 }
181
182 inline void EvtVector4R::set(int i,double d){
183   
184   v[i]=d;
185 }
186
187 inline void EvtVector4R::set(double e,double p1,double p2, double p3){
188
189   v[0]=e;
190   v[1]=p1;
191   v[2]=p2;
192   v[3]=p3;
193 }
194
195 #endif
196