Skip to main content

Unified liNe Integration Turbo Engine

Project description

unite — Unified liNe Integration Turbo Engine

PyPI Python GPLv3 license Tests codecov Documentation DOI

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_super uniform fine-grid points per pixel + banded wavelength-varying Gaussian convolution, correctly computes LSF ⊗ [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 samplerModelBuilder returns (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.

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

unite-3.3.1.tar.gz (1.4 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

unite-3.3.1-py3-none-any.whl (242.3 kB view details)

Uploaded Python 3

File details

Details for the file unite-3.3.1.tar.gz.

File metadata

  • Download URL: unite-3.3.1.tar.gz
  • Upload date:
  • Size: 1.4 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for unite-3.3.1.tar.gz
Algorithm Hash digest
SHA256 3f045ef2932d5aaf47538418fc64fcaab258d60d084c9007e17f5d1497f53920
MD5 79c109a647a52525f8494f8f9baf24f6
BLAKE2b-256 ea7687b2d8bdfd5dde5e11c08b67605f95392596b3dbdd090a03935262df0dce

See more details on using hashes here.

Provenance

The following attestation bundles were made for unite-3.3.1.tar.gz:

Publisher: publish.yml on TheSkyentist/unite

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file unite-3.3.1-py3-none-any.whl.

File metadata

  • Download URL: unite-3.3.1-py3-none-any.whl
  • Upload date:
  • Size: 242.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for unite-3.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 0a235c32fb8c3cf255e67ba0d5aafb561f126d961a47a4e61bbd5d2cca697bc9
MD5 8d2a11c342ace437bf004bfe701c07dd
BLAKE2b-256 323f647dec17126cb921bdce3a62799ba028803f4f0d98ea9eb80484149d577f

See more details on using hashes here.

Provenance

The following attestation bundles were made for unite-3.3.1-py3-none-any.whl:

Publisher: publish.yml on TheSkyentist/unite

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page