Amplitude model with ampform#
Formulate helicity amplitude model for \(p \gamma \to \eta \pi^0 p\) symbolically using AmpForm.
Generate transitions#
Interaction types#
QRules constructs the conservation rules cumulatively. Weak interactions conserve charge, lepton numbers, and baryon number. Electromagnetic interactions additionally conserve flavor quantum numbers and parity. Strong interactions add isospin and \(G\)-parity conservation. Consequently, the sets of conservation laws obey
The values passed to allowed_interaction_types are alternatives for each interaction node. Allowing both "strong" and "EM" therefore does not combine their strengths or conservation laws: QRules tests each node under either set of rules. This allows the electromagnetic production vertex while retaining strongly allowed decay chains.
pgamma1, pgamma2 = create_pgamma(4.101931071854584)
particle_db.update([pgamma1, pgamma2])
We keep the relevant information about branching fractions in the previous Branching fraction chapter.
For simplicity, after the information about branching fraction, and under the current qrules results, we limit the intermediate resonances to be:
\(a(2)\) for \(\eta \pi^0\),
\(\Delta(1232)\) for \(\pi p\),
and \(N(1535)\) for both \(\pi^0 p\) and \(\eta p\).
reaction = qrules.generate_transitions(
initial_state="pgamma1",
final_state=["eta", "pi0", "p"],
allowed_intermediate_particles=["a(2)(1320)", "N(1535)", "Delta(1232)"],
allowed_interaction_types=["strong", "EM"],
particle_db=particle_db,
max_angular_momentum=3,
max_spin_magnitude=3,
mass_conservation_factor=0,
)
Subsystem |
Resonances |
|---|---|
p pi0 |
Delta(1232)+, N(1535)+ |
eta p |
N(1535)+ |
eta pi0 |
a(2)(1320)0 |
The resonance assignments are not identical. Isospin conservation excludes \(\Delta(1232)^+ \to \eta p\), while \(N(1535)^+\) can decay to both \(\pi^0p\) and \(\eta p\).
Formulate model#
model_builder = ampform.get_builder(reaction)
model_builder.config.scalar_initial_state_mass = True
model_builder.config.stable_final_state_ids = 0, 1, 2
bw_builder = RelativisticBreitWignerBuilder(
energy_dependent_width=False,
form_factor=False,
)
for name in reaction.get_intermediate_particles().names:
model_builder.dynamics.assign(name, bw_builder)
model = model_builder.formulate()
The first component of the full amplitude is shown below. The other terms are in similar way of formualation and thus not showing explicitly here again.
Visualization#
unfolded_expression = model.expression.doit()
intensity_func = create_parametrized_function(
expression=unfolded_expression,
parameters=model.parameter_defaults,
backend="jax",
)
phsp_event = 500_000
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(phsp_event, rng)
helicity_transformer = SympyDataTransformer.from_sympy(
model.kinematic_variables,
backend="jax",
)
phsp = helicity_transformer(phsp_momenta)
{0: ['Delta(1232)+', 'N(1535)+'], 1: ['N(1535)+'], 2: ['a(2)(1320)0']}
%matplotlib widget