diff --git a/app/src/main/java/com/medithings/vesiscan/managers/AlignmentAdvisorV3.kt b/app/src/main/java/com/medithings/vesiscan/managers/AlignmentAdvisorV3.kt index 3a369b3..05d6ca1 100644 --- a/app/src/main/java/com/medithings/vesiscan/managers/AlignmentAdvisorV3.kt +++ b/app/src/main/java/com/medithings/vesiscan/managers/AlignmentAdvisorV3.kt @@ -197,16 +197,25 @@ class CenterAligner( r?.let { Pair(it.ant, it.post) } } val bv = estimateBladderVolume6ch(allWalls) - bv?.volumeMl?.let { if (it.isFinite() && it > 0) bvs.add(it) } + // Python `position_records`: `if bv is not None: bvs.append(float(bv.volume_ml))` + // nan/0 필터 없이 그대로 추가. nan 발생 시 std/mean 모두 nan → bv_cv=null → + // `selectCm` tie 정렬에서 +inf 로 취급되어 뒷순위로 밀림 (Python 과 동일 동작). + bv?.let { bvs.add(it.volumeMl) } } + // Python: `float(np.std(bvs) / np.mean(bvs)) if len(bvs)>=2 and np.mean(bvs) else nan` + // nan 이 하나라도 있으면 std/mean 모두 nan → 결과 nan (Kotlin: null). val bvCv: Double? = if (bvs.size >= 2) { val m = bvs.average() - if (m != 0.0) { + if (m != 0.0 && m.isFinite()) { val sd = sqrt(bvs.map { (it - m) * (it - m) }.average()) - sd / m + val cv = sd / m + if (cv.isFinite()) cv else null } else null } else null - val meanBv = if (bvs.isNotEmpty()) bvs.average() else null + val meanBv = if (bvs.isNotEmpty()) { + val m = bvs.average() + if (m.isFinite()) m else null + } else null return AlignPositionRecord( alignCm = cm, nch = nch, ch3Detected = ch3Detected,