|
@@ -8,9 +8,9 @@ import 'package:fis_measure/utils/number.dart';
|
|
|
|
|
|
class CardiacFormulas {
|
|
|
static final ICardiacFormulaStrategy _singleton =
|
|
|
- GlobalPatientConfig.speciesType != SpeciesType.general
|
|
|
+ GlobalPatientConfig.speciesType == SpeciesType.mouseGeneral
|
|
|
? BaseCardiacFormulas()
|
|
|
- : MouseCardiacFormulas();
|
|
|
+ : AnimalsCardiacFormulas();
|
|
|
|
|
|
static double teiIndex(double co, double et) => _singleton.teiIndex(co, et);
|
|
|
static double ef(double edv, double esv) => _singleton.ef(edv, esv);
|
|
@@ -78,6 +78,7 @@ abstract class ICardiacFormulaStrategy {
|
|
|
[int num = 20]);
|
|
|
}
|
|
|
|
|
|
+/// 实验室小鼠公式
|
|
|
class BaseCardiacFormulas implements ICardiacFormulaStrategy {
|
|
|
/// IMP
|
|
|
///
|
|
@@ -205,6 +206,7 @@ class BaseCardiacFormulas implements ICardiacFormulaStrategy {
|
|
|
}
|
|
|
|
|
|
/// LVdMass
|
|
|
+ /// LVd Mass(2D)
|
|
|
@override
|
|
|
double lvdMass(double ivsd, double lvidd, double lvpwd) {
|
|
|
const density = GlobalCardiacConfigs.density;
|
|
@@ -340,38 +342,91 @@ class BaseCardiacFormulas implements ICardiacFormulaStrategy {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-class MouseCardiacFormulas extends BaseCardiacFormulas {
|
|
|
- MouseCardiacFormulas() : super();
|
|
|
+/// 人用普通公式
|
|
|
+class AnimalsCardiacFormulas extends BaseCardiacFormulas {
|
|
|
+ AnimalsCardiacFormulas() : super();
|
|
|
|
|
|
@override
|
|
|
- double teiIndex(double co, double et) {
|
|
|
- double imp = 0.0;
|
|
|
- if (et != 0.0) {
|
|
|
- imp = (((co).abs() - (et).abs()) / et).abs();
|
|
|
+ double edvTeichholz(double lvidd) {
|
|
|
+ double edv = double.nan;
|
|
|
+ lvidd = lvidd / 10;
|
|
|
+ if (!NumUtil.almostEquals(lvidd, 0)) {
|
|
|
+ edv = 7.0 * math.pow(lvidd, 3) / (2.4 + lvidd);
|
|
|
}
|
|
|
- return imp;
|
|
|
+ return edv;
|
|
|
}
|
|
|
|
|
|
- /// SV
|
|
|
+ /// CO
|
|
|
@override
|
|
|
- double sv(double edv, double esv) {
|
|
|
- return 0;
|
|
|
+ double co(
|
|
|
+ double sv, {
|
|
|
+ required int hr,
|
|
|
+ }) {
|
|
|
+ return (sv - hr);
|
|
|
}
|
|
|
|
|
|
- /// EF
|
|
|
- /// Formula: `(EDV - ESV )/EDV`
|
|
|
+ /// CI
|
|
|
+ @override
|
|
|
+ double ci(
|
|
|
+ double sv, {
|
|
|
+ required int hr,
|
|
|
+ required double bsa,
|
|
|
+ }) {
|
|
|
+ return ((sv - hr)) / bsa;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// ESV (Teichholz)
|
|
|
///
|
|
|
- /// [edv] Unit: `cm³`
|
|
|
+ /// Formula: `[7.0/(2.4 + LVIDs)] x LVIDs^3`
|
|
|
///
|
|
|
- /// [esv] Unit: `cm³`
|
|
|
+ /// [lvids] Unit: `cm`
|
|
|
///
|
|
|
- /// Result Unit: `None`
|
|
|
+ /// Result Unit: `cm³`
|
|
|
@override
|
|
|
- double ef(double edv, double esv) {
|
|
|
- // 这行判断暂时注释掉是为了使实际表现与旧版一致
|
|
|
- // if (edv < esv) {
|
|
|
- // return double.nan;
|
|
|
- // }
|
|
|
- return 0.5;
|
|
|
+ double esvTeichholz(double lvids) {
|
|
|
+ // 计算公式相同,入参不同
|
|
|
+ return edvTeichholz(lvids);
|
|
|
+ }
|
|
|
+
|
|
|
+ /// LVdMass
|
|
|
+ /// LVd Mass(2D)
|
|
|
+ @override
|
|
|
+ double lvdMass(double ivsd, double lvidd, double lvpwd) {
|
|
|
+ ivsd = ivsd / 10;
|
|
|
+ lvidd = lvidd / 10;
|
|
|
+ lvpwd = lvpwd / 10;
|
|
|
+ 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;
|
|
|
+ return value;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// <para>MVA VTI = 1/4 x π x (LVOT Diam)^2 x LVOT VTI/MV VTI </para>
|
|
|
+ /// <para>AVA VTI = 1/4 x π x (LVOT Diam)^2 x LVOT VTI/AV VTI</para>
|
|
|
+ /// <para>TVA VTI = 1/4 x π x (RVOT Diam)^2 x RVOT VTI/TV VTI</para>
|
|
|
+ /// <para>PVA VTI = 1/4 x π x (RVOT Diam)^2 x RVOT VTI/PV VTI</para>
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="otDiam">cm</param>
|
|
|
+ /// <param name="otvti">cm</param>
|
|
|
+ /// <param name="vti">cm</param>
|
|
|
+ /// <returns>cm^2</returns>
|
|
|
+ /// SV(LVOT)|CO
|
|
|
+ @override
|
|
|
+ double flowAreaByVTI(double otDiam, double otvti, double vti) {
|
|
|
+ otDiam = otDiam / 10;
|
|
|
+ otvti = otvti / 10;
|
|
|
+ vti = vti / 10;
|
|
|
+ double sv = 0.25 * math.pi * math.pow(otDiam, 2) * otvti / vti;
|
|
|
+ return sv;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// LVd Mass Index
|
|
|
+ @override
|
|
|
+ double lvdMassIndex(double lvdmass, double bsa) {
|
|
|
+ lvdmass = lvdmass / 10;
|
|
|
+ return lvdmass / bsa * 1000;
|
|
|
}
|
|
|
}
|