Skip to main content

Tests action GitHub license PyPI version PyPI pyversions Code style

Introduction to PyValem

PyValem is a Python package for parsing, validating, manipulating and interpreting the chemical formulas, quantum states and labels of atoms, ions and small molecules.

Species and states are specified as strings using a simple and flexible syntax, and may be compared, output in different formats and manipulated using a variety of predefined Python methods.

Installation:

The PyValem package can be installed either from PyPI using pip

python3 -m pip install pyvalem

or from the source by running the following from the project source directory.

python3 -m pip install .

Examples:

Formula

The basic (state-less) chemical formulas are represented by the Formula class. A Formula object is instantiated from a valid formula string and supports ions, isotopologues, as well as a few special species. The object contains attributes with its HTML and LaTeX representations, and its molar mass.

>>> from pyvalem.formula import Formula

>>> # neutral formulas:
>>> Formula('C2H5OH')
C2H5OH

>>> # isotopes:
>>> Formula('(14C)')
(14C)

>>> # ions
>>> [Formula('H3O+'), Formula('(1H)(2H)+'), Formula('Co(H2O)6+2')]
[H3O+, (1H)(2H)+, Co(H2O)6+2]

>>> # special species
>>> [Formula('e-'), Formula('hv')]
[e-, hν]

>>> # formula attributes:
>>> Formula('Ar+2').charge
2

>>> Formula('H2(18O)').html
'H<sub>2</sub><sup>18</sup>O'

>>> print(Formula('H2(18O)').latex)
\mathrm{H}_{2}{}^{18}\mathrm{O}

>>> Formula('(235U)').mass
235.04392819

“Stateful” Species

The “stateful” species represent species with (or without) any number of states attached. The StatefulSpecies object can be instantiated from a valid string, which consist of a valid Formula string, followed by a whitespace, followed by a semicolon-delimited sequence of valid State strings. PyValem supports several different types of state notation. For further information on valid PyValem State strings, consult the documentation.

Examples:

>>> from pyvalem.stateful_species import StatefulSpecies

>>> stateful_species = StatefulSpecies('Ne+ 1s2.2s2.2p5; 2P_1/2')
>>> stateful_species.formula
Ne+

>>> type(stateful_species.formula)
<class 'pyvalem.formula.Formula'>

>>> stateful_species.states
[1s2.2s2.2p5, 2P_1/2]

>>> state1, state2 = stateful_species.states
>>> type(state1)
<class 'pyvalem.states.atomic_configuration.AtomicConfiguration'>

>>> state1.orbitals
[1s2, 2s2, 2p5]

>>> type(state2)
<class 'pyvalem.states.atomic_term_symbol.AtomicTermSymbol'>

>>> state2.L, state2.J
(1, 0.5)

As Formula, also StatefulSpecies have html and latex attributes.

>>> print(stateful_species.latex)
\mathrm{Ne}^{+} \; 1s^{2}2s^{2}2p^{5} \; {}^{2}\mathrm{P}_{1/2}

>>> StatefulSpecies('(52Cr)(1H) 1sigma2.2sigma1.1delta2.1pi2; 6SIGMA+; v=0; J=2').html
'<sup>52</sup>Cr<sup>1</sup>H 1σ<sup>2</sup>.2σ<sup>1</sup>.1δ<sup>2</sup>.1π<sup>2</sup> <sup>6</sup>Σ<sup>+</sup> v=0 J=2'

Reaction

Finally, the Reaction class represents a reaction or a collisional process between species. A Reaction object is instantiated with a string consisting of valid Formula or StatefulSpecies strings delimited by ' + ', and reaction sides separated by ' -> ', such as

>>> from pyvalem.reaction import Reaction
>>> reaction = Reaction('He+2 + H -> He+ 3p1 + H+ + hv')
>>> reaction
He+2 + H → He+ 3p + H+ + hν

>>> reaction.html
'He<sup>2+</sup> + H → He<sup>+</sup> 3p + H<sup>+</sup> + hν'

>>> print(reaction.latex)
\mathrm{He}^{2+} + \mathrm{H} \rightarrow \mathrm{He}^{+} \; 3p + \mathrm{H}^{+} + h\nu

The Reaction class also watches out for charge balance and stoichiometry conservation during instantiation.

>>> Reaction('(2H) + (3H) -> (4He)')
Traceback (most recent call last):
...
pyvalem.reaction.ReactionStoichiometryError: Stoichiometry not preserved for reaction: (2H) + (3H) -> (4He)

>>> Reaction('e- + Ar -> Ar+ + e-')
Traceback (most recent call last):
...
pyvalem.reaction.ReactionChargeError: Charge not preserved for reaction: e- + Ar -> Ar+ + e-

Errors

Every exception that PyValem raises for an invalid formula, state, species or reaction derives from PyValemError, which is itself a ValueError:

>>> from pyvalem import PyValemError
>>> try:
...     Reaction('H2 v=1.5 + O -> OH + H')
... except PyValemError as err:
...     print(type(err).__name__)
VibrationalStateError

More examples

The examples directory has short scripts that check a list of reactions before it goes into a database, and that apply the selection rules for atomic transitions to levels written in PyValem’s notation.

Specification:

The notation that PyValem implements is specified, independently of Python, in spec/notation.md, with test vectors in spec/tests that any implementation of the notation can be checked against.

For Developers:

After cloning or forking the project from its GitHub page, install pyvalem in editable mode into a clean virtual environment, together with its development dependencies (this needs pip 25.1 or later):

python3 -m pip install -e . --group dev

The tests can then be executed by running (from the project root directory)

pytest

The package metadata and all of its dependencies are declared in pyproject.toml.

Docstrings in the project adhere to the numpydoc styling. The project code is linted and formatted by ruff (installed with the dev group). Before submitting a pull request, run

ruff check
ruff format

Metadata

Release files for pyvalem 3.0.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pyvalem 3.0.1
File Size Uploaded Provenance Actions
pyvalem-3.0.1.tar.gz 154.7 kB Without provenance Details for pyvalem-3.0.1.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for pyvalem 3.0.1
File Interpreter ABI Platform Actions
pyvalem-3.0.1-py3-none-any.whl Python 3 none any Details for pyvalem-3.0.1-py3-none-any.whl

Total release size: 262.8 kB

Release files / pyvalem-3.0.1.tar.gz

Download URL pyvalem-3.0.1.tar.gz
Size 154.7 kB
Tags Source
SHA-256 checksum
How to use checksums
44be6ff41e937b1d8b1cdde3ee5da07e7f147199ae05a96774ea6ec16d0b04ec
BLAKE2b-256 checksum
How to use checksums
d90ea28b63ea23ea31fd469d36cc140e0a19662f32a4b641dba90f22167b40e2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / pyvalem-3.0.1-py3-none-any.whl

Download URL pyvalem-3.0.1-py3-none-any.whl
Size 108.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
09f26b0c1fefd01cc9c013881bdbd412d0eebe1d5fea41bb745ae1020d04fc73
BLAKE2b-256 checksum
How to use checksums
6a50298a1bf20b2795fd97194c7a51ff75f307a60c6be06ae1f69085bdea5fc1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Security for pyvalem 3.0.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

3.0.1 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page