Line data Source code
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 :
32 :
33 : inline friend EvtVector4R operator*(double d,const EvtVector4R& v2);
34 : inline friend EvtVector4R operator*(const EvtVector4R& v2,double d);
35 : inline friend EvtVector4R operator/(const EvtVector4R& v2,double d);
36 : inline friend double operator*(const EvtVector4R& v1,const EvtVector4R& v2);
37 : inline friend EvtVector4R operator+(const EvtVector4R& v1,const EvtVector4R& v2);
38 : inline friend EvtVector4R operator-(const EvtVector4R& v1,const EvtVector4R& v2);
39 :
40 : public:
41 : EvtVector4R();
42 : EvtVector4R(double e,double px,double py ,double pz);
43 : inline void set(int i,double d);
44 : inline void set(double e,double px,double py ,double pz);
45 : inline EvtVector4R& operator*=(double c);
46 : inline EvtVector4R& operator/=(double c);
47 : inline EvtVector4R& operator=(const EvtVector4R& v2);
48 : inline EvtVector4R& operator+=(const EvtVector4R& v2);
49 : inline EvtVector4R& operator-=(const EvtVector4R& v2);
50 : inline double get(int i) const;
51 : inline double cont(const EvtVector4R& v4) const;
52 : friend std::ostream& operator<<(std::ostream& s, const EvtVector4R& v);
53 : double mass2() const;
54 : double mass() const;
55 : void applyRotateEuler(double alpha,double beta,double gamma);
56 : void applyBoostTo(const EvtVector4R& p4, bool inverse = false);
57 : void applyBoostTo(const EvtVector3R& boost, bool inverse = false);
58 : EvtVector4R cross(const EvtVector4R& v2);
59 : double dot(const EvtVector4R& v2) const;
60 : double d3mag() const;
61 :
62 : // Added by AJB - calculate scalars in the rest frame of the current object
63 : double scalartripler3( const EvtVector4R& p1, const EvtVector4R& p2,
64 : const EvtVector4R& p3 ) const;
65 : double dotr3( const EvtVector4R& p1, const EvtVector4R& p2 ) const;
66 : double mag2r3( const EvtVector4R& p1 ) const;
67 : double magr3( const EvtVector4R& p1 ) const;
68 :
69 :
70 : private:
71 :
72 : double v[4];
73 :
74 0 : inline double Square( double x ) const { return x*x; }
75 :
76 : };
77 :
78 : EvtVector4R rotateEuler(const EvtVector4R& rs,
79 : double alpha,double beta,double gamma);
80 : EvtVector4R boostTo(const EvtVector4R& rs,
81 : const EvtVector4R& p4, bool inverse = false);
82 : EvtVector4R boostTo(const EvtVector4R& rs,
83 : const EvtVector3R& boost, bool inverse = false);
84 :
85 : inline EvtVector4R& EvtVector4R::operator=(const EvtVector4R& v2){
86 :
87 0 : v[0]=v2.v[0];
88 0 : v[1]=v2.v[1];
89 0 : v[2]=v2.v[2];
90 0 : v[3]=v2.v[3];
91 :
92 0 : return *this;
93 : }
94 :
95 : inline EvtVector4R& EvtVector4R::operator+=(const EvtVector4R& v2){
96 :
97 0 : v[0]+=v2.v[0];
98 0 : v[1]+=v2.v[1];
99 0 : v[2]+=v2.v[2];
100 0 : v[3]+=v2.v[3];
101 :
102 0 : return *this;
103 : }
104 :
105 : inline EvtVector4R& EvtVector4R::operator-=(const EvtVector4R& v2){
106 :
107 0 : v[0]-=v2.v[0];
108 0 : v[1]-=v2.v[1];
109 0 : v[2]-=v2.v[2];
110 0 : v[3]-=v2.v[3];
111 :
112 0 : return *this;
113 : }
114 :
115 : inline double EvtVector4R::mass2() const{
116 :
117 0 : 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 0 : return EvtVector4R(v2)*=c;
123 : }
124 :
125 : inline EvtVector4R operator*(const EvtVector4R& v2,double c){
126 :
127 0 : return EvtVector4R(v2)*=c;
128 : }
129 :
130 : inline EvtVector4R operator/(const EvtVector4R& v2,double c){
131 :
132 0 : return EvtVector4R(v2)/=c;
133 : }
134 :
135 : inline EvtVector4R& EvtVector4R::operator*=(double c){
136 :
137 0 : v[0]*=c;
138 0 : v[1]*=c;
139 0 : v[2]*=c;
140 0 : v[3]*=c;
141 :
142 0 : return *this;
143 : }
144 :
145 : inline EvtVector4R& EvtVector4R::operator/=(double c){
146 :
147 0 : double cinv=1.0/c;
148 0 : v[0]*=cinv;
149 0 : v[1]*=cinv;
150 0 : v[2]*=cinv;
151 0 : v[3]*=cinv;
152 :
153 0 : return *this;
154 : }
155 :
156 : inline double operator*(const EvtVector4R& v1,const EvtVector4R& v2){
157 :
158 0 : return v1.v[0]*v2.v[0]-v1.v[1]*v2.v[1]-
159 0 : 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 0 : return EvtVector4R(v1)-=v2;
171 : }
172 :
173 : inline EvtVector4R operator+(const EvtVector4R& v1,const EvtVector4R& v2){
174 :
175 0 : return EvtVector4R(v1)+=v2;
176 : }
177 :
178 : inline double EvtVector4R::get(int i) const {
179 0 : return v[i];
180 : }
181 :
182 : inline void EvtVector4R::set(int i,double d){
183 :
184 0 : v[i]=d;
185 0 : }
186 :
187 : inline void EvtVector4R::set(double e,double p1,double p2, double p3){
188 :
189 0 : v[0]=e;
190 0 : v[1]=p1;
191 0 : v[2]=p2;
192 0 : v[3]=p3;
193 0 : }
194 :
195 : #endif
196 :
|