Canonical formalism

This is an advanced tutorial that preserves an exercises performed while investigating different formalisms. This notebook demonstrates the equivalence of the canonical formulation of the decay to the helicity formalism with LS couplings, for a single chain

using Markdown
using InteractiveUtils
using Random
Random.seed!(1212);

Implementation

using ThreeBodyDecays
using ThreeBodyDecays.Parameters
using ThreeBodyDecays.PartialWaveFunctions

The CC function calculates the Clebsch-Gordan coefficients for the given quantum numbers.

function CC(two_m12t, two_j12t, two_ls)
    two_j1, two_j2, two_j = two_j12t
    two_m1, two_m2, two_mj = two_m12t
    two_l, two_s = two_ls

    two_ms = two_m1 + two_m2
    two_ml = two_mj - two_ms

    clebschgordan_doublearg(two_j1, two_m1, two_j2, two_m2, two_s, two_ms) *
    clebschgordan_doublearg(two_l, two_ml, two_s, two_ms, two_j, two_mj)
end;

The Y_lm_doublearg function calculates the spherical harmonics for the given quantum numbers and angles.

Y_lm_doublearg(two_l, two_m, ϕ, cosθ) =
    sqrt((two_l + 1) / (4π)) * conj(wignerD_doublearg(two_l, two_m, 0, ϕ, cosθ, 0));

The A_node_canonical function calculates the amplitude for a node in the canonical formalism.

function A_node_canonical(angles, two_m12t, two_j12t, two_ls)
    two_m1, two_m2, two_mj = two_m12t
    two_ms = two_m1 + two_m2
    two_ml = two_mj - two_ms
    two_l, _ = two_ls
    @unpack ϕ, cosθ = angles

    return CC(two_m12t, two_j12t, two_ls) *
           Y_lm_doublearg(two_l, two_ml, ϕ, cosθ) *
           sqrt(4π)
end;

The A_canonical function calculates the amplitude for the entire decay chain in the canonical formalism.

function A_canonical(chain, angles, two_ms)
    @unpack Hij, HRk = chain
    two_LS = HRk.two_ls
    two_ls = Hij.two_ls
    @unpack angles_Hij, angles_HRk = angles

    @unpack k = chain
    i, j = ij_from_k(k)

    @unpack two_js = chain.tbs
    two_ji, two_jj, two_jk, two_j0 = two_js[i], two_js[j], two_js[k], two_js[4]
    two_mi, two_mj, two_mk, two_m0 = two_ms[i], two_ms[j], two_ms[k], two_ms[4]

    @unpack two_j = chain
    value = sum(-two_j:2:two_j) do two_m
        A_node_canonical(angles_HRk, (two_m, two_mk, two_m0), (two_j, two_jk, two_j0), two_LS) * A_node_canonical(
            angles_Hij,
            (two_mi, two_mj, two_m),
            (two_ji, two_jj, two_j),
            two_ls,
        )
    end

    matching = 1 / sqrt(two_j0 + 1) # ThreeBodyDecays implementation does not have sqrt(two_j0+1) factor
    return value * matching
end;

The unpolarized_intensity_canonical function calculates the unpolarized intensity for the canonical formalism.

unpolarized_intensity_canonical(chain, angles) =
    sum(itr(chain.tbs.two_js)) do two_ms
        A = A_canonical(chain, angles, two_ms)
        abs2(A)
    end;

Example

In this example, we use a decay process, 01 2 3 with spins 3/21/2 1 0, respectively. A decay chain (23)1 with jp=2- permit 8 different helicity couplings. The equivalent between formalism is checked separately for each of them.

Create a three-body system with specified masses and spins.

tbs = ThreeBodySystem(
    ThreeBodyMasses(1, 2, 3; m0 = 6.32397),
    ThreeBodySpins(1, 2, 0; two_h0 = 3),
);

Define a decay chain with LS couplings.

decay_chains = DecayChainsLS(;
    k = 1,
    Xlineshape = x -> 1.0,
    jp = jp"2-",
    Ps = ThreeBodyParities('+', '+', '+'; P0 = '+'), # need parities
    tbs,
); # give three-body-system structure

Generate a random point in the phase space.

dpp = randomPoint(tbs);
(masses = dpp.σs, spin_projections = dpp.two_λs)
(masses = (σ1 = 26.982069724086216, σ2 = 17.10850354543374, σ3 = 9.902023291380047), spin_projections = (two_h1 = 1, two_h2 = -2, two_h3 = 0, two_h0 = 1))

Define the angles for the decay. Here, there is something cool 🔥: for canonical formulation, RBR⁻¹ is applied when going to a subchannel rest frame. Hence, the θij is that is passed to Ylm is actually the sum of both polar helicity angle, θRk and θij. Going over π might be subtle.

angles = let
    cosθ_Rh = 0.7
    cosθ_ij = cos(acos(cosθ_Rh) + acos(cosθ23(dpp.σs, tbs.ms^2)))

    angles_HRk = (ϕ = 0.3, cosθ = cosθ_Rh) # ϕ is arbitrary
    angles_Hij = (ϕ = 0.5, cosθ = cosθ_ij) # ϕ is arbitrary
    (; angles_Hij, angles_HRk)
end
(angles_Hij = (ϕ = 0.5, cosθ = -0.705720611437419), angles_HRk = (ϕ = 0.3, cosθ = 0.7))

Calculate and compare the unpolarized intensities.

let
    Ic = [unpolarized_intensity_canonical(dc, angles) for dc in decay_chains]
    Ih = [unpolarized_intensity(dc, dpp.σs) for dc in decay_chains]
    Ic ./ Ih
end
2×4 Matrix{Float64}:
 1.00009  0.999837  0.999837  0.999882
 1.0001   0.999803  0.999803  0.999741

This page was generated using Literate.jl.