czerny_turner_design — OPTICS spectrometer op

• Data kinds: कोई नहीं → table (केवल arguments से तय होने वाला op — यह कोई image या data input नहीं लेता)

• Call: import fullseye as fs; fs.ledger.czerny_turner_design(groove_density_per_mm=1200.0, wavelength_min_nm=500.0, wavelength_max_nm=750.0, incidence_deg=9.0, collimator_f_mm=52.083, detector_length_mm=28.672, collimator_offaxis_deg=6.5, order=1, camera_f_mm=None, n_curve=41) (implementation को सीधे call करना हो तो import gratingspec; gratingspec.czerny_turner_design(groove_density_per_mm=1200.0, wavelength_min_nm=500.0, wavelength_max_nm=750.0, incidence_deg=9.0, collimator_f_mm=52.083, detector_length_mm=28.672, collimator_offaxis_deg=6.5, order=1, camera_f_mm=None, n_curve=41), registry से लेना हो तो opsoptics.get("czerny_turner_design"))

उपयोग

Czerny–Turner spectrometer (plane grating + दो concave mirror) का first-order design: camera focal length, coma हटाने वाला mirror angle और wavelength mapping।

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

groove_density_per_mm / order / incidence_deg: 格子と入射角 α(中心波長でも端でも同じ α)。wavelength_min_nm / wavelength_max_nm: 検出器に並べる帯域。中心 λ_c はその中点で、検出器の中央に来る。

collimator_f_mm: コリメータ鏡の焦点距離(曲率半径の半分)。detector_length_mm: 検出器の長さ L(分散方向)。帯域の両端が検出器の両端に乗るようにカメラの f を決める。collimator_offaxis_deg: コリメータ鏡の軸外し角 θ₁(入射と反射のなす角の半分)。

camera_f_mm: カメラ鏡の焦点距離を与える(None なら帯域が L にちょうど乗る値を厳密に解く)。

n_curve: 波長 → 位置の写像の標本数。

返り値(table、kind = "czerny_turner"。下流の op がそのまま受ける):

• center_wavelength_nm / beta_center_deg / deviation_deg(α − β_c)。

• camera_f_mm(使った値)/ camera_f_linear_mm(線形近似 f = L d cos β_c / (m Δλ)、Feng 2021 の式 (16))/ camera_f_exact_mm(像の写像 x = f tan(β − β_c) で両端が L に乗る値)。

• mirror_radii_mm —— (2 f_col, 2 f_cam)。

• shafer_offaxis_deg —— Shafer の条件でコマを消すカメラ鏡の軸外し角 θ₂。

• dispersion_curve —— pairs(λ [nm], 検出器の位置 x [mm])。nonlinearity_mm は直線からの最大のずれ。

• reciprocal_dispersion_nm_per_mm —— (端, 中心, 端) の P。

• detector_coverage_mm —— 帯域の両端の位置。second_order_band_nm —— 帯域へ 2 次で重なる波長の範囲(λ_min/2 〜 λ_max/2)。order_overlap_from_nm —— 帯域の中の光自身が 2 次で重なり始める波長(2 λ_min が帯域内なら。無ければ None)。

Raises ValueError: 帯域が逆・帯域の一部が伝わらない、検出器に乗らない、Shafer の解が無い、非正の長さ、|α| ≥ 90°。

पूरी 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

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

• poc_spectrometer_illumination — py -3.11 examples/poc_spectrometer_illumination.py

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

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

इसी category के (spectrometer)

grating_dispersion · spectrometer_bandpass · spectrometer_slit_image · spectrometer_spectrum


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

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