ChangeLog
V0.15.0
Wavefront
- Replaced stored
amplitude and phase with a stored complex phasor.
amplitude, phase, real, imaginary, complex, polar, power, and psf are now derived from phasor.
psf now returns the current-plane intensity, abs(phasor) ** 2.
- Constructor signature changed to
Wavefront(wavelength, npixels, ...).
- Initialisation now accepts exactly one of
diameter or pixel_scale.
- Added optional 1D
center metadata and spec / xs helpers.
- Added
Wavefront.from_phasor(...), Wavefront.to_psf(), and Wavefront.set_spec(...).
coordinates is now a method and supports optional scaling and polar output.
- Arithmetic operators now act directly on the complex field.
+ no longer means “add OPD”; use add_opd(...).
* no longer applies optical layers; layers are called explicitly.
- Added
-, /, and in-place variants for wavefront arithmetic.
add_phase(...) and add_opd(...) now multiply by complex phase factors.
tilt(...) now supports angular unit conversion via unit=....
normalise(...) now supports mode="power" and mode="peak".
flip, resize, rotate, and scale_to now operate on the complex field by default.
Coordinates and Sampling
- Added
Spec, PadSpec, and CoordSpec objects for sampling metadata.
CoordSpec provides xs, fov, and extent.
pixel_coords(...) now accepts exactly one of diameter, radius, or pixel_scale.
pixel_coords(...) added FFT-style centering via fft_style=True.
nd_coords(...) has stricter casting and validation for pixel counts, scales, offsets, and indexing.
- Added
DistortedCoords transformation using the existing polynomial distortion utilities.
Propagation
- FFT and MFT propagation now operate on
phasor.
- Fourier transform sign convention changed.
- FFT propagation now tracks output sampling through
CoordSpec.
- FFT propagation added support for inverse propagation, explicit centering, padding, cropping, and phase-ramp correction.
- MFT propagation added inverse propagation support.
- Removed
ShiftedMFT and FarFieldFresnel from the standard propagator layer API.
- Added ABCD/LCT propagation infrastructure:
ABCDElement
ABCDFreeSpace
ABCDLens
ABCDMirror
ABCDConjugatePlane
ABCDPropagator
MFTPropagator
FFTPropagator
ASMPropagator
- Added placeholder
Fraunhofer and Fresnel ABCD propagator classes.
Optical Systems
- Added
ParametricOpticalSystem.
- Added
fov = psf_npixels * psf_pixel_scale.
- Added
initialise_wavefront(...) to layered optical systems.
- Added
debug_propagate_mono(...) for collecting intermediate wavefronts.
- Optical systems now apply layers via
layer(wavefront).
return_wf=True and return_psf=True are now mutually exclusive.
- Polychromatic propagation now weights phasors by
sqrt(weight) before summing intensities.
- Offsets are now normalised internally from
None to a (2,) zero vector.
- Layer attribute lookup now searches both layer keys and layer attributes.
Layers
- Layer interface moved from
.apply(...) to __call__(...).
.apply(...) remains as a compatibility alias on base layer classes.
- Added
Lambda, a no-op unified layer.
- Added
FourierBasis, an optical OPD layer using cached real Fourier kernels.
TransmissiveLayer, AberratedLayer, BasisLayer, Tilt, and Normalise now use __call__.
AberratedLayer and BasisLayer now apply OPD explicitly through add_opd(...).
- Unified
Resize, Rotate, and Flip now operate through __call__.
Apertures
- Refactored aperture layers around
ApertureLayer, BaseDynamicAperture, and DynamicAperture.
- Apertures now multiply the wavefront phasor by their transmission.
- Dynamic apertures now use
wavefront.coordinates() and wavefront.pixel_scale.
- Added/standardised
extent and nsides properties for dynamic apertures.
- Improved transformation type checking and missing-attribute errors.
Sources and Spectra
- Added shared validation for return modes, wavelength arrays, spectra, and 2D positions.
- Sources reject simultaneous
return_wf=True and return_psf=True.
Spectrum now supports 2D weights with wavelength shape checked on the trailing axis.
- Binary and point-resolved sources now infer default weight arrays from wavelengths or spectra.
- Resolved-source models now explicitly reject
return_wf=True because convolution destroys coherent wavefront information.
- Composite source outputs now construct
PSF objects consistently when return_psf=True.
- Source and scene attribute errors are more explicit.
Detectors and PSFs
- Added
BaseDetector.
LayeredDetector is now callable; .model(...) delegates to __call__(...).
- Detector layers now use
__call__; .apply(...) remains as a compatibility alias.
- Detector attribute lookup now searches layer keys and layer attributes.
ApplyJitter now takes sigma in pixels, adds oversample, and removes pixel-scale dependence.
- Detector kernels and downsampling factors now validate positive integer sizes.
- PSF arithmetic now uses a unified implementation over
.data.
- PSF arithmetic now supports
+, -, *, /, None, arrays, scalars, and other PSF objects.
Utilities
- Added generic angular conversion helpers:
unit_factor_to_rad(...)
convert(...)
- Existing angular conversions now use the generic conversion backend.
- Angular units now support aliases and SI-style prefixes such as
mas, mrad, and uarcsec.
- Added n-dimensional
gaussian(...).
- Added
mv_gaussian(...) stub that currently raises NotImplementedError.
- Fixed
factorial(0).
- Updated
nandiv(...) to avoid evaluating division by zero under JAX NaN debugging.
- Added
soft_binarise(...) using the CLIMB-style soft binarisation algorithm.
- Added
utils.norms with NaN-safe norm functions, including peak-to-valley support and mask broadcasting.
- Added static aperture builders:
circular_aperture(...)
segmented_aperture(...)
sparse_aperture(...)
hst_like(...)
jwst_like(...)
euclid_like(...)
- Static aperture builders can optionally return support masks for basis normalisation.
- Added cached real Fourier basis helpers:
fourier_kernel_1d(...)
fourier_kernels(...)
eval_fourier_basis(...)
- Added
fft_spec(...) and fft_phase_ramp(...) helpers.
Zernikes and Basis Evaluation
- Added caching for static Zernike components.
- Updated Zernike code for safe
factorial(0) behaviour.
- Added cached Fourier-basis evaluation support for the new
FourierBasis layer.
Public API and Internals
- Added centralised export helpers in
_exports.py.
- Top-level and subpackage exports now follow module
__all__.
- Added public exports for new coordinate specs, aperture utilities, norm utilities, ABCD propagators,
Lambda, and FourierBasis.
- Standardised imports around
zodiax as zdx and equinox as eqx.
- Modernised type hints to
| unions.
- Removed dead imports and legacy compatibility shims.
- Improved error messages across wavefronts, sources, detectors, apertures, coordinates, and transformations.