design opなし → table(引数だけで決まる op —— 画像やデータの入力を取らない)import fullseye as fs; fs.ledger.lens_system(surfaces=None, stop=None, object_mm=inf, wavelength_um=0.58756, index_object=1.0, image_mm=None, field=None, aim='paraxial', vignetting=None, image_R=inf, image_k=0.0, afocal=False) (実装を直接呼ぶなら import raytrace; raytrace.lens_system(surfaces=None, stop=None, object_mm=inf, wavelength_um=0.58756, index_object=1.0, image_mm=None, field=None, aim='paraxial', vignetting=None, image_R=inf, image_k=0.0, afocal=False)、台帳から引くなら opsoptics.get("lens_system"))Build a validated sequential prescription (the table every other op consumes).
surfaces is a list; each entry is a dict {"R", "t", "n", "k", "ap",
"mirror", "decenter", "tilt", "asph"} or a tuple (R, t, n[, k[, ap]]):
R radius (mm, inf for flat), t thickness to the next surface
(mm, the last one is the distance to the image plane when image_mm is
not given — use None to place the image at the paraxial focus),
n medium after the surface (index, (nd, vd) or :func:glass),
k conic (default 0), ap semi-aperture in mm (default None =
unlimited), mirror bool, decenter (dx, dy) mm, tilt
(ax, ay) degrees about x and y, asph even aspheric coefficients
(A4, A6, A8, …) in mm⁻³, mm⁻⁵, … (default none = pure conic), f the
focal length (mm, negative = diverging) of an ideal paraxial lens.{"f": 50.0, "t": …}) has zero thickness, no
shape and no glass (R is flat and n is the medium it sits in; both
may be left out). It turns every ray by the thin-lens law exactly,
tan θ' = tan θ − h/f per transverse axis (h = the ray height), so a
collimated beam crosses the axis at f and a point object images at
the Gaussian conjugate with m = −s'/s. Its optical path is the
stigmatic one (f − √(h² + f²) for a collimated input, which is the
quadratic phase −h²/(2f) at small h; a first surface with a finite
object uses that object and its Gaussian image instead), so spot, OPD and
PSF analyses of an aberration-free lens read zero aberration. It adds no
Seidel terms and no dispersion, takes no mirror / conic / asph, and the
non-coaxial raytrace3d does not read it.ap is the stop radius. If omitted, the smallest non-null
aperture on any surface is used; an error is raised only if none exists.inf for a
collimated object); index_object: index of object space."paraxial" (the default, and what every
earlier version did) aims them at the paraxial entrance pupil, with only the chief ray
moved onto the stop centre; in a system with pupil aberration the marginal rays then land
outside the stop and are clipped (the stock Cooke triplet loses 48 of 217 rays on axis).
"stop" is real-ray aiming: every pupil ray is iterated (Newton, tolerance 1e-11 of the
stop radius, ValueError if it does not converge) so that it crosses the stop surface at the
requested point, which is what lens-design software reports. See :func:with_aiming.vignetting: per-field pupil vignetting factors as design software stores them, a list of
{"field", "vdx", "vdy", "vcx", "vcy", "van"} (field in the same unit as field;
missing keys are 0). Definition: the format’s user guide (topic “Vignetting Factors”) and
knowledge-base article KA-01393. The normalised pupil p is first scaled and shifted,
p' = (VDX, VDY) + diag(1 - VCX, 1 - VCY) p, and the result is then rotated by van degrees
(counter-clockwise, x' = x cos - y sin): q = R(van) p' — the decentre rotates too. It is
applied before the rays are aimed (at the stop with aim="stop", at the paraxial entrance pupil
otherwise). A field between two records is interpolated linearly, one outside the listed range takes
the nearest record.
:func:set_vignetting computes them from the apertures.
a2 the r^2 term of the sag (mm^-1; the even asphere’s PARM 1) and odd the general power
series (B1, B2, ..., B8) added to the sag, z += B1 r + B2 r^2 + ... (an odd asphere; the
coefficient of r^i is in mm^(1-i)). Both are left out of the surface dict when zero, so a
prescription without them is bit-identical to before.solve a declarative rule that sets this surface’s curvature or the thickness after it from the rest of
the prescription (marginal / chief ray height or angle, paraxial image, F/#, concentric, aplanatic, pickup);
lenssolve.lens_solve_set builds one, lenssolve.lens_apply_solves resolves them (lens_system
resolves them once at construction, so the R / t it returns already hold the solved values).
A surface with a thickness solve may leave t out.inf flat) and conic constant of the image surface; rays are intersected
with it and spot / OPD are measured on it (the paraxial image is unchanged). Positive R: centre to the right.paraxial_trace then reports angular_magnification and the exit pupil instead of a focal length
(efl = bfl = inf), ray_bundle / spot_stats / ray_fan report the exit angle in arcminutes
(relative to the chief ray) in place of the image-plane position, and opd_samples references a plane wave.
A system flagged afocal whose collimated beam does not leave collimated is refused (ValueError).Default (no surfaces): a plano-convex BK7 singlet, f ≈ 100 mm,
f/4, stop at the first surface — a sensible starting point for the
examples and for the no-argument registry call.
Returns a plain dict (JSON-friendly) — pass it to the other functions.
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/anim3d_lens_aberrations.pypy -3.11 examples/lens_calibration_loop_demo.pypy -3.11 examples/lens_defect_dataset_demo.pypy -3.11 examples/lens_design_demo.pypy -3.11 examples/lens_optimize_demo.pypy -3.11 examples/optical_design_metrics.pypy -3.11 examples/plenoptic_capture_pipeline.pypy -3.11 examples/poc_chromatic_confocal.pypy -3.11 examples/poc_lens_file_roundtrip.pypy -3.11 examples/poc_lens_global_search.pypy -3.11 examples/poc_lens_merit_operands.pypy -3.11 examples/poc_lens_solves_afocal.pypy -3.11 examples/poc_lens_tolerancing.pypy -3.11 examples/poc_material_optical_library.pypy -3.11 examples/poc_noncoaxial_optics.pypy -3.11 examples/poc_optics_drawings.pypy -3.11 examples/poc_photograph_through_prescription.pypy -3.11 examples/poc_plenoptic_camera.pypy -3.11 examples/poc_tdi_linescan.pypy -3.11 examples/poc_telecentric_metrology.pypy -3.11 examples/poc_zoom_configurations.pytable を入力に取れる)abcd_matrix · wavefront_stats · sfr_from_edge · paraxial_trace · seidel_coefficients · spot_stats · tolerance_analysis · wavefront_from_opd
design)thick_lens · glass · example_system · glass_catalog · sellmeier · paraxial_trace · seidel_coefficients · spot_stats
Provenance: raytrace.py — OPTICS operator registry. この per-op ノートは tools/opdocs.py md が自動生成(手編集しない)。
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.