Skip to content

Quick Start

Everything below assumes you have an SED_Tools-built atmosphere grid and a set of filter files on disk — see Installation.

Load a grid and filters

from sed_model import load_grid, load_filters

grid = load_grid("/path/to/Kurucz2003all/")
filters = load_filters([
    "/path/to/filters/GAIA/G.dat",
    "/path/to/filters/2MASS/J.dat",
])

To use the Vega magnitude system, supply a Vega reference SED when loading filters. Without it only the AB and ST systems are available, and asking for Vega raises ValueError:

filters = load_filters(
    ["/path/to/filters/GAIA/G.dat"],
    vega_sed_path="/path/to/stellar_models/vega_flam.csv",
)

Forward model: parameters → magnitudes

from sed_model import run_forward

result = run_forward(
    teff=5777,
    logg=4.44,
    meta=0.0,
    R=6.957e10,      # stellar radius in cm (1 R_sun)
    d=3.086e19,      # distance in cm (10 pc)
    grid=grid,
    filters=filters,
    mag_system="AB",
)

print(result.magnitudes)   # {'G': ..., 'J': ...}
print(result.bol_mag)      # bolometric magnitude

If the star falls in a grid cell that touches a node with no model, run_forward emits a UserWarning and the numbers it returns there should not be trusted; see Forward Model.

All lengths are cgs (cm); the convenience constants RSUN_TO_CM and PC_TO_CM are exported:

from sed_model import RSUN_TO_CM, PC_TO_CM

R = 1.0 * RSUN_TO_CM
d = 10.0 * PC_TO_CM

Inverse model: magnitudes → posterior

from sed_model import run_inverse

posterior = run_inverse(
    obs_magnitudes=[5.03, 4.17],
    obs_uncertainties=[0.01, 0.02],
    filter_names=["G", "J"],
    R=6.957e10,
    d=3.086e19,
    grid=grid,
    filters=filters,
    mag_system="AB",
    n_walkers=32,
    n_steps=1000,
    n_burn=300,
    seed=42,
)

posterior.print_summary()
posterior.save("posterior.npz")

By default this samples Teff, logg, and [M/H] across the full grid with flat priors, holding Av = 0 and the supplied distance fixed. Check posterior.converged before trusting the intervals; see Diagnostics. To change which parameters are sampled, pass a FitParams:

from sed_model import fit_params_from_grid

params = fit_params_from_grid(
    grid,
    a_v=(0.0, 2.0),   # Av free, flat prior over [0, 2] mag
    d_cm=3.086e19,    # distance fixed
)

posterior = run_inverse(
    obs_magnitudes=[5.03, 4.17],
    obs_uncertainties=[0.01, 0.02],
    filter_names=["G", "J"],
    R=6.957e10,
    grid=grid,
    filters=filters,
    fit_params=params,
)

Add extinction to the forward model

from sed_model import make_extinction_model

ext = make_extinction_model(
    enabled=True,
    law="fitzpatrick99",
    a_v=0.3,
    r_v=3.1,
)

reddened = run_forward(
    teff=5778, logg=4.44, meta=0.0,
    R=6.957e10, d=3.086e19,
    grid=grid, filters=filters,
    extinction=ext,
)

See the Extinction guide for the six supported laws and the conventions used.

Next steps

The Demonstrations section walks through complete, runnable scripts covering each of these workflows end to end, including posterior corner plots and multi-scenario comparisons.