grating_three_image_retrieve — OPTICS grating_interf op

• Data kinds: images × images → table

• Call: import fullseye as fs; fs.ledger.grating_three_image_retrieve(sample_stack, reference_stack=None, steps_per_period_sample=None, steps_per_period_reference=None, min_visibility=0.02, distance_mm=None, analyzer_period_um=None, reference_exposure=1.0) (implementation को सीधे call करना हो तो import gratinginterf; gratinginterf.grating_three_image_retrieve(sample_stack, reference_stack=None, steps_per_period_sample=None, steps_per_period_reference=None, min_visibility=0.02, distance_mm=None, analyzer_period_um=None, reference_exposure=1.0), registry से लेना हो तो opsoptics.get("grating_three_image_retrieve"))

उपयोग

दो phase-stepping stacks (sample के साथ और बिना) से transmission, differential phase और dark field को अलग करता है।

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

各画素で I_k = a·(1 + V·cos(φ − 2πk/P)) をあて(P = 1 周期のステップ数。None は N 等分)、透過 T = a_s/a_r、微分位相 φ = wrap(φ_s − φ_r)、暗視野 D = V_s/V_r を返す(Pfeiffer ら 2008, Nature Materials 7, 134 の定義)。P = N のときは fringe.wrapped_phase と fringe.modulation (N 段の位相シフトの標準式)をそのまま使い、P ≠ N(1 周期の両端を含む走査など)は 3 項の最小二乗。2 組のステップ数は違ってよい(各組を別々にあてる)。

reference_stack が None なら、試料の画像列だけから a・V・φ を返す(比は取らない)。distance_mm と analyzer_period_um を渡すと、屈折角 α = φ·p2/(2π d) [µrad] も返す。reference_exposure: 基準を試料の何倍の露光(1 枚あたりの光子数)で撮ったか。透過は a_s/(a_r/reference_exposure)。暗視野と微分位相は比と差なので露光に依らない(透過だけが露光の比で化ける)。

min_visibility: 基準の可視度がこれ未満の画素(格子の欠陥・影)は位相が決まらないので NaN にし、数を返す。全画素が NaN になるときは値を返さずに拒否する。

返り値 dict: transmission / dpc_rad / darkfield(いずれも (H, W)、無効画素は NaN)/ visibility_sample / visibility_reference / refraction_urad(幾何があるとき)/ fit_residual_sample / fit_residual_reference(正弦をあてた残差の RMS / 平均の中央値。1 周期のステップ数を間違えると大きくなる)/ n_invalid。Raises ValueError: 画像列が 3-D でない・3 枚未満・NaN/Inf、2 組の画素の形が違う、P ≤ 0、P が小さすぎて正弦が分けられない、有効な画素が 1 つも無い、幾何の片方だけ、正でない reference_exposure。

पूरी 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 करते हैं)

• grating_interferometry — py -3.11 examples/grating_interferometry.py

• poc_grating_interferometry — py -3.11 examples/poc_grating_interferometry.py

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

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

इसी category के (grating_interf)

talbot_grating_design · grating_stepping_simulate · darkfield_scatter_relation · talbot_carpet · talbot_source_visibility · grating_step_period_estimate · dpc_integrate


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

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