wave op• Data kinds: image2d → image2d
• Call: import fullseye as fs; fs.ledger.fraunhofer_pattern(aperture, wavelength_um=0.55, distance_mm=100.0, pixel_pitch_um=10.0) (implementation को सीधे call करना हो तो import optics; optics.fraunhofer_pattern(aperture, wavelength_um=0.55, distance_mm=100.0, pixel_pitch_um=10.0), registry से लेना हो तो opsoptics.get("fraunhofer_pattern"))
aperture की far-field (Fraunhofer) diffraction intensity।
> नीचे का विस्तृत विवरण मूल text में है — सारांश और headings का अनुवाद हो चुका है।
In the far field the diffracted amplitude is the Fourier transform of the aperture transmittance, so the intensity is |FFT{aperture}|^2 (fftshifted, DC at the centre) normalised to a peak of exactly 1.0.
Returns a float64 image with the same shape as *aperture*.
The output plane is sampled differently from the input plane — this is the trap in every FFT diffraction routine. The observation-plane pitch is lambda*z/(N_pixels*input_pitch); with the defaults (0.55 um, 100 mm, 10 um) and a 64-pixel aperture that is 0.55*100000/(64*10) = 85.9 um per pixel. The value is not returned as an image cannot carry it; compute it from the formula when you need absolute positions.
A RuntimeWarning is emitted when the Fresnel number N_F = a^2/(lambda*z) (with a the aperture's support radius) is not below 1 — i.e. when you are asking for a far-field pattern at a distance where the near field still dominates. The result is still returned, because the Fourier relation is exactly what was asked for; the warning says the *physics*, not the arithmetic, is out of range.
Ground truth it reproduces (measured): a rectangular slit w pixels wide in an N-pixel array puts its diffraction zeros exactly on the DFT bins k*N/w; a 4-pixel-wide slit in a 64-pixel array has exactly 0.0 at bins +/-16 and +/-32 from DC (the DFT of a boxcar vanishes there to the last bit, not merely to rounding); the pattern of a centred symmetric aperture is symmetric to 2.2e-16.
Raises ValueError: *aperture* is not 2-D / smaller than 2x2 / over the size cap / complex / masked / non-finite; a negative transmittance (that is not an aperture); an opaque aperture (everything zero — an opaque screen diffracts nothing and the normalisation would be 0/0); non-positive or non-finite *wavelength_um* / *distance_mm* / *pixel_pitch_um*.
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
• poc_beats_fringes_and_screens — py -3.11 examples/poc_beats_fringes_and_screens.py
image2d को input के रूप में लेते हैं)pupil_psf · pupil_blur · psf_to_mtf · edge_spread · veiling_glare_index · emva_pair_statistics · emva_defect_pixels · polarization_demosaic
wave)airy_pattern · angular_spectrum_propagate · fourier_plane_filter · four_f_filter · gaussian_beam · defocus_from_shift · pupil_psf · pupil_blur
*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.