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: EvtTensor4C.cc
13 // Description: Implementation of tensor particles.
15 // Modification history:
17 // DJL/RYD September 25,1996 Module created
19 //------------------------------------------------------------------------
21 #include "EvtGenBase/EvtPatches.hh"
25 #include "EvtGenBase/EvtComplex.hh"
26 #include "EvtGenBase/EvtVector4C.hh"
27 #include "EvtGenBase/EvtTensor4C.hh"
33 EvtTensor4C::EvtTensor4C( const EvtTensor4C& t1 ) {
45 EvtTensor4C::~EvtTensor4C() { }
47 const EvtTensor4C& EvtTensor4C::g(){
49 static EvtTensor4C g_metric(1.0,-1.0,-1.0,-1.0);
55 EvtTensor4C& EvtTensor4C::operator=(const EvtTensor4C& t1) {
66 EvtTensor4C EvtTensor4C::conj() const {
73 temp.set(j,i,::conj(t[i][j]));
80 EvtTensor4C rotateEuler(const EvtTensor4C& rs,
81 double alpha,double beta,double gamma){
84 tmp.applyRotateEuler(alpha,beta,gamma);
89 EvtTensor4C boostTo(const EvtTensor4C& rs,
90 const EvtVector4R p4){
98 EvtTensor4C boostTo(const EvtTensor4C& rs,
99 const EvtVector3R boost){
102 tmp.applyBoostTo(boost);
107 void EvtTensor4C::applyBoostTo(const EvtVector4R& p4){
111 EvtVector3R boost(p4.get(1)/e,p4.get(2)/e,p4.get(3)/e);
120 void EvtTensor4C::applyBoostTo(const EvtVector3R& boost){
122 double bx,by,bz,gamma,b2;
143 gamma=1.0/sqrt(1-b2);
154 lambda[0][1]=gamma*bx;
155 lambda[1][0]=gamma*bx;
156 lambda[0][2]=gamma*by;
157 lambda[2][0]=gamma*by;
158 lambda[0][3]=gamma*bz;
159 lambda[3][0]=gamma*bz;
161 lambda[1][1]=1.0+(gamma-1.0)*bx*bx/b2;
162 lambda[2][2]=1.0+(gamma-1.0)*by*by/b2;
163 lambda[3][3]=1.0+(gamma-1.0)*bz*bz/b2;
165 lambda[1][2]=(gamma-1.0)*bx*by/b2;
166 lambda[2][1]=(gamma-1.0)*bx*by/b2;
168 lambda[1][3]=(gamma-1.0)*bx*bz/b2;
169 lambda[3][1]=(gamma-1.0)*bx*bz/b2;
171 lambda[3][2]=(gamma-1.0)*bz*by/b2;
172 lambda[2][3]=(gamma-1.0)*bz*by/b2;
176 tt[i][j] = EvtComplex(0.0);
178 tt[i][j]=tt[i][j]+lambda[j][k]*t[i][k];
185 t[i][j] = EvtComplex(0.0);
187 t[i][j]=t[i][j]+lambda[i][k]*tt[k][j];
194 void EvtTensor4C::zero(){
198 t[i][j]=EvtComplex(0.0,0.0);
205 ostream& operator<<(ostream& s,const EvtTensor4C& t){
218 void EvtTensor4C::setdiag(double g00, double g11, double g22, double g33){
219 t[0][0]=EvtComplex(g00);
220 t[1][1]=EvtComplex(g11);
221 t[2][2]=EvtComplex(g22);
222 t[3][3]=EvtComplex(g33);
223 t[0][1] = EvtComplex(0.0);
224 t[0][2] = EvtComplex(0.0);
225 t[0][3] = EvtComplex(0.0);
226 t[1][0] = EvtComplex(0.0);
227 t[1][2] = EvtComplex(0.0);
228 t[1][3] = EvtComplex(0.0);
229 t[2][0] = EvtComplex(0.0);
230 t[2][1] = EvtComplex(0.0);
231 t[2][3] = EvtComplex(0.0);
232 t[3][0] = EvtComplex(0.0);
233 t[3][1] = EvtComplex(0.0);
234 t[3][2] = EvtComplex(0.0);
238 EvtTensor4C& EvtTensor4C::operator+=(const EvtTensor4C& t2){
244 t[i][j]+=t2.get(i,j);
250 EvtTensor4C& EvtTensor4C::operator-=(const EvtTensor4C& t2){
256 t[i][j]-=t2.get(i,j);
263 EvtTensor4C& EvtTensor4C::operator*=(const EvtComplex& c) {
275 EvtTensor4C operator*(const EvtTensor4C& t1,const EvtComplex& c){
277 return EvtTensor4C(t1)*=c;
281 EvtTensor4C operator*(const EvtComplex& c,const EvtTensor4C& t1){
283 return EvtTensor4C(t1)*=c;
288 EvtTensor4C& EvtTensor4C::operator*=(double d) {
293 t[i][j]*=EvtComplex(d,0.0);
300 EvtTensor4C operator*(const EvtTensor4C& t1, double d){
302 return EvtTensor4C(t1)*=EvtComplex(d,0.0);
306 EvtTensor4C operator*(double d, const EvtTensor4C& t1){
308 return EvtTensor4C(t1)*=EvtComplex(d,0.0);
312 EvtComplex cont(const EvtTensor4C& t1,const EvtTensor4C& t2){
314 EvtComplex sum(0.0,0.0);
319 if ((i==0&&j!=0) || (j==0&&i!=0)) {
320 sum -= t1.t[i][j]*t2.t[i][j];
322 sum += t1.t[i][j]*t2.t[i][j];
331 EvtTensor4C EvtGenFunctions::directProd(const EvtVector4C& c1,
332 const EvtVector4C& c2){
338 temp.set(i,j,c1.get(i)*c2.get(j));
345 EvtTensor4C EvtGenFunctions::directProd(const EvtVector4C& c1,
346 const EvtVector4R& c2){
352 temp.set(i,j,c1.get(i)*c2.get(j));
359 EvtTensor4C EvtGenFunctions::directProd(const EvtVector4R& c1,
360 const EvtVector4R& c2){
367 temp.t[i][j]=EvtComplex(c1.get(i)*c2.get(j),0.0);
373 EvtTensor4C& EvtTensor4C::addDirProd(const EvtVector4R& p1,const EvtVector4R& p2){
379 t[i][j]+=p1.get(i)*p2.get(j);
386 EvtTensor4C dual(const EvtTensor4C& t2){
390 temp.set(0,0,EvtComplex(0.0,0.0));
391 temp.set(1,1,EvtComplex(0.0,0.0));
392 temp.set(2,2,EvtComplex(0.0,0.0));
393 temp.set(3,3,EvtComplex(0.0,0.0));
395 temp.set(0,1,t2.get(3,2)-t2.get(2,3));
396 temp.set(0,2,-t2.get(3,1)+t2.get(1,3));
397 temp.set(0,3,t2.get(2,1)-t2.get(1,2));
399 temp.set(1,2,-t2.get(3,0)+t2.get(0,3));
400 temp.set(1,3,t2.get(2,0)-t2.get(0,2));
402 temp.set(2,3,-t2.get(1,0)+t2.get(0,1));
404 temp.set(1,0,-temp.get(0,1));
405 temp.set(2,0,-temp.get(0,2));
406 temp.set(3,0,-temp.get(0,3));
408 temp.set(2,1,-temp.get(1,2));
409 temp.set(3,1,-temp.get(1,3));
411 temp.set(3,2,-temp.get(2,3));
418 EvtTensor4C conj(const EvtTensor4C& t2) {
425 temp.set(i,j,::conj((t2.get(i,j))));
433 EvtTensor4C cont22(const EvtTensor4C& t1,const EvtTensor4C& t2){
441 c=t1.get(i,0)*t2.get(j,0)-t1.get(i,1)*t2.get(j,1)
442 -t1.get(i,2)*t2.get(j,2)-t1.get(i,3)*t2.get(j,3);
450 EvtTensor4C cont11(const EvtTensor4C& t1,const EvtTensor4C& t2){
458 c=t1.get(0,i)*t2.get(0,j)-t1.get(1,i)*t2.get(1,j)
459 -t1.get(2,i)*t2.get(2,j)-t1.get(3,i)*t2.get(3,j);
468 EvtVector4C EvtTensor4C::cont1(const EvtVector4C& v4) const {
474 temp.set(i,t[0][i]*v4.get(0)-t[1][i]*v4.get(1)
475 -t[2][i]*v4.get(2)-t[3][i]*v4.get(3));
481 EvtVector4C EvtTensor4C::cont2(const EvtVector4C& v4) const {
487 temp.set(i,t[i][0]*v4.get(0)-t[i][1]*v4.get(1)
488 -t[i][2]*v4.get(2)-t[i][3]*v4.get(3));
495 EvtVector4C EvtTensor4C::cont1(const EvtVector4R& v4) const {
501 temp.set(i,t[0][i]*v4.get(0)-t[1][i]*v4.get(1)
502 -t[2][i]*v4.get(2)-t[3][i]*v4.get(3));
509 EvtVector4C EvtTensor4C::cont2(const EvtVector4R& v4) const {
515 temp.set(i,t[i][0]*v4.get(0)-t[i][1]*v4.get(1)
516 -t[i][2]*v4.get(2)-t[i][3]*v4.get(3));
524 void EvtTensor4C::applyRotateEuler(double phi,double theta,double ksi){
527 double sp,st,sk,cp,ct,ck;
546 lambda[1][1]= ck*ct*cp-sk*sp;
547 lambda[1][2]=-sk*ct*cp-ck*sp;
550 lambda[2][1]= ck*ct*sp+sk*cp;
551 lambda[2][2]=-sk*ct*sp+ck*cp;
564 tt[i][j] = EvtComplex(0.0);
566 tt[i][j]+=lambda[j][k]*t[i][k];
573 t[i][j] = EvtComplex(0.0);
575 t[i][j]+=lambda[i][k]*tt[k][j];