through_focus_mtf — OPTICS imaging_sim op

• Data kinds: table → table

• Call: import fullseye as fs; fs.ledger.through_focus_mtf(system, frequency_cpmm=None, defocus_mm=None, field=None, wavelength_um=None, size=None, tangential_axis='y') (implementation को सीधे call करना हो तो import lensimage; lensimage.through_focus_mtf(system, frequency_cpmm=None, defocus_mm=None, field=None, wavelength_um=None, size=None, tangential_axis='y'), registry से लेना हो तो opsoptics.get("through_focus_mtf"))

उपयोग

image plane की स्थिति बदलने पर चुनी गई spatial frequencies पर tangential और sagittal MTF (table)।

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

For each image-plane shift in *defocus_mm* (mm, added to the system's image distance; positive moves the plane away from the lens) the diffraction PSF of the real pupil is computed as in psf_from_opd (the reference sphere is re-centred on the shifted plane, so the shift appears as defocus in the OPD) and its tangential and sagittal MTF are read from the 2-D transform at each frequency of *frequency_cpmm* (cycles per millimetre; linear interpolation on the exact grid frequencies, which are spaced 1 / ((size - 1) λ F#) apart). *tangential_axis* = 'y' is the meridional plane for fields along +y, as everywhere in raytrace.

Defaults: *frequency_cpmm* = 10, 25 and 50 % of the diffraction cutoff 1 / (λ F#); *defocus_mm* = 11 points over ±2 waves of defocus W20 = δ / (8 F#² λ).

Returns {"defocus_mm" (nd,), "frequency_cpmm" (nf,), "tangential" (nd, nf), "sagittal" (nd, nf), "best_focus_mm", "cutoff_cpmm", "fno", "field"}. best_focus_mm is the shift that maximises the mean of the tangential and sagittal MTF at the first frequency (parabolic refinement through the three points around the maximum; the end of the range when the maximum is there, which means the range was too short to bracket the focus).

Ground truth it reproduces: for an aberration-free lens (an ideal paraxial surface) the in-focus MTF is the circular-pupil closed form and the defocused MTF is Hopkins' integral of the pupil overlap (tested against an independent quadrature, including the loss of contrast to zero at the first zero crossing); a rotationally symmetric on-axis system gives identical tangential and sagittal curves, and an off-axis singlet separates them (astigmatism).

The PSF grid is oversampled 2x, so its Nyquist limit equals the diffraction cutoff and the MTF at a grid frequency does not depend on the oversampling (the transform of the periodic PSF is the pupil autocorrelation).

Raises ValueError: a bad system, *field*, *wavelength_um* or *size* (see psf_from_opd); an empty or non-finite *frequency_cpmm* or *defocus_mm* (at most 64 each); a negative frequency or one above the diffraction cutoff of the PSF grid; *tangential_axis* not 'x' or 'y'.

पूरी 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_cables — Cables (standards, speed, power delivery, robot cables)

• mv_cameras — Industrial camera निर्माता (sensor mapping, line scan / TDI)

• mv_frame_grabbers — Frame grabber boards (optics नहीं, पर यही तय करते हैं कि capture हो भी सकता है या नहीं)

• mv_image_sensors — Industrial image sensors (मुख्यतः मौजूदा products)

• mv_standards — Camera interface standards और उनके पीछे की संस्थाएँ

• virtual_machine_vision — Virtual machine vision — parameters की सूची और एक object model

संदर्भ (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 करते हैं)

• optical_design_metrics — py -3.11 examples/optical_design_metrics.py

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

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

इसी category के (imaging_sim)

psf_from_opd · distortion_map · render_through_lens · defect_dataset · calibration_views


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

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