polarization op• 데이터 종류: stokes → table
• 호출: import optics; optics.stokes_analyze(stokes)(또는 opsoptics.get("stokes_analyze"))
스토크스 벡터를 읽습니다: 편광도·방위각·타원율.
> 아래 상세 설명은 원문입니다 —— 요약과 제목은 번역되어 있습니다.
Returns a dict: `intensity S0 · dop` degree of polarisation
`sqrt(S1^2+S2^2+S3^2)/S0 · dolp linear part sqrt(S1^2+S2^2)/S0` ·
`docp circular part |S3|/S0 · azimuth_deg` orientation of the
polarisation ellipse `0.5*atan2(S2, S1) mapped into [0, 180)` ·
`ellipticity_deg 0.5*asin(S3/|S|) in [-45, +45]` ·
`handedness one of "right" / "left" / "linear"`.
**`azimuth_deg and ellipticity_deg are None` when they are
undefined** — azimuth when the linear part is exactly zero (circular or
unpolarised light has no orientation), ellipticity when the polarised part
is zero (unpolarised light has no ellipse). Returning 0.0 there would be a
fabricated angle; `None` says the truth and forces the caller to handle
it.
Ground truth it reproduces exactly: `[1,1,0,0]` -> dop 1, azimuth 0,
ellipticity 0, linear; `[1,-1,0,0] -> azimuth 90; [1,0,1,0]` ->
azimuth 45; `[1,0,0,1]` -> docp 1, ellipticity +45, right-handed;
`[1,0,0,0] -> dop 0 with both angles None`;
`[2,1,0,0]` -> dop 0.5 (a partially polarised beam, which is exactly the
case Jones algebra cannot express).
Raises `ValueError`: *stokes* is not a 1-D 4-vector, is complex /
masked / non-finite, is unphysical (`S0 < 0` or degree of polarisation
above 1 — which is how you find out a Mueller matrix was not physical), or
has `S0 == 0` (no light at all: every ratio would be 0/0, and "the
polarisation of darkness" is not a question with an answer).
optics 의 모든 연산자는 입력을 검증한 뒤에 계산합니다(조용히 통과시키지 않습니다):
• 단위는 인자 이름에 넣습니다 — _mm / _um / _deg / _mrad. mm 와 µm 를 혼동하면 crash 가 아니라 「그럴듯하게 틀린 답」이 나오므로 이름으로 막습니다. 크기로 단위를 추측하는 처리는 일절 하지 않습니다.
• **문자열은 ValueError** —— float('50') 은 성공하므로 파싱되지 않은 설정값이 길이로 통과해 버립니다(실측: thin_lens('50', '200') 이 그럴듯한 66.667 mm 를 돌려주고 있었습니다). bool 도 True == 1 의 암묵 승격으로 보고 거부합니다.
• **complex / masked array 는 ValueError(실수 슬롯만. 허수부의 무언 절삭·마스크 벗기기를 거부).NaN/Inf 는 모든 입력에서 ValueError**.
• 0 나눗셈과 그 친척들을 이름을 들어 거부: 초점거리 0, 곡률반경 0, 굴절률 <= 0, 불투명한 조리개(전부 0 이라 정규화가 0/0), 총합 <= 0 인 PSF, S0 = 0 인 스토크스 벡터, 물체가 앞쪽 초점에 있는 경우(상이 무한대).
• 비유한 값을 돌려주는 것은 2 개 연산자뿐이며, 둘 다 계약으로 명시: depth_of_field 의 과초점거리 너머 far_mm = inf(그것이 과초점거리의 정의)와 gaussian_beam 의 허리에서의 wavefront_radius_mm = inf(평면 파면의 곡률반경). 둘 다 유한한 짝(far_is_infinite / curvature_per_mm)을 함께 돌려줍니다. **그 밖의 무언 NaN/Inf 는 내부에서 검출해 ValueError** —— 「float64 가 넘쳤다」와 「답이 무한대다」는 다른 주장이므로, 후자의 얼굴로 전자를 돌려주지 않습니다.
• 크기 상한: 생성 격자는 optics.MAX_GRID(4096), 넘겨받은 필드/PSF/조리개는 optics.MAX_FIELD_ELEMENTS(2^24), ABCD 소자열은 optics.MAX_SYSTEM_ELEMENTS(1024), Zernike 는 MAX_ZERNIKE_TERMS(512)/ MAX_ZERNIKE_ORDER(40)/ MAX_ZERNIKE_BASIS(2^25). 작은 인자에서 거대한 내부 할당이 일어나는 경로(실측: n_max=40 × 4096² 로 108 GB)를 fail-closed 로 막습니다.
• 물리적으로 불가능한 상태도 거부: 편광도 > 1 인 스토크스 벡터, 음의 투과율, 음의 강도, n-|m| 이 홀수인 잘못된 Zernike 첨자 등.
• 샘플 데이터 카탈로그(DL URL / 라이선스) —— 2-D 는 skimage.data(BSD/public)+ 합성, 3-D 는 실데이터 소스(Stanford/PDS 등)의 DL URL.
• 연산자의 내력·참고문헌 —— 이 연산자 족의 바탕이 된 연구/기법의 출처.
• 알고리즘의 정전(저자·연도)과 용도는 위의 패밀리 사용 가이드에 적혀 있습니다.
• optics_imaging — py -3.11 examples/optics_imaging.py
• specular_photometric — py -3.11 examples/specular_photometric.py
table 를 입력으로 받는 것)abcd_matrix · wavefront_stats · paraxial_trace · seidel_coefficients · spot_stats · tolerance_analysis · wavefront_from_opd · spot_diagram
polarization)jones_element · jones_apply · stokes_from_jones · mueller_element · mueller_apply
*Provenance: optics.py — OPTICS 연산자 레지스트리. 이 op 노트는 tools/opdocs.py md 가 자동 생성합니다(직접 편집하지 마세요).*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.