add slope based class
This commit is contained in:
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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 = "",
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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 =
|
||||
|
||||
Reference in New Issue
Block a user