lens_file_read — OPTICS lensfile op

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

• Call: import fullseye as fs; fs.ledger.lens_file_read(source=None, allow_partial: 'bool' = False, glass_dir=None) -> 'dict' (implementation को सीधे call करना हो तो import lensfile; lensfile.lens_file_read(source=None, allow_partial: 'bool' = False, glass_dir=None) -> 'dict', registry से लेना हो तो opsoptics.get("lens_file_read"))

उपयोग

.zmx sequential lens prescription को Fullseye prescription (table) में पढ़ता है।

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

*source* is a file path, the file's text, its bytes, or None for the bundled example ZMX_EXAMPLE (a Cooke triplet, f ≈ 50 mm, f/5).

Encodings: UTF-16 with a byte-order mark (what current design programs save), UTF-16 without one (detected from the NUL pattern), UTF-8 and Latin-1. *glass_dir* (or the environment variable FULLSEYE_GLASS_DIR) is a directory of .agf glass catalogues searched before the built-in material table. *allow_partial* admits the approximations listed in the module help and marks the result approximate=True; without it they are refused.

Returns {"system", "name", "notes", "unit", "aperture", "field_type", "fields", "wavelengths", "primary", "surfaces", "solves", "approximate", "encoding", "source", "report"}: system is a ready raytrace.lens_system at the primary wavelength (field 0 — pick a field

with lens_file_system), fields are {"x", "y", "weight", "field"} with field the radial value raytrace takes (degrees or mm), surfaces is the file-level model (curvatures in 1/mm, signed thicknesses as the file stores them, glasses, apertures, solves) that lens_file_write writes back, and report classifies every keyword as read / ignored / unsupported (see lens_file_report).

A file with an MNUM table (more than one configuration) is read into the active configuration plus system["configurations"], a list with one sparse override dict per configuration (see lensconfig); the result also carries n_configurations and active_configuration (0-based).

A file with COORDBRK surfaces is read into a raytrace3d.noncoaxial_system (noncoaxial is True, system is that table, each field's field is the pair (x, y), pupil holds the entrance-pupil radius, stop radius and effective focal length found with real axial rays, surface_records[j] the tracer records of file surface j); the conventions are in the module help.

Example::

p = lens_file_read("triplet.zmx")

RT.paraxial_trace(p["system"])["efl"]

sysf = lens_file_system(p, field_index=2) # the 20-degree field

RT.spot_stats(sysf)

q = lens_file_read("folded.zmx") # tilts / decentres: a non-coaxial system

raytrace3d.noncoaxial_spot(lens_file_system(q, field_index=1))["rms_radius"]

पूरी 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 करते हैं)

• optical_design_metrics — py -3.11 examples/optical_design_metrics.py

• poc_lens_file_roundtrip — py -3.11 examples/poc_lens_file_roundtrip.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 के (lensfile)

lens_file_system · lens_file_write · lens_file_report


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

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