conservation_rules

Collection of quantum number conservation rules for particle reactions.

This module is the place where the ‘expert’ defines the rules that verify quantum numbers of the reaction. The module is therefore strongly typed (both for the reader of the code and for type checking with mypy). An example is HelicityParityEdgeInput, which has been defined to provide type checks on ParityConservationHelicity.

See more information under Rule.

class BaryonNumberConservation[source]

Bases: expertsystem.reaction.conservation_rules.Rule

Decorated via additive_quantum_number_rule.

Check for baryon_number conservation.

__call__(ingoing_edge_qns: List[expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.baryon_number], outgoing_edge_qns: List[expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.baryon_number], _=None)bool

Call self as a function.

class BottomnessConservation[source]

Bases: expertsystem.reaction.conservation_rules.Rule

Decorated via additive_quantum_number_rule.

Check for bottomness conservation.

__call__(ingoing_edge_qns: List[expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.bottomness], outgoing_edge_qns: List[expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.bottomness], _=None)bool

Call self as a function.

class CParityConservation[source]

Bases: expertsystem.reaction.conservation_rules.Rule

__call__(ingoing_edge_qns: List[expertsystem.reaction.conservation_rules.CParityEdgeInput], outgoing_edge_qns: List[expertsystem.reaction.conservation_rules.CParityEdgeInput], interaction_node_qns: expertsystem.reaction.conservation_rules.CParityNodeInput)bool[source]

Check for \(C\)-parity conservation.

Implements \(C_{in} = C_{out}\).

class CParityEdgeInput(spin_mag: expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.spin_magnitude, pid: expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.pid, c_parity: Optional[expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.c_parity] = None)[source]

Bases: object

__eq__(other)

Method generated by attrs for class CParityEdgeInput.

c_parity: Optional[expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.c_parity]
pid: expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.pid
spin_mag: expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.spin_magnitude
class CParityNodeInput(l_mag: expertsystem.reaction.quantum_numbers.NodeQuantumNumbers.l_magnitude, s_mag: expertsystem.reaction.quantum_numbers.NodeQuantumNumbers.s_magnitude)[source]

Bases: object

__eq__(other)

Method generated by attrs for class CParityNodeInput.

l_mag: expertsystem.reaction.quantum_numbers.NodeQuantumNumbers.l_magnitude
s_mag: expertsystem.reaction.quantum_numbers.NodeQuantumNumbers.s_magnitude
class ChargeConservation[source]

Bases: expertsystem.reaction.conservation_rules.Rule

Decorated via additive_quantum_number_rule.

Check for charge conservation.

__call__(ingoing_edge_qns: List[expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.charge], outgoing_edge_qns: List[expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.charge], _=None)bool

Call self as a function.

class CharmConservation[source]

Bases: expertsystem.reaction.conservation_rules.Rule

Decorated via additive_quantum_number_rule.

Check for charmness conservation.

__call__(ingoing_edge_qns: List[expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.charmness], outgoing_edge_qns: List[expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.charmness], _=None)bool

Call self as a function.

class ClebschGordanCheckHelicityToCanonical[source]

Bases: expertsystem.reaction.conservation_rules.Rule

__call__(ingoing_spins: List[expertsystem.reaction.conservation_rules.SpinEdgeInput], outgoing_spins: List[expertsystem.reaction.conservation_rules.SpinEdgeInput], interaction_qns: expertsystem.reaction.conservation_rules.SpinNodeInput)bool[source]

Implement Clebsch-Gordan checks.

For \(S_1, S_2\) to \(S\) and the \(L,S\) to \(J\) coupling based on the conversion of helicity to canonical amplitude sums.

class ElectronLNConservation[source]

Bases: expertsystem.reaction.conservation_rules.Rule

Decorated via additive_quantum_number_rule.

Check for electron_lepton_number conservation.

__call__(ingoing_edge_qns: List[expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.electron_lepton_number], outgoing_edge_qns: List[expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.electron_lepton_number], _=None)bool

Call self as a function.

class GParityConservation[source]

Bases: expertsystem.reaction.conservation_rules.Rule

__call__(ingoing_edge_qns: List[expertsystem.reaction.conservation_rules.GParityEdgeInput], outgoing_edge_qns: List[expertsystem.reaction.conservation_rules.GParityEdgeInput], interaction_qns: expertsystem.reaction.conservation_rules.GParityNodeInput)bool[source]

Check for \(G\)-parity conservation.

