geometric op• Data kinds: कोई नहीं → table (केवल arguments से तय होने वाला op — यह कोई image या data input नहीं लेता)
• Call: import fullseye as fs; fs.ledger.depth_of_field(focal_mm=50.0, f_number=8.0, subject_mm=2000.0, coc_mm=0.03) (implementation को सीधे call करना हो तो import optics; optics.depth_of_field(focal_mm=50.0, f_number=8.0, subject_mm=2000.0, coc_mm=0.03), registry से लेना हो तो opsoptics.get("depth_of_field"))
Photographic depth of field: near limit, far limit और hyperfocal distance।
> नीचे का विस्तृत विवरण मूल text में है — सारांश और headings का अनुवाद हो चुका है।
The classical circle-of-confusion model. With H = f^2/(N*c) + f the hyperfocal distance and s the focused subject distance:
near = s*(H - f) / (H + s - 2f) and far = s*(H - f) / (H - s).
Returns a dict: near_mm · far_mm · depth_mm (far - near) · hyperfocal_mm · far_is_infinite (a bool, so a caller never has to test for inf by accident).
far_mm is inf at or beyond the hyperfocal distance, by contract, not by accident — focus at H and everything from H/2 to infinity is acceptably sharp, which is the whole point of the hyperfocal distance. depth_mm is then inf too. far_is_infinite says so explicitly, and the identity near(H) == H/2 is exact (verified in the tests).
*coc_mm* is the acceptable circle of confusion in the image plane: the 35 mm convention is 0.03 mm, a machine-vision rule of thumb is 1-2 pixel pitches. It is a *choice*, not a property of the lens — halve it and the depth of field halves with it, which is why two depth-of-field calculators disagree.
Ground truth: f = 50, N = 8, c = 0.03 gives H = 10466.67 mm; at s = H the near limit is exactly H/2 = 5233.33 mm and the far limit is inf; the near/far limits bracket the subject for every s < H.
Raises ValueError: non-positive or non-finite *focal_mm*, *f_number*, *subject_mm*, *coc_mm*; subject_mm <= focal_mm (an object inside the front focal length cannot be imaged by this lens — see thin_lens); a hyperfocal distance that is not greater than the focal length (a degenerate combination of N and c).
Paraxial, thin, and blur-circle based: it ignores diffraction, which for small apertures becomes the real resolution limit — compare with mtf_diffraction before trusting an N = 22 calculation.
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 में दिए गए हैं।
• lightfield_depth — py -3.11 examples/lightfield_depth.py
• optics_imaging — py -3.11 examples/optics_imaging.py
table को input के रूप में लेते हैं)abcd_matrix · wavefront_stats · sfr_from_edge · paraxial_trace · seidel_coefficients · spot_stats · tolerance_analysis · wavefront_from_opd
geometric)thin_lens · abcd_matrix · abcd_trace · relative_illumination
*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.