import 'dart:math' as math; import 'package:fis_common/logger/logger.dart'; import 'package:fis_measure/configs/cardiac.dart'; import 'package:fis_measure/utils/number.dart'; import 'general.dart'; class CardiacFormulas { CardiacFormulas._(); /// IMP /// /// Formula: `(CO-ET)/ET` /// /// Result Unit: `None` static double teiIndex(double co, double et) { double imp = 0.0; if (et != 0.0) { imp = (((co).abs() - (et).abs()) / et).abs(); } return imp; } /// EF /// Formula: `(EDV - ESV )/EDV` /// /// [edv] Unit: `cm³` /// /// [esv] Unit: `cm³` /// /// Result Unit: `None` static double ef(double edv, double esv) { // 这行判断暂时注释掉是为了使实际表现与旧版一致 // if (edv < esv) { // return double.nan; // } return (edv - esv) / edv * 100; } /// EDV (Teichholz) /// /// Formula: `[7.0/(2.4 + LVIDd)] x LVIDd^3` /// /// [lvidd] Unit: `cm` /// /// Result Unit: `cm³` static double edvTeichholz(double lvidd) { double edv = double.nan; if (!NumUtil.almostEquals(lvidd, 0)) { edv = 7.0 * math.pow(lvidd, 3) / (2.4 + lvidd); } return edv; } /// EDV (Cube) /// /// Formula: `LVIDd^3` /// /// [lvidd] Unit: `cm` /// /// Result Unit: `cm³` static double edvCube(double lvidd) { double edv = double.nan; if (!NumUtil.almostEquals(lvidd, 0)) { edv = math.pow(lvidd, 3).toDouble(); } return edv; } /// ESV (Teichholz) /// /// Formula: `[7.0/(2.4 + LVIDs)] x LVIDs^3` /// /// [lvids] Unit: `cm` /// /// Result Unit: `cm³` static double esvTeichholz(double lvids) { // 计算公式相同,入参不同 return edvTeichholz(lvids); } /// ESV (Cube) /// /// Formula: `LVIDs^3` /// /// [lvids] Unit: `cm` /// /// Result Unit: `cm³` static double esvCube(double lvids) { // 计算公式相同,入参不同 return edvCube(lvids); } /// SV static double sv(double edv, double esv) { return edv - esv; } /// CO static double co( double sv, { required int hr, }) { return (sv - hr) / 1000.0; } /// CI static double ci( double sv, { required int hr, required double bsa, }) { return ((sv - hr) / 1000.0) / bsa; } /// LVdMass static double lvdMass(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; return value; } /// LVd Mass AL static double lvdMassAL( double lvadSaxEpi, double lvadSaxEndo, double lvldApical, ) { double t = math.sqrt(lvadSaxEpi / math.pi) - math.sqrt(lvadSaxEndo / math.pi); double mass = 1.05 * 5 / 6 * (lvadSaxEpi * (lvldApical + t) - lvadSaxEndo * lvldApical) / 1000; return mass; } /// LVd Mass Index static double lvdMassIndex(double lvdmass, double bsa) { return lvdmass / bsa * 1000; } /// %FS static double fsPercent(double lvidd, double lvids) { return ((lvidd - lvids) / lvidd) * 100; } /// %IVS static double ivsPercent(double ivss, double ivsd) { return ((ivss - ivsd) / ivsd) * 100; } /// %LVPW static double lvpwPercent(double lvpws, double lvpwd) { return ((lvpws - lvpwd) / lvpwd) * 100; } /// MAM% static double mamPercent(double mapse, double lvidd, double lvids) { return mapse / (lvidd - lvids + mapse) * 100; } /// SI /// /// (EDV - ESV)/BSA /// /// [sv] cm³ /// /// [bsa] m² /// /// return `cm³/m²` static double si(double sv, double bsa) { double si = sv / bsa; return si; } /// /// MVA VTI = 1/4 x π x (LVOT Diam)^2 x LVOT VTI/MV VTI /// AVA VTI = 1/4 x π x (LVOT Diam)^2 x LVOT VTI/AV VTI /// TVA VTI = 1/4 x π x (RVOT Diam)^2 x RVOT VTI/TV VTI /// PVA VTI = 1/4 x π x (RVOT Diam)^2 x RVOT VTI/PV VTI /// /// cm /// cm /// cm /// cm^2 static double flowAreaByVTI(double otDiam, double otvti, double vti) { double sv = 0.25 * math.pi * math.pow(otDiam, 2) * otvti / vti; return sv; } /// cm /// cm /// Unit None static double dviByVTI(double otvti, double vti) { double dvi = double.nan; if (!GeneralFormulas.doubleAlmostEquals(vti, 0)) { dvi = otvti / vti; } return dvi; } /// /// AVA Index = avaByVTI/bsa /// /// cm2 /// m2 /// cm2/m2 static double avaIndex(double avaByVTI, double bsa) { double index = double.nan; if (!GeneralFormulas.doubleAlmostEquals(bsa, 0)) { index = avaByVTI / bsa; } return index; } }