A community-developed toolkit for Nancy Grace Roman Space Telescope WFI grism data: from count-rate images to calibrated spectra, redshifts, emission-line maps and kinematic stamps for every source in the field. An open-source release is coming soon.
Background: a simulated Roman G150 grism exposure. Every streak is the spectrum of one galaxy or star. (Simulation: Wang et al. 2022)
Learn more
The Roman Wide Field Instrument carries a slitless G150 grism covering 1.00–1.93 μm at a wavelength-dependent resolving power of R = 461 λ/μm (about 460–890 across the band). Every exposure records the spectrum of every source on 18 detectors at once, with no target pre-selection. This spectroscopy is a core component of the High-Latitude Wide-Area Survey, which will measure redshifts from Hα (z = 0.5–1.9), [O III] (z = 1.0–2.9) and [O II] (z = 1.7–4.2) over thousands of square degrees.
RomanXYZ reduces these data. It starts from count-rate (L2) images and produces source catalogs, flux-calibrated 2-D and 1-D spectra with exact error and covariance propagation, contamination models, emission-line redshifts, emission-line maps, and per-exposure kinematic stamps for rotation-curve and kinematic-lensing studies. The step sequence, products and command-line interface follow the JWST/NIRCam slitless reduction I wrote for the SAPPHIRES survey, adapted to Roman. Traces and sensitivities come from the roman_disperser optical model.
One command, romanxyz reduce, runs the full chain. Every step writes a status table and can be re-run on its own.
One detector (SCA 9) of the Wang et al. (2022) simulation through the pipeline: 8,025 sources → 5,924 spectra → 2,735 with an emission line at S/N ≥ 5. The galaxy shown has Hβ, [O III] and Hα at z = 1.497.
2-D spectra for every exposure, every roll angle and the combined coadd, with weights, covariances, contamination and continuum-subtracted planes. Each exposure carries its sky orientation and trace Jacobian.
Exact noise and covariance propagation from pixels to 1-D spectra, a contamination model with its own uncertainty, and per-exposure wavelength uncertainties from the trace zero point and source position.
Emission-line redshifts with probabilities, an EAZY photo-z prior from Roman imaging, emission-line maps on the sky, and kinematic stamps that drop into any kinematics code.

For every emission line in every exposure, RomanXYZ writes a native-pixel cutout with its variance, contamination and continuum models, the PSF at the line and the full sky-to-pixel map, including the trace distortion. A simulated sheared rotating disk is fit directly in detector pixels in four exposures at two roll angles, leaving noise-like residuals.

Each exposure's line stamp is mapped back to the sky with its own geometry, and the exposures from both rolls are combined. The result is a resolved Hα image of every emitter, for sizes and morphologies. Simulated disks recover 0.88–0.96 of the true flux within 2″.
Injection tests with exact truth, full-field roman_disperser pointings at two roll angles, the Wang et al. (2022) simulations, and a sheared rotating-disk set for kinematic lensing.
| 1.00 | Noise arrays: (noisy − noiseless) / error has unit scatter for 2-D pixels (1.000) and 1-D spectra (1.01–1.02) |
|---|---|
| 0.007 px | Per-exposure wavelength zero point (+0.07 Å), with no trend with sub-pixel source position |
| 94% | Continuum flux recovered by optimal extraction for both point sources and disks (the rest is PSF light beyond 1.1″) |
| 97% | Redshift purity for clean, high-probability sources, from only 2 × 301 s exposures, using line templates and a photo-z prior |
RomanXYZ is written in Python and installs with pixi. The quick-start example simulates one detector at two roll angles and runs the whole chain in about a minute. An open-source release is coming soon.
pixi install && pixi run hydrate && pixi run test pixi run hydrate-sim --sca 9 pixi run python examples/quickstart/run_quickstart.py # a larger test: six dithered exposures with injected lines pixi run python scripts/validation/make_injection_sim.py ../test_data/inject pixi run romanxyz reduce --config configs/inject.yaml --n-workers 8
Status: early development (v0.1), tested on simulations. Interfaces and product formats may still change. The open-source release will use the MIT License; contributions and feedback from the Roman community are welcome.
GitHub: open release soon Contact me to join as an early user