lens_system — OPTICS design op

• 데이터 종류: 없음 → table(인자만으로 정해지는 연산자 —— 이미지나 데이터 입력을 받지 않습니다)

• 호출: 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)(구현을 직접 호출하려면 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), 원장에서 가져오려면 opsoptics.get("lens_system"))

사용법

검증된 순차 렌즈 처방을 만듭니다(다른 모든 연산자가 먹는 table).

> 아래 상세 설명은 원문입니다 —— 요약과 제목은 번역되어 있습니다.

*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 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.

• An ideal lens surface ({"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.

• *stop*: index of the aperture-stop surface (default: the first surface). The stop's ap is the stop radius (required unless every surface has one, in which case the smallest is used).

• *object_mm*: distance from the first vertex to the object (inf for a collimated object); *index_object*: index of object space.

• *field*: default field for the analysis ops — degrees (infinite object) or object height in mm (finite object). Default 0 (on axis).

• *aim*: how the pupil rays are launched. "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 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. set_vignetting computes them from the apertures.

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.

패밀리 공통 입력 계약(fail-closed)

optics 의 모든 연산자는 입력을 검증한 뒤에 계산합니다(조용히 통과시키지 않습니다):

• 단위는 인자 이름에 넣습니다 — _mm / _um / _deg / _mrad. mm 와 µm 를 혼동하면 crash 가 아니라 「그럴듯하게 틀린 답」이 나오므로 이름으로 막습니다. 크기로 단위를 추측하는 처리는 일절 하지 않습니다.

• 문자열은 ValueError —— float('50') 은 성공하므로 파싱되지 않은 설정값이 길이로 통과해 버립니다(실측: thin_lens('50', '200') 이 그럴듯한 66.667 mm 를 돌려주고 있었습니다). bool 도 True == 1 의 암묵 승격으로 보고 거부합니다.

• complex / masked array 는 ValueError(실수 슬롯만. 허수부의 무언 절삭·마스크 벗기기를 거부).NaN/Inf 는 모든 입력에서 ValueError.

• 0 나눗셈과 그 친척들을 이름을 들어 거부: 초점거리 0, 곡률반경 0, 굴절률 <= 0, 불투명한 조리개(전부 0 이라 정규화가 0/0), 총합 <= 0 인 PSF, S0 = 0 인 스토크스 벡터, 물체가 앞쪽 초점에 있는 경우(상이 무한대).

• 비유한 값을 돌려주는 것은 2 개 연산자뿐이며, 둘 다 계약으로 명시: 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 인 스토크스 벡터, 음의 투과율, 음의 강도, n-|m| 이 홀수인 잘못된 Zernike 첨자 등.

자세한 사용 가이드

• optics_imaging 패밀리 가이드

참고(샘플 데이터·문헌)

• 샘플 데이터 카탈로그(DL URL / 라이선스) —— 2-D 는 skimage.data(BSD/public)+ 합성, 3-D 는 실데이터 소스(Stanford/PDS 등)의 DL URL.

• 연산자의 내력·참고문헌 —— 이 연산자 족의 바탕이 된 연구/기법의 출처.

• 알고리즘의 정전(저자·연도)과 용도는 위의 패밀리 사용 가이드에 적혀 있습니다.

실행 가능한 예제(이 연산자를 실제로 호출하는 검증된 샘플)

• lens_calibration_loop_demo — py -3.11 examples/lens_calibration_loop_demo.py

• lens_defect_dataset_demo — py -3.11 examples/lens_defect_dataset_demo.py

• lens_design_demo — py -3.11 examples/lens_design_demo.py

• lens_optimize_demo — py -3.11 examples/lens_optimize_demo.py

• optical_design_metrics — py -3.11 examples/optical_design_metrics.py

• poc_chromatic_confocal — py -3.11 examples/poc_chromatic_confocal.py

• poc_lens_file_roundtrip — py -3.11 examples/poc_lens_file_roundtrip.py

• poc_lens_global_search — py -3.11 examples/poc_lens_global_search.py

• poc_material_optical_library — py -3.11 examples/poc_material_optical_library.py

• poc_noncoaxial_optics — py -3.11 examples/poc_noncoaxial_optics.py

• poc_optics_drawings — py -3.11 examples/poc_optics_drawings.py

• poc_tdi_linescan — py -3.11 examples/poc_tdi_linescan.py

• poc_telecentric_metrology — py -3.11 examples/poc_telecentric_metrology.py

• poc_zoom_configurations — py -3.11 examples/poc_zoom_configurations.py

타입이 이어지는 다음 연산자(table 를 입력으로 받는 것)

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 연산자 레지스트리. 이 op 노트는 tools/opdocs.py md 가 자동 생성합니다(직접 편집하지 마세요).*

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