00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef ThePEG_VectorWaveFunction_H
00010 #define ThePEG_VectorWaveFunction_H
00011
00012
00013
00014 #include "WaveFunctionBase.h"
00015 #include <ThePEG/Helicity/LorentzPolarizationVector.h>
00016 #include <ThePEG/Helicity/VectorSpinInfo.h>
00017 #include <ThePEG/Helicity/RhoDMatrix.h>
00018 #include <ThePEG/EventRecord/Particle.h>
00019
00020 namespace ThePEG {
00021 namespace Helicity {
00022
00027 enum VectorPhase {
00028 vector_phase,
00029 vector_nophase,
00030 default_vector_phase=vector_nophase
00031 };
00032
00060 class VectorWaveFunction : public WaveFunctionBase {
00061
00062 public:
00063
00074 VectorWaveFunction(const Lorentz5Momentum & p,tcPDPtr part,
00075 const LorentzPolarizationVector & wave,
00076 Direction dir=intermediate)
00077 : WaveFunctionBase(p,part,dir), _wf(wave)
00078 {
00079 assert(iSpin()==3);
00080 }
00081
00091 VectorWaveFunction(const Lorentz5Momentum & p,tcPDPtr part,const Complex & x,
00092 const Complex & y,const Complex & z, const Complex & t)
00093 : WaveFunctionBase(p,part), _wf(x,y,z,t)
00094 {
00095 assert(iSpin()==3);
00096 }
00097
00107 VectorWaveFunction(const Lorentz5Momentum & p,tcPDPtr part,
00108 unsigned int ihel,Direction dir,
00109 VectorPhase phase=default_vector_phase)
00110 : WaveFunctionBase(p,part,dir)
00111 {
00112 assert(iSpin()==3);
00113 calculateWaveFunction(ihel,phase);
00114 }
00115
00122 VectorWaveFunction(const Lorentz5Momentum &p,
00123 tcPDPtr part,Direction dir)
00124 : WaveFunctionBase(p,part,dir), _wf()
00125 {
00126 assert(iSpin()==3);
00127 }
00128
00132 VectorWaveFunction() {}
00133
00137 VectorWaveFunction(vector<VectorWaveFunction> & wave,
00138 tPPtr part,Direction dir,bool time,bool massless,
00139 bool=true,
00140 VectorPhase phase=default_vector_phase) {
00141 calculateWaveFunctions(wave,part,dir,massless,phase);
00142 constructSpinInfo(wave,part,dir,time,massless);
00143 }
00145
00153 const LorentzPolarizationVector & wave() const { return _wf;}
00154
00158 Complex x() const {return _wf.x();}
00159
00163 Complex y() const {return _wf.y();}
00164
00168 Complex z() const {return _wf.z();}
00169
00173 Complex t() const {return _wf.t();}
00174
00184 void reset(unsigned int ihel,VectorPhase phase=default_vector_phase) {
00185 calculateWaveFunction(ihel,phase);
00186 }
00188
00189 public:
00190
00194 void transform(const LorentzRotation & r) {
00195 _wf.transform(r);
00196 transformMomentum(r);
00197 }
00198
00199 public:
00200
00204 static void calculateWaveFunctions(vector<LorentzPolarizationVector> & waves,
00205 tPPtr particle,Direction,bool massless,
00206 VectorPhase phase=default_vector_phase);
00207
00211 static void calculateWaveFunctions(vector<VectorWaveFunction> & waves,
00212 tPPtr particle,Direction,bool massless,
00213 VectorPhase phase=default_vector_phase);
00214
00218 static void calculateWaveFunctions(vector<LorentzPolarizationVector> & waves,
00219 RhoDMatrix & rho,
00220 tPPtr particle,Direction,bool massless,
00221 VectorPhase phase=default_vector_phase);
00222
00226 static void calculateWaveFunctions(vector<VectorWaveFunction> & waves,
00227 RhoDMatrix & rho,
00228 tPPtr particle,Direction,bool massless,
00229 VectorPhase phase=default_vector_phase);
00230
00234 static void constructSpinInfo(const vector<LorentzPolarizationVector> & waves,
00235 tPPtr part,Direction dir, bool time,bool massless);
00236
00240 static void constructSpinInfo(const vector<VectorWaveFunction> & waves,
00241 tPPtr part,Direction dir, bool time,bool massless);
00242
00243 private:
00244
00250 void calculateWaveFunction(unsigned int ihel,
00251 VectorPhase phase=default_vector_phase);
00252
00253 private:
00254
00258 LorentzPolarizationVector _wf;
00259
00260 };
00261
00262 }
00263 }
00264
00265 #endif