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

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.0

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.0
File Size Uploaded Provenance Actions
pyvalem-3.0.0.tar.gz 149.4 kB Without provenance Details for pyvalem-3.0.0.tar.gz

Built distribution (wheel)

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

Total release size: 257.4 kB

Release files / pyvalem-3.0.0.tar.gz

Download URL pyvalem-3.0.0.tar.gz
Size 149.4 kB
Tags Source
SHA-256 checksum
How to use checksums
fb6bd857caaac7b4173ffc897c4bc2a7339c19607cdaaca5cd937f2e829adb26
BLAKE2b-256 checksum
How to use checksums
01844be6650245ea41f984a0db709cb82d42474d4df8322af7ac7eb22e9398d7
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.0-py3-none-any.whl

Download URL pyvalem-3.0.0-py3-none-any.whl
Size 108.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a78b171c1bc46c793d4a4f5c2c2d953d295ad4910ed79d852765ddb369749a24
BLAKE2b-256 checksum
How to use checksums
7f4370e64cbd35c365465e076544e18083acd0fcfe6687d4e1156e33c5e3f061
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.0

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.0 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