OpenLoops is hosted by Hepforge, IPPP Durham

## Colour basis for tree-level amplitudes

Besides calculating squared matrix elements, OpenLoops also provides tree-level amplitudes with full colour information. This section describes how to retrieve the colour basis used for a process and the amplitude as a vector in the colour space which is spanned by these basis elements.

#### The colour basis

The colour basis elements are encoded as integer arrays and must be retrieved once for each process. First one must get the following information.
`ncolb`: the number of basis elements,
`colelemsz`: the size of the longest basis element,
`nheltot`: the total number of helicity configurations (including vanishing configurations).

In Fortran

subroutine tree_colbasis_dim(id, ncolb, colelemsz, nheltot)
integer, intent(in) :: id
integer, intent(out) :: ncolb, colelemsz, nheltot

In C

void ol_tree_colbasis_dim(int id, int* ncolb, int* colelemsz, int* nheltot);

In the next step the actual basis is retrieved.

In Fortran

subroutine tree_colbasis(id, basis, needed)
integer, intent(in) :: id
integer, intent(out) :: basis(colelemsz,ncolb), needed(ncolb,ncolb)

In C

// int basis[ncolb][colelemsz], needed[ncolb][ncolb];
void ol_tree_colbasis(int id, int* basis, int* needed);

Here, `basis(:,i)` rsp. `basis[i]` is an integer array of length `colelemsz` which encodes the i-th colour basis element (in C, i starts from zero). Each basis element is a product of chains of fundamental SU(N) generators `Ta` and traces thereof. These objects are represented as sequences of colour indices, where the number of the corresponding external particle (starting with 1) is used as colour index, e.g.

```   (Ta1Ta2Ta3)ij → {a1,a2,a3,i,j}   Tr(Ta1Ta2Ta3) → {a1,a2,a3} ```

This means that in order to know if a sequence corresponds to a chain or a trace one needs to know which kind of colour charge the external particles carry. E.g. {a1,a2,a3} is a trace if the particles at positions a2 and a3 are gluons and it is a chain if they are a quark and an anti-quark.

Different chains/traces are separated by a zero and the array is padded with zeroes if it is longer than required for the considered basis element.

#### The amplitude

The amplitude of a process for a given phase space point can be calculated by

In Fortran

subroutine evaluate_tree_colvect(id, psp, amp, nhel)
integer, intent(in) :: id
real(DREALKIND), intent(in) :: psp(0:3,n_ext)
complex(DREALKIND), intent(out) :: amp(ncolb,nheltot)
integer, intent(out) :: nhel

`amp(:,h) for h=1..nhel` is an array of `ncolb` complex numbers such that the element `amp(i,h)` corresponds to the colour basis element `basis(:,i)`.

In C

// double amp[nheltot][2*ncolb];
void ol_evaluate_tree_colvect(int id, double* pp, double* amp, int* nhel);

`amp[h] for h=0..nhel-1` is an array of `2*ncolb` real numbers such that the elements `amp[h][2*i]` and `amp[h][2*i+1]` are the real and imaginary parts of the amplitude which corresponds to the colour basis element `basis[i]`.

The conventions to pass the process id and the phase space point are the same as in the interface for squared matrix elements (see Fortran, C). `nhel` is the number of non-vanishing helicity configurations in the amplitude.