lv_study.dart 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  1. import 'package:fis_measure/configs/cardiac.dart';
  2. import 'package:fis_measure/configs/patient.dart';
  3. import 'package:fis_measure/interfaces/enums/calcuator.dart';
  4. import 'package:fis_measure/interfaces/process/items/item.dart';
  5. import 'package:fis_measure/interfaces/process/items/terms.dart';
  6. import 'package:fis_measure/process/items/top_item.dart';
  7. import 'package:fis_measure/process/primitives/combos/lv_study.dart';
  8. import 'package:fis_measure/process/primitives/combos/two_straightline.dart';
  9. import 'package:fis_measure/process/primitives/straightline.dart';
  10. import 'package:flutter/foundation.dart';
  11. import 'package:vid/us/vid_us_unit.dart';
  12. import 'dart:math' as math;
  13. import 'calculator.dart';
  14. import 'formulas/cardiac.dart';
  15. class LvStudySimpleCal extends LvStudyCalculatorBase<LvStudy> {
  16. late final StraightLine kidLVIDd;
  17. late final StraightLine kidLVIDs;
  18. LvStudySimpleCal(super.ref) {
  19. kidLVIDd = ref.findChildByName("L1") as StraightLine;
  20. kidLVIDs = ref.findChildByName("L2") as StraightLine;
  21. }
  22. @override
  23. void calculate() {
  24. if (ref.feature == null) return;
  25. final feature = ref.feature!;
  26. restoreVals();
  27. v.lvidd = pickChildFloatValue(kidLVIDd);
  28. v.lvids = pickChildFloatValue(kidLVIDs);
  29. for (var output in ref.meta.outputs) {
  30. switch (output.name) {
  31. case MeasureTerms.LvStudySimple:
  32. feature.updateStringValue(output, "");
  33. break;
  34. case MeasureTerms.LVEDV:
  35. updateLVEDV();
  36. break;
  37. case MeasureTerms.LVESV:
  38. updateLVESV();
  39. break;
  40. case MeasureTerms.SV:
  41. updateSV();
  42. break;
  43. case MeasureTerms.EF:
  44. updateEF();
  45. break;
  46. case MeasureTerms.FS:
  47. updatePercentFS();
  48. break;
  49. }
  50. }
  51. }
  52. }
  53. class LvStudyDistanceGroupCal extends LvStudyCalculatorBase<LvStudy> {
  54. late final StraightLine kidIVSd;
  55. late final StraightLine kidLVIDd;
  56. late final StraightLine kidLVPWd;
  57. late final StraightLine kidIVSs;
  58. late final StraightLine kidLVIDs;
  59. late final StraightLine kidLVPWs;
  60. LvStudyDistanceGroupCal(super.ref) {
  61. kidIVSd = ref.findChildByName(MeasureTerms.IVSd) as StraightLine;
  62. kidLVIDd = ref.findChildByName(MeasureTerms.LVIDd) as StraightLine;
  63. kidLVPWd = ref.findChildByName(MeasureTerms.LVPWd) as StraightLine;
  64. kidIVSs = ref.findChildByName(MeasureTerms.IVSs) as StraightLine;
  65. kidLVIDs = ref.findChildByName(MeasureTerms.LVIDs) as StraightLine;
  66. kidLVPWs = ref.findChildByName(MeasureTerms.LVPWs) as StraightLine;
  67. }
  68. @override
  69. void calculate() {
  70. if (ref.feature == null) return;
  71. final feature = ref.feature!;
  72. v = _ValTemp();
  73. v.ivsd = pickChildFloatValue(kidIVSd);
  74. v.ivss = pickChildFloatValue(kidIVSs);
  75. v.lvidd = pickChildFloatValue(kidLVIDd);
  76. v.lvids = pickChildFloatValue(kidLVIDs);
  77. v.lvpwd = pickChildFloatValue(kidLVPWd);
  78. v.lvpws = pickChildFloatValue(kidLVPWs);
  79. for (var output in ref.meta.outputs) {
  80. switch (output.name) {
  81. case MeasureTerms.LvStudy:
  82. feature.updateStringValue(output, "");
  83. break;
  84. case MeasureTerms.LVEDV:
  85. updateLVEDV();
  86. break;
  87. case MeasureTerms.LVESV:
  88. updateLVESV();
  89. break;
  90. case MeasureTerms.LVdMass:
  91. updateLVdMass();
  92. break;
  93. case MeasureTerms.PercentIVS:
  94. updatePercentIVS();
  95. break;
  96. case MeasureTerms.SV:
  97. updateSV();
  98. break;
  99. case MeasureTerms.EF:
  100. updateEF();
  101. break;
  102. case MeasureTerms.FS:
  103. updatePercentFS();
  104. break;
  105. case MeasureTerms.PercentLVPW:
  106. updatePercentLVPW();
  107. break;
  108. case MeasureTerms.CO:
  109. updateCO();
  110. break;
  111. case MeasureTerms.CI:
  112. updateCI();
  113. break;
  114. case MeasureTerms.SI:
  115. updateSI();
  116. break;
  117. }
  118. }
  119. }
  120. }
  121. class LvStudyCalculatorBase<T extends TopMeasureItem>
  122. extends Calculator<T, double> {
  123. LvStudyCalculatorBase(super.ref);
  124. @protected
  125. late _ValTemp v;
  126. @override
  127. void calculate() {
  128. // TODO: implement calculate
  129. }
  130. void restoreVals() {
  131. v = _ValTemp();
  132. }
  133. @protected
  134. void updateLVEDV() {
  135. if (v.lvidd == null) {
  136. return;
  137. }
  138. final lvidd = v.lvidd!;
  139. double value = 0;
  140. if (GlobalCardiacConfigs.EDVFormulaMode ==
  141. CardiacEDVFormulaMode.teichholz) {
  142. value = CardiacFormulas.edvTeichholz(lvidd);
  143. } else if (GlobalCardiacConfigs.EDVFormulaMode ==
  144. CardiacEDVFormulaMode.cube) {
  145. value = CardiacFormulas.edvCube(lvidd);
  146. }
  147. updateFloatValueByName(MeasureTerms.LVEDV, value, unit: VidUsUnit.cm3);
  148. v.lvedv = value;
  149. }
  150. @protected
  151. void updateLVESV() {
  152. if (v.lvids == null) {
  153. return;
  154. }
  155. final lvids = v.lvids!;
  156. double value = 0;
  157. if (GlobalCardiacConfigs.EDVFormulaMode ==
  158. CardiacEDVFormulaMode.teichholz) {
  159. value = CardiacFormulas.esvTeichholz(lvids);
  160. } else if (GlobalCardiacConfigs.EDVFormulaMode ==
  161. CardiacEDVFormulaMode.cube) {
  162. value = CardiacFormulas.esvCube(lvids);
  163. }
  164. updateFloatValueByName(MeasureTerms.LVESV, value, unit: VidUsUnit.cm3);
  165. v.lvesv = value;
  166. }
  167. @protected
  168. void updateLVdMass() {
  169. if (v.ivsd == null || v.lvidd == null || v.lvpwd == null) {
  170. return;
  171. }
  172. double value = CardiacFormulas.lvdMass(v.ivsd!, v.lvidd!, v.lvpwd!);
  173. updateFloatValueByName(MeasureTerms.LVdMass, value, unit: VidUsUnit.kg);
  174. }
  175. @protected
  176. void updatePercentIVS() {
  177. if (v.ivsd == null || v.ivss == null) {
  178. return;
  179. }
  180. double value = CardiacFormulas.ivsPercent(v.ivss!, v.ivsd!);
  181. updateFloatValueByName(MeasureTerms.PercentIVS, value);
  182. }
  183. @protected
  184. void updateSV() {
  185. if (v.lvedv == null || v.lvesv == null) {
  186. return;
  187. }
  188. final edv = v.lvedv!;
  189. final esv = v.lvesv!;
  190. double value = CardiacFormulas.sv(edv, esv);
  191. updateFloatValueByName(MeasureTerms.SV, value, unit: VidUsUnit.cm3);
  192. v.sv = value;
  193. }
  194. @protected
  195. void updateEF() {
  196. if (v.lvedv == null || v.lvesv == null) {
  197. return;
  198. }
  199. final edv = v.lvedv!;
  200. final esv = v.lvesv!;
  201. double value = CardiacFormulas.ef(edv, esv);
  202. updateFloatValueByName(MeasureTerms.EF, value, unit: VidUsUnit.percent);
  203. }
  204. @protected
  205. void updatePercentFS() {
  206. if (v.lvidd == null || v.lvids == null) {
  207. return;
  208. }
  209. final lvidd = v.lvidd!;
  210. final lvids = v.lvids!;
  211. double value = CardiacFormulas.fsPercent(lvidd, lvids);
  212. updateFloatValueByName(MeasureTerms.FS, value);
  213. }
  214. @protected
  215. void updatePercentLVPW() {
  216. if (v.lvpws == null || v.lvpwd == null) {
  217. return;
  218. }
  219. final lvpws = v.lvpws!;
  220. final lvpwd = v.lvpwd!;
  221. double value = CardiacFormulas.lvpwPercent(lvpws, lvpwd);
  222. updateFloatValueByName(MeasureTerms.PercentLVPW, value);
  223. }
  224. @protected
  225. void updateCO() {
  226. if (v.sv == null || v.hr == null) {
  227. return;
  228. }
  229. double value = CardiacFormulas.co(v.sv!, hr: v.hr!);
  230. updateFloatValueByName(MeasureTerms.CO, value, unit: VidUsUnit.Lmin);
  231. }
  232. @protected
  233. void updateCI() {
  234. if (v.sv == null || v.hr == null) {
  235. return;
  236. }
  237. if (GlobalPatientConfig.bsa == 0) {
  238. return;
  239. }
  240. double value = CardiacFormulas.ci(
  241. v.sv!,
  242. hr: v.hr!,
  243. bsa: GlobalPatientConfig.bsa,
  244. );
  245. updateFloatValueByName(MeasureTerms.CI, value, unit: VidUsUnit.Lminm2);
  246. }
  247. @protected
  248. void updateLVEDVI() {
  249. if (v.lvedv == null) {
  250. return;
  251. }
  252. if (GlobalPatientConfig.bsa == 0) {
  253. return;
  254. }
  255. final value = CardiacFormulas.lvevi(v.lvedv!, GlobalPatientConfig.bsa);
  256. updateFloatValueByName(MeasureTerms.LVEDVI, value, unit: VidUsUnit.mlm2);
  257. }
  258. @protected
  259. void updateLVESVI() {
  260. if (v.lvesv == null) {
  261. return;
  262. }
  263. if (GlobalPatientConfig.bsa == 0) {
  264. return;
  265. }
  266. final value = CardiacFormulas.lvevi(v.lvesv!, GlobalPatientConfig.bsa);
  267. updateFloatValueByName(MeasureTerms.LVESVI, value, unit: VidUsUnit.mlm2);
  268. }
  269. @protected
  270. void updateSI() {
  271. if (v.sv == null) {
  272. return;
  273. }
  274. if (GlobalPatientConfig.bsa == 0) {
  275. return;
  276. }
  277. double value = CardiacFormulas.si(v.sv!, GlobalPatientConfig.bsa);
  278. updateFloatValueByName(MeasureTerms.SI, value, unit: VidUsUnit.mlm2);
  279. }
  280. @protected
  281. void updateFloatValueByName(
  282. String name,
  283. double value, {
  284. VidUsUnit? unit,
  285. }) {
  286. ref.measuredFeatures;
  287. final feature = ref.feature!;
  288. final outputMeta = ref.meta.outputs.firstWhere((x) => x.name == name);
  289. feature.updateFloatValue(outputMeta, value, unit ?? outputMeta.unit);
  290. }
  291. }
  292. class _ValTemp {
  293. double? ivsd;
  294. double? lvidd;
  295. double? lvpwd;
  296. double? ivss;
  297. double? lvids;
  298. double? lvpws;
  299. double? lvedv;
  300. double? lvesv;
  301. double? sv;
  302. int? hr = GlobalPatientConfig.hr; // TODO: from vid ext
  303. }