ghost_analysis — OPTICS noncoaxial op

• Data kinds: table → table

• Call: import fullseye as fs; fs.ledger.ghost_analysis(system, coatings=None, field=None, rings=6, pupil_fill=0.98, pixel_mm=0.005, max_rows=None) (implementation को सीधे call करना हो तो import raytrace3d; raytrace3d.ghost_analysis(system, coatings=None, field=None, rings=6, pupil_fill=0.98, pixel_mm=0.005, max_rows=None), registry से लेना हो तो opsoptics.get("ghost_analysis"))

उपयोग

हर सतह-जोड़ी के दो-परावर्तन ghost (table): focus, sensor पर आकार और सापेक्ष तीव्रता।

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

For surface records i < j (refracting surfaces and beamsplitters; nominal mirrors only as the parts of the path they already are), the light runs to *j*, reflects, crosses *j−1 … i+1* backwards, reflects at *i* and runs on to the image plane — N(N−1)/2 paths. The nominal bundle (same launch as the image) is traced along each path with real rays. Per ghost:

• energy_ratio — ghost energy / image energy = R_i·R_j·Π T over the ghost path ÷ Π T over the image path; R from surface_reflectance (the media of the prescription and *coatings*:

a coating for all surfaces, or {record: coating}; records may carry their own coating), at the

angle of incidence of the field's chief ray on each surface (unpolarised; a 45° beamsplitter plate is not

treated as normal incidence);

• focus_offset_mm — the ghost's best focus relative to the image plane (along the image normal; negative = in front of the sensor), radius_mm (RMS) / max_radius_mm on the image plane, centroid_xy (image-plane local) and offset_xy (from the image's chief ray — where the false copy lands relative to the true image);

• point_ratio — ghost irradiance / image irradiance for a point source whose image fills one pixel_mm disk: energy_ratio · (pixel / max(pixel, radius))²;

• extended_ratio — the same for a uniform extended scene: energy_ratio · |det J_image| / |det J_ghost| (the ghost spreads the scene over its own magnification); jacobian is J_ghost (image-plane position of the ghost's chief ray per unit field, 2×2; image_jacobian the image's own).

Rows are sorted by point_ratio (ties by the declared order). n_pairs = N(N−1)/2.

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

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

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

इसी category के (noncoaxial)

noncoaxial_system · noncoaxial_example · noncoaxial_layout · noncoaxial_trace · noncoaxial_spot · image_orientation · beamsplitter_branches · tilted_plate_shift


*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.