geometric op• Data kinds: table → matrix
• Call: import fullseye as fs; fs.ledger.abcd_matrix(elements) (implementation को सीधे call करना हो तो import optics; optics.abcd_matrix(elements), registry से लेना हो तो opsoptics.get("abcd_matrix"))
paraxial system को एक 2x2 ray-transfer (ABCD) matrix में compose करता है।
> नीचे का विस्तृत विवरण मूल text में है — सारांश और headings का अनुवाद हो चुका है।
*elements* is a sequence of (kind, *params) in the order light meets them (the matrix product is formed right-to-left accordingly, so the list reads like the optical layout, not like the algebra):
("free", d_mm) free-space / homogeneous medium of length d >= 0 · ("lens", f_mm) thin lens of focal length f != 0 (negative = diverging) · ("mirror", r_mm) curved mirror of radius r in the unfolded system (power -2/r) · ("interface", n1, n2) flat refracting surface · ("curved", n1, n2, r_mm) curved refracting surface.
Returns a (2, 2) float64 matrix acting on the ray state [y_mm, theta_rad] — feed it to abcd_trace, which handles the milliradian conversion at the API boundary.
Ground truth it reproduces exactly: a single free-space section is [[1, d], [0, 1]]; det(M) = n_in / n_out, hence exactly 1 for any system that starts and ends in the same medium (checked to ~1e-16 in the tests, and the cheapest correctness self-check you have); two thin lenses separated by d compose to the classical combined power 1/f = 1/f1 + 1/f2 - d/(f1*f2); a lens sandwiched between two free-space sections of length f gives the [[0, f], [-1/f, 0]] Fourier-transform geometry.
Raises ValueError: an empty system, more than MAX_SYSTEM_ELEMENTS elements, an element that is not a sequence, an unknown kind, the wrong parameter count for a kind, a negative free-space distance (reverse the list instead of running light backwards), a zero focal length or radius, a non-positive refractive index, or any non-finite parameter.
HALCON: no equivalent (its optics stop at the pinhole camera model).
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।
• 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 में दिए गए हैं।
• optics_imaging — py -3.11 examples/optics_imaging.py
matrix को input के रूप में लेते हैं)abcd_trace · mueller_apply · mueller_checks
geometric)thin_lens · abcd_trace · depth_of_field · relative_illumination
*Provenance: optics.py — OPTICS operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.