Sub-intensities of P vector#
Studied decay#
reaction = qrules.generate_transitions(
initial_state="J/psi(1S)",
final_state=["eta", "p", "p~"],
allowed_intermediate_particles=["N"],
allowed_interaction_types=["strong"],
formalism="helicity",
particle_db=create_particle_database(),
)
Amplitude builder#
model_builder = ampform.get_builder(reaction)
model_builder.adapter.permutate_registered_topologies()
model_builder.config.scalar_initial_state_mass = True
model_builder.config.stable_final_state_ids = [0, 1, 2]
create_dynamics_symbol = DynamicsSymbolBuilder()
for resonance in reaction.get_intermediate_particles():
model_builder.set_dynamics(resonance.name, create_dynamics_symbol)
model = model_builder.formulate()
model.intensity.cleanup()
\[\displaystyle \sum_{m_{A}=-1}^{1} \sum_{m_{1}=-1/2}^{1/2} \sum_{m_{2}=-1/2}^{1/2}{\left|{A^{01}_{m_{A}, 0, m_{1}, m_{2}}}\right|^{2}}\]
\[\begin{split}\displaystyle \begin{array}{rcl}
A^{01}_{0, 0, - \frac{1}{2}, - \frac{1}{2}} &=& - C_{J/\psi(1S) \to {N_1(3/2^-)}_{+1/2} \overline{p}_{+1/2}; N_1(3/2^-) \to \eta_{0} p_{+1/2}} X_{J^P={\frac{3}{2}}^{+}, Q=+1} D^{1}_{0,0}\left(- \phi_{01},\theta_{01},0\right) D^{\frac{3}{2}}_{- \frac{1}{2},\frac{1}{2}}\left(- \phi^{01}_{0},\theta^{01}_{0},0\right) \\
&+& - C_{J/\psi(1S) \to {N_1(3/2^-)}_{+1/2} \overline{p}_{-1/2}; N_1(3/2^-) \to \eta_{0} p_{+1/2}} X_{J^P={\frac{3}{2}}^{+}, Q=+1} D^{1}_{0,1}\left(- \phi_{01},\theta_{01},0\right) D^{\frac{3}{2}}_{\frac{1}{2},\frac{1}{2}}\left(- \phi^{01}_{0},\theta^{01}_{0},0\right) \\
&+& - C_{J/\psi(1S) \to {N_1(3/2^-)}_{+3/2} \overline{p}_{+1/2}; N_1(3/2^-) \to \eta_{0} p_{+1/2}} X_{J^P={\frac{3}{2}}^{+}, Q=+1} D^{1}_{0,-1}\left(- \phi_{01},\theta_{01},0\right) D^{\frac{3}{2}}_{- \frac{3}{2},\frac{1}{2}}\left(- \phi^{01}_{0},\theta^{01}_{0},0\right) \\
&+& - C_{J/\psi(1S) \to {N_2(3/2^-)}_{+1/2} \overline{p}_{+1/2}; N_2(3/2^-) \to \eta_{0} p_{+1/2}} X_{J^P={\frac{3}{2}}^{+}, Q=+1} D^{1}_{0,0}\left(- \phi_{01},\theta_{01},0\right) D^{\frac{3}{2}}_{- \frac{1}{2},\frac{1}{2}}\left(- \phi^{01}_{0},\theta^{01}_{0},0\right) \\
&+& - C_{J/\psi(1S) \to {N_2(3/2^-)}_{+1/2} \overline{p}_{-1/2}; N_2(3/2^-) \to \eta_{0} p_{+1/2}} X_{J^P={\frac{3}{2}}^{+}, Q=+1} D^{1}_{0,1}\left(- \phi_{01},\theta_{01},0\right) D^{\frac{3}{2}}_{\frac{1}{2},\frac{1}{2}}\left(- \phi^{01}_{0},\theta^{01}_{0},0\right) \\
&+& - C_{J/\psi(1S) \to {N_2(3/2^-)}_{+3/2} \overline{p}_{+1/2}; N_2(3/2^-) \to \eta_{0} p_{+1/2}} X_{J^P={\frac{3}{2}}^{+}, Q=+1} D^{1}_{0,-1}\left(- \phi_{01},\theta_{01},0\right) D^{\frac{3}{2}}_{- \frac{3}{2},\frac{1}{2}}\left(- \phi^{01}_{0},\theta^{01}_{0},0\right) \\
\end{array}\end{split}\]
\[\begin{split}\displaystyle \begin{array}{cll}
X_{J^P={\frac{3}{2}}^{+}, Q=+1} \\
N_2(3/2^-) & m=1.92\text{ GeV} & \Gamma=0.6\text{ GeV} \\
N_1(3/2^-) & m=1.82\text{ GeV} & \Gamma=0.6\text{ GeV} \\
\end{array}\end{split}\]
Dynamics parametrization#
Phasespace factor#
\[\begin{split}\displaystyle \begin{array}{rcl}
\rho^\mathrm{CM}_{m_{1},m_{2}}\left(s\right) &=& - 16 i \pi \Sigma\left(s\right) \\
\Sigma\left(s\right) &=& \frac{- \left(m_{1}^{2} - m_{2}^{2}\right) \left(- \frac{1}{\left(m_{1} + m_{2}\right)^{2}} + \frac{1}{s}\right) \log{\left(\frac{m_{1}}{m_{2}} \right)} + \frac{2 \log{\left(\frac{\left|{m_{1}^{2} + m_{2}^{2} + 2 \sqrt{s} q\left(s\right) - s}\right|}{2 m_{1} m_{2}} \right)} q\left(s\right)}{\sqrt{s}}}{16 \pi^{2}} \\
q\left(s\right) &=& \frac{\sqrt{\lambda\left(s, m_{1}^{2}, m_{2}^{2}\right)}}{2 \sqrt{s}} \\
\end{array}\end{split}\]
Relativistic Breit-Wigner#
PARAMETERS_BW = dict(model.parameter_defaults)
def formulate_breit_wigner(
resonances: list[tuple[Particle, TwoBodyKinematicVariableSet]],
) -> sp.Expr:
(_, variables), *_ = resonances
s = variables.incoming_state_mass**2
m1 = variables.outgoing_state_mass1
m2 = variables.outgoing_state_mass2
ρ = PhaseSpaceCM(s, m1, m2)
m = [sp.Symbol(Rf"m_{{{p.latex}}}") for p, _ in resonances]
Γ0 = [sp.Symbol(Rf"\Gamma_{{{p.latex}}}") for p, _ in resonances]
β = [sp.Symbol(Rf"\beta_{{{p.latex}}}") for p, _ in resonances]
expr = sum(
(β_ * m_ * Γ0_) / (m_**2 - s - m_ * Γ0_ * ρ)
for m_, Γ0_, β_ in zip(m, Γ0, β, strict=True)
)
for i, (resonance, _) in enumerate(resonances):
PARAMETERS_BW[β[i]] = 1 + 0j
PARAMETERS_BW[m[i]] = resonance.mass
PARAMETERS_BW[Γ0[i]] = resonance.width
return expr
\[\begin{split}\displaystyle \begin{array}{rcl}
X_{J^P={\frac{3}{2}}^{+}, Q=+1} &=& \frac{\Gamma_{N_1(3/2^-)} \beta_{N_1(3/2^-)} m_{N_1(3/2^-)}}{- \Gamma_{N_1(3/2^-)} m_{N_1(3/2^-)} \rho^\mathrm{CM}_{m_{0},m_{1}}\left(m_{01}^{2}\right) - m_{01}^{2} + \left(m_{N_1(3/2^-)}\right)^{2}} + \frac{\Gamma_{N_2(3/2^-)} \beta_{N_2(3/2^-)} m_{N_2(3/2^-)}}{- \Gamma_{N_2(3/2^-)} m_{N_2(3/2^-)} \rho^\mathrm{CM}_{m_{0},m_{1}}\left(m_{01}^{2}\right) - m_{01}^{2} + \left(m_{N_2(3/2^-)}\right)^{2}} \\
\end{array}\end{split}\]
\(P\) vector#
PARAMETERS_F = dict(model.parameter_defaults)
def formulate_k_matrix(
resonances: list[tuple[Particle, TwoBodyKinematicVariableSet]],
) -> sp.Expr:
(_, variables), *_ = resonances
s = variables.incoming_state_mass**2
m = [sp.Symbol(Rf"m_{{{p.latex}}}") for p, _ in resonances]
g = [sp.Symbol(Rf"g_{{{p.latex}}}") for p, _ in resonances]
expr = sum((g_**2) / (m_**2 - s) for m_, g_ in zip(m, g, strict=True))
for i, (resonance, _) in enumerate(resonances):
PARAMETERS_F[m[i]] = resonance.mass
PARAMETERS_F[g[i]] = 1
return expr
def formulate_p_vector(
resonances: list[tuple[Particle, TwoBodyKinematicVariableSet]],
) -> sp.Expr:
(_, variables), *_ = resonances
s = variables.incoming_state_mass**2
g = [sp.Symbol(Rf"g_{{{p.latex}}}") for p, _ in resonances]
m = [sp.Symbol(Rf"m_{{{p.latex}}}") for p, _ in resonances]
β = [sp.Symbol(Rf"\beta_{{{p.latex}}}") for p, _ in resonances]
expr = sum((g_ * β_) / (m_**2 - s) for m_, g_, β_ in zip(m, g, β, strict=True))
for i, (resonance, _) in enumerate(resonances):
PARAMETERS_F[β[i]] = 1 + 0j
PARAMETERS_F[m[i]] = resonance.mass
PARAMETERS_F[g[i]] = 1
return expr
def formulate_f_vector(
resonances: list[tuple[Particle, TwoBodyKinematicVariableSet]],
) -> sp.Expr:
(_, variables), *_ = resonances
s = variables.incoming_state_mass**2
m1 = variables.outgoing_state_mass1
m2 = variables.outgoing_state_mass2
rho = PhaseSpaceCM(s, m1, m2)
K = formulate_k_matrix(resonances)
P = formulate_p_vector(resonances)
return (1 / (1 - rho * K)) * P
\[\begin{split}\displaystyle \begin{array}{rcl}
X_{J^P={\frac{3}{2}}^{+}, Q=+1} &=& \frac{\frac{\beta_{N_1(3/2^-)} g_{N_1(3/2^-)}}{- m_{01}^{2} + \left(m_{N_1(3/2^-)}\right)^{2}} + \frac{\beta_{N_2(3/2^-)} g_{N_2(3/2^-)}}{- m_{01}^{2} + \left(m_{N_2(3/2^-)}\right)^{2}}}{- \left(\frac{\left(g_{N_1(3/2^-)}\right)^{2}}{- m_{01}^{2} + \left(m_{N_1(3/2^-)}\right)^{2}} + \frac{\left(g_{N_2(3/2^-)}\right)^{2}}{- m_{01}^{2} + \left(m_{N_2(3/2^-)}\right)^{2}}\right) \rho^\mathrm{CM}_{m_{0},m_{1}}\left(m_{01}^{2}\right) + 1} \\
\end{array}\end{split}\]
Create numerical functions#
Amplitude model function#
full_expression_bw = perform_cached_doit(model_bw.expression).xreplace(
dynamics_expressions_bw
)
intensity_func_bw = create_parametrized_function(
expression=perform_cached_doit(full_expression_bw),
backend="jax",
parameters=PARAMETERS_BW,
)
full_expression_fvector = perform_cached_doit(model_fvector.expression).xreplace(
dynamics_expressions_fvector
)
intensity_func_fvector = create_parametrized_function(
expression=perform_cached_doit(full_expression_fvector),
backend="jax",
parameters=PARAMETERS_F,
)
Dynamics function#
\[\displaystyle \frac{\Gamma_{N_1(3/2^-)} \beta_{N_1(3/2^-)} m_{N_1(3/2^-)}}{- \Gamma_{N_1(3/2^-)} m_{N_1(3/2^-)} \rho^\mathrm{CM}_{m_{0},m_{1}}\left(m_{01}^{2}\right) - m_{01}^{2} + \left(m_{N_1(3/2^-)}\right)^{2}} + \frac{\Gamma_{N_2(3/2^-)} \beta_{N_2(3/2^-)} m_{N_2(3/2^-)}}{- \Gamma_{N_2(3/2^-)} m_{N_2(3/2^-)} \rho^\mathrm{CM}_{m_{0},m_{1}}\left(m_{01}^{2}\right) - m_{01}^{2} + \left(m_{N_2(3/2^-)}\right)^{2}}\]
\[\displaystyle \frac{\beta_{N_1(3/2^-)} g_{N_1(3/2^-)} \left(m_{01}^{2} - \left(m_{N_2(3/2^-)}\right)^{2}\right) + \beta_{N_2(3/2^-)} g_{N_2(3/2^-)} \left(m_{01}^{2} - \left(m_{N_1(3/2^-)}\right)^{2}\right)}{- \left(m_{01}^{2} - \left(m_{N_1(3/2^-)}\right)^{2}\right) \left(m_{01}^{2} - \left(m_{N_2(3/2^-)}\right)^{2}\right) + \left(- \left(g_{N_1(3/2^-)}\right)^{2} \left(m_{01}^{2} - \left(m_{N_2(3/2^-)}\right)^{2}\right) - \left(g_{N_2(3/2^-)}\right)^{2} \left(m_{01}^{2} - \left(m_{N_1(3/2^-)}\right)^{2}\right)\right) \rho^\mathrm{CM}_{m_{0},m_{1}}\left(m_{01}^{2}\right)}\]
dynamics_func_bw = create_parametrized_function(
expression=perform_cached_doit(dynamics_expr_bw),
backend="jax",
parameters=model_bw.parameter_defaults,
)
dynamics_func_fvector = create_parametrized_function(
expression=perform_cached_doit(dynamics_expr_fvector),
backend="jax",
parameters=model_fvector.parameter_defaults,
)
Generate data#
Generate phase space sample#
rng = TFUniformRealNumberGenerator(seed=0)
phsp_generator = TFPhaseSpaceGenerator(
initial_state_mass=reaction.initial_state[-1].mass,
final_state_masses={i: p.mass for i, p in reaction.final_state.items()},
)
phsp_momenta = phsp_generator.generate(500_000, rng)
ε = 1e-8
transformer = SympyDataTransformer.from_sympy(model.kinematic_variables, backend="jax")
phsp = transformer(phsp_momenta)
phsp = {k: v + ε * 1j if re.match(r"^m_\d\d$", k) else v for k, v in phsp.items()}
Update function parameters#
m_res1 = 1.82
m_res2 = 1.92
g_res1 = 1
g_res2 = 1
toy_parameters_bw = {
R"m_{N_1(3/2^-)}": m_res1,
R"m_{N_2(3/2^-)}": m_res2,
R"\Gamma_{N_1(3/2^-)}": g_res1 / m_res1,
R"\Gamma_{N_2(3/2^-)}": g_res2 / m_res2,
}
dynamics_func_bw.update_parameters(toy_parameters_bw)
intensity_func_bw.update_parameters(toy_parameters_bw)
toy_parameters_fvector = {
R"\beta_{N_1(3/2^-)}": 1 + 0j,
R"\beta_{N_2(3/2^-)}": 1 + 0j,
R"m_{N_1(3/2^-)}": m_res1,
R"m_{N_2(3/2^-)}": m_res2,
R"g_{N_1(3/2^-)}": g_res1,
R"g_{N_2(3/2^-)}": g_res2,
}
dynamics_func_fvector.update_parameters(toy_parameters_fvector)
intensity_func_fvector.update_parameters(toy_parameters_fvector)
Plots#
Sub-intensities#
total_intensities_bw = intensity_func_bw(phsp)
sub_intensities_bw = {
p: compute_sub_intensity(
intensity_func_bw,
phsp,
resonances=[p.latex],
coupling_pattern=r"\\beta",
)
for symbol, resonances in create_dynamics_symbol.collected_symbols.items()
for p, _ in resonances
}
total_intensities_fvector = intensity_func_fvector(phsp)
sub_intensities_fvector = {
p: compute_sub_intensity(
intensity_func_fvector,
phsp,
resonances=[p.latex],
coupling_pattern=r"\\beta",
)
for symbol, resonances in create_dynamics_symbol.collected_symbols.items()
for p, _ in resonances
}
Argand plots#
ε = 1e-8
x = np.linspace(2, 5, num=400)
plot_data = {"m_01": np.sqrt(x) + ε * 1j}
total_dynamics_bw = dynamics_func_bw(plot_data)
sub_dynamics_bw = {
p: compute_sub_intensity(
dynamics_func_bw,
plot_data,
resonances=[p.latex],
coupling_pattern=r"\\beta",
)
for symbol, resonances in create_dynamics_symbol.collected_symbols.items()
for p, _ in resonances
}
total_dynamics_fvector = dynamics_func_fvector(plot_data)
sub_dynamics_fvector = {
p: compute_sub_intensity(
dynamics_func_fvector,
plot_data,
resonances=[p.latex],
coupling_pattern=r"\\beta",
)
for symbol, resonances in create_dynamics_symbol.collected_symbols.items()
for p, _ in resonances
}
x1 = np.linspace(2.0, (m_res1**2 + m_res2**2) / 2, num=500)
x2 = np.linspace((m_res1**2 + m_res2**2) / 2, 5.0, num=500)
plot_data1 = {"m_01": np.sqrt(x1) + ε * 1j}
plot_data2 = {"m_01": np.sqrt(x2) + ε * 1j}