sequences.sequenced_optic#

SequencedOptic: a view of a base Optic traced through a sub-sequence.

Composition, not inheritance: a SequencedOptic delegates aperture, fields, wavelengths, polarization, and paraxial analysis to the base optic untouched, and exposes surfaces as a SequencedSurfaceGroup.

Ray definition (conjugates, aperture stop, aiming) always comes from the base optic’s own nominal sequence — a sub-sequence defines traversal only. Per-sequence first-order analysis is out of scope for v1 (SPEC §4, phase 5).

Kramer Harrison, 2026

Classes

SequencedOptic(base_optic, name, steps)

A named sub-sequence over a base optic's surfaces.

class SequencedOptic(base_optic: Optic, name: str, steps: list[RawStep])[source]#

A named sub-sequence over a base optic’s surfaces.

Parameters:
  • base_optic – The optic whose surfaces this sequence traverses.

  • name – A name for the sequence, unique within the base optic.

  • steps – The raw step list. See optiland.sequences.steps.parse_steps().

Raises:
  • ValueError – If steps is empty, malformed, or references an out-of-range surface index.

  • SequenceValidationError – If adjacent steps are not physically consistent.

property aperture#
property apodization#
property fields#
property image_surface#

wherever this sequence terminates.

Unlike the base optic, a sub-sequence does not necessarily end at the system’s physical image plane (e.g. a ghost path that folds back on itself), so “image surface” here means the sequence’s own terminal step.

Type:

The last step’s view

n(wavelength: float | str = 'primary')[source]#

Get the exit-medium refractive indices at each step of this sequence.

Parameters:

wavelength – The wavelength in microns, or "primary" to use the base optic’s primary wavelength.

Returns:

The refractive indices at each step.

Return type:

be.ndarray

property object_surface#

The base optic’s object surface (conjugates are never per-sequence).

property paraxial#
property polarization: PolarizationState | str#
property polarization_state: PolarizationState | None#
property primary_wavelength: float#
property surface_group#

Alias for surfaces, matching internal use of Optic.surface_group.

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

Trace a distribution of rays through this sequence.

Rays are generated exactly as they would be for the base optic (its own conjugates, aperture stop, and ray aiming); only the traversal through the surfaces differs.

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

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

  • wavelength – The wavelength of the rays in microns.

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

  • distribution – The distribution of rays. Defaults to ‘hexapolar’.

Returns:

The traced rays.

Return type:

RealRays

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

Trace a single generic ray (given field and pupil coordinates).

As with trace(), the ray is generated exactly as it would be for the base optic; only the traversal through the surfaces differs.

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 – The wavelength of the rays in microns.

Returns:

The traced rays.

Return type:

RealRays

property wavelengths#