|
@@ -0,0 +1,212 @@
|
|
|
+import 'package:fis_measure/configs/cardiac.dart';
|
|
|
+import 'package:fis_measure/configs/patient.dart';
|
|
|
+import 'package:fis_measure/interfaces/enums/calcuator.dart';
|
|
|
+import 'package:fis_measure/interfaces/process/items/terms.dart';
|
|
|
+import 'package:fis_measure/process/primitives/combos/straightline_group.dart';
|
|
|
+import 'package:fis_measure/process/primitives/straightline.dart';
|
|
|
+import 'package:vid/us/vid_us_unit.dart';
|
|
|
+import 'dart:math' as math;
|
|
|
+
|
|
|
+import 'calculator.dart';
|
|
|
+import 'formulas/cardiac.dart';
|
|
|
+
|
|
|
+class LvStudyDistanceGroupCal extends Calculator<StraightLineGroup, double> {
|
|
|
+ late final StraightLine kidIVSd;
|
|
|
+ late final StraightLine kidLVIDd;
|
|
|
+ late final StraightLine kidLVPWd;
|
|
|
+ late final StraightLine kidIVSs;
|
|
|
+ late final StraightLine kidLVIDs;
|
|
|
+ late final StraightLine kidLVPWs;
|
|
|
+ late _ValTemp _v;
|
|
|
+
|
|
|
+ LvStudyDistanceGroupCal(super.ref) {
|
|
|
+ kidIVSd = ref.findChildByName(MeasureTerms.IVSd) as StraightLine;
|
|
|
+ kidLVIDd = ref.findChildByName(MeasureTerms.LVIDd) as StraightLine;
|
|
|
+ kidLVPWd = ref.findChildByName(MeasureTerms.LVPWd) as StraightLine;
|
|
|
+ kidIVSs = ref.findChildByName(MeasureTerms.IVSs) as StraightLine;
|
|
|
+ kidLVIDs = ref.findChildByName(MeasureTerms.LVIDs) as StraightLine;
|
|
|
+ kidLVPWs = ref.findChildByName(MeasureTerms.LVPWs) as StraightLine;
|
|
|
+ }
|
|
|
+
|
|
|
+ @override
|
|
|
+ void calculate() {
|
|
|
+ if (ref.feature == null) return;
|
|
|
+
|
|
|
+ final feature = ref.feature!;
|
|
|
+
|
|
|
+
|
|
|
+ _v = _ValTemp();
|
|
|
+ _v.ivsd = pickChildFloatValue(kidIVSd);
|
|
|
+ _v.ivss = pickChildFloatValue(kidIVSs);
|
|
|
+ _v.lvidd = pickChildFloatValue(kidLVIDd);
|
|
|
+ _v.lvids = pickChildFloatValue(kidLVIDs);
|
|
|
+ _v.lvpwd = pickChildFloatValue(kidLVPWd);
|
|
|
+ _v.lvpws = pickChildFloatValue(kidLVPWs);
|
|
|
+
|
|
|
+ for (var output in ref.meta.outputs) {
|
|
|
+ switch (output.name) {
|
|
|
+ case MeasureTerms.LvStudy:
|
|
|
+ feature.updateStringValue(output, "");
|
|
|
+ break;
|
|
|
+ case MeasureTerms.LVEDV:
|
|
|
+ _updateLVEDV();
|
|
|
+ break;
|
|
|
+ case MeasureTerms.LVESV:
|
|
|
+ _updateLVESV();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ ref.feature!.values;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ void _updateLVEDV() {
|
|
|
+ if (_v.lvidd == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ final lvidd = _v.lvidd!;
|
|
|
+
|
|
|
+ double value = 0;
|
|
|
+ if (GlobalCardiacConfigs.EDVFormulaMode ==
|
|
|
+ CardiacEDVFormulaMode.teichholz) {
|
|
|
+ value = CardiacFormulas.edvTeichholz(lvidd);
|
|
|
+ } else if (GlobalCardiacConfigs.EDVFormulaMode ==
|
|
|
+ CardiacEDVFormulaMode.cube) {
|
|
|
+ value = CardiacFormulas.edvCube(lvidd);
|
|
|
+ }
|
|
|
+ _updateFloatValueByName(MeasureTerms.LVEDV, value, unit: VidUsUnit.cm3);
|
|
|
+ _v.lvedv = value;
|
|
|
+ }
|
|
|
+
|
|
|
+ void _updateLVESV() {
|
|
|
+ if (_v.lvidd == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ final lvids = _v.lvids!;
|
|
|
+
|
|
|
+ double value = 0;
|
|
|
+ if (GlobalCardiacConfigs.EDVFormulaMode ==
|
|
|
+ CardiacEDVFormulaMode.teichholz) {
|
|
|
+ value = CardiacFormulas.esvTeichholz(lvids);
|
|
|
+ } else if (GlobalCardiacConfigs.EDVFormulaMode ==
|
|
|
+ CardiacEDVFormulaMode.cube) {
|
|
|
+ value = CardiacFormulas.esvCube(lvids);
|
|
|
+ }
|
|
|
+ _updateFloatValueByName(MeasureTerms.LVESV, value, unit: VidUsUnit.cm3);
|
|
|
+ _v.lvesv = value;
|
|
|
+ }
|
|
|
+
|
|
|
+ void _updateSV() {
|
|
|
+ if (_v.lvedv == null || _v.lvesv == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ final edv = _v.lvedv!;
|
|
|
+ final esv = _v.lvesv!;
|
|
|
+ double value = edv - esv;
|
|
|
+ _updateFloatValueByName(MeasureTerms.SV, value);
|
|
|
+ _v.sv = value;
|
|
|
+ }
|
|
|
+
|
|
|
+ void _updateEF() {
|
|
|
+ if (_v.lvedv == null || _v.lvesv == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ final edv = _v.lvedv!;
|
|
|
+ final esv = _v.lvesv!;
|
|
|
+ double value = ((edv - esv) / edv) * 100;
|
|
|
+ _updateFloatValueByName(MeasureTerms.EF, value);
|
|
|
+ _v.sv = value;
|
|
|
+ }
|
|
|
+
|
|
|
+ void _updatePercentFS(double lvidd, double lvids) {
|
|
|
+ double value = ((lvidd - lvids) / lvidd) * 100;
|
|
|
+ _updateFloatValueByName(MeasureTerms.FS, value);
|
|
|
+ _v.sv = value;
|
|
|
+ }
|
|
|
+
|
|
|
+ void _updatePercentIVS(double ivss, double ivsd) {
|
|
|
+ double value = ((ivss - ivsd) / ivsd) * 100;
|
|
|
+ _updateFloatValueByName(MeasureTerms.PercentIVS, value);
|
|
|
+ _v.sv = value;
|
|
|
+ }
|
|
|
+
|
|
|
+ void _updatePercentLVPW(double lvpws, double lvpwd) {
|
|
|
+ double value = ((lvpws - lvpwd) / lvpwd) * 100;
|
|
|
+ _updateFloatValueByName(MeasureTerms.PercentLVPW, value);
|
|
|
+ _v.sv = value;
|
|
|
+ }
|
|
|
+
|
|
|
+ void _updateLVdMass(double ivsd, double lvidd, double lvpwd) {
|
|
|
+ const density = GlobalCardiacConfigs.density;
|
|
|
+ const correctionFactor = GlobalCardiacConfigs.correctionFactor;
|
|
|
+ double part1 = math.pow(ivsd + lvidd + lvpwd, 3).toDouble();
|
|
|
+ double part2 = math.pow(lvidd, 3).toDouble();
|
|
|
+ double value = ((density * part1 - part2) + correctionFactor) / 1000.0;
|
|
|
+ _updateFloatValueByName(MeasureTerms.LVdMass, value);
|
|
|
+ _v.sv = value;
|
|
|
+ }
|
|
|
+
|
|
|
+ void _updateCO() {
|
|
|
+ if (_v.sv == null || _v.hr == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ double value = (_v.sv! - _v.hr!) / 1000.0;
|
|
|
+ _updateFloatValueByName(MeasureTerms.CO, value);
|
|
|
+ }
|
|
|
+
|
|
|
+ void _updateCI() {
|
|
|
+ if (_v.sv == null || _v.hr == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ double value = ((_v.sv! - _v.hr!) / 1000.0) / GlobalPatientConfig.BSA;
|
|
|
+ _updateFloatValueByName(MeasureTerms.CI, value);
|
|
|
+ }
|
|
|
+
|
|
|
+ void _updateFloatValueByName(
|
|
|
+ String name,
|
|
|
+ double value, {
|
|
|
+ VidUsUnit? unit,
|
|
|
+ }) {
|
|
|
+ ref.measuredFeatures;
|
|
|
+ final feature = ref.feature!;
|
|
|
+ final outputMeta = ref.meta.outputs.firstWhere((x) => x.name == name);
|
|
|
+ feature.updateFloatValue(outputMeta, value, unit ?? outputMeta.unit);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+class _ValTemp {
|
|
|
+ double? ivsd = 0.0;
|
|
|
+ double? lvidd = 0.0;
|
|
|
+ double? lvpwd = 0.0;
|
|
|
+ double? ivss = 0.0;
|
|
|
+ double? lvids = 0.0;
|
|
|
+ double? lvpws = 0.0;
|
|
|
+
|
|
|
+ double? lvedv = 0.0;
|
|
|
+ double? lvesv = 0.0;
|
|
|
+ double? sv = 0.0;
|
|
|
+ double? hr = 0.0;
|
|
|
+}
|