Implements for \(G_{in} = G_{out}\).

class GParityEdgeInput(isospin: expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.isospin_magnitude, spin_mag: expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.spin_magnitude, pid: expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.pid, g_parity: Optional[expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.g_parity] = None)[source]

Bases: object

__eq__(other)

Method generated by attrs for class GParityEdgeInput.

g_parity: Optional[expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.g_parity]
isospin: expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.isospin_magnitude
pid: expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.pid
spin_mag: expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.spin_magnitude
class GParityNodeInput(l_mag: expertsystem.reaction.quantum_numbers.NodeQuantumNumbers.l_magnitude, s_mag: expertsystem.reaction.quantum_numbers.NodeQuantumNumbers.s_magnitude)[source]

Bases: object

__eq__(other)

Method generated by attrs for class GParityNodeInput.

l_mag: expertsystem.reaction.quantum_numbers.NodeQuantumNumbers.l_magnitude
s_mag: expertsystem.reaction.quantum_numbers.NodeQuantumNumbers.s_magnitude
class GellMannNishijimaEdgeInput(charge: expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.charge, isospin_proj: Optional[expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.isospin_projection] = None, strangeness: Optional[expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.strangeness] = None, charmness: Optional[expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.charmness] = None, bottomness: Optional[expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.bottomness] = None, topness: Optional[expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.topness] = None, baryon_number: Optional[expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.baryon_number] = None, electron_ln: Optional[expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.electron_lepton_number] = None, muon_ln: Optional[expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.muon_lepton_number] = None, tau_ln: Optional[expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.tau_lepton_number] = None)[source]

Bases: object

__eq__(other)

Method generated by attrs for class GellMannNishijimaEdgeInput.

baryon_number: Optional[expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.baryon_number]
bottomness: Optional[expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.bottomness]
charge: expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.charge
charmness: Optional[expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.charmness]
electron_ln: Optional[expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.electron_lepton_number]
isospin_proj: Optional[expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.isospin_projection]
muon_ln: Optional[expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.muon_lepton_number]
strangeness: Optional[expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.strangeness]
tau_ln: Optional[expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.tau_lepton_number]
topness: Optional[expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.topness]
class GellMannNishijimaRule[source]

Bases: expertsystem.reaction.conservation_rules.Rule

__call__(ingoing_edge_qns: List[expertsystem.reaction.conservation_rules.GellMannNishijimaEdgeInput], outgoing_edge_qns: List[expertsystem.reaction.conservation_rules.GellMannNishijimaEdgeInput], _=None)bool[source]

Check the Gell-Mann–Nishijima formula.

\(Q=I_3+\frac{Y}{2}\) for each particle.

class HelicityConservation[source]

Bases: expertsystem.reaction.conservation_rules.Rule

__call__(ingoing_spin_mags: List[expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.spin_magnitude], outgoing_helicities: List[expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.spin_projection], _=None)bool[source]

Implementation of helicity conservation.

Check for \(|\lambda_2-\lambda_3| \leq S_1\).

class HelicityParityEdgeInput(parity: Optional[expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.parity], spin_mag: expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.spin_magnitude, spin_proj: expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.spin_projection)[source]

Bases: object

__eq__(other)

Method generated by attrs for class HelicityParityEdgeInput.

parity: Optional[expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.parity]
spin_mag: expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.spin_magnitude
spin_proj: expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.spin_projection
class IdenticalParticleSymmetrization[source]

Bases: expertsystem.reaction.conservation_rules.Rule

__call__(ingoing_edge_qns: List[expertsystem.reaction.conservation_rules.IdenticalParticleSymmetryEdgeInput], outgoing_edge_qns: List[expertsystem.reaction.conservation_rules.IdenticalParticleSymmetryEdgeInput], _=None)bool[source]

Implementation of particle symmetrization.

class IdenticalParticleSymmetryEdgeInput(parity: expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.parity, spin_magnitude: expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.spin_magnitude, spin_projection: expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.spin_projection, pid: expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.pid)[source]

Bases: object

__eq__(other)

Method generated by attrs for class IdenticalParticleSymmetryEdgeInput.

parity: expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.parity
pid: expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.pid
spin_magnitude: expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.spin_magnitude
spin_projection: expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.spin_projection
class IsoSpinConservation[source]

Bases: expertsystem.reaction.conservation_rules.Rule

Check for isospin conservation.

Implements

