File indexing completed on 2026-08-06 09:38:24
0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef ThePEG_epsilon_H
0010 #define ThePEG_epsilon_H
0011
0012
0013
0014 #include "ThePEG/Vectors/LorentzVector.h"
0015 #include "LorentzTensor.h"
0016
0017 namespace ThePEG {
0018 namespace Helicity {
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041 template <typename A, typename B, typename C, typename D>
0042 auto epsilon(const LorentzVector<A> & a,
0043 const LorentzVector<B> & b,
0044 const LorentzVector<C> & c,
0045 const LorentzVector<D> & d)
0046 -> decltype(a.x()*b.y()*c.z()*d.t())
0047 {
0048 auto diffxy = a.x() * b.y() - a.y() * b.x();
0049 auto diffxz = a.x() * b.z() - a.z() * b.x();
0050 auto diffxt = a.x() * b.t() - a.t() * b.x();
0051 auto diffyz = a.y() * b.z() - a.z() * b.y();
0052 auto diffyt = a.y() * b.t() - a.t() * b.y();
0053 auto diffzt = a.z() * b.t() - a.t() * b.z();
0054
0055 auto diff2xy = c.x() * d.y() - c.y() * d.x();
0056 auto diff2xz = c.x() * d.z() - c.z() * d.x();
0057 auto diff2xt = c.x() * d.t() - c.t() * d.x();
0058 auto diff2yz = c.y() * d.z() - c.z() * d.y();
0059 auto diff2yt = c.y() * d.t() - c.t() * d.y();
0060 auto diff2zt = c.z() * d.t() - c.t() * d.z();
0061
0062 return
0063 diff2yz*diffxt + diff2zt*diffxy - diff2yt*diffxz -
0064 diff2xz*diffyt + diff2xt*diffyz + diff2xy*diffzt;
0065 }
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076 template <typename A, typename B, typename C>
0077 auto epsilon(const LorentzVector<A> & a,
0078 const LorentzVector<B> & b,
0079 const LorentzVector<C> & c)
0080 -> LorentzVector<decltype(a.x()*b.y()*c.z())>
0081 {
0082 auto diffxy = a.x() * b.y() - a.y() * b.x();
0083 auto diffxz = a.x() * b.z() - a.z() * b.x();
0084 auto diffxt = a.x() * b.t() - a.t() * b.x();
0085 auto diffyz = a.y() * b.z() - a.z() * b.y();
0086 auto diffyt = a.y() * b.t() - a.t() * b.y();
0087 auto diffzt = a.z() * b.t() - a.t() * b.z();
0088
0089 using ResultType = LorentzVector<decltype(a.x()*b.x()*c.x())>;
0090 ResultType result;
0091 result.setX( c.z() * diffyt - c.t() * diffyz - c.y() * diffzt);
0092 result.setY( c.t() * diffxz - c.z() * diffxt + c.x() * diffzt);
0093 result.setZ(-c.t() * diffxy + c.y() * diffxt - c.x() * diffyt);
0094 result.setT(-c.z() * diffxy + c.y() * diffxz - c.x() * diffyz);
0095
0096 return result;
0097 }
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107 template <typename A, typename B>
0108 auto epsilon(const LorentzVector<complex<A> > & a,
0109 const LorentzVector<complex<B> > & b)
0110 -> LorentzTensor<decltype(a.x().real()*b.y().real())>
0111 {
0112 auto diffxy = a.x() * b.y() - a.y() * b.x();
0113 auto diffxz = a.x() * b.z() - a.z() * b.x();
0114 auto diffxt = a.x() * b.t() - a.t() * b.x();
0115 auto diffyz = a.y() * b.z() - a.z() * b.y();
0116 auto diffyt = a.y() * b.t() - a.t() * b.y();
0117 auto diffzt = a.z() * b.t() - a.t() * b.z();
0118 complex<decltype(a.x().real()*b.x().real())> zero(ZERO);
0119
0120 using ResultType = LorentzTensor<decltype(a.x().real()*b.x().real())>;
0121 ResultType result;
0122 result.setTT( zero ); result.setTX( diffyz); result.setTY(-diffxz); result.setTZ( diffxy);
0123 result.setXT(-diffyz); result.setXX( zero ); result.setXY( diffzt); result.setXZ(-diffyt);
0124 result.setYT( diffxz); result.setYX(-diffzt); result.setYY( zero ); result.setYZ( diffxt);
0125 result.setZT(-diffxy); result.setZX( diffyt); result.setZY(-diffxt); result.setZZ( zero );
0126
0127 return result;
0128 }
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138 template <typename A, typename B>
0139 auto epsilon(const LorentzVector<A> & a,
0140 const LorentzVector<complex<B> > & b)
0141 -> LorentzTensor<decltype(a.x()*b.y().real())>
0142 {
0143 auto diffxy = a.x() * b.y() - a.y() * b.x();
0144 auto diffxz = a.x() * b.z() - a.z() * b.x();
0145 auto diffxt = a.x() * b.t() - a.t() * b.x();
0146 auto diffyz = a.y() * b.z() - a.z() * b.y();
0147 auto diffyt = a.y() * b.t() - a.t() * b.y();
0148 auto diffzt = a.z() * b.t() - a.t() * b.z();
0149 complex<decltype(a.x()*b.x().real())> zero(ZERO);
0150
0151 using ResultType = LorentzTensor<decltype(a.x()*b.x().real())>;
0152 ResultType result;
0153 result.setTT( zero ); result.setTX( diffyz); result.setTY(-diffxz); result.setTZ( diffxy);
0154 result.setXT(-diffyz); result.setXX( zero ); result.setXY( diffzt); result.setXZ(-diffyt);
0155 result.setYT( diffxz); result.setYX(-diffzt); result.setYY( zero ); result.setYZ( diffxt);
0156 result.setZT(-diffxy); result.setZX( diffyt); result.setZY(-diffxt); result.setZZ( zero );
0157
0158 return result;
0159 }
0160
0161
0162
0163
0164
0165
0166
0167
0168
0169 template <typename A, typename B>
0170 auto epsilon(const LorentzVector<complex<A> > & a,
0171 const LorentzVector<B> & b)
0172 -> LorentzTensor<decltype(a.x().real()*b.y())>
0173 {
0174 auto diffxy = a.x() * b.y() - a.y() * b.x();
0175 auto diffxz = a.x() * b.z() - a.z() * b.x();
0176 auto diffxt = a.x() * b.t() - a.t() * b.x();
0177 auto diffyz = a.y() * b.z() - a.z() * b.y();
0178 auto diffyt = a.y() * b.t() - a.t() * b.y();
0179 auto diffzt = a.z() * b.t() - a.t() * b.z();
0180 complex<decltype(a.x().real()*b.x())> zero(ZERO);
0181
0182 using ResultType = LorentzTensor<decltype(a.x().real()*b.x())>;
0183 ResultType result;
0184 result.setTT( zero ); result.setTX( diffyz); result.setTY(-diffxz); result.setTZ( diffxy);
0185 result.setXT(-diffyz); result.setXX( zero ); result.setXY( diffzt); result.setXZ(-diffyt);
0186 result.setYT( diffxz); result.setYX(-diffzt); result.setYY( zero ); result.setYZ( diffxt);
0187 result.setZT(-diffxy); result.setZX( diffyt); result.setZY(-diffxt); result.setZZ( zero );
0188
0189 return result;
0190 }
0191
0192
0193
0194
0195
0196
0197
0198
0199
0200 template <typename A, typename B>
0201 auto epsilon(const LorentzVector<A> & a,
0202 const LorentzVector<B> & b)
0203 -> LorentzTensor<decltype(a.x()*b.y())>
0204 {
0205 auto diffxy = a.x() * b.y() - a.y() * b.x();
0206 auto diffxz = a.x() * b.z() - a.z() * b.x();
0207 auto diffxt = a.x() * b.t() - a.t() * b.x();
0208 auto diffyz = a.y() * b.z() - a.z() * b.y();
0209 auto diffyt = a.y() * b.t() - a.t() * b.y();
0210 auto diffzt = a.z() * b.t() - a.t() * b.z();
0211 complex<decltype(a.x()*b.x())> zero(ZERO);
0212
0213 using ResultType = LorentzTensor<decltype(a.x()*b.x())>;
0214 ResultType result;
0215 result.setTT( zero ); result.setTX( diffyz); result.setTY(-diffxz); result.setTZ( diffxy);
0216 result.setXT(-diffyz); result.setXX( zero ); result.setXY( diffzt); result.setXZ(-diffyt);
0217 result.setYT( diffxz); result.setYX(-diffzt); result.setYY( zero ); result.setYZ( diffxt);
0218 result.setZT(-diffxy); result.setZX( diffyt); result.setZY(-diffxt); result.setZZ( zero );
0219
0220 return result;
0221 }
0222
0223
0224 }
0225 }
0226
0227 #endif