00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef ThePEG_LorentzTensor_H
00010 #define ThePEG_LorentzTensor_H
00011
00012
00013
00014 #include "ThePEG/Config/ThePEG.h"
00015 #include "LorentzPolarizationVector.h"
00016
00017 namespace ThePEG {
00018 namespace Helicity {
00019
00020
00021 template<typename Value> class LorentzTensor;
00022
00036 template<typename Value>
00037 class LorentzTensor {
00038
00039 public:
00040
00046 LorentzTensor() {
00047 for(unsigned int ix=0;ix<4;++ix)
00048 for(unsigned int iy=0;iy<4;++iy)
00049 _tensor[ix][iy]=Value();
00050 }
00051
00055 LorentzTensor(complex<Value> xx, complex<Value> xy,
00056 complex<Value> xz, complex<Value> xt,
00057 complex<Value> yx, complex<Value> yy,
00058 complex<Value> yz, complex<Value> yt,
00059 complex<Value> zx, complex<Value> zy,
00060 complex<Value> zz, complex<Value> zt,
00061 complex<Value> tx, complex<Value> ty,
00062 complex<Value> tz, complex<Value> tt){
00063 _tensor[0][0]=xx;_tensor[0][1]=xy;_tensor[0][2]=xz;_tensor[0][3]=xt;
00064 _tensor[1][0]=yx;_tensor[1][1]=yy;_tensor[1][2]=yz;_tensor[1][3]=yt;
00065 _tensor[2][0]=zx;_tensor[2][1]=zy;_tensor[2][2]=zz;_tensor[2][3]=zt;
00066 _tensor[3][0]=tx;_tensor[3][1]=ty;_tensor[3][2]=tz;_tensor[3][3]=tt;
00067 }
00068
00072 LorentzTensor(const LorentzPolarizationVector & p,
00073 const LorentzPolarizationVector & q) {
00074 setXX(p.x() * q.x()); setYX(p.y() * q.x());
00075 setZX(p.z() * q.x()); setTX(p.t() * q.x());
00076 setXY(p.x() * q.y()); setYY(p.y() * q.y());
00077 setZY(p.z() * q.y()); setTY(p.t() * q.y());
00078 setXZ(p.x() * q.z()); setYZ(p.y() * q.z());
00079 setZZ(p.z() * q.z()); setTZ(p.t() * q.z());
00080 setXT(p.x() * q.t()); setYT(p.y() * q.t());
00081 setZT(p.z() * q.t()); setTT(p.t() * q.t());
00082 }
00084
00090 complex<Value> xx() const {return _tensor[0][0];}
00091
00095 complex<Value> yx() const {return _tensor[1][0];}
00099 complex<Value> zx() const {return _tensor[2][0];}
00100
00104 complex<Value> tx() const {return _tensor[3][0];}
00105
00109 complex<Value> xy() const {return _tensor[0][1];}
00110
00114 complex<Value> yy() const {return _tensor[1][1];}
00115
00119 complex<Value> zy() const {return _tensor[2][1];}
00120
00124 complex<Value> ty() const {return _tensor[3][1];}
00125
00129 complex<Value> xz() const {return _tensor[0][2];}
00130
00134 complex<Value> yz() const {return _tensor[1][2];}
00135
00139 complex<Value> zz() const {return _tensor[2][2];}
00140
00144 complex<Value> tz() const {return _tensor[3][2];}
00145
00149 complex<Value> xt() const {return _tensor[0][3];}
00150
00154 complex<Value> yt() const {return _tensor[1][3];}
00155
00159 complex<Value> zt() const {return _tensor[2][3];}
00160
00164 complex<Value> tt() const {return _tensor[3][3];}
00165
00169 void setXX(complex<Value> a) {_tensor[0][0]=a;}
00170
00174 void setYX(complex<Value> a) {_tensor[1][0]=a;}
00175
00179 void setZX(complex<Value> a) {_tensor[2][0]=a;}
00180
00184 void setTX(complex<Value> a) {_tensor[3][0]=a;}
00185
00189 void setXY(complex<Value> a) {_tensor[0][1]=a;}
00190
00194 void setYY(complex<Value> a) {_tensor[1][1]=a;}
00195
00199 void setZY(complex<Value> a) {_tensor[2][1]=a;}
00200
00204 void setTY(complex<Value> a) {_tensor[3][1]=a;}
00205
00209 void setXZ(complex<Value> a) {_tensor[0][2]=a;}
00210
00214 void setYZ(complex<Value> a) {_tensor[1][2]=a;}
00215
00219 void setZZ(complex<Value> a) {_tensor[2][2]=a;}
00220
00224 void setTZ(complex<Value> a) {_tensor[3][2]=a;}
00225
00229 void setXT(complex<Value> a) {_tensor[0][3]=a;}
00230
00234 void setYT(complex<Value> a) {_tensor[1][3]=a;}
00235
00239 void setZT(complex<Value> a) {_tensor[2][3]=a;}
00240
00244 void setTT(complex<Value> a) {_tensor[3][3]=a;}
00245
00249 complex<Value> operator () (int i, int j) const {
00250 assert( i>=0 && i<=3 && j>=0 && j<=3);
00251 return _tensor[i][j];
00252 }
00253
00257 complex<Value> & operator () (int i, int j) {
00258 assert( i>=0 && i<=3 && j>=0 && j<=3);
00259 return _tensor[i][j];
00260 }
00262
00268 LorentzTensor & boost(double,double,double);
00269
00273 LorentzTensor<Value> & boost(const Boost & b) {
00274 return boost(b.x(), b.y(), b.z());
00275 }
00276
00280 LorentzTensor & transform(const SpinOneLorentzRotation & r){
00281 unsigned int ix,iy,ixa,iya;
00282 LorentzTensor<Value> output;
00283 complex<Value> temp;
00284 for(ix=0;ix<4;++ix) {
00285 for(iy=0;iy<4;++iy) {
00286 temp=complex<Value>();
00287 for(ixa=0;ixa<4;++ixa) {
00288 for(iya=0;iya<4;++iya)
00289 temp+=r(ix,ixa)*r(iy,iya)*(*this)(ixa,iya);
00290 }
00291 output(ix,iy)=temp;
00292 }
00293 }
00294 *this=output;
00295 return *this;
00296 }
00297
00301 LorentzTensor<Value> conjugate() {
00302 return LorentzTensor<Value>(conj(xx()), conj(xy()), conj(xz()), conj(xt()),
00303 conj(yx()), conj(yy()), conj(yz()), conj(yt()),
00304 conj(zx()), conj(zy()), conj(zz()), conj(zt()),
00305 conj(tx()), conj(ty()), conj(tz()), conj(tt()));
00306 }
00307
00309
00315 LorentzTensor<Value> operator*=(Complex a) {
00316 for(int ix=0;ix<4;++ix)
00317 for(int iy=0;iy<4;++iy) _tensor[ix][iy]*=a;
00318 return *this;
00319 }
00320
00324 template <typename T, typename U>
00325 friend complex<typename BinaryOpTraits<T,U>::MulT>
00326 operator*(const LorentzTensor<T> & t, const LorentzTensor<U> & u);
00327
00331 LorentzTensor<Value> operator+(const LorentzTensor<Value> & in) const {
00332 return LorentzTensor<Value>(xx()+in.xx(),xy()+in.xy(),xz()+in.xz(),xt()+in.xt(),
00333 yx()+in.yx(),yy()+in.yy(),yz()+in.yz(),yt()+in.yt(),
00334 zx()+in.zx(),zy()+in.zy(),zz()+in.zz(),zt()+in.zt(),
00335 tx()+in.tx(),ty()+in.ty(),tz()+in.tz(),tt()+in.tt());
00336 }
00337
00341 LorentzTensor<Value> operator-(const LorentzTensor<Value> & in) const {
00342 return LorentzTensor<Value>(xx()-in.xx(),xy()-in.xy(),xz()-in.xz(),xt()-in.xt(),
00343 yx()-in.yx(),yy()-in.yy(),yz()-in.yz(),yt()-in.yt(),
00344 zx()-in.zx(),zy()-in.zy(),zz()-in.zz(),zt()-in.zt(),
00345 tx()-in.tx(),ty()-in.ty(),tz()-in.tz(),tt()-in.tt());
00346 }
00347
00351 complex<Value> trace() {
00352 return _tensor[3][3]-_tensor[0][0]-_tensor[1][1]-_tensor[2][2];
00353 }
00355
00356 private:
00357
00361 complex<Value> _tensor[4][4];
00362
00363 };
00364
00368 template<typename T, typename U>
00369 inline LorentzTensor<typename BinaryOpTraits<T,U>::MulT>
00370 operator*(complex<U> a, const LorentzTensor<T> & t) {
00371 return LorentzTensor<typename BinaryOpTraits<T,U>::MulT>
00372 (a*t.xx(), a*t.xy(), a*t.xz(), a*t.xt(),
00373 a*t.yx(), a*t.yy(), a*t.yz(), a*t.yt(),
00374 a*t.zx(), a*t.zy(), a*t.zz(), a*t.zt(),
00375 a*t.tx(), a*t.ty(), a*t.tz(), a*t.tt());
00376 }
00377
00381 template<typename T, typename U>
00382 inline LorentzVector<typename BinaryOpTraits<complex<T>,U>::MulT>
00383 operator*(const LorentzVector<U> & invec,
00384 const LorentzTensor<T> & inten) {
00385 LorentzVector<typename BinaryOpTraits<complex<T>,U>::MulT> outvec;
00386 outvec.setX(invec.t()*inten(3,0)-invec.x()*inten(0,0)
00387 -invec.y()*inten(1,0)-invec.z()*inten(2,0));
00388 outvec.setY(invec.t()*inten(3,1)-invec.x()*inten(0,1)
00389 -invec.y()*inten(1,1)-invec.z()*inten(2,1));
00390 outvec.setZ(invec.t()*inten(3,2)-invec.x()*inten(0,2)
00391 -invec.y()*inten(1,2)-invec.z()*inten(2,2));
00392 outvec.setT(invec.t()*inten(3,3)-invec.x()*inten(0,3)
00393 -invec.y()*inten(1,3)-invec.z()*inten(2,3));
00394 return outvec;
00395 }
00396
00400 template<typename T, typename U>
00401 inline LorentzVector<typename BinaryOpTraits<complex<T>,U>::MulT>
00402 operator*(const LorentzTensor<T> & inten, const LorentzVector<U> & invec){
00403 LorentzVector<typename BinaryOpTraits<complex<T>,U>::MulT> outvec;
00404 outvec.setX(invec.t()*inten(0,3)-invec.x()*inten(0,0)
00405 -invec.y()*inten(0,1)-invec.z()*inten(0,2));
00406 outvec.setY(invec.t()*inten(1,3)-invec.x()*inten(1,0)
00407 -invec.y()*inten(1,1)-invec.z()*inten(1,2));
00408 outvec.setZ(invec.t()*inten(2,3)-invec.x()*inten(2,0)
00409 -invec.y()*inten(2,1)-invec.z()*inten(2,2));
00410 outvec.setT(invec.t()*inten(3,3)-invec.x()*inten(3,0)
00411 -invec.y()*inten(3,1)-invec.z()*inten(3,2));
00412 return outvec;
00413 }
00414
00418 template <typename T, typename U>
00419 inline complex<typename BinaryOpTraits<T,U>::MulT>
00420 operator*(const LorentzTensor<T> & t, const LorentzTensor<U> & u) {
00421 typedef complex<typename BinaryOpTraits<T,U>::MulT> RetT;
00422 RetT output=RetT(),temp;
00423 for(unsigned int ix=0;ix<4;++ix) {
00424 temp = t._tensor[ix][3]*u._tensor[ix][3];
00425 for(unsigned int iy=0;iy<3;++iy) {
00426 temp+= t._tensor[ix][iy]*u._tensor[ix][iy];
00427 }
00428 if(ix<3) output-=temp;
00429 else output+=temp;
00430 }
00431 return output;
00432 }
00433
00434 }
00435 }
00436
00437 #ifndef ThePEG_TEMPLATES_IN_CC_FILE
00438 #include "LorentzTensor.tcc"
00439 #endif
00440
00441 #endif