Python `extract_walls` (piezophantomtest runners.py:143) 은 MethodDResult 의
antRefined / postRefined (float) 를 우선 사용. 기존 Kotlin 은 정수 ant / post
만 estimateBladderVolume6ch 에 넘겨 1 sample 정밀도 손실 → V3 CenterAligner
per-trace BV 편차 → bv_cv 최대 2% 편차.
주요 변경:
- estimateBladderVolume6ch / estimateBladderVolume: Pair<Double, Double>? 오버로드
추가. Int 오버로드는 legacy PiezoMonitoring 경로 호환용 (내부에서 Double 로
toDouble). @JvmName 으로 JVM 시그니처 충돌 회피.
- segmentToDistancesMm(Double, Double) 오버로드 추가.
- repairCenterWallsFor6ch / computeLrRatio 시그니처 Double 로 통일. 인접 채널
gap=1 선형 보간은 반올림 없이 float 유지 (Python 1:1).
- AlignmentAdvisorV3.buildRecord: Pair(it.antRefined, it.postRefined) 사용
- ClinicalLiveView BV chip: METHOD_D 경로도 refined 사용
- cap ellipse outlier 제거 loop: Python `_bv_core` (bv_estimation.py:1284-1302)
에 있는 b_si/a_ap>1.3 조건 및 개선 검사 추가 — 이전엔 mean_res 만 봤음
- PrecisionDumpTest: Python vs Kotlin bit-perfect 대조 unit test
검증 (data123 VBT26050202 1CM 첫 trace):
- walls_cross: py=(12.275,50.050,...) == kt=(12.275,50.050,...) 완전 일치
- BV: 50 mL → 43 mL (Python 421 vs Kotlin 464)
- V3 CenterAligner cm=1 bv_cv: 0.265 → 0.260 (Python 0.260 완전 일치)
- cm=3 bv_cv: 0.131 → 0.122 (Python 0.130, 소폭 변경)
- 최종 선택: cm=3 (변함 없음)
남은 43 mL 편차: cap 높이 (bottom_h_mm py=20.06 vs kt=24.02, top_h_mm
py=10.44 vs kt=13.59) — Python 의 `ellipse_cap_height=True` branch
(bv_estimation.py:1337-1358) 아직 미이식. estimate_bv() default 는 이 branch
사용. sagitta 기반 b_si_eff 가중 + _ellipse_cap_h 공식 이식 필요. 후속 세션.
Python piezophantomtest ffd436b (2026-07-15 PR #35 'alignment bvcv 규칙 추가')
의 `vesiscan_test.alignment.CenterAligner` 를 Kotlin 으로 이식.
기존 V2 (실시간 sliding window 6-stage) 와 병행. V3 는 Clinical batch 전용:
Pass 1 (scanSelect):
- 5 위치 (0/1/2/3/4 cm) × 20 cycle → sliding window 10 → 11 trace 씩
- mean-scan 으로 base 검출 (apply_cross=false) → nch, ch3 판정
- per-trace cross 검출 → BV 계산 → std/mean = bv_cv
- Rule A (ch3 필수 + per-trace 검출률 ≥ CH3_HIT_MIN 0.80 + max nch + min bv_cv tie)
Pass 2 (guide):
- 재측정 한 위치 → target 기준 (ch3='O' & 검출률≥80% & nch≥t.nch &
bv_cv ≤ t.bv_cv × (1 + bvCvTol)) 충족 시 STOP, 아니면 MOVE_UP.
포팅 원칙:
- MethodDRunner (기존) 재사용, apply_cross=false/true 두 모드 활용.
- PiezoBVEstimator.estimateBladderVolume6ch (기존) 재사용.
- alignment_selection.py 의 select_cm(rule='A', tie='bvcv') 로직 완전 이식.
검증 (CenterAlignerValidationTest, data123 인체 3 세션):
- Python reference 와 nch/ch3/ch3_hit 완전 일치.
- bv_cv 오차 <2% (정상 case). BV 발산 케이스 (ch3=X) 만 큰 오차 —
Rule A 에서 어차피 탈락하므로 최종 선택 영향 없음.
- 최종 선택 위치 = cm=3 (Python 과 일치).
주의: test 실행 전 PiezoHW.activePreset 를 V1 로 명시 설정 필요.
실기기는 BleManager 가 device name 으로 autoDetectPreset 처리.
UI 통합 (Pass 1 위치 안내 + Pass 2 판정 화면) 은 후속 작업.