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)
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:
qrules/src/qrules/transition.py
Lines 443 to 450 in b5017b6
"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
qrules/src/qrules/transition.py
Lines 451 to 453 in 81eead8
This will, however, remove the original h(1)(1415)
(with isospin==None
) from the allowed transitions.