lens_file_write — OPTICS lensfile op

• Data kinds: table → table

• Call: import fullseye as fs; fs.ledger.lens_file_write(prescription=None, system=None, path=None, encoding: 'str' = 'ascii') -> 'dict' (implementation को सीधे call करना हो तो import lensfile; lensfile.lens_file_write(prescription=None, system=None, path=None, encoding: 'str' = 'ascii') -> 'dict', registry से लेना हो तो opsoptics.get("lens_file_write"))

उपयोग

prescription को .zmx text के रूप में लिखता है जिसे lens_file_read और design programs पढ़ते हैं (table)।

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

*prescription* is the dict from lens_file_read (None: the bundled example). *system* — optional — is an edited raytrace.lens_system (for example the output of lensopt.optimize_lens): its radii, thicknesses, conics, aspheric terms and media replace the prescription's surfaces while the fields, wavelengths, aperture type, comments and still-valid solves are kept (a solve whose value was edited is dropped from the output and listed in dropped_solves). The stop size is written as the system aperture: an entrance-pupil diameter (ENPD) recomputed from *system* when the prescription used ENPD or FNUM.

*path* (optional) writes the file; *encoding* "ascii" (default, plain text that diffs well) or "utf-16" (with byte-order mark, what current design programs save). Media: an (n_d, V_d) pair or a plain index becomes a model glass, a catalogue name or .agf record its name with n_d / V_d on the line; a custom Sellmeier medium without a catalogue name is refused (a reader could not resolve it). *system* may also be a raytrace3d.noncoaxial_system (the prescription is then optional): its break and return elements become COORDBRK surfaces (order flag 0 / 1 for the tracer's "xyz" / "zyx" breaks), an entrance-pupil diameter is recomputed from the stop radius.

Refused: a beamsplitter surface, a per-surface decenter / tilt (put a break around it), a tilted image or object plane, a return across an odd number of reflections or one that would need a negative thickness. A coaxial raytrace.lens_system with tilted / decentred surfaces is still refused.

A *system* (or a prescription's system) that carries configurations is written as a multi- configuration file: configuration 1 as the surface blocks, then MNUM and one row per varying thickness / curvature / glass / aspheric parameter and configuration (see the module help for what is refused); the result then also has n_configurations and rows (row counts per operand).

Returns {"text", "path", "n_surfaces", "encoding", "dropped_solves"}.

Example::

p = lens_file_read("triplet.zmx")

best = lensopt.optimize_lens(p["system"])["system"]

lens_file_write(p, system=best, path="triplet_reoptimised.zmx")

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

• 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_read · lens_file_system · 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.