noncoaxial op• Data kinds: कोई नहीं → table (केवल arguments से तय होने वाला op — यह कोई image या data input नहीं लेता)
• Call: import fullseye as fs; fs.ledger.noncoaxial_system(elements=None, stop=None, object_mm=inf, wavelength_um=0.58756, index_object=1.0, field=(0.0, 0.0), image_mm=None, image_tilt=(0.0, 0.0), object_tilt=(0.0, 0.0)) (implementation को सीधे call करना हो तो import raytrace3d; raytrace3d.noncoaxial_system(elements=None, stop=None, object_mm=inf, wavelength_um=0.58756, index_object=1.0, field=(0.0, 0.0), image_mm=None, image_tilt=(0.0, 0.0), object_tilt=(0.0, 0.0)), registry से लेना हो तो opsoptics.get("noncoaxial_system"))
सत्यापित non-coaxial sequential प्रणाली बनाता है (table) — सतहें, coordinate break, fold, plate।
> नीचे का विस्तृत विवरण मूल text में है — सारांश और headings का अनुवाद हो चुका है।
*elements* is a list of dicts ("type" defaults to "surface"), or the dict returned by raytrace.lens_system (converted exactly; its traces then equal raytrace's to 1e-12):
• {"type": "surface", "R", "t", "n", "k", "ap", "mirror", "asph", "decenter", "tilt", "coating", "beamsplitter": {"R": r, "branch": "transmit"|"reflect"}} — as in raytrace.lens_system; decenter / tilt act on that surface only. coating is used by the ghost analysis (None / "bare", a material name = a quarter-wave single layer, [(material, nm), ...] from the incident side, or {"R": r}).
• {"type": "break", "decenter": (dx, dy), "tilt": (ax, ay, az), "order": "xyz"|"zyx", "t"} — a coordinate break (decenter, then rotate about x, the new y, the new z; degrees) that moves every later surface; {"type": "break", "undo": j} is the exact inverse of break record *j*.
• {"type": "return", "to": j, "t"} — go back to the coordinate system at the entry of record *j*.
• {"type": "fold_mirror", "tilt": (ax, ay), "t", "ap", "R", "reflectance"} — a mirror tilted by (ax, ay); the axis is reflected (45° folds by 90°) and t runs along the folded axis.
• {"type": "plate", "thickness", "n", "tilt": (ax, ay), "wedge": (wx, wy), "t", "beamsplitter": r, "branch", "coating_front", "coating_back"} — a tilted plane-parallel (or wedged) plate, or a plate beamsplitter; t is measured from the front vertex along the incoming axis (transmit branch) or along the reflected axis (reflect branch).
*stop* is the record index of the aperture stop (default: the first surface); *field* is (fx, fy) (degrees for an object at infinity, mm otherwise); *image_tilt* / *object_tilt* tilt the image / object plane about the local x and y axes (degrees; Scheimpflug). The last record's t is the distance to the image plane (None = the paraxial focus along the axis ray).
Default: a singlet f ≈ 100 mm followed by a 45° fold mirror (the image lands along +y).
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 में दिए गए हैं।
• poc_noncoaxial_optics — py -3.11 examples/poc_noncoaxial_optics.py
table को input के रूप में लेते हैं)abcd_matrix · wavefront_stats · sfr_from_edge · paraxial_trace · seidel_coefficients · spot_stats · tolerance_analysis · wavefront_from_opd
noncoaxial)noncoaxial_example · noncoaxial_layout · noncoaxial_trace · noncoaxial_spot · image_orientation · beamsplitter_branches · tilted_plate_shift · scheimpflug_tilt
*Provenance: raytrace3d.py — OPTICS operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.