optic.optic

Optic Module

This is the core module of Optiland, which provides the class to define generic optical systems. The Optic class encapsulates the core properties of an optical system, such as the aperture, fields, surfaces, and wavelengths. It also provides methods to draw the optical system, trace rays, and perform paraxial and aberration analyses. Instances of the Optic class are used as arguments to various analysis, optimization, and visualization functions in Optiland.

Optic holds and coordinates:
  • surfaces (SurfaceGroup)

  • aperture, fields, wavelengths, polarization, apodization

  • paraxial analysis (Paraxial)

  • aberration analysis (Aberrations)

  • real ray tracing (RealRayTracer)

  • pickup and solve managers

Kramer Harrison, 2024

Classes

Optic([name])

A class for defining and manipulating optical systems.

class Optic(name: str | None = None)[source]

A class for defining and manipulating optical systems.

The Optic class is central to the Optiland library, providing a comprehensive framework for representing optical systems. It encapsulates essential properties such as aperture, fields of view, constituent surfaces, and operating wavelengths. This class also offers a suite of methods for visualizing the optical system, performing ray tracing, and conducting paraxial and aberration analyses. Instances of Optic are fundamental objects passed to various analysis, optimization, and visualization functions throughout Optiland.

Parameters:

name (str, optional) – An optional name for the optical system. Defaults to None.

name

An optional name for the optical system.

Type:

str | None

aperture

The aperture of the optical system.

Type:

Aperture | None

fields

The group of fields defined for the system.

Type:

FieldGroup

wavelengths

The group of wavelengths used for analysis.

Type:

WavelengthGroup

surfaces

The group of surfaces that make up the optical system.

Type:

SurfaceGroup

paraxial

A helper class for paraxial analysis of the optical system.

Type:

Paraxial

aberrations

A helper class for analyzing aberrations.

Type:

Aberrations

ray_tracer

The ray tracer for performing real ray traces.

Type:

RealRayTracer

polarization

The polarization state of the light. Defaults to ‘ignore’.

Type:

PolarizationState | Literal[‘ignore’]

apodization

The apodization function applied to the entrance pupil.

Type:

BaseApodization | None

pickups

Manages pickups, which link properties of one surface to another.

Type:

PickupManager

solves

Manages solves, which automatically adjust surface properties to meet certain constraints.

Type:

SolveManager

obj_space_telecentric

If True, the system is object-space telecentric. Defaults to False.

Type:

bool

add_field(y: float, x: float = 0.0, vx: float = 0.0, vy: float = 0.0)[source]

Add a field to the optical system.

Deprecated since version Use: optic.fields.add() instead.

Parameters:
  • y – The y-coordinate of the field.

  • x – The x-coordinate of the field. Defaults to 0.0.

  • vx – The x-component of the field’s vignetting factor. Defaults to 0.0.

  • vy – The y-component of the field’s vignetting factor. Defaults to 0.0.

add_surface(new_surface: Surface | None = None, surface_type: SurfaceType = 'standard', comment: str = '', index: int | None = None, is_stop: bool = False, material: str | BaseMaterial = 'air', **kwargs: Unpack[SurfaceParameters])[source]

Adds a new surface to the optic.

Deprecated since version Use: optic.surfaces.add() instead.

Parameters:
  • new_surface (Surface, optional) – The new surface to add. If not provided, a new surface will be created based on the other arguments.

  • surface_type (str, optional) – The type of surface to create.

  • index (int, optional) – The index at which to insert the new surface. If not provided, the surface will be appended to the end of the list.

  • is_stop (bool, optional) – Indicates if the surface is the aperture.

  • material (str, optional) – The material of the surface. Default is ‘air’.

  • **kwargs – Additional keyword arguments for surface-specific parameters such as radius, conic, dx, dy, rx, ry, aperture.

Raises:
  • ValueError – If a new surface is provided and no index is given.

  • IndexError – If the index is out of bounds for insertion, or negative.

add_wavelength(value: float, is_primary: bool = False, unit: WavelengthUnit = 'um', weight: float = 1.0)[source]

Add a wavelength to the optical system.

Deprecated since version Use: optic.wavelengths.add() instead.

Parameters:
  • value (float) – The value of the wavelength.

  • is_primary (bool, optional) – If True, this wavelength is set as the primary wavelength. Defaults to False.

  • unit (WavelengthUnit, optional) – The unit of the wavelength. Defaults to ‘um’.

  • weight (float, optional) – The weight of the wavelength for polychromatic analysis. Defaults to 1.0.

draw(fields: list[tuple[float, float]] | Literal['all'] = 'all', wavelengths: list[float] | Literal['primary'] = 'primary', num_rays: int = 3, distribution: DistributionType | None = None, show_apertures: bool = True, hide_vignetted: bool = False, figsize: tuple[float, float] = (10, 4), xlim: tuple[float, float] | None = None, ylim: tuple[float, float] | None = None, title: str | None = None, reference: ReferenceRay | None = None, projection: Literal['XY', 'XZ', 'YZ'] = 'YZ', ax: Axes | None = None) tuple[Figure, Axes][source]

Draw a 2D representation of the optical system.

Parameters:
  • fields (list[tuple[float, float]] | Literal['all'], optional) – The fields to be displayed, specified by their indices. Defaults to ‘all’.

  • wavelengths (list[float] | Literal['primary'], optional) – The wavelengths to be displayed, specified by their indices. Defaults to ‘primary’.

  • num_rays (int, optional) – The number of rays to trace for each field and wavelength. Defaults to 3.

  • distribution (str | None, optional) – The distribution of rays. Defaults to None, which selects a default based on projection.

  • show_apertures (bool, optional) – If True, overlays aperture graphics on the system view. Defaults to True.

  • hide_vignetted (bool, optional) – If True, rays that vignette at any surface are not shown. Defaults to False.

  • figsize (tuple[float, float], optional) – The size of the figure. Defaults to (10, 4).

  • xlim (tuple[float, float] | None, optional) – The x-axis limits of the plot. Defaults to None.

  • ylim (tuple[float, float] | None, optional) – The y-axis limits of the plot. Defaults to None.

  • title (str | None, optional) – The title of the plot. Defaults to None.

  • reference (ReferenceRay | None, optional) – The reference rays to plot, e.g., ‘chief’ or ‘marginal’. Defaults to None.

  • projection (Literal["XY", "XZ", "YZ"], optional) – The projection plane. Defaults to “YZ”.

  • ax (matplotlib.axes.Axes, optional) – The axes to plot on. If None, a new figure and axes are created. Defaults to None.

Returns:

A tuple containing the matplotlib Figure and Axes objects of the plot.

Return type:

tuple[Figure, Axes]

draw3D(fields: list[tuple[float, float]] | Literal['all'] = 'all', wavelengths: list[float] | Literal['primary'] = 'primary', num_rays: int = 24, distribution: DistributionType = 'ring', figsize: tuple[float, float] = (1200, 800), dark_mode: bool = False, reference: ReferenceRay | None = None, hide_vignetted: bool = False)[source]

Draw a 3D representation of the optical system.

Parameters:
  • fields (list[tuple[float, float]] | Literal['all'], optional) – The fields to be displayed, specified by their indices. Defaults to ‘all’.

  • wavelengths (list[int] | Literal['primary'], optional) – The wavelengths to be displayed, specified by their indices. Defaults to ‘primary’.

  • num_rays (int, optional) – The number of rays to trace for each field and wavelength. Defaults to 24.

  • distribution (DistributionType, optional) – The distribution of rays to trace. Defaults to ‘ring’.

  • figsize (tuple[float, float], optional) – The size of the figure. Defaults to (1200, 800).

  • dark_mode (bool, optional) – If True, use a dark theme for the plot. Defaults to False.

  • reference (ReferenceRay | None, optional) – The reference rays to plot, e.g., ‘chief’ or ‘marginal’. Defaults to None.

  • hide_vignetted (bool, optional) – If True, rays that vignette at any surface are not shown. Defaults to False.

flip()[source]

Flips the optical system.

Deprecated since version Use: optic.updater.flip() instead.

This reverses the order of surfaces (excluding object and image planes), their geometries, and materials. Pickups and solves referencing surface indices are updated accordingly. The coordinate system is adjusted such that the new first optical surface (originally the last one in the flipped segment) is placed at z=0.0.

classmethod from_dict(data: dict[str, Any]) Optic[source]

Create an optical system from a dictionary.

Parameters:

data – The dictionary representation of the optical system.

Returns:

The optical system.

image_solve()[source]

Update the image position such that the marginal ray crosses the optical axis at the image location.

Deprecated since version Use: optic.updater.image_solve() instead.

property image_surface: Surface

The image surface instance.

info()[source]

Display the optical system information.

n(wavelength: float | Literal['primary'] = 'primary') BEArray[source]

Get the refractive indices of materials at a given wavelength.

Deprecated since version Use: optic.surfaces.n(wavelength) instead. To resolve the primary wavelength use optic.primary_wavelength.

Parameters:

wavelength (float | Literal['primary'], optional) – The wavelength in microns for which to calculate the refractive indices. Can be a float value or ‘primary’ to use the system’s primary wavelength. Defaults to ‘primary’.

Returns:

An array of refractive indices for each space.

Return type:

be.ndarray

property object_surface: ObjectSurface | None

The object surface instance (ObjectSurface or None).

plot_surface_sag(surface_index: int, y_cross_section: float = 0, x_cross_section: float = 0, fig_to_plot_on: Figure | None = None, max_extent: float | None = None, num_points_grid: int = 50, buffer_factor: float = 1.1)[source]

Analyzes and visualizes the sag of a given lens surface.

Parameters:
  • surface_index – The index of the surface to analyze.

  • y_cross_section – The y-coordinate for the x-sag plot. Defaults to 0.

  • x_cross_section – The x-coordinate for the y-sag plot. Defaults to 0.

property polarization_state: PolarizationState | None

The polarization state of the optic.

Returns:

The PolarizationState object if polarization is considered, otherwise None.

Return type:

PolarizationState | None

Raises:

ValueError – If the polarization state is invalid.

property primary_wavelength: float

The primary wavelength in microns.

remove_surface(index: int)[source]

Removes a surface from the optic.

Deprecated since version Use: optic.surfaces.remove() instead.

Parameters:

index (int, optional) – The index of the surface to remove.

reset()[source]

Reset the optical system to its initial state.

scale_system(scale_factor: float)[source]

Scales the optical system by a given scale factor.

Deprecated since version Use: optic.updater.scale_system() instead.

Parameters:

scale_factor (float) – The factor by which to scale the system.

set_aperture(aperture_type: ApertureType, value: float)[source]

Set the aperture of the optical system.

Parameters:
  • aperture_type (ApertureType) – The type of the aperture. Must be one of ‘EPD’, ‘imageFNO’, or ‘objectNA’.

  • value (float) – The value of the aperture.

set_apodization(apodization: BaseApodization | str | dict = None, **kwargs)[source]

Sets the apodization for the optical system.

Deprecated since version Use: optic.updater.set_apodization() instead.

Parameters:
  • apodization (BaseApodization | str | dict, optional) – The apodization to apply. Defaults to None.

  • **kwargs – Additional keyword arguments used to initialize the apodization class when apodization is a string.

set_asphere_coeff(value: float, surface_number: int, aspher_coeff_idx: int)[source]

Set an aspheric coefficient on a surface.

Deprecated since version Use: optic.updater.set_asphere_coeff() instead.

Parameters:
  • value (float) – The value of the aspheric coefficient.

  • surface_number (int) – The index of the surface.

  • aspher_coeff_idx (int) – The index of the aspheric coefficient to set.

set_conic(value: float, surface_number: int)[source]

Set the conic constant of a surface.

Deprecated since version Use: optic.updater.set_conic() instead.

Parameters:
  • value (float) – The value of the conic constant.

  • surface_number (int) – The index of the surface.

set_field_type(field_type: FieldType)[source]

Set the type of field used in the optical system.

Deprecated since version Use: optic.fields.set_type() instead.

Parameters:

field_type (FieldType) – The type of field, e.g., ‘angle’, ‘object_height’, or ‘paraxial_image_height’.

Raises:

ValueError – If the field type is invalid.

