unite — Unified liNe Integration Turbo Engine
unite is a Python package for fast, Bayesian inference of emission lines from astronomical spectra. It is built on JAX, NumPyro, and Astropy, and supports fitting multiple spectra simultaneously with shared kinematics, calibration tokens, and flexible priors.
Originally designed for JWST/NIRSpec but extensible to any spectrograph.
What it does
- Two pixel-integration modes: analytic (exact CDF-based, default) and numerical LSF convolution (
n_superuniform fine-grid points per pixel + banded wavelength-varying Gaussian convolution, correctly computesLSF ⊗ [F · exp(-τ · φ_intrinsic)]for absorption lines) - Simultaneous multi-spectrum fitting across gratings and instruments with shared kinematic parameters (redshift, FWHM)
- Multiple line profiles: Gaussian, Cauchy, Pseudo-Voigt, Laplace, SEMG, Gauss-Hermite, Split-Normal, Skew-Normal, Skew-Voigt, Box-Gauss, Gaussian-Split-Laplace (asymmetric EMG)
- Emission and absorption lines: flux-parametrized additive profiles and tau-parametrized multiplicative transmission
exp(-tau * phi), with per-component depth ordering (zorder) so each absorber selectively attenuates only the sources behind it - Flexible continuum models: Linear, Polynomial, Chebyshev, Legendre, Bernstein, B-Spline, Power-Law, DLA Power-Law (UV power law with damped Lyman-alpha absorption and Lyman break), Blackbody, Modified Blackbody, Attenuated Blackbody, Template (user-supplied file) — auto-generated from line configurations
- Calibration tokens (flux scale, resolution scale, pixel offset) with free or fixed priors, shared across spectra
- YAML serialization for reproducible, human-editable configurations
- User-controlled sampler —
ModelBuilderreturns(model_fn, model_args)for use with any NumPyro backend (NUTS, SVI, nested sampling, ...) - Instrument support for JWST/NIRSpec (all gratings + PRISM), SDSS, and any custom spectrograph via generic dispersers
Installation
pip install unite
Or with Pixi:
pixi add unite --pypi
Quick Start
import jax
import astropy.units as u
from numpyro import infer
from unite import line, model, prior
from unite.continuum import ContinuumConfiguration, Linear
from unite.instrument import nirspec
from unite.results import make_parameter_table, make_spectra_tables
from unite.spectrum import Spectra, from_DJA
# 1. Configure lines with shared kinematics
z = line.Redshift('z', prior=prior.Uniform(-0.005, 0.005))
fwhm = line.FWHM('narrow', prior=prior.Uniform(100, 1000))
lc = line.LineConfiguration()
lc.add_line(
'H_alpha',
6563.0 * u.AA,
redshift=z,
fwhm_gauss=fwhm,
flux=line.Flux(prior=prior.Uniform(0, 10))
)
lc.add_line(
'NII_6585',
6585.0 * u.AA,
redshift=z,
fwhm_gauss=fwhm,
flux=line.Flux(prior=prior.Uniform(0, 10))
)
# Tau-parametrized absorption line: transmission = exp(-tau * phi)
lc.add_line(
'HI_abs',
6563.0 * u.AA,
redshift=z,
fwhm_gauss=line.FWHM('abs', prior=prior.Uniform(50, 500)),
tau=line.Tau(prior=prior.Uniform(0, 5))
)
cc = ContinuumConfiguration.from_lines(lc.centers, width=15_000*u.km/u.s, form=Linear())
# 2. Load spectra (NIRSpec example; any instrument works)
g395m = nirspec.G395M()
spec = from_DJA('dja-spectrum.fits', disperser=g395m)
spectra = Spectra([spec], redshift=5.28)
filtered_lines, filtered_cont = spectra.prepare(lc, cc)
spectra.compute_scales(filtered_lines, filtered_cont, error_scale=True)
# 3. Build and run with any NumPyro sampler
# integration_mode='analytic' (default) uses exact CDF integration;
# integration_mode='convolution' convolves intrinsic model with LSF on a fine grid
# (n_super uniform points per pixel) — most accurate for absorption lines
builder = model.ModelBuilder(filtered_lines, filtered_cont, spectra)
model_fn, model_args = builder.build(integration_mode='analytic')
mcmc = infer.MCMC(infer.NUTS(model_fn), num_warmup=500, num_samples=1000)
mcmc.run(jax.random.PRNGKey(0), model_args)
# 4. Extract results
# Get summary statistics at specific percentiles
samples = mcmc.get_samples()
param_table = make_parameter_table(samples, model_args, percentiles=[0.16, 0.5, 0.84])
spectra_tables = make_spectra_tables(samples, model_args, percentiles=[0.16, 0.5, 0.84])
Contributing
Bug reports, feature requests, and pull requests are welcome on GitHub. If you find a bug or have an idea for an improvement, please open an issue — even a brief description is helpful.
Documentation
Full documentation, tutorials, and API reference at unite.readthedocs.io.
Citing
If you use unite in your research, please cite the appropriate software version on Zenodo. If you use the built in NIRSpec LSF data, please also cite the appropriate LSF source (de Graaff et al. 2024 for point, Jakobsen et al. 2022 for uniform).
See CITATION.md for BibTeX entries and full details.
License
GPL v3 or later. See LICENSE for details.
Release files for unite 3.4.7
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| unite-3.4.7.tar.gz | 1.4 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| unite-3.4.7-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 1.7 MB
Release files / unite-3.4.7.tar.gz
| Download URL | unite-3.4.7.tar.gz |
|---|---|
| Size | 1.4 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c24205429c74454c1f1d2c0056e6a394bfe82fe1852fe1faed350f0543a7f514
|
|
BLAKE2b-256 checksum How to use checksums |
972d536af231b4e5f824cbd129158f0d21a32e43bf9bfbbd0b5f8950e0df3b9b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 18, 2026.
Transparency logRelease files / unite-3.4.7-py3-none-any.whl
| Download URL | unite-3.4.7-py3-none-any.whl |
|---|---|
| Size | 244.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
22dd9d496bbb59facfca80c0c7d7abc55d503acda1951e347681ed21fdcbb38a
|
|
BLAKE2b-256 checksum How to use checksums |
c6fcf6ee250851d2b6d88ccfb0e8cf0079adafd774b678200446ab40d3a5ef75
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 18, 2026.
Transparency log