cardiac.dart 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. import 'dart:math' as math;
  2. import 'package:fis_common/logger/logger.dart';
  3. import 'package:fis_measure/configs/cardiac.dart';
  4. import 'package:fis_measure/utils/number.dart';
  5. import 'general.dart';
  6. class CardiacFormulas {
  7. CardiacFormulas._();
  8. /// IMP
  9. ///
  10. /// Formula: `(CO-ET)/ET`
  11. ///
  12. /// Result Unit: `None`
  13. static double teiIndex(double co, double et) {
  14. double imp = 0.0;
  15. if (et != 0.0) {
  16. imp = (((co).abs() - (et).abs()) / et).abs();
  17. }
  18. return imp;
  19. }
  20. /// EF
  21. /// Formula: `(EDV - ESV )/EDV`
  22. ///
  23. /// [edv] Unit: `cm³`
  24. ///
  25. /// [esv] Unit: `cm³`
  26. ///
  27. /// Result Unit: `None`
  28. static double ef(double edv, double esv) {
  29. // 这行判断暂时注释掉是为了使实际表现与旧版一致
  30. // if (edv < esv) {
  31. // return double.nan;
  32. // }
  33. return (edv - esv) / edv * 100;
  34. }
  35. /// EDV (Teichholz)
  36. ///
  37. /// Formula: `[7.0/(2.4 + LVIDd)] x LVIDd^3`
  38. ///
  39. /// [lvidd] Unit: `cm`
  40. ///
  41. /// Result Unit: `cm³`
  42. static double edvTeichholz(double lvidd) {
  43. double edv = double.nan;
  44. if (!NumUtil.almostEquals(lvidd, 0)) {
  45. edv = 7.0 * math.pow(lvidd, 3) / (2.4 + lvidd);
  46. }
  47. return edv;
  48. }
  49. /// EDV (Cube)
  50. ///
  51. /// Formula: `LVIDd^3`
  52. ///
  53. /// [lvidd] Unit: `cm`
  54. ///
  55. /// Result Unit: `cm³`
  56. static double edvCube(double lvidd) {
  57. double edv = double.nan;
  58. if (!NumUtil.almostEquals(lvidd, 0)) {
  59. edv = math.pow(lvidd, 3).toDouble();
  60. }
  61. return edv;
  62. }
  63. /// ESV (Teichholz)
  64. ///
  65. /// Formula: `[7.0/(2.4 + LVIDs)] x LVIDs^3`
  66. ///
  67. /// [lvids] Unit: `cm`
  68. ///
  69. /// Result Unit: `cm³`
  70. static double esvTeichholz(double lvids) {
  71. // 计算公式相同,入参不同
  72. return edvTeichholz(lvids);
  73. }
  74. /// ESV (Cube)
  75. ///
  76. /// Formula: `LVIDs^3`
  77. ///
  78. /// [lvids] Unit: `cm`
  79. ///
  80. /// Result Unit: `cm³`
  81. static double esvCube(double lvids) {
  82. // 计算公式相同,入参不同
  83. return edvCube(lvids);
  84. }
  85. /// SV
  86. static double sv(double edv, double esv) {
  87. return edv - esv;
  88. }
  89. /// CO
  90. static double co(
  91. double sv, {
  92. required int hr,
  93. }) {
  94. return (sv - hr) / 1000.0;
  95. }
  96. /// CI
  97. static double ci(
  98. double sv, {
  99. required int hr,
  100. required double bsa,
  101. }) {
  102. return ((sv - hr) / 1000.0) / bsa;
  103. }
  104. /// LVdMass
  105. static double lvdMass(double ivsd, double lvidd, double lvpwd) {
  106. const density = GlobalCardiacConfigs.density;
  107. const correctionFactor = GlobalCardiacConfigs.correctionFactor;
  108. double part1 = math.pow(ivsd + lvidd + lvpwd, 3).toDouble();
  109. double part2 = math.pow(lvidd, 3).toDouble();
  110. double value = ((density * part1 - part2) + correctionFactor) / 1000.0;
  111. return value;
  112. }
  113. /// LVd Mass AL
  114. static double lvdMassAL(
  115. double lvadSaxEpi,
  116. double lvadSaxEndo,
  117. double lvldApical,
  118. ) {
  119. double t =
  120. math.sqrt(lvadSaxEpi / math.pi) - math.sqrt(lvadSaxEndo / math.pi);
  121. double mass = 1.05 *
  122. 5 /
  123. 6 *
  124. (lvadSaxEpi * (lvldApical + t) - lvadSaxEndo * lvldApical) /
  125. 1000;
  126. return mass;
  127. }
  128. /// LVd Mass Index
  129. static double lvdMassIndex(double lvdmass, double bsa) {
  130. return lvdmass / bsa * 1000;
  131. }
  132. /// %FS
  133. static double fsPercent(double lvidd, double lvids) {
  134. return ((lvidd - lvids) / lvidd) * 100;
  135. }
  136. /// %IVS
  137. static double ivsPercent(double ivss, double ivsd) {
  138. return ((ivss - ivsd) / ivsd) * 100;
  139. }
  140. /// %LVPW
  141. static double lvpwPercent(double lvpws, double lvpwd) {
  142. return ((lvpws - lvpwd) / lvpwd) * 100;
  143. }
  144. /// MAM%
  145. static double mamPercent(double mapse, double lvidd, double lvids) {
  146. return mapse / (lvidd - lvids + mapse) * 100;
  147. }
  148. /// SI
  149. ///
  150. /// (EDV - ESV)/BSA
  151. ///
  152. /// [sv] cm³
  153. ///
  154. /// [bsa] m²
  155. ///
  156. /// return `cm³/m²`
  157. static double si(double sv, double bsa) {
  158. double si = sv / bsa;
  159. return si;
  160. }
  161. /// <summary>
  162. /// <para>MVA VTI = 1/4 x π x (LVOT Diam)^2 x LVOT VTI/MV VTI </para>
  163. /// <para>AVA VTI = 1/4 x π x (LVOT Diam)^2 x LVOT VTI/AV VTI</para>
  164. /// <para>TVA VTI = 1/4 x π x (RVOT Diam)^2 x RVOT VTI/TV VTI</para>
  165. /// <para>PVA VTI = 1/4 x π x (RVOT Diam)^2 x RVOT VTI/PV VTI</para>
  166. /// </summary>
  167. /// <param name="otDiam">cm</param>
  168. /// <param name="otvti">cm</param>
  169. /// <param name="vti">cm</param>
  170. /// <returns>cm^2</returns>
  171. static double flowAreaByVTI(double otDiam, double otvti, double vti) {
  172. double sv = 0.25 * math.pi * math.pow(otDiam, 2) * otvti / vti;
  173. return sv;
  174. }
  175. /// <param name="otvti">cm</param>
  176. /// <param name="vti">cm</param>
  177. /// <returns>Unit None</returns>
  178. static double dviByVTI(double otvti, double vti) {
  179. double dvi = double.nan;
  180. if (!GeneralFormulas.doubleAlmostEquals(vti, 0)) {
  181. dvi = otvti / vti;
  182. }
  183. return dvi;
  184. }
  185. /// <summary>
  186. /// AVA Index = avaByVTI/bsa
  187. /// </summary>
  188. /// <param name="avaByVTI">cm2</param>
  189. /// <param name="bsa">m2</param>
  190. /// <returns>cm2/m2</returns>
  191. static double avaIndex(double avaByVTI, double bsa) {
  192. double index = double.nan;
  193. if (!GeneralFormulas.doubleAlmostEquals(bsa, 0)) {
  194. index = avaByVTI / bsa;
  195. }
  196. return index;
  197. }
  198. }