File indexing completed on 2026-08-06 09:38:21
0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef ThePEG_RhoDMatrix_H
0010 #define ThePEG_RhoDMatrix_H
0011
0012
0013 #include "ThePEG/PDT/PDT.h"
0014 #include "ThePEG/Helicity/HelicityDefinitions.h"
0015 #include <cassert>
0016 #include <array>
0017
0018 namespace ThePEG {
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028 class RhoDMatrix {
0029
0030 public:
0031
0032
0033
0034
0035
0036
0037 RhoDMatrix() = default;
0038
0039
0040
0041
0042
0043 RhoDMatrix(PDT::Spin inspin, bool average = true)
0044 : _spin(inspin), _ispin(abs(int(inspin))) {
0045 assert(_ispin <= MAXSPIN);
0046
0047 if ( average )
0048 for(size_t ix=0; ix<_ispin; ++ix)
0049 _matrix[ix][ix] = 1./_ispin;
0050 }
0051
0052
0053 public:
0054
0055
0056
0057
0058
0059
0060 Complex operator() (size_t ix, size_t iy) const {
0061 assert(ix < _ispin);
0062 assert(iy < _ispin);
0063 return _matrix[ix][iy];
0064 }
0065
0066
0067
0068
0069 Complex & operator() (size_t ix, size_t iy) {
0070 assert(ix < _ispin);
0071 assert(iy < _ispin);
0072 return _matrix[ix][iy];
0073 }
0074
0075
0076
0077
0078 void normalize() {
0079 #ifndef NDEBUG
0080 static const double epsa=1e-40, epsb=1e-10;
0081 #endif
0082 Complex norm = 0.;
0083 for(size_t ix=0; ix<_ispin; ++ix)
0084 norm += _matrix[ix][ix];
0085 assert(norm.real() > epsa);
0086 assert(norm.imag()/norm.real() < epsb);
0087 double invnorm = 1./norm.real();
0088 for(size_t ix=0; ix<_ispin; ++ix)
0089 for(size_t iy=0; iy<_ispin; ++iy)
0090 _matrix[ix][iy]*=invnorm;
0091 }
0092
0093
0094
0095
0096
0097 void reset(bool average = true) {
0098 for(size_t ix=0; ix<_ispin; ++ix)
0099 for(size_t iy=0; iy<_ispin; ++iy)
0100 _matrix[ix][iy]=0.;
0101 if ( average )
0102 for(size_t ix=0; ix<_ispin; ++ix)
0103 _matrix[ix][ix] = 1./_ispin;
0104 }
0105
0106
0107
0108
0109
0110
0111
0112 PDT::Spin iSpin() const { return _spin; }
0113
0114
0115
0116
0117
0118 friend ostream & operator<<(ostream & os, const RhoDMatrix & rd);
0119
0120 private:
0121
0122
0123
0124
0125 PDT::Spin _spin;
0126
0127
0128
0129
0130 size_t _ispin;
0131
0132
0133
0134
0135 enum { MAXSPIN = 7 };
0136
0137
0138
0139
0140
0141
0142 std::array<std::array<Complex,MAXSPIN>,MAXSPIN> _matrix;
0143
0144 };
0145
0146
0147 inline ostream & operator<<(ostream & os, const RhoDMatrix & rd) {
0148 for (size_t ix = 0; ix < rd._ispin; ++ix) {
0149 for (size_t iy = 0; iy < rd._ispin; ++iy)
0150 os << rd._matrix[ix][iy] << " ";
0151 os << '\n';
0152 }
0153 return os;
0154 }
0155
0156 }
0157
0158 #endif