\[|I_1 - I_2| \leq I \leq |I_1 + I_2|\]

Also checks \(I_{1,z} + I_{2,z} = I_z\) and if Clebsch-Gordan coefficients are all 0.

__call__(ingoing_isospins: List[expertsystem.reaction.conservation_rules.IsoSpinEdgeInput], outgoing_isospins: List[expertsystem.reaction.conservation_rules.IsoSpinEdgeInput], _=None)bool[source]

Call self as a function.

class IsoSpinEdgeInput(isospin_mag: expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.isospin_magnitude, isospin_proj: expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.isospin_projection)[source]

Bases: object

__eq__(other)

Method generated by attrs for class IsoSpinEdgeInput.

isospin_mag: expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.isospin_magnitude
isospin_proj: expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.isospin_projection
class IsoSpinValidity[source]

Bases: expertsystem.reaction.conservation_rules.Rule

Check for valid isospin magnitude and projection.

__call__(ingoing_isospins: List[expertsystem.reaction.conservation_rules.IsoSpinEdgeInput], outgoing_isospins: List[expertsystem.reaction.conservation_rules.IsoSpinEdgeInput], _=None)bool[source]

Call self as a function.

class MassConservation(width_factor: float)[source]

Bases: expertsystem.reaction.conservation_rules.Rule

Mass conservation rule.

__call__(ingoing_edge_qns: List[expertsystem.reaction.conservation_rules.MassEdgeInput], outgoing_edge_qns: List[expertsystem.reaction.conservation_rules.MassEdgeInput], _=None)bool[source]

Implements mass conservation.

\(M_{out} - N \cdot W_{out} < M_{in} + N \cdot W_{in}\)

It makes sure that the net mass outgoing state \(M_{out}\) is smaller than the net mass of the ingoing state \(M_{in}\). Also the width \(W\) of the states is taken into account.

class MassEdgeInput(mass: expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.mass, width: Optional[expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.width] = None)[source]

Bases: object

__eq__(other)

Method generated by attrs for class MassEdgeInput.

mass: expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.mass
width: Optional[expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.width]
class MuonLNConservation[source]

Bases: expertsystem.reaction.conservation_rules.Rule

Decorated via additive_quantum_number_rule.

Check for muon_lepton_number conservation.

__call__(ingoing_edge_qns: List[expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.muon_lepton_number], outgoing_edge_qns: List[expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.muon_lepton_number], _=None)bool

Call self as a function.

class ParityConservation[source]

Bases: expertsystem.reaction.conservation_rules.Rule

__call__(ingoing_edge_qns: List[expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.parity], outgoing_edge_qns: List[expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.parity], l_mag: expertsystem.reaction.quantum_numbers.NodeQuantumNumbers.l_magnitude)bool[source]

Implement \(P_{in} = P_{out} \cdot (-1)^L\).

class ParityConservationHelicity[source]

Bases: expertsystem.reaction.conservation_rules.Rule

__call__(ingoing_edge_qns: List[expertsystem.reaction.conservation_rules.HelicityParityEdgeInput], outgoing_edge_qns: List[expertsystem.reaction.conservation_rules.HelicityParityEdgeInput], parity_prefactor: expertsystem.reaction.quantum_numbers.NodeQuantumNumbers.parity_prefactor)bool[source]

Implements parity conservation for helicity formalism.

Check the following:

\[A_{-\lambda_1-\lambda_2} = P_1 P_2 P_3 (-1)^{S_2+S_3-S_1} A_{\lambda_1\lambda_2}\]

Notice that only the special case \(\lambda_1=\lambda_2=0\) may return False.

class Rule[source]

Bases: object

Interface for conservation rules.

A Rule performs checks on an InteractionNode and its attached Edge instances. The __call__ method contains actual rule logic and has to be overwritten.

Warning

Besides the rule logic itself, a Rule also has the responsibility of stating its run conditions. These run conditions must be stated by the type annotations of its __call__ method. The type annotations therefore are not just there for static type checking: they also carry more information about the rule that is extracted dynamically by the reaction module.

Generally, the conditions can be separated into two categories:

  • variable conditions

  • toplogical conditions

Currently, only variable conditions are being used. Topological conditions could be created in the form of Tuple instead of List.

For additive quantum numbers, the decorator additive_quantum_number_rule can simplify the constrution of the appropriate Rule.

__call__(ingoing_edge_qns: List[Any], outgoing_edge_qns: List[Any], interaction_node_qns: Any)bool[source]

Call self as a function.

__eq__(o: object)bool[source]

Return self==value.

class SpinConservation[source]

Bases: expertsystem.reaction.conservation_rules.Rule

Check for spin conservation.

Implements

\[|S_1 - S_2| \leq S \leq |S_1 + S_2|\]

and

\[|L - S| \leq J \leq |L + S|\]

Also checks \(M_1 + M_2 = M\) and if Clebsch-Gordan coefficients are all 0.

__call__(ingoing_spins: List[expertsystem.reaction.conservation_rules.SpinEdgeInput], outgoing_spins: List[expertsystem.reaction.conservation_rules.SpinEdgeInput], interaction_qns: expertsystem.reaction.conservation_rules.SpinNodeInput)bool[source]

Call self as a function.

class SpinConservationMagnitude[source]

Bases: expertsystem.reaction.conservation_rules.Rule

Check for spin conservation.

Implements

\[|S_1 - S_2| \leq S \leq |S_1 + S_2|\]

and

\[|L - S| \leq J \leq |L + S|\]
__call__(ingoing_spins: List[expertsystem.reaction.conservation_rules.SpinEdgeInput], outgoing_spins: List[expertsystem.reaction.conservation_rules.SpinEdgeInput], interaction_qns: expertsystem.reaction.conservation_rules.SpinMagnitudeNodeInput)bool[source]

Call self as a function.

class SpinEdgeInput(spin_magnitude: expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.spin_magnitude, spin_projection: expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.spin_projection)[source]

Bases: object

__eq__(other)

Method generated by attrs for class SpinEdgeInput.

spin_magnitude: expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.spin_magnitude
spin_projection: expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.spin_projection
class SpinMagnitudeNodeInput(l_magnitude: expertsystem.reaction.quantum_numbers.NodeQuantumNumbers.l_magnitude, s_magnitude: expertsystem.reaction.quantum_numbers.NodeQuantumNumbers.s_magnitude)[source]

Bases: object

__eq__(other)

Method generated by attrs for class SpinMagnitudeNodeInput.

l_magnitude: expertsystem.reaction.quantum_numbers.NodeQuantumNumbers.l_magnitude
s_magnitude: expertsystem.reaction.quantum_numbers.NodeQuantumNumbers.s_magnitude
class SpinNodeInput(l_magnitude: expertsystem.reaction.quantum_numbers.NodeQuantumNumbers.l_magnitude, l_projection: expertsystem.reaction.quantum_numbers.NodeQuantumNumbers.l_projection, s_magnitude: expertsystem.reaction.quantum_numbers.NodeQuantumNumbers.s_magnitude, s_projection: expertsystem.reaction.quantum_numbers.NodeQuantumNumbers.s_projection)[source]

Bases: object

__eq__(other)

Method generated by attrs for class SpinNodeInput.

l_magnitude: expertsystem.reaction.quantum_numbers.NodeQuantumNumbers.l_magnitude
l_projection: expertsystem.reaction.quantum_numbers.NodeQuantumNumbers.l_projection
s_magnitude: expertsystem.reaction.quantum_numbers.NodeQuantumNumbers.s_magnitude
s_projection: expertsystem.reaction.quantum_numbers.NodeQuantumNumbers.s_projection
class StrangenessConservation[source]

Bases: expertsystem.reaction.conservation_rules.Rule

Decorated via additive_quantum_number_rule.

Check for strangeness conservation.

__call__(ingoing_edge_qns: List[expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.strangeness], outgoing_edge_qns: List[expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.strangeness], _=None)bool

Call self as a function.

class TauLNConservation[source]

Bases: expertsystem.reaction.conservation_rules.Rule

Decorated via additive_quantum_number_rule.

Check for tau_lepton_number conservation.

__call__(ingoing_edge_qns: List[expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.tau_lepton_number], outgoing_edge_qns: List[expertsystem.reaction.quantum_numbers.EdgeQuantumNumbers.tau_lepton_number], _=None)bool

Call self as a function.

additive_quantum_number_rule(quantum_number: type) → Callable[[Type[expertsystem.reaction.conservation_rules.Rule]], Type[expertsystem.reaction.conservation_rules.Rule]][source]

Class decorator for creating an additive conservation Rule.

Use this decorator to create a conservation Rule for a quantum number to which an additive conservation rule applies:

\[\sum q_{in} = \sum q_{out}\]
Parameters

quantum_number – Quantum number to which you want to apply the additive conservation check. An example would be EdgeQuantumNumbers.charge.