feynlag.pheno.kinematics.TwoToTwoKinematics

class feynlag.pheno.kinematics.TwoToTwoKinematics(m1, m2, m3, m4, names=('k1', 'k2', 'k3', 'k4'))[source]

On-shell kinematics of 1(k₁) + 2(k₂) → 3(k₃) + 4(k₄).

Parametrised by the Mandelstam invariants s = (k₁+k₂)² = (k₃+k₄)² and t = (k₁−k₃)² = (k₂−k₄)² (the third, u = (k₁−k₄)² = (k₂−k₃)², is fixed by s+t+u = m₁²+m₂²+m₃²+m₄² and is a derived property here, not a free symbol — momentum conservation then holds by construction rather than by assertion).

s and t are kept as the primary symbols rather than (s, cosθ): the dot table below is linear in s, t, u with no radicals, while a cosθ parametrization would drag √λ_i√λ_f into every table entry and hence into every Dirac trace — the same reason ThreeBodyKinematics confines its radicals to s12_bounds(). t is negative throughout the physical region, so it is declared real=True, not positive=True.

k₄ is not an independent momentum (k₄ = k₁+k₂−k₃), but it is still given its own momentum() head rather than being rewritten inline: momentum conservation then becomes a testable invariant of the dot table instead of expression-level algebra that would interact badly with TensAdd expansion inside dirac_trace().

Names default to k1..k4 — deliberately distinct from the p1, p2, p3 defaults of TwoBodyKinematics/ThreeBodyKinematics, since momentum() caches heads globally by name and dot() dispatches on that name: a foreign p1 head leaking into a 2→2 expression must raise a loud KeyError, never silently answer with the wrong table.

Parameters:
__init__(m1, m2, m3, m4, names=('k1', 'k2', 'k3', 'k4'))
Parameters:
Return type:

None

Methods

__init__(m1, m2, m3, m4[, names])

allowed()

Whether the final state 3+4 is open at this √s (None if undecidable symbolically).

cos_theta()

The CM scattering angle implied by this object's t.

dot(head_a, head_b)

k_a·k_b for two momentum heads.

dsigma_dcos_factor()

√λ_final/(32π s √λ_initial) — multiply by the spin/colour- summed |M|² to get dσ/dcosθ.

dsigma_dt_factor()

1/(16π λ_initial) — multiply by the spin/colour-summed |M|² to get dσ/dt.

flux_factor()

1/(2√λ(s,m₁²,m₂²)) — from the flux identity 4E₁E₂|v₁−v₂| = 4√s·p_i = 2√λ_i.

lambda_final()

λ(s, m₃², m₄²) — the final-state Källén function.

lambda_initial()

λ(s, m₁², m₂²) — the initial-state Källén function.

p_cm_final()

CM three-momentum magnitude of either final particle.

p_cm_initial()

CM three-momentum magnitude of either initial particle.

t_bounds()

(t_min, t_max) at fixed s — the cosθ = ∓1 endpoints.

t_of_cos(c)

t at a given cosθ = c, fixed s — inverse of cos_theta().

Attributes

k1

k2

k3

k4

names

s

t

u

u = m₁²+m₂²+m₃²+m₄² − s − t — derived, never a free symbol.

m1

m2

m3

m4