feynlag.vacuum.diagonalize.MajoranaRotation

class feynlag.vacuum.diagonalize.MajoranaRotation(U, nuL, nuR, nuLbar, nuRbar, chiL, chiR, chiLbar, chiRbar, n_L)[source]

Rotate weak-basis neutrinos to physical Majorana mass eigenstates.

Given the Takagi factor U of a seesaw mass matrix (M_ν = U D Uᵀ, from diagonalize_takagi() on seesaw_mass_matrix()) in the left-handed basis n = (ν_L, ν_R^c), the N physical Majorana fields χ_k (χ_k = χ_k^c) satisfy n = U^* χ. Because χ is self-conjugate, (P_L χ)^c = P_R χ, so the weak Weyl fields substitute as

ν_L[g] → Σ_k U*[g, k] χ_L[k] ν̄_L[g] → Σ_k U[g, k] χ̄_L[k] ν_R[g] → Σ_k U[n_L+g, k] χ_R[k] ν̄_R[g] → Σ_k U*[n_L+g, k] χ̄_R[k]

(rows 0 … n_L−1 of U are the ν_L generations, rows n_L … the ν_R generations). The convention is pinned in tests/test_seesaw.py: substituting these into the SM charged current gives W ℓ̄ χ_k = (g/√2)·U*[g,k] — for the heavy states the light–heavy mixing ≈ m_D M_R⁻¹, and → 0 as M_R → ∞ (decoupling).

Parameters:
  • U – the N×N Takagi matrix (a concrete/analytic Matrix — not a symbolic IndexedBase, whose U[i,k] would collide with the field leg in expand_bilinear()).

  • nuL – the weak ν_L / ν_R component IndexedBases.

  • nuR – the weak ν_L / ν_R component IndexedBases.

  • nuLbar – their Dirac-adjoint IndexedBases.

  • nuRbar – their Dirac-adjoint IndexedBases.

  • chiL – the physical Majorana IndexedBases (χ_L[k] = P_L χ_k etc.).

  • chiR – the physical Majorana IndexedBases (χ_L[k] = P_L χ_k etc.).

  • chiLbar – the physical Majorana IndexedBases (χ_L[k] = P_L χ_k etc.).

  • chiRbar – the physical Majorana IndexedBases (χ_L[k] = P_L χ_k etc.).

  • n_L – number of left-handed neutrinos (the ν_R row offset).

__init__(U, nuL, nuR, nuLbar, nuRbar, chiL, chiR, chiLbar, chiRbar, n_L)[source]

Methods

__init__(U, nuL, nuR, nuLbar, nuRbar, chiL, ...)

apply(expr, gen_indices, n_gen)

Rewrite expr in the physical basis.