telecentric_lens — OPTICS telecentric op

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

• Call: import fullseye as fs; fs.ledger.telecentric_lens(kind='object', focal_mm=100.0, magnification=-0.5, na_object=0.01, front_aperture_mm=12.5, stop_shift_mm=0.0, glass='N-BK7', wavelength_um=0.58756) (implementation को सीधे call करना हो तो import telecentric; telecentric.telecentric_lens(kind='object', focal_mm=100.0, magnification=-0.5, na_object=0.01, front_aperture_mm=12.5, stop_shift_mm=0.0, glass='N-BK7', wavelength_um=0.58756), registry से लेना हो तो opsoptics.get("telecentric_lens"))

उपयोग

एक ही singlet से केवल stop की स्थिति बदलकर बने तीन imaging lens के prescription (raytrace.lens_system table)।

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

• kind="entocentric" —— 通常のレンズ。絞りをレンズの直後(1 mm)に置く。入射瞳はレンズの位置にあり、主光線は物体から入射瞳へ向かって傾く(近い物ほど大きく写る)。

• kind="object" —— 物体側テレセン。絞りを後側焦点に置く。入射瞳は無限遠、物体側の主光線は光軸に平行。

• kind="bi" —— 両側テレセン。後側焦点の絞りの後ろに、前側焦点が絞りに来る 2 枚目のレンズ(焦点距離 |magnification| × focal_mm)を置く。物体は 1 枚目の前側焦点、倍率は −f₂/f₁。

*magnification* は横倍率(実像なので負)、*na_object* は物体側の開口数(絞りの半径を近軸の周辺光線から決める)、*front_aperture_mm* は前玉の半口径(テレセンの視野はこれで決まる)。*stop_shift_mm* は絞りを設計位置から光軸方向へずらす量(正 = 像側)で、テレセン度の崩れを再現する(Newton の式で入射瞳は前側焦点から −f²/δ)。レンズは *glass* の等凸単レンズで、縁の厚さが 1 mm 残る中心厚を選ぶ。像面は近軸の像の位置に固定する。

返り値は lens_system の dict に "design"(種別・焦点距離・絞りの半径・物体距離・面の役割)を足したもの。絞りの面は平面なので、その R は lens_system の規約どおり inf(非有限は契約)。raytrace のどの op にもそのまま渡せる(ただし入射瞳が無限遠の処方は raytrace.chief_ray では

狙えないので、主光線は chief_ray_angle を使う)。

पूरी 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_optics_drawings — py -3.11 examples/poc_optics_drawings.py

• poc_telecentric_metrology — py -3.11 examples/poc_telecentric_metrology.py

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

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

इसी category के (telecentric)

chief_ray_angle · magnification_vs_depth · telecentricity_error · defocus_spot_vs_depth · vignetting_vs_field · lens_equivalent_pinhole


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

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