00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef ThePEG_RhoDMatrix_H
00010 #define ThePEG_RhoDMatrix_H
00011
00012
00013 #include "ThePEG/PDT/PDT.h"
00014 #include "ThePEG/Helicity/HelicityDefinitions.h"
00015 #include <cassert>
00016
00017 namespace ThePEG {
00018 namespace Helicity {
00019
00028 class RhoDMatrix {
00029
00030 public:
00031
00037 RhoDMatrix() : _spin(), _ispin() {}
00038
00043 RhoDMatrix(PDT::Spin inspin, bool average = true)
00044 : _spin(inspin), _ispin(abs(int(inspin))) {
00045 assert(_ispin <= MAXSPIN);
00046
00047 for(size_t ix=0; ix<_ispin; ++ix)
00048 for(size_t iy=0; iy<_ispin; ++iy)
00049 _matrix[ix][iy] = (average && ix==iy) ? 1./_ispin : 0.;
00050 }
00052
00053 public:
00054
00060 Complex operator() (size_t ix, size_t iy) const {
00061 assert(ix < _ispin);
00062 assert(iy < _ispin);
00063 return _matrix[ix][iy];
00064 }
00065
00069 Complex & operator() (size_t ix, size_t iy) {
00070 assert(ix < _ispin);
00071 assert(iy < _ispin);
00072 return _matrix[ix][iy];
00073 }
00074
00078 void normalize() {
00079 #ifndef NDEBUG
00080 static const double epsa=1e-30, epsb=1e-10;
00081 #endif
00082 Complex norm = 0.;
00083 for(size_t ix=0; ix<_ispin; ++ix)
00084 norm += _matrix[ix][ix];
00085 assert(norm.real() > epsa);
00086 assert(norm.imag()/norm.real() < epsb);
00087 double invnorm = 1./norm.real();
00088 for(size_t ix=0; ix<_ispin; ++ix)
00089 for(size_t iy=0; iy<_ispin; ++iy)
00090 _matrix[ix][iy]*=invnorm;
00091 }
00093
00096
00100 PDT::Spin iSpin() const { return _spin; }
00102
00106 friend ostream & operator<<(ostream & os, const RhoDMatrix & rd);
00107
00108 private:
00109
00113 PDT::Spin _spin;
00114
00118 size_t _ispin;
00119
00123 enum { MAXSPIN = 5 };
00124
00128
00129
00130 Complex _matrix[MAXSPIN][MAXSPIN];
00131
00132 };
00133
00135 inline ostream & operator<<(ostream & os, const RhoDMatrix & rd) {
00136 for (size_t ix = 0; ix < rd._ispin; ++ix) {
00137 for (size_t iy = 0; iy < rd._ispin; ++iy)
00138 os << rd._matrix[ix][iy] << " ";
00139 os << '\n';
00140 }
00141 return os;
00142 }
00143
00144
00145 }
00146 }
00147
00148 #endif