skyscapes
JAX-native astrophysical scene modeling for HWO direct imaging.
What skyscapes is
skyscapes provides the scene representation that downstream HWO
simulation tools consume — a forward model that runs at variable
fidelity, from analytic sandbox models for fast iteration up to
research-grade physics for retrievals. High-fidelity scene generators
like ExoVista feed into
skyscapes through loaders (from_exovista); skyscapes does not try to
replace them.
- A
Sceneis "everything on the sky that the telescope sees" — oneSystem(a star with planets and optionally a disk) plus optional background sources (zodiacal light, background galaxies, etc.). - Source models (
Star,Planet,Disk, physical models, backgrounds) are composableeqx.Modules — swap any one without touching the rest, or swap the whole class for a higher-fidelity variant. - Loaders bridge external simulation outputs (ExoVista FITS) into the
workspace via
from_exovista(...).
The same Scene flows through both the
coronagraphoto image
simulator and the jaxEDITH
ETC, so the astrophysical content is consistent across all downstream
science products.
What skyscapes is not
- Not a radiative transfer engine. The
ExoJaxPhysicalModelis a thin adapter over ExoJAX; skyscapes does not implement its own RT. - Not an orbit propagator. Orbital mechanics live in
orbix;
Planetcomposes anAbstractOrbitrather than reimplementing one. - Not a simulator. Downstream tools
(coronagraphoto,
jaxEDITH) consume a
Sceneto produce images / count rates.
Ecosystem position
flowchart LR
src["External sources<br/>ExoVista · spectra · catalogues"]
sky(["<b>skyscapes</b><br/>Scene · System · Star · Planet · Disk · Zodi · PhysicalModel"])
opt["<b>optixstuff</b><br/>OpticalPath"]
cor["<b>coronagraphoto</b><br/>2D image simulation"]
jet["<b>jaxedith</b><br/>Scalar count rates"]
src --> sky
sky --> cor
sky --> jet
opt --> cor
opt --> jet
Architecture
A Scene composes a System (star + planets + optional disk) with an
optional Zodi background:
- Stars —
Star(wavelength- and time-dependent spectrum, ExoVista- backed) andFlatStar(constant-flux sandbox). - Planets —
Planetowns intrinsic params (Rp_Rearth,Mp_Mearth) and composes anAbstractOrbit(from orbix) with anAbstractPhysicalModel. - Physical models —
LambertianPhysicalModel,GridPhysicalModel(interpolated contrast cubes, used by ExoVista loader),PrecomputedPhysicalModel(cached reflectivity for hot loops), andExoJaxPhysicalModel(full 2-stream RT via ExoJAX). - Disks —
ExovistaDisk,ExovistaParametricDisk,GraterDisk,CompositeDisk. - Backgrounds —
AYOZodi(AYO-convention defaults),LeinertZodi(full position-dependent Leinert+1998),PrecomputedZodi(cached flux array).
Every leaf is an eqx.Module PyTree, so JAX transforms (jit, vmap,
grad) compose end-to-end.
Quick start
The easiest path is loading an ExoVista FITS file:
from skyscapes import from_exovista
scene = from_exovista("path/to/exovista_system.fits")
Building one from scratch:
import jax.numpy as jnp
from orbix.orbit import KeplerianOrbit
from skyscapes import Scene, System
from skyscapes.scene import FlatStar, Planet
from skyscapes.physical_model import LambertianPhysicalModel
from skyscapes.background import AYOZodi
star = FlatStar(
Ms_kg=1.989e30,
dist_pc=10.0,
flux_phot_per_nm_m2=1e9,
)
orbit = KeplerianOrbit(
a_AU=jnp.array([1.0]),
e=jnp.array([0.0]),
W_rad=jnp.array([0.0]),
i_rad=jnp.array([jnp.pi / 3]),
w_rad=jnp.array([0.0]),
M0_rad=jnp.array([0.0]),
t0_d=jnp.array([0.0]),
)
physical_model = LambertianPhysicalModel(Ag=jnp.array([0.3]))
planet = Planet(
Rp_Rearth=jnp.array([1.0]),
Mp_Mearth=jnp.array([1.0]),
orbit=orbit,
physical_model=physical_model,
)
zodi = AYOZodi(
wavelengths_nm=jnp.linspace(400, 1000, 60),
surface_brightness_mag=22.0,
)
scene = Scene(
system=System(star=star, planets=(planet,)),
zodi=zodi,
)
Installation
pip install skyscapes
Status
This package is in early development.
Metadata
Release files for skyscapes 1.6.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| skyscapes-1.6.1.tar.gz | 98.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| skyscapes-1.6.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 217.1 kB
Release files / skyscapes-1.6.1.tar.gz
| Download URL | skyscapes-1.6.1.tar.gz |
|---|---|
| Size | 98.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
766b2fe7fc2a9590abeb00fd730a26febc322522e444e09c3e36bdf789afd484
|
|
BLAKE2b-256 checksum How to use checksums |
95d6a1db20471ee95395f611815886a69bbebb07fa89d2de895635e21dd36749
|
| 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 Oct 12, 2026.
Transparency logRelease files / skyscapes-1.6.1-py3-none-any.whl
| Download URL | skyscapes-1.6.1-py3-none-any.whl |
|---|---|
| Size | 118.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
6c1d843fcf2759d96a21e348ac00540f3ca149a14e32b78c821c1a49c7651c61
|
|
BLAKE2b-256 checksum How to use checksums |
7eaf484a87286a938eba1fbc368fedd235130507cff45b733085c7eeb51f18ce
|
| 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 Oct 12, 2026.
Transparency log