Browse Source

createPulsatilityIndex

Melon 10 months ago
parent
commit
28573dade9

+ 1 - 0
lib/interfaces/process/items/types.dart

@@ -159,6 +159,7 @@ class MeasureTypes {
   static const ResistivityIndexTwoLocationByEd =
       "ResistivityIndexTwoLocationByEd";
   static const MaxPgTwoLocation = "MaxPgTwoLocation";
+  static const PulsatilityIndexTwoLocation = "PulsatilityIndexTwoLocation";
 
   static const HR = "Hr";
   /* AI [begin]*/

+ 36 - 0
lib/process/calcuators/formulas/general.dart

@@ -64,6 +64,12 @@ class GeneralFormulas {
   static double flowVolTAMAX(
           double flowArea, double tamean, double coefficient) =>
       _singleton.flowVolTAMAX(flowArea, tamean, coefficient);
+
+  static double pi(double ps, double mdEd, double tamax) =>
+      _singleton.pi(ps, mdEd, tamax);
+
+  static double medianVelocity(double ps, double ed) =>
+      _singleton.medianVelocity(ps, ed);
 }
 
 abstract class IGeneralFormulaStrategy {
@@ -94,6 +100,23 @@ abstract class IGeneralFormulaStrategy {
   double maxPG(double v1, double v2);
   double area(double d1, double d2);
   double flowVolTAMAX(double flowArea, double tamean, double coefficient);
+
+  /// <summary>
+  /// Pulastility Index
+  /// <para>PI (ED):(PS - ED)/TAMAX</para>
+  /// <para>PI (MD):(PS - MD)/TAMAX</para>
+  /// </summary>
+  /// <param name="ps">Unit cm/s</param>
+  /// <param name="md_ed">Unit cm/s</param>
+  /// <param name="tamax">Unit cm/s</param>
+  /// <returns>Unit none</returns>
+  /// 在TCCD下用Vmean替换tamax计算
+  double pi(double ps, double mdEd, double tamax);
+
+  /// <param name="ps">Unit cm/s</param>
+  /// <param name="ed">Unit cm/s</param>
+  /// <returns>Unit cm/s</returns>
+  double medianVelocity(double ps, double ed);
 }
 
 class BaseGeneralFormulas implements IGeneralFormulaStrategy {
@@ -425,6 +448,19 @@ class BaseGeneralFormulas implements IGeneralFormulaStrategy {
     double flowVol = flowArea * tamean.abs() * coefficient;
     return flowVol;
   }
+
+  @override
+  double pi(double ps, double mdEd, double tamax) {
+    double pi = (ps - mdEd) / tamax;
+    return pi.abs();
+  }
+
+  @override
+  double medianVelocity(double ps, double ed) {
+    ps = ps.abs();
+    ed = ed.abs();
+    return (ps + 2 * ed) / 3;
+  }
 }
 
 class AnimalsGeneralFormulas extends BaseGeneralFormulas {}

+ 43 - 0
lib/process/calcuators/two_location.dart

@@ -1,14 +1,57 @@
+import 'package:fis_measure/interfaces/process/items/item_metas.dart';
+import 'package:fis_measure/interfaces/process/items/terms.dart';
 import 'package:fis_measure/process/primitives/combos/two_location.dart';
+import 'package:vid/us/vid_us_unit.dart';
 
 import 'calculator.dart';
+import 'formulas/general.dart';
 
 class PulsatilityIndexCal extends Calculator<TwoLocation, double> {
   PulsatilityIndexCal(super.ref);
 
+  static const pulsatilityIndexKey = "PI(TCD)";
+
   @override
   void calculate() {
     if (ref.feature == null) return;
 
     final feature = ref.feature!;
+
+    feature.values.clear();
+
+    feature.updateStringValue(
+      ItemOutputMeta(ref.displayName, ref.description, VidUsUnit.None),
+      '',
+    );
+
+    double pi = double.nan;
+    double ps = double.nan;
+    double ed = double.nan;
+    double vMean = double.nan;
+
+    final child1Feature = findChildFeature(ref.child1);
+    final child2Feature = findChildFeature(ref.child2);
+    if (child1Feature != null && child2Feature != null) {
+      ps = pickChildFloatValue(ref.child1) ?? double.nan;
+      ed = pickChildFloatValue(ref.child2) ?? double.nan;
+
+      ps = roundDouble(ps);
+      ed = roundDouble(ed);
+
+      vMean = GeneralFormulas.medianVelocity(ps, ed);
+      pi = GeneralFormulas.pi(ps, ed, vMean);
+    }
+
+    for (var output in ref.meta.outputs) {
+      if (output.name == pulsatilityIndexKey) {
+        if (!pi.isNaN) {
+          feature.updateFloatValue(output, roundDouble(pi), VidUsUnit.None);
+        }
+      } else if (output.name == MeasureTerms.VelocityMean) {
+        if (!vMean.isNaN) {
+          feature.updateFloatValue(output, roundDouble(vMean), VidUsUnit.cms);
+        }
+      }
+    }
   }
 }

+ 2 - 0
lib/process/items/factory.dart

@@ -135,6 +135,8 @@ class MeasureItemFactory {
         TwoLocation.createResistivityIndexTwoLocationByEd);
     _singleton._register(
         MeasureTypes.MaxPgTwoLocation, TwoLocation.createMaxPgTwoLocation);
+    _singleton._register(MeasureTypes.PulsatilityIndexTwoLocation,
+        TwoLocation.createPulsatilityIndex);
 
     // Straight
     _singleton._register(MeasureTypes.Distance, StraightLine.createDistance);

+ 2 - 1
lib/process/primitives/combos/two_location.dart

@@ -3,6 +3,7 @@ import 'package:fis_measure/interfaces/process/items/item_metas.dart';
 import 'package:fis_measure/process/calcuators/a_b_ratio.dart';
 import 'package:fis_measure/process/calcuators/pg.dart';
 import 'package:fis_measure/process/calcuators/resistivity_index.dart';
+import 'package:fis_measure/process/calcuators/two_location.dart';
 import 'package:fis_measure/process/items/top_item_feature.dart';
 import 'package:fis_measure/process/primitives/location.dart';
 
@@ -64,7 +65,7 @@ class TwoLocation extends TwoLengthAbstract<TwoLocationFeature> {
   static TwoLocation createPulsatilityIndex(ItemMeta meta,
       [IMeasureItem? parent]) {
     TwoLocation twoLocation = TwoLocation(meta);
-    twoLocation.calculator = MaxPgCal(twoLocation);
+    twoLocation.calculator = PulsatilityIndexCal(twoLocation);
     return twoLocation;
   }
 }

+ 2 - 2
pubspec.lock

@@ -191,8 +191,8 @@ packages:
     dependency: "direct main"
     description:
       path: "."
-      ref: "4f117f7"
-      resolved-ref: "4f117f7c0a9a8de1f008e928425202372b7b6968"
+      ref: "37e5f99"
+      resolved-ref: "37e5f9904cf8a20a7f7ff4a5cb5687071f12e6c3"
       url: "http://git.ius.plus:88/Project-Wing/fis_lib_jsonrpc.git"
     source: git
     version: "0.0.1"