feynlag.pheno.lorentz.reduce_projectors

feynlag.pheno.lorentz.reduce_projectors(expr, chirality, n_free_indices=0, n_momenta=2)[source]

Reduce a chiral chain to a γ₅-free trace times a scalar factor.

P_{L,R} = (1 ∓ γ₅)/2, and SymPy’s tensor engine has no γ₅ at all. The reduction used here is exact algebra up to one dropped term:

  • projectors are moved to one end with P_{L,R} γ^μ = γ^μ P_{R,L},

  • P² = P collapses repeats and P_L P_R = 0 kills mixed chains (classified upstream by classify_gamma()),

  • a single remaining projector gives Tr[X P_{L,R}] = ½ Tr[X] ∓ ½ Tr[X γ₅].

The Tr[X γ₅] term is a totally antisymmetric ε tensor. It vanishes identically for a 1→2 decay: ε needs four independent four-vectors, but a two-body final state supplies only two independent momenta (P = p₁ + p₂ is not independent), and any leftover free index is contracted with a polarization sum that is symmetric in its two indices. So the ε term is dropped — but only after checking that precondition.

Parameters:
  • expr – the γ₅-free chain (the projector is carried in chirality, not inside expr).

  • chirality – 'L', 'R' or None.

  • n_free_indices – uncontracted Lorentz indices that will meet a symmetric polarization sum.

  • n_momenta – independent momenta in the process (2 for a 1→2 decay).

Returns:

(expr, factor) — trace expr and multiply by factor.

Raises:

NotImplementedError – if the ε term is not provably zero. This is a hard guard, not a comment: a later 1→3 or 2→2 extension fails loudly here instead of silently returning a wrong number.