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.
- Exact pixel integration of line profiles — fast, memory-efficient, and correct even for undersampled data
- Simultaneous multi-spectrum fitting across gratings and instruments with shared kinematic parameters (redshift, FWHM)
- Multiple line profiles: Gaussian, Voigt, Cauchy, Pseudo-Voigt, Laplace, Gauss-Hermite, Split-Normal
- Flexible continuum models: Linear, Power-Law, Polynomial — 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) and generic spectrographs
pip install uniteOr with Pixi:
pixi add unitefrom unite.line import LineConfiguration, Redshift, FWHM, Flux
from unite.continuum import ContinuumConfiguration
from unite.spectrum import Spectrum, Spectra
from unite.model import ModelBuilder
# Configure lines with shared kinematics
line_config = LineConfiguration(...)
continuum_config = ContinuumConfiguration.from_line_config(line_config)
# Load spectra and build the numpyro model
spectra = Spectra([Spectrum(...)])
model_fn, model_args = ModelBuilder(line_config, continuum_config, spectra).build()
# Run with any NumPyro sampler
import numpyro
from numpyro.infer import MCMC, NUTS
mcmc = MCMC(NUTS(model_fn), num_warmup=500, num_samples=1000)
mcmc.run(jax.random.PRNGKey(0), *model_args)Full documentation, tutorials, and API reference at unite.readthedocs.io.
GPL v2 or later. See LICENSE for details.