In [1]:
import numpy as np
import nibabel as nib
import dipy.reconst.dti as dti
import dsiadapt as dsi
import dipy.core.gradients as grad
import matplotlib
%pylab inline
np.set_printoptions(threshold=numpy.nan)
In [2]:
# Estimate diffusion rates using DTI fitting
fnArr = np.array(['DSI17_exvivo', 'DSI11_invivo_b10k', 'DSI11_invivo_b7k'])
bmaxthrArr = np.array([4500, 2000, 2000]);
adArr = np.zeros(fnArr.shape[0]); # axial diffusion rate
for ii in np.arange(fnArr.shape[0]):
fn = fnArr[ii];
data = nib.load('data/' + fn + '_cc.nii.gz').get_data();
gtab = grad.gradient_table('data/' + fn + '_bvals.txt', 'data/' + fn + '_bvecs.txt');
mask = gtab.bvals <= bmaxthrArr[ii]; # Use only data with bvals less than 3000
datamask = data[:, :, :, mask]
gtabmask = grad.gradient_table_from_bvals_bvecs(gtab.bvals[mask], gtab.bvecs[mask, :])
disp(gtabmask.bvals.shape) # Number of measurements used for DTI fitting
disp(gtabmask.bvals.max())
tensormodel = dti.TensorModel(gtabmask)
tensorfit = tensormodel.fit(datamask)
adArr[ii] = tensorfit.ad.mean()
adArr = np.concatenate((adArr[0:1], adArr[0:1], adArr)) # Use the ad from ex vivo DSI17 for ex vivo DSI15 and ex vivo DSI11
In [3]:
disp(adArr)
In [44]:
tensorfit.evecs
Out[44]:
In [4]:
# Estimate mean diffusion distance
fnArr = np.array(['DSI11_exvivo', 'DSI15_exvivo', 'DSI17_exvivo', 'DSI11_invivo_b10k', 'DSI11_invivo_b7k'])
DELTAArr = np.array([29.4 * 10**-3, 29.4 * 10**-3, 29.4 * 10**-3, 20.9 * 10**-3, 49.2 * 10**-3]); # in second
deltaArr = np.array([16.7 * 10**-3, 16.7 * 10**-3, 16.7 * 10**-3, 12.9 * 10**-3, 42.3 * 10**-3]); # in second
fovArr = np.zeros(fnArr.shape[0]);
mddArr = np.zeros(fnArr.shape[0]);
for ii in np.arange(fnArr.shape[0]):
fn = fnArr[ii];
gtab = grad.gradient_table('data/' + fn + '_bvals.txt', 'data/' + fn + '_bvecs.txt');
DELTA = DELTAArr[ii]; # second
delta = deltaArr[ii]; # second
ad = adArr[ii]; # mm2/s
# Compute FOV
bmax = gtab.bvals.max(); # s/mm2
qmax = np.sqrt(bmax / (DELTA - delta / 3)) / (2 * np.pi); # mm-1
deltaq = qmax / dsi.create_qtable(gtab).max(); # mm-1
fovArr[ii] = 1 / deltaq; # mm
# Compute MDD
mddArr[ii] = np.sqrt(6 * ad * (DELTA - delta / 3)); # mm
np.savetxt('data/' + fn + '_stats.txt', (mddArr[ii], fovArr[ii]));
In [5]:
disp(mddArr)
disp(fovArr)
In [51]:
# Estimate signal at the q-space edge
fnArr = np.array(['DSI17_exvivo', 'DSI11_invivo_b10k', 'DSI11_invivo_b7k'])
bmaxthrArr = np.array([4500, 2000, 2000]);
adArr = np.zeros(fnArr.shape[0]); # axial diffusion rate
for ii in np.arange(fnArr.shape[0]):
fn = fnArr[ii];
data = nib.load('data/' + fn + '_cc.nii.gz').get_data();
gtab = grad.gradient_table('data/' + fn + '_bvals.txt', 'data/' + fn + '_bvecs.txt');
ori = np.array([0, 1, 0]);
mask = np.logical_or(np.dot(gtab.bvecs, ori) == 1, np.dot(gtab.bvecs, ori) == -1);
mask[0] = True
oribvals = gtab.bvals[mask];
oridata = data[:, :, :, mask] * 1.0;
oridatasum = oridata.sum(axis=0)
oridatasum = np.squeeze(oridatasum.sum(axis=1))
oridatasum = oridatasum / oridatasum[0];
disp(oridatasum)
disp(oribvals)
In [48]:
(0.30603716 + 0.29278132 + 0.39364102 + 0.28989962) / 4
Out[48]:
In [49]:
(0.06185211 + 0.04872149) / 2
Out[49]:
In [50]:
(0.10041282 + 0.12508167) / 2
Out[50]:
In [52]:
(0.46971807 + 0.41611832 + 0.3290908 + 0.45127514) / 4
Out[52]:
In [53]:
(0.2950933 + 0.34208708) / 2
Out[53]:
In [54]:
(0.41415536 + 0.39524052) / 2
Out[54]: