illumination_train — OPTICS illumination op

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

• Call: import fullseye as fs; fs.ledger.illumination_train(kind='kohler', source_mm=2.0, collector_f_mm=20.0, condenser_f_mm=10.0, field_stop_mm=6.0, aperture_stop_mm=6.0, source_distance_mm=30.0) (implementation को सीधे call करना हो तो import illumdesign; illumdesign.illumination_train(kind='kohler', source_mm=2.0, collector_f_mm=20.0, condenser_f_mm=10.0, field_stop_mm=6.0, aperture_stop_mm=6.0, source_distance_mm=30.0), registry से लेना हो तो opsoptics.get("illumination_train"))

उपयोग

microscope का illumination train (kohler या critical) paraxial रूप में रखता है (table)।

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

Planes along the axis (thin lenses, distances in mm, z = 0 at the source):

• the source (a disc of diameter *source_mm*) at z = 0;

• the collector (focal length *collector_f_mm*) at z = *source_distance_mm*, with the field stop (diameter *field_stop_mm*) right at it; it images the source to z_A;

• the aperture stop (diameter *aperture_stop_mm*) at z_A, on the intermediate source image;

• the condenser (focal length *condenser_f_mm*):

• kohler: one focal length behind the aperture stop (the stop sits in its front focal plane, so the source is imaged to infinity), and the specimen where the condenser images the field stop;

• critical: two focal lengths behind the source image (a 1:1 relay), and the specimen where the condenser images the source. The aperture stop then sits at the source image (it trims the source), the field stop is in a pupil-like plane.

Returns the element list (elements: dicts with type lens / stop / source / specimen, z_mm, f_mm or radius_mm) that illumination_field traces, plus the conjugate bookkeeping read off the ABCD matrices: source_to_specimen and field_stop_to_specimen (A, B, C, D — B = 0 means "imaged onto the specimen"), source_magnification / field_stop_magnification (A when B = 0, else None), field_diameter_mm (the lit field: field stop x |M| for Koehler, source x |M| for critical), illumination_na (on-axis marginal ray: the smallest stop-limited angle), source_image_z_mm.

Raises ValueError: unknown kind, non-positive sizes or focal lengths, a source closer than the collector focal length (no real intermediate image), a specimen that would be virtual.

पूरी 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

पृष्ठभूमि guides (इस op के पीछे की physics और conventions)

• mv_illumination_practice — Lighting व्यवहार में — wavelength, polarisation, drive modes, ambient light, safety

संदर्भ (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_spectrometer_illumination — py -3.11 examples/poc_spectrometer_illumination.py

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

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

इसी category के (illumination)

light_source · irradiance_map · illumination_uniformity · defect_contrast · lighting_sweep · illumination_design · solid_angle_light · solid_angle_boundaries


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

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