In [288]:
%matplotlib inline
import nibabel as nb
import os
import numpy as np
import matplotlib.pyplot as plt
from glob import glob
#import nipy.algorithms.registration
from t1_fitter_purepy import T1_fitter
In [289]:
gs_ni = nb.load('/predator-scratch/muxt1/8194_IR_EPI.nii.gz')
si_ni = nb.load('/home/huawu/tmp/t1/mux3r2_fatsat_OFF_pe0_sorted.nii.gz')
gs_raw = gs_ni.get_data().astype(np.float)
si_raw = si_ni.get_data().astype(np.float)
fwhm = 0.0
if fwhm>0:
import scipy.ndimage as ndimage
sd = fwhm/np.array(gs_ni._header.get_zooms()[0:3])/2.355
print('Smoothing GS with %0.1f mm FWHM Gaussian (sigma=[%0.2f,%0.2f,%0.2f] voxels)...' % (tuple([fwhm]+sd.tolist())))
for i in xrange(gs_raw.shape[3]):
ndimage.gaussian_filter(gs_raw[...,i], sigma=sd, output=gs_raw[...,i])
sd = fwhm/np.array(si_ni._header.get_zooms()[0:3])/2.355
print('Smoothing SI with %0.1f mm FWHM Gaussian (sigma=[%0.2f,%0.2f,%0.2f] voxels)...' % (tuple([fwhm]+sd.tolist())))
for i in xrange(si_raw.shape[3]):
ndimage.gaussian_filter(si_raw[...,i], sigma=sd, output=si_raw[...,i])
In [5]:
gs_ni.shape
Out[5]:
In [290]:
coords = [[-33.,0.,28.],[-33.,2.,28.],[-33.,4.,28.],[-33.,6.,28.],[-33.,8.,28.]]
gs_vox = nb.affines.apply_affine(np.linalg.inv(gs_ni.get_affine()),coords).round().astype(int)
si_vox = nb.affines.apply_affine(np.linalg.inv(si_ni.get_affine()),coords).round().astype(int)
gs_ti = np.array([50.,400.,1200.,2400.])
#si_ti = np.array([50.0, 280.77, 511.54, 742.31, 973.08, 1203.85, 1434.62, 1665.38, 1896.15, 2126.92, 2357.69, 2588.46, 2819.23])
tr = 3000.
nti = 23
ti1 = 50.
ti_delta = tr/nti
si_ti = np.arange(nti-1)*ti_delta + ti1
In [291]:
gs_roi
Out[291]:
In [292]:
gs_roi = gs_raw[gs_vox[:,0],gs_vox[:,1],gs_vox[:,2],:]
si_roi = si_raw[si_vox[:,0],si_vox[:,1],si_vox[:,2],:]
gs_roi = gs_roi/gs_roi.mean()
si_roi = si_roi/si_roi.mean()
In [309]:
gs_fit = T1_fitter(gs_ti)
si_fit = T1_fitter(si_ti)
plt.figure(figsize=(12,6))
for i in xrange(gs_roi.shape[0]):
gs_t1,gs_b,gs_a,gs_res,gs_ind = gs_fit.t1_fit_nlspr(gs_roi[i,:])
si_t1,si_b,si_a,si_res,si_ind = si_fit.t1_fit_nlspr(si_roi[i,:]-.06)
gs_model = gs_a + gs_b*np.exp(-si_ti / gs_t1)
si_model = si_a + si_b*np.exp(-si_ti / si_t1)
gs_val = np.concatenate((-gs_roi[i,0:gs_ind], gs_roi[i,gs_ind:]))
si_val = np.concatenate((-si_roi[i,0:si_ind], si_roi[i,si_ind:]))
plt.plot(gs_ti,gs_val,'b.', si_ti,si_val,'r.', si_ti,gs_model,'b--', si_ti,si_model,'r--', ms=15)
print(gs_t1,si_t1)
In [302]:
(gs_t1,si_t1)
Out[302]:
In [314]:
si_roi = si_raw[si_vox[:,0],si_vox[:,1],si_vox[:,2],:]
Out[314]:
In [120]:
nskip = 0
gs_fit = T1_fitter(gs_ti)
si_fit = T1_fitter(si_ti[nskip:])
for i in xrange(gs_roi.shape[0]):
gs_t1,gs_b,gs_a,gs_res,gs_ind = gs_fit.t1_fit_nlspr(gs_roi[i,:])
si_t1,si_b,si_a,si_res,si_ind = si_fit.t1_fit_nlspr(si_roi[i,nskip:])
print((gs_t1,si_t1,gs_t1-si_t1))
In [108]:
si_fit = T1_fitter(si_ti[nskip:])
si_t1,si_b,si_a,si_res,si_ind = si_fit.t1_fit_nlspr(si_roi[i,nskip:])
In [211]:
import scipy.optimize as opt
def t1_biexp(ti, p):
S = p[0] * ( 1 - p[2]*(p[1]*np.exp(-ti/p[3]) + (1-p[1])*np.exp(-ti/p[4])))
return S
def residuals(p, y, ti):
err = y - t1_biexp(ti, p) #p[0] * ( 1 - 2*(p[1]*np.exp(-ti/p[3]) + p[2]*np.exp(-ti/p[4])))
return err
def fit_biexp(ti, data, p0):
rms = np.zeros(len(ti)+1)
fits = []
tmp_dat = data
plsq = opt.leastsq(residuals, p0, args=(ti, tmp_dat))
rms[0] = np.sum(residuals(plsq[0], ti, tmp_dat)**2)
fits.append((rms, plsq))
for i in xrange(0,data.shape[0]):
tmp_dat[i] = -tmp_dat[i]
plsq = opt.leastsq(residuals, p0, args=(ti, tmp_dat))
rms[i+1] = np.sum(residuals(plsq[0], ti, tmp_dat)**2)
fits.append(plsq)
ind = rms.argmin()
plsq = fits[ind]
return plsq,ind
In [216]:
p0 = [si_roi[0,:].mean(), 0.1, 0.5, 100., 1000.]
plsq,ind = fit_biexp(si_ti, si_roi[0,:], p0)
In [360]:
plsq
Out[360]:
In [219]:
t1_biexp(si_ti, plsq[0])
Out[219]:
In [177]:
si_roi[0,:]
Out[177]:
In [178]:
plsq[1]
Out[178]:
In [182]:
(residuals(p, si_roi[0], ti)**2).sum()
Out[182]:
In [183]:
range(1,10)
Out[183]:
In [ ]: