Wall Thickness
Contents
Wall Thickness#
Computing thickness#
Definition: Distance between Epicardium and Endocardium.
The distance between the Epicardium and Endocardium regions is used to calculate wall thickness. Due to the possibility that the quantity of speckles in both regions may differ and not reflect the same relative location, which prevents us from measuring the euclidean distance between the two speckles, we employ radial metrics. As a result, thickness is calculated as the simple difference between a radial metric at the epicardium and the endocardium.
Our implementation consider the usage of Speckles, which helps to approximate a clinical setting, facilitates the computation for certain metrics and helps to minimizing errors due to noise in geometry by averaging values based on local regions. See docs for details. Fo wall thickness, we apply validation checks to confirm speckles at Endocardium and Epicardium are related (close reference center at longitudinal axis and similar subsets).
The final metric is computed by applying reduction accross values computed from individual speckles. The default reduction method is the ‘mean’ value for all selected speckles. For instance, if we apply this computation accross speckles at endocardium, we will have the mean values for the endocardium region.
These are two sample speckles at Endocardium and Epicardium:
[2]:
sample_spk_ideal_endo = lv_ideal.get_speckles(spk_name="SAMPLE", spk_group="endo", spk_collection="SAMPLE")[0]
sample_spk_ideal_epi = lv_ideal.get_speckles(spk_name="SAMPLE", spk_group="epi", spk_collection="SAMPLE")[0]
Here is a simplified representation of how the wall thickness is calculated. Remember that the final quantity is the difference in length between the epicardium and endocardium vectors (from respective speckles to longitudinal axis reference), which may differ slightly from the visualization.
Radial metrics from the endocardium are represented by the orange lines. Green lines are epicardium radial metrics. The magenta lines represent the approximate thickness of the wall.
[3]:
wt = lv_ideal.plot_speckles_wall_thickness_rd(
sample_spk_ideal_endo,
sample_spk_ideal_epi,
t=0.0
)
[4]:
wts = lv_ideal.thickness(
sample_spk_ideal_endo, # selected speckles at Endocardium
sample_spk_ideal_epi, # selected speckles at Epicardium
approach="radial_distance", # choice of reference LA axis
method="mean", # reduction method (default)
t=0.0, # return value at given timestep
recompute=True, # forces recomputation (ignores previous computations)
log_level=logging.ERROR #
)
INFO:LV.BaseMetricsComputations:Computing metric 'LV_STATES.WALL_THICKNESS'
INFO:LV.BaseMetricsComputations:Computing metric 'LV_STATES.RADIAL_DISTANCE'
[5]:
print("Sample wall thickness:", wt)
print("Reduced wall thickness by internal algorithm:", wts)
Sample wall thickness: 9.99268607794084
Reduced wall thickness by internal algorithm: 9.991936616942606
Radial Length vs Radial Distance#
Considering that we use as basis for the computation a ‘radial metric’, we have two approaches to compute wall thickness: radial_distance and radial_length. In addition, the user can select valid approaches for each of these radial metrics (see docs for details).
Here is a sample visualization between the two metrics. Note that actual values might differ slightly as thickness metric is computed based on radial metric.
[6]:
wt_rd = lv_typeA.plot_speckles_wall_thickness_rd(
sample_spk_typeA_endo,
sample_spk_typeA_epi,
t=0.15
)
[7]:
wt_rl = lv_typeA.plot_speckles_wall_thickness_rl(
sample_spk_typeA_endo,
sample_spk_typeA_epi,
t=0.15
)
[8]:
print("Wall thickness based on radial distance:", wt_rd)
print("Wall thickness based on radial length:", wt_rl)
Wall thickness based on radial distance: 18.283153317967336
Wall thickness based on radial length: 18.25497171268088
Comparing Wall Thickness metrics#
Effect of different speckle thickness#
[10]:
endo_thick_spks = lv_ideal.get_speckles(spk_name="THICK", spk_group="endo", spk_collection="SAMPLE")
epi_thick_spks = lv_ideal.get_speckles(spk_name="THICK", spk_group="epi", spk_collection="SAMPLE")
endo_mid_spks = lv_ideal.get_speckles(spk_name="MID", spk_group="endo", spk_collection="SAMPLE")
epi_mid_spks = lv_ideal.get_speckles(spk_name="MID", spk_group="epi", spk_collection="SAMPLE")
endo_thin_spks = lv_ideal.get_speckles(spk_name="THIN", spk_group="endo", spk_collection="SAMPLE")
epi_thin_spks = lv_ideal.get_speckles(spk_name="THIN", spk_group="epi", spk_collection="SAMPLE")
plot_all_wall_thickness_metrics(lv_ideal, endo_thick_spks, epi_thick_spks,
"Ideal, using THICK speckles.")
plot_all_wall_thickness_metrics(lv_ideal, endo_mid_spks, epi_mid_spks,
"Ideal, using MID speckles.")
plot_all_wall_thickness_metrics(lv_ideal, endo_thin_spks, epi_thin_spks,
"Ideal, using THIN speckles.")
INFO:LV.BaseMetricsComputations:Computing metric 'LV_STATES.RADIAL_DISTANCE'
Same comparison, but on a typeA geometry:
[11]:
endo_thick_spks = lv_typeA.get_speckles(spk_name="THICK", spk_group="endo", spk_collection="SAMPLE")
epi_thick_spks = lv_typeA.get_speckles(spk_name="THICK", spk_group="epi", spk_collection="SAMPLE")
endo_mid_spks = lv_typeA.get_speckles(spk_name="MID", spk_group="endo", spk_collection="SAMPLE")
epi_mid_spks = lv_typeA.get_speckles(spk_name="MID", spk_group="epi", spk_collection="SAMPLE")
endo_thin_spks = lv_typeA.get_speckles(spk_name="THIN", spk_group="endo", spk_collection="SAMPLE")
epi_thin_spks = lv_typeA.get_speckles(spk_name="THIN", spk_group="epi", spk_collection="SAMPLE")
plot_all_wall_thickness_metrics(lv_typeA, endo_thick_spks, epi_thick_spks,
"Ideal, using THICK speckles.")
plot_all_wall_thickness_metrics(lv_typeA, endo_mid_spks, epi_mid_spks,
"Ideal, using MID speckles.")
plot_all_wall_thickness_metrics(lv_typeA, endo_thin_spks, epi_thin_spks,
"Ideal, using THIN speckles.")
Comparing Wall Thickness at different locations of the geometry:#
TO DO.
[ ]: