Find two-body hadronic thresholds compatible with given J^P quantum numbers
Project description
ThresholdFinder
Finds two-body hadronic thresholds compatible with given J^P quantum numbers. Given a mass range and a target J^P, it scans all pairs of PDG hadrons whose combined mass falls in that range and checks whether they can couple — via some orbital angular momentum L — to produce the desired quantum numbers.
Requirements
- Python >= 3.11
particle>= 0.24
pip install thresholds
Usage
Command line
python3 -m threshold_finder.cli mass_min mass_max J P [options]
Positional arguments:
| Argument | Description |
|---|---|
mass_min |
Lower bound of the threshold search range (MeV) |
mass_max |
Upper bound of the threshold search range (MeV) |
J |
Target total angular momentum (integer or half-integer, e.g. 1, 1.5) |
P |
Target parity: +1 or -1 |
Optional arguments:
| Flag | Default | Description |
|---|---|---|
--max-L L |
auto | Maximum orbital angular momentum to consider. Without this flag, L is capped automatically at J + J₁ + J₂ + 4 for each pair. |
--charge CHARGE |
0 |
Required total electric charge of the two-particle system. |
--status S [S ...] |
0 |
PDG status codes to include: 0 = well-established, 1 = evidence but unconfirmed, 2 = omitted from summary tables. |
--unique-pairs |
off | Show each particle pair only once (keeping the lowest L), instead of one entry per valid L. |
Flavor conservation flags (all optional, independent):
| Flag | Description |
|---|---|
--u N |
Required net u-quark number of the pair (#u − #ū) |
--d N |
Required net d-quark number of the pair (#d − #d̄) |
--s N |
Required net s-quark number of the pair (#s − #s̄) |
--c N |
Required net charm of the pair (#c − #c̄) |
--b N |
Required net bottomness of the pair (#b − #b̄) |
Only the flags you provide are enforced. Omit a flag to leave that flavor unconstrained. Pairs involving particles with undefined quark content (e.g. η, ω — mixed states like uū+dd̄) are excluded when any flavor flag is set.
Examples
Find all 1⁻ channels with threshold between 250 and 300 MeV (the ρ region):
$ python3 -m threshold_finder.cli 250 300 1 -1
Thresholds for J^P = 1^- in [250.0, 300.0] MeV (max L = ∞)
Found 1 combination(s):
pi+ + pi- threshold=279.1 MeV L=1 J^P=1^-
Find 1⁻ channels near 1 GeV with full flavor conservation (all net quark numbers = 0):
$ python3 -m threshold_finder.cli 900 1100 1 -1 --u 0 --d 0 --s 0 --c 0 --b 0 --unique-pairs
Thresholds for J^P = 1^- in [900.0, 1100.0] MeV (max L = ∞) flavor: u=+0, d=+0, s=+0, c=+0, b=+0
Found 4 combination(s):
pi+ + rho(770)- threshold=914.7 MeV L=1 J^P=1^-
pi- + rho(770)+ threshold=914.7 MeV L=1 J^P=1^-
K+ + K- threshold=987.4 MeV L=1 J^P=1^-
K0 + K~0 threshold=995.2 MeV L=1 J^P=1^-
Constrain only strangeness (leave u/d free) to find kaonic channels:
$ python3 -m threshold_finder.cli 600 700 0 -1 --s -1 --unique-pairs
Thresholds for J^P = 0^- in [600.0, 700.0] MeV (max L = ∞) flavor: s=-1
Found 4 combination(s):
pi0 + K(L)0 threshold=632.6 MeV L=0 J^P=0^-
...
Find open-charm 1⁻ thresholds near ψ(3770) with net zero flavor:
$ python3 -m threshold_finder.cli 3700 3900 1 -1 --u 0 --d 0 --s 0 --c 0 --b 0 --unique-pairs
...
D0 + D~0 threshold=3729.7 MeV L=1 J^P=1^-
D+ + D- threshold=3739.3 MeV L=1 J^P=1^-
...
D0 + D*(2007)~0 threshold=3871.7 MeV L=1 J^P=1^-
...
Find 2⁺ channels with threshold 500–700 MeV, restricting to L ≤ 2:
$ python3 -m threshold_finder.cli 500 700 2 +1 --max-L 2 --unique-pairs
Thresholds for J^P = 2^+ in [500.0, 700.0] MeV (max L = 2)
Found 7 combination(s):
pi0 + K(L)0 threshold=632.6 MeV L=2 J^P=2^+
...
Python API
from threshold_finder import ThresholdFinder, FlavorFilter
finder = ThresholdFinder(
mass_min=900,
mass_max=1100,
J_target=1,
P_target=-1,
max_L=None, # None = automatic
total_charge=0.0,
flavor_filter=FlavorFilter(u=0, d=0, s=0, c=0, b=0), # all net quark numbers = 0
status_filter=(0,), # established particles only
)
result = finder.run()
print(result) # formatted summary
for c in result.combinations:
print(c.particle1, "+", c.particle2, " L =", c.L, " threshold =", c.threshold, "MeV")
Constrain only specific flavors by omitting the rest:
# Only require net charm = 0; u, d, s, b are unconstrained
flavor_filter=FlavorFilter(c=0)
# Only require net strangeness = -1
flavor_filter=FlavorFilter(s=-1)
ThresholdResult has the fields J_target, P_target, mass_min, mass_max, max_L, flavor_filter, and combinations (a list of CombinationResult).
Each CombinationResult contains:
| Field | Type | Description |
|---|---|---|
particle1 |
str |
PDG name of the first particle |
particle2 |
str |
PDG name of the second particle |
mass1 |
float |
Mass of particle 1 (MeV) |
mass2 |
float |
Mass of particle 2 (MeV) |
threshold |
float |
Combined threshold mass = m₁ + m₂ (MeV) |
charge1 |
float |
Charge of particle 1 |
charge2 |
float |
Charge of particle 2 |
J1, J2 |
float |
Spins of the two particles |
P1, P2 |
int |
Parities of the two particles |
L |
int |
Orbital angular momentum |
J_total |
float |
Total angular momentum (= J_target) |
P_total |
int |
Total parity (= P_target) |
identical |
bool |
Whether the two particles are identical |
Physics
The tool checks whether a pair (particle 1 with J₁^P₁, particle 2 with J₂^P₂) in a state of orbital angular momentum L can produce the target J^P:
Parity:
P_total = P₁ · P₂ · (-1)^L
Angular momentum: J_total must be reachable by coupling J₁ ⊗ J₂ ⊗ L via the triangle rule.
Identical bosons: For two identical bosons (e.g. π⁰π⁰), the spatial wave function must be symmetric under exchange, which requires L to be even.
Flavor conservation: Net quark numbers are computed as #quark − #antiquark for each flavor (u, d, s, c, b). They are additive: the net quark number of the pair is the sum of the two individual net quark numbers. Setting a flavor to 0 requires the pair to have no net quark content in that flavor (e.g. K⁺K⁻ passes s=0 since K⁺ has s=−1 and K⁻ has s=+1). Particles with mixed or superposition quark content (η, ω, φ, π⁰, …) have undefined quark numbers and are excluded from any result when a flavor constraint is active.
Particle data (masses, J, P, charge, quark content) are read from the PDG via the particle package. Only hadrons with known mass, J, and P are considered.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file thresholds-0.1.0.tar.gz.
File metadata
- Download URL: thresholds-0.1.0.tar.gz
- Upload date:
- Size: 13.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
697630328fe8f70da38a3be10b11712bd02649cc012322a06e4e09d40d8e2cc0
|
|
| MD5 |
5dbe634131c175ae7ff5f42448d5112a
|
|
| BLAKE2b-256 |
3d6cf5ac1cb491476e7837fba5a85ce3e0cc702f4c235f52f61a0ce10c9b994f
|
Provenance
The following attestation bundles were made for thresholds-0.1.0.tar.gz:
Publisher:
publish.yml on KaiHabermann/ThresholdFinder
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
thresholds-0.1.0.tar.gz -
Subject digest:
697630328fe8f70da38a3be10b11712bd02649cc012322a06e4e09d40d8e2cc0 - Sigstore transparency entry: 1350243265
- Sigstore integration time:
-
Permalink:
KaiHabermann/ThresholdFinder@3c65c1e9f224f4905172f06eb164c218a74a0b24 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/KaiHabermann
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@3c65c1e9f224f4905172f06eb164c218a74a0b24 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file thresholds-0.1.0-py3-none-any.whl.
File metadata
- Download URL: thresholds-0.1.0-py3-none-any.whl
- Upload date:
- Size: 12.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e377ae3c27fdfb2932b5fdc96964c71f999238047159b0b1a479c5ac55161700
|
|
| MD5 |
8b122460f5e42ef7908ca457b9818b7f
|
|
| BLAKE2b-256 |
6dd8aa4afe003b02f06d25bc1cbe4cafa2404e25a01fa0a423271bea3972fa00
|
Provenance
The following attestation bundles were made for thresholds-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on KaiHabermann/ThresholdFinder
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
thresholds-0.1.0-py3-none-any.whl -
Subject digest:
e377ae3c27fdfb2932b5fdc96964c71f999238047159b0b1a479c5ac55161700 - Sigstore transparency entry: 1350243387
- Sigstore integration time:
-
Permalink:
KaiHabermann/ThresholdFinder@3c65c1e9f224f4905172f06eb164c218a74a0b24 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/KaiHabermann
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@3c65c1e9f224f4905172f06eb164c218a74a0b24 -
Trigger Event:
workflow_dispatch
-
Statement type: