These are PCA modes of variations from biventricular shapes derived from ~5,000 UK Biobank cardiac MRI exams. You can read more information about this study from [Mauger et al., JCMR 2019]. 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).

Download

We provide two Principal Component Analysis (PCA) atlases:

  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 defined 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. Below is an example on how to read and plot the first principal mode.

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='.')
% 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
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)