Biventricular Modes [UK Biobank]

These are biventricular (right and left ventricles) modes generated from the UK Biobank study, which was published in [Mauger et al., JCMR 2019] paper. Each figure contains two biventricular models from End-Diastole (wireframe without surface color) and End-Systole (coloured surface: green = left ventricle, blue = right ventricle, red = myocardium, pink contour = mitral valve, and yellow contour = tricuspid valve).

Mode 1

Mode 2

Mode 3

Mode 4

File Info

We provide two Principal Component Analysis (PCA) atlases from the download link above:

  1. UKBRVLV.h5 contains PCA atlas derived from 630 healthy reference subjects from the UK Biobank Study (see [Petersen et al., 2017]).
  2. UKBRVLV_ALL.h5 contains PCA atlas derived from all 4,329 subjects from the UK Biobank Study.

Only the first 200 PCA components are shared.

The PCA structure is as follows:

  • /COEFF: N x 200 matrix of the first 200 principal components, where N is the number of  sample points
  • /LATENT: 200 elements vector of the eigenvalues,
  • /EXPLAINED: 200 elements vector that show the percentage of the total variance explained by each principal component,
  • /MU: N elements vector that defines the mean shape of the biventricular model.

The file is saved in HDF5 format. Examples on how to read and plot the first principal mode are shown on the right panel here.

Notes on a shape vector:

A shape vector is defined by N elements, which means there are P = (N/3) points. Coordinate points are structured as [x1, y1, z1, x2, y2, z2, ..., xP, yP, zP] vector. Each shape vector is concatenated by [end-diastole, end-systole] components, which means that there are (P/2) points for each frame. See examples in Matlab, Python and R script on how to read the atlas below.

Matlab

Generate and plot the first principal component with σ=1.5

% read the principal components
pc = h5read('UKBRVLV.h5', '/COEFF');

% read the eigenvalues
ev = h5read('UKBRVLV.h5', '/LATENT');

% read the mean shape
mu = h5read('UKBRVLV.h5', '/MU');

% generate the first principal mode
% with 1.5 times the standard deviation
S = mu + (1.5 .* sqrt(ev(1)) .* pc(:,1)');

% get ED & ES points, & convert to 3 columns matrix [x, y, z]
N = length(S);
ed = reshape(S(1:N/2), 3, [])';
es = reshape(S((N/2+1):end), 3, [])';

% plot ED points in blue
% plot ES points in red
figure('Color', 'w');
plot3(ed(:,1), ed(:,2), ed(:,3), 'b.');
hold on;
plot3(es(:,1), es(:,2), es(:,3), 'r.');
axis vis3d
axis equal

Python

Generate and plot the first principal component with σ=1.5

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import h5py as h5
import numpy as np

# read H5 file
pc = h5.File('UKBRVLV.h5', 'r')

# note that H5PY matrices in python are transposed

# generate the first principal mode
# with 1.5 times the standard deviation
S = np.transpose(pc['MU']) + (1.5 * np.sqrt(pc['LATENT'][0,0]) * pc['COEFF'][0,:])

# get ED & ES points, & convert to 3 columns matrix [x, y, z]
N = S.shape[1] // 2
ed = np.reshape(S[0,:N], (-1,3))
es = np.reshape(S[0,N:], (-1,3))

# plot ED points in blue
# plot ES points in red
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(ed[:,0], ed[:,1], ed[:,2], color='dodgerblue', marker='.')
ax.scatter(es[:,0], es[:,1], es[:,2], color='firebrick', marker='.')

R

Generate and plot the first principal component with σ=1.5

library(h5)
library(rgl)

# read H5 file
f = h5file("UKBRVLV.h5")

# read the principal components
pc = f["/COEFF"]

# read the eigenvalues
ev = f["/LATENT"]

# read the mean shape
mu = f["/MU"]

# generate the first principal mode
# with 1.5 times the standard deviation
S = t(mu[]) + (1.5 * as.numeric(sqrt(ev[1,1])) * pc[1,])

# get ED & ES points, & convert to 3 columns matrix [x, y, z]
N = length(S);
ed = matrix(S[1, 1:(N/2)], ncol=3, byrow=TRUE)
es = matrix(S[1, (N/2+1):N], ncol=3, byrow=TRUE)

# plot ED points in blue
# plot ES points in red
plot3d(ed[,1],ed[,2],ed[,3], col="dodgerblue3", size=1)
plot3d(es[,1],es[,2],es[,3], col="firebrick3", size=1, add=TRUE)