fullseye

defocus_from_shift — OPTICS wave op

使い方

Defocus wavefront error (waves at the pupil edge) of an axial focus shift.

Moving the detector (or, equivalently, the focus) by shift_um along the axis of an f/N beam adds the quadratic wavefront error W(rho) = W20 * rho^2 with

``W20 = shift / (8 * lambda * N^2)``  [waves]

— the paraxial Seidel defocus term, rho the normalised pupil radius (1 at the edge). This is the number :func:pupil_psf takes as defocus_waves, so the two compose: a longitudinal chromatic aberration (focal shift versus wavelength, e.g. from raytrace.chromatic_shift or a published df/f(lambda)) becomes a per-band defocus_waves here and a per-band PSF there.

Returns a float (a measurement). The sign is the sign of shift_um: positive = the detector sits beyond the focus (the beam has converged and is diverging again). For a symmetric pupil the PSF does not depend on the sign; for an asymmetric one (a slit, a W, an off-axis hole) the sign flips the PSF through the centre — that is exactly the handle a one-photoreceptor eye can read the direction of defocus from.

Ground truth (closed form, tests/test_optics.py): shift = 8 lambda N^2 is exactly one wave; the function is linear in shift_um and inverse in wavelength_um and in N^2 (checked at two of each). At N = 1.5, lambda = 0.55 um (a cephalopod-scale f/1.5 eye) a 250 um focus shift is 25.3 waves.

Raises ValueError: non-finite shift_um; non-positive or non-finite wavelength_um / f_number.

Paraxial: W20 = shift/(8 N^2) is the small-angle expansion of the exact shift * (1 - cos theta) sag; at f/1.5 (sin theta = 1/3) the exact edge value is 5.7 % below the paraxial one — the number is a defocus convention, not a high-NA wavefront.

ファミリ共通の入力契約(fail-closed)

optics の全 op は入力を検証してから計算する(黙って通さない):

詳しい使い方ガイド

参考(サンプルデータ・文献)

実行できる例(この op を実際に呼ぶ検証済みサンプル)

型が繋がる次の op(measurement を入力に取れる)

同カテゴリ(wave)

airy_pattern · angular_spectrum_propagate · fraunhofer_pattern · gaussian_beam · pupil_psf · pupil_blur


Provenance: optics.py — OPTICS operator registry. この per-op ノートは tools/opdocs.py md が自動生成(手編集しない)。

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.