imaging_sim optable → tableimport fullseye as fs; fs.ledger.through_focus_mtf(system, frequency_cpmm=None, defocus_mm=None, field=None, wavelength_um=None, size=None, tangential_axis='y') (実装を直接呼ぶなら import lensimage; lensimage.through_focus_mtf(system, frequency_cpmm=None, defocus_mm=None, field=None, wavelength_um=None, size=None, tangential_axis='y')、台帳から引くなら opsoptics.get("through_focus_mtf"))Tangential and sagittal MTF at chosen spatial frequencies for a range of image-plane positions (table).
For each image-plane shift in defocus_mm (mm, added to the system’s image distance; positive moves
the plane away from the lens) the diffraction PSF of the real pupil is computed as in
:func:psf_from_opd (the reference sphere is re-centred on the shifted plane, so the shift appears as
defocus in the OPD) and its tangential and sagittal MTF are read from the 2-D transform at each
frequency of frequency_cpmm (cycles per millimetre; linear interpolation on the exact grid
frequencies, which are spaced 1 / ((size - 1) λ F#) apart). tangential_axis = 'y' is the
meridional plane for fields along +y, as everywhere in raytrace.
Defaults: frequency_cpmm = 10, 25 and 50 % of the diffraction cutoff 1 / (λ F#);
defocus_mm = 11 points over ±2 waves of defocus W20 = δ / (8 F#² λ).
Returns {"defocus_mm" (nd,), "frequency_cpmm" (nf,), "tangential" (nd, nf), "sagittal" (nd, nf),
"best_focus_mm", "cutoff_cpmm", "fno", "field"}. best_focus_mm is the shift that maximises the
mean of the tangential and sagittal MTF at the first frequency (parabolic refinement through the
three points around the maximum; the end of the range when the maximum is there, which means the
range was too short to bracket the focus).
Ground truth it reproduces: for an aberration-free lens (an ideal paraxial surface) the in-focus MTF is the circular-pupil closed form and the defocused MTF is Hopkins’ integral of the pupil overlap (tested against an independent quadrature, including the loss of contrast to zero at the first zero crossing); a rotationally symmetric on-axis system gives identical tangential and sagittal curves, and an off-axis singlet separates them (astigmatism).
The PSF grid is oversampled 2x, so its Nyquist limit equals the diffraction cutoff and the MTF at a grid frequency does not depend on the oversampling (the transform of the periodic PSF is the pupil autocorrelation).
Raises ValueError: a bad system, field, wavelength_um or size (see :func:psf_from_opd);
an empty or non-finite frequency_cpmm or defocus_mm (at most 64 each); a negative frequency or one
above the diffraction cutoff of the PSF grid; tangential_axis not 'x' or 'y'.
optics の全 op は入力を検証してから計算する(黙って通さない):
_mm / _um / _deg / _mrad。mm と µm の取り違えは crash ではなく「もっともらしく間違った答え」なので、名前で防ぐ。大きさから単位を推測する処理は一切しない。ValueError — float('50') は成功してしまうため、未パースの設定値が長さとして通り抜ける(実測: thin_lens('50', '200') がもっともらしい 66.667 mm を返していた)。bool も True == 1 の暗黙昇格として拒否。ValueError(実数枠のみ。虚部の無言切り捨て・マスク剥がしを拒否)。NaN/Inf は全入力で ValueError。depth_of_field の過焦点距離以遠の far_mm = inf(それが過焦点距離の定義)と gaussian_beam のウエストでの wavefront_radius_mm = inf(平面波面の曲率半径)。どちらも有限の相棒(far_is_infinite / curvature_per_mm)を併せて返す。それ以外の無言 NaN/Inf は内部で検出して ValueError —「float64 が溢れた」と「答えが無限大」は別の主張なので、後者の顔で前者を返さない。optics.MAX_GRID(4096)、供給された場/PSF/開口は optics.MAX_FIELD_ELEMENTS(2^24)、ABCD 素子列は optics.MAX_SYSTEM_ELEMENTS(1024)、Zernike は MAX_ZERNIKE_TERMS(512)/ MAX_ZERNIKE_ORDER(40)/ MAX_ZERNIKE_BASIS(2^25)。小さな引数から巨大な内部確保が起きる経路(実測: n_max=40 × 4096² で 108 GB)を fail-closed で塞ぐ。| 物理的に不可能な状態も拒否: 偏光度 > 1 の Stokes ベクトル、負の透過率、負の強度、n- | m | が奇数などの不正な Zernike 添字。 |
py -3.11 examples/lensfile_tolerance_worst_mtf.pypy -3.11 examples/optical_design_metrics.pytable を入力に取れる)abcd_matrix · wavefront_stats · sfr_from_edge · paraxial_trace · seidel_coefficients · spot_stats · tolerance_analysis · wavefront_from_opd
imaging_sim)psf_from_opd · distortion_map · render_through_lens · defect_dataset · calibration_views
Provenance: lensimage.py — OPTICS operator registry. この per-op ノートは tools/opdocs.py md が自動生成(手編集しない)。
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.