psf.base

Base PSF Module

This module provides a base class for Point Spread Function (PSF) calculations.

Kramer Harrison, 2025

Functions

replace_nonpositive(image[, min_value])

Replace values <= 0 in the image with the smallest positive value in the image.

Classes

BasePSF(optic, field, wavelength[, ...])

Base class for Point Spread Function (PSF) calculations.

class BasePSF(optic: Optic, field: Field, wavelength: str | float, num_rays=128, strategy='chief_ray', remove_tilt=True, **kwargs)[source]

Base class for Point Spread Function (PSF) calculations.

Parameters:
  • optic (Optic) – The optical system.

  • field (tuple) – The field as (x, y) at which to compute the PSF.

  • wavelength (str | float) – The wavelength of light. Can be ‘primary’ or a float value.

  • num_rays (int, optional) – The number of rays used for wavefront computation. Defaults to 128.

  • strategy (str) – The calculation strategy to use. Supported options are “chief_ray”, “centroid_sphere”, and “best_fit_sphere”. Defaults to “chief_ray”.

  • remove_tilt (bool) – If True, removes tilt and piston from the OPD data. Defaults to True.

  • **kwargs – Additional keyword arguments passed to the strategy.

psf

The computed PSF. This should be set by subclasses.

Type:

ndarray

view(projection='2d', log=False, figsize=(7, 5.5), threshold=0.05,

num_points=128): Visualizes the PSF.

static fit_and_remove_tilt(data: WavefrontData, remove_piston: bool = False, ridge: float = 1e-12) be.ndarray

Removes piston and tilt from OPD data using weighted least squares.

Parameters:
  • data (WavefrontData) – The wavefront data containing pupil coordinates and OPD.

  • remove_piston (bool, optional) – If True, removes piston term as well as tilt. Defaults to False.

  • ridge (float, optional) – Small diagonal regularization for stability. Defaults to 1e-12.

Returns:

OPD with piston and tilt removed, shape (N,).

Return type:

opd_detrended (be.ndarray)

get_data(field: tuple[float, float], wl: float) WavefrontData

Retrieves precomputed wavefront data for a field and wavelength.

Parameters:
  • field (tuple[float, float]) – The field coordinates, or a FieldPoint.

  • wl (float) – The wavelength in µm, or a WavelengthPoint.

Returns:

A data container with the computed wavefront results.

Return type:

WavefrontData

strehl_ratio()[source]

Computes the Strehl ratio of the PSF.

The Strehl ratio is the ratio of the peak intensity of the aberrated PSF to the peak intensity of the diffraction-limited PSF. Assumes self.psf is normalized such that its peak would be 1.0 (or 100%) for a diffraction-limited system.

Returns:

The Strehl ratio.

Return type:

float

Raises:

RuntimeError – If the PSF has not been computed.

view(fig_to_plot_on: Figure | None = None, projection: str = '2d', log: bool = False, figsize: tuple = (7, 5.5), threshold: float = 0.05, num_points: int = 128) tuple[Figure, Axes][source]

Visualizes the PSF.

Parameters:
  • projection (str, optional) – The projection type. Can be ‘2d’ or ‘3d’. Defaults to ‘2d’.

  • log (bool, optional) – Whether to use a logarithmic scale for the intensity. Defaults to False.

  • figsize (tuple, optional) – The figure size. Defaults to (7, 5.5).

  • threshold (float, optional) – The threshold for determining the bounds of the PSF for zoomed view. Defaults to 0.05.

  • num_points (int, optional) – The number of points used for interpolating the PSF for smoother visualization. Defaults to 128.

Returns:

A tuple containing the figure and axes objects.

Return type:

tuple

Raises:
  • RunentimeError – If the PSF has not been computed.

  • ValueError – If the projection is not ‘2d’ or ‘3d’.

  • RuntimeError – If the PSF has not been computed by the subclass.

replace_nonpositive(image, min_value=1e-09)[source]

Replace values <= 0 in the image with the smallest positive value in the image. If no positive value exists, use min_value.

Parameters:
  • image – Array (backend or numpy) to process.

  • min_value – Value to use if no positive values exist (default: 1e-9).

Returns:

Array with non-positive values replaced.