moire_align op• Data kinds: कोई नहीं → image2d (केवल arguments से तय होने वाला op — यह कोई image या data input नहीं लेता)
• Call: import fullseye as fs; fs.ledger.moire_overlay_image(shape=(256, 1024), pixel_um=0.5, p_mask_um=2.0, p_wafer_um=2.04, shift_nm=0.0, layout='single', profile='square', duty=0.5, blur_sigma_um=1.5, gap_um=0.0, wavelength_um=None, drift_nm=0.0, illum_gradient=0.0, noise_sigma=0.0, seed=0, moving='wafer', n_harmonics=15, allow_aliasing=False, with_mask=True) (implementation को सीधे call करना हो तो import moirealign; moirealign.moire_overlay_image(shape=(256, 1024), pixel_um=0.5, p_mask_um=2.0, p_wafer_um=2.04, shift_nm=0.0, layout='single', profile='square', duty=0.5, blur_sigma_um=1.5, gap_um=0.0, wavelength_um=None, drift_nm=0.0, illum_gradient=0.0, noise_sigma=0.0, seed=0, moving='wafer', n_harmonics=15, allow_aliasing=False, with_mask=True), registry से लेना हो तो opsoptics.get("moire_overlay_image"))
दो overlaid gratings (एक alignment mark) की camera image synthesise करता है।
> नीचे का विस्तृत विवरण मूल text में है — सारांश और headings का अनुवाद हो चुका है।
像 = [マークの強度(マスクの格子の像 × ウェハの格子の反射率)] をガウスのぼけ(MTF exp(−2π²σ²f²))と画素の積分(sinc)で撮ったもの。格子はフーリエ級数で持つので、ぼけと画素は閉形式(打ち切りの誤差は n_harmonics と項の大きさの床 1e-12 だけ)。ギャップ gap_um > 0 ではマスクの像を moire_talbot_gap と同じく optics.angular_spectrum_propagate で伝搬する(0/1 の格子だけ、波長 wavelength_um が要る —— ギャップが 0 なら使わない)。ぼけが格子のピッチを潰すので、像に残るのは差の周波数の縞(モアレ)だけになる —— これが位置合わせのマークの要点。
layout:
"single" 全面が 1 対(マスク p_m、ウェハ p_w)、線は縦、x のずれを読む。
"differential" 上半分 = 対 A(p_m, p_w)、下半分 = 対 B(ピッチを入れ替え)。ずれで 2 つの縞は逆に動き、
マーク全体の流れ(drift_nm)では同じ向きに動く。
"quad" 4 象限: 左上 A_x、右上 B_x、左下 A_y、右下 B_y(下は線が横で y のずれ)。
shift_nm と drift_nm は (x, y) の組でもよい。
with_mask=False はマスクを外してウェハの格子だけを撮った直接の像(比べ手の相互相関に使う。ピッチ 2 µm の格子はぼけで消えて一様な灰色になる —— 直接の像ではずれが見えない、を示す)。縞の周期の検査はしない。shift_nm は moving(既定 "wafer")の格子のずれ。drift_nm はマーク全体(2 枚とも)がカメラに対して動いた量。illum_gradient は視野の端から端までの照明の傾き(相対、x と y に同じ量)、noise_sigma は加える白色ガウス雑音の標準偏差(強度の単位。0/1 の格子 2 枚で平均は 0.25)。
Raises ValueError: 同じピッチ、縞の周期が 2 画素未満(ナイキスト超え)、区画に縞が 1 周期も入らない、ぼけで消えきらない格子の周波数がナイキストを超える(allow_aliasing=True で許す —— 実際のカメラでは折り返して縞に混ざる)、ギャップがあるのに profile が "sine"、綴り違い、形が小さすぎる。
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_moire_alignment — py -3.11 examples/poc_moire_alignment.py
• poc_moire_screen — py -3.11 examples/poc_moire_screen.py
image2d को input के रूप में लेते हैं)fraunhofer_pattern · pupil_psf · pupil_blur · psf_to_mtf · edge_spread · veiling_glare_index · emva_pair_statistics · emva_defect_pixels
moire_align)moire_magnification · moire_talbot_gap · moire_phase · moire_phase_to_shift · moire_differential_shift · moire_mark_read · moire_phase_crlb
*Provenance: moirealign.py — OPTICS operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.