00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef ThePEG_SpinorBarWaveFunction_H
00010 #define ThePEG_SpinorBarWaveFunction_H
00011
00012
00013
00014 #include "WaveFunctionBase.h"
00015 #include <ThePEG/Helicity/LorentzSpinorBar.h>
00016 #include <ThePEG/Helicity/FermionSpinInfo.h>
00017 #include <ThePEG/EventRecord/Particle.h>
00018 #include <ThePEG/Helicity/RhoDMatrix.h>
00019
00020 namespace ThePEG {
00021
00022 namespace Helicity {
00023
00027 class SpinorWaveFunction;
00028
00057 class SpinorBarWaveFunction : public WaveFunctionBase {
00058
00059 public:
00060
00072 SpinorBarWaveFunction(const Lorentz5Momentum & p,tcPDPtr part,
00073 complex<double> s1,complex<double> s2,
00074 complex<double> s3,complex<double> s4)
00075 : WaveFunctionBase(p,part), _wf(s1,s2,s3,s4)
00076 {
00077 assert(iSpin()==2);
00078 }
00079
00080
00088 SpinorBarWaveFunction(const Lorentz5Momentum & p,tcPDPtr part,
00089 const LorentzSpinorBar<double> & wave,
00090 Direction dir=intermediate)
00091 : WaveFunctionBase(p,part,dir), _wf(wave)
00092 {
00093 assert(iSpin()==2);
00094 }
00095
00096 SpinorBarWaveFunction(const tPPtr & p,
00097 const LorentzSpinorBar<SqrtEnergy> & wave,
00098 Direction dir=intermediate)
00099 : WaveFunctionBase(p->momentum(),p->dataPtr(),dir),
00100 _wf(wave.Type())
00101 {
00102 assert(iSpin()==2);
00103 for (unsigned int i=0; i<4; ++i)
00104 _wf[i]=wave[i]*UnitRemoval::InvSqrtE;
00105 }
00106
00114 SpinorBarWaveFunction(const Lorentz5Momentum & p,tcPDPtr part,
00115 unsigned int ihel,Direction dir)
00116 : WaveFunctionBase(p,part,dir)
00117 {
00118 assert(iSpin()==2);
00119 calculateWaveFunction(ihel);
00120 }
00121
00129 SpinorBarWaveFunction(const Lorentz5Momentum & p,tcPDPtr part,
00130 Direction dir)
00131 : WaveFunctionBase(p,part,dir), _wf()
00132 {
00133 assert(iSpin()==2);
00134 }
00135
00139 SpinorBarWaveFunction()
00140 : WaveFunctionBase(), _wf()
00141 {}
00142
00146 SpinorBarWaveFunction(vector<SpinorBarWaveFunction> & wave,
00147 tPPtr part,Direction dir,bool time,bool=true) {
00148 calculateWaveFunctions(wave,part,dir);
00149 constructSpinInfo(wave,part,dir,time);
00150 }
00152
00160 complex<double> operator ()(int i) const {
00161 assert(i>=0 &&i<=3);
00162 return _wf(i);
00163 }
00164
00168 const LorentzSpinorBar<double> & wave() const {return _wf;}
00169
00171 LorentzSpinorBar<SqrtEnergy> dimensionedWave() const {
00172 return dimensionedWf();
00173 }
00174
00178 complex<double> s1() const {return _wf.s1();}
00179
00183 complex<double> s2() const {return _wf.s2();}
00184
00188 complex<double> s3() const {return _wf.s3();}
00189
00193 complex<double> s4() const {return _wf.s4();}
00194
00200 void conjugate();
00201
00205 SpinorWaveFunction bar();
00206
00215 void reset(unsigned int ihel) {
00216 calculateWaveFunction(ihel);
00217 }
00219
00220 private:
00221
00226 void calculateWaveFunction(unsigned int ihel);
00227
00228
00229 public:
00230
00234 void transform(const LorentzRotation & r) {
00235 _wf.transform(r);
00236 transformMomentum(r);
00237 }
00238
00239 public:
00240
00244 static void calculateWaveFunctions(vector<LorentzSpinorBar<SqrtEnergy> > & waves,
00245 tPPtr particle,Direction);
00246
00250 static void calculateWaveFunctions(vector<SpinorBarWaveFunction> & waves,
00251 tPPtr particle,Direction);
00252
00256 static void calculateWaveFunctions(vector<LorentzSpinorBar<SqrtEnergy> > & waves,
00257 RhoDMatrix & rho,
00258 tPPtr particle,Direction);
00259
00263 static void calculateWaveFunctions(vector<SpinorBarWaveFunction> & waves,
00264 RhoDMatrix & rho,
00265 tPPtr particle,Direction);
00266
00270 static void constructSpinInfo(const vector<LorentzSpinorBar<SqrtEnergy> > & waves,
00271 tPPtr part,Direction dir, bool time);
00272
00276 static void constructSpinInfo(const vector<SpinorBarWaveFunction> & waves,
00277 tPPtr part,Direction dir, bool time);
00278
00279 private:
00280
00284 LorentzSpinorBar<double> _wf;
00285
00287 LorentzSpinorBar<SqrtEnergy> dimensionedWf() const {
00288 LorentzSpinorBar<SqrtEnergy> temp(_wf.Type());
00289 for (unsigned int i=0; i<4; ++i)
00290 temp(i) = _wf(i)*UnitRemoval::SqrtE;
00291 return temp;
00292 }
00293 };
00294 }
00295 }
00296
00297 #endif
00298
00299
00300
00301