oct op• Data kinds: कोई नहीं → table (केवल arguments से तय होने वाला op — यह कोई image या data input नहीं लेता)
• Call: import fullseye as fs; fs.ledger.oct_design(center_nm=840.0, bandwidth_nm=50.0, n_pixels=2048, wl_min_nm=None, wl_max_nm=None, mode='sd', spectrometer_fwhm_px=1.0, linewidth_nm=None, n_group=1.0, beam_waist_um=None, focal_mm=None, beam_diameter_mm=None, photons_mirror_per_pixel=None, photons_ref_per_pixel=None, eta=0.8, sigma_d=10.0, window='hann', reflectivity=None, grid='lambda') (implementation को सीधे call करना हो तो import octscan; octscan.oct_design(center_nm=840.0, bandwidth_nm=50.0, n_pixels=2048, wl_min_nm=None, wl_max_nm=None, mode='sd', spectrometer_fwhm_px=1.0, linewidth_nm=None, n_group=1.0, beam_waist_um=None, focal_mm=None, beam_diameter_mm=None, photons_mirror_per_pixel=None, photons_ref_per_pixel=None, eta=0.8, sigma_d=10.0, window='hann', reflectivity=None, grid='lambda'), registry से लेना हो तो opsoptics.get("oct_design"))
मापने से पहले OCT का प्रदर्शन closed form में (table): axial resolution, depth range, sensitivity roll-off, SNR, lateral resolution और depth of focus।
> नीचे का विस्तृत विवरण मूल text में है — सारांश और headings का अनुवाद हो चुका है।
• 軸分解能(FWHM、ガウス光源、窓なし)δz = (2 ln 2/π) λ0²/Δλ ≈ 0.44 λ0²/Δλ(空気中)、媒質中は ÷ n_g。window を掛けると広がる(倍率 window_broadening は光源 × 窓の |FT| の FWHM から数値で求める。ガウス光源が範囲の中に収まっていれば hann で約 1.2 倍)。
• 深さ範囲(片道の光路、ナイキスト)z_max = π/(2 δk) = λ0²/(4 δλ)(δλ = 1 画素の波長幅)、媒質中は ÷ n_g。grid="lambda"(既定)は λ 等間隔の分光器(δk は中心の値)、"k" は k 等間隔の分光器(Hu & Rollins 2007)。
• roll-off(振幅): SD は画素の箱 |sin(z δk)/(z δk)| と分光器の分解能のガウス exp(−2σ²z²)(σ = 分解能の FWHM/2.355、k で)。SS は瞬時線幅 linewidth_nm のガウスだけ(mode="ss")。−6 dB の深さを数値で解く。
• SNR(ショット雑音 + 読み出し雑音、窓つき): 画素 i の参照光の電子 N_r,i と、反射率 1 の鏡の電子 N_s,i で SNR = (Σ w_i √(N_r,i N_s,i))² / Σ w_i² (N_r,i + σ_d²)(参照光が強ければ η × 試料の光子の総数 × 窓の係数)。sensitivity_db = 10 log10(SNR)(弱い反射体の SNR を反射率 1 へ外挿した値 = 検出の下限 1/R_min)。reflectivity R を渡すと、その反射体自身のショット雑音(N_s,i R)も分母に入れた SNR を snr_db に返す(強い反射体では参照光が支配的という前提が崩れ、外挿より小さくなる)。光子が渡されないときは None。
• 横分解能: ビームのくびれ半径 w0(1/e²)から、慣用の Δx = 2 w0 = (4λ/π)(f/d) と、A スキャンの振幅で見た点像の FWHM √(2 ln 2) w0(往復で exp(−2x²/w²))。焦点深度 b = 2 z_R = 2π w0² n/λ(慣用 = π Δx²/(2λ))。
返り値: dict(kind="oct_design", axial_resolution_air_um, axial_resolution_um, depth_range_air_um, depth_range_um, pixel_nm, dk_pixel, rolloff_6db_air_um, rolloff_6db_um, rolloff(pairs: 光路 µm, 振幅), snr_db / sensitivity_db, lateral_resolution_um, lateral_fwhm_um, depth_of_focus_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 में दिए गए हैं।
• poc_industrial_oct — py -3.11 examples/poc_industrial_oct.py
table को input के रूप में लेते हैं)abcd_matrix · wavefront_stats · sfr_from_edge · paraxial_trace · seidel_coefficients · spot_stats · tolerance_analysis · wavefront_from_opd
oct)oct_dispersion_broadening · oct_interferogram · oct_bscan_simulate · oct_from_spectra · oct_k_linearize · oct_dispersion_estimate · oct_dispersion_compensate · oct_ascan
*Provenance: octscan.py — OPTICS operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.