lens_system — OPTICS design op

• Data kinds: कोई नहीं → table (केवल arguments से तय होने वाला op — यह कोई image या data input नहीं लेता)

• Call: 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) (implementation को सीधे call करना हो तो 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), registry से लेना हो तो opsoptics.get("lens_system"))

उपयोग

validated sequential prescription बनाता है (वह table जिसे बाकी हर op लेता है)।

> नीचे का विस्तृत विवरण मूल text में है — सारांश और headings का अनुवाद हो चुका है।

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

पूरी family का input contract (fail-closed)

optics के सभी ops गणना से पहले input की जाँच करते हैं (कुछ भी चुपचाप पास नहीं होता):

• Unit argument के नाम में ही लिखी होती है — _mm / _um / _deg / _mrad। mm और µm की गड़बड़ी crash नहीं करती, बल्कि "सही दिखने वाला पर गलत उत्तर" देती है, इसलिए नाम से इसे रोका जाता है। मान के आकार से unit का अनुमान बिल्कुल नहीं लगाया जाता।

• String से ValueError — float('50') सफल हो जाता है, इसलिए बिना parse किया config value length के रूप में निकल जाता (मापा गया: thin_lens('50', '200') सही दिखने वाला 66.667 mm लौटा रहा था)। bool को भी True == 1 वाले implicit promotion के रूप में अस्वीकार किया जाता है।

• complex / masked array से ValueError (केवल real-valued slots; imaginary part को चुपचाप छोड़ना या mask हटाना अस्वीकार)। हर input पर NaN/Inf से ValueError।

• शून्य से भाग और उससे जुड़े मामलों को नाम लेकर अस्वीकार किया जाता है: focal length 0, radius of curvature 0, refractive index <= 0, पूरी तरह opaque aperture (सब 0, इसलिए normalisation 0/0), ऐसा PSF जिसका योग <= 0 हो, S0 = 0 वाला Stokes vector, और front focal point पर रखा object (image अनंत पर)।

• केवल 2 ops non-finite value लौटाते हैं, और वह भी contract के रूप में लिखा हुआ: depth_of_field hyperfocal distance से आगे far_mm = inf (hyperfocal distance की परिभाषा यही है) और gaussian_beam waist पर wavefront_radius_mm = inf (plane wavefront की radius of curvature)। दोनों साथ में एक finite साथी (far_is_infinite / curvature_per_mm) भी लौटाते हैं। इसके अलावा कोई भी चुपचाप आया NaN/Inf अंदर ही पकड़ा जाता है और ValueError देता है — "float64 overflow हुआ" और "उत्तर अनंत है" अलग-अलग दावे हैं, इसलिए पहले को दूसरे का चेहरा पहनाकर नहीं लौटाया जाता।

• Size की सीमा: generate होने वाले grid के लिए optics.MAX_GRID (4096), दिए गए field/PSF/aperture के लिए optics.MAX_FIELD_ELEMENTS (2^24), ABCD element chain के लिए optics.MAX_SYSTEM_ELEMENTS (1024), Zernike के लिए MAX_ZERNIKE_TERMS (512) / MAX_ZERNIKE_ORDER (40) / MAX_ZERNIKE_BASIS (2^25)। छोटे argument से बहुत बड़ा internal allocation होने वाले रास्तों (मापा गया: n_max=40 × 4096² पर 108 GB) को fail-closed ढंग से बंद किया गया है।

• भौतिक रूप से असंभव states भी अस्वीकार: degree of polarisation > 1 वाला Stokes vector, ऋणात्मक transmittance, ऋणात्मक intensity, और n-|m| odd जैसे अमान्य Zernike indices।

उपयोग की विस्तृत guide

• optics_imaging family guide

संदर्भ (sample data, साहित्य)

• Sample data catalog (DL URL / license) — 2-D के लिए skimage.data (BSD/public) + synthetic, 3-D के लिए real data sources (Stanford/PDS आदि) के DL URL।

• Operators का स्रोत और संदर्भ — इस op family के मूल research/methods के स्रोत।

• Algorithm का मानक स्रोत (लेखक, वर्ष) और उपयोग ऊपर की family usage guide में दिए गए हैं।

चलाए जा सकने वाले उदाहरण (verified samples जो सच में यह op call करते हैं)

• 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

वे अगले ops जिनसे type जुड़ता है (table को input के रूप में लेते हैं)

abcd_matrix · wavefront_stats · sfr_from_edge · paraxial_trace · seidel_coefficients · spot_stats · tolerance_analysis · wavefront_from_opd

इसी category के (design)

thick_lens · glass · example_system · glass_catalog · sellmeier · paraxial_trace · seidel_coefficients · spot_stats


*Provenance: raytrace.py — OPTICS operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*

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