Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def qtdmri_isotropic_signal_matrix(radial_order, time_order, us, ut, q, tau):
ind_mat = qtdmri_isotropic_index_matrix(radial_order, time_order)
qvals, theta, phi = cart2sphere(q[:, 0], q[:, 1], q[:, 2])
n_dat = int(qvals.shape[0])
n_elem = int(ind_mat.shape[0])
num_j = int(np.max(ind_mat[:, 0]))
num_o = int(time_order + 1)
num_l = int(radial_order // 2 + 1)
num_m = int(radial_order * 2 + 1)
# Radial Basis
radial_storage = np.zeros([num_j, num_l, n_dat])
for j in range(1, num_j + 1):
for ll in range(0, radial_order + 1, 2):
radial_storage[j - 1, ll // 2, :] = radial_basis_opt(
j, ll, us, qvals)
def rho_matrix(sh_order, vecs):
r"""Compute the SH matrix $\rho$
"""
r, theta, phi = cart2sphere(vecs[:, 0], vecs[:, 1], vecs[:, 2])
theta[np.isnan(theta)] = 0
n_c = int((sh_order + 1) * (sh_order + 2) / 2)
rho = np.zeros((vecs.shape[0], n_c))
counter = 0
for l in range(0, sh_order + 1, 2):
for m in range(-l, l + 1):
rho[:, counter] = real_sph_harm(m, l, theta, phi)
counter += 1
return rho
Number of tissue compartments for running the MSMT-CSD. Minimum
number of compartments required is 2.
Returns
-------
B : ndarray
Matrix of the spherical harmonics model used to fit the data
m : int ``|m| <= n``
The order of the harmonic.
n : int ``>= 0``
The degree of the harmonic.
"""
if iso_comp < 2:
msg = ("Multi-tissue CSD requires at least 2 tissue compartments")
raise ValueError(msg)
r, theta, phi = geo.cart2sphere(*gtab.gradients.T)
m, n = shm.sph_harm_ind_list(sh_order)
B = shm.real_sph_harm(m, n, theta[:, None], phi[:, None])
B[np.ix_(gtab.b0s_mask, n > 0)] = 0.
iso = np.empty([B.shape[0], iso_comp])
iso[:] = SH_CONST
B = np.concatenate([iso, B], axis=1)
return B, m, n
def SHOREmatrix_pdf(radialOrder, zeta, rtab):
"""Compute the SHORE matrix"
Parameters
----------
radialOrder : unsigned int,
Radial Order
zeta : unsigned int,
scale factor
rtab : array, shape (N,3)
r-space points in which calculates the pdf
"""
r, theta, phi = cart2sphere(
rtab[:, 0], rtab[:, 1], rtab[:, 2])
theta[np.isnan(theta)] = 0
psi = np.zeros(
(r.shape[0], (radialOrder + 1) * ((radialOrder + 1) / 2) * (2 * radialOrder + 1)))
counter = 0
for n in range(radialOrder + 1):
for l in range(0, n + 1, 2):
for m in range(-l, l + 1):
psi[:, counter] = real_sph_harm(m, l, theta, phi) * \
genlaguerre(n - l, l + 0.5)(4 * np.pi ** 2 * zeta * r ** 2 ) *\
np.exp(-2 * np.pi ** 2 * zeta * r ** 2) *\
__kappa_pdf(zeta, n, l) *\
(4 * np.pi ** 2 * zeta * r ** 2) ** (l / 2) * \
(-1) ** (n - l / 2)
counter += 1
def __init__(self, gtab, response, reg_sphere=default_sphere, iso=2,
delta_form='basic'):
"""
"""
sh_order = response.sh_order
super(MultiShellDeconvModel, self).__init__(gtab)
B, m, n = multi_tissue_basis(gtab, sh_order, iso)
delta_f = delta_functions[delta_form]
delta = delta_f(response.iso, response.m, response.n, 0., 0.)
self.delta = delta
multiplier_matrix = _inflate_response(response, gtab, n, delta)
r, theta, phi = geo.cart2sphere(*reg_sphere.vertices.T)
odf_reg, _, _ = shm.real_sym_sh_basis(sh_order, theta, phi)
reg = np.zeros([i + iso for i in odf_reg.shape])
reg[:iso, :iso] = np.eye(iso)
reg[iso:, iso:] = odf_reg
X = B * multiplier_matrix
self.fitter = QpFitter(X, reg)
self.sh_order = sh_order
self._X = X
self.sphere = reg_sphere
self.response = response
self.B_dwi = B
self.m = m
self.n = n
----------
radial_order : unsigned int,
an even integer that represent the order of the basis
zeta : unsigned int,
scale factor
sphere_vertices : array, shape (N,3)
vertices of the odf sphere
References
----------
.. [1] Merlet S. et al., "Continuous diffusion signal, EAP and
ODF estimation via Compressive Sensing in diffusion MRI", Medical
Image Analysis, 2013.
"""
r, theta, phi = cart2sphere(sphere_vertices[:, 0], sphere_vertices[:, 1],
sphere_vertices[:, 2])
theta[np.isnan(theta)] = 0
F = radial_order / 2
n_c = int(np.round(1 / 6.0 * (F + 1) * (F + 2) * (4 * F + 3)))
upsilon = np.zeros((len(sphere_vertices), n_c))
counter = 0
for l in range(0, radial_order + 1, 2):
for n in range(l, int((radial_order + l) / 2) + 1):
for m in range(-l, l + 1):
upsilon[:, counter] = (-1) ** (n - l / 2.0) * \
_kappa_odf(zeta, n, l) * \
hyp2f1(l - n, l / 2.0 + 1.5, l + 1.5, 2.0) * \
real_sph_harm(m, l, theta, phi)
counter += 1
return upsilon
----------
radial_order : unsigned int,
an even integer that represent the order of the basis
zeta : unsigned int,
scale factor
rtab : array, shape (N,3)
real space points in which calculates the pdf
References
----------
.. [1] Merlet S. et al., "Continuous diffusion signal, EAP and
ODF estimation via Compressive Sensing in diffusion MRI", Medical
Image Analysis, 2013.
"""
r, theta, phi = cart2sphere(rtab[:, 0], rtab[:, 1], rtab[:, 2])
theta[np.isnan(theta)] = 0
F = radial_order / 2
n_c = int(np.round(1 / 6.0 * (F + 1) * (F + 2) * (4 * F + 3)))
psi = np.zeros((r.shape[0], n_c))
counter = 0
for l in range(0, radial_order + 1, 2):
for n in range(l, int((radial_order + l) / 2) + 1):
for m in range(-l, l + 1):
psi[:, counter] = real_sph_harm(m, l, theta, phi) * \
genlaguerre(n - l, l + 0.5)(4 * np.pi ** 2 *
zeta * r ** 2) *\
np.exp(-2 * np.pi ** 2 * zeta * r ** 2) *\
_kappa_pdf(zeta, n, l) *\
(4 * np.pi ** 2 * zeta * r ** 2) ** (l / 2) * \
(-1) ** (n - l / 2)
counter += 1
Radial Order
zeta : unsigned int,
scale factor
gtab : GradientTable,
Gradient directions and bvalues container class
tau : float,
diffusion time. By default the value that makes q=sqrt(b).
"""
qvals = np.sqrt(gtab.bvals / (4 * np.pi ** 2 * tau))
bvecs = gtab.bvecs
qgradients = qvals[:, None] * bvecs
r, theta, phi = cart2sphere(
qgradients[:, 0], qgradients[:, 1], qgradients[:, 2])
theta[np.isnan(theta)] = 0
M = np.zeros(
(r.shape[0], (radialOrder + 1) * ((radialOrder + 1) / 2) * (2 * radialOrder + 1)))
counter = 0
for n in range(radialOrder + 1):
for l in range(0, n + 1, 2):
for m in range(-l, l + 1):
M[:, counter] = real_sph_harm(m, l, theta, phi) * \
genlaguerre(n - l, l + 0.5)(r ** 2 / float(zeta)) * \
np.exp(- r ** 2 / (2.0 * zeta)) * \
__kappa(zeta, n, l) * \
(r ** 2 / float(zeta)) ** (l / 2)
counter += 1