confocal op• Data kinds: table → pairs
• Call: import fullseye as fs; fs.ledger.chromatic_confocal_spectrum(probe, surface_um: 'float' = 500.0, stack=(), substrate='AL', source=None, detector=None, wl_step_nm: 'float' = 0.5, tilt_deg: 'float' = 0.0, roughness_nm: 'float' = 0.0, spectrometer_fwhm_nm: 'float' = 0.0, photons_per_peak: 'float' = 0.0, read_noise: 'float' = 0.0, seed: 'int' = 0) -> 'np.ndarray' (implementation को सीधे call करना हो तो import chromconf; chromconf.chromatic_confocal_spectrum(probe, surface_um: 'float' = 500.0, stack=(), substrate='AL', source=None, detector=None, wl_step_nm: 'float' = 0.5, tilt_deg: 'float' = 0.0, roughness_nm: 'float' = 0.0, spectrometer_fwhm_nm: 'float' = 0.0, photons_per_peak: 'float' = 0.0, read_noise: 'float' = 0.0, seed: 'int' = 0) -> 'np.ndarray', registry से लेना हो तो opsoptics.get("chromatic_confocal_spectrum"))
surface की स्थिति और layer संरचना से chromatic confocal का लौटने वाला spectrum बनाता है (forward model)।
> नीचे का विस्तृत विवरण मूल text में है — सारांश और headings का अनुवाद हो चुका है।
戻りスペクトル S(λ) = 光源(λ) × 検出器(λ) × Σ_界面 [反射率 × 往復の透過 × 傾き・粗さ × 共焦点の軸応答(界面の見かけの位置 − 近軸焦点(λ); λ, NA(λ), LSA(λ))]、それを分光器の応答(ガウス、FWHM)でぼかし、光子のショット雑音と読出し雑音を足す。
probe: chromatic_confocal_probe の dict。波長の格子は較正の帯域を *wl_step_nm* で刻む。
surface_um: 最上面の位置(較正表の z、µm)。
stack: 最上面の下の透明な層の列 ((材料, 厚さ µm), ...)。材料は材料表の名前(GLASS_CROWN /
"PMMA" / "WATER" …)か屈折率の数。k があれば往復の吸収 exp(−4πk·2t/λ) が入る。
substrate: 最下層の下の媒質(材料表の名前 —— "AL" / "AU" / "CU" / "SI" … —— か数、
空気なら 1.0)。界面の反射率は両側の複素屈折率から垂直入射の Fresnel |(m₁ − m₂)/(m₁ + m₂)|²。
source / detector: 光源の分光分布と検出器の分光感度(pairs、帯域を覆うこと)。None は平坦。
tilt_deg: 面の傾き(全界面に共通)。鏡面成分は瞳との重なりの割合だけ戻る(sin 2θ ≥ 2NA で 0)。
roughness_nm: 面の粗さ σ(RMS)。最上面の鏡面成分は exp(−(4πσ/λ)²)、残りは Lambert で NA² だけ
戻り、点物体の応答で広がる。
spectrometer_fwhm_nm: 分光器の線幅(0 は理想)。
photons_per_peak: 0 なら雑音なしの期待値(最大を 1 に規格化)。正なら最大が平均この光子数になる
ように拡大し、Poisson のショット雑音を足す。read_noise: 読出し雑音(光子数の単位の σ)。
seed: 雑音の乱数の種(整数)。
返り値: pairs(λ [nm], 強度)。負は 0 に切る(分光器は負の光を読まない)。Raises ValueError: probe の形の誤り、帯域を覆わない source / detector、層の厚さ ≤ 0、材料表の区間外の波長、どの界面にも焦点が合わない(全部の界面が較正の範囲外)。
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_chromatic_confocal — py -3.11 examples/poc_chromatic_confocal.py
pairs को input के रूप में लेते हैं)mtf50 · energy_to_photons · spectral_product · spectral_integral · spectral_stats · kubelka_munk_reflectance · hyperspectral_capture · film_thickness_fft
confocal)chromatic_confocal_probe · confocal_axial_response · chromatic_confocal_peaks · chromatic_confocal_readout · chromatic_confocal_limits
*Provenance: chromconf.py — OPTICS operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.