set_index(value: float, surface_number: int)[source]

Set the index of refraction of a surface.

Deprecated since version Use: optic.updater.set_index() instead.

Parameters:
  • value (float) – The value of the index of refraction.

  • surface_number (int) – The index of the surface.

set_material(material: BaseMaterial, surface_number: int)[source]

Set the material of a surface.

Deprecated since version Use: optic.updater.set_material() instead.

Parameters:
  • material (BaseMaterial) – The material.

  • surface_number (int) – The index of the surface.

set_norm_radius(value: float, surface_number: int, is_fixed: bool = True)[source]

Set the normalization radius of a surface.

Deprecated since version Use: optic.updater.set_norm_radius() instead.

Parameters:
  • value (float) – The value of the normalization radius.

  • surface_number (int) – The index of the surface.

  • is_fixed (bool, optional) – Whether to lock the normalization radius from automatic paraxial updates. Defaults to True.

set_polarization(polarization: PolarizationState | Literal['ignore'])[source]

Set the polarization state of the optic.

Deprecated since version Use: optic.updater.set_polarization() instead.

Parameters:

polarization (PolarizationState | Literal['ignore']) – The polarization state to set. It can be either a PolarizationState object or ‘ignore’.

set_radius(value: float, surface_number: int)[source]

Set the radius of curvature of a surface.

Deprecated since version Use: optic.updater.set_radius() instead.

Parameters:
  • value (float) – The value of the radius.

  • surface_number (int) – The index of the surface.

set_ray_aiming(mode: str, max_iter: int = 10, tol: float = 1e-06, **kwargs)[source]

Configure the ray aiming strategy.

Deprecated since version Use: optic.ray_tracer.set_aiming() instead.

Parameters:
  • mode – The aiming mode (“paraxial”, “iterative”, “robust”).

  • max_iter – Maximum iterations for iterative solvers.

  • tol – Convergence tolerance for iterative solvers.

  • **kwargs – Additional configuration parameters.

set_thickness(value: float, surface_number: int)[source]

Set the thickness of a surface.

Deprecated since version Use: optic.updater.set_thickness() instead.

Parameters:
  • value (float) – The value of the thickness.

  • surface_number (int) – The index of the surface.

property surface_group: SurfaceGroup
to_dict() dict[source]

Convert the optical system to a dictionary.

Returns:

The dictionary representation of the optical system.

property total_track: float

The total track length of the system.

trace(Hx: ScalarOrArray, Hy: ScalarOrArray, wavelength: float, num_rays: int | None = 100, distribution: DistributionType | BaseDistribution | None = 'hexapolar') RealRays[source]

Trace a distribution of rays through the optical system.

Parameters:
  • Hx – The normalized x field coordinate(s).

  • Hy – The normalized y field coordinate(s).

  • wavelength (float) – The wavelength of the rays in microns.

  • num_rays – The number of rays to trace. Defaults to 100.

  • distribution – The distribution of rays. Can be a string identifier (e.g., ‘hexapolar’, ‘uniform’) or a BaseDistribution object. Defaults to ‘hexapolar’.

Returns:

A RealRays object containing the traced rays.

Return type:

RealRays

trace_generic(Hx: ScalarOrArray, Hy: ScalarOrArray, Px: ScalarOrArray, Py: ScalarOrArray, wavelength: float)[source]

Trace generic rays through the optical system.

Parameters:
  • Hx – The normalized x field coordinate(s).

  • Hy – The normalized y field coordinate(s).

  • Px – The normalized x pupil coordinate(s).

  • Py – The normalized y pupil coordinate(s).

  • wavelength (float) – The wavelength of the rays in microns.

Returns:

A RealRays object containing the traced rays.

Return type:

RealRays

update() None[source]

Update the surface properties (pickups, solves, paraxial properties).

Deprecated since version Use: optic.updater.update() instead.

update_normalization(surface: Surface) None[source]

Update the normalization radius of surfaces.

Deprecated since version Use: optic.updater.update_normalization() instead.

update_paraxial()[source]

Update the semi-aperture of the surfaces based on paraxial analysis.

Deprecated since version Use: optic.updater.update_paraxial() instead.