[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
4.15.1.1 Dirac gamma matrices
Dirac gamma matrices (note that GiNaC doesn't treat them as matrices) are designated as ‘gamma~mu’ and satisfy ‘gamma~mu*gamma~nu + gamma~nu*gamma~mu = 2*eta~mu~nu’ where ‘eta~mu~nu’ is the Minkowski metric tensor. Dirac gammas are constructed by the function
ex dirac_gamma(const ex & mu, unsigned char rl = 0); |
which takes two arguments: the index and a representation label in the range 0 to 255 which is used to distinguish elements of different Clifford algebras (this is also called a spin line index). Gammas with different labels commutate with each other. The dimension of the index can be 4 or (in the framework of dimensional regularization) any symbolic value. Spinor indices on Dirac gammas are not supported in GiNaC.
The unity element of a Clifford algebra is constructed by
ex dirac_ONE(unsigned char rl = 0); |
Please notice: You must always use dirac_ONE()
when referring to
multiples of the unity element, even though it's customary to omit it.
E.g. instead of dirac_gamma(mu)*(dirac_slash(q,4)+m)
you have to
write dirac_gamma(mu)*(dirac_slash(q,4)+m*dirac_ONE())
. Otherwise,
GiNaC will complain and/or produce incorrect results.
There is a special element ‘gamma5’ that commutates with all other gammas, has a unit square, and in 4 dimensions equals ‘gamma~0 gamma~1 gamma~2 gamma~3’, provided by
ex dirac_gamma5(unsigned char rl = 0); |
The chiral projectors ‘(1+/-gamma5)/2’ are also available as proper objects, constructed by
ex dirac_gammaL(unsigned char rl = 0); ex dirac_gammaR(unsigned char rl = 0); |
They observe the relations ‘gammaL^2 = gammaL’, ‘gammaR^2 = gammaR’, and ‘gammaL gammaR = gammaR gammaL = 0’.
Finally, the function
ex dirac_slash(const ex & e, const ex & dim, unsigned char rl = 0); |
creates a term that represents a contraction of ‘e’ with the Dirac
Lorentz vector (it behaves like a term of the form ‘e.mu gamma~mu’
with a unique index whose dimension is given by the dim
argument).
Such slashed expressions are printed with a trailing backslash, e.g. ‘e\’.
In products of dirac gammas, superfluous unity elements are automatically removed, squares are replaced by their values, and ‘gamma5’, ‘gammaL’ and ‘gammaR’ are moved to the front.
The simplify_indexed()
function performs contractions in gamma strings,
for example
{ ... symbol a("a"), b("b"), D("D"); varidx mu(symbol("mu"), D); ex e = dirac_gamma(mu) * dirac_slash(a, D) * dirac_gamma(mu.toggle_variance()); cout << e << endl; // -> gamma~mu*a\*gamma.mu e = e.simplify_indexed(); cout << e << endl; // -> -D*a\+2*a\ cout << e.subs(D == 4) << endl; // -> -2*a\ ... } |
To calculate the trace of an expression containing strings of Dirac gammas you use one of the functions
ex dirac_trace(const ex & e, const std::set<unsigned char> & rls, const ex & trONE = 4); ex dirac_trace(const ex & e, const lst & rll, const ex & trONE = 4); ex dirac_trace(const ex & e, unsigned char rl = 0, const ex & trONE = 4); |
These functions take the trace over all gammas in the specified set rls
or list rll
of representation labels, or the single label rl
;
gammas with other labels are left standing. The last argument to
dirac_trace()
is the value to be returned for the trace of the unity
element, which defaults to 4.
The dirac_trace()
function is a linear functional that is equal to the
ordinary matrix trace only in D = 4 dimensions. In particular, the
functional is not cyclic in
D != 4
dimensions when acting on
expressions containing ‘gamma5’, so it's not a proper trace. This
‘gamma5’ scheme is described in greater detail in the article
The Role of gamma5 in Dimensional Regularization (Bibliography).
The value of the trace itself is also usually different in 4 and in D != 4 dimensions:
{ // 4 dimensions varidx mu(symbol("mu"), 4), nu(symbol("nu"), 4), rho(symbol("rho"), 4); ex e = dirac_gamma(mu) * dirac_gamma(nu) * dirac_gamma(mu.toggle_variance()) * dirac_gamma(rho); cout << dirac_trace(e).simplify_indexed() << endl; // -> -8*eta~rho~nu } ... { // D dimensions symbol D("D"); varidx mu(symbol("mu"), D), nu(symbol("nu"), D), rho(symbol("rho"), D); ex e = dirac_gamma(mu) * dirac_gamma(nu) * dirac_gamma(mu.toggle_variance()) * dirac_gamma(rho); cout << dirac_trace(e).simplify_indexed() << endl; // -> 8*eta~rho~nu-4*eta~rho~nu*D } |
Here is an example for using dirac_trace()
to compute a value that
appears in the calculation of the one-loop vacuum polarization amplitude in
QED:
{ symbol q("q"), l("l"), m("m"), ldotq("ldotq"), D("D"); varidx mu(symbol("mu"), D), nu(symbol("nu"), D); scalar_products sp; sp.add(l, l, pow(l, 2)); sp.add(l, q, ldotq); ex e = dirac_gamma(mu) * (dirac_slash(l, D) + dirac_slash(q, D) + m * dirac_ONE()) * dirac_gamma(mu.toggle_variance()) * (dirac_slash(l, D) + m * dirac_ONE()); e = dirac_trace(e).simplify_indexed(sp); e = e.collect(lst(l, ldotq, m)); cout << e << endl; // -> (8-4*D)*l^2+(8-4*D)*ldotq+4*D*m^2 } |
The canonicalize_clifford()
function reorders all gamma products that
appear in an expression to a canonical (but not necessarily simple) form.
You can use this to compare two expressions or for further simplifications:
{ varidx mu(symbol("mu"), 4), nu(symbol("nu"), 4); ex e = dirac_gamma(mu) * dirac_gamma(nu) + dirac_gamma(nu) * dirac_gamma(mu); cout << e << endl; // -> gamma~mu*gamma~nu+gamma~nu*gamma~mu e = canonicalize_clifford(e); cout << e << endl; // -> 2*ONE*eta~mu~nu } |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |