manpagez: man pages & more
info ginac
Home | html | info | man
[ < ] [ > ]   [ << ] [ 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] [ ? ]
© manpagez.com 2000-2024
Individual documents may contain additional copyright information.