From 9183c97aef45d5cd3776fa02d17300b72f5130ae Mon Sep 17 00:00:00 2001 From: Pritimay Sarkar Date: Thu, 21 Dec 2023 16:14:29 +0530 Subject: [PATCH] add slope based class --- app/build.gradle | 6 +- .../hpostesting/data/constant/Constants.kt | 12 ++-- .../data/model/patient/HemoCubeTestData.kt | 3 + .../presentation/hemocube/HemoCubeFragment.kt | 66 ++++++++++++++++++- .../hemocube/HemoCubeViewModel.kt | 3 + 5 files changed, 80 insertions(+), 10 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 0a45e20..3fc030e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,11 +16,11 @@ android { // prod - production, preprod - preproduction, quality - qc defaultConfig { - applicationId "in.sminnovations.hpostesting" + applicationId "in.sminnovations.hpostesting.preprod" minSdk 21 targetSdk 34 - versionCode 56 - versionName "2.1.56" + versionCode 60 + versionName "2.1.60" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } diff --git a/app/src/main/java/com/example/hpostesting/data/constant/Constants.kt b/app/src/main/java/com/example/hpostesting/data/constant/Constants.kt index 891c3a5..5f65f52 100644 --- a/app/src/main/java/com/example/hpostesting/data/constant/Constants.kt +++ b/app/src/main/java/com/example/hpostesting/data/constant/Constants.kt @@ -128,21 +128,21 @@ object Constants { listOf(1.0, 0.0) // LED4 ), "HCV-000-3005" to listOf( - listOf(1.7272, -1.1977), // LED1, 435nm + listOf(1.3801, -0.372), // LED1, 435nm listOf(0.581462456, -0.58502), // LED2, 415nm - listOf(0.2304, -0.0145), // LED3, 555nm + listOf(0.4565, -0.0371), // LED3, 555nm listOf(1.0, 0.0) // LED4 ), "HCV-000-3006" to listOf( - listOf(1.7272, -1.1977), // LED1, 435nm + listOf(1.3801, -0.372), // LED1, 435nm listOf(0.581462456, -0.58502), // LED2, 415nm - listOf(0.2304, -0.0145), // LED3, 555nm + listOf(0.4565, -0.0371), // LED3, 555nm listOf(1.0, 0.0) // LED4 ), "HCV-000-3007" to listOf( - listOf(1.7272, -1.1977), // LED1, 435nm + listOf(1.8445, -0.8213), // LED1, 435nm listOf(0.581462456, -0.58502), // LED2, 415nm - listOf(0.2304, -0.0145), // LED3, 555nm + listOf(0.4613, -0.0831), // LED3, 555nm listOf(1.0, 0.0) // LED4 ), "HCV-000-3008" to listOf( diff --git a/app/src/main/java/com/example/hpostesting/data/model/patient/HemoCubeTestData.kt b/app/src/main/java/com/example/hpostesting/data/model/patient/HemoCubeTestData.kt index 5b22aee..64719fe 100644 --- a/app/src/main/java/com/example/hpostesting/data/model/patient/HemoCubeTestData.kt +++ b/app/src/main/java/com/example/hpostesting/data/model/patient/HemoCubeTestData.kt @@ -46,9 +46,12 @@ data class HemoCubeTestData( var deviceRatio: Double? = null, var calculatedRatio: Double? = null, var predictedDenovixRatio: Double? = null, + var slopeRatio: Double? = null, var coefficients: String? = "", var classificationResult: String = "", var prdClassification: String = "", + var deviceRatioClass: String = "", + var slopeRatioClass: String = "", var errorMessages: String = "", var batteryLevel: String = "", var batteryCapacity: String = "", diff --git a/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeFragment.kt b/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeFragment.kt index 7128812..046e426 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeFragment.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeFragment.kt @@ -504,6 +504,9 @@ class HemoCubeFragment : Fragment() { _predictedDenovixRatio = fittedAbs3.div(fittedAbs1) + val _slopeRatio = (fittedAbs1 - fittedAbs2) / (435 - 415) + val slopeClass = slopeRatioClassification(_slopeRatio) + if (fittedAbs1 <= fittedAbs2) { validationError = true allErrorMessages += "Error: Invalid Test. Problem with de-oxygenation" + "\n" @@ -521,6 +524,14 @@ class HemoCubeFragment : Fragment() { } } + if ((led1Average < 0.7 || led2Average < 0.7 || led3Average < 0.7 || led4Average < 0.7) && _slopeRatio > 35.0) { + validationError = true + activity?.runOnUiThread { + binding.errorMessage.text = "Severely Low Hb. Repeat test with 12 ul in 2 ml Buffer" + binding.errorMessage.visibility = View.VISIBLE + } + } + if (fittedAbs3 < 0.1) { validationError = true allErrorMessages += "Error: Low Hb. Repeat test" + "\n" @@ -552,11 +563,14 @@ class HemoCubeFragment : Fragment() { this.deviceRatio = deviceRatio this.calculatedRatio = calculateRatio(deviceRatio) this.predictedDenovixRatio = _predictedDenovixRatio + this.slopeRatio = _slopeRatio this.coefficients = currentDeviceData?.coefficients?.get(0) .toString() + ", " + currentDeviceData?.coefficients?.get(1).toString() this.classificationResult = findResult(calculatedRatio) this.prdClassification = absorbanceBasedClassification(predictedDenovixRatio) - hemoCubeViewModel.messages.postValue(this.prdClassification) + this.deviceRatioClass = deviceRatioClassification(deviceRatio) + this.slopeRatioClass = slopeRatioClass + hemoCubeViewModel.messages.postValue("Pdr: ${this.prdClassification}\n, Slope: ${this.slopeRatioClass}\n, Device: ${this.deviceRatioClass}") this.errorMessages = allErrorMessages this.resultData = deviceLog this.batteryLevel = hemoCubeViewModel.getBatteryLevel().toString() @@ -626,6 +640,56 @@ class HemoCubeFragment : Fragment() { return getString(R.string.invalid) } + fun deviceRatioClassification(ratio: Double?): String { + try { + hemoCubeViewModel.messages.postValue("result classification") + if (ratio != null) { + if (ratio in 0.0..0.4) + return getString(R.string.normal) + if (ratio in 0.4..0.45) + return getString(R.string.negative_borderline) + if (ratio in 0.45..0.55) + return getString(R.string.sickle_cell_trait) + if (ratio in 0.55..0.575) + return getString(R.string.positive_for_sickle_cell) + if (ratio in 0.09..1.0) + return getString(R.string.sickle_cell_disease) + } else { + return getString(R.string.invalid) + } + } catch (e: Exception) { + showToast(R.string.error_classification) + Firebase.crashlytics.recordException(e) + return getString(R.string.error) + } + return getString(R.string.invalid) + } + + fun slopeRatioClassification(ratio: Double?): String { + try { + hemoCubeViewModel.messages.postValue("result classification") + if (ratio != null) { + if (ratio in 0.0..35.0) + return getString(R.string.normal) + if (ratio in 35.0..40.0) + return getString(R.string.negative_borderline) + if (ratio in 40.0..70.0) + return getString(R.string.sickle_cell_trait) + if (ratio in 70.0..75.0) + return getString(R.string.positive_for_sickle_cell) + if (ratio in 75.0..300.0) + return getString(R.string.sickle_cell_disease) + } else { + return getString(R.string.invalid) + } + } catch (e: Exception) { + showToast(R.string.error_classification) + Firebase.crashlytics.recordException(e) + return getString(R.string.error) + } + return getString(R.string.invalid) + } + private fun absorbanceBasedClassification(predictedDenovixRatio: Double?): String { try { hemoCubeViewModel.messages.postValue("result classification") diff --git a/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeViewModel.kt b/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeViewModel.kt index f32fa04..bffd814 100644 --- a/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeViewModel.kt +++ b/app/src/main/java/com/example/hpostesting/presentation/hemocube/HemoCubeViewModel.kt @@ -129,10 +129,13 @@ class HemoCubeViewModel @Inject constructor( testDetails?.deviceRatio = DataHolder.hemoCubeTestData?.deviceRatio testDetails?.predictedDenovixRatio = DataHolder.hemoCubeTestData?.predictedDenovixRatio testDetails?.calculatedRatio = DataHolder.hemoCubeTestData?.calculatedRatio + testDetails?.slopeRatio = DataHolder.hemoCubeTestData?.slopeRatio testDetails?.coefficients = DataHolder.hemoCubeTestData?.coefficients testDetails?.classificationResult = DataHolder.hemoCubeTestData?.classificationResult!! testDetails?.prdClassification = DataHolder.hemoCubeTestData?.prdClassification.toString() + testDetails?.deviceRatioClass = DataHolder.hemoCubeTestData?.deviceRatioClass!! + testDetails?.slopeRatioClass = DataHolder.hemoCubeTestData?.slopeRatioClass!! testDetails?.batteryLevel = DataHolder.hemoCubeTestData?.batteryLevel.toString() testDetails?.batteryCapacity = DataHolder.hemoCubeTestData?.batteryCapacity.toString() testDetails?.batteryMaxCapacity =