00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef ThePEG_epsilon_H
00010 #define ThePEG_epsilon_H
00011
00012
00013
00014 #include "ThePEG/Vectors/LorentzVector.h"
00015
00016 namespace ThePEG {
00017 namespace Helicity {
00018
00039 template <typename A, typename B, typename C>
00040 inline LorentzVector<typename BinaryOpTraits<
00041 typename BinaryOpTraits<A,B>::MulT, C>::MulT>
00042 epsilon(const LorentzVector<A> & a,
00043 const LorentzVector<B> & b,
00044 const LorentzVector<C> & c) {
00045 typedef typename BinaryOpTraits<A,B>::MulT ABType;
00046 typedef typename BinaryOpTraits<ABType, C>::MulT ABCType;
00047 typedef LorentzVector<ABCType> ResultType;
00048
00049 ABType diffxy = a.x() * b.y() - a.y() * b.x();
00050 ABType diffxz = a.x() * b.z() - a.z() * b.x();
00051 ABType diffxt = a.x() * b.t() - a.t() * b.x();
00052 ABType diffyz = a.y() * b.z() - a.z() * b.y();
00053 ABType diffyt = a.y() * b.t() - a.t() * b.y();
00054 ABType diffzt = a.z() * b.t() - a.t() * b.z();
00055
00056 ResultType result;
00057 result.setX( c.z() * diffyt - c.t() * diffyz - c.y() * diffzt);
00058 result.setY( c.t() * diffxz - c.z() * diffxt + c.x() * diffzt);
00059 result.setZ(-c.t() * diffxy + c.y() * diffxt - c.x() * diffyt);
00060 result.setT(-c.z() * diffxy + c.y() * diffxz - c.x() * diffyz);
00061
00062 return result;
00063 }
00064
00065
00066 }
00067 }
00068
00069 #endif