]> git.uio.no Git - u/mrichter/AliRoot.git/blame - TEvtGen/EvtGenBase/EvtVector4R.cpp
Handle expressions with negations (Diego)
[u/mrichter/AliRoot.git] / TEvtGen / EvtGenBase / EvtVector4R.cpp
CommitLineData
da0e9ce3 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: EvtVector4R.cc
12//
13// Description: Real implementation of 4-vectors
14//
15// Modification history:
16//
17// DJL/RYD September 25, 1996 Module created
18//
19//------------------------------------------------------------------------
20//
21#include "EvtGenBase/EvtPatches.hh"
22#include <iostream>
0ca57c2f 23#include <cmath>
da0e9ce3 24#include "EvtGenBase/EvtVector4R.hh"
25#include "EvtGenBase/EvtVector3R.hh"
26#include "EvtGenBase/EvtVector4C.hh"
27#include "EvtGenBase/EvtTensor4C.hh"
28
29using std::ostream;
30
0ca57c2f 31EvtVector4R::EvtVector4R() {
32 v[0] = 0.0; v[1] = 0.0; v[2] = 0.0; v[3] = 0.0;
33}
da0e9ce3 34
35EvtVector4R::EvtVector4R(double e,double p1,double p2, double p3){
36
37 v[0]=e; v[1]=p1; v[2]=p2; v[3]=p3;
38}
39
40double EvtVector4R::mass() const{
41
42 double m2=v[0]*v[0]-v[1]*v[1]-v[2]*v[2]-v[3]*v[3];
43
44 if (m2>0.0) {
45 return sqrt(m2);
46 }
47 else{
48 return 0.0;
49 }
50}
51
52
53EvtVector4R rotateEuler(const EvtVector4R& rs,
54 double alpha,double beta,double gamma){
55
56 EvtVector4R tmp(rs);
57 tmp.applyRotateEuler(alpha,beta,gamma);
58 return tmp;
59
60}
61
62EvtVector4R boostTo(const EvtVector4R& rs,
0ca57c2f 63 const EvtVector4R& p4, bool inverse){
da0e9ce3 64
65 EvtVector4R tmp(rs);
0ca57c2f 66 tmp.applyBoostTo(p4, inverse);
da0e9ce3 67 return tmp;
68
69}
70
71EvtVector4R boostTo(const EvtVector4R& rs,
0ca57c2f 72 const EvtVector3R& boost, bool inverse){
da0e9ce3 73
74 EvtVector4R tmp(rs);
0ca57c2f 75 tmp.applyBoostTo(boost, inverse);
da0e9ce3 76 return tmp;
77
78}
79
80
81
82void EvtVector4R::applyRotateEuler(double phi,double theta,double ksi){
83
84 double sp=sin(phi);
85 double st=sin(theta);
86 double sk=sin(ksi);
87 double cp=cos(phi);
88 double ct=cos(theta);
89 double ck=cos(ksi);
90
91 double x=( ck*ct*cp-sk*sp)*v[1]+( -sk*ct*cp-ck*sp)*v[2]+st*cp*v[3];
92 double y=( ck*ct*sp+sk*cp)*v[1]+(-sk*ct*sp+ck*cp)*v[2]+st*sp*v[3];
93 double z=-ck*st*v[1]+sk*st*v[2]+ct*v[3];
94
95 v[1]=x;
96 v[2]=y;
97 v[3]=z;
98
99}
100
101ostream& operator<<(ostream& s, const EvtVector4R& v){
102
103 s<<"("<<v.v[0]<<","<<v.v[1]<<","<<v.v[2]<<","<<v.v[3]<<")";
104
105 return s;
106
107}
108
0ca57c2f 109void EvtVector4R::applyBoostTo(const EvtVector4R& p4, bool inverse){
da0e9ce3 110
111 double e=p4.get(0);
112
113 EvtVector3R boost(p4.get(1)/e,p4.get(2)/e,p4.get(3)/e);
114
0ca57c2f 115 applyBoostTo(boost, inverse);
da0e9ce3 116
117 return;
118
119}
120
0ca57c2f 121void EvtVector4R::applyBoostTo(const EvtVector3R& boost, bool inverse){
da0e9ce3 122
123 double bx,by,bz,gamma,b2;
124
125 bx=boost.get(0);
126 by=boost.get(1);
127 bz=boost.get(2);
128
129 double bxx=bx*bx;
130 double byy=by*by;
131 double bzz=bz*bz;
132
133 b2=bxx+byy+bzz;
134
0ca57c2f 135 if (b2 > 0.0 && b2 < 1.0) {
da0e9ce3 136
0ca57c2f 137 gamma=1.0/sqrt(1.0-b2);
da0e9ce3 138
0ca57c2f 139 double gb2=(gamma-1.0)/b2;
da0e9ce3 140
0ca57c2f 141 double gb2xy=gb2*bx*by;
142 double gb2xz=gb2*bx*bz;
143 double gb2yz=gb2*by*bz;
da0e9ce3 144
0ca57c2f 145 double gbx=gamma*bx;
146 double gby=gamma*by;
147 double gbz=gamma*bz;
da0e9ce3 148
0ca57c2f 149 double e2=v[0];
150 double px2=v[1];
151 double py2=v[2];
152 double pz2=v[3];
da0e9ce3 153
0ca57c2f 154 if ( inverse ) {
155 v[0]=gamma*e2-gbx*px2-gby*py2-gbz*pz2;
156
157 v[1]=-gbx*e2+gb2*bxx*px2+px2+gb2xy*py2+gb2xz*pz2;
158
159 v[2]=-gby*e2+gb2*byy*py2+py2+gb2xy*px2+gb2yz*pz2;
160
161 v[3]=-gbz*e2+gb2*bzz*pz2+pz2+gb2yz*py2+gb2xz*px2;
162 }
163 else {
164 v[0]=gamma*e2+gbx*px2+gby*py2+gbz*pz2;
165
166 v[1]=gbx*e2+gb2*bxx*px2+px2+gb2xy*py2+gb2xz*pz2;
167
168 v[2]=gby*e2+gb2*byy*py2+py2+gb2xy*px2+gb2yz*pz2;
169
170 v[3]=gbz*e2+gb2*bzz*pz2+pz2+gb2yz*py2+gb2xz*px2;
171 }
172 }
da0e9ce3 173
174}
175
176EvtVector4R EvtVector4R::cross( const EvtVector4R& p2 ){
177
178 //Calcs the cross product. Added by djl on July 27, 1995.
179 //Modified for real vectros by ryd Aug 28-96
180
181 EvtVector4R temp;
182
183 temp.v[0] = 0.0;
184 temp.v[1] = v[2]*p2.v[3] - v[3]*p2.v[2];
185 temp.v[2] = v[3]*p2.v[1] - v[1]*p2.v[3];
186 temp.v[3] = v[1]*p2.v[2] - v[2]*p2.v[1];
187
188 return temp;
189}
190
191double EvtVector4R::d3mag() const
192
193// returns the 3 momentum mag.
194{
195 double temp;
196
197 temp = v[1]*v[1]+v[2]*v[2]+v[3]*v[3];
198
199 temp = sqrt( temp );
200
201 return temp;
202} // r3mag
203
204double EvtVector4R::dot ( const EvtVector4R& p2 )const{
205
206 //Returns the dot product of the 3 momentum. Added by
207 //djl on July 27, 1995. for real!!!
208
209 double temp;
210
211 temp = v[1]*p2.v[1];
212 temp += v[2]*p2.v[2];
213 temp += v[3]*p2.v[3];
214
215 return temp;
216
217} //dot
218
219// Functions below added by AJB
220
221// Calculate ( \vec{p1} cross \vec{p2} ) \cdot \vec{p3} in rest frame of object
222double EvtVector4R::scalartripler3( const EvtVector4R& p1,
223 const EvtVector4R& p2, const EvtVector4R& p3 ) const
224{
0ca57c2f 225 EvtVector4C lc=dual(EvtGenFunctions::directProd(*this, p1)).cont2(p2);
226 EvtVector4R l(real(lc.get(0)), real(lc.get(1)), real(lc.get(2)),
227 real(lc.get(3)));
228
229 return -1.0/mass() * (l * p3);
da0e9ce3 230}
231
232// Calculate the 3-d dot product of 4-vectors p1 and p2 in the rest frame of
233// 4-vector p0
234double EvtVector4R::dotr3( const EvtVector4R& p1, const EvtVector4R& p2 ) const
235{
236 return 1/mass2() * ((*this) * p1) * ((*this) * p2) - p1 * p2;
237}
238
239// Calculate the 3-d magnitude squared of 4-vector p1 in the rest frame of
240// 4-vector p0
241double EvtVector4R::mag2r3( const EvtVector4R& p1 ) const
242{
243 return Square((*this) * p1)/mass2() - p1.mass2();
244}
245
246// Calculate the 3-d magnitude 4-vector p1 in the rest frame of 4-vector p0.
247double EvtVector4R::magr3( const EvtVector4R& p1 ) const
248{
249 return sqrt(mag2r3(p1));
250}
251
252
253
254
255
256
257