pisa.dart 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import 'package:fis_measure/interfaces/process/items/item_metas.dart';
  2. import 'package:fis_measure/interfaces/process/items/terms.dart';
  3. import 'package:fis_measure/process/calcuators/formulas/cardiac.dart';
  4. import 'package:fis_measure/process/primitives/combos/pisa.dart';
  5. import 'package:vid/us/vid_us_unit.dart';
  6. import 'calculator.dart';
  7. import 'trace.dart';
  8. class PisaCal extends Calculator<Pisa, double> {
  9. PisaCal(super.ref);
  10. static const String vMaxKey = "Vmax";
  11. static const String rvKey = "RV";
  12. static const String eroaKey = "EROA";
  13. static const String flowRateKey = "Flow Rate";
  14. @override
  15. void calculate() {
  16. if (ref.feature == null) return;
  17. final feature = ref.feature!;
  18. feature.values.clear();
  19. feature.updateStringValue(
  20. ItemOutputMeta(ref.displayName, ref.description, VidUsUnit.None),
  21. '',
  22. );
  23. // final yUnit= ref.application.currentViewPort.yUnit;
  24. double mrRadius = double.nan;
  25. double vti = double.nan;
  26. double mrVmax = double.nan;
  27. final radiusFeature = findChildFeature(ref.radius);
  28. if (radiusFeature != null) {
  29. mrRadius = pickChildFloatValue(ref.radius)!;
  30. final output = ref.radius.meta.outputs.first;
  31. feature.updateFloatValue(output, mrRadius, VidUsUnit.cm);
  32. }
  33. final vtiFeature = findChildFeature(ref.trace);
  34. if (vtiFeature != null) {
  35. final countVTIResult = TraceCal.getCountVTI(vtiFeature);
  36. var outputVTI = countVTIResult[0];
  37. var outputVelocityMax = countVTIResult[3];
  38. vti = outputVTI;
  39. mrVmax = outputVelocityMax;
  40. final outputs = ref.trace.meta.outputs;
  41. for (var output in outputs) {
  42. if (output.name == MeasureTerms.Placeholder) {
  43. feature.updateStringValue(output, "");
  44. } else if (output.name == MeasureTerms.VTI) {
  45. feature.updateFloatValue(output, vti, VidUsUnit.cm);
  46. } else if (output.name == MeasureTerms.VelocityMax) {
  47. feature.updateFloatValue(output, mrVmax, VidUsUnit.cms);
  48. }
  49. }
  50. }
  51. double mrAlsVel = ref.alsVel;
  52. double mrRV = double.nan;
  53. double mrEROA = double.nan;
  54. double mrFlowRate = double.nan;
  55. if (!mrRadius.isNaN && !vti.isNaN && !mrVmax.isNaN && !mrAlsVel.isNaN) {
  56. mrEROA = CardiacFormulas.mrEROA(mrRadius, mrAlsVel, mrVmax);
  57. mrRV = CardiacFormulas.mrRV(mrEROA, vti);
  58. mrFlowRate = CardiacFormulas.mrFlowRate(mrRadius, mrAlsVel);
  59. }
  60. for (var output in ref.meta.outputs) {
  61. if (output.name == rvKey) {
  62. if (!mrRV.isNaN) {
  63. feature.updateFloatValue(output, mrVmax, VidUsUnit.ml);
  64. }
  65. } else if (output.name == eroaKey) {
  66. if (!mrEROA.isNaN) {
  67. feature.updateFloatValue(output, mrEROA, VidUsUnit.cm2);
  68. }
  69. } else if (output.name == flowRateKey) {
  70. if (!mrFlowRate.isNaN) {
  71. feature.updateFloatValue(output, mrFlowRate, VidUsUnit.mls);
  72. }
  73. } else if (output.name == MeasureTerms.AlsVel) {
  74. if (!mrAlsVel.isNaN) {
  75. feature.updateFloatValue(output, mrAlsVel, VidUsUnit.cms);
  76. }
  77. }
  78. }
  79. }
  80. }