This class is reponsible for the computation of the spin density matrix (rho)
and decay matrix (D), in terms of the rho and D matrices of the particles
(parent, and/or siblings, and/or children) connected to the same "vertex"
(hard subprocess, or decay vertex, or splitting vertex) and the amplitude of the
"vertex" in terms of the helicities of its connected particles.
This class has also a switch that allows to turn OFF the rhoD matrix
propagation completely.
Notice that:
- there is an unique method matrixElement(...) to calculate
the matrix element, and an unique method computeRhoD(...)
to update the rhoD matrix, independently from the kind of vertex,
whether hard subprocess or decay or splitting.
Furthermore, the computation of rhoD matrix is also independent
from whether the evolution is forward or backward.
These two not evident properties are based on the fact that
in ShowerParticle we use a single rhoD matrix to store,
in different time, either the spin density matrix rho, or the decay matrix D.
This allows a very symmetric and compact writing of the various formulas.
- the codes of both matrixElement(...) and computeRhoD(...)
do not have to separate between the various vertex multiplicity cases:
for hard subprocesses: 2 -> 2 , 2 -> 3 , ... , 2 -> N
for decays or splittings: 1 -> 2 , 1 -> 3 , ... , 1 -> N
The general case of generic N >= 2 is treated directly.
This is possible by avoiding to use explicitly nested for loops
(which, of course, would require to know exactly how many of them we have
to write down) and generating instead automatically all the needed
helicity configurations. However, only in the case of splitting processes
1->N ,
you have to distinguish between the various N in the implementation
(but not in the interface) of the method evaluateAmplitudes(...),
using downcasting.