Tutorial
This tutorial guides the user through the basic example of building a model for a cascade decay of a particle into three particles. The chosen example is the decay of Λb ⟶ Jψ p K, where the pentaquarks candidates has been seen for the first time in 2015. The tutorial shows how to build a decay chain object, and how to calculate the amplitude, the matrix element of the transition.
using ThreeBodyDecays # import the module
using Plots
using QuadGKtheme(
    :wong,
    frame = :box,
    lab = "",
    minorticks = true,
    guidefontvalign = :top,
    guidefonthalign = :right,
    xlim = (:auto, :auto),
    ylim = (:auto, :auto),
    grid = false,
)decay Λb ⟶ Jψ p K
constants = Dict("mJψ" => 3.09, "mp" => 0.938, "mK" => 0.49367, "mLb" => 5.62);  # masses of the particlesDict{String, Float64} with 4 entries:
  "mp"  => 0.938
  "mLb" => 5.62
  "mK"  => 0.49367
  "mJψ" => 3.09ThreeBodySystem creates an immutable structure that describes the setup. Two work with particles with non-integer spin, the doubled quantum numbers are stored.
ms = ThreeBodyMasses(   # masses m1,m2,m3,m0
    constants["mJψ"],
    constants["mp"],
    constants["mK"];
    m0 = constants["mLb"],
);create two-body system
tbs = ThreeBodySystem(; ms, two_js = ThreeBodySpins(2, 1, 0; two_h0 = 1));  # twice spin
Conserving = ThreeBodyParities('-', '+', '-'; P0 = '+');
Violating = ThreeBodyParities('-', '+', '-'; P0 = '-');- the invariant variables, 
σs = [σ₁,σ₂,σ₃], - helicities 
two_λs = [λ₁,λ₂,λ₃,λ₀] - and complex couplings 
cs = [c₁,c₂,...] 
Decay chains
The following code creates six possible decay channels.
The lineshape of the intermediate resonances is specified by the second argument. It is a simple Breit-Wigner function in this example.
struct BW
    m::Float64
    Γ::Float64
end
(bw::BW)(σ::Number) = 1 / (bw.m^2 - σ - 1im * bw.m * bw.Γ);chains-1, i.e. (2+3): Λs with the lowest ls, LS
Λ1520 = DecayChainLS(
    k = 1,
    Xlineshape = BW(1.5195, 0.0156),
    jp = jp"3/2+",
    Ps = Conserving,
    tbs = tbs,
);
Λ1690 = DecayChainLS(
    k = 1,
    Xlineshape = BW(1.685, 0.050),
    jp = jp"1/2+",
    Ps = Conserving,
    tbs = tbs,
);
Λ1810 = DecayChainLS(
    k = 1,
    Xlineshape = BW(1.80, 0.090),
    jp = jp"5/2+",
    Ps = Conserving,
    tbs = tbs,
);
Λs = (Λ1520, Λ1690, Λ1810);chains-3, i.e. (1+2): Pentaquarks with the lowest ls, LS
Pc4312 = DecayChainLS(;
    k = 3,
    Xlineshape = BW(4.312, 0.015),
    jp = jp"1/2+",
    Ps = Conserving,
    tbs = tbs,
);
Pc4440 = DecayChainLS(;
    k = 3,
    Xlineshape = BW(4.440, 0.010),
    jp = jp"1/2+",
    Ps = Conserving,
    tbs = tbs,
);
Pc4457 = DecayChainLS(;
    k = 3,
    Xlineshape = BW(4.457, 0.020),
    jp = jp"3/2+",
    Ps = Conserving,
    tbs = tbs,
);
Pcs = (Pc4312, Pc4440, Pc4457);Unpolarized intensity
The full model is the vector of decay chains, and couplings for each decay chain.
const model = ThreeBodyDecay(
    ["Λ1520", "Λ1690", "Λ1810", "Pc4312", "Pc4440", "Pc4457"] .=> zip(
        [2, 2.1, 1.4im, 0.4, 0.3im, -0.8im],
        [Λ1520, Λ1690, Λ1810, Pc4312, Pc4440, Pc4457],
    ),
);just a random point of the Dalitz Plot
σs = randomPoint(tbs.ms);
two_λs = randomPoint(tbs.two_js);Model is build, one can compute unpolarized intensity with it
@show amplitude(model, σs, two_λs);amplitude(model, σs, two_λs) = -0.9965155940391828 + 0.9490460338578imgives a real number - probability
@show unpolarized_intensity(model, σs);unpolarized_intensity(model, σs) = 195.71956237829784Plotting API
A natural way to visualize the three-body decay with two degrees of freedom is a correlation plot of the subchannel invariant masses squared. Kinematic limits can visualized using the border function. Plot in the σ₁σ₃ variables is obtained by
plot(
    lab = "",
    grid = false,
    size = (600, 300),
    plot(border31(masses(model)), xlab = "σ₁ (GeV²)", ylab = "σ₃ (GeV²)"),
    plot(border12(masses(model)), xlab = "σ₂ (GeV²)", ylab = "σ₁ (GeV²)"),
)Visualize the matrix element as a function of kinematic variables:
plot(masses(model), σs -> abs2(amplitude(Pc4312, σs, (2, -1, 0, 1))))Compute Dalitz plot projections numerically:
plot(4.2, 4.6) do e1
    I = Base.Fix1(unpolarized_intensity, model)
    e1 * quadgk(projection_integrand(I, masses(model), e1^2; k = 3), 0, 1)[1]
endSee more in the Visualization Tutorial.
This page was generated using Literate.jl.