00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef ThePEG_TensorWaveFunction_H
00010 #define ThePEG_TensorWaveFunction_H
00011
00012
00013
00014 #include "WaveFunctionBase.h"
00015 #include "VectorWaveFunction.h"
00016 #include <ThePEG/Helicity/LorentzTensor.h>
00017 #include <ThePEG/Helicity/TensorSpinInfo.h>
00018 #include <ThePEG/EventRecord/Particle.h>
00019 #include <ThePEG/Helicity/RhoDMatrix.h>
00020
00021 namespace ThePEG {
00022 namespace Helicity {
00023
00028 enum TensorPhase {
00029 tensor_phase,
00030 tensor_nophase,
00031 default_tensor_phase=tensor_nophase
00032 };
00033
00067 class TensorWaveFunction : public WaveFunctionBase {
00068
00069 public:
00070
00081 TensorWaveFunction(const Lorentz5Momentum & p,tcPDPtr part,
00082 const LorentzTensor<double> & wave,
00083 Direction dir=intermediate)
00084 : WaveFunctionBase(p,part,dir), _wf(wave)
00085 {
00086 assert(iSpin()==PDT::Spin2);
00087 }
00088
00110 TensorWaveFunction(const Lorentz5Momentum & p,tcPDPtr part,
00111 Complex xx,Complex xy,Complex xz,Complex xt,Complex yx,
00112 Complex yy,Complex yz,Complex yt,Complex zx,Complex zy,
00113 Complex zz,Complex zt,Complex tx,Complex ty,Complex tz,
00114 Complex tt)
00115 : WaveFunctionBase(p,part), _wf(xx,xy,xz,xt,
00116 yx,yy,yz,yt,
00117 zx,zy,zz,zt,
00118 tx,ty,tz,tt)
00119 {
00120 assert(iSpin()==PDT::Spin2);
00121 }
00122
00131 TensorWaveFunction(const Lorentz5Momentum & p,tcPDPtr part,
00132 unsigned int ihel,Direction dir,
00133 TensorPhase phase=default_tensor_phase)
00134 : WaveFunctionBase(p,part,dir)
00135 {
00136 assert(iSpin()==PDT::Spin2);
00137 calculateWaveFunction(ihel,phase);
00138 }
00139
00146 TensorWaveFunction(const Lorentz5Momentum & p,
00147 tcPDPtr part,Direction dir)
00148 : WaveFunctionBase(p,part,dir), _wf()
00149 {
00150 assert(iSpin()==PDT::Spin2);
00151 }
00152
00156 TensorWaveFunction() {}
00157
00161 TensorWaveFunction(vector<TensorWaveFunction> & wave,
00162 tPPtr part,Direction dir,bool time,bool massless,
00163 bool=true,
00164 TensorPhase phase=default_tensor_phase) {
00165 calculateWaveFunctions(wave,part,dir,massless,phase);
00166 constructSpinInfo(wave,part,dir,time,massless);
00167 }
00169
00177 Complex operator ()(int i, int j) const {
00178 return _wf(i,j);
00179 }
00180
00184 Complex & operator () (int i, int j) {
00185 return _wf(i,j);
00186 }
00187
00191 const LorentzTensor<double> & wave() const {return _wf;}
00192
00196 Complex xx() const {return _wf.xx();}
00197
00201 Complex yx() const {return _wf.yx();}
00202
00206 Complex zx() const {return _wf.zx();}
00207
00211 Complex tx() const {return _wf.tx();}
00212
00216 Complex xy() const {return _wf.xy();}
00217
00221 Complex yy() const {return _wf.yy();}
00222
00226 Complex zy() const {return _wf.zy();}
00227
00231 Complex ty() const {return _wf.ty();}
00232
00236 Complex xz() const {return _wf.xz();}
00237
00241 Complex yz() const {return _wf.yz();}
00242
00246 Complex zz() const {return _wf.zz();}
00247
00251 Complex tz() const {return _wf.tz();}
00252
00256 Complex xt() const {return _wf.xt();}
00257
00261 Complex yt() const {return _wf.yt();}
00262
00266 Complex zt() const {return _wf.zt();}
00267
00271 Complex tt() const {return _wf.tt();}
00273
00278
00284 void reset(unsigned int ihel,TensorPhase phase=default_tensor_phase) {
00285 calculateWaveFunction(ihel,phase);
00286 }
00288
00289 public:
00290
00294 void transform(const LorentzRotation & r) {
00295 _wf.transform(r);
00296 transformMomentum(r);
00297 }
00298
00299 public:
00300
00304 static void calculateWaveFunctions(vector<LorentzTensor<double> > & waves,
00305 tPPtr particle,Direction,bool massless,
00306 TensorPhase phase=default_tensor_phase);
00307
00311 static void calculateWaveFunctions(vector<TensorWaveFunction> & waves,
00312 tPPtr particle,Direction,bool massless,
00313 TensorPhase phase=default_tensor_phase);
00314
00318 static void calculateWaveFunctions(vector<LorentzTensor<double> > & waves,
00319 RhoDMatrix & rho,
00320 tPPtr particle,Direction,bool massless,
00321 TensorPhase phase=default_tensor_phase);
00322
00326 static void calculateWaveFunctions(vector<TensorWaveFunction> & waves,
00327 RhoDMatrix & rho,
00328 tPPtr particle,Direction,bool massless,
00329 TensorPhase phase=default_tensor_phase);
00330
00334 static void constructSpinInfo(const vector<LorentzTensor<double> > & waves,
00335 tPPtr part,Direction dir, bool time,bool massless);
00336
00340 static void constructSpinInfo(const vector<TensorWaveFunction> & waves,
00341 tPPtr part,Direction dir, bool time,bool massless);
00342
00343 private:
00344
00350 void calculateWaveFunction(unsigned int ihel,
00351 TensorPhase phase=default_tensor_phase);
00352
00353 private:
00354
00358 LorentzTensor<double> _wf;
00359
00360 };
00361 }
00362 }
00363
00364 #endif