ComPWA/qrules

Missing states for certain `allowed_intermediate_particles` (`h(1)(1415)`)

redeboer opened this issue · 4 comments

Original report by @Junliihep

When I generate a transition with intermediate state "h(1)(1415)", if I only add this state, it's ok.

For example:

reaction = qrules.generate_transitions(
    initial_state=("psi(2S)", [+1, -1]),
    final_state=["eta", "K-", "K*(892)+"],
    allowed_intermediate_particles=["h(1)(1415)"],
    allowed_interaction_types=["strong", "EM"],
    mass_conservation_factor=1,
    formalism="helicity",
)

will work. But if I add any other state, it will fail.

For example:

reaction = qrules.generate_transitions(
    initial_state=("psi(2S)", [+1, -1]),
    final_state=["eta", "K-", "K*(892)+"],
    allowed_intermediate_particles=["h(1)(1415)", "omega(1420)"],
    allowed_interaction_types=["strong", "EM"],
    mass_conservation_factor=1,
    formalism="helicity",
)

will ignore h(1)(1415) and only generate a transition with omega(1420),

and

reaction = qrules.generate_transitions(
    initial_state=("psi(2S)", [+1, -1]),
    final_state=["eta", "K-", "K*(892)+"],
    allowed_intermediate_particles=["h(1)(1415)", "K*(892)+"],  # <-- BOTH!
    allowed_interaction_types=["strong", "EM"],
    mass_conservation_factor=1,
    formalism="helicity",
)

will ignore h(1)(1415) and fail.

reaction = qrules.generate_transitions(
    initial_state=[("psi(2S)", [+1, -1])],
    final_state=["eta", "K-", "K*(892)+"],
    allowed_intermediate_particles=["h(1)(1415)"],
)
dot = qrules.io.asdot(reaction, collapse_graphs=True)
graphviz.Source(dot)

reaction = qrules.generate_transitions(
    initial_state=[("psi(2S)", [+1, -1])],
    final_state=["eta", "K-", "K*(892)+"],
    allowed_intermediate_particles=["omega(1650)"],
)
dot = qrules.io.asdot(reaction, collapse_graphs=True)
graphviz.Source(dot)

reaction = qrules.generate_transitions(
    initial_state=[("psi(2S)", [+1, -1])],
    final_state=["eta", "K-", "K*(892)+"],
    allowed_intermediate_particles=["h(1)(1415)", "omega(1650)"],
)
dot = qrules.io.asdot(reaction, collapse_graphs=True)
graphviz.Source(dot)

Seems to be related to #33 and possibly #160

Currently working out a fix in #166. The problem seems to originate from the point where QRules finds particle candidates for each of the quantum number sets it has found. A method will be extracted so that those quantum numbers can be inspected first (#168).

Until then, if you use QRules for building amplitude models with AmpForm, a quick fix is to merge the solutions you have found as follows:

import qrules
reaction1 = qrules.generate_transitions(
    initial_state=("psi(2S)", [+1, -1]),
    final_state=["eta", "K-", "K*(892)+"],
    allowed_intermediate_particles=["h(1)(1415)"],
)
reaction2 = qrules.generate_transitions(
    initial_state=("psi(2S)", [+1, -1]),
    final_state=["eta", "K-", "K*(892)+"],
    allowed_intermediate_particles=["omega(1420)"],
)
reaction = qrules.ReactionInfo(
    reaction1.transitions + reaction2.transitions,
    formalism=reaction1.formalism,
)

It doesn't solve the underlying problem, but at least you have a ReactionInfo object with all the resonances.

--> This requires pre-release 0.10.0a1, or at least c6c35de.

pip install qrules==0.10.0a1

I suspect it has something to do with the fact that the graph settings are affected by the choice of allowed_intermediate_particles here:

intermediate_edge_domains[EdgeQuantumNumbers.spin_projection].update(
self.interaction_type_settings[InteractionType.WEAK][0].qn_domains[
EdgeQuantumNumbers.spin_projection
]
)
for particle_props in self.__allowed_intermediate_states:
for edge_qn, qn_value in particle_props.items():
intermediate_edge_domains[edge_qn].add(qn_value)

"h(1)(1415)" does not have isospin, while "omega(1650)" does. This may mean that choosing only "h(1)(1415)" as allowed intermediate resonance removes the isospin domain.

only $h_1(1415)$

$h_1(1415)$ and $\omega(1650)$

Solution for now (see also scikit-hep/particle#486):

import graphviz
import qrules

PDG = qrules.load_pdg()
h1415 = PDG["h(1)(1415)"]
new_h1415 = qrules.particle.create_particle(
    h1415,
    isospin=qrules.particle.Spin(0, 0),
)
PDG.remove(h1415)
PDG.add(new_h1415)

reaction = qrules.generate_transitions(
    initial_state=[("psi(2S)", [+1, -1])],
    final_state=["eta", "K-", "K*(892)+"],
    allowed_intermediate_particles=["h(1)(1415)", "omega(1650)"],
    particle_db=PDG,
)
dot = qrules.io.asdot(reaction, collapse_graphs=True)
graphviz.Source(dot)

Another solution might be to extend the quantum number domains for edge numbers that are not there, for instance by adding something like this:

                for edge_qn, domain in self.interaction_type_settings[
                    InteractionType.WEAK
                ][0].items():
                    if edge_qn not in intermediate_edge_domains:
                        intermediate_edge_domains[edge_qn].update(domain)

after this line

for particle_props in self.__allowed_intermediate_states:
for edge_qn, qn_value in particle_props.items():
intermediate_edge_domains[edge_qn].add(qn_value)

This will, however, remove the original h(1)(1415) (with isospin==None) from the allowed transitions.