reconst#

Module: reconst.base#

Base-classes for reconstruction models and reconstruction fits.

All the models in the reconst module follow the same template: a Model object is used to represent the abstract properties of the model, that are independent of the specifics of the data . These properties are reused whenever fitting a particular set of data (different voxels, for example).

ReconstModel(gtab)

Abstract class for signal reconstruction models

ReconstFit(model, data)

Abstract class which holds the fit result of ReconstModel

Module: reconst.bingham#

Tools for fitting Bingham distributions to orientation distribution functions (ODF), as described in [1]. The resulting distributions can further be used to compute ODF-lobe-specific measures such as the fiber density (FD) and fiber spread (FS) [1] and the orientation dispersion index (ODI) [2].

References#

BinghamMetrics(model_params)

Class for Bingham Metrics.

bingham_to_sf(bingham_params, sphere, *[, mask])

Reconstruct ODFs from fitted Bingham parameters on multiple voxels.

bingham_fiber_density(bingham_params, *[, ...])

Compute fiber density for each lobe for a given Bingham ODF.

bingham_fiber_spread(f0, fd)

Compute fiber spread for each lobe for a given Bingham volume.

k2odi(k)

Convert the Bingham/Watson concentration parameter k to the orientation dispersion index (ODI).

odi2k(odi)

Convert the orientation dispersion index (ODI) to the Bingham/Watson concentration parameter k.

weighted_voxel_metric(bmetric, bfd)

Compute density-weighted scalar maps for metrics of Bingham functions fitted to multiple ODF lobes.

sf_to_bingham(odf, sphere, max_search_angle, *)

Fit the Bingham function from an image volume of ODFs.

sh_to_bingham(sh, sphere, max_search_angle, *)

Fit the Bingham function from an image volume of spherical harmonics (SH) representing ODFs.

Module: reconst.cache#

Cache()

Cache values based on a key object (such as a sphere or gradient table).

Module: reconst.cross_validation#

Cross-validation analysis of diffusion models.

coeff_of_determination(data, model, *[, axis])

Calculate the coefficient of determination for a model prediction, relative to data.

kfold_xval(model, data, folds, *model_args, ...)

Perform k-fold cross-validation.

Module: reconst.csdeconv#

AxSymShResponse(S0, dwi_response, *[, bvalue])

A simple wrapper for response functions represented using only axially symmetric, even spherical harmonic functions (ie, m == 0 and l is even).

ConstrainedSphericalDeconvModel(gtab, ...[, ...])

ConstrainedSDTModel(gtab, ratio, *[, ...])

estimate_response(gtab, evals, S0)

Estimate single fiber response function

forward_sdt_deconv_mat(ratio, l_values, *[, ...])

Build forward sharpening deconvolution transform (SDT) matrix

csdeconv(dwsignal, X, B_reg, *[, tau, ...])

Constrained-regularized spherical deconvolution (CSD).

odf_deconv(odf_sh, R, B_reg, *[, lambda_, ...])

ODF constrained-regularized spherical deconvolution using the Sharpening Deconvolution Transform (SDT).

odf_sh_to_sharp(odfs_sh, sphere, *[, basis, ...])

Sharpen odfs using the sharpening deconvolution transform.

mask_for_response_ssst(gtab, data, *[, ...])

Computation of mask for single-shell single-tissue (ssst) response

response_from_mask_ssst(gtab, data, mask)

Computation of single-shell single-tissue (ssst) response

auto_response_ssst(gtab, data, *[, ...])

Automatic estimation of single-shell single-tissue (ssst) response

recursive_response(gtab, data, *[, mask, ...])

Recursive calibration of response function using peak threshold.

fa_trace_to_lambdas([fa, trace])

Module: reconst.cti#

Classes and functions for fitting the correlation tensor model

CorrelationTensorModel(gtab1, gtab2, *args)

Class for the Correlation Tensor Model

CorrelationTensorFit(model, model_params)

Class for fitting the Correlation Tensor Model

from_qte_to_cti(C)

Rescales the qte C elements to the C elements used in CTI.

multi_gaussian_k_from_c(ccti, MD)

Computes the multiple Gaussian diffusion kurtosis tensor from the covariance tensor.

split_cti_params(cti_params)

Splits CTI params into DTI, DKI, CTI portions.

cti_prediction(cti_params, gtab1, gtab2, *)

Predict a signal given correlation tensor imaging parameters.

params_to_cti_params(result, *[, ...])

ls_fit_cti(design_matrix, data, ...[, ...])

Compute the diffusion kurtosis and covariance tensors using an ordinary or weighted linear least squares approach

Module: reconst.dki#

Classes and functions for fitting the diffusion kurtosis model.

DiffusionKurtosisModel(gtab, *args[, ...])

Class for the Diffusion Kurtosis Model

DiffusionKurtosisFit(model, model_params, *)

Class for fitting the Diffusion Kurtosis Model

carlson_rf(x, y, z, *[, errtol])

Compute the Carlson's incomplete elliptic integral of the first kind.

carlson_rd(x, y, z, *[, errtol])

Compute the Carlson's incomplete elliptic integral of the second kind.

directional_diffusion(dt, V, *[, ...])

Compute apparent diffusion coefficient (adc).

directional_diffusion_variance(kt, V)

Calculate the apparent diffusion variance (adv) in each direction of a sphere for a single voxel

directional_kurtosis(dt, md, kt, V, *[, ...])

Calculate the apparent kurtosis coefficient (akc) in each direction of a sphere for a single voxel.

apparent_kurtosis_coef(dki_params, sphere, *)

Calculate the apparent kurtosis coefficient (AKC) in each direction of a sphere.

mean_kurtosis(dki_params, *[, min_kurtosis, ...])

Compute mean kurtosis (MK) from the kurtosis tensor.

radial_kurtosis(dki_params, *[, ...])

Compute radial kurtosis (RK) of a diffusion kurtosis tensor.

axial_kurtosis(dki_params, *[, ...])

Compute axial kurtosis (AK) from the kurtosis tensor.

kurtosis_maximum(dki_params, *[, sphere, ...])

Compute kurtosis maximum value.

mean_kurtosis_tensor(dki_params, *[, ...])

Compute mean of the kurtosis tensor (MKT).

radial_tensor_kurtosis(dki_params, *[, ...])

Compute the rescaled radial tensor kurtosis (RTK).

kurtosis_fractional_anisotropy(dki_params)

Compute the anisotropy of the kurtosis tensor (KFA).

dki_prediction(dki_params, gtab, *[, S0])

Predict a signal given diffusion kurtosis imaging parameters

params_to_dki_params(result, *[, ...])

Convert the 21 unique elements of the diffusion and kurtosis tensors to the parameter format adopted in DIPY

ls_fit_dki(design_matrix, data, ...[, ...])

Compute the diffusion and kurtosis tensors using an ordinary or weighted linear least squares approach.

cls_fit_dki(design_matrix, data, ...[, ...])

Compute the diffusion and kurtosis tensors using a constrained ordinary or weighted linear least squares approach.

Wrotate(kt, Basis)

Rotate a kurtosis tensor from the standard Cartesian coordinate system to another coordinate system basis

Wrotate_element(kt, indi, indj, indk, indl, B)

Compute the specified index element of a kurtosis tensor rotated to the coordinate system basis B

Wcons(k_elements)

Construct the full 4D kurtosis tensors from its 15 independent elements

split_dki_param(dki_params)

Extract the diffusion tensor eigenvalues, the diffusion tensor eigenvector matrix, and the 15 independent elements of the kurtosis tensor from the model parameters estimated from the DKI model

Module: reconst.dki_micro#

Classes and functions for fitting the DKI-based microstructural model

KurtosisMicrostructureModel(gtab, *args[, ...])

Class for the Diffusion Kurtosis Microstructural Model

KurtosisMicrostructuralFit(model, model_params)

Class for fitting the Diffusion Kurtosis Microstructural Model

axonal_water_fraction(dki_params, *[, ...])

Computes the axonal water fraction from DKI.

diffusion_components(dki_params, *[, ...])

Extracts the restricted and hindered diffusion tensors of well aligned fibers from diffusion kurtosis imaging parameters.

dkimicro_prediction(params, gtab, *[, S0])

Signal prediction given the DKI microstructure model parameters.

tortuosity(hindered_ad, hindered_rd)

Computes the tortuosity of the hindered diffusion compartment given its axial and radial diffusivities

Module: reconst.dsi#

DiffusionSpectrumModel(gtab, *[, ...])

DiffusionSpectrumFit(model, data)

DiffusionSpectrumDeconvModel(gtab, *[, ...])

DiffusionSpectrumDeconvFit(model, data)

create_qspace(gtab, origin)

create the 3D grid which holds the signal values (q-space)

create_qtable(gtab, origin)

create a normalized version of gradients

hanning_filter(gtab, filter_width, origin)

create a hanning window

pdf_interp_coords(sphere, rradius, origin)

Precompute coordinates for ODF calculation from the PDF

pdf_odf(Pr, rradius, interp_coords)

Calculates the real ODF from the diffusion propagator(PDF) Pr

half_to_full_qspace(data, gtab)

Half to full Cartesian grid mapping

project_hemisph_bvecs(gtab)

Project any near identical bvecs to the other hemisphere

threshold_propagator(P, *[, estimated_snr])

Applies hard threshold on the propagator to remove background noise for the deconvolution.

gen_PSF(qgrid_sampling, siz_x, siz_y, siz_z)

Generate a PSF for DSI Deconvolution by taking the ifft of the binary q-space sampling mask and truncating it to keep only the center.

LR_deconv(prop, psf, *[, numit, acc_factor])

Perform Lucy-Richardson deconvolution algorithm on a 3D array.

Module: reconst.dti#

Classes and functions for fitting tensors.

TensorModel(gtab, *args[, fit_method, ...])

Diffusion Tensor

TensorFit(model, model_params, *[, model_S0])

fractional_anisotropy(evals, *[, axis])

Return Fractional anisotropy (FA) of a diffusion tensor.

geodesic_anisotropy(evals, *[, axis])

Geodesic anisotropy (GA) of a diffusion tensor.

mean_diffusivity(evals, *[, axis])

Mean Diffusivity (MD) of a diffusion tensor.

axial_diffusivity(evals, *[, axis])

Axial Diffusivity (AD) of a diffusion tensor.

radial_diffusivity(evals, *[, axis])

Radial Diffusivity (RD) of a diffusion tensor.

trace(evals, *[, axis])

Trace of a diffusion tensor.

color_fa(fa, evecs)

Color fractional anisotropy of diffusion tensor

determinant(q_form)

The determinant of a tensor, given in quadratic form

isotropic(q_form)

Calculate the isotropic part of the tensor.

deviatoric(q_form)

Calculate the deviatoric (anisotropic) part of the tensor.

norm(q_form)

Calculate the Frobenius norm of a tensor quadratic form

mode(q_form)

Mode (MO) of a diffusion tensor.

linearity(evals, *[, axis])

The linearity of the tensor.

planarity(evals, *[, axis])

The planarity of the tensor.

sphericity(evals, *[, axis])

The sphericity of the tensor.

apparent_diffusion_coef(q_form, sphere)

Calculate the apparent diffusion coefficient (ADC) in each direction of a sphere.

tensor_prediction(dti_params, gtab, S0)

Predict a signal given tensor parameters.

iter_fit_tensor(*[, step])

Wrap a fit_tensor func and iterate over chunks of data with given length

wls_fit_tensor(design_matrix, data, *[, ...])

Computes weighted least squares (WLS) fit to calculate self-diffusion tensor using a linear regression model.

ols_fit_tensor(design_matrix, data, *[, ...])

Computes ordinary least squares (OLS) fit to calculate self-diffusion tensor using a linear regression model.

nlls_fit_tensor(design_matrix, data, *[, ...])

Fit the cumulant expansion params (e.g. DTI, DKI) using non-linear least-squares.

restore_fit_tensor(design_matrix, data, *[, ...])

Compute a robust tensor fit using the RESTORE algorithm.

iterative_fit_tensor(design_matrix, data, *)

Iteratively Reweighted fitting for the DTI/DKI model.

robust_fit_tensor_wls(design_matrix, data, *)

Iteratively Reweighted fitting for WLS for the DTI/DKI model.

robust_fit_tensor_nlls(design_matrix, data, *)

Iteratively Reweighted fitting for NLLS for the DTI/DKI model.

from_lower_triangular(D)

Returns a tensor given the six unique tensor elements

lower_triangular(tensor, *[, b0])

Returns the six lower triangular values of the tensor ordered as (Dxx, Dxy, Dyy, Dxz, Dyz, Dzz) and a dummy variable if b0 is not None.

decompose_tensor(tensor, *[, min_diffusivity])

Returns eigenvalues and eigenvectors given a diffusion tensor

design_matrix(gtab, *[, dtype])

Constructs design matrix for DTI weighted least squares or least squares fitting.

quantize_evecs(evecs, *[, odf_vertices])

Find the closest orientation of an evenly distributed sphere

eig_from_lo_tri(data, *[, min_diffusivity])

Calculates tensor eigenvalues/eigenvectors from an array containing the lower diagonal form of the six unique tensor elements.

Module: reconst.eudx_direction_getter#

EuDXDirectionGetter

Deterministic Direction Getter based on peak directions.

Module: reconst.forecast#

ForecastModel(gtab, *[, sh_order_max, ...])

Fiber ORientation Estimated using Continuous Axially Symmetric Tensors (FORECAST).

ForecastFit(model, data, sh_coef, d_par, d_perp)

find_signal_means(b_unique, data_norm, ...)

Calculate the mean signal for each shell.

forecast_error_func(x, b_unique, E)

Calculates the difference between the mean signal calculated using the parameter vector x and the average signal E using FORECAST and SMT

psi_l(ell, b)

forecast_matrix(sh_order_max, d_par, d_perp, ...)

Compute the FORECAST radial matrix

rho_matrix(sh_order_max, vecs)

Compute the SH matrix \(\rho\)

lb_forecast(sh_order_max)

Returns the Laplace-Beltrami regularization matrix for FORECAST

Module: reconst.fwdti#

Classes and functions for fitting tensors without free water contamination

FreeWaterTensorModel(gtab, *args[, fit_method])

Class for the Free Water Elimination Diffusion Tensor Model

FreeWaterTensorFit(model, model_params)

Class for fitting the Free Water Tensor Model

fwdti_prediction(params, gtab, *[, S0, Diso])

Signal prediction given the free water DTI model parameters.

wls_iter(design_matrix, sig, S0, *[, Diso, ...])

Applies weighted linear least squares fit of the water free elimination model to single voxel signals.

wls_fit_tensor(gtab, data, *[, Diso, mask, ...])

Computes weighted least squares (WLS) fit to calculate self-diffusion tensor using a linear regression model.

nls_iter(design_matrix, sig, S0, *[, Diso, ...])

Applies non linear least squares fit of the water free elimination model to single voxel signals.

nls_fit_tensor(gtab, data, *[, mask, Diso, ...])

Fit the water elimination tensor model using the non-linear least-squares.

lower_triangular_to_cholesky(tensor_elements)

Performs Cholesky decomposition of the diffusion tensor

cholesky_to_lower_triangular(R)

Convert Cholesky decomposition elements to the diffusion tensor elements

Module: reconst.gqi#

Classes and functions for generalized q-sampling

GeneralizedQSamplingModel(gtab, *[, method, ...])

GeneralizedQSamplingFit(model, data)

normalize_qa(qa, *[, max_qa])

Normalize quantitative anisotropy.

squared_radial_component(x, *[, tol])

Part of the GQI2 integral

npa(self, odf, *[, width])

non-parametric anisotropy

equatorial_zone_vertices(vertices, pole, *)

finds the 'vertices' in the equatorial zone conjugate to 'pole' with width half 'width' degrees

polar_zone_vertices(vertices, pole, *[, width])

finds the 'vertices' in the equatorial band around the 'pole' of radius 'width' degrees

upper_hemi_map(v)

maps a 3-vector into the z-upper hemisphere

equatorial_maximum(vertices, odf, pole, width)

patch_vertices(vertices, pole, width)

find 'vertices' within the cone of 'width' degrees around 'pole'

patch_maximum(vertices, odf, pole, width)

odf_sum(odf)

patch_sum(vertices, odf, pole, width)

triple_odf_maxima(vertices, odf, width)

Module: reconst.ivim#

Classes and functions for fitting ivim model

IvimModelTRR(gtab, *[, split_b_D, ...])

Ivim model

IvimModelVP(gtab, *[, bounds, maxiter, xtol])

IvimFit(model, model_params)

ivim_prediction(params, gtab)

The Intravoxel incoherent motion (IVIM) model function.

f_D_star_prediction(params, gtab, S0, D)

Function used to predict IVIM signal when S0 and D are known by considering f and D_star as the unknown parameters.

f_D_star_error(params, gtab, signal, S0, D)

Error function used to fit f and D_star keeping S0 and D fixed

ivim_model_selector(gtab, *[, fit_method])

Selector function to switch between the 2-stage Trust-Region Reflective based NLLS fitting method (also containing the linear fit): trr and the Variable Projections based fitting method: varpro.

Module: reconst.mapmri#

MapmriModel(gtab, *[, radial_order, ...])

Mean Apparent Propagator MRI (MAPMRI) of the diffusion signal.

MapmriFit(model, mapmri_coef, mu, R, lopt, *)

isotropic_scale_factor(mu_squared)

Estimated isotropic scaling factor.

mapmri_index_matrix(radial_order)

Calculates the indices for the MAPMRI basis in x, y and z.

b_mat(index_matrix)

Calculates the B coefficients from

b_mat_isotropic(index_matrix)

Calculates the isotropic B coefficients.

mapmri_phi_1d(n, q, mu)

One dimensional MAPMRI basis function.

mapmri_phi_matrix(radial_order, mu, q_gradients)

Compute the MAPMRI phi matrix for the signal.

mapmri_psi_1d(n, x, mu)

One dimensional MAPMRI propagator basis function.

mapmri_psi_matrix(radial_order, mu, rgrad)

Compute the MAPMRI psi matrix for the propagator.

mapmri_odf_matrix(radial_order, mu, s, vertices)

Compute the MAPMRI ODF matrix.

mapmri_isotropic_phi_matrix(radial_order, mu, q)

Three dimensional isotropic MAPMRI signal basis function

mapmri_isotropic_radial_signal_basis(j, ...)

Radial part of the isotropic 1D-SHORE signal basis.

mapmri_isotropic_M_mu_independent(...)

Computed the mu independent part of the signal design matrix.

mapmri_isotropic_M_mu_dependent(...)

Computed the mu dependent part of the signal design matrix.

mapmri_isotropic_psi_matrix(radial_order, ...)

Three dimensional isotropic MAPMRI propagator basis function.

mapmri_isotropic_radial_pdf_basis(j, ...)

Radial part of the isotropic 1D-SHORE propagator basis.

mapmri_isotropic_K_mu_independent(...)

Computes mu independent part of K.

mapmri_isotropic_K_mu_dependent(...)

Computes mu dependent part of M.

binomialfloat(n, k)

Custom Binomial function

mapmri_isotropic_odf_matrix(radial_order, ...)

Compute the isotropic MAPMRI ODF matrix.

mapmri_isotropic_odf_sh_matrix(radial_order, ...)

Compute the isotropic MAPMRI ODF matrix.

mapmri_isotropic_laplacian_reg_matrix(...)

Computes the Laplacian regularization matrix for MAP-MRI's isotropic implementation.

mapmri_isotropic_laplacian_reg_matrix_from_index_matrix(...)

Computes the Laplacian regularization matrix for MAP-MRI's isotropic implementation.

mapmri_isotropic_index_matrix(radial_order)

Calculates the indices for the isotropic MAPMRI basis.

create_rspace(gridsize, radius_max)

Create the real space table, that contains the points in which to compute the pdf.

delta(n, m)

map_laplace_u(n, m)

S(n, m) static matrix for Laplacian regularization.

map_laplace_t(n, m)

L(m, n) static matrix for Laplacian regularization.

map_laplace_s(n, m)

R(m,n) static matrix for Laplacian regularization.

mapmri_STU_reg_matrices(radial_order)

Generate the static portions of the Laplacian regularization matrix.

mapmri_laplacian_reg_matrix(ind_mat, mu, ...)

Put the Laplacian regularization matrix together.

generalized_crossvalidation_array(data, M, LR, *)

Generalized Cross Validation Function.

generalized_crossvalidation(data, M, LR, *)

Generalized Cross Validation Function.

gcv_cost_function(weight, args)

The GCV cost function that is iterated.

Module: reconst.mcsd#

MultiShellResponse(response, sh_order_max, ...)

MultiShellDeconvModel(gtab, response[, ...])

MSDeconvFit(model, coeff, mask)

QpFitter(X, reg)

multi_tissue_basis(gtab, sh_order_max, iso_comp)

Builds a basis for multi-shell multi-tissue CSD model.

solve_qp(P, Q, G, H)

Helper function to set up and solve the Quadratic Program (QP) in CVXPY.

multi_shell_fiber_response(sh_order_max, ...)

Fiber response function estimation for multi-shell data.

mask_for_response_msmt(gtab, data, *[, ...])

Computation of masks for multi-shell multi-tissue (msmt) response

response_from_mask_msmt(gtab, data, mask_wm, ...)

Computation of multi-shell multi-tissue (msmt) response

auto_response_msmt(gtab, data, *[, tol, ...])

Automatic estimation of multi-shell multi-tissue (msmt) response

Module: reconst.msdki#

Classes and functions for fitting the mean signal diffusion kurtosis model

MeanDiffusionKurtosisModel(gtab, *args[, ...])

Mean signal Diffusion Kurtosis Model

MeanDiffusionKurtosisFit(model, model_params, *)

mean_signal_bvalue(data, gtab, *[, bmag])

Computes the average signal across different diffusion directions for each unique b-value

msk_from_awf(f)

Computes mean signal kurtosis from axonal water fraction estimates of the SMT2 model

awf_from_msk(msk, *[, mask])

Computes the axonal water fraction from the mean signal kurtosis assuming the 2-compartmental spherical mean technique model.

msdki_prediction(msdki_params, gtab, *[, S0])

Predict the mean signal given the parameters of the mean signal DKI, an GradientTable object and S0 signal.

wls_fit_msdki(design_matrix, msignal, ng, *)

Fits the mean signal diffusion kurtosis imaging based on a weighted least square solution.

design_matrix(ubvals)

Constructs design matrix for the mean signal diffusion kurtosis model

Module: reconst.multi_voxel#

Tools to easily make multi voxel models

MultiVoxelFit(model, fit_array, mask)

Holds an array of fits and allows access to their attributes and methods

CallableArray

An array which can be called like a function

multi_voxel_fit(single_voxel_fit)

Method decorator to turn a single voxel model fit definition into a multi voxel model fit definition

Module: reconst.odf#

OdfModel(gtab)

An abstract class to be sub-classed by specific odf models

OdfFit(model, data)

gfa(samples)

The general fractional anisotropy of a function evaluated on the unit sphere

minmax_normalize(samples, *[, out])

Min-max normalization of a function evaluated on the unit sphere

Module: reconst.qtdmri#

QtdmriModel(gtab, *[, radial_order, ...])

The q:math:tau-dMRI model to analytically and continuously represent the q:math:tau diffusion signal attenuation over diffusion sensitization q and diffusion time \(\tau\).

QtdmriFit(model, qtdmri_coef, us, ut, ...)

qtdmri_to_mapmri_matrix(radial_order, ...)

Generate the matrix that maps the qtdmri coefficients to MAP-MRI coefficients for the anisotropic case.

qtdmri_isotropic_to_mapmri_matrix(...)

Generate the matrix that maps the spherical qtdmri coefficients to MAP-MRI coefficients for the isotropic case.

qtdmri_temporal_normalization(ut)

Normalization factor for the temporal basis

qtdmri_mapmri_normalization(mu)

Normalization factor for Cartesian MAP-MRI basis.

qtdmri_mapmri_isotropic_normalization(j, ell, u0)

Normalization factor for Spherical MAP-MRI basis.

qtdmri_signal_matrix(radial_order, ...)

Constructs the design matrix as a product of 3 separated radial, angular and temporal design matrices.

qtdmri_eap_matrix(radial_order, time_order, ...)

Constructs the design matrix as a product of 3 separated radial, angular and temporal design matrices.

qtdmri_isotropic_signal_matrix(radial_order, ...)

qtdmri_isotropic_eap_matrix(radial_order, ...)

Constructs the design matrix as a product of 3 separated radial, angular and temporal design matrices.

radial_basis_opt(j, ell, us, q)

Spatial basis dependent on spatial scaling factor us

angular_basis_opt(ell, m, q, theta, phi)

Angular basis independent of spatial scaling factor us.

radial_basis_EAP_opt(j, ell, us, r)

angular_basis_EAP_opt(j, ell, m, r, theta, phi)

temporal_basis(o, ut, tau)

Temporal basis dependent on temporal scaling factor ut

qtdmri_index_matrix(radial_order, time_order)

Computes the SHORE basis order indices according to [1].

qtdmri_isotropic_index_matrix(radial_order, ...)

Computes the SHORE basis order indices according to [1].

qtdmri_laplacian_reg_matrix(ind_mat, us, ut, *)

Computes the cartesian qt-dMRI Laplacian regularization matrix.

qtdmri_isotropic_laplacian_reg_matrix(...[, ...])

Computes the spherical qt-dMRI Laplacian regularization matrix.

part23_reg_matrix_q(ind_mat, U_mat, T_mat, us)

Partial cartesian spatial Laplacian regularization matrix.

part23_iso_reg_matrix_q(ind_mat, us)

Partial spherical spatial Laplacian regularization matrix.

part4_reg_matrix_q(ind_mat, U_mat, us)

Partial cartesian spatial Laplacian regularization matrix.

part4_iso_reg_matrix_q(ind_mat, us)

Partial spherical spatial Laplacian regularization matrix.

part1_reg_matrix_tau(ind_mat, ut)

Partial temporal Laplacian regularization matrix.

part23_reg_matrix_tau(ind_mat, ut)

Partial temporal Laplacian regularization matrix.

part4_reg_matrix_tau(ind_mat, ut)

Partial temporal Laplacian regularization matrix.

H(value)

Step function of H(x)=1 if x>=0 and zero otherwise.

generalized_crossvalidation(data, M, LR, *)

Generalized Cross Validation Function.

GCV_cost_function(weight, arguments)

Generalized Cross Validation Function that is iterated.

qtdmri_isotropic_scaling(data, q, tau)

Constructs design matrix for fitting an exponential to the diffusion time points.

qtdmri_anisotropic_scaling(data, q, bvecs, tau)

Constructs design matrix for fitting an exponential to the diffusion time points.

design_matrix_spatial(bvecs, qvals)

Constructs design matrix for DTI weighted least squares or least squares fitting.

create_rt_space_grid(grid_size_r, ...)

Generates EAP grid (for potential positivity constraint).

qtdmri_number_of_coefficients(radial_order, ...)

Computes the total number of coefficients of the qtdmri basis given a radial and temporal order.

l1_crossvalidation(b0s_mask, E, M, *[, ...])

cross-validation function to find the optimal weight of alpha for sparsity regularization

elastic_crossvalidation(b0s_mask, E, M, L, ...)

cross-validation function to find the optimal weight of alpha for sparsity regularization when also Laplacian regularization is used.

visualise_gradient_table_G_Delta_rainbow(gtab, *)

This function visualizes a q-tau acquisition scheme as a function of gradient strength and pulse separation (big_delta).

Module: reconst.qti#

Classes and functions for fitting the covariance tensor model of q-space trajectory imaging (QTI) by Westin et al.[3].

References#

QtiModel(gtab, *[, fit_method, cvxpy_solver])

QtiFit(params)

from_3x3_to_6x1(T)

Convert symmetric 3 x 3 matrices into 6 x 1 vectors.

from_6x1_to_3x3(V)

Convert 6 x 1 vectors into symmetric 3 x 3 matrices.

from_6x6_to_21x1(T)

Convert symmetric 6 x 6 matrices into 21 x 1 vectors.

from_21x1_to_6x6(V)

Convert 21 x 1 vectors into symmetric 6 x 6 matrices.

cvxpy_1x6_to_3x3(V)

Convert a 1 x 6 vector into a symmetric 3 x 3 matrix.

cvxpy_1x21_to_6x6(V)

Convert 1 x 21 vector into a symmetric 6 x 6 matrix.

dtd_covariance(DTD)

Calculate covariance of a diffusion tensor distribution (DTD).

qti_signal(gtab, D, C, *[, S0])

Generate signals using the covariance tensor signal representation.

design_matrix(btens)

Calculate the design matrix from the b-tensors.

Module: reconst.quick_squash#

Detect common dtype across object array

quick_squash(obj_arr[, mask, fill])

Try and make a standard array from an object array

reduce(function, iterable[, initial])

Apply a function of two arguments cumulatively to the items of an iterable, from left to right.

Module: reconst.recspeed#

Optimized routines for creating voxel diffusion models

adj_to_countarrs(adj_inds)

Convert adjacency sequence to counts and flattened indices

argmax_from_adj(vals, vertex_inds, adj_inds)

Indices of local maxima from vals given adjacent points

argmax_from_countarrs(vals, vertinds, ...)

Indices of local maxima from vals from count, array neighbors

le_to_odf(odf, LEs, radius, odfn, radiusn, ...)

odf for interpolated Laplacian normalized signal

local_maxima(odf, edges)

Local maxima of a function evaluated on a discrete set of points.

proc_reco_args(vals, vertinds)

remove_similar_vertices(vertices, theta[, ...])

Remove vertices that are less than theta degrees from any other

search_descending(a, relative_threshold)

i in descending array a so a[i] < a[0] * relative_threshold

sum_on_blocks_1d(arr, blocks, out, outn)

Summations on blocks of 1d array

Module: reconst.rumba#

Robust and Unbiased Model-BAsed Spherical Deconvolution (RUMBA-SD)

RumbaSDModel(gtab, *[, wm_response, ...])

RumbaFit(model, model_params)

rumba_deconv(data, kernel, *[, n_iter, ...])

Fit fODF and GM/CSF volume fractions for a voxel using RUMBA-SD.

mbessel_ratio(n, x)

Fast computation of modified Bessel function ratio (first kind).

generate_kernel(gtab, sphere, wm_response, ...)

Generate deconvolution kernel

rumba_deconv_global(data, kernel, mask, *[, ...])

Fit fODF for all voxels simultaneously using RUMBA-SD.

Module: reconst.sfm#

The Sparse Fascicle Model.

This is an implementation of the sparse fascicle model described in Rokem et al.[4]. The multi b-value version of this model is described in Rokem et al.[5].

References#

IsotropicModel(gtab)

A base-class for the representation of isotropic signals.

IsotropicFit(model, params)

A fit object for representing the isotropic signal as the mean of the diffusion-weighted signal.

ExponentialIsotropicModel(gtab)

Representing the isotropic signal as a fit to an exponential decay function with b-values

ExponentialIsotropicFit(model, params)

A fit to the ExponentialIsotropicModel object, based on data.

SparseFascicleModel(gtab, *[, sphere, ...])

SparseFascicleFit(model, beta, S0, iso)

sfm_design_matrix(gtab, sphere, response, *)

Construct the SFM design matrix

Module: reconst.shm#

Tools for using spherical harmonic models to fit diffusion data.

See [6], [7], [8], and [9].

References#

Note about the Transpose: In the literature the matrix representation of these methods is often written as Y = Bx where B is some design matrix and Y and x are column vectors. In our case the input data, a dwi stored as a nifti file for example, is stored as row vectors (ndarrays) of the form (x, y, z, n), where n is the number of diffusion directions. We could transpose and reshape the data to be (n, x*y*z), so that we could directly plug it into the above equation. However, I have chosen to keep the data as is and implement the relevant equations rewritten in the following form: Y.T = x.T B.T, or in python syntax data = np.dot(sh_coef, B.T) where data is Y.T and sh_coef is x.T.

SphHarmModel(gtab)

To be subclassed by all models that return a SphHarmFit when fit.

QballBaseModel(gtab, sh_order_max, *[, ...])

To be subclassed by Qball type models.

SphHarmFit(model, shm_coef, mask)

Diffusion data fit to a spherical harmonic model

CsaOdfModel(gtab, sh_order_max, *[, smooth, ...])

Implementation of Constant Solid Angle reconstruction method.

OpdtModel(gtab, sh_order_max, *[, smooth, ...])

Implementation of Orientation Probability Density Transform reconstruction method.

QballModel(gtab, sh_order_max, *[, smooth, ...])

Implementation of regularized Qball reconstruction method.

ResidualBootstrapWrapper(signal_object, B, ...)

Returns a residual bootstrap sample of the signal_object when indexed

forward_sdeconv_mat(r_rh, l_values)

Build forward spherical deconvolution matrix

sh_to_rh(r_sh, m_values, l_values)

Spherical harmonics (SH) to rotational harmonics (RH)

gen_dirac(m_values, l_values, theta, phi, *)

Generate Dirac delta function orientated in (theta, phi) on the sphere

spherical_harmonics(m_values, l_values, ...)

Compute spherical harmonics.

real_sph_harm(m_values, l_values, theta, phi)

Compute real spherical harmonics.

real_sh_tournier_from_index(m_values, ...[, ...])

Compute real spherical harmonics.

real_sh_descoteaux_from_index(m_values, ...)

Compute real spherical harmonics.

real_sh_tournier(sh_order_max, theta, phi, *)

Compute real spherical harmonics.

real_sh_descoteaux(sh_order_max, theta, phi, *)

Compute real spherical harmonics.

real_sym_sh_mrtrix(sh_order_max, theta, phi)

dipy.reconst.shm.real_sym_sh_mrtrix is deprecated, Please use dipy.reconst.shm.real_sh_tournier instead

real_sym_sh_basis(sh_order_max, theta, phi)

Samples a real symmetric spherical harmonic basis at point on the sphere

sph_harm_ind_list(sh_order_max, *[, full_basis])

Returns the order (l) and phase_factor (m) of all the symmetric spherical harmonics of order less then or equal to sh_order_max.

order_from_ncoef(ncoef, *[, full_basis])

Given a number n of coefficients, calculate back the sh_order_max

smooth_pinv(B, L)

Regularized pseudo-inverse

lazy_index(index)

Produces a lazy index

normalize_data(data, where_b0, *[, ...])

Normalizes the data with respect to the mean b0

hat(B)

Returns the hat matrix for the design matrix B

lcr_matrix(H)

Returns a matrix for computing leveraged, centered residuals from data

bootstrap_data_array(data, H, R, *[, permute])

Applies the Residual Bootstraps to the data given H and R

bootstrap_data_voxel(data, H, R, *[, permute])

Like bootstrap_data_array but faster when for a single voxel

sf_to_sh(sf, sphere, *[, sh_order_max, ...])

Spherical function to spherical harmonics (SH).

sh_to_sf(sh, sphere, *[, sh_order_max, ...])

Spherical harmonics (SH) to spherical function (SF).

sh_to_sf_matrix(sphere, *[, sh_order_max, ...])

Matrix that transforms Spherical harmonics (SH) to spherical function (SF).

calculate_max_order(n_coeffs, *[, full_basis])

Calculate the maximal harmonic order (l), given that you know the number of parameters that were estimated.

anisotropic_power(sh_coeffs, *[, ...])

Calculate anisotropic power map with a given SH coefficient matrix.

convert_sh_to_full_basis(sh_coeffs)

Given an array of SH coeffs from a symmetric basis, returns the coefficients for the full SH basis by filling odd order SH coefficients with zeros

convert_sh_from_legacy(sh_coeffs, sh_basis, *)

Convert SH coefficients in legacy SH basis to SH coefficients of the new SH basis for descoteaux07 or tournier07 bases.

convert_sh_to_legacy(sh_coeffs, sh_basis, *)

Convert SH coefficients in new SH basis to SH coefficients for the legacy SH basis for descoteaux07 or tournier07 bases.

convert_sh_descoteaux_tournier(sh_coeffs)

Convert SH coefficients between legacy-descoteaux07 and tournier07.

Module: reconst.shore#

ShoreModel(gtab, *[, radial_order, zeta, ...])

Simple Harmonic Oscillator based Reconstruction and Estimation (SHORE) of the diffusion signal.

ShoreFit(model, shore_coef)

shore_matrix(radial_order, zeta, gtab, *[, tau])

Compute the SHORE matrix for modified Merlet's 3D-SHORE.

shore_matrix_pdf(radial_order, zeta, rtab)

Compute the SHORE propagator matrix.

shore_matrix_odf(radial_order, zeta, ...)

Compute the SHORE ODF matrix.

l_shore(radial_order)

Returns the angular regularisation matrix for SHORE basis

n_shore(radial_order)

Returns the angular regularisation matrix for SHORE basis

create_rspace(gridsize, radius_max)

Create the real space table, that contains the points in which

shore_indices(radial_order, index)

Given the basis order and the index, return the shore indices n, l, m for modified Merlet's 3D-SHORE

shore_order(n, ell, m)

Given the indices (n,l,m) of the basis, return the minimum order for those indices and their index for modified Merlet's 3D-SHORE.

Module: reconst.utils#

dki_design_matrix(gtab)

Construct B design matrix for DKI.

cti_design_matrix(gtab1, gtab2)

Construct B design matrix for CTI.

convert_tensors(tensor, from_format, to_format)

Convert tensors from one format to another.

Module: reconst.vec_val_sum#

vec_val_vect(vecs, vals)

Vectorize vecs.diag(vals).`vecs`.T for last 2 dimensions of vecs

Module: reconst.weights_method#

Functions for defining weights for iterative fitting methods.

simple_cutoff(residuals, log_residuals, ...)

Define outliers based on the signal (rather than the log-signal).

two_eyes_cutoff(residuals, log_residuals, ...)

Define outliers with two-eyes approach.

weights_method_wls_m_est(data, pred_sig, ...)

Calculate M-estimator weights for WLS model.

weights_method_nlls_m_est(data, pred_sig, ...)

Calculate M-estimator weights for NLLS model.

ReconstModel#

class dipy.reconst.base.ReconstModel(gtab)[source]#

Bases: object

Abstract class for signal reconstruction models

Methods

fit

fit(data, *, mask=None, **kwargs)[source]#

ReconstFit#

class dipy.reconst.base.ReconstFit(model, data)[source]#

Bases: object

Abstract class which holds the fit result of ReconstModel

For example that could be holding FA or GFA etc.

BinghamMetrics#

class dipy.reconst.bingham.BinghamMetrics(model_params)[source]#

Bases: object

Class for Bingham Metrics.

Methods

amplitude_lobe()

Maximum Bingham Amplitude for each ODF lobe.

fd_lobe()

Fiber Density computed as the integral of the Bingham functions fitted for each ODF lobe.

fd_voxel()

Voxel fiber density (sum of fd estimates of all ODF lobes).

fs_lobe()

Fiber spread computed for each ODF lobe.

fs_voxel()

Voxel fiber spread (weighted average of fiber spread across all lobes where the weights are each lobe's fd estimate).

kappa1_lobe()

Concentration parameter k1 for each ODF lobe.

kappa2_lobe()

Concentration parameter k2 for each ODF lobe.

kappa_total_lobe()

Overall concentration parameters for an ODF peak.

odf(sphere)

Reconstruct ODFs from fitted Bingham parameters on multiple voxels.

odi1_lobe()

Orientation Dispersion index 1 computed for each ODF lobe from concentration parameter kappa1.

odi1_voxel()

Voxel Orientation Dispersion Index 1 (weighted average of odi1 across all lobes where the weights are each lobe's fd estimate).

odi2_lobe()

Orientation Dispersion index 2 computed for each ODF lobe from concentration parameter kappa2.

odi2_voxel()

Voxel Orientation Dispersion Index 2 (weighted average of odi2 across all lobes where the weights are each lobe's fd estimate).

odi_total_lobe()

Overall Orientation Dispersion Index (ODI) for an ODF lobe.

odi_total_voxel()

Voxel total Orientation Dispersion Index (weighted average of odf_total across all lobes where the weights are each lobe's fd estimate).

amplitude_lobe()[source]#

Maximum Bingham Amplitude for each ODF lobe. Measured in the unit 1/mm^3*rad.

fd_lobe()[source]#

Fiber Density computed as the integral of the Bingham functions fitted for each ODF lobe.

fd_voxel()[source]#

Voxel fiber density (sum of fd estimates of all ODF lobes).

fs_lobe()[source]#

Fiber spread computed for each ODF lobe.

Notes

Fiber spread (fs) is defined as fs = fd/f0 and characterizes the spread of the lobe, i.e. the higher the fs, the wider the lobe [1].

References

fs_voxel()[source]#

Voxel fiber spread (weighted average of fiber spread across all lobes where the weights are each lobe’s fd estimate).

kappa1_lobe()[source]#

Concentration parameter k1 for each ODF lobe.

kappa2_lobe()[source]#

Concentration parameter k2 for each ODF lobe.

kappa_total_lobe()[source]#

Overall concentration parameters for an ODF peak.

The overall (combined) concentration parameters for each lobe is defined by equation 19 in [10] as

\[k_{total} = sqrt{(k_1 * k_2)}\]

References

odf(sphere)[source]#

Reconstruct ODFs from fitted Bingham parameters on multiple voxels.

Parameters:
sphere: `Sphere` class instance

The Sphere providing the discrete directions for ODF reconstruction.

Returns:
ODFndarray (…, n_directions)

The value of the odf on each point of sphere.

odi1_lobe()[source]#

Orientation Dispersion index 1 computed for each ODF lobe from concentration parameter kappa1.

odi1_voxel()[source]#

Voxel Orientation Dispersion Index 1 (weighted average of odi1 across all lobes where the weights are each lobe’s fd estimate).

odi2_lobe()[source]#

Orientation Dispersion index 2 computed for each ODF lobe from concentration parameter kappa2.

odi2_voxel()[source]#

Voxel Orientation Dispersion Index 2 (weighted average of odi2 across all lobes where the weights are each lobe’s fd estimate).

odi_total_lobe()[source]#

Overall Orientation Dispersion Index (ODI) for an ODF lobe.

Overall Orientation Dispersion Index (ODI) computed for an ODF lobe from the overall concentration parameter (k_total). Defined by equation 20 in [10].

References

odi_total_voxel()[source]#

Voxel total Orientation Dispersion Index (weighted average of odf_total across all lobes where the weights are each lobe’s fd estimate).

bingham_to_sf#

dipy.reconst.bingham.bingham_to_sf(bingham_params, sphere, *, mask=None)[source]#

Reconstruct ODFs from fitted Bingham parameters on multiple voxels.

Parameters:
bingham_paramsndarray (…., nl, 12)

ndarray containing the model parameters of Binghams fitted to ODFs in the following order: - Maximum value of the Bingham function (f0, index 0); - concentration parameters k1 and k2 (indexes 1 and 2); - elements of Bingham’s main direction (indexes 3-5); - elements of Bingham’s dispersion major axis (indexes 6-8); - elements of Bingham’s dispersion minor axis (indexes 9-11).

sphere: `Sphere` class instance

The Sphere providing the odf’s discrete directions

mask: ndarray, optional

Map marking the coordinates in the data that should be analyzed. Default (None) means all voxels in the volume will be analyzed.

Returns:
ODFndarray (…, n_directions)

The value of the odf on each point of sphere.

bingham_fiber_density#

dipy.reconst.bingham.bingham_fiber_density(bingham_params, *, subdivide=5, mask=None)[source]#

Compute fiber density for each lobe for a given Bingham ODF. Measured in the unit 1/mm^3.

Parameters:
bingham_paramsndarray (…., nl, 12)

ndarray containing the model parameters of Bingham’s fitted to ODFs in the following order: - Maximum value of the Bingham function (f0, index 0); - Concentration parameters k1 and k2 (indexes 1 and 2); - Elements of Bingham’s main direction (indexes 3-5); - Elements of Bingham’s dispersion major axis (indexes 6-8); - Elements of Bingham’s dispersion minor axis (indexes 9-11).

subdivide: int >= 0, optional

Number of times the unit icosahedron used for integration should be subdivided. The higher this value the more precise the approximation will be, at the cost of longer execution times. The default results in a sphere of 10242 points.

mask: ndarray, optional

Map marking the coordinates in the data that should be analyzed. Default (None) means all voxels in the volume will be analyzed.

Returns:
fd: ndarray (…., nl)

Fiber density for each Bingham function.

Notes

Fiber density (fd) is given by the surface integral of the Bingham function [1].

References

bingham_fiber_spread#

dipy.reconst.bingham.bingham_fiber_spread(f0, fd)[source]#

Compute fiber spread for each lobe for a given Bingham volume. Measured in radians.

Parameters:
f0: ndarray

Peak amplitude (f0) of each Bingham function.

fd: ndarray

Fiber density (fd) of each Bingham function.

Returns:
fs: list of floats

Fiber spread (fs) of each each Bingham function.

Notes

Fiber spread (fs) is defined as fs = fd/f0 and characterizes the spread of the lobe, i.e. the higher the fs, the wider the lobe [1].

References

k2odi#

dipy.reconst.bingham.k2odi(k)[source]#

Convert the Bingham/Watson concentration parameter k to the orientation dispersion index (ODI).

Parameters:
k: ndarray

Watson/Bingham concentration parameter

Returns:
ODI: float or ndarray

Orientation Dispersion Index

Notes

Orientation Dispersion Index for Watson/Bingham functions are defined as [2], [11]:

\[ODI = \frac{2}{pi} \arctan{( \frac{1}{k})}\]

References

odi2k#

dipy.reconst.bingham.odi2k(odi)[source]#

Convert the orientation dispersion index (ODI) to the Bingham/Watson concentration parameter k.

Parameters:
ODI: ndarray

Orientation Dispersion Index

Returns:
k: float or ndarray

Watson/Bingham concentration parameter

Notes

Orientation Dispersion Index for Watson/Bingham functions are defined as [2], [11]:

\[ODI = \frac{2}{pi} \arctan ( \frac{1}{k} )\]

References

weighted_voxel_metric#

dipy.reconst.bingham.weighted_voxel_metric(bmetric, bfd)[source]#

Compute density-weighted scalar maps for metrics of Bingham functions fitted to multiple ODF lobes. The metric is computed as the weighted average of a given metric across the multiple ODF lobes (weights are defined by the Bingham fiber density estimates).

Parameters:
bmetric: ndarray(…, nl)

Any metric with values for nl ODF lobes.

bfd: ndarray(…, nl)

Bingham’s fiber density estimates for the nl ODF lobes

Returns:
wmetric: ndarray(…)

Weight-averaged Bingham metric

sf_to_bingham#

dipy.reconst.bingham.sf_to_bingham(odf, sphere, max_search_angle, *, mask=None, npeaks=5, min_sep_angle=60, rel_th=0.1)[source]#

Fit the Bingham function from an image volume of ODFs.

Parameters:
odf: ndarray (Nx, Ny, Nz, Ndirs)

Orientation Distribution Function sampled on the vertices of a sphere.

sphere: `Sphere` class instance

The Sphere providing the odf’s discrete directions.

max_search_angle: float.

Maximum angle between a peak and its neighbour directions for fitting the Bingham distribution.

mask: ndarray, optional

Map marking the coordinates in the data that should be analyzed.

npeak: int, optional

Maximum number of peaks found.

min_sep_angle: float, optional

Minimum separation angle between two peaks for peak extraction.

rel_th: float, optional

Relative threshold used for peak extraction.

Returns:
BinghamMetrics: class instance

Class instance containing metrics computed from Bingham functions fitted to ODF lobes.

sh_to_bingham#

dipy.reconst.bingham.sh_to_bingham(sh, sphere, max_search_angle, *, mask=None, sh_basis='descoteaux07', legacy=True, npeaks=5, min_sep_angle=60, rel_th=0.1)[source]#

Fit the Bingham function from an image volume of spherical harmonics (SH) representing ODFs.

Parameters:
shndarray

SH coefficients representing a spherical function.

sphereSphere class instance

The Sphere providing the odf’s discrete directions.

max_search_angle: float.

Maximum angle between a peak and its neighbour directions for fitting the Bingham distribution.

mask: ndarray, optional

Map marking the coordinates in the data that should be analyzed.

sh_basis: str, optional

SH basis. Either descoteaux07 or tournier07.

legacy: bool, optional

Use legacy SH basis definitions.

npeak: int, optional

Maximum number of peaks found.

min_sep_angle: float, optional

Minimum separation angle between two peaks for peak extraction.

rel_th: float, optional

Relative threshold used for peak extraction.

Returns:
BinghamMetrics: class instance

Class instance containing metrics computed from Bingham functions fitted to ODF lobes.

Cache#

class dipy.reconst.cache.Cache[source]#

Bases: object

Cache values based on a key object (such as a sphere or gradient table).

Methods

cache_clear()

Clear the cache.

cache_get(tag, key, *[, default])

Retrieve a value from the cache.

cache_set(tag, key, value)

Store a value in the cache.

Notes

This class is meant to be used as a mix-in:

class MyModel(Model, Cache):
    pass

class MyModelFit(Fit):
    pass

Inside a method on the fit, typical usage would be:

def odf(sphere):
    M = self.model.cache_get('odf_basis_matrix', key=sphere)

    if M is None:
        M = self._compute_basis_matrix(sphere)
        self.model.cache_set('odf_basis_matrix', key=sphere, value=M)
cache_clear()[source]#

Clear the cache.

cache_get(tag, key, *, default=None)[source]#

Retrieve a value from the cache.

Parameters:
tagstr

Description of the cached value.

keyobject

Key object used to look up the cached value.

defaultobject

Value to be returned if no cached entry is found.

Returns:
vobject

Value from the cache associated with (tag, key). Returns default if no cached entry is found.

cache_set(tag, key, value)[source]#

Store a value in the cache.

Parameters:
tagstr

Description of the cached value.

keyobject

Key object used to look up the cached value.

valueobject

Value stored in the cache for each unique combination of (tag, key).

Examples

>>> def compute_expensive_matrix(parameters):
...     # Imagine the following computation is very expensive
...     return (p**2 for p in parameters)
>>> c = Cache()
>>> parameters = (1, 2, 3)
>>> X1 = compute_expensive_matrix(parameters)
>>> c.cache_set('expensive_matrix', parameters, X1)
>>> X2 = c.cache_get('expensive_matrix', parameters)
>>> X1 is X2
True

coeff_of_determination#

dipy.reconst.cross_validation.coeff_of_determination(data, model, *, axis=-1)[source]#

Calculate the coefficient of determination for a model prediction, relative to data.

Parameters:
datandarray

The data

modelndarray

The predictions of a model for this data. Same shape as the data.

axis: int, optional

The axis along which different samples are laid out.

Returns:
CODndarray

The coefficient of determination. This has shape data.shape[:-1]

Notes

See: https://en.wikipedia.org/wiki/Coefficient_of_determination

The coefficient of determination is calculated as:

\[R^2 = 100 * (1 - \frac{SSE}{SSD})\]

where SSE is the sum of the squared error between the model and the data (sum of the squared residuals) and SSD is the sum of the squares of the deviations of the data from the mean of the data (variance * N).

kfold_xval#

dipy.reconst.cross_validation.kfold_xval(model, data, folds, *model_args, **model_kwargs)[source]#

Perform k-fold cross-validation.

It generates out-of-sample predictions for each measurement.

See [5] for further details about the method.

Parameters:
modelModel class instance

The type of the model to use for prediction. The corresponding Fit object must have a predict function implemented One of the following: reconst.dti.TensorModel or reconst.csdeconv.ConstrainedSphericalDeconvModel.

datandarray

Diffusion MRI data acquired with the GradientTable of the model. Shape will typically be (x, y, z, b) where xyz are spatial dimensions and b is the number of bvals/bvecs in the GradientTable.

foldsint

The number of divisions to apply to the data

model_argslist

Additional arguments to the model initialization

model_kwargsdict

Additional key-word arguments to the model initialization. If contains the kwarg mask, this will be used as a key-word argument to the fit method of the model object, rather than being used in the initialization of the model object

Notes

This function assumes that a prediction API is implemented in the Model class for which prediction is conducted. That is, the Fit object that gets generated upon fitting the model needs to have a predict method, which receives a GradientTable class instance as input and produces a predicted signal as output.

It also assumes that the model object has bval and bvec attributes holding b-values and corresponding unit vectors.

References

AxSymShResponse#

class dipy.reconst.csdeconv.AxSymShResponse(S0, dwi_response, *, bvalue=None)[source]#

Bases: object

A simple wrapper for response functions represented using only axially symmetric, even spherical harmonic functions (ie, m == 0 and l is even).

Parameters:
S0float

Signal with no diffusion weighting.

dwi_responsearray

Response function signal as coefficients to axially symmetric, even spherical harmonic.

Methods

basis(sphere)

A basis that maps the response coefficients onto a sphere.

on_sphere(sphere)

Evaluates the response function on sphere.

basis(sphere)[source]#

A basis that maps the response coefficients onto a sphere.

on_sphere(sphere)[source]#

Evaluates the response function on sphere.

ConstrainedSphericalDeconvModel#

class dipy.reconst.csdeconv.ConstrainedSphericalDeconvModel(gtab, response, *, reg_sphere=None, sh_order_max=8, lambda_=1, tau=0.1, convergence=50)[source]#

Bases: SphHarmModel

Methods

cache_clear()

Clear the cache.

cache_get(tag, key, *[, default])

Retrieve a value from the cache.

cache_set(tag, key, value)

Store a value in the cache.

fit(data, *[, mask])

Fit method for every voxel in data

predict(sh_coeff, *[, gtab, S0])

Compute a signal prediction given spherical harmonic coefficients for the provided GradientTable class instance.

sampling_matrix(sphere)

The matrix needed to sample ODFs from coefficients of the model.

fit(data, *, mask=None, **kwargs)#

Fit method for every voxel in data

predict(sh_coeff, *, gtab=None, S0=1.0)[source]#

Compute a signal prediction given spherical harmonic coefficients for the provided GradientTable class instance.

Parameters:
sh_coeffndarray

The spherical harmonic representation of the FOD from which to make the signal prediction.

gtabGradientTable

The gradients for which the signal will be predicted. Uses the model’s gradient table by default.

S0ndarray or float

The non diffusion-weighted signal value.

Returns:
pred_signdarray

The predicted signal.

ConstrainedSDTModel#

class dipy.reconst.csdeconv.ConstrainedSDTModel(gtab, ratio, *, reg_sphere=None, sh_order_max=8, lambda_=1.0, tau=0.1)[source]#

Bases: SphHarmModel

Methods

cache_clear()

Clear the cache.

cache_get(tag, key, *[, default])

Retrieve a value from the cache.

cache_set(tag, key, value)

Store a value in the cache.

fit(data, *[, mask])

Fit method for every voxel in data

sampling_matrix(sphere)

The matrix needed to sample ODFs from coefficients of the model.

fit(data, *, mask=None, **kwargs)#

Fit method for every voxel in data

estimate_response#

dipy.reconst.csdeconv.estimate_response(gtab, evals, S0)[source]#

Estimate single fiber response function

Parameters:
gtabGradientTable

Gradient table.

evalsndarray

Eigenvalues.

S0float

non diffusion weighted

Returns:
Sestimated signal

forward_sdt_deconv_mat#

dipy.reconst.csdeconv.forward_sdt_deconv_mat(ratio, l_values, *, r2_term=False)[source]#

Build forward sharpening deconvolution transform (SDT) matrix

Parameters:
ratiofloat

ratio = \(\frac{\lambda_2}{\lambda_1}\) of the single fiber response function

l_valuesndarray (N,)

The order (\(l\)) of spherical harmonic function associated with each row of the deconvolution matrix. Only even orders are allowed.

r2_termbool

True if ODF comes from an ODF computed from a model using the \(r^2\) term in the integral. For example, DSI, GQI, SHORE, CSA, Tensor, Multi-tensor ODFs. This results in using the proper analytical response function solution solving from the single-fiber ODF with the r^2 term. This derivation is not published anywhere but is very similar to [12].

Returns:
Rndarray (N, N)

SDT deconvolution matrix

Pndarray (N, N)

Funk-Radon Transform (FRT) matrix

References

csdeconv#

dipy.reconst.csdeconv.csdeconv(dwsignal, X, B_reg, *, tau=0.1, convergence=50, P=None)[source]#

Constrained-regularized spherical deconvolution (CSD).

Deconvolves the axially symmetric single fiber response function r_rh in rotational harmonics coefficients from the diffusion weighted signal in dwsignal [13].

Parameters:
dwsignalarray

Diffusion weighted signals to be deconvolved.

Xarray

Prediction matrix which estimates diffusion weighted signals from FOD coefficients.

B_regarray (N, B)

SH basis matrix which maps FOD coefficients to FOD values on the surface of the sphere. B_reg should be scaled to account for lambda.

taufloat

Threshold controlling the amplitude below which the corresponding fODF is assumed to be zero. Ideally, tau should be set to zero. However, to improve the stability of the algorithm, tau is set to tau*100 % of the max fODF amplitude (here, 10% by default). This is similar to peak detection where peaks below 0.1 amplitude are usually considered noise peaks. Because SDT is based on a q-ball ODF deconvolution, and not signal deconvolution, using the max instead of mean (as in CSD), is more stable.

convergenceint

Maximum number of iterations to allow the deconvolution to converge.

Pndarray

This is an optimization to avoid computing dot(X.T, X) many times. If the same X is used many times, P can be precomputed and passed to this function.

Returns:
fodf_shndarray ((sh_order_max + 1)*(sh_order_max + 2)/2,)

Spherical harmonics coefficients of the constrained-regularized fiber ODF.

_num_itint

Number of iterations in the constrained-regularization used for convergence.

Notes

This section describes how the fitting of the SH coefficients is done. Problem is to minimise per iteration:

\(F(f_n) = ||Xf_n - S||^2 + \lambda^2 ||H_{n-1} f_n||^2\)

Where \(X\) maps current FOD SH coefficients \(f_n\) to DW signals \(s\) and \(H_{n-1}\) maps FOD SH coefficients \(f_n\) to amplitudes along set of negative directions identified in previous iteration, i.e. the matrix formed by the rows of \(B_{reg}\) for which \(Hf_{n-1}<0\) where \(B_{reg}\) maps \(f_n\) to FOD amplitude on a sphere.

Solve by differentiating and setting to zero:

\(\Rightarrow \frac{\delta F}{\delta f_n} = 2X^T(Xf_n - S) + 2 \lambda^2 H_{n-1}^TH_{n-1}f_n=0\)

Or:

\((X^TX + \lambda^2 H_{n-1}^TH_{n-1})f_n = X^Ts\)

Define \(Q = X^TX + \lambda^2 H_{n-1}^TH_{n-1}\) , which by construction is a square positive definite symmetric matrix of size \(n_{SH} by n_{SH}\). If needed, positive definiteness can be enforced with a small minimum norm regulariser (helps a lot with poorly conditioned direction sets and/or superresolution):

\(Q = X^TX + (\lambda H_{n-1}^T) (\lambda H_{n-1}) + \mu I\)

Solve \(Qf_n = X^Ts\) using Cholesky decomposition:

\(Q = LL^T\)

where \(L\) is lower triangular. Then problem can be solved by back-substitution:

\(L_y = X^Ts\)

\(L^Tf_n = y\)

To speeds things up further, form \(P = X^TX + \mu I\), and update to form \(Q\) by rankn update with \(H_{n-1}\). The dipy implementation looks like:

form initially \(P = X^T X + \mu I\) and \(\lambda B_{reg}\)

for each voxel: form \(z = X^Ts\)

estimate \(f_0\) by solving \(Pf_0=z\). We use a simplified \(l_{max}=4\) solution here, but it might not make a big difference.

Then iterate until no change in rows of \(H\) used in \(H_n\)

form \(H_{n}\) given \(f_{n-1}\)

form \(Q = P + (\lambda H_{n-1}^T) (\lambda H_{n-1}\)) (this can be done by rankn update, but we currently do not use rankn update).

solve \(Qf_n = z\) using Cholesky decomposition

We would like to thank Donald Tournier for his help with describing and implementing this algorithm.

References

odf_deconv#

dipy.reconst.csdeconv.odf_deconv(odf_sh, R, B_reg, *, lambda_=1.0, tau=0.1, r2_term=False)[source]#

ODF constrained-regularized spherical deconvolution using the Sharpening Deconvolution Transform (SDT).

See [14] and [15] for further details about the method.

Parameters:
odf_shndarray ((sh_order_max + 1)*(sh_order_max + 2)/2,)

ndarray of SH coefficients for the ODF spherical function to be deconvolved

Rndarray ((sh_order_max + 1)(sh_order_max + 2)/2,

(sh_order_max + 1)(sh_order_max + 2)/2) SDT matrix in SH basis

B_regndarray ((sh_order_max + 1)(sh_order_max + 2)/2,

(sh_order_max + 1)(sh_order_max + 2)/2) SH basis matrix used for deconvolution

lambda_float, optional

lambda parameter in minimization equation

taufloat, optional

threshold (tau *max(fODF)) controlling the amplitude below which the corresponding fODF is assumed to be zero.

r2_termbool, optional

True if ODF is computed from model that uses the \(r^2\) term in the integral. Recall that Tuch’s ODF (used in Q-ball Imaging [14]) and the true normalized ODF definition differ from a \(r^2\) term in the ODF integral. The original Sharpening Deconvolution Transform (SDT) technique [15] is expecting Tuch’s ODF without the \(r^2\) (see [12] for the mathematical details). Now, this function supports ODF that have been computed using the \(r^2\) term because the proper analytical response function has be derived. For example, models such as DSI, GQI, SHORE, CSA, Tensor, Multi-tensor ODFs, should now be deconvolved with the r2_term=True.

Returns:
fodf_shndarray ((sh_order_max + 1)(sh_order_max + 2)/2,)

Spherical harmonics coefficients of the constrained-regularized fiber ODF

num_itint

Number of iterations in the constrained-regularization used for convergence

References

odf_sh_to_sharp#

dipy.reconst.csdeconv.odf_sh_to_sharp(odfs_sh, sphere, *, basis=None, ratio=0.2, sh_order_max=8, lambda_=1.0, tau=0.1, r2_term=False)[source]#

Sharpen odfs using the sharpening deconvolution transform.

This function can be used to sharpen any smooth ODF spherical function. In theory, this should only be used to sharpen QballModel ODFs, but in practice, one can play with the deconvolution ratio and sharpen almost any ODF-like spherical function. The constrained-regularization is stable and will not only sharpen the ODF peaks but also regularize the noisy peaks.

See [15] for further details about the method.

Parameters:
odfs_shndarray ((sh_order_max + 1)*(sh_order_max + 2)/2, )

array of odfs expressed as spherical harmonics coefficients

sphereSphere

sphere used to build the regularization matrix

basis{None, ‘tournier07’, ‘descoteaux07’}, optional

different spherical harmonic basis: None for the default DIPY basis, tournier07 for the Tournier 2007 [13] basis, and descoteaux07 for the Descoteaux 2007 [7] basis (None defaults to descoteaux07).

ratiofloat, optional

ratio of the smallest vs the largest eigenvalue of the single prolate tensor response function (\(\frac{\lambda_2}{\lambda_1}\))

sh_order_maxint, optional

maximal SH order (\(l\)) of the SH representation

lambda_float, optional

lambda parameter (see odfdeconv)

taufloat, optional

tau parameter in the L matrix construction (see odfdeconv)

r2_termbool, optional

True if ODF is computed from model that uses the \(r^2\) term in the integral. Recall that Tuch’s ODF (used in Q-ball Imaging [14]) and the true normalized ODF definition differ from a \(r^2\) term in the ODF integral. The original Sharpening Deconvolution Transform (SDT) technique [15] is expecting Tuch’s ODF without the \(r^2\) (see [7] for the mathematical details). Now, this function supports ODF that have been computed using the \(r^2\) term because the proper analytical response function has be derived. For example, models such as DSI, GQI, SHORE, CSA, Tensor, Multi-tensor ODFs, should now be deconvolved with the r2_term=True.

Returns:
fodf_shndarray

sharpened odf expressed as spherical harmonics coefficients

References

mask_for_response_ssst#

dipy.reconst.csdeconv.mask_for_response_ssst(gtab, data, *, roi_center=None, roi_radii=10, fa_thr=0.7)[source]#
Computation of mask for single-shell single-tissue (ssst) response

function using FA.

Parameters:
gtabGradientTable

Gradient table.

datandarray

diffusion data (4D)

roi_centerarray-like, (3,)

Center of ROI in data. If center is None, it is assumed that it is the center of the volume with shape data.shape[:3].

roi_radiiint or array-like, (3,)

radii of cuboid ROI

fa_thrfloat

FA threshold

Returns:
maskndarray

Mask of voxels within the ROI and with FA above the FA threshold.

Notes

In CSD there is an important pre-processing step: the estimation of the fiber response function. In order to do this, we look for voxels with very anisotropic configurations. This function aims to accomplish that by returning a mask of voxels within a ROI, that have a FA value above a given threshold. For example we can use a ROI (20x20x20) at the center of the volume and store the signal values for the voxels with FA values higher than 0.7 (see [16]).

References

response_from_mask_ssst#

dipy.reconst.csdeconv.response_from_mask_ssst(gtab, data, mask)[source]#
Computation of single-shell single-tissue (ssst) response

function from a given mask.

Parameters:
gtabGradientTable

Gradient table.

datandarray

diffusion data

maskndarray

mask from where to compute the response function

Returns:
responsetuple, (2,)

(evals, S0)

ratiofloat

The ratio between smallest versus largest eigenvalue of the response.

Notes

In CSD there is an important pre-processing step: the estimation of the fiber response function. In order to do this, we look for voxels with very anisotropic configurations. This information can be obtained by using csdeconv.mask_for_response_ssst() through a mask of selected voxels (see [16]). The present function uses such a mask to compute the ssst response function.

For the response we also need to find the average S0 in the ROI. This is possible using gtab.b0s_mask() we can find all the S0 volumes (which correspond to b-values equal 0) in the dataset.

The response consists always of a prolate tensor created by averaging the highest and second highest eigenvalues in the ROI with FA higher than threshold. We also include the average S0s.

We also return the ratio which is used for the SDT models.

References

auto_response_ssst#

dipy.reconst.csdeconv.auto_response_ssst(gtab, data, *, roi_center=None, roi_radii=10, fa_thr=0.7)[source]#
Automatic estimation of single-shell single-tissue (ssst) response

function using FA.

Parameters:
gtabGradientTable

Gradient table.

datandarray

diffusion data

roi_centerarray-like, (3,)

Center of ROI in data. If center is None, it is assumed that it is the center of the volume with shape data.shape[:3].

roi_radiiint or array-like, (3,)

radii of cuboid ROI

fa_thrfloat

FA threshold

Returns:
responsetuple, (2,)

(evals, S0)

ratiofloat

The ratio between smallest versus largest eigenvalue of the response.

Notes

In CSD there is an important pre-processing step: the estimation of the fiber response function. In order to do this, we look for voxels with very anisotropic configurations. We get this information from csdeconv.mask_for_response_ssst(), which returns a mask of selected voxels (more details are available in the description of the function).

With the mask, we compute the response function by using csdeconv.response_from_mask_ssst(), which returns the response and the ratio (more details are available in the description of the function).

recursive_response#

dipy.reconst.csdeconv.recursive_response(gtab, data, *, mask=None, sh_order_max=8, peak_thr=0.01, init_fa=0.08, init_trace=0.0021, iter=8, convergence=0.001, parallel=False, num_processes=None, sphere=<dipy.core.sphere.HemiSphere object>)[source]#

Recursive calibration of response function using peak threshold.

See [17] for further details about the method.

Parameters:
gtabGradientTable

Gradient table.

datandarray

diffusion data

maskndarray, optional

mask for recursive calibration, for example a white matter mask. It has shape data.shape[0:3] and dtype=bool. Default: use the entire data array.

sh_order_maxint, optional

maximal spherical harmonics order (l).

peak_thrfloat, optional

peak threshold, how large the second peak can be relative to the first peak in order to call it a single fiber population [17].

init_fafloat, optional

FA of the initial ‘fat’ response function (tensor).

init_tracefloat, optional

trace of the initial ‘fat’ response function (tensor).

iterint, optional

maximum number of iterations for calibration.

convergencefloat, optional

convergence criterion, maximum relative change of SH coefficients.

parallelbool, optional

Whether to use parallelization in peak-finding during the calibration procedure.

num_processesint, optional

If parallel is True, the number of subprocesses to use (default multiprocessing.cpu_count()). If < 0 the maximal number of cores minus num_processes + 1 is used (enter -1 to use as many cores as possible). 0 raises an error.

sphereSphere, optional.

The sphere used for peak finding.

Returns:
responsendarray

response function in SH coefficients

Notes

In CSD there is an important pre-processing step: the estimation of the fiber response function. Using an FA threshold is not a very robust method. It is dependent on the dataset (non-informed used subjectivity), and still depends on the diffusion tensor (FA and first eigenvector), which has low accuracy at high b-value. This function recursively calibrates the response function, for more information see [17].

References

fa_trace_to_lambdas#

dipy.reconst.csdeconv.fa_trace_to_lambdas(fa=0.08, trace=0.0021)[source]#

CorrelationTensorModel#

class dipy.reconst.cti.CorrelationTensorModel(gtab1, gtab2, *args, fit_method='WLS', **kwargs)[source]#

Bases: ReconstModel

Class for the Correlation Tensor Model

Methods

fit(data, *[, mask])

Fit method for every voxel in data

predict(cti_params, *[, S0])

Predict a signal for the CTI model class instance given parameters

fit(data, *, mask=None, **kwargs)#

Fit method for every voxel in data

predict(cti_params, *, S0=1)[source]#

Predict a signal for the CTI model class instance given parameters

Parameters:
cti_params: numpy.ndarray (…, 48)

All parameters estimated from the correlation tensor model. Parameters are ordered as follows:

  1. Three diffusion tensor’s eigenvalues

  2. Three lines of the eigenvector matrix each containing the first, second and third coordinates of the eigenvector

  3. Fifteen elements of the kurtosis tensor

  4. Twenty-One elements of the covariance tensor

gtab1: dipy.core.gradients.GradientTable

A GradientTable class instance for first DDE diffusion epoch

gtab2: dipy.core.gradients.GradientTable

A GradientTable class instance for second DDE diffusion epoch

S0float or ndarray, optional

The non diffusion-weighted signal in every voxel, or across all voxels.

Returns:
Snumpy.ndarray

Predicted signal based on the CTI model

CorrelationTensorFit#

class dipy.reconst.cti.CorrelationTensorFit(model, model_params)[source]#

Bases: DiffusionKurtosisFit

Class for fitting the Correlation Tensor Model

Attributes:
K_aniso

Returns the anisotropic Source of Kurtosis ($K_{aniso}$)

K_iso

Returns the isotropic Source of Kurtosis ($K_{iso}$)

K_micro

Returns Microscopic Source of Kurtosis.

S0_hat
ct

Returns the 21 independent elements of the covariance tensor as an

directions

For tracking - return the primary direction in each voxel

evals

Returns the eigenvalues of the tensor as an array

evecs

Returns the eigenvectors of the tensor as an array, columnwise

kfa

Return the kurtosis tensor (KFA).

kt

Return the 15 independent elements of the kurtosis tensor as an array

quadratic_form

Calculates the 3x3 diffusion tensor for each voxel

shape

Methods

K_total()

Returns the total excess kurtosis.

ad()

Axial diffusivity (AD) calculated from cached eigenvalues.

adc(sphere)

Calculate the apparent diffusion coefficient (ADC) in each direction on the sphere for each voxel in the data

ak(*[, min_kurtosis, max_kurtosis, analytical])

Compute axial kurtosis (AK) of a diffusion kurtosis tensor.

akc(sphere)

Calculate the apparent kurtosis coefficient (AKC) in each direction on the sphere for each voxel in the data

color_fa()

Color fractional anisotropy of diffusion tensor

fa()

Fractional anisotropy (FA) calculated from cached eigenvalues.

ga()

Geodesic anisotropy (GA) calculated from cached eigenvalues.

kmax(*[, sphere, gtol, mask])

Compute the maximum value of a single voxel kurtosis tensor

linearity()

md()

Mean diffusivity (MD) calculated from cached eigenvalues.

mk(*[, min_kurtosis, max_kurtosis, analytical])

Compute mean kurtosis (MK) from the kurtosis tensor.

mkt(*[, min_kurtosis, max_kurtosis])

Compute mean of the kurtosis tensor (MKT).

mode()

Tensor mode calculated from cached eigenvalues.

odf(sphere)

The diffusion orientation distribution function (dODF).

planarity()

predict(gtab1, gtab2, *[, S0])

Given a CTI model fit, predict the signal on the vertices of a gradient table

rd()

Radial diffusivity (RD) calculated from cached eigenvalues.

rk(*[, min_kurtosis, max_kurtosis, analytical])

Compute radial kurtosis (RK) of a diffusion kurtosis tensor.

rtk(*[, min_kurtosis, max_kurtosis])

Compute the rescaled radial tensor kurtosis (RTK).

sphericity()

trace()

Trace of the tensor calculated from cached eigenvalues.

lower_triangular

property K_aniso#

Returns the anisotropic Source of Kurtosis (\(K_{aniso}\))

Notes

The \(K_{aniso}\) is defined as [18]:

\[\[K_{aniso} = \frac{6}{5} \cdot \frac{\langle V_{\lambda}(D_c) \rangle}{\overline{D}^2}\]\]

where \(K_{aniso}\) is the anisotropic kurtosis, \(\langle V_{\lambda}(D_c) \rangle\) represents the mean of the variance of eigenvalues of the diffusion tensor, \(\overline{D}\) is the mean of the diffusion tensor.

References

property K_iso#

Returns the isotropic Source of Kurtosis (\(K_{iso}\))

Notes

The \(K_{iso}\) is defined as :

\[K_{\text{iso}} = 3 \cdot \frac{V(\overline{D}^c)}{\overline{D}^2}\]

where: \(K_{\text{iso}}\) is the isotropic kurtosis, \(V({\overline{D}^c})\) represents the variance of the diffusion tensor raised to the power \(c\), \(\overline{D}\) is the mean of the diffusion tensor.

property K_micro#

Returns Microscopic Source of Kurtosis.

K_total()[source]#

Returns the total excess kurtosis.

Notes

\(K_{total}\) is defined as:

\[\[\Psi = \frac{2}{5} \cdot \frac{D_{11}^2 + D_{22}^2 + D_{33}^2 + 2D_{12}^2 + 2D_{13}^2 + 2D_{23}^2{\overline{D}^2} - \frac{6}{5} \] \[{\overline{W}} = \frac{1}{5} \cdot (W_{1111} + W_{2222} + W_{3333} + 2W_{1122} + 2W_{1133} + 2W_{2233})\ ]\]

where \(\Psi\) is a variable representing a part of the total excess kurtosis, \(D_{ij}\) are elements of the diffusion tensor, \(\overline{D}\) is the mean of the diffusion tensor. \(\overline{W}\) is the mean kurtosis, \(W_{ijkl}\) are elements of the kurtosis tensor.

property ct#

Returns the 21 independent elements of the covariance tensor as an array

predict(gtab1, gtab2, *, S0=1)[source]#

Given a CTI model fit, predict the signal on the vertices of a gradient table

Parameters:
gtab1: dipy.core.gradients.GradientTable

A GradientTable class instance for first DDE diffusion epoch

gtab2: dipy.core.gradients.GradientTable

A GradientTable class instance for second DDE diffusion epoch

S0float or ndarray, optional

The non diffusion-weighted signal in every voxel, or across all voxels. Default: 1

Returns:
Snumpy.ndarray

Predicted signal based on the CTI model

from_qte_to_cti#

dipy.reconst.cti.from_qte_to_cti(C)[source]#

Rescales the qte C elements to the C elements used in CTI.

Parameters:
C: array(…, 21)

Twenty-one elements of the covariance tensor in voigt notation plus some extra scaling factors.

Returns:
ccti: array(…, 21)

Covariance Tensor Elements with no hidden factors.

multi_gaussian_k_from_c#

dipy.reconst.cti.multi_gaussian_k_from_c(ccti, MD)[source]#

Computes the multiple Gaussian diffusion kurtosis tensor from the covariance tensor.

Parameters:
ccti: array(…, 21)

Covariance Tensor Elements with no hidden factors.

MDndarray

Mean Diffusivity (MD) of a diffusion tensor.

Returns:
K: array (…, 15)

Fifteen elements of the kurtosis tensor

split_cti_params#

dipy.reconst.cti.split_cti_params(cti_params)[source]#

Splits CTI params into DTI, DKI, CTI portions.

Extract the diffusion tensor eigenvalues, the diffusion tensor eigenvector matrix, and the 21 independent elements of the covariance tensor, and the 15 independent elements of the kurtosis tensor from the model parameters estimated from the CTI model

Parameters:
cti_params: numpy.ndarray (…, 48)

All parameters estimated from the correlation tensor model. Parameters are ordered as follows:

  1. Three diffusion tensor’s eigenvalues

  2. Three lines of the eigenvector matrix each containing the first, second and third coordinates of the eigenvector

  3. Fifteen elements of the kurtosis tensor

  4. Twenty-One elements of the covariance tensor

Returns:
evalsarray (…, 3)

Eigenvalues from eigen decomposition of the tensor.

evecsarray (…, 3)

Associated eigenvectors from eigen decomposition of the tensor. Eigenvectors are columnar (e.g. evecs[:,j] is associated with evals[j])

ktarray (…, 15)

Fifteen elements of the kurtosis tensor

ct: array(…, 21)

Twenty-one elements of the covariance tensor

cti_prediction#

dipy.reconst.cti.cti_prediction(cti_params, gtab1, gtab2, *, S0=1)[source]#

Predict a signal given correlation tensor imaging parameters.

Parameters:
cti_params: numpy.ndarray (…, 48)

All parameters estimated from the correlation tensor model. Parameters are ordered as follows:

  1. Three diffusion tensor’s eigenvalues

  2. Three lines of the eigenvector matrix each containing the first, second and third coordinates of the eigenvector

  3. Fifteen elements of the kurtosis tensor

  4. Twenty-One elements of the covariance tensor

gtab1: dipy.core.gradients.GradientTable

A GradientTable class instance for first DDE diffusion epoch

gtab2: dipy.core.gradients.GradientTable

A GradientTable class instance for second DDE diffusion epoch

S0float or ndarray, optional

The non diffusion-weighted signal in every voxel, or across all voxels. Default: 1

Returns:
Sndarray

Simulated signal based on the CTI model

params_to_cti_params#

dipy.reconst.cti.params_to_cti_params(result, *, min_diffusivity=0)[source]#

ls_fit_cti#

dipy.reconst.cti.ls_fit_cti(design_matrix, data, inverse_design_matrix, *, weights=True, min_diffusivity=0)[source]#

Compute the diffusion kurtosis and covariance tensors using an ordinary or weighted linear least squares approach

Parameters:
design_matrixarray (g, 43)

Design matrix holding the covariants used to solve for the regression coefficients.

dataarray (g)

Data or response variables holding the data.

inverse_design_matrixarray (43, g)

Inverse of the design matrix.

weightsbool, optional

Parameter indicating whether weights are used.

min_diffusivityfloat, optional

Because negative eigenvalues are not physical and small eigenvalues, much smaller than the diffusion weighting, cause quite a lot of noise in metrics such as fa, diffusivity values smaller than min_diffusivity are replaced with min_diffusivity.

Returns:
cti_paramsarray (48)

All parameters estimated from the diffusion kurtosis model for all N voxels. Parameters are ordered as follows:

  1. Three diffusion tensor eigenvalues.

  2. Three blocks of three elements, containing the first second and

    third coordinates of the diffusion tensor eigenvectors.

  3. Fifteen elements of the kurtosis tensor.

  4. Twenty One elements of the covariance tensor.

DiffusionKurtosisModel#

class dipy.reconst.dki.DiffusionKurtosisModel(gtab, *args, fit_method='WLS', return_S0_hat=False, **kwargs)[source]#

Bases: ReconstModel

Class for the Diffusion Kurtosis Model

Methods

fit(data, *[, mask])

Fit method of the DKI model.

iterative_fit(data_thres, *[, mask, ...])

Iteratively Reweighted fitting for the DKI model.

multi_fit(data, *[, mask])

Fit method for every voxel in data

predict(dki_params, *[, S0])

Predict a signal for this DKI model class instance given parameters

fit(data, *, mask=None)[source]#

Fit method of the DKI model.

Parameters:
dataarray

The measured signal.

maskarray

A boolean array used to mark the coordinates in the data that should be analyzed that has the shape data.shape[-1]

iterative_fit(data_thres, *, mask=None, num_iter=4, weights_method=<function weights_method_wls_m_est>)[source]#

Iteratively Reweighted fitting for the DKI model.

Parameters:
data_thresarray

The measured signal.

maskarray, optional

A boolean array used to mark the coordinates in the data that should be analyzed that has the shape data.shape[-1]

num_iterint, optional

Number of times to iterate.

weights_methodcallable, optional

A function with args and returns as follows:

(weights, robust) =
weights_method(data, pred_sig,

design_matrix, leverages, idx, num_iter, robust)

Notes

On the first iteration, (C)WLS fit is performed. Subsequent iterations will be weighted according to weights_method. Outlier rejection should be handled within weights_method by setting the corresponding weights to zero (if weights_method implements outlier rejection).

multi_fit(data, *, mask=None, **kwargs)#

Fit method for every voxel in data

predict(dki_params, *, S0=1.0)[source]#

Predict a signal for this DKI model class instance given parameters

See [19] and [20] for further details about the method.

Parameters:
dki_paramsndarray (x, y, z, 27) or (n, 27)

All parameters estimated from the diffusion kurtosis model. Parameters are ordered as follows:

  1. Three diffusion tensor’s eigenvalues

  2. Three lines of the eigenvector matrix each containing the first, second and third coordinates of the eigenvector

  3. Fifteen elements of the kurtosis tensor

S0float or ndarray, optional

The non diffusion-weighted signal in every voxel, or across all voxels.

References

DiffusionKurtosisFit#

class dipy.reconst.dki.DiffusionKurtosisFit(model, model_params, *, model_S0=None)[source]#

Bases: TensorFit

Class for fitting the Diffusion Kurtosis Model

Attributes:
S0_hat
directions

For tracking - return the primary direction in each voxel

evals

Returns the eigenvalues of the tensor as an array

evecs

Returns the eigenvectors of the tensor as an array, columnwise

kfa

Return the kurtosis tensor (KFA).

kt

Return the 15 independent elements of the kurtosis tensor as an array

quadratic_form

Calculates the 3x3 diffusion tensor for each voxel

shape

Methods

ad()

Axial diffusivity (AD) calculated from cached eigenvalues.

adc(sphere)

Calculate the apparent diffusion coefficient (ADC) in each direction on the sphere for each voxel in the data

ak(*[, min_kurtosis, max_kurtosis, analytical])

Compute axial kurtosis (AK) of a diffusion kurtosis tensor.

akc(sphere)

Calculate the apparent kurtosis coefficient (AKC) in each direction on the sphere for each voxel in the data

color_fa()

Color fractional anisotropy of diffusion tensor

fa()

Fractional anisotropy (FA) calculated from cached eigenvalues.

ga()

Geodesic anisotropy (GA) calculated from cached eigenvalues.

kmax(*[, sphere, gtol, mask])

Compute the maximum value of a single voxel kurtosis tensor

linearity()

md()

Mean diffusivity (MD) calculated from cached eigenvalues.

mk(*[, min_kurtosis, max_kurtosis, analytical])

Compute mean kurtosis (MK) from the kurtosis tensor.

mkt(*[, min_kurtosis, max_kurtosis])

Compute mean of the kurtosis tensor (MKT).

mode()

Tensor mode calculated from cached eigenvalues.

odf(sphere)

The diffusion orientation distribution function (dODF).

planarity()

predict(gtab, *[, S0])

Given a DKI model fit, predict the signal on the vertices of a gradient table

rd()

Radial diffusivity (RD) calculated from cached eigenvalues.

rk(*[, min_kurtosis, max_kurtosis, analytical])

Compute radial kurtosis (RK) of a diffusion kurtosis tensor.

rtk(*[, min_kurtosis, max_kurtosis])

Compute the rescaled radial tensor kurtosis (RTK).

sphericity()

trace()

Trace of the tensor calculated from cached eigenvalues.

lower_triangular

ak(*, min_kurtosis=-0.42857142857142855, max_kurtosis=10, analytical=True)[source]#

Compute axial kurtosis (AK) of a diffusion kurtosis tensor.

See [21] and [20] for further details about the method.

Parameters:
min_kurtosisfloat, optional

To keep kurtosis values within a plausible biophysical range, axial kurtosis values that are smaller than min_kurtosis are replaced with -3./7 (theoretical kurtosis limit for regions that consist of water confined to spherical pores [19]).

max_kurtosisfloat, optional

To keep kurtosis values within a plausible biophysical range, axial kurtosis values that are larger than max_kurtosis are replaced with max_kurtosis.

analyticalbool, optional

If True, AK is calculated from rotated diffusion kurtosis tensor, otherwise it will be computed from the apparent diffusion kurtosis values along the principal axis of the diffusion tensor (see notes).

Returns:
akarray

Calculated AK.

Notes

AK is defined as the directional kurtosis parallel to the fiber’s main direction e1 [21], [20]. You can compute AK using to approaches:

  1. AK is calculated from rotated diffusion kurtosis tensor, i.e.:

\[AK = \hat{W}_{1111} \frac{(\lambda_{1}+\lambda_{2}+\lambda_{3})^2}{(9 \lambda_{1}^2)}\]
  1. AK can be sampled from the principal axis of the diffusion tensor:

\[AK = K(\mathbf{e}_1)\]

Although both approaches leads to an exact calculation of AK, the first approach will be referred to as the analytical method while the second approach will be referred to as the numerical method based on their analogy to the estimation strategies for MK and RK.

References

akc(sphere)[source]#

Calculate the apparent kurtosis coefficient (AKC) in each direction on the sphere for each voxel in the data

Parameters:
sphereSphere class instance

Sphere providing sample directions to compute the apparent kurtosis coefficient.

Returns:
akcndarray

The estimates of the apparent kurtosis coefficient in every direction on the input sphere

Notes

For each sphere direction with coordinates \((n_{1}, n_{2}, n_{3})\), the calculation of AKC is done using formula:

\[AKC(n)=\frac{MD^{2}}{ADC(n)^{2}}\sum_{i=1}^{3}\sum_{j=1}^{3} \sum_{k=1}^{3}\sum_{l=1}^{3}n_{i}n_{j}n_{k}n_{l}W_{ijkl}\]

where \(W_{ijkl}\) are the elements of the kurtosis tensor, MD the mean diffusivity and ADC the apparent diffusion coefficient computed as:

\[ADC(n)=\sum_{i=1}^{3}\sum_{j=1}^{3}n_{i}n_{j}D_{ij}\]

where \(D_{ij}\) are the elements of the diffusion tensor.

property kfa#

Return the kurtosis tensor (KFA).

See [22] for further details about the method.

Notes

The KFA is defined as [22]:

\[KFA \equiv \frac{||\mathbf{W} - MKT \mathbf{I}^{(4)}||_F}{||\mathbf{W}||_F}\]

where \(W\) is the kurtosis tensor, MKT the kurtosis tensor mean, \(I^{(4)}\) is the fully symmetric rank 2 isotropic tensor and \(||...||_F\) is the tensor’s Frobenius norm [22].

References

kmax(*, sphere='repulsion100', gtol=1e-05, mask=None)[source]#

Compute the maximum value of a single voxel kurtosis tensor

See [20] for further details about the method.

Parameters:
sphereSphere class instance, optional

The sphere providing sample directions for the initial search of the maximum value of kurtosis.

gtolfloat, optional

This input is to refine kurtosis maximum under the precision of the directions sampled on the sphere class instance. The gradient of the convergence procedure must be less than gtol before successful termination. If gtol is None, fiber direction is directly taken from the initial sampled directions of the given sphere object

Returns:
max_valuefloat

kurtosis tensor maximum value

References

property kt#

Return the 15 independent elements of the kurtosis tensor as an array

mk(*, min_kurtosis=-0.42857142857142855, max_kurtosis=10, analytical=True)[source]#

Compute mean kurtosis (MK) from the kurtosis tensor.

See Tabesh et al.[21] and [20] for further details about the method.

Parameters:
min_kurtosisfloat, optional

To keep kurtosis values within a plausible biophysical range, mean kurtosis values that are smaller than min_kurtosis are replaced with min_kurtosis. Default = -3./7 (theoretical kurtosis limit for regions that consist of water confined to spherical pores [19]).

max_kurtosisfloat, optional

To keep kurtosis values within a plausible biophysical range, mean kurtosis values that are larger than max_kurtosis are replaced with max_kurtosis.

analyticalbool, optional

If True, MK is calculated using its analytical solution, otherwise an exact numerical estimator is used (see Notes).

Returns:
mkarray

Calculated MK.

Notes

The MK is defined as the average of directional kurtosis coefficients across all spatial directions, which can be formulated by the following surface integral [21], [20]:

\[MK \equiv \frac{1}{4\pi} \int d\Omega_\mathbf{n} K(\mathbf{n})\]

This integral can be numerically solved by averaging directional kurtosis values sampled for directions of a spherical t-design [23].

Alternatively, MK can be solved from the analytical solution derived by Tabesh et al.[21]. This solution is given by:

\[\begin{split}MK=F_1(\lambda_1,\lambda_2,\lambda_3)\hat{W}_{1111}+ F_1(\lambda_2,\lambda_1,\lambda_3)\hat{W}_{2222}+ F_1(\lambda_3,\lambda_2,\lambda_1)\hat{W}_{3333}+ \\ F_2(\lambda_1,\lambda_2,\lambda_3)\hat{W}_{2233}+ F_2(\lambda_2,\lambda_1,\lambda_3)\hat{W}_{1133}+ F_2(\lambda_3,\lambda_2,\lambda_1)\hat{W}_{1122}\end{split}\]

where \(\hat{W}_{ijkl}\) are the components of the \(W\) tensor in the coordinates system defined by the eigenvectors of the diffusion tensor \(\mathbf{D}\) and

\[ \begin{align}\begin{aligned}\begin{split}F_1(\lambda_1,\lambda_2,\lambda_3)= \frac{(\lambda_1+\lambda_2+\lambda_3)^2} {18(\lambda_1-\lambda_2)(\lambda_1-\lambda_3)} [\frac{\sqrt{\lambda_2\lambda_3}}{\lambda_1} R_F(\frac{\lambda_1}{\lambda_2},\frac{\lambda_1}{\lambda_3},1)+\\ \frac{3\lambda_1^2-\lambda_1\lambda_2-\lambda_2\lambda_3- \lambda_1\lambda_3} {3\lambda_1 \sqrt{\lambda_2 \lambda_3}} R_D(\frac{\lambda_1}{\lambda_2},\frac{\lambda_1}{\lambda_3},1)-1 ]\end{split}\\\begin{split}F_2(\lambda_1,\lambda_2,\lambda_3)= \frac{(\lambda_1+\lambda_2+\lambda_3)^2} {3(\lambda_2-\lambda_3)^2} [\frac{\lambda_2+\lambda_3}{\sqrt{\lambda_2\lambda_3}} R_F(\frac{\lambda_1}{\lambda_2},\frac{\lambda_1}{\lambda_3},1)+\\ \frac{2\lambda_1-\lambda_2-\lambda_3}{3\sqrt{\lambda_2 \lambda_3}} R_D(\frac{\lambda_1}{\lambda_2},\frac{\lambda_1}{\lambda_3},1)-2]\end{split}\end{aligned}\end{align} \]

where \(R_f\) and \(R_d\) are the Carlson’s elliptic integrals.

References

mkt(*, min_kurtosis=-0.42857142857142855, max_kurtosis=10)[source]#

Compute mean of the kurtosis tensor (MKT).

See [24] for further details about the method.

Parameters:
min_kurtosisfloat, optional

To keep kurtosis values within a plausible biophysical range, mean kurtosis values that are smaller than min_kurtosis are replaced with min_kurtosis. Default = -3./7 (theoretical kurtosis limit for regions that consist of water confined to spherical pores [19]).

max_kurtosisfloat, optional

To keep kurtosis values within a plausible biophysical range, mean kurtosis values that are larger than max_kurtosis are replaced with max_kurtosis.

Returns:
mktarray

Calculated mean kurtosis tensor.

Notes

The MKT is defined as [24]:

\[MKT \equiv \frac{1}{4\pi} \int d \Omega_{\mathnbf{n}} n_i n_j n_k n_l W_{ijkl}\]

which can be directly computed from the trace of the kurtosis tensor:

\[MKT = \frac{1}{5} Tr(\mathbf{W}) = \frac{1}{5} (W_{1111} + W_{2222} + W_{3333} + 2W_{1122} + 2W_{1133} + 2W_{2233})\]

References

predict(gtab, *, S0=1.0)[source]#

Given a DKI model fit, predict the signal on the vertices of a gradient table

See [19] and [20] for further details about the method.

Parameters:
gtaba GradientTable class instance

The gradient table for this prediction

S0float or ndarray, optional

The non diffusion-weighted signal in every voxel, or across all voxels.

Notes

The predicted signal is given by:

\[S(n,b)=S_{0}e^{-bD(n)+\frac{1}{6}b^{2}D(n)^{2}K(n)}\]

\(\mathbf{D(n)}\) and \(\mathbf{K(n)}\) can be computed from the DT and KT using the following equations:

\[D(n)=\sum_{i=1}^{3}\sum_{j=1}^{3}n_{i}n_{j}D_{ij}\]

and

\[K(n)=\frac{MD^{2}}{D(n)^{2}}\sum_{i=1}^{3}\sum_{j=1}^{3} \sum_{k=1}^{3}\sum_{l=1}^{3}n_{i}n_{j}n_{k}n_{l}W_{ijkl}\]

where \(D_{ij}\) and \(W_{ijkl}\) are the elements of the second-order DT and the fourth-order KT tensors, respectively, and \(MD\) is the mean diffusivity.

References

rk(*, min_kurtosis=-0.42857142857142855, max_kurtosis=10, analytical=True)[source]#

Compute radial kurtosis (RK) of a diffusion kurtosis tensor.

See [21] for further details about the method.

Parameters:
min_kurtosisfloat, optional

To keep kurtosis values within a plausible biophysical range, radial kurtosis values that are smaller than min_kurtosis are replaced with min_kurtosis. Default = -3./7 (theoretical kurtosis limit for regions that consist of water confined to spherical pores [19]).

max_kurtosisfloat, optional

To keep kurtosis values within a plausible biophysical range, radial kurtosis values that are larger than max_kurtosis are replaced with max_kurtosis.

analyticalbool, optional

If True, RK is calculated using its analytical solution, otherwise an exact numerical estimator is used (see Notes).

Returns:
rkarray

Calculated RK.

Notes

RK is defined as the average of the directional kurtosis perpendicular to the fiber’s main direction e1 [21], [20]:

\[RK \equiv \frac{1}{2\pi} \int d\Omega _\mathbf{\theta} K(\mathbf{\theta}) \delta (\mathbf{\theta}\cdot \mathbf{e}_1)\]

This equation can be numerically computed by averaging apparent directional kurtosis samples for directions perpendicular to e1 [20].

Otherwise, RK can be calculated from its analytical solution [21]:

\[K_{\bot} = G_1(\lambda_1,\lambda_2,\lambda_3)\hat{W}_{2222} + G_1(\lambda_1,\lambda_3,\lambda_2)\hat{W}_{3333} + G_2(\lambda_1,\lambda_2,\lambda_3)\hat{W}_{2233}\]

where:

\[G_1(\lambda_1,\lambda_2,\lambda_3)= \frac{(\lambda_1+\lambda_2+\lambda_3)^2}{18\lambda_2(\lambda_2- \lambda_3)} \left (2\lambda_2 + \frac{\lambda_3^2-3\lambda_2\lambda_3}{\sqrt{\lambda_2\lambda_3}} \right)\]

and

\[ G_2(\lambda_1,\lambda_2,\lambda_3)= \frac{(\lambda_1+\lambda_2+\lambda_3)^2}{(\lambda_2-\lambda_3)^2} \left ( \frac{\lambda_2+\lambda_3}{\sqrt{\lambda_2\lambda_3}}- 2\right )\]

References

rtk(*, min_kurtosis=-0.42857142857142855, max_kurtosis=10)[source]#

Compute the rescaled radial tensor kurtosis (RTK).

See [25] for further details about the method.

Parameters:
min_kurtosisfloat, optional

To keep kurtosis values within a plausible biophysical range, radial kurtosis values that are smaller than min_kurtosis are replaced with min_kurtosis.

max_kurtosisfloat, optional

To keep kurtosis values within a plausible biophysical range, radial kurtosis values that are larger than max_kurtosis are replaced with max_kurtosis.

Returns:
rtkarray

Calculated escaled radial tensor kurtosis (RTK).

Notes

Rescaled radial tensor kurtosis (RTK) is defined as [25]:

\[\]

RKT = frac{3}{8}frac{MD^2}{RD^2} (W_{2222}+ W_{3333}+2*W_{2233})

where W is the kurtosis tensor rotated to a coordinate system in which the 3 orthonormal eigenvectors of DT are the base coordinate, MD is the mean diffusivity, and RD is the radial diffusivity.

References

carlson_rf#

dipy.reconst.dki.carlson_rf(x, y, z, *, errtol=0.0003)[source]#

Compute the Carlson’s incomplete elliptic integral of the first kind.

Carlson’s incomplete elliptic integral of the first kind is defined as [26]:

\[R_F = \frac{1}{2} \int_{0}^{\infty} \left [(t+x)(t+y)(t+z) \right ] ^{-\frac{1}{2}}dt\]
Parameters:
xndarray

First independent variable of the integral.

yndarray

Second independent variable of the integral.

zndarray

Third independent variable of the integral.

errtolfloat

Error tolerance. Integral is computed with relative error less in magnitude than the defined value

Returns:
RFndarray

Value of the incomplete first order elliptic integral

Notes

x, y, and z have to be nonnegative and at most one of them is zero.

References

carlson_rd#

dipy.reconst.dki.carlson_rd(x, y, z, *, errtol=0.0001)[source]#

Compute the Carlson’s incomplete elliptic integral of the second kind.

Carlson’s incomplete elliptic integral of the second kind is defined as [26]:

\[R_D = \frac{3}{2} \int_{0}^{\infty} (t+x)^{-\frac{1}{2}} (t+y)^{-\frac{1}{2}}(t+z) ^{-\frac{3}{2}}\]
Parameters:
xndarray

First independent variable of the integral.

yndarray

Second independent variable of the integral.

zndarray

Third independent variable of the integral.

errtolfloat

Error tolerance. Integral is computed with relative error less in magnitude than the defined value

Returns:
RDndarray

Value of the incomplete second order elliptic integral

Notes

x, y, and z have to be nonnegative and at most x or y is zero.

References

directional_diffusion#

dipy.reconst.dki.directional_diffusion(dt, V, *, min_diffusivity=0)[source]#

Compute apparent diffusion coefficient (adc).

Calculate the apparent diffusion coefficient (adc) in each direction of a sphere for a single voxel Neto Henriques et al.[27].

Parameters:
dtarray (6,)

elements of the diffusion tensor of the voxel.

Varray (g, 3)

g directions of a Sphere in Cartesian coordinates

min_diffusivityfloat, optional

Because negative eigenvalues are not physical and small eigenvalues cause quite a lot of noise in diffusion-based metrics, diffusivity values smaller than min_diffusivity are replaced with min_diffusivity. Default = 0

Returns:
adcndarray (g,)

Apparent diffusion coefficient (ADC) in all g directions of a sphere for a single voxel.

References

directional_diffusion_variance#

dipy.reconst.dki.directional_diffusion_variance(kt, V)[source]#

Calculate the apparent diffusion variance (adv) in each direction of a sphere for a single voxel

See [19], [27], and [20] for further details about the method.

Parameters:
ktarray (15,)

elements of the kurtosis tensor of the voxel.

Varray (g, 3)

g directions of a Sphere in Cartesian coordinates.

Returns:
advndarray (g,)

Apparent diffusion variance (adv) in all g directions of a sphere for a single voxel.

References

directional_kurtosis#

dipy.reconst.dki.directional_kurtosis(dt, md, kt, V, *, min_diffusivity=0, min_kurtosis=-0.42857142857142855, adc=None, adv=None)[source]#

Calculate the apparent kurtosis coefficient (akc) in each direction of a sphere for a single voxel.

See [27] and [20] for further details about the method.

Parameters:
dtarray (6,)

elements of the diffusion tensor of the voxel.

mdfloat

mean diffusivity of the voxel

ktarray (15,)

elements of the kurtosis tensor of the voxel.

Varray (g, 3)

g directions of a Sphere in Cartesian coordinates

min_diffusivityfloat, optional

Because negative eigenvalues are not physical and small eigenvalues cause quite a lot of noise in diffusion-based metrics, diffusivity values smaller than min_diffusivity are replaced with min_diffusivity. Default = 0

min_kurtosisfloat, optional

Because high-amplitude negative values of kurtosis are not physically and biologicaly pluasible, and these cause artefacts in kurtosis-based measures, directional kurtosis values smaller than min_kurtosis are replaced with min_kurtosis. (theoretical kurtosis limit for regions that consist of water confined to spherical pores [19]).

adcndarray(g,), optional

Apparent diffusion coefficient (ADC) in all g directions of a sphere for a single voxel.

advndarray(g,), optional

Apparent diffusion variance (advc) in all g directions of a sphere for a single voxel.

Returns:
akcndarray (g,)

Apparent kurtosis coefficient (AKC) in all g directions of a sphere for a single voxel.

References

apparent_kurtosis_coef#

dipy.reconst.dki.apparent_kurtosis_coef(dki_params, sphere, *, min_diffusivity=0, min_kurtosis=-0.42857142857142855)[source]#

Calculate the apparent kurtosis coefficient (AKC) in each direction of a sphere.

See [27] and [20] for further details about the method.

Parameters:
dki_paramsndarray (x, y, z, 27) or (n, 27)

All parameters estimated from the diffusion kurtosis model. Parameters are ordered as follows:

  1. Three diffusion tensor’s eigenvalues

  2. Three lines of the eigenvector matrix each containing the first, second and third coordinates of the eigenvectors respectively

  3. Fifteen elements of the kurtosis tensor

spherea Sphere class instance

The AKC will be calculated for each of the vertices in the sphere

min_diffusivityfloat, optional

Because negative eigenvalues are not physical and small eigenvalues cause quite a lot of noise in diffusion-based metrics, diffusivity values smaller than min_diffusivity are replaced with min_diffusivity.

min_kurtosisfloat, optional

Because high-amplitude negative values of kurtosis are not physically and biologicaly pluasible, and these cause artefacts in kurtosis-based measures, directional kurtosis values smaller than min_kurtosis are replaced with min_kurtosis. Default = -3./7 (theoretical kurtosis limit for regions that consist of water confined to spherical pores [19]).

Returns:
akcndarray (x, y, z, g) or (n, g)

Apparent kurtosis coefficient (AKC) for all g directions of a sphere.

Notes

For each sphere direction with coordinates \((n_{1}, n_{2}, n_{3})\), the calculation of AKC is done using formula [27]:

\[AKC(n)=\frac{MD^{2}}{ADC(n)^{2}}\sum_{i=1}^{3}\sum_{j=1}^{3} \sum_{k=1}^{3}\sum_{l=1}^{3}n_{i}n_{j}n_{k}n_{l}W_{ijkl}\]

where \(W_{ijkl}\) are the elements of the kurtosis tensor, MD the mean diffusivity and ADC the apparent diffusion coefficient computed as:

\[ADC(n)=\sum_{i=1}^{3}\sum_{j=1}^{3}n_{i}n_{j}D_{ij}\]

where \(D_{ij}\) are the elements of the diffusion tensor.

References

mean_kurtosis#

dipy.reconst.dki.mean_kurtosis(dki_params, *, min_kurtosis=-0.42857142857142855, max_kurtosis=3, analytical=True)[source]#

Compute mean kurtosis (MK) from the kurtosis tensor.

See [21] and [20] for further details about the method.

Parameters:
dki_paramsndarray (x, y, z, 27) or (n, 27)

All parameters estimated from the diffusion kurtosis model. Parameters are ordered as follows:

  1. Three diffusion tensor’s eigenvalues

  2. Three lines of the eigenvector matrix each containing the first, second and third coordinates of the eigenvector

  3. Fifteen elements of the kurtosis tensor

min_kurtosisfloat, optional

To keep kurtosis values within a plausible biophysical range, mean kurtosis values that are smaller than min_kurtosis are replaced with min_kurtosis. Default = -3./7 (theoretical kurtosis limit for regions that consist of water confined to spherical pores [19]).

max_kurtosisfloat, optional

To keep kurtosis values within a plausible biophysical range, mean kurtosis values that are larger than max_kurtosis are replaced with max_kurtosis.

analyticalbool, optional

If True, MK is calculated using its analytical solution, otherwise an exact numerical estimator is used (see Notes).

Returns:
mkarray

Calculated MK.

Notes

The MK is defined as the average of directional kurtosis coefficients across all spatial directions, which can be formulated by the following surface integral [21], [20]:

\[MK \equiv \frac{1}{4\pi} \int d\Omega_\mathbf{n} K(\mathbf{n})\]

This integral can be numerically solved by averaging directional kurtosis values sampled for directions of a spherical t-design [23].

Alternatively, MK can be solved from the analytical solution derived by [21], [20]. This solution is given by:

\[\begin{split}MK=F_1(\lambda_1,\lambda_2,\lambda_3)\hat{W}_{1111}+ F_1(\lambda_2,\lambda_1,\lambda_3)\hat{W}_{2222}+ F_1(\lambda_3,\lambda_2,\lambda_1)\hat{W}_{3333}+ \\ F_2(\lambda_1,\lambda_2,\lambda_3)\hat{W}_{2233}+ F_2(\lambda_2,\lambda_1,\lambda_3)\hat{W}_{1133}+ F_2(\lambda_3,\lambda_2,\lambda_1)\hat{W}_{1122}\end{split}\]

where \(\hat{W}_{ijkl}\) are the components of the \(W\) tensor in the coordinates system defined by the eigenvectors of the diffusion tensor \(\mathbf{D}\) and

\[ \begin{align}\begin{aligned}\begin{split}F_1(\lambda_1,\lambda_2,\lambda_3)= \frac{(\lambda_1+\lambda_2+\lambda_3)^2} {18(\lambda_1-\lambda_2)(\lambda_1-\lambda_3)} [\frac{\sqrt{\lambda_2\lambda_3}}{\lambda_1} R_F(\frac{\lambda_1}{\lambda_2},\frac{\lambda_1}{\lambda_3},1)+\\ \frac{3\lambda_1^2-\lambda_1\lambda_2-\lambda_2\lambda_3- \lambda_1\lambda_3} {3\lambda_1 \sqrt{\lambda_2 \lambda_3}} R_D(\frac{\lambda_1}{\lambda_2},\frac{\lambda_1}{\lambda_3},1)-1 ]\end{split}\\\begin{split}F_2(\lambda_1,\lambda_2,\lambda_3)= \frac{(\lambda_1+\lambda_2+\lambda_3)^2} {3(\lambda_2-\lambda_3)^2} [\frac{\lambda_2+\lambda_3}{\sqrt{\lambda_2\lambda_3}} R_F(\frac{\lambda_1}{\lambda_2},\frac{\lambda_1}{\lambda_3},1)+\\ \frac{2\lambda_1-\lambda_2-\lambda_3}{3\sqrt{\lambda_2 \lambda_3}} R_D(\frac{\lambda_1}{\lambda_2},\frac{\lambda_1}{\lambda_3},1)-2]\end{split}\end{aligned}\end{align} \]

where \(R_f\) and \(R_d\) are the Carlson’s elliptic integrals.

References

radial_kurtosis#

dipy.reconst.dki.radial_kurtosis(dki_params, *, min_kurtosis=-0.42857142857142855, max_kurtosis=10, analytical=True)[source]#

Compute radial kurtosis (RK) of a diffusion kurtosis tensor.

See [21] and [20] for further details about the method.

Parameters:
dki_paramsndarray (x, y, z, 27) or (n, 27)

All parameters estimated from the diffusion kurtosis model. Parameters are ordered as follows:

  1. Three diffusion tensor’s eigenvalues

  2. Three lines of the eigenvector matrix each containing the first, second and third coordinates of the eigenvector

  3. Fifteen elements of the kurtosis tensor

min_kurtosisfloat, optional

To keep kurtosis values within a plausible biophysical range, radial kurtosis values that are smaller than min_kurtosis are replaced with min_kurtosis. Default = -3./7 (theoretical kurtosis limit for regions that consist of water confined to spherical pores [19]).

max_kurtosisfloat, optional

To keep kurtosis values within a plausible biophysical range, radial kurtosis values that are larger than max_kurtosis are replaced with max_kurtosis.

analyticalbool, optional

If True, RK is calculated using its analytical solution, otherwise an exact numerical estimator is used (see Notes). Default is set to True.

Returns:
rkarray

Calculated RK.

Notes

RK is defined as the average of the directional kurtosis perpendicular to the fiber’s main direction e1 [21], [20]:

\[RK \equiv \frac{1}{2\pi} \int d\Omega _\mathbf{\theta} K(\mathbf{\theta}) \delta (\mathbf{\theta}\cdot \mathbf{e}_1)\]

This equation can be numerically computed by averaging apparent directional kurtosis samples for directions perpendicular to e1 [20].

Otherwise, RK can be calculated from its analytical solution [21]:

\[K_{\bot} = G_1(\lambda_1,\lambda_2,\lambda_3)\hat{W}_{2222} + G_1(\lambda_1,\lambda_3,\lambda_2)\hat{W}_{3333} + G_2(\lambda_1,\lambda_2,\lambda_3)\hat{W}_{2233}\]

where:

\[G_1(\lambda_1,\lambda_2,\lambda_3)= \frac{(\lambda_1+\lambda_2+\lambda_3)^2}{18\lambda_2(\lambda_2- \lambda_3)} \left (2\lambda_2 + \frac{\lambda_3^2-3\lambda_2\lambda_3}{\sqrt{\lambda_2\lambda_3}} \right)\]

and

\[G_2(\lambda_1,\lambda_2,\lambda_3)= \frac{(\lambda_1+\lambda_2+\lambda_3)^2}{(\lambda_2-\lambda_3)^2} \left ( \frac{\lambda_2+\lambda_3}{\sqrt{\lambda_2\lambda_3}}-2\right )\]

References

axial_kurtosis#

dipy.reconst.dki.axial_kurtosis(dki_params, *, min_kurtosis=-0.42857142857142855, max_kurtosis=10, analytical=True)[source]#

Compute axial kurtosis (AK) from the kurtosis tensor.

See [21] and [20] for further details about the method.

Parameters:
dki_paramsndarray (x, y, z, 27) or (n, 27)

All parameters estimated from the diffusion kurtosis model. Parameters are ordered as follows:

  1. Three diffusion tensor’s eigenvalues

  2. Three lines of the eigenvector matrix each containing the first, second and third coordinates of the eigenvector

  3. Fifteen elements of the kurtosis tensor

min_kurtosisfloat, optional

To keep kurtosis values within a plausible biophysical range, axial kurtosis values that are smaller than min_kurtosis are replaced with min_kurtosis. Default = -3./7 (theoretical kurtosis limit for regions that consist of water confined to spherical pores [19]).

max_kurtosisfloat, optional

To keep kurtosis values within a plausible biophysical range, axial kurtosis values that are larger than max_kurtosis are replaced with max_kurtosis.

analyticalbool, optional

If True, AK is calculated from rotated diffusion kurtosis tensor, otherwise it will be computed from the apparent diffusion kurtosis values along the principal axis of the diffusion tensor (see notes).

Returns:
akarray

Calculated AK.

Notes

AK is defined as the directional kurtosis parallel to the fiber’s main direction e1 [21], [20]. You can compute AK using to approaches:

  1. AK is calculated from rotated diffusion kurtosis tensor [21], i.e.:

\[AK = \hat{W}_{1111} \frac{(\lambda_{1}+\lambda_{2}+\lambda_{3})^2}{(9 \lambda_{1}^2)}\]
  1. AK can be sampled from the principal axis of the diffusion tensor [20]:

\[AK = K(\mathbf{e}_1)\]

Although both approaches leads to an exact calculation of AK, the first approach will be referred to as the analytical method while the second approach will be referred to as the numerical method based on their analogy to the estimation strategies for MK and RK.

References

kurtosis_maximum#

dipy.reconst.dki.kurtosis_maximum(dki_params, *, sphere='repulsion100', gtol=0.01, mask=None)[source]#

Compute kurtosis maximum value.

See [20] for further details about the method.

Parameters:
dki_paramsndarray (x, y, z, 27) or (n, 27)

All parameters estimated from the diffusion kurtosis model. Parameters are ordered as follows:

  1. Three diffusion tensor’s eingenvalues

  2. Three lines of the eigenvector matrix each containing the first, second and third coordinates of the eigenvector

  3. Fifteen elements of the kurtosis tensor

sphereSphere class instance, optional

The sphere providing sample directions for the initial search of the maximal value of kurtosis.

gtolfloat, optional

This input is to refine kurtosis maximum under the precision of the directions sampled on the sphere class instance. The gradient of the convergence procedure must be less than gtol before successful termination. If gtol is None, fiber direction is directly taken from the initial sampled directions of the given sphere object

maskndarray

A boolean array used to mark the coordinates in the data that should be analyzed that has the shape dki_params.shape[:-1]

Returns:
max_valuefloat

kurtosis tensor maximum value

max_dirarray (3,)

Cartesian coordinates of the direction of the maximal kurtosis value

References

mean_kurtosis_tensor#

dipy.reconst.dki.mean_kurtosis_tensor(dki_params, *, min_kurtosis=-0.42857142857142855, max_kurtosis=10)[source]#

Compute mean of the kurtosis tensor (MKT).

See [24] for further details about the method.

Parameters:
dki_paramsndarray (x, y, z, 27) or (n, 27)

All parameters estimated from the diffusion kurtosis model. Parameters are ordered as follows:

  1. Three diffusion tensor’s eigenvalues

  2. Three lines of the eigenvector matrix each containing the first, second and third coordinates of the eigenvector

  3. Fifteen elements of the kurtosis tensor

min_kurtosisfloat, optional

To keep kurtosis values within a plausible biophysical range, mean kurtosis values that are smaller than min_kurtosis are replaced with min_kurtosis. Default = -3./7 (theoretical kurtosis limit for regions that consist of water confined to spherical pores [19]).

max_kurtosisfloat, optional

To keep kurtosis values within a plausible biophysical range, mean kurtosis values that are larger than max_kurtosis are replaced with max_kurtosis.

Returns:
mktarray

Calculated mean kurtosis tensor.

Notes

The MKT is defined as [24]:

\[MKT \equiv \frac{1}{4\pi} \int d \Omega_{\mathnbf{n}} n_i n_j n_k n_l W_{ijkl}\]

which can be directly computed from the trace of the kurtosis tensor:

\[\]

MKT = frac{1}{5} Tr(mathbf{W}) = frac{1}{5} (W_{1111} + W_{2222} + W_{3333} + 2W_{1122} + 2W_{1133} + 2W_{2233})

References

radial_tensor_kurtosis#

dipy.reconst.dki.radial_tensor_kurtosis(dki_params, *, min_kurtosis=-0.42857142857142855, max_kurtosis=10)[source]#

Compute the rescaled radial tensor kurtosis (RTK).

See [24] for further details about the method.

Parameters:
dki_paramsndarray (x, y, z, 27) or (n, 27)

All parameters estimated from the diffusion kurtosis model. Parameters are ordered as follows:

  1. Three diffusion tensor’s eigenvalues

  2. Three lines of the eigenvector matrix each containing the first, second and third coordinates of the eigenvector

  3. Fifteen elements of the kurtosis tensor

min_kurtosisfloat, optional

To keep kurtosis values within a plausible biophysical range, radial kurtosis values that are smaller than min_kurtosis are replaced with min_kurtosis.

max_kurtosisfloat, optional

To keep kurtosis values within a plausible biophysical range, radial kurtosis values that are larger than max_kurtosis are replaced with max_kurtosis.

Returns:
rtkarray

Calculated rescaled radial tensor kurtosis (RTK).

Notes

Rescaled radial tensor kurtosis (RTK) is defined as [24]:

\[\]

RKT = frac{3}{8} frac{MD^2}{RD^2} (W_{2222} + W_{3333} + 2*W_{2233})

where W is the kurtosis tensor rotated to a coordinate system in which the 3 orthonormal eigenvectors of DT are the base coordinate, MD is the mean diffusivity, and RD is the radial diffusivity.

References

kurtosis_fractional_anisotropy#

dipy.reconst.dki.kurtosis_fractional_anisotropy(dki_params)[source]#

Compute the anisotropy of the kurtosis tensor (KFA).

See [22] and [20] for further details about the method.

Parameters:
dki_paramsndarray (x, y, z, 27) or (n, 27)

All parameters estimated from the diffusion kurtosis model. Parameters are ordered as follows:

  1. Three diffusion tensor’s eigenvalues

  2. Three lines of the eigenvector matrix each containing the first, second and third coordinates of the eigenvector

  3. Fifteen elements of the kurtosis tensor

Returns:
kfaarray

Calculated mean kurtosis tensor.

Notes

The KFA is defined as [22]:

\[KFA \equiv \frac{||\mathbf{W} - MKT \mathbf{I}^{(4)}||_F}{||\mathbf{W}||_F}\]

where \(W\) is the kurtosis tensor, MKT the kurtosis tensor mean, \(I^{(4)}\) is the fully symmetric rank 2 isotropic tensor and \(||...||_F\) is the tensor’s Frobenius norm [22].

References

dki_prediction#

dipy.reconst.dki.dki_prediction(dki_params, gtab, *, S0=1.0)[source]#

Predict a signal given diffusion kurtosis imaging parameters

The predicted signal is given by:

\[S=S_{0}e^{-bD+\frac{1}{6}b^{2}D^{2}K}\]

See [19] and [20] for further details about the method.

Parameters:
dki_paramsndarray (x, y, z, 27) or (n, 27)

All parameters estimated from the diffusion kurtosis model. Parameters are ordered as follows:

  1. Three diffusion tensor’s eigenvalues

  2. Three lines of the eigenvector matrix each containing the first, second and third coordinates of the eigenvector

  3. Fifteen elements of the kurtosis tensor

gtaba GradientTable class instance

The gradient table for this prediction

S0float or ndarray, optional

The non diffusion-weighted signal in every voxel, or across all voxels. Default: 1

Returns:
pred_sig(…, N) ndarray

Simulated signal based on the DKI model.

References

params_to_dki_params#

dipy.reconst.dki.params_to_dki_params(result, *, min_diffusivity=0)[source]#

Convert the 21 unique elements of the diffusion and kurtosis tensors to the parameter format adopted in DIPY

Parameters:
resultsarray (21)

Unique elements of the diffusion and kurtosis tensors in the following order: 1) six unique lower triangular DT elements; and 2) Fifteen unique elements of the kurtosis tensor.

min_diffusivityfloat, optional

Because negative eigenvalues are not physical and small eigenvalues, much smaller than the diffusion weighting, cause quite a lot of noise in metrics such as fa, diffusivity values smaller than min_diffusivity are replaced with min_diffusivity.

Returns:
dki_paramsarray (27)

All parameters estimated from the diffusion kurtosis model for all N voxels. Parameters are ordered as follows:

  1. Three diffusion tensor eigenvalues.

  2. Three blocks of three elements, containing the first second and third coordinates of the diffusion tensor eigenvectors.

  3. Fifteen elements of the kurtosis tensor.

ls_fit_dki#

dipy.reconst.dki.ls_fit_dki(design_matrix, data, inverse_design_matrix, *, return_S0_hat=False, weights=True, min_diffusivity=0, return_lower_triangular=False, return_leverages=False)[source]#

Compute the diffusion and kurtosis tensors using an ordinary or weighted linear least squares approach.

See [28] for further details about the method.

Parameters:
design_matrixarray (g, 22)

Design matrix holding the covariants used to solve for the regression coefficients.

dataarray (g)

Data or response variables holding the data.

inverse_design_matrixarray (22, g)

Inverse of the design matrix.

return_S0_hatbool, optional

Boolean to return (True) or not (False) the S0 values for the fit.

weightsarray ([X, Y, Z, …], g), optional

Weights to apply for fitting. These weights must correspond to the squared residuals such that \(S = \sum_i w_i r_i^2\). If not provided, weights are estimated as the squared predicted signal from an initial OLS fit.

min_diffusivityfloat, optional

Because negative eigenvalues are not physical and small eigenvalues, much smaller than the diffusion weighting, cause quite a lot of noise in metrics such as fa, diffusivity values smaller than min_diffusivity are replaced with min_diffusivity.

return_lower_triangularbool, optional

Boolean to return (True) or not (False) the coefficients of the fit.

return_leveragesbool, optional

Boolean to return (True) or not (False) the fitting leverages.

Returns:
dki_paramsarray (27)

All parameters estimated from the diffusion kurtosis model for all N voxels. Parameters are ordered as follows:

  1. Three diffusion tensor eigenvalues.

  2. Three blocks of three elements, containing the first second and third coordinates of the diffusion tensor eigenvectors.

  3. Fifteen elements of the kurtosis tensor.

leveragesarray (g)

Leverages of the fitting problem (if return_leverages is True)

References

cls_fit_dki#

dipy.reconst.dki.cls_fit_dki(design_matrix, data, inverse_design_matrix, sdp, *, return_S0_hat=False, weights=True, min_diffusivity=0, return_lower_triangular=False, return_leverages=False, cvxpy_solver=None)[source]#

Compute the diffusion and kurtosis tensors using a constrained ordinary or weighted linear least squares approach.

See [29] for further details about the method.

Parameters:
design_matrixarray (g, 22)

Design matrix holding the covariants used to solve for the regression coefficients.

dataarray (g)

Data or response variables holding the data.

inverse_design_matrixarray (22, g)

Inverse of the design matrix.

sdpPositiveDefiniteLeastSquares instance

A CVXPY representation of a regularized least squares optimization problem.

return_S0_hatbool, optional

Boolean to return (True) or not (False) the S0 values for the fit.

weightsarray ([X, Y, Z, …], g), optional

Weights to apply for fitting. These weights must correspond to the squared residuals such that \(S = \sum_i w_i r_i^2\). If not provided, weights are estimated as the squared predicted signal from an initial OLS fit.

weightsbool, optional

Parameter indicating whether weights are used.

min_diffusivityfloat, optional

Because negative eigenvalues are not physical and small eigenvalues, much smaller than the diffusion weighting, cause quite a lot of noise in metrics such as fa, diffusivity values smaller than min_diffusivity are replaced with min_diffusivity.

return_lower_triangularbool, optional

Boolean to return (True) or not (False) the coefficients of the fit.

return_leveragesbool, optional

Boolean to return (True) or not (False) the fitting leverages.

cvxpy_solverstr, optional

cvxpy solver name. Optionally optimize the positivity constraint with a particular cvxpy solver. See https://www.cvxpy.org/ for details. Default: None (cvxpy chooses its own solver).

Returns:
dki_paramsarray (27)

All parameters estimated from the diffusion kurtosis model for all N voxels. Parameters are ordered as follows:

  1. Three diffusion tensor eigenvalues.

  2. Three blocks of three elements, containing the first second and third coordinates of the diffusion tensor eigenvectors.

  3. Fifteen elements of the kurtosis tensor.

leveragesarray (g)

Leverages of the fitting problem (if return_leverages is True)

References

Wrotate#

dipy.reconst.dki.Wrotate(kt, Basis)[source]#

Rotate a kurtosis tensor from the standard Cartesian coordinate system to another coordinate system basis

See [30] for further details about the method.

Parameters:
kt(15,)

Vector with the 15 independent elements of the kurtosis tensor

Basisarray (3, 3)

Vectors of the basis column-wise oriented

indsarray(m, 4), optional

Array of vectors containing the four indexes of m specific elements of the rotated kurtosis tensor. If not specified all 15 elements of the rotated kurtosis tensor are computed.

Returns:
Wrotarray (m,) or (15,)

Vector with the m independent elements of the rotated kurtosis tensor. If ‘indices’ is not specified all 15 elements of the rotated kurtosis tensor are computed.

Notes

The kurtosis tensor elements are assumed to be ordered as follows:

\[\begin{split}KT = \begin{pmatrix} W_{xxxx} & W_{yyyy} & W_{zzzz} & W_{xxxy} & W_{xxxz} \\ W_{xyyy} & W_{yyyz} & W_{xzzz} & W_{yzzz} & W_{xxyy} \\ W_{xxzz} & W_{yyzz} & W_{xxyz} & W_{xyyz} & W_{xyzz} \end{pmatrix}\end{split}\]

References

Wrotate_element#

dipy.reconst.dki.Wrotate_element(kt, indi, indj, indk, indl, B)[source]#

Compute the specified index element of a kurtosis tensor rotated to the coordinate system basis B

See [30] for further details about the method.

Parameters:
ktndarray (x, y, z, 15) or (n, 15)

Array containing the 15 independent elements of the kurtosis tensor

indiint

Rotated kurtosis tensor element index i (0 for x, 1 for y, 2 for z)

indjint

Rotated kurtosis tensor element index j (0 for x, 1 for y, 2 for z)

indkint

Rotated kurtosis tensor element index k (0 for x, 1 for y, 2 for z)

indl: int

Rotated kurtosis tensor element index l (0 for x, 1 for y, 2 for z)

B: array (x, y, z, 3, 3) or (n, 15)

Vectors of the basis column-wise oriented

Returns:
Wrefloat

rotated kurtosis tensor element of index ind_i, ind_j, ind_k, ind_l

Notes

It is assumed that initial kurtosis tensor elements are defined on the Cartesian coordinate system.

References

Wcons#

dipy.reconst.dki.Wcons(k_elements)[source]#

Construct the full 4D kurtosis tensors from its 15 independent elements

Parameters:
k_elements(15,)

elements of the kurtosis tensor in the following order:

.. math::
KT =
begin{pmatrix}

W_{xxxx} & W_{yyyy} & W_{zzzz} & W_{xxxy} & W_{xxxz} \ W_{xyyy} & W_{yyyz} & W_{xzzz} & W_{yzzz} & W_{xxyy} \ W_{xxzz} & W_{yyzz} & W_{xxyz} & W_{xyyz} & W_{xyzz}

end{pmatrix}
Returns:
Warray(3, 3, 3, 3)

Full 4D kurtosis tensor

split_dki_param#

dipy.reconst.dki.split_dki_param(dki_params)[source]#

Extract the diffusion tensor eigenvalues, the diffusion tensor eigenvector matrix, and the 15 independent elements of the kurtosis tensor from the model parameters estimated from the DKI model

Parameters:
dki_paramsndarray (x, y, z, 27) or (n, 27)

All parameters estimated from the diffusion kurtosis model. Parameters are ordered as follows:

  1. Three diffusion tensor’s eigenvalues

  2. Three lines of the eigenvector matrix each containing the first, second and third coordinates of the eigenvector

  3. Fifteen elements of the kurtosis tensor

Returns:
eigvalsarray (x, y, z, 3) or (n, 3)

Eigenvalues from eigen decomposition of the tensor.

eigvecsarray (x, y, z, 3, 3) or (n, 3, 3)

Associated eigenvectors from eigen decomposition of the tensor. Eigenvectors are columnar (e.g. eigvecs[:,j] is associated with eigvals[j])

ktarray (x, y, z, 15) or (n, 15)

Fifteen elements of the kurtosis tensor

KurtosisMicrostructureModel#

class dipy.reconst.dki_micro.KurtosisMicrostructureModel(gtab, *args, fit_method='WLS', **kwargs)[source]#

Bases: DiffusionKurtosisModel

Class for the Diffusion Kurtosis Microstructural Model

Methods

fit(data, *[, mask, sphere, gtol, awf_only])

Fit method of the Diffusion Kurtosis Microstructural Model

iterative_fit(data_thres, *[, mask, ...])

Iteratively Reweighted fitting for the DKI model.

multi_fit(data, *[, mask])

Fit method for every voxel in data

predict(params, *[, S0])

Predict a signal for the DKI microstructural model class instance given parameters.

fit(data, *, mask=None, sphere='repulsion100', gtol=0.01, awf_only=False)[source]#

Fit method of the Diffusion Kurtosis Microstructural Model

Parameters:
dataarray

An 4D matrix containing the diffusion-weighted data.

maskarray

A boolean array used to mark the coordinates in the data that should be analyzed that has the shape data.shape[-1]

sphereSphere class instance, optional

The sphere providing sample directions for the initial search of the maximal value of kurtosis.

gtolfloat, optional

This input is to refine kurtosis maxima under the precision of the directions sampled on the sphere class instance. The gradient of the convergence procedure must be less than gtol before successful termination. If gtol is None, fiber direction is directly taken from the initial sampled directions of the given sphere object

awf_onlybool, optiomal

If set to true only the axonal volume fraction is computed from the kurtosis tensor. Default = False

predict(params, *, S0=1.0)[source]#

Predict a signal for the DKI microstructural model class instance given parameters.

Parameters:
paramsndarray (x, y, z, 40) or (n, 40)

All parameters estimated from the diffusion kurtosis microstructural model. Parameters are ordered as follows:

  1. Three diffusion tensor’s eigenvalues

  2. Three lines of the eigenvector matrix each containing the first, second and third coordinates of the eigenvector

  3. Fifteen elements of the kurtosis tensor

  4. Six elements of the hindered diffusion tensor

  5. Six elements of the restricted diffusion tensor

  6. Axonal water fraction

S0float or ndarray, optional

The non diffusion-weighted signal in every voxel, or across all voxels.

Notes

In the original article of DKI microstructural model [31], the hindered and restricted tensors were defined as the intra-cellular and extra-cellular diffusion compartments respectively.

References

KurtosisMicrostructuralFit#

class dipy.reconst.dki_micro.KurtosisMicrostructuralFit(model, model_params)[source]#

Bases: DiffusionKurtosisFit

Class for fitting the Diffusion Kurtosis Microstructural Model

Attributes:
S0_hat
awf

Returns the volume fraction of the restricted diffusion compartment also known as axonal water fraction.

axonal_diffusivity

Returns the axonal diffusivity defined as the restricted diffusion tensor trace.

directions

For tracking - return the primary direction in each voxel

evals

Returns the eigenvalues of the tensor as an array

evecs

Returns the eigenvectors of the tensor as an array, columnwise

hindered_ad

Returns the axial diffusivity of the hindered compartment.

hindered_evals

Returns the eigenvalues of the hindered diffusion compartment.

hindered_rd

Returns the radial diffusivity of the hindered compartment.

kfa

Return the kurtosis tensor (KFA).

kt

Return the 15 independent elements of the kurtosis tensor as an array

quadratic_form

Calculates the 3x3 diffusion tensor for each voxel

restricted_evals

Returns the eigenvalues of the restricted diffusion compartment.

shape
tortuosity

Returns the tortuosity of the hindered diffusion which is defined by ADe / RDe, where ADe and RDe are the axial and radial diffusivities of the hindered compartment.

Methods

ad()

Axial diffusivity (AD) calculated from cached eigenvalues.

adc(sphere)

Calculate the apparent diffusion coefficient (ADC) in each direction on the sphere for each voxel in the data

ak(*[, min_kurtosis, max_kurtosis, analytical])

Compute axial kurtosis (AK) of a diffusion kurtosis tensor.

akc(sphere)

Calculate the apparent kurtosis coefficient (AKC) in each direction on the sphere for each voxel in the data

color_fa()

Color fractional anisotropy of diffusion tensor

fa()

Fractional anisotropy (FA) calculated from cached eigenvalues.

ga()

Geodesic anisotropy (GA) calculated from cached eigenvalues.

kmax(*[, sphere, gtol, mask])

Compute the maximum value of a single voxel kurtosis tensor

linearity()

md()

Mean diffusivity (MD) calculated from cached eigenvalues.

mk(*[, min_kurtosis, max_kurtosis, analytical])

Compute mean kurtosis (MK) from the kurtosis tensor.

mkt(*[, min_kurtosis, max_kurtosis])

Compute mean of the kurtosis tensor (MKT).

mode()

Tensor mode calculated from cached eigenvalues.

odf(sphere)

The diffusion orientation distribution function (dODF).

planarity()

predict(gtab, *[, S0])

Given a DKI microstructural model fit, predict the signal on the vertices of a gradient table

rd()

Radial diffusivity (RD) calculated from cached eigenvalues.

rk(*[, min_kurtosis, max_kurtosis, analytical])

Compute radial kurtosis (RK) of a diffusion kurtosis tensor.

rtk(*[, min_kurtosis, max_kurtosis])

Compute the rescaled radial tensor kurtosis (RTK).

sphericity()

trace()

Trace of the tensor calculated from cached eigenvalues.

lower_triangular

property awf#

Returns the volume fraction of the restricted diffusion compartment also known as axonal water fraction.

Notes

The volume fraction of the restricted diffusion compartment can be seen as the volume fraction of the intra-cellular compartment [31].

References

property axonal_diffusivity#

Returns the axonal diffusivity defined as the restricted diffusion tensor trace.

See [31] for further details about the method.

References

property hindered_ad#

Returns the axial diffusivity of the hindered compartment.

Notes

The hindered diffusion tensor can be seen as the tissue’s extra-cellular diffusion compartment [31].

References

property hindered_evals#

Returns the eigenvalues of the hindered diffusion compartment.

Notes

The hindered diffusion tensor can be seen as the tissue’s extra-cellular diffusion compartment [31].

References

property hindered_rd#

Returns the radial diffusivity of the hindered compartment.

Notes

The hindered diffusion tensor can be seen as the tissue’s extra-cellular diffusion compartment [31].

References

predict(gtab, *, S0=1.0)[source]#

Given a DKI microstructural model fit, predict the signal on the vertices of a gradient table

gtaba GradientTable class instance

The gradient table for this prediction

S0float or ndarray, optional

The non diffusion-weighted signal in every voxel, or across all voxels.

Notes

The predicted signal is given by:

\[S(\theta, b) = S_0 * [f * e^{-b ADC_{r}} + (1-f) * e^{-b ADC_{h}]\]

where \(ADC_{r}\) and \(ADC_{h}\) are the apparent diffusion coefficients of the diffusion hindered and restricted compartment for a given direction \(\theta\), \(b\) is the b value provided in the GradientTable input for that direction, \(f\) is the volume fraction of the restricted diffusion compartment (also known as the axonal water fraction).

property restricted_evals#

Returns the eigenvalues of the restricted diffusion compartment.

Notes

The restricted diffusion tensor can be seen as the tissue’s intra-cellular diffusion compartment [31].

References

property tortuosity#

Returns the tortuosity of the hindered diffusion which is defined by ADe / RDe, where ADe and RDe are the axial and radial diffusivities of the hindered compartment.

See [31] for further details about the method.

Notes

The hindered diffusion tensor can be seen as the tissue’s extra-cellular diffusion compartment [31].

References

axonal_water_fraction#

dipy.reconst.dki_micro.axonal_water_fraction(dki_params, *, sphere='repulsion100', gtol=0.01, mask=None)[source]#

Computes the axonal water fraction from DKI.

See [31] for further details about the method.

Parameters:
dki_paramsndarray (x, y, z, 27) or (n, 27)

All parameters estimated from the diffusion kurtosis model. Parameters are ordered as follows:

  1. Three diffusion tensor’s eigenvalues

  2. Three lines of the eigenvector matrix each containing the first, second and third coordinates of the eigenvector

  3. Fifteen elements of the kurtosis tensor

sphereSphere class instance, optional

The sphere providing sample directions for the initial search of the maximal value of kurtosis.

gtolfloat, optional

This input is to refine kurtosis maxima under the precision of the directions sampled on the sphere class instance. The gradient of the convergence procedure must be less than gtol before successful termination. If gtol is None, fiber direction is directly taken from the initial sampled directions of the given sphere object

maskndarray

A boolean array used to mark the coordinates in the data that should be analyzed that has the shape dki_params.shape[:-1]

Returns:
awfndarray (x, y, z) or (n)

Axonal Water Fraction

References

diffusion_components#

dipy.reconst.dki_micro.diffusion_components(dki_params, *, sphere='repulsion100', awf=None, mask=None)[source]#

Extracts the restricted and hindered diffusion tensors of well aligned fibers from diffusion kurtosis imaging parameters.

See [31] for further details about the method.

Parameters:
dki_paramsndarray (x, y, z, 27) or (n, 27)

All parameters estimated from the diffusion kurtosis model. Parameters are ordered as follows:

  1. Three diffusion tensor’s eigenvalues

  2. Three lines of the eigenvector matrix each containing the first, second and third coordinates of the eigenvector

  3. Fifteen elements of the kurtosis tensor

sphereSphere class instance, optional

The sphere providing sample directions to sample the restricted and hindered cellular diffusion tensors. For more details see [31].

awfndarray, optional

Array containing values of the axonal water fraction that has the shape dki_params.shape[:-1]. If not given this will be automatically computed using axonal_water_fraction() with function’s default precision.

maskndarray, optional

A boolean array used to mark the coordinates in the data that should be analyzed that has the shape dki_params.shape[:-1]

Returns:
edtndarray (x, y, z, 6) or (n, 6)

Parameters of the hindered diffusion tensor.

idtndarray (x, y, z, 6) or (n, 6)

Parameters of the restricted diffusion tensor.

Notes

In the original article of DKI microstructural model [31], the hindered and restricted tensors were defined as the intra-cellular and extra-cellular diffusion compartments respectively.

References

dkimicro_prediction#

dipy.reconst.dki_micro.dkimicro_prediction(params, gtab, *, S0=1)[source]#

Signal prediction given the DKI microstructure model parameters.

Parameters:
paramsndarray (x, y, z, 40) or (n, 40)

All parameters estimated from the diffusion kurtosis microstructure model. Parameters are ordered as follows:

  1. Three diffusion tensor’s eigenvalues

  2. Three lines of the eigenvector matrix each containing the first, second and third coordinates of the eigenvector

  3. Fifteen elements of the kurtosis tensor

  4. Six elements of the hindered diffusion tensor

  5. Six elements of the restricted diffusion tensor

  6. Axonal water fraction

gtaba GradientTable class instance

The gradient table for this prediction

S0float or ndarray, optional

The non diffusion-weighted signal in every voxel, or across all voxels

Returns:
S(…, N) ndarray

Simulated signal based on the DKI microstructure model

Notes

  1. The predicted signal is given by: .. math:

    S(\theta, b) = S_0 * [f * e^{-b ADC_{r}} + (1-f) * e^{-b ADC_{h}]
    

    where \(ADC_{r}\) and \(ADC_{h}\) are the apparent diffusion coefficients of the diffusion hindered and restricted compartment for a given direction \(\theta\), \(b\) is the b value provided in the GradientTable input for that direction, \(f\) is the volume fraction of the restricted diffusion compartment (also known as the axonal water fraction).

  2. In the original article of DKI microstructural model [31], the hindered and restricted tensors were defined as the intra-cellular and extra-cellular diffusion compartments respectively.

References

tortuosity#

dipy.reconst.dki_micro.tortuosity(hindered_ad, hindered_rd)[source]#

Computes the tortuosity of the hindered diffusion compartment given its axial and radial diffusivities

Parameters:
hindered_ad: ndarray

Array containing the values of the hindered axial diffusivity.

hindered_rd: ndarray

Array containing the values of the hindered radial diffusivity.

Returns:
Tortuosity of the hindered diffusion compartment

DiffusionSpectrumModel#

class dipy.reconst.dsi.DiffusionSpectrumModel(gtab, *, qgrid_size=17, r_start=2.1, r_end=6.0, r_step=0.2, filter_width=32, normalize_peaks=False)[source]#

Bases: OdfModel, Cache

Methods

cache_clear()

Clear the cache.

cache_get(tag, key, *[, default])

Retrieve a value from the cache.

cache_set(tag, key, value)

Store a value in the cache.

fit(data, *[, mask])

Fit method for every voxel in data

fit(data, *, mask=None, **kwargs)#

Fit method for every voxel in data

DiffusionSpectrumFit#

class dipy.reconst.dsi.DiffusionSpectrumFit(model, data)[source]#

Bases: OdfFit

Methods

msd_discrete(*[, normalized])

Calculates the mean squared displacement on the discrete propagator

odf(sphere)

Calculates the real discrete odf for a given discrete sphere

pdf(*[, normalized])

Applies the 3D FFT in the q-space grid to generate the diffusion propagator

rtop_pdf(*[, normalized])

Calculates the return to origin probability from the propagator, which is the propagator evaluated at zero.

rtop_signal(*[, filtering])

Calculates the return to origin probability (rtop) from the signal rtop equals to the sum of all signal values

msd_discrete(*, normalized=True)[source]#

Calculates the mean squared displacement on the discrete propagator

MSD:{DSI}=\int_{-\infty}^{\infty}\int_{-\infty}^{\infty}\int_{-\infty}^{\infty} P(\hat{\mathbf{r}}) \cdot \hat{\mathbf{r}}^{2} \ dr_x \ dr_y \ dr_z

where \(\hat{\mathbf{r}}\) is a point in the 3D Propagator space (see [32]).

Parameters:
normalizedboolean, optional

Whether to normalize the propagator by its sum in order to obtain a pdf.

Returns:
msdfloat

the mean square displacement

References

odf(sphere)[source]#

Calculates the real discrete odf for a given discrete sphere

\[\psi_{DSI}(\hat{\mathbf{u}})=\int_{0}^{\infty}P(r\hat{\mathbf{u}})r^{2}dr\]

where \(\hat{\mathbf{u}}\) is the unit vector which corresponds to a sphere point.

pdf(*, normalized=True)[source]#

Applies the 3D FFT in the q-space grid to generate the diffusion propagator

rtop_pdf(*, normalized=True)[source]#

Calculates the return to origin probability from the propagator, which is the propagator evaluated at zero.

rtop = P(0)

See [33], [34] and [35] for further details about the method.

Parameters:
normalizedboolean, optional

Whether to normalize the propagator by its sum in order to obtain a pdf.

Returns:
rtopfloat

the return to origin probability

References

rtop_signal(*, filtering=True)[source]#

Calculates the return to origin probability (rtop) from the signal rtop equals to the sum of all signal values

Parameters:
filteringboolean, optional

Whether to perform Hanning filtering.

Returns:
rtopfloat

the return to origin probability

DiffusionSpectrumDeconvModel#

class dipy.reconst.dsi.DiffusionSpectrumDeconvModel(gtab, *, qgrid_size=35, r_start=4.1, r_end=13.0, r_step=0.4, filter_width=inf, normalize_peaks=False)[source]#

Bases: DiffusionSpectrumModel

Methods

cache_clear()

Clear the cache.

cache_get(tag, key, *[, default])

Retrieve a value from the cache.

cache_set(tag, key, value)

Store a value in the cache.

fit(data, *[, mask])

Fit method for every voxel in data

fit(data, *, mask=None, **kwargs)#

Fit method for every voxel in data

DiffusionSpectrumDeconvFit#

class dipy.reconst.dsi.DiffusionSpectrumDeconvFit(model, data)[source]#

Bases: DiffusionSpectrumFit

Methods

msd_discrete(*[, normalized])

Calculates the mean squared displacement on the discrete propagator

odf(sphere)

Calculates the real discrete odf for a given discrete sphere

pdf()

Applies the 3D FFT in the q-space grid to generate the DSI diffusion propagator, remove the background noise with a hard threshold and then deconvolve the propagator with the Lucy-Richardson deconvolution algorithm

rtop_pdf(*[, normalized])

Calculates the return to origin probability from the propagator, which is the propagator evaluated at zero.

rtop_signal(*[, filtering])

Calculates the return to origin probability (rtop) from the signal rtop equals to the sum of all signal values

pdf()[source]#

Applies the 3D FFT in the q-space grid to generate the DSI diffusion propagator, remove the background noise with a hard threshold and then deconvolve the propagator with the Lucy-Richardson deconvolution algorithm

create_qspace#

dipy.reconst.dsi.create_qspace(gtab, origin)[source]#

create the 3D grid which holds the signal values (q-space)

Parameters:
gtabGradientTable

Gradient table.

origin(3,) ndarray

center of qspace

Returns:
qgridndarray

qspace coordinates

create_qtable#

dipy.reconst.dsi.create_qtable(gtab, origin)[source]#

create a normalized version of gradients

Parameters:
gtabGradientTable

Gradient table.

origin(3,) ndarray

center of qspace

Returns:
qtablendarray

hanning_filter#

dipy.reconst.dsi.hanning_filter(gtab, filter_width, origin)[source]#

create a hanning window

The signal is premultiplied by a Hanning window before Fourier transform in order to ensure a smooth attenuation of the signal at high q values.

Parameters:
gtabGradientTable

Gradient table.

filter_widthint

Strength of the Hanning filter.

origin(3,) ndarray

center of qspace

Returns:
filter(N,) ndarray

where N is the number of non-b0 gradient directions

pdf_interp_coords#

dipy.reconst.dsi.pdf_interp_coords(sphere, rradius, origin)[source]#

Precompute coordinates for ODF calculation from the PDF

Parameters:
sphereobject,

Sphere

rradiusarray, shape (N,)

line interpolation points

originarray, shape (3,)

center of the grid

pdf_odf#

dipy.reconst.dsi.pdf_odf(Pr, rradius, interp_coords)[source]#

Calculates the real ODF from the diffusion propagator(PDF) Pr

Parameters:
Prarray, shape (X, X, X)

probability density function

rradiusarray, shape (N,)

interpolation range on the radius

interp_coordsarray, shape (3, M, N)

coordinates in the pdf for interpolating the odf

half_to_full_qspace#

dipy.reconst.dsi.half_to_full_qspace(data, gtab)[source]#

Half to full Cartesian grid mapping

Useful when dMRI data are provided in one qspace hemisphere as DiffusionSpectrum expects data to be in full qspace.

Parameters:
dataarray, shape (X, Y, Z, W)

where (X, Y, Z) volume size and W number of gradient directions

gtabGradientTable

container for b-values and b-vectors (gradient directions)

Returns:
new_dataarray, shape (X, Y, Z, 2 * W -1)

DWI data across the full Cartesian space.

new_gtabGradientTable

Gradient table.

Notes

We assume here that only on b0 is provided with the initial data. If that is not the case then you will need to write your own preparation function before providing the gradients and the data to the DiffusionSpectrumModel class.

project_hemisph_bvecs#

dipy.reconst.dsi.project_hemisph_bvecs(gtab)[source]#

Project any near identical bvecs to the other hemisphere

Parameters:
gtabobject,

GradientTable

Notes

Useful only when working with some types of dsi data.

threshold_propagator#

dipy.reconst.dsi.threshold_propagator(P, *, estimated_snr=15.0)[source]#

Applies hard threshold on the propagator to remove background noise for the deconvolution.

gen_PSF#

dipy.reconst.dsi.gen_PSF(qgrid_sampling, siz_x, siz_y, siz_z)[source]#

Generate a PSF for DSI Deconvolution by taking the ifft of the binary q-space sampling mask and truncating it to keep only the center.

LR_deconv#

dipy.reconst.dsi.LR_deconv(prop, psf, *, numit=5, acc_factor=1)[source]#

Perform Lucy-Richardson deconvolution algorithm on a 3D array.

Parameters:
prop3-D ndarray of dtype float

The 3D volume to be deconvolve

psf3-D ndarray of dtype float

The filter that will be used for the deconvolution.

numitint

Number of Lucy-Richardson iteration to perform.

acc_factorfloat

Exponential acceleration factor as in [36].

References

TensorModel#

class dipy.reconst.dti.TensorModel(gtab, *args, fit_method='WLS', return_S0_hat=False, **kwargs)[source]#

Bases: ReconstModel

Diffusion Tensor

Methods

fit(data, *[, mask])

Fit method of the DTI model class

predict(dti_params, *[, S0])

Predict a signal for this TensorModel class instance given parameters.

fit(data, *, mask=None)[source]#

Fit method of the DTI model class

Parameters:
dataarray

The measured signal from one voxel.

maskarray, optional

A boolean array used to mark the coordinates in the data that should be analyzed that has the shape data.shape[:-1]

predict(dti_params, *, S0=1.0)[source]#

Predict a signal for this TensorModel class instance given parameters.

Parameters:
dti_paramsndarray

The last dimension should have 12 tensor parameters: 3 eigenvalues, followed by the 3 eigenvectors

S0float or ndarray, optional

The non diffusion-weighted signal in every voxel, or across all voxels.

TensorFit#

class dipy.reconst.dti.TensorFit(model, model_params, *, model_S0=None)[source]#

Bases: object

Attributes:
S0_hat
directions

For tracking - return the primary direction in each voxel

evals

Returns the eigenvalues of the tensor as an array

evecs

Returns the eigenvectors of the tensor as an array, columnwise

quadratic_form

Calculates the 3x3 diffusion tensor for each voxel

shape

Methods

ad()

Axial diffusivity (AD) calculated from cached eigenvalues.

adc(sphere)

Calculate the apparent diffusion coefficient (ADC) in each direction on the sphere for each voxel in the data

color_fa()

Color fractional anisotropy of diffusion tensor

fa()

Fractional anisotropy (FA) calculated from cached eigenvalues.

ga()

Geodesic anisotropy (GA) calculated from cached eigenvalues.

linearity()

md()

Mean diffusivity (MD) calculated from cached eigenvalues.

mode()

Tensor mode calculated from cached eigenvalues.

odf(sphere)

The diffusion orientation distribution function (dODF).

planarity()

predict(gtab, *[, S0, step])

Given a model fit, predict the signal on the vertices of a sphere

rd()

Radial diffusivity (RD) calculated from cached eigenvalues.

sphericity()

trace()

Trace of the tensor calculated from cached eigenvalues.

lower_triangular

property S0_hat#
ad()[source]#

Axial diffusivity (AD) calculated from cached eigenvalues.

Returns:
adarray (V, 1)

Calculated AD.

Notes

AD is calculated with the following equation:

\[AD = \lambda_1\]
adc(sphere)[source]#

Calculate the apparent diffusion coefficient (ADC) in each direction on the sphere for each voxel in the data

Parameters:
sphereSphere class instance

Sphere providing sample directions to compute the apparent diffusion coefficient.

Returns:
adcndarray

The estimates of the apparent diffusion coefficient in every direction on the input sphere

Notes

The calculation of ADC, relies on the following relationship:

\[ADC = \vec{b} Q \vec{b}^T\]

Where Q is the quadratic form of the tensor.

color_fa()[source]#

Color fractional anisotropy of diffusion tensor

property directions#

For tracking - return the primary direction in each voxel

property evals#

Returns the eigenvalues of the tensor as an array

property evecs#

Returns the eigenvectors of the tensor as an array, columnwise

fa()[source]#

Fractional anisotropy (FA) calculated from cached eigenvalues.

ga()[source]#

Geodesic anisotropy (GA) calculated from cached eigenvalues.

linearity()[source]#
Returns:
linearityarray

Calculated linearity of the diffusion tensor [37].

Notes

Linearity is calculated with the following equation:

\[Linearity = \frac{\lambda_1-\lambda_2}{\lambda_1+\lambda_2+\lambda_3}\]

References

lower_triangular(*, b0=None)[source]#
md()[source]#

Mean diffusivity (MD) calculated from cached eigenvalues.

Returns:
mdarray (V, 1)

Calculated MD.

Notes

MD is calculated with the following equation:

\[MD = \frac{\lambda_1+\lambda_2+\lambda_3}{3}\]
mode()[source]#

Tensor mode calculated from cached eigenvalues.

odf(sphere)[source]#

The diffusion orientation distribution function (dODF). This is an estimate of the diffusion distance in each direction

Parameters:
sphereSphere class instance.

The dODF is calculated in the vertices of this input.

Returns:
odfndarray

The diffusion distance in every direction of the sphere in every voxel in the input data.

Notes

This is based on equation 3 in [38]. To re-derive it from scratch, follow steps in [12], Section 7.9 Equation 7.24 but with an \(r^2\) term in the integral.

References

planarity()[source]#
Returns:
sphericityarray

Calculated sphericity of the diffusion tensor [37].

Notes

Sphericity is calculated with the following equation:

\[Sphericity = \frac{2 (\lambda_2 - \lambda_3)}{\lambda_1+\lambda_2+\lambda_3}\]

References

predict(gtab, *, S0=None, step=None)[source]#

Given a model fit, predict the signal on the vertices of a sphere

Parameters:
gtaba GradientTable class instance

This encodes the directions for which a prediction is made

S0float array, optional

The mean non-diffusion weighted signal in each voxel. Default: The fitted S0 value in all voxels if it was fitted. Otherwise 1 in all voxels.

stepint, optional

The chunk size as a number of voxels. Optional parameter with default value 10,000.

In order to increase speed of processing, tensor fitting is done simultaneously over many voxels. This parameter sets the number of voxels that will be fit at once in each iteration. A larger step value should speed things up, but it will also take up more memory. It is advisable to keep an eye on memory consumption as this value is increased.

Notes

The predicted signal is given by:

\[S(\theta, b) = S_0 * e^{-b ADC}\]

Where: .. math:

ADC = \theta Q \theta^T

\(\theta\) is a unit vector pointing at any direction on the sphere for which a signal is to be predicted and \(b\) is the b value provided in the GradientTable input for that direction

property quadratic_form#

Calculates the 3x3 diffusion tensor for each voxel

rd()[source]#

Radial diffusivity (RD) calculated from cached eigenvalues.

Returns:
rdarray (V, 1)

Calculated RD.

Notes

RD is calculated with the following equation:

\[RD = \frac{\lambda_2 + \lambda_3}{2}\]
property shape#
sphericity()[source]#
Returns:
sphericityarray

Calculated sphericity of the diffusion tensor [37].

Notes

Sphericity is calculated with the following equation:

\[Sphericity = \frac{3 \lambda_3}{\lambda_1+\lambda_2+\lambda_3}\]

References

trace()[source]#

Trace of the tensor calculated from cached eigenvalues.

Returns:
tracearray (V, 1)

Calculated trace.

Notes

The trace is calculated with the following equation:

\[trace = \lambda_1 + \lambda_2 + \lambda_3\]

fractional_anisotropy#

dipy.reconst.dti.fractional_anisotropy(evals, *, axis=-1)[source]#

Return Fractional anisotropy (FA) of a diffusion tensor.

Parameters:
evalsarray-like

Eigenvalues of a diffusion tensor.

axisint, optional

Axis of evals which contains 3 eigenvalues.

Returns:
faarray

Calculated FA. Range is 0 <= FA <= 1.

Notes

FA is calculated using the following equation:

\[FA = \sqrt{\frac{1}{2}\frac{(\lambda_1-\lambda_2)^2+(\lambda_1- \lambda_3)^2+(\lambda_2-\lambda_3)^2}{\lambda_1^2+ \lambda_2^2+\lambda_3^2}}\]

geodesic_anisotropy#

dipy.reconst.dti.geodesic_anisotropy(evals, *, axis=-1)[source]#

Geodesic anisotropy (GA) of a diffusion tensor.

Parameters:
evalsarray-like

Eigenvalues of a diffusion tensor.

axisint, optional

Axis of evals which contains 3 eigenvalues.

Returns:
gaarray

Calculated GA. In the range 0 to +infinity

Notes

GA is calculated using the following equation given in [39]:

\[GA = \sqrt{\sum_{i=1}^3 \log^2{\left ( \lambda_i/<\mathbf{D}> \right )}}, \quad \textrm{where} \quad <\mathbf{D}> = (\lambda_1\lambda_2\lambda_3)^{1/3}\]

Note that the notation, \(<D>\), is often used as the mean diffusivity (MD) of the diffusion tensor and can lead to confusions in the literature (see [39] versus [40] versus [41] for example). [40] defines geodesic anisotropy (GA) with \(<D>\) as the MD in the denominator of the sum. This is wrong. The original paper [39] defines GA with \(<D> = det(D)^{1/3}\), as the isotropic part of the distance. This might be an explanation for the confusion. The isotropic part of the diffusion tensor in Euclidean space is the MD whereas the isotropic part of the tensor in log-Euclidean space is \(det(D)^{1/3}\). The Appendix of [39] and log-Euclidean derivations from [41] are clear on this. Hence, all that to say that \(<D> = det(D)^{1/3}\) here for the GA definition and not MD.

See also [42].

References

mean_diffusivity#

dipy.reconst.dti.mean_diffusivity(evals, *, axis=-1)[source]#

Mean Diffusivity (MD) of a diffusion tensor.

Parameters:
evalsarray-like

Eigenvalues of a diffusion tensor.

axisint, optional

Axis of evals which contains 3 eigenvalues.

Returns:
mdarray

Calculated MD.

Notes

MD is calculated with the following equation:

\[MD = \frac{\lambda_1 + \lambda_2 + \lambda_3}{3}\]

axial_diffusivity#

dipy.reconst.dti.axial_diffusivity(evals, *, axis=-1)[source]#

Axial Diffusivity (AD) of a diffusion tensor. Also called parallel diffusivity.

Parameters:
evalsarray-like

Eigenvalues of a diffusion tensor, must be sorted in descending order along axis.

axisint, optional

Axis of evals which contains 3 eigenvalues.

Returns:
adarray

Calculated AD.

Notes

AD is calculated with the following equation:

\[AD = \lambda_1\]

radial_diffusivity#

dipy.reconst.dti.radial_diffusivity(evals, *, axis=-1)[source]#

Radial Diffusivity (RD) of a diffusion tensor. Also called perpendicular diffusivity.

Parameters:
evalsarray-like

Eigenvalues of a diffusion tensor, must be sorted in descending order along axis.

axisint, optional

Axis of evals which contains 3 eigenvalues.

Returns:
rdarray

Calculated RD.

Notes

RD is calculated with the following equation:

\[RD = \frac{\lambda_2 + \lambda_3}{2}\]

trace#

dipy.reconst.dti.trace(evals, *, axis=-1)[source]#

Trace of a diffusion tensor.

Parameters:
evalsarray-like

Eigenvalues of a diffusion tensor.

axisint, optional

Axis of evals which contains 3 eigenvalues.

Returns:
tracearray

Calculated trace of the diffusion tensor.

Notes

Trace is calculated with the following equation:

\[Trace = \lambda_1 + \lambda_2 + \lambda_3\]

color_fa#

dipy.reconst.dti.color_fa(fa, evecs)[source]#

Color fractional anisotropy of diffusion tensor

Parameters:
faarray-like

Array of the fractional anisotropy (can be 1D, 2D or 3D)

evecsarray-like

eigen vectors from the tensor model

Returns:
rgbArray with 3 channels for each color as the last dimension.

Colormap of the FA with red for the x value, y for the green value and z for the blue value.

Notes

It is computed from the clipped FA between 0 and 1 using the following formula

\[rgb = abs(max(\vec{e})) \times fa\]

determinant#

dipy.reconst.dti.determinant(q_form)[source]#

The determinant of a tensor, given in quadratic form

Parameters:
q_formndarray

The quadratic form of a tensor, or an array with quadratic forms of tensors. Should be of shape (x, y, z, 3, 3) or (n, 3, 3) or (3, 3).

Returns:
detarray

The determinant of the tensor in each spatial coordinate

isotropic#

dipy.reconst.dti.isotropic(q_form)[source]#

Calculate the isotropic part of the tensor.

See [43] for further details about the method.

Parameters:
q_formndarray

The quadratic form of a tensor, or an array with quadratic forms of tensors. Should be of shape (x,y,z,3,3) or (n, 3, 3) or (3,3).

Returns:
A_hat: ndarray

The isotropic part of the tensor in each spatial coordinate

Notes

The isotropic part of a tensor is defined as (equations 3-5 of [43]):

\[\bar{A} = \frac{1}{2} tr(A) I\]

References

deviatoric#

dipy.reconst.dti.deviatoric(q_form)[source]#

Calculate the deviatoric (anisotropic) part of the tensor.

See [43] for further details about the method.

Parameters:
q_formndarray

The quadratic form of a tensor, or an array with quadratic forms of tensors. Should be of shape (x,y,z,3,3) or (n, 3, 3) or (3,3).

Returns:
A_squigglendarray

The deviatoric part of the tensor in each spatial coordinate.

Notes

The deviatoric part of the tensor is defined as (equations 3-5 in [43]):

\[\widetilde{A} = A - \bar{A}\]

Where \(A\) is the tensor quadratic form and \(\bar{A}\) is the anisotropic part of the tensor.

References

norm#

dipy.reconst.dti.norm(q_form)[source]#

Calculate the Frobenius norm of a tensor quadratic form

Parameters:
q_form: ndarray

The quadratic form of a tensor, or an array with quadratic forms of tensors. Should be of shape (x,y,z,3,3) or (n, 3, 3) or (3,3).

Returns:
normndarray

The Frobenius norm of the 3,3 tensor q_form in each spatial coordinate.

See also

np.linalg.norm

Notes

The Frobenius norm is defined as:

\[||A||_F = [\sum_{i,j} abs(a_{i,j})^2]^{1/2}\]

mode#

dipy.reconst.dti.mode(q_form)[source]#

Mode (MO) of a diffusion tensor.

See [43] for further details about the method.

Parameters:
q_formndarray

The quadratic form of a tensor, or an array with quadratic forms of tensors. Should be of shape (x, y, z, 3, 3) or (n, 3, 3) or (3, 3).

Returns:
modearray

Calculated tensor mode in each spatial coordinate.

Notes

Mode ranges between -1 (planar anisotropy) and +1 (linear anisotropy) with 0 representing isotropy. Mode is calculated with the following equation (equation 9 in [43]):

\[Mode = 3*\sqrt{6}*det(\widetilde{A}/norm(\widetilde{A}))\]

Where \(\widetilde{A}\) is the deviatoric part of the tensor quadratic form.

References

linearity#

dipy.reconst.dti.linearity(evals, *, axis=-1)[source]#

The linearity of the tensor.

See [37] for further details about the method.

Parameters:
evalsarray-like

Eigenvalues of a diffusion tensor.

axisint, optional

Axis of evals which contains 3 eigenvalues.

Returns:
linearityarray

Calculated linearity of the diffusion tensor.

Notes

Linearity is calculated with the following equation:

\[Linearity = \frac{\lambda_1-\lambda_2}{\lambda_1+\lambda_2+\lambda_3}\]

References

planarity#

dipy.reconst.dti.planarity(evals, *, axis=-1)[source]#

The planarity of the tensor.

See [37] for further details about the method.

Parameters:
evalsarray-like

Eigenvalues of a diffusion tensor.

axisint, optional

Axis of evals which contains 3 eigenvalues.

Returns:
linearityarray

Calculated linearity of the diffusion tensor.

Notes

Planarity is calculated with the following equation:

\[Planarity = \frac{2 (\lambda_2-\lambda_3)}{\lambda_1+\lambda_2+\lambda_3}\]

References

sphericity#

dipy.reconst.dti.sphericity(evals, *, axis=-1)[source]#

The sphericity of the tensor.

See [37] for further details about the method.

Parameters:
evalsarray-like

Eigenvalues of a diffusion tensor.

axisint, optional

Axis of evals which contains 3 eigenvalues.

Returns:
sphericityarray

Calculated sphericity of the diffusion tensor.

Notes

Sphericity is calculated with the following equation:

\[Sphericity = \frac{3 \lambda_3)}{\lambda_1+\lambda_2+\lambda_3}\]

References

apparent_diffusion_coef#

dipy.reconst.dti.apparent_diffusion_coef(q_form, sphere)[source]#

Calculate the apparent diffusion coefficient (ADC) in each direction of a sphere.

Parameters:
q_formndarray

The quadratic form of a tensor, or an array with quadratic forms of tensors. Should be of shape (…, 3, 3)

spherea Sphere class instance

The ADC will be calculated for each of the vertices in the sphere

Notes

The calculation of ADC, relies on the following relationship:

\[ADC = \vec{b} Q \vec{b}^T\]

Where Q is the quadratic form of the tensor.

tensor_prediction#

dipy.reconst.dti.tensor_prediction(dti_params, gtab, S0)[source]#

Predict a signal given tensor parameters.

Parameters:
dti_paramsndarray

Tensor parameters. The last dimension should have 12 tensor parameters: 3 eigenvalues, followed by the 3 corresponding eigenvectors.

gtaba GradientTable class instance

The gradient table for this prediction

S0float or ndarray

The non diffusion-weighted signal in every voxel, or across all voxels. Default: 1

Notes

The predicted signal is given by:

\[S(\theta, b) = S_0 * e^{-b ADC}\]

where \(ADC = \theta Q \theta^T\), \(\theta\) is a unit vector pointing at any direction on the sphere for which a signal is to be predicted, \(b\) is the b value provided in the GradientTable input for that direction, \(Q\) is the quadratic form of the tensor determined by the input parameters.

iter_fit_tensor#

dipy.reconst.dti.iter_fit_tensor(*, step=10000.0)[source]#

Wrap a fit_tensor func and iterate over chunks of data with given length

Splits data into a number of chunks of specified size and iterates the decorated fit_tensor function over them. This is useful to counteract the temporary but significant memory usage increase in fit_tensor functions that use vectorized operations and need to store large temporary arrays for their vectorized operations.

Parameters:
stepint, optional

The chunk size as a number of voxels. Optional parameter with default value 10,000.

In order to increase speed of processing, tensor fitting is done simultaneously over many voxels. This parameter sets the number of voxels that will be fit at once in each iteration. A larger step value should speed things up, but it will also take up more memory. It is advisable to keep an eye on memory consumption as this value is increased.

wls_fit_tensor#

dipy.reconst.dti.wls_fit_tensor(design_matrix, data, *, weights=None, return_S0_hat=False, return_lower_triangular=False, return_leverages=False)[source]#

Computes weighted least squares (WLS) fit to calculate self-diffusion tensor using a linear regression model.

See [44] for further details about the method.

Parameters:
design_matrixarray (g, 7)

Design matrix holding the covariants used to solve for the regression coefficients.

dataarray ([X, Y, Z, …], g)

Data or response variables holding the data. Note that the last dimension should contain the data. It makes no copies of data.

weightsarray ([X, Y, Z, …], g), optional

Weights to apply for fitting. These weights must correspond to the squared residuals such that \(S = \sum_i w_i r_i^2\). If not provided, weights are estimated as the squared predicted signal from an initial OLS fit [44].

return_S0_hatbool, optional

Boolean to return (True) or not (False) the S0 values for the fit.

return_lower_triangularbool, optional

Boolean to return (True) or not (False) the coefficients of the fit.

return_leveragesbool, optional

Boolean to return (True) or not (False) the fitting leverages.

Returns:
eigvalsarray (…, 3)

Eigenvalues from eigen decomposition of the tensor.

eigvecsarray (…, 3, 3)

Associated eigenvectors from eigen decomposition of the tensor. Eigenvectors are columnar (e.g. eigvecs[:,j] is associated with eigvals[j])

leveragesarray (g)

Leverages of the fitting problem (if return_leverages is True)

See also

decompose_tensor

Notes

In Chung, et al. 2006, the regression of the WLS fit needed an unbiased preliminary estimate of the weights and therefore the ordinary least squares (OLS) estimates were used. A “two pass” method was implemented:

  1. calculate OLS estimates of the data

  2. apply the OLS estimates as weights to the WLS fit of the data

This ensured heteroscedasticity could be properly modeled for various types of bootstrap resampling (namely residual bootstrap).

\[\begin{split}y = \mathrm{data} \\ X = \mathrm{design matrix} \\ \hat{\beta}_\mathrm{WLS} = \mathrm{desired regression coefficients (e.g. tensor)}\\ \\ \hat{\beta}_\mathrm{WLS} = (X^T W X)^{-1} X^T W y \\ \\ W = \mathrm{diag}((X \hat{\beta}_\mathrm{OLS})^2), \mathrm{where} \hat{\beta}_\mathrm{OLS} = (X^T X)^{-1} X^T y\end{split}\]

References

ols_fit_tensor#

dipy.reconst.dti.ols_fit_tensor(design_matrix, data, *, return_S0_hat=False, return_lower_triangular=False, return_leverages=False)[source]#

Computes ordinary least squares (OLS) fit to calculate self-diffusion tensor using a linear regression model.

See [44] for further details about the method.

Parameters:
design_matrixarray (g, 7)

Design matrix holding the covariants used to solve for the regression coefficients.

dataarray ([X, Y, Z, …], g)

Data or response variables holding the data. Note that the last dimension should contain the data. It makes no copies of data.

return_S0_hatbool, optional

Boolean to return (True) or not (False) the S0 values for the fit.

return_lower_triangularbool, optional

Boolean to return (True) or not (False) the coefficients of the fit.

return_leveragesbool, optional

Boolean to return (True) or not (False) the fitting leverages.

Returns:
eigvalsarray (…, 3)

Eigenvalues from eigen decomposition of the tensor.

eigvecsarray (…, 3, 3)

Associated eigenvectors from eigen decomposition of the tensor. Eigenvectors are columnar (e.g. eigvecs[:,j] is associated with eigvals[j])

leveragesarray (g)

Leverages of the fitting problem (if return_leverages is True)

See also

WLS_fit_tensor, decompose_tensor, design_matrix

Notes

\[ \begin{align}\begin{aligned}\begin{split}y = \mathrm{data} \\ X = \mathrm{design matrix} \\\end{split}\\\hat{\beta}_\mathrm{OLS} = (X^T X)^{-1} X^T y\end{aligned}\end{align} \]

References

nlls_fit_tensor#

dipy.reconst.dti.nlls_fit_tensor(design_matrix, data, *, weights=None, jac=True, return_S0_hat=False, fail_is_nan=False, return_lower_triangular=False, return_leverages=False, init_params=None)[source]#

Fit the cumulant expansion params (e.g. DTI, DKI) using non-linear least-squares.

Parameters:
design_matrixarray (g, Npar)

Design matrix holding the covariants used to solve for the regression coefficients. First six parameters of design matrix should correspond to the six unique diffusion tensor elements in the lower triangular order (Dxx, Dxy, Dyy, Dxz, Dyz, Dzz), while last parameter to -log(S0)

dataarray ([X, Y, Z, …], g)

Data or response variables holding the data. Note that the last dimension should contain the data. It makes no copies of data.

weightsarray ([X, Y, Z, …], g), optional

Weights to apply for fitting. These weights must correspond to the squared residuals such that \(S = \sum_i w_i r_i^2\).

jacbool, optional

Use the Jacobian?

return_S0_hatbool, optional

Boolean to return (True) or not (False) the S0 values for the fit.

fail_is_nanbool, optional

Boolean to set failed NL fitting to NaN (True) or LS (False, default).

return_lower_triangularbool, optional

Boolean to return (True) or not (False) the coefficients of the fit.

return_leveragesbool, optional

Boolean to return (True) or not (False) the fitting leverages.

init_paramsarray ([X, Y, Z, …], Npar), optional

Parameters in lower triangular form as initial optimization guess.

Returns:
nlls_params: the eigen-values and eigen-vectors of the tensor in each

voxel.

restore_fit_tensor#

dipy.reconst.dti.restore_fit_tensor(design_matrix, data, *, sigma=None, jac=True, return_S0_hat=False, fail_is_nan=False)[source]#

Compute a robust tensor fit using the RESTORE algorithm.

Note that the RESTORE algorithm defined in [45] does not define Geman–McClure M-estimator weights as claimed (instead, Cauchy M-estimator weights are defined), but this function does define correct Geman–McClure M-estimator weights.

Parameters:
design_matrixarray of shape (g, 7)

Design matrix holding the covariants used to solve for the regression coefficients.

dataarray of shape ([X, Y, Z, n_directions], g)

Data or response variables holding the data. Note that the last dimension should contain the data. It makes no copies of data.

sigmafloat, optional

An estimate of the variance. [45] recommend to use 1.5267 * std(background_noise), where background_noise is estimated from some part of the image known to contain no signal (only noise). If not provided, will be estimated per voxel as: sigma = 1.4826 * sqrt(N / (N - p)) * MAD(residuals) as in [46] but with the additional correction factor 1.4826 required to link standard deviation to MAD.

jacbool, optional

Whether to use the Jacobian of the tensor to speed the non-linear optimization procedure used to fit the tensor parameters (see also nlls_fit_tensor()).

return_S0_hatbool, optional

Boolean to return (True) or not (False) the S0 values for the fit.

fail_is_nanbool, optional

Boolean to set failed NL fitting to NaN (True) or LS (False).

Returns:
restore_paramsan estimate of the tensor parameters in each voxel.

References

iterative_fit_tensor#

dipy.reconst.dti.iterative_fit_tensor(design_matrix, data, *, jac=True, return_S0_hat=False, fit_type=None, num_iter=4, weights_method=None)[source]#

Iteratively Reweighted fitting for the DTI/DKI model.

Parameters:
design_matrixndarray of shape (g, …)

Design matrix holding the covariants used to solve for the regression coefficients.

datandarray of shape ([X, Y, Z, n_directions], g)

Data or response variables holding the data. Note that the last dimension should contain the data. It makes no copies of data.

jacbool, optional

Use the Jacobian for NLLS fitting (does nothing for WLS fitting).

return_S0_hatbool, optional

Boolean to return (True) or not (False) the S0 values for the fit.

fit_typestr, optional

Whether to use NLLS or WLS fitting scheme.

num_iterint, optional

Number of times to iterate.

weights_methodcallable, optional

A function with args and returns as follows:

(weights, robust) = weights_method(data, pred_sig, design_matrix,
                                   leverages, idx, num_iter, robust)

Notes

Take care to supply an appropriate weights_method for the fit_type. It is possible to use NLLS fitting with weights designed for WLS fitting, but this is a user error.

robust_fit_tensor_wls#

dipy.reconst.dti.robust_fit_tensor_wls(design_matrix, data, *, return_S0_hat=False, num_iter=4)[source]#

Iteratively Reweighted fitting for WLS for the DTI/DKI model.

Parameters:
design_matrixndarray of shape (g, …)

Design matrix holding the covariants used to solve for the regression coefficients.

datandarray of shape ([X, Y, Z, n_directions], g)

Data or response variables holding the data. Note that the last dimension should contain the data. It makes no copies of data.

return_S0_hatbool, optional

Boolean to return (True) or not (False) the S0 values for the fit.

num_iterint, optional

Number of times to iterate.

Notes

This is a convenience function that does:

iterative_fit_tensor(*args, **kwargs, fit_type="WLS",
                     weights_method=weights_method_wls)

robust_fit_tensor_nlls#

dipy.reconst.dti.robust_fit_tensor_nlls(design_matrix, data, *, jac=True, return_S0_hat=False, num_iter=4)[source]#

Iteratively Reweighted fitting for NLLS for the DTI/DKI model.

Parameters:
design_matrixndarray of shape (g, …)

Design matrix holding the covariants used to solve for the regression coefficients.

datandarray of shape ([X, Y, Z, n_directions], g)

Data or response variables holding the data. Note that the last dimension should contain the data. It makes no copies of data.

jacbool, optional

Use the Jacobian?

return_S0_hatbool, optional

Boolean to return (True) or not (False) the S0 values for the fit.

num_iterint, optional

Number of times to iterate.

Notes

This is a convenience function that does:

iterative_fit_tensor(*args, **kwargs, fit_type="NLLS",
weights_method=weights_method_nlls)

from_lower_triangular#

dipy.reconst.dti.from_lower_triangular(D)[source]#

Returns a tensor given the six unique tensor elements

Given the six unique tensor elements (in the order: Dxx, Dxy, Dyy, Dxz, Dyz, Dzz) returns a 3 by 3 tensor. All elements after the sixth are ignored.

Parameters:
Darray_like, (…, >6)

Unique elements of the tensors

Returns:
tensorndarray (…, 3, 3)

3 by 3 tensors

lower_triangular#

dipy.reconst.dti.lower_triangular(tensor, *, b0=None)[source]#

Returns the six lower triangular values of the tensor ordered as (Dxx, Dxy, Dyy, Dxz, Dyz, Dzz) and a dummy variable if b0 is not None.

Parameters:
tensorarray_like (…, 3, 3)

a collection of 3, 3 diffusion tensors

b0float, optional

if b0 is not none log(b0) is returned as the dummy variable

Returns:
Dndarray

If b0 is none, then the shape will be (…, 6) otherwise (…, 7)

decompose_tensor#

dipy.reconst.dti.decompose_tensor(tensor, *, min_diffusivity=0)[source]#

Returns eigenvalues and eigenvectors given a diffusion tensor

Computes tensor eigen decomposition to calculate eigenvalues and eigenvectors (Basser et al., 1994a).

Parameters:
tensorarray (…, 3, 3)

Hermitian matrix representing a diffusion tensor.

min_diffusivityfloat, optional

Because negative eigenvalues are not physical and small eigenvalues, much smaller than the diffusion weighting, cause quite a lot of noise in metrics such as fa, diffusivity values smaller than min_diffusivity are replaced with min_diffusivity.

Returns:
eigvalsarray (…, 3)

Eigenvalues from eigen decomposition of the tensor. Negative eigenvalues are replaced by zero. Sorted from largest to smallest.

eigvecsarray (…, 3, 3)

Associated eigenvectors from eigen decomposition of the tensor. Eigenvectors are columnar (e.g. eigvecs[…, :, j] is associated with eigvals[…, j])

design_matrix#

dipy.reconst.dti.design_matrix(gtab, *, dtype=None)[source]#

Constructs design matrix for DTI weighted least squares or least squares fitting. (Basser et al., 1994a)

Parameters:
gtabA GradientTable class instance
dtypestr, optional

Parameter to control the dtype of returned designed matrix

Returns:
design_matrixarray (g,7)

Design matrix or B matrix assuming Gaussian distributed tensor model design_matrix[j, :] = (Bxx, Byy, Bzz, Bxy, Bxz, Byz, dummy)

quantize_evecs#

dipy.reconst.dti.quantize_evecs(evecs, *, odf_vertices=None)[source]#

Find the closest orientation of an evenly distributed sphere

Parameters:
evecsndarray

Eigenvectors.

odf_verticesndarray, optional

If None, then set vertices from symmetric362 sphere. Otherwise use passed ndarray as vertices

Returns:
INndarray

eig_from_lo_tri#

dipy.reconst.dti.eig_from_lo_tri(data, *, min_diffusivity=0)[source]#

Calculates tensor eigenvalues/eigenvectors from an array containing the lower diagonal form of the six unique tensor elements.

Parameters:
dataarray_like (…, 6)

diffusion tensors elements stored in lower triangular order

min_diffusivityfloat, optional

See decompose_tensor()

Returns:
dti_paramsarray (…, 12)

Eigen-values and eigen-vectors of the same array.

EuDXDirectionGetter#

class dipy.reconst.eudx_direction_getter.EuDXDirectionGetter#

Bases: DirectionGetter

Deterministic Direction Getter based on peak directions.

This class contains the cython portion of the code for PeaksAndMetrics and is not meant to be used on its own.

Attributes:
ang_thr
qa_thr
total_weight

Methods

initial_direction(point)

The best starting directions for fiber tracking from point

generate_streamline

get_direction

ang_thr#
initial_direction(point)#

The best starting directions for fiber tracking from point

All the valid peaks in the voxel closest to point are returned as initial directions.

qa_thr#
total_weight#

ForecastModel#

class dipy.reconst.forecast.ForecastModel(gtab, *, sh_order_max=8, lambda_lb=0.001, dec_alg='CSD', sphere=None, lambda_csd=1.0)[source]#

Bases: OdfModel, Cache

Fiber ORientation Estimated using Continuous Axially Symmetric Tensors (FORECAST).

FORECAST [47], [48], [49] is a Spherical Deconvolution reconstruction model for multi-shell diffusion data which enables the calculation of a voxel adaptive response function using the Spherical Mean Technique (SMT) [48], [49].

With FORECAST it is possible to calculate crossing invariant parallel diffusivity, perpendicular diffusivity, mean diffusivity, and fractional anisotropy [48].

Methods

cache_clear()

Clear the cache.

cache_get(tag, key, *[, default])

Retrieve a value from the cache.

cache_set(tag, key, value)

Store a value in the cache.

fit(data, *[, mask])

Fit method for every voxel in data

Notes

The implementation of FORECAST may require CVXPY (https://www.cvxpy.org/).

References

fit(data, *, mask=None, **kwargs)#

Fit method for every voxel in data

ForecastFit#

class dipy.reconst.forecast.ForecastFit(model, data, sh_coef, d_par, d_perp)[source]#

Bases: OdfFit

Attributes:
dpar

The parallel diffusivity

dperp

The perpendicular diffusivity

sh_coeff

The FORECAST SH coefficients

Methods

fractional_anisotropy()

Calculates the fractional anisotropy.

mean_diffusivity()

Calculates the mean diffusivity.

odf(sphere, *[, clip_negative])

Calculates the fODF for a given discrete sphere.

predict(*[, gtab, S0])

Calculates the fODF for a given discrete sphere.

property dpar#

The parallel diffusivity

property dperp#

The perpendicular diffusivity

fractional_anisotropy()[source]#

Calculates the fractional anisotropy.

mean_diffusivity()[source]#

Calculates the mean diffusivity.

odf(sphere, *, clip_negative=True)[source]#

Calculates the fODF for a given discrete sphere.

Parameters:
sphereSphere,

the odf sphere

clip_negativeboolean, optional

if True clip the negative odf values to 0, default True

predict(*, gtab=None, S0=1.0)[source]#

Calculates the fODF for a given discrete sphere.

Parameters:
gtabGradientTable, optional

gradient directions and bvalues container class.

S0float, optional

the signal at b-value=0

property sh_coeff#

The FORECAST SH coefficients

find_signal_means#

dipy.reconst.forecast.find_signal_means(b_unique, data_norm, bvals, rho, lb_matrix, *, w=0.001)[source]#

Calculate the mean signal for each shell.

Parameters:
b_unique1d ndarray,

unique b-values in a vector excluding zero

data_norm1d ndarray,

normalized diffusion signal

bvals1d ndarray,

the b-values

rho2d ndarray,

SH basis matrix for fitting the signal on each shell

lb_matrix2d ndarray,

Laplace-Beltrami regularization matrix

wfloat,

weight for the Laplace-Beltrami regularization

Returns:
means1d ndarray

the average of the signal for each b-values

forecast_error_func#

dipy.reconst.forecast.forecast_error_func(x, b_unique, E)[source]#

Calculates the difference between the mean signal calculated using the parameter vector x and the average signal E using FORECAST and SMT

psi_l#

dipy.reconst.forecast.psi_l(ell, b)[source]#

forecast_matrix#

dipy.reconst.forecast.forecast_matrix(sh_order_max, d_par, d_perp, bvals)[source]#

Compute the FORECAST radial matrix

rho_matrix#

dipy.reconst.forecast.rho_matrix(sh_order_max, vecs)[source]#

Compute the SH matrix \(\rho\)

lb_forecast#

dipy.reconst.forecast.lb_forecast(sh_order_max)[source]#

Returns the Laplace-Beltrami regularization matrix for FORECAST

FreeWaterTensorModel#

class dipy.reconst.fwdti.FreeWaterTensorModel(gtab, *args, fit_method='NLS', **kwargs)[source]#

Bases: ReconstModel

Class for the Free Water Elimination Diffusion Tensor Model

Methods

fit(data, *[, mask])

Fit method for every voxel in data

predict(fwdti_params, *[, S0])

Predict a signal for this TensorModel class instance given parameters.

fit(data, *, mask=None, **kwargs)#

Fit method for every voxel in data

predict(fwdti_params, *, S0=1)[source]#

Predict a signal for this TensorModel class instance given parameters.

Parameters:
fwdti_params(…, 13) ndarray

The last dimension should have 13 parameters: the 12 tensor parameters (3 eigenvalues, followed by the 3 corresponding eigenvectors) and the free water volume fraction.

S0float or ndarray

The non diffusion-weighted signal in every voxel, or across all voxels. Default: 1

Returns:
S(…, N) ndarray

Simulated signal based on the free water DTI model

FreeWaterTensorFit#

class dipy.reconst.fwdti.FreeWaterTensorFit(model, model_params)[source]#

Bases: TensorFit

Class for fitting the Free Water Tensor Model

Attributes:
S0_hat
directions

For tracking - return the primary direction in each voxel

evals

Returns the eigenvalues of the tensor as an array

evecs

Returns the eigenvectors of the tensor as an array, columnwise

f

Returns the free water diffusion volume fraction f

quadratic_form

Calculates the 3x3 diffusion tensor for each voxel

shape

Methods

ad()

Axial diffusivity (AD) calculated from cached eigenvalues.

adc(sphere)

Calculate the apparent diffusion coefficient (ADC) in each direction on the sphere for each voxel in the data

color_fa()

Color fractional anisotropy of diffusion tensor

fa()

Fractional anisotropy (FA) calculated from cached eigenvalues.

ga()

Geodesic anisotropy (GA) calculated from cached eigenvalues.

linearity()

md()

Mean diffusivity (MD) calculated from cached eigenvalues.

mode()

Tensor mode calculated from cached eigenvalues.

odf(sphere)

The diffusion orientation distribution function (dODF).

planarity()

predict(gtab, *[, S0])

Given a free water tensor model fit, predict the signal on the vertices of a gradient table

rd()

Radial diffusivity (RD) calculated from cached eigenvalues.

sphericity()

trace()

Trace of the tensor calculated from cached eigenvalues.

lower_triangular

property f#

Returns the free water diffusion volume fraction f

predict(gtab, *, S0=1)[source]#

Given a free water tensor model fit, predict the signal on the vertices of a gradient table

Parameters:
gtaba GradientTable class instance

The gradient table for this prediction

S0float array

The mean non-diffusion weighted signal in each voxel. Default: 1 in all voxels.

Returns:
S(…, N) ndarray

Simulated signal based on the free water DTI model

fwdti_prediction#

dipy.reconst.fwdti.fwdti_prediction(params, gtab, *, S0=1, Diso=0.003)[source]#

Signal prediction given the free water DTI model parameters.

Parameters:
params(…, 13) ndarray

Model parameters. The last dimension should have the 12 tensor parameters (3 eigenvalues, followed by the 3 corresponding eigenvectors) and the volume fraction of the free water compartment.

gtaba GradientTable class instance

The gradient table for this prediction

S0float or ndarray

The non diffusion-weighted signal in every voxel, or across all voxels. Default: 1

Disofloat, optional

Value of the free water isotropic diffusion. Default is set to 3e-3 \(mm^{2}.s^{-1}\). Please adjust this value if you are assuming different units of diffusion.

Returns:
S(…, N) ndarray

Simulated signal based on the free water DTI model

Notes

The predicted signal is given by: \(S(\theta, b) = S_0 * [(1-f) * e^{-b ADC} + f * e^{-b D_{iso}]\), where \(ADC = \theta Q \theta^T\), \(\theta\) is a unit vector pointing at any direction on the sphere for which a signal is to be predicted, \(b\) is the b value provided in the GradientTable input for that direction, \(Q\) is the quadratic form of the tensor determined by the input parameters, \(f\) is the free water diffusion compartment, \(D_{iso}\) is the free water diffusivity which is equal to $3 * 10^{-3} mm^{2}s^{-1} [50].

References

wls_iter#

dipy.reconst.fwdti.wls_iter(design_matrix, sig, S0, *, Diso=0.003, mdreg=0.0027, min_signal=1e-06, piterations=3)[source]#

Applies weighted linear least squares fit of the water free elimination model to single voxel signals.

Parameters:
design_matrixarray (g, 7)

Design matrix holding the covariants used to solve for the regression coefficients.

sigarray (g, )

Diffusion-weighted signal for a single voxel data.

S0float

Non diffusion weighted signal (i.e. signal for b-value=0).

Disofloat, optional

Value of the free water isotropic diffusion. Default is set to 3e-3 \(mm^{2}.s^{-1}\). Please adjust this value if you are assuming different units of diffusion.

mdregfloat, optimal

DTI’s mean diffusivity regularization threshold. If standard DTI diffusion tensor’s mean diffusivity is almost near the free water diffusion value, the diffusion signal is assumed to be only free water diffusion (i.e. volume fraction will be set to 1 and tissue’s diffusion parameters are set to zero). Default md_reg is 2.7e-3 \(mm^{2}.s^{-1}\) (corresponding to 90% of the free water diffusion value).

min_signalfloat

The minimum signal value. Needs to be a strictly positive number. Default: minimal signal in the data provided to fit.

piterationsinter, optional

Number of iterations used to refine the precision of f. Default is set to 3 corresponding to a precision of 0.01.

Returns:
fw_paramsndarray

All parameters estimated from the free water tensor model. Parameters are ordered as follows:

  1. Three diffusion tensor’s eigenvalues

  2. Three lines of the eigenvector matrix each containing the first, second and third coordinates of the eigenvector

  3. The volume fraction of the free water compartment

wls_fit_tensor#

dipy.reconst.fwdti.wls_fit_tensor(gtab, data, *, Diso=0.003, mask=None, min_signal=1e-06, piterations=3, mdreg=0.0027)[source]#

Computes weighted least squares (WLS) fit to calculate self-diffusion tensor using a linear regression model.

See [50] for further details about the method.

Parameters:
gtaba GradientTable class instance

The gradient table containing diffusion acquisition parameters.

datandarray ([X, Y, Z, …], g)

Data or response variables holding the data. Note that the last dimension should contain the data. It makes no copies of data.

Disofloat, optional

Value of the free water isotropic diffusion. Default is set to 3e-3 \(mm^{2}.s^{-1}\). Please adjust this value if you are assuming different units of diffusion.

maskarray, optional

A boolean array used to mark the coordinates in the data that should be analyzed that has the shape data.shape[:-1]

min_signalfloat

The minimum signal value. Needs to be a strictly positive number.

piterationsinter, optional

Number of iterations used to refine the precision of f. Default is set to 3 corresponding to a precision of 0.01.

mdregfloat, optimal

DTI’s mean diffusivity regularization threshold. If standard DTI diffusion tensor’s mean diffusivity is almost near the free water diffusion value, the diffusion signal is assumed to be only free water diffusion (i.e. volume fraction will be set to 1 and tissue’s diffusion parameters are set to zero). Default md_reg is 2.7e-3 \(mm^{2}.s^{-1}\) (corresponding to 90% of the free water diffusion value).

Returns:
fw_paramsndarray (x, y, z, 13)

Matrix containing in the last dimension the free water model parameters in the following order:

  1. Three diffusion tensor’s eigenvalues

  2. Three lines of the eigenvector matrix each containing the first, second and third coordinates of the eigenvector

  3. The volume fraction of the free water compartment.

References

nls_iter#

dipy.reconst.fwdti.nls_iter(design_matrix, sig, S0, *, Diso=0.003, mdreg=0.0027, min_signal=1e-06, cholesky=False, f_transform=True, jac=False, weighting=None, sigma=None)[source]#

Applies non linear least squares fit of the water free elimination model to single voxel signals.

Parameters:
design_matrixarray (g, 7)

Design matrix holding the covariants used to solve for the regression coefficients.

sigarray (g, )

Diffusion-weighted signal for a single voxel data.

S0float

Non diffusion weighted signal (i.e. signal for b-value=0).

Disofloat, optional

Value of the free water isotropic diffusion. Default is set to 3e-3 \(mm^{2}.s^{-1}\). Please adjust this value if you are assuming different units of diffusion.

mdregfloat, optimal

DTI’s mean diffusivity regularization threshold. If standard DTI diffusion tensor’s mean diffusivity is almost near the free water diffusion value, the diffusion signal is assumed to be only free water diffusion (i.e. volume fraction will be set to 1 and tissue’s diffusion parameters are set to zero). Default md_reg is 2.7e-3 \(mm^{2}.s^{-1}\) (corresponding to 90% of the free water diffusion value).

min_signalfloat, optional

The minimum signal value. Needs to be a strictly positive number.

choleskybool, optional

If true it uses Cholesky decomposition to ensure that diffusion tensor is positive define.

f_transformbool, optional

If true, the water volume fractions is converted during the convergence procedure to ft = arcsin(2*f - 1) + pi/2, insuring f estimates between 0 and 1.

jacbool, optional

True to use the Jacobian.

weighting: str, optional

the weighting scheme to use in considering the squared-error. Default behavior is to use uniform weighting. Other options: ‘sigma’ ‘gmm’

sigma: float, optional

If the ‘sigma’ weighting scheme is used, a value of sigma needs to be provided here. According to Chang et al.[45], a good value to use is 1.5267 * std(background_noise), where background_noise is estimated from some part of the image known to contain no signal (only noise).

Returns:
All parameters estimated from the free water tensor model.
Parameters are ordered as follows:
  1. Three diffusion tensor’s eigenvalues

  2. Three lines of the eigenvector matrix each containing the first, second and third coordinates of the eigenvector

  3. The volume fraction of the free water compartment.

nls_fit_tensor#

dipy.reconst.fwdti.nls_fit_tensor(gtab, data, *, mask=None, Diso=0.003, mdreg=0.0027, min_signal=1e-06, f_transform=True, cholesky=False, jac=False, weighting=None, sigma=None)[source]#

Fit the water elimination tensor model using the non-linear least-squares.

Parameters:
gtaba GradientTable class instance

The gradient table containing diffusion acquisition parameters.

datandarray ([X, Y, Z, …], g)

Data or response variables holding the data. Note that the last dimension should contain the data. It makes no copies of data.

maskarray, optional

A boolean array used to mark the coordinates in the data that should be analyzed that has the shape data.shape[:-1]

Disofloat, optional

Value of the free water isotropic diffusion. Default is set to 3e-3 \(mm^{2}.s^{-1}\). Please adjust this value if you are assuming different units of diffusion.

mdregfloat, optimal

DTI’s mean diffusivity regularization threshold. If standard DTI diffusion tensor’s mean diffusivity is almost near the free water diffusion value, the diffusion signal is assumed to be only free water diffusion (i.e. volume fraction will be set to 1 and tissue’s diffusion parameters are set to zero). Default md_reg is 2.7e-3 \(mm^{2}.s^{-1}\) (corresponding to 90% of the free water diffusion value).

min_signalfloat, optional

The minimum signal value. Needs to be a strictly positive number.

f_transformbool, optional

If true, the water volume fractions is converted during the convergence procedure to ft = arcsin(2*f - 1) + pi/2, insuring f estimates between 0 and 1.

choleskybool, optional

If true it uses Cholesky decomposition to ensure that diffusion tensor is positive define.

jacbool, optional

True to use the Jacobian.

weighting: str, optional

the weighting scheme to use in considering the squared-error. Default behavior is to use uniform weighting. Other options: ‘sigma’ ‘gmm’

sigma: float, optional

If the ‘sigma’ weighting scheme is used, a value of sigma needs to be provided here. According to Chang et al.[45], a good value to use is 1.5267 * std(background_noise), where background_noise is estimated from some part of the image known to contain no signal (only noise).

Returns:
fw_paramsndarray (x, y, z, 13)

Matrix containing in the dimension the free water model parameters in the following order:

  1. Three diffusion tensor’s eigenvalues

  2. Three lines of the eigenvector matrix each containing the first, second and third coordinates of the eigenvector

  3. The volume fraction of the free water compartment

References

lower_triangular_to_cholesky#

dipy.reconst.fwdti.lower_triangular_to_cholesky(tensor_elements)[source]#

Performs Cholesky decomposition of the diffusion tensor

Parameters:
tensor_elementsarray (6,)

Array containing the six elements of diffusion tensor’s lower triangular.

Returns:
cholesky_elementsarray (6,)

Array containing the six Cholesky’s decomposition elements (R0, R1, R2, R3, R4, R5) [51].

References

cholesky_to_lower_triangular#

dipy.reconst.fwdti.cholesky_to_lower_triangular(R)[source]#

Convert Cholesky decomposition elements to the diffusion tensor elements

Parameters:
Rarray (6,)

Array containing the six Cholesky’s decomposition elements (R0, R1, R2, R3, R4, R5) [51].

Returns:
tensor_elementsarray (6,)

Array containing the six elements of diffusion tensor’s lower triangular.

References

GeneralizedQSamplingModel#

class dipy.reconst.gqi.GeneralizedQSamplingModel(gtab, *, method='gqi2', sampling_length=1.2, normalize_peaks=False)[source]#

Bases: OdfModel, Cache

Methods

cache_clear()

Clear the cache.

cache_get(tag, key, *[, default])

Retrieve a value from the cache.

cache_set(tag, key, value)

Store a value in the cache.

fit(data, *[, mask])

Fit method for every voxel in data

fit(data, *, mask=None, **kwargs)#

Fit method for every voxel in data

GeneralizedQSamplingFit#

class dipy.reconst.gqi.GeneralizedQSamplingFit(model, data)[source]#

Bases: OdfFit

Methods

odf(sphere)

Calculates the discrete ODF for a given discrete sphere.

odf(sphere)[source]#

Calculates the discrete ODF for a given discrete sphere.

normalize_qa#

dipy.reconst.gqi.normalize_qa(qa, *, max_qa=None)[source]#

Normalize quantitative anisotropy.

Used mostly with GQI rather than GQI2.

Parameters:
qaarray, shape (X, Y, Z, N)

where N is the maximum number of peaks stored

max_qafloat,

maximum qa value. Usually found in the CSF (corticospinal fluid).

Returns:
nqaarray, shape (x, Y, Z, N)

normalized quantitative anisotropy

Notes

Normalized quantitative anisotropy has the very useful property to be very small near gray matter and background areas. Therefore, it can be used to mask out white matter areas.

squared_radial_component#

dipy.reconst.gqi.squared_radial_component(x, *, tol=0.01)[source]#

Part of the GQI2 integral

Eq.8 in the referenced paper by Yeh et al.[52].

References

npa#

dipy.reconst.gqi.npa(self, odf, *, width=5)[source]#

non-parametric anisotropy

Nimmo-Smith et al. ISMRM 2011

equatorial_zone_vertices#

dipy.reconst.gqi.equatorial_zone_vertices(vertices, pole, *, width=5)[source]#

finds the ‘vertices’ in the equatorial zone conjugate to ‘pole’ with width half ‘width’ degrees

polar_zone_vertices#

dipy.reconst.gqi.polar_zone_vertices(vertices, pole, *, width=5)[source]#

finds the ‘vertices’ in the equatorial band around the ‘pole’ of radius ‘width’ degrees

upper_hemi_map#

dipy.reconst.gqi.upper_hemi_map(v)[source]#

maps a 3-vector into the z-upper hemisphere

equatorial_maximum#

dipy.reconst.gqi.equatorial_maximum(vertices, odf, pole, width)[source]#

patch_vertices#

dipy.reconst.gqi.patch_vertices(vertices, pole, width)[source]#

find ‘vertices’ within the cone of ‘width’ degrees around ‘pole’

patch_maximum#

dipy.reconst.gqi.patch_maximum(vertices, odf, pole, width)[source]#

odf_sum#

dipy.reconst.gqi.odf_sum(odf)[source]#

patch_sum#

dipy.reconst.gqi.patch_sum(vertices, odf, pole, width)[source]#

triple_odf_maxima#

dipy.reconst.gqi.triple_odf_maxima(vertices, odf, width)[source]#

IvimModelTRR#

class dipy.reconst.ivim.IvimModelTRR(gtab, *, split_b_D=400.0, split_b_S0=200.0, bounds=None, two_stage=True, tol=1e-15, x_scale=(1000.0, 0.1, 0.001, 0.0001), gtol=1e-15, ftol=1e-15, eps=1e-15, maxiter=1000)[source]#

Bases: ReconstModel

Ivim model

Methods

estimate_f_D_star(params_f_D_star, data, S0, D)

Estimate f and D_star using the values of all the other parameters obtained from a linear fit.

estimate_linear_fit(data, split_b, *[, ...])

Estimate a linear fit by taking log of data.

fit(data, *[, mask])

Fit method for every voxel in data

predict(ivim_params, gtab, *[, S0])

Predict a signal for this IvimModel class instance given parameters.

estimate_f_D_star(params_f_D_star, data, S0, D)[source]#

Estimate f and D_star using the values of all the other parameters obtained from a linear fit.

Parameters:
params_f_D_star: array

An array containing the value of f and D_star.

dataarray

Array containing the actual signal values.

S0float

The parameters S0 obtained from a linear fit.

Dfloat

The parameters D obtained from a linear fit.

Returns:
ffloat

Perfusion fraction estimated from the fit.

D_star

The value of D_star estimated from the fit.

estimate_linear_fit(data, split_b, *, less_than=True)[source]#

Estimate a linear fit by taking log of data.

Parameters:
dataarray

An array containing the data to be fit

split_bfloat

The b value to split the data

less_thanbool

If True, splitting occurs for bvalues less than split_b

Returns:
S0float

The estimated S0 value. (intercept)

Dfloat

The estimated value of D.

fit(data, *, mask=None, **kwargs)#

Fit method for every voxel in data

predict(ivim_params, gtab, *, S0=1.0)[source]#

Predict a signal for this IvimModel class instance given parameters.

Parameters:
ivim_paramsarray

The ivim parameters as an array [S0, f, D_star and D]

gtabGradientTable class instance

Gradient directions and bvalues.

S0float, optional

This has been added just for consistency with the existing API. Unlike other models, IVIM predicts S0 and this is over written by the S0 value in params.

Returns:
ivim_signalarray

The predicted IVIM signal using given parameters.

IvimModelVP#

class dipy.reconst.ivim.IvimModelVP(gtab, *, bounds=None, maxiter=10, xtol=1e-08)[source]#

Bases: ReconstModel

Methods

cvx_fit(signal, phi)

Performs the constrained search for the linear parameters f after the estimation of x is done.

fit(data, *[, mask])

Fit method for every voxel in data

ivim_mix_cost_one(phi, signal)

Constructs the objective for the :func: stoc_search_cost.

nlls_cost(x_f, signal)

Cost function for the least square problem.

phi(x)

Creates a structure for the combining the diffusion and pseudo- diffusion by multiplying with the bvals and then exponentiating each of the two components for fitting as per the IVIM- two compartment model.

stoc_search_cost(x, signal)

Cost function for differential evolution algorithm.

x_and_f_to_x_f(x, f)

Combines the array of parameters 'x' and 'f' into x_f for performing NLLS on the final stage of optimization.

x_f_to_x_and_f(x_f)

Splits the array of parameters in x_f to 'x' and 'f' for performing a search on the both of them independently using the Trust Region Method.

cvx_fit(signal, phi)[source]#

Performs the constrained search for the linear parameters f after the estimation of x is done. Estimation of the linear parameters f is a constrained linear least-squares optimization problem solved by using a convex optimizer from cvxpy. The IVIM equation contains two parameters that depend on the same volume fraction. Both are estimated as separately in the convex optimizer.

Parameters:
phiarray

Returns an array calculated from :func: phi.

signalarray

The signal values measured for this model.

Returns:
f1, f2 (volume fractions)

Notes

cost function for differential evolution algorithm:

\[minimize(norm((signal)- (phi*f)))\]
fit(data, *, mask=None, **kwargs)#

Fit method for every voxel in data

ivim_mix_cost_one(phi, signal)[source]#

Constructs the objective for the :func: stoc_search_cost.

First calculates the Moore-Penrose inverse of the input phi and takes a dot product with the measured signal. The result obtained is again multiplied with phi to complete the projection of the variable into a transformed space. (see [53] and [54] for thorough discussion on Variable Projections and relevant cost functions).

Parameters:
phiarray

Returns an array calculated from :func: Phi.

signalarray

The signal values measured for this model.

Returns:
(signal - S)^T(signal - S)

Notes

to make cost function for Differential Evolution algorithm: .. math:

(signal -  S)^T(signal -  S)

References

nlls_cost(x_f, signal)[source]#

Cost function for the least square problem. The cost function is used in the Least Squares function of SciPy in :func: fit. It guarantees that stopping point of the algorithm is at least a stationary point with reduction in the number of iterations required by the differential evolution optimizer.

Parameters:
x_farray

Contains the parameters ‘x’ and ‘f’ combines in the same array.

signalarray

The signal values measured for this model.

Returns:
sum{(signal - phi*f)^2}

Notes

cost function for the least square problem.

\[sum{(signal - phi*f)^2}\]
phi(x)[source]#

Creates a structure for the combining the diffusion and pseudo- diffusion by multiplying with the bvals and then exponentiating each of the two components for fitting as per the IVIM- two compartment model.

Parameters:
xarray

input from the Differential Evolution optimizer.

Returns:
exp_phi1array

Combined array of parameters perfusion/pseudo-diffusion and diffusion parameters.

stoc_search_cost(x, signal)[source]#

Cost function for differential evolution algorithm. Performs a stochastic search for the non-linear parameters ‘x’. The objective function is calculated in the :func: ivim_mix_cost_one. The function constructs the parameters using :func: phi.

Parameters:
xarray

input from the Differential Evolution optimizer.

signalarray

The signal values measured for this model.

Returns:
func:

ivim_mix_cost_one ..

x_and_f_to_x_f(x, f)[source]#

Combines the array of parameters ‘x’ and ‘f’ into x_f for performing NLLS on the final stage of optimization.

Parameters:
x, farray

Split parameters into two separate arrays

Returns:
x_farray

Combined array of parameters ‘x’ and ‘f’ parameters.

x_f_to_x_and_f(x_f)[source]#

Splits the array of parameters in x_f to ‘x’ and ‘f’ for performing a search on the both of them independently using the Trust Region Method.

Parameters:
x_farray

Combined array of parameters ‘x’ and ‘f’ parameters.

Returns:
x, farray

Split parameters into two separate arrays

IvimFit#

class dipy.reconst.ivim.IvimFit(model, model_params)[source]#

Bases: object

Attributes:
D
D_star
S0_predicted
perfusion_fraction
shape

Methods

predict(gtab, *[, S0])

Given a model fit, predict the signal.

property D#
property D_star#
property S0_predicted#
property perfusion_fraction#
predict(gtab, *, S0=1.0)[source]#

Given a model fit, predict the signal.

Parameters:
gtabGradientTable class instance

Gradient directions and bvalues

S0float

S0 value here is not necessary and will not be used to predict the signal. It has been added to conform to the structure of the predict method in multi_voxel which requires a keyword argument S0.

Returns:
signalarray

The signal values predicted for this model using its parameters.

property shape#

ivim_prediction#

dipy.reconst.ivim.ivim_prediction(params, gtab)[source]#

The Intravoxel incoherent motion (IVIM) model function.

Parameters:
paramsarray

An array of IVIM parameters - [S0, f, D_star, D].

gtabGradientTable class instance

Gradient directions and bvalues.

S0float, optional

This has been added just for consistency with the existing API. Unlike other models, IVIM predicts S0 and this is over written by the S0 value in params.

Returns:
Sarray

An array containing the IVIM signal estimated using given parameters.

f_D_star_prediction#

dipy.reconst.ivim.f_D_star_prediction(params, gtab, S0, D)[source]#

Function used to predict IVIM signal when S0 and D are known by considering f and D_star as the unknown parameters.

Parameters:
paramsarray

The value of f and D_star.

gtabGradientTable class instance

Gradient directions and bvalues.

S0float

The parameters S0 obtained from a linear fit.

Dfloat

The parameters D obtained from a linear fit.

Returns:
Sarray

An array containing the IVIM signal estimated using given parameters.

f_D_star_error#

dipy.reconst.ivim.f_D_star_error(params, gtab, signal, S0, D)[source]#

Error function used to fit f and D_star keeping S0 and D fixed

Parameters:
paramsarray

The value of f and D_star.

gtabGradientTable class instance

Gradient directions and bvalues.

signalarray

Array containing the actual signal values.

S0float

The parameters S0 obtained from a linear fit.

Dfloat

The parameters D obtained from a linear fit.

Returns:
residualarray

An array containing the difference of actual and estimated signal.

ivim_model_selector#

dipy.reconst.ivim.ivim_model_selector(gtab, *, fit_method='trr', **kwargs)[source]#

Selector function to switch between the 2-stage Trust-Region Reflective based NLLS fitting method (also containing the linear fit): trr and the Variable Projections based fitting method: varpro.

Parameters:
fit_methodstring, optional

The value fit_method can either be ‘trr’ or ‘varpro’. default : trr

MapmriModel#

class dipy.reconst.mapmri.MapmriModel(gtab, *, radial_order=6, laplacian_regularization=True, laplacian_weighting=0.2, positivity_constraint=False, global_constraints=False, pos_grid=15, pos_radius='adaptive', anisotropic_scaling=True, eigenvalue_threshold=0.0001, bval_threshold=inf, dti_scale_estimation=True, static_diffusivity=0.0007, cvxpy_solver=None)[source]#

Bases: ReconstModel, Cache

Mean Apparent Propagator MRI (MAPMRI) of the diffusion signal.

The main idea in MAPMRI footcite:p:Ozarslan2013 is to model the diffusion signal as a linear combination of the continuous functions presented in footcite:p:Ozarslan2008 but extending it in three dimensions.

The main difference with the SHORE proposed in footcite:p:Merlet2013 is that MAPMRI 3D extension is provided using a set of three basis functions for the radial part, one for the signal along x, one for y and one for z, while footcite:p:Merlet2013 uses one basis function to model the radial part and real Spherical Harmonics to model the angular part.

From the MAPMRI coefficients is possible to use the analytical formulae to estimate the ODF.

See [55] for additional tissue microstructure insights provided by MAPMRI.

See also footcite:p:Fick2016b, footcite:p:Cheng2012, footcite:p:Hosseinbor2013, footcite:p:Craven1979, and footcite:p:DelaHaije2020 for additional insight into to the model.

Methods

cache_clear()

Clear the cache.

cache_get(tag, key, *[, default])

Retrieve a value from the cache.

cache_set(tag, key, value)

Store a value in the cache.

fit(data, *[, mask])

Fit method for every voxel in data

References

fit(data, *, mask=None, **kwargs)#

Fit method for every voxel in data

MapmriFit#

class dipy.reconst.mapmri.MapmriFit(model, mapmri_coef, mu, R, lopt, *, errorcode=0)[source]#

Bases: ReconstFit

Attributes:
mapmri_R

The MAPMRI rotation matrix

mapmri_coeff

The MAPMRI coefficients

mapmri_mu

The MAPMRI scale factors

Methods

fitted_signal(*[, gtab])

Recovers the fitted signal for the given gradient table.

msd()

Calculates the analytical Mean Squared Displacement (MSD).

ng()

Calculates the analytical non-Gaussiannity (NG).

ng_parallel()

Calculates the analytical parallel non-Gaussiannity (NG).

ng_perpendicular()

Calculates the analytical perpendicular non-Gaussiannity (NG)

norm_of_laplacian_signal()

Calculates the norm of the laplacian of the fitted signal.

odf(sphere, *[, s])

Calculates the analytical Orientation Distribution Function (ODF) from the signal.

odf_sh(*[, s])

Calculates the real analytical odf for a given discrete sphere.

pdf(r_points)

Diffusion propagator on a given set of real points.

predict(qvals_or_gtab, *[, S0])

Recovers the reconstructed signal for any qvalue array or gradient table.

qiv()

Calculates the analytical Q-space Inverse Variance (QIV).

rtap()

Calculates the analytical return to the axis probability (RTAP).

rtop()

Calculates the analytical return to the origin probability (RTOP).

rtpp()

Calculates the analytical return to the plane probability (RTPP).

fitted_signal(*, gtab=None)[source]#

Recovers the fitted signal for the given gradient table. If no gradient table is given it recovers the signal for the gtab of the model object.

property mapmri_R#

The MAPMRI rotation matrix

property mapmri_coeff#

The MAPMRI coefficients

property mapmri_mu#

The MAPMRI scale factors

msd()[source]#

Calculates the analytical Mean Squared Displacement (MSD).

It is defined as the Laplacian of the origin of the estimated signal [56]. The analytical formula for the MAP-MRI basis was derived in [57] eq. (C13, D1).

References

ng()[source]#

Calculates the analytical non-Gaussiannity (NG).

For the NG to be meaningful the mapmri scale factors must be estimated only on data representing Gaussian diffusion of spins, i.e., bvals smaller than about 2000 s/mm^2 [55].

See [58] for a definition of the metric.

References

ng_parallel()[source]#

Calculates the analytical parallel non-Gaussiannity (NG).

For the NG to be meaningful the mapmri scale factors must be estimated only on data representing Gaussian diffusion of spins, i.e., bvals smaller than about 2000 s/mm^2 [55].

See [58] for a definition of the metric.

References

ng_perpendicular()[source]#

Calculates the analytical perpendicular non-Gaussiannity (NG)

For the NG to be meaningful the mapmri scale factors must be estimated only on data representing Gaussian diffusion of spins, i.e., bvals smaller than about 2000 s/mm^2 [55].

See [58] for a definition of the metric.

References

norm_of_laplacian_signal()[source]#

Calculates the norm of the laplacian of the fitted signal.

This information could be useful to assess if the extrapolation of the fitted signal contains spurious oscillations. A high laplacian may indicate that these are present, and any q-space indices that use integrals of the signal may be corrupted (e.g. RTOP, RTAP, RTPP, QIV).

See [57] for a definition of the metric.

References

odf(sphere, *, s=2)[source]#

Calculates the analytical Orientation Distribution Function (ODF) from the signal.

See [58] Eq. (32).

Parameters:
sphereSphere

A Sphere instance with vertices, edges and faces attributes.

sunsigned int

radial moment of the ODF

References

odf_sh(*, s=2)[source]#

Calculates the real analytical odf for a given discrete sphere.

Computes the design matrix of the ODF for the given sphere vertices and radial moment [58] eq. (32). The radial moment s acts as a sharpening method. The analytical equation for the spherical ODF basis is given in [57] eq. (C8).

References

pdf(r_points)[source]#

Diffusion propagator on a given set of real points. if the array r_points is non writeable, then intermediate results are cached for faster recalculation

predict(qvals_or_gtab, *, S0=100.0)[source]#

Recovers the reconstructed signal for any qvalue array or gradient table.

qiv()[source]#

Calculates the analytical Q-space Inverse Variance (QIV).

It is defined as the inverse of the Laplacian of the origin of the estimated propagator [59] eq. (22). The analytical formula for the MAP-MRI basis was derived in [57] eq. (C14, D2).

References

rtap()[source]#

Calculates the analytical return to the axis probability (RTAP).

RTAP is defined in [58] eq. (40, 44a). The analytical formula for the isotropic MAP-MRI basis was derived in [57] eq. (C11).

References

rtop()[source]#

Calculates the analytical return to the origin probability (RTOP).

RTOP is defined in [58] eq. (36, 43). The analytical formula for the isotropic MAP-MRI basis was derived in [57] eq. (C11).

References

rtpp()[source]#

Calculates the analytical return to the plane probability (RTPP).

RTPP is defined in [58] eq. (42). The analytical formula for the isotropic MAP-MRI basis was derived in [57] eq. (C11).

References

isotropic_scale_factor#

dipy.reconst.mapmri.isotropic_scale_factor(mu_squared)[source]#

Estimated isotropic scaling factor.

See [58] Eq. (49).

Parameters:
mu_squaredarray, shape (N,3)

squared scale factors of mapmri basis in x, y, z

Returns:
u0float

closest isotropic scale factor for the isotropic basis

References

mapmri_index_matrix#

dipy.reconst.mapmri.mapmri_index_matrix(radial_order)[source]#

Calculates the indices for the MAPMRI basis in x, y and z.

See [58] for a definition of MAPMRI.

Parameters:
radial_orderunsigned int

radial order of MAPMRI basis

Returns:
index_matrixarray, shape (N,3)

ordering of the basis in x, y, z

References

b_mat#

dipy.reconst.mapmri.b_mat(index_matrix)[source]#

Calculates the B coefficients from

See [58] Eq. (27).

Parameters:
index_matrixarray, shape (N,3)

ordering of the basis in x, y, z

Returns:
Barray, shape (N,)

B coefficients for the basis

References

b_mat_isotropic#

dipy.reconst.mapmri.b_mat_isotropic(index_matrix)[source]#

Calculates the isotropic B coefficients.

See [58] Fig 8.

Parameters:
index_matrixarray, shape (N,3)

ordering of the isotropic basis in j, l, m

Returns:
Barray, shape (N,)

B coefficients for the isotropic basis

References

mapmri_phi_1d#

dipy.reconst.mapmri.mapmri_phi_1d(n, q, mu)[source]#

One dimensional MAPMRI basis function.

See [58] Eq. (4).

Parameters:
nunsigned int

order of the basis

qarray, shape (N,)

points in the q-space in which evaluate the basis

mufloat

scale factor of the basis

References

mapmri_phi_matrix#

dipy.reconst.mapmri.mapmri_phi_matrix(radial_order, mu, q_gradients)[source]#

Compute the MAPMRI phi matrix for the signal.

See [58] eq. (23).

Parameters:
radial_orderunsigned int,

an even integer that represent the order of the basis

muarray, shape (3,)

scale factors of the basis for x, y, z

q_gradientsarray, shape (N,3)

points in the q-space in which evaluate the basis

References

mapmri_psi_1d#

dipy.reconst.mapmri.mapmri_psi_1d(n, x, mu)[source]#

One dimensional MAPMRI propagator basis function.

See [58] Eq. (10).

Parameters:
nunsigned int

order of the basis

xarray, shape (N,)

points in the r-space in which evaluate the basis

mufloat

scale factor of the basis

References

mapmri_psi_matrix#

dipy.reconst.mapmri.mapmri_psi_matrix(radial_order, mu, rgrad)[source]#

Compute the MAPMRI psi matrix for the propagator.

See [58] eq. (22).

Parameters:
radial_orderunsigned int,

an even integer that represent the order of the basis

muarray, shape (3,)

scale factors of the basis for x, y, z

rgradarray, shape (N,3)

points in the r-space in which evaluate the EAP

References

mapmri_odf_matrix#

dipy.reconst.mapmri.mapmri_odf_matrix(radial_order, mu, s, vertices)[source]#

Compute the MAPMRI ODF matrix.

See [58] Eq. (33).

Parameters:
radial_orderunsigned int,

an even integer that represent the order of the basis

muarray, shape (3,)

scale factors of the basis for x, y, z

sunsigned int

radial moment of the ODF

verticesarray, shape (N,3)

points of the sphere shell in the r-space in which evaluate the ODF

References

mapmri_isotropic_phi_matrix#

dipy.reconst.mapmri.mapmri_isotropic_phi_matrix(radial_order, mu, q)[source]#

Three dimensional isotropic MAPMRI signal basis function

See [58] Eq. (61).

Parameters:
radial_orderunsigned int,

radial order of the mapmri basis.

mufloat,

positive isotropic scale factor of the basis

qarray, shape (N,3)

points in the q-space in which evaluate the basis

References

mapmri_isotropic_radial_signal_basis#

dipy.reconst.mapmri.mapmri_isotropic_radial_signal_basis(j, l_value, mu, qval)[source]#

Radial part of the isotropic 1D-SHORE signal basis.

See [58] eq. (61).

Parameters:
junsigned int,

a positive integer related to the radial order

l_valueunsigned int,

the spherical harmonic order (l)

mufloat,

isotropic scale factor of the basis

qvalfloat,

points in the q-space in which evaluate the basis

References

mapmri_isotropic_M_mu_independent#

dipy.reconst.mapmri.mapmri_isotropic_M_mu_independent(radial_order, q)[source]#

Computed the mu independent part of the signal design matrix.

mapmri_isotropic_M_mu_dependent#

dipy.reconst.mapmri.mapmri_isotropic_M_mu_dependent(radial_order, mu, qval)[source]#

Computed the mu dependent part of the signal design matrix.

mapmri_isotropic_psi_matrix#

dipy.reconst.mapmri.mapmri_isotropic_psi_matrix(radial_order, mu, rgrad)[source]#

Three dimensional isotropic MAPMRI propagator basis function.

See [58] Eq. (61).

Parameters:
radial_orderunsigned int,

radial order of the mapmri basis.

mufloat,

positive isotropic scale factor of the basis

rgradarray, shape (N,3)

points in the r-space in which evaluate the basis

References

mapmri_isotropic_radial_pdf_basis#

dipy.reconst.mapmri.mapmri_isotropic_radial_pdf_basis(j, l_value, mu, r)[source]#

Radial part of the isotropic 1D-SHORE propagator basis.

See [58] eq. (61).

Parameters:
junsigned int,

a positive integer related to the radial order

l_valueunsigned int,

the spherical harmonic order (l)

mufloat,

isotropic scale factor of the basis

rfloat,

points in the r-space in which evaluate the basis

References

mapmri_isotropic_K_mu_independent#

dipy.reconst.mapmri.mapmri_isotropic_K_mu_independent(radial_order, rgrad)[source]#

Computes mu independent part of K. Same trick as with M.

mapmri_isotropic_K_mu_dependent#

dipy.reconst.mapmri.mapmri_isotropic_K_mu_dependent(radial_order, mu, rgrad)[source]#

Computes mu dependent part of M. Same trick as with M.

binomialfloat#

dipy.reconst.mapmri.binomialfloat(n, k)[source]#

Custom Binomial function

mapmri_isotropic_odf_matrix#

dipy.reconst.mapmri.mapmri_isotropic_odf_matrix(radial_order, mu, s, vertices)[source]#

Compute the isotropic MAPMRI ODF matrix.

The computation follows [58] Eq. 32, but it is done for the isotropic propagator in footcite:p:Ozarslan2013 eq. (60). Analytical derivation in [57] eq. (C8).

Parameters:
radial_orderunsigned int,

an even integer that represent the order of the basis

mufloat,

isotropic scale factor of the isotropic MAP-MRI basis

sunsigned int

radial moment of the ODF

verticesarray, shape (N,3)

points of the sphere shell in the r-space in which evaluate the ODF

Returns:
odf_matMatrix, shape (N_vertices, N_mapmri_coef)

ODF design matrix to discrete sphere function

References

mapmri_isotropic_odf_sh_matrix#

dipy.reconst.mapmri.mapmri_isotropic_odf_sh_matrix(radial_order, mu, s)[source]#

Compute the isotropic MAPMRI ODF matrix.

The computation follows [58] Eq. 32, but it is done for the isotropic propagator in [58] eq. (60). Here we do not compute the sphere function but the spherical harmonics by only integrating the radial part of the propagator. We use the same derivation of the ODF in the isotropic implementation as in [57] eq. (C8).

Parameters:
radial_orderunsigned int,

an even integer that represent the order of the basis

mufloat,

isotropic scale factor of the isotropic MAP-MRI basis

sunsigned int

radial moment of the ODF

Returns:
odf_sh_matMatrix, shape (N_sh_coef, N_mapmri_coef)

ODF design matrix to spherical harmonics

References

mapmri_isotropic_laplacian_reg_matrix#

dipy.reconst.mapmri.mapmri_isotropic_laplacian_reg_matrix(radial_order, mu)[source]#

Computes the Laplacian regularization matrix for MAP-MRI’s isotropic implementation.

See [57] eq. (C7).

Parameters:
radial_orderunsigned int,

an even integer that represent the order of the basis

mufloat,

isotropic scale factor of the isotropic MAP-MRI basis

Returns:
LRMatrix, shape (N_coef, N_coef)

Laplacian regularization matrix

References

mapmri_isotropic_laplacian_reg_matrix_from_index_matrix#

dipy.reconst.mapmri.mapmri_isotropic_laplacian_reg_matrix_from_index_matrix(ind_mat, mu)[source]#

Computes the Laplacian regularization matrix for MAP-MRI’s isotropic implementation.

See [57] eq. (C7).

Parameters:
ind_matmatrix (N_coef, 3),

Basis order matrix

mufloat,

isotropic scale factor of the isotropic MAP-MRI basis

Returns:
LRMatrix, shape (N_coef, N_coef)

Laplacian regularization matrix

References

mapmri_isotropic_index_matrix#

dipy.reconst.mapmri.mapmri_isotropic_index_matrix(radial_order)[source]#

Calculates the indices for the isotropic MAPMRI basis.

See [58] Fig 8.

Parameters:
radial_orderunsigned int

radial order of isotropic MAPMRI basis

Returns:
index_matrixarray, shape (N,3)

ordering of the basis in x, y, z

References

create_rspace#

dipy.reconst.mapmri.create_rspace(gridsize, radius_max)[source]#

Create the real space table, that contains the points in which to compute the pdf.

Parameters:
gridsizeunsigned int

dimension of the propagator grid

radius_maxfloat

maximal radius in which compute the propagator

Returns:
tabarray, shape (N,3)

real space points in which calculates the pdf

delta#

dipy.reconst.mapmri.delta(n, m)[source]#

map_laplace_u#

dipy.reconst.mapmri.map_laplace_u(n, m)[source]#

S(n, m) static matrix for Laplacian regularization.

See [57] eq. (13).

Parameters:
n, munsigned int

basis order of the MAP-MRI basis in different directions

Returns:
Ufloat,

Analytical integral of \(\phi_n(q) * \phi_m(q)\)

References

map_laplace_t#

dipy.reconst.mapmri.map_laplace_t(n, m)[source]#

L(m, n) static matrix for Laplacian regularization.

See [57] eq. (12).

Parameters:
n, munsigned int

basis order of the MAP-MRI basis in different directions

Returns:
Tfloat

Analytical integral of \(\phi_n(q) * \phi_m''(q)\)

References

map_laplace_s#

dipy.reconst.mapmri.map_laplace_s(n, m)[source]#

R(m,n) static matrix for Laplacian regularization.

See [57] eq. (11).

Parameters:
n, munsigned int

basis order of the MAP-MRI basis in different directions

Returns:
Sfloat

Analytical integral of \(\phi_n''(q) * \phi_m''(q)\)

References

mapmri_STU_reg_matrices#

dipy.reconst.mapmri.mapmri_STU_reg_matrices(radial_order)[source]#

Generate the static portions of the Laplacian regularization matrix.

See [57] eq. (11, 12, 13).

Parameters:
radial_orderunsigned int,

an even integer that represent the order of the basis

Returns:
S, T, UMatrices, shape (N_coef,N_coef)

Regularization submatrices

References

mapmri_laplacian_reg_matrix#

dipy.reconst.mapmri.mapmri_laplacian_reg_matrix(ind_mat, mu, S_mat, T_mat, U_mat)[source]#

Put the Laplacian regularization matrix together.

See [57] eq. (10).

The static parts in S, T and U are multiplied and divided by the voxel-specific scale factors.

Parameters:
ind_matmatrix (N_coef, 3),

Basis order matrix

muarray, shape (3,)

scale factors of the basis for x, y, z

S, T, Umatrices, shape (N_coef,N_coef)

Regularization submatrices

Returns:
LRmatrix (N_coef, N_coef),

Voxel-specific Laplacian regularization matrix

References

generalized_crossvalidation_array#

dipy.reconst.mapmri.generalized_crossvalidation_array(data, M, LR, *, weights_array=None)[source]#

Generalized Cross Validation Function.

See [57] eq. (15).

Here weights_array is a numpy array with all values that should be considered in the GCV. It will run through the weights until the cost function starts to increase, then stop and take the last value as the optimum weight.

Parameters:
dataarray (N),

Basis order matrix

Mmatrix, shape (N, Ncoef)

mapmri observation matrix

LRmatrix, shape (N_coef, N_coef)

regularization matrix

weights_arrayarray (N_of_weights)

array of optional regularization weights

References

generalized_crossvalidation#

dipy.reconst.mapmri.generalized_crossvalidation(data, M, LR, *, gcv_startpoint=0.05)[source]#

Generalized Cross Validation Function.

Finds optimal regularization weight based on generalized cross-validation.

See [60] eq. (15).

Parameters:
dataarray (N),

data array

Mmatrix, shape (N, Ncoef)

mapmri observation matrix

LRmatrix, shape (N_coef, N_coef)

regularization matrix

gcv_startpointfloat

startpoint for the gcv optimization

Returns:
optimal_lambdafloat,

optimal regularization weight

References

gcv_cost_function#

dipy.reconst.mapmri.gcv_cost_function(weight, args)[source]#

The GCV cost function that is iterated.

See [57] for further details about the method.

References

MultiShellResponse#

class dipy.reconst.mcsd.MultiShellResponse(response, sh_order_max, shells, *, S0=None)[source]#

Bases: object

Attributes:
iso
property iso#

MultiShellDeconvModel#

class dipy.reconst.mcsd.MultiShellDeconvModel(gtab, response, reg_sphere=<dipy.core.sphere.HemiSphere object>, *, sh_order_max=8, iso=2, tol=20)[source]#

Bases: SphHarmModel

Methods

cache_clear()

Clear the cache.

cache_get(tag, key, *[, default])

Retrieve a value from the cache.

cache_set(tag, key, value)

Store a value in the cache.

fit(data, *[, mask])

Fit method for every voxel in data

predict(params, *[, gtab, S0])

Compute a signal prediction given spherical harmonic coefficients for the provided GradientTable class instance.

sampling_matrix(sphere)

The matrix needed to sample ODFs from coefficients of the model.

fit(data, *, mask=None, **kwargs)#

Fit method for every voxel in data

predict(params, *, gtab=None, S0=None)[source]#

Compute a signal prediction given spherical harmonic coefficients for the provided GradientTable class instance.

Parameters:
paramsndarray

The spherical harmonic representation of the FOD from which to make the signal prediction.

gtabGradientTable

The gradients for which the signal will be predicted. Use the model’s gradient table by default.

S0ndarray or float

The non diffusion-weighted signal value.

MSDeconvFit#

class dipy.reconst.mcsd.MSDeconvFit(model, coeff, mask)[source]#

Bases: SphHarmFit

Attributes:
all_shm_coeff
shape
shm_coeff

The spherical harmonic coefficients of the odf

volume_fractions

Methods

odf(sphere)

Samples the odf function on the points of a sphere

predict(*[, gtab, S0])

Predict the diffusion signal from the model coefficients.

gfa

property all_shm_coeff#
property shm_coeff#

The spherical harmonic coefficients of the odf

Make this a property for now, if there is a use case for modifying the coefficients we can add a setter or expose the coefficients more directly

property volume_fractions#

QpFitter#

class dipy.reconst.mcsd.QpFitter(X, reg)[source]#

Bases: object

Methods

__call__(signal)

Call self as a function.

multi_tissue_basis#

dipy.reconst.mcsd.multi_tissue_basis(gtab, sh_order_max, iso_comp)[source]#

Builds a basis for multi-shell multi-tissue CSD model.

Parameters:
gtabGradientTable

Gradient table.

sh_order_maxint

Maximal spherical harmonics order (l).

iso_comp: int

Number of tissue compartments for running the MSMT-CSD. Minimum number of compartments required is 2.

Returns:
Bndarray

Matrix of the spherical harmonics model used to fit the data

m_valuesint |m_value| <= l_value

The phase factor (\(m\)) of the harmonic.

l_valuesint l_value >= 0

The order (\(l\)) of the harmonic.

solve_qp#

dipy.reconst.mcsd.solve_qp(P, Q, G, H)[source]#

Helper function to set up and solve the Quadratic Program (QP) in CVXPY. A QP problem has the following form: minimize 1/2 x’ P x + Q’ x subject to G x <= H

Here the QP solver is based on CVXPY and uses OSQP.

Parameters:
Pndarray

n x n matrix for the primal QP objective function.

Qndarray

n x 1 matrix for the primal QP objective function.

Gndarray

m x n matrix for the inequality constraint.

Hndarray

m x 1 matrix for the inequality constraint.

Returns:
xarray

Optimal solution to the QP problem.

multi_shell_fiber_response#

dipy.reconst.mcsd.multi_shell_fiber_response(sh_order_max, bvals, wm_rf, gm_rf, csf_rf, *, sphere=None, tol=20, btens=None)[source]#

Fiber response function estimation for multi-shell data.

Parameters:
sh_order_maxint

Maximum spherical harmonics order (l).

bvalsndarray

Array containing the b-values. Must be unique b-values, like outputted by dipy.core.gradients.unique_bvals_tolerance.

wm_rf(N-1, 4) ndarray

Response function of the WM tissue, for each bvals, where N is the number of unique b-values including the b0.

gm_rf(N-1, 4) ndarray

Response function of the GM tissue, for each bvals.

csf_rf(N-1, 4) ndarray

Response function of the CSF tissue, for each bvals.

spheredipy.core.Sphere instance, optional

Sphere where the signal will be evaluated.

tolint, optional

Tolerance gap for b-values clustering.

btenscan be any of two options, optional
  1. an array of strings of shape (N,) specifying encoding tensor shape associated with all unique b-values separately. N corresponds to the number of unique b-values, including the b0. Options for elements in array: ‘LTE’, ‘PTE’, ‘STE’, ‘CTE’ corresponding to linear, planar, spherical, and “cigar-shaped” tensor encoding.

  2. an array of shape (N,3,3) specifying the b-tensor of each unique b-values exactly. N corresponds to the number of unique b-values, including the b0.

Returns:
MultiShellResponse

MultiShellResponse object.

mask_for_response_msmt#

dipy.reconst.mcsd.mask_for_response_msmt(gtab, data, *, roi_center=None, roi_radii=10, wm_fa_thr=0.7, gm_fa_thr=0.2, csf_fa_thr=0.1, gm_md_thr=0.0007, csf_md_thr=0.002)[source]#
Computation of masks for multi-shell multi-tissue (msmt) response

function using FA and MD.

Parameters:
gtabGradientTable

Gradient table.

datandarray

diffusion data (4D)

roi_centerarray-like, (3,)

Center of ROI in data. If center is None, it is assumed that it is the center of the volume with shape data.shape[:3].

roi_radiiint or array-like, (3,)

radii of cuboid ROI

wm_fa_thrfloat

FA threshold for WM.

gm_fa_thrfloat

FA threshold for GM.

csf_fa_thrfloat

FA threshold for CSF.

gm_md_thrfloat

MD threshold for GM.

csf_md_thrfloat

MD threshold for CSF.

Returns:
mask_wmndarray

Mask of voxels within the ROI and with FA above the FA threshold for WM.

mask_gmndarray

Mask of voxels within the ROI and with FA below the FA threshold for GM and with MD below the MD threshold for GM.

mask_csfndarray

Mask of voxels within the ROI and with FA below the FA threshold for CSF and with MD below the MD threshold for CSF.

Notes

In msmt-CSD there is an important pre-processing step: the estimation of every tissue’s response function. In order to do this, we look for voxels corresponding to WM, GM and CSF. This function aims to accomplish that by returning a mask of voxels within a ROI and who respect some threshold constraints, for each tissue. More precisely, the WM mask must have a FA value above a given threshold. The GM mask and CSF mask must have a FA below given thresholds and a MD below other thresholds. To get the FA and MD, we need to fit a Tensor model to the datasets.

response_from_mask_msmt#

dipy.reconst.mcsd.response_from_mask_msmt(gtab, data, mask_wm, mask_gm, mask_csf, *, tol=20)[source]#
Computation of multi-shell multi-tissue (msmt) response

functions from given tissues masks.

Parameters:
gtabGradientTable

Gradient table.

datandarray

diffusion data

mask_wmndarray

mask from where to compute the WM response function.

mask_gmndarray

mask from where to compute the GM response function.

mask_csfndarray

mask from where to compute the CSF response function.

tolint

tolerance gap for b-values clustering. (Default = 20)

Returns:
response_wmndarray, (len(unique_bvals_tolerance(gtab.bvals))-1, 4)

(evals, S0) for WM for each unique bvalues (except b0).

response_gmndarray, (len(unique_bvals_tolerance(gtab.bvals))-1, 4)

(evals, S0) for GM for each unique bvalues (except b0).

response_csfndarray, (len(unique_bvals_tolerance(gtab.bvals))-1, 4)

(evals, S0) for CSF for each unique bvalues (except b0).

Notes

In msmt-CSD there is an important pre-processing step: the estimation of every tissue’s response function. In order to do this, we look for voxels corresponding to WM, GM and CSF. This information can be obtained by using mcsd.mask_for_response_msmt() through masks of selected voxels. The present function uses such masks to compute the msmt response functions.

For the responses, we base our approach on the function csdeconv.response_from_mask_ssst(), with the added layers of multishell and multi-tissue (see the ssst function for more information about the computation of the ssst response function). This means that for each tissue we use the previously found masks and loop on them. For each mask, we loop on the b-values (clustered using the tolerance gap) to get many responses and then average them to get one response per tissue.

auto_response_msmt#

dipy.reconst.mcsd.auto_response_msmt(gtab, data, *, tol=20, roi_center=None, roi_radii=10, wm_fa_thr=0.7, gm_fa_thr=0.3, csf_fa_thr=0.15, gm_md_thr=0.001, csf_md_thr=0.0032)[source]#
Automatic estimation of multi-shell multi-tissue (msmt) response

functions using FA and MD.

Parameters:
gtabGradientTable

Gradient table.

datandarray

diffusion data

tolint, optional

Tolerance gap for b-values clustering.

roi_centerarray-like, (3,)

Center of ROI in data. If center is None, it is assumed that it is the center of the volume with shape data.shape[:3].

roi_radiiint or array-like, (3,)

radii of cuboid ROI

wm_fa_thrfloat

FA threshold for WM.

gm_fa_thrfloat

FA threshold for GM.

csf_fa_thrfloat

FA threshold for CSF.

gm_md_thrfloat

MD threshold for GM.

csf_md_thrfloat

MD threshold for CSF.

Returns:
response_wmndarray, (len(unique_bvals_tolerance(gtab.bvals))-1, 4)

(evals, S0) for WM for each unique bvalues (except b0).

response_gmndarray, (len(unique_bvals_tolerance(gtab.bvals))-1, 4)

(evals, S0) for GM for each unique bvalues (except b0).

response_csfndarray, (len(unique_bvals_tolerance(gtab.bvals))-1, 4)

(evals, S0) for CSF for each unique bvalues (except b0).

Notes

In msmt-CSD there is an important pre-processing step: the estimation of every tissue’s response function. In order to do this, we look for voxels corresponding to WM, GM and CSF. We get this information from mcsd.mask_for_response_msmt(), which returns masks of selected voxels (more details are available in the description of the function).

With the masks, we compute the response functions by using mcsd.response_from_mask_msmt(), which returns the response for each tissue (more details are available in the description of the function).

MeanDiffusionKurtosisModel#

class dipy.reconst.msdki.MeanDiffusionKurtosisModel(gtab, *args, bmag=None, return_S0_hat=False, **kwargs)[source]#

Bases: ReconstModel

Mean signal Diffusion Kurtosis Model

Methods

fit(data, *[, mask])

Fit method of the MSDKI model class

predict(msdki_params, *[, S0])

Predict a signal for this MeanDiffusionKurtosisModel class instance given parameters.

fit(data, *, mask=None)[source]#

Fit method of the MSDKI model class

Parameters:
datandarray ([X, Y, Z, …], g)

ndarray containing the data signals in its last dimension.

maskarray

A boolean array used to mark the coordinates in the data that should be analyzed that has the shape data.shape[:-1]

predict(msdki_params, *, S0=1.0)[source]#

Predict a signal for this MeanDiffusionKurtosisModel class instance given parameters.

See [2] for further details about the method.

Parameters:
msdki_paramsndarray

The parameters of the mean signal diffusion kurtosis model

S0float or ndarray, optional

The non diffusion-weighted signal in every voxel, or across all voxels.

Returns:
S(…, N) ndarray

Simulated mean signal based on the mean signal diffusion kurtosis model

Notes

The predicted signal is given by:

\(MS(b) = S_0 * exp(-bD + 1/6 b^{2} D^{2} K)\), where \(D\) and \(K\) are the mean signal diffusivity and mean signal kurtosis.

References

MeanDiffusionKurtosisFit#

class dipy.reconst.msdki.MeanDiffusionKurtosisFit(model, model_params, *, model_S0=None)[source]#

Bases: object

Attributes:
S0_hat

Methods

msd()

Mean signal diffusivity (MSD) calculated from the mean signal Diffusion Kurtosis Model.

msk()

Mean signal kurtosis (MSK) calculated from the mean signal Diffusion Kurtosis Model.

predict(gtab, *[, S0])

Given a mean signal diffusion kurtosis model fit, predict the signal on the vertices of a sphere

smt2di()

Computes the intrinsic diffusivity from the mean signal diffusional kurtosis parameters assuming the 2-compartmental spherical mean technique model.

smt2f()

Computes the axonal water fraction from the mean signal kurtosis assuming the 2-compartmental spherical mean technique model.

smt2uFA()

Computes the microscopic fractional anisotropy from the mean signal diffusional kurtosis parameters assuming the 2-compartmental spherical mean technique model.

property S0_hat#
msd()[source]#

Mean signal diffusivity (MSD) calculated from the mean signal Diffusion Kurtosis Model.

See [2] for further details about the method.

Returns:
msdndarray

Calculated signal mean diffusivity.

References

msk()[source]#

Mean signal kurtosis (MSK) calculated from the mean signal Diffusion Kurtosis Model.

See [2] for further details about the method.

Returns:
mskndarray

Calculated signal mean kurtosis.

References

predict(gtab, *, S0=1.0)[source]#

Given a mean signal diffusion kurtosis model fit, predict the signal on the vertices of a sphere

See [2] for further details about the method.

Parameters:
gtaba GradientTable class instance

This encodes the directions for which a prediction is made

S0float array

The mean non-diffusion weighted signal in each voxel. Default: The fitted S0 value in all voxels if it was fitted. Otherwise 1 in all voxels.

Returns:
S(…, N) ndarray

Simulated mean signal based on the mean signal kurtosis model

Notes

The predicted signal is given by: \(MS(b) = S_0 * exp(-bD + 1/6 b^{2} D^{2} K)\), where \(D\) and \(k\) are the mean signal diffusivity and mean signal kurtosis.

References

smt2di()[source]#

Computes the intrinsic diffusivity from the mean signal diffusional kurtosis parameters assuming the 2-compartmental spherical mean technique model.

See [61] and [62] for further details about the method.

Returns:
smt2dindarray

Intrinsic diffusivity computed by converting MSDKI to SMT2.

Notes

Computes the intrinsic diffusivity using equation 16 of [62].

References

smt2f()[source]#

Computes the axonal water fraction from the mean signal kurtosis assuming the 2-compartmental spherical mean technique model.

See [61] and [62] for further details about the method.

Returns:
ndarray

Axonal volume fraction calculated from MSK.

Notes

Computes the axonal water fraction from the mean signal kurtosis MSK using equation 17 of [62].

References

smt2uFA()[source]#

Computes the microscopic fractional anisotropy from the mean signal diffusional kurtosis parameters assuming the 2-compartmental spherical mean technique model.

See [61] and [62] for further details about the method.

Returns:
smt2uFAndarray

Microscopic fractional anisotropy computed by converting MSDKI to SMT2.

Notes

Computes the intrinsic diffusivity using equation 10 of [62].

References

mean_signal_bvalue#

dipy.reconst.msdki.mean_signal_bvalue(data, gtab, *, bmag=None)[source]#

Computes the average signal across different diffusion directions for each unique b-value

Parameters:
datandarray ([X, Y, Z, …], g)

ndarray containing the data signals in its last dimension.

gtaba GradientTable class instance

The gradient table containing diffusion acquisition parameters.

bmagThe order of magnitude that the bvalues have to differ to be

considered an unique b-value. Default: derive this value from the maximal b-value provided: \(bmag=log_{10}(max(bvals)) - 1\).

Returns:
msignalndarray ([X, Y, Z, …, nub])

Mean signal along all gradient directions for each unique b-value Note that the last dimension contains the signal means and nub is the number of unique b-values.

ngndarray(nub)

Number of gradient directions used to compute the mean signal for all unique b-values

Notes

This function assumes that directions are evenly sampled on the sphere or on the hemisphere

msk_from_awf#

dipy.reconst.msdki.msk_from_awf(f)[source]#

Computes mean signal kurtosis from axonal water fraction estimates of the SMT2 model

Parameters:
fndarray ([X, Y, Z, …])

ndarray containing the axonal volume fraction estimate.

Returns:
mskndarray(nub)

Mean signal kurtosis (msk)

Notes

Computes mean signal kurtosis using equations 17 of [62].

References

awf_from_msk#

dipy.reconst.msdki.awf_from_msk(msk, *, mask=None)[source]#

Computes the axonal water fraction from the mean signal kurtosis assuming the 2-compartmental spherical mean technique model.

See [61] and [62] for further details about the method.

Parameters:
mskndarray ([X, Y, Z, …])

Mean signal kurtosis (msk)

maskndarray, optional

A boolean array used to mark the coordinates in the data that should be analyzed that has the same shape of the msdki parameters

Returns:
awfndarray ([X, Y, Z, …])

ndarray containing the axonal volume fraction estimate.

Notes

Computes the axonal water fraction from the mean signal kurtosis MSK using equation 17 of [62].

References

msdki_prediction#

dipy.reconst.msdki.msdki_prediction(msdki_params, gtab, *, S0=1.0)[source]#

Predict the mean signal given the parameters of the mean signal DKI, an GradientTable object and S0 signal.

See [2] for further details about the method.

Parameters:
msdki_paramsndarray ([X, Y, Z, …], 2)

Array containing the mean signal diffusivity and mean signal kurtosis in its last axis

gtaba GradientTable class instance

The gradient table for this prediction

S0float or ndarray, optional

The non diffusion-weighted signal in every voxel, or across all voxels.

Notes

The predicted signal is given by:

\(MS(b) = S_0 * exp(-bD + 1/6 b^{2} D^{2} K)\), where \(D\) and \(K\) are the mean signal diffusivity and mean signal kurtosis.

References

wls_fit_msdki#

dipy.reconst.msdki.wls_fit_msdki(design_matrix, msignal, ng, *, mask=None, min_signal=0.0001, return_S0_hat=False)[source]#

Fits the mean signal diffusion kurtosis imaging based on a weighted least square solution.

See [2] for further details about the method.

Parameters:
design_matrixarray (nub, 3)

Design matrix holding the covariants used to solve for the regression coefficients of the mean signal diffusion kurtosis model. Note that nub is the number of unique b-values

msignalndarray ([X, Y, Z, …, nub])

Mean signal along all gradient directions for each unique b-value Note that the last dimension should contain the signal means and nub is the number of unique b-values.

ngndarray(nub)

Number of gradient directions used to compute the mean signal for all unique b-values

maskarray

A boolean array used to mark the coordinates in the data that should be analyzed that has the shape data.shape[:-1]

min_signalfloat, optional

Voxel with mean signal intensities lower than the min positive signal are not processed. Default: 0.0001

return_S0_hatbool

If True, also return S0 values for the fit.

Returns:
paramsarray (…, 2)

Containing the mean signal diffusivity and mean signal kurtosis

References

design_matrix#

dipy.reconst.msdki.design_matrix(ubvals)[source]#

Constructs design matrix for the mean signal diffusion kurtosis model

Parameters:
ubvalsarray

Containing the unique b-values of the data.

Returns:
design_matrixarray (nb, 3)

Design matrix or B matrix for the mean signal diffusion kurtosis model assuming that parameters are in the following order: design_matrix[j, :] = (msd, msk, S0)

MultiVoxelFit#

class dipy.reconst.multi_voxel.MultiVoxelFit(model, fit_array, mask)[source]#

Bases: ReconstFit

Holds an array of fits and allows access to their attributes and methods

Attributes:
shape

Methods

predict(*args, **kwargs)

Predict for the multi-voxel object using each single-object's prediction API, with S0 provided from an array.

predict(*args, **kwargs)[source]#

Predict for the multi-voxel object using each single-object’s prediction API, with S0 provided from an array.

property shape#

CallableArray#

class dipy.reconst.multi_voxel.CallableArray[source]#

Bases: ndarray

An array which can be called like a function

Attributes:
T

View of the transposed array.

base

Base object if memory is from some other object.

ctypes

An object to simplify the interaction of the array with the ctypes module.

data

Python buffer object pointing to the start of the array’s data.

device
dtype

Data-type of the array’s elements.

flags

Information about the memory layout of the array.

flat

A 1-D iterator over the array.

imag

The imaginary part of the array.

itemset
itemsize

Length of one array element in bytes.

mT

View of the matrix transposed array.

nbytes

Total bytes consumed by the elements of the array.

ndim

Number of array dimensions.

newbyteorder
ptp
real

The real part of the array.

shape

Tuple of array dimensions.

size

Number of elements in the array.

strides

Tuple of bytes to step in each dimension when traversing an array.

Methods

__call__(*args, **kwargs)

Call self as a function.

all([axis, out, keepdims, where])

Returns True if all elements evaluate to True.

any([axis, out, keepdims, where])

Returns True if any of the elements of a evaluate to True.

argmax([axis, out, keepdims])

Return indices of the maximum values along the given axis.

argmin([axis, out, keepdims])

Return indices of the minimum values along the given axis.

argpartition(kth[, axis, kind, order])

Returns the indices that would partition this array.

argsort([axis, kind, order])

Returns the indices that would sort this array.

astype(dtype[, order, casting, subok, copy])

Copy of the array, cast to a specified type.

byteswap([inplace])

Swap the bytes of the array elements

choose(choices[, out, mode])

Use an index array to construct a new array from a set of choices.

clip([min, max, out])

Return an array whose values are limited to [min, max].

compress(condition[, axis, out])

Return selected slices of this array along given axis.

conj()

Complex-conjugate all elements.

conjugate()

Return the complex conjugate, element-wise.

copy([order])

Return a copy of the array.

cumprod([axis, dtype, out])

Return the cumulative product of the elements along the given axis.

cumsum([axis, dtype, out])

Return the cumulative sum of the elements along the given axis.

diagonal([offset, axis1, axis2])

Return specified diagonals.

dump(file)

Dump a pickle of the array to the specified file.

dumps()

Returns the pickle of the array as a string.

fill(value)

Fill the array with a scalar value.

flatten([order])

Return a copy of the array collapsed into one dimension.

getfield(dtype[, offset])

Returns a field of the given array as a certain type.

item(*args)

Copy an element of an array to a standard Python scalar and return it.

max([axis, out, keepdims, initial, where])

Return the maximum along a given axis.

mean([axis, dtype, out, keepdims, where])

Returns the average of the array elements along given axis.

min([axis, out, keepdims, initial, where])

Return the minimum along a given axis.

nonzero()

Return the indices of the elements that are non-zero.

partition(kth[, axis, kind, order])

Partially sorts the elements in the array in such a way that the value of the element in k-th position is in the position it would be in a sorted array.

prod([axis, dtype, out, keepdims, initial, ...])

Return the product of the array elements over the given axis

put(indices, values[, mode])

Set a.flat[n] = values[n] for all n in indices.

ravel([order])

Return a flattened array.

repeat(repeats[, axis])

Repeat elements of an array.

reshape(shape, /, *[, order])

Returns an array containing the same data with a new shape.

resize(new_shape[, refcheck])

Change shape and size of array in-place.

round([decimals, out])

Return a with each element rounded to the given number of decimals.

searchsorted(v[, side, sorter])

Find indices where elements of v should be inserted in a to maintain order.

setfield(val, dtype[, offset])

Put a value into a specified place in a field defined by a data-type.

setflags([write, align, uic])

Set array flags WRITEABLE, ALIGNED, WRITEBACKIFCOPY, respectively.

sort([axis, kind, order])

Sort an array in-place.

squeeze([axis])

Remove axes of length one from a.

std([axis, dtype, out, ddof, keepdims, where])

Returns the standard deviation of the array elements along given axis.

sum([axis, dtype, out, keepdims, initial, where])

Return the sum of the array elements over the given axis.

swapaxes(axis1, axis2)

Return a view of the array with axis1 and axis2 interchanged.

take(indices[, axis, out, mode])

Return an array formed from the elements of a at the given indices.

tobytes([order])

Construct Python bytes containing the raw data bytes in the array.

tofile(fid[, sep, format])

Write array to a file as text or binary (default).

tolist()

Return the array as an a.ndim-levels deep nested list of Python scalars.

tostring([order])

A compatibility alias for ~ndarray.tobytes, with exactly the same behavior.

trace([offset, axis1, axis2, dtype, out])

Return the sum along diagonals of the array.

transpose(*axes)

Returns a view of the array with axes transposed.

var([axis, dtype, out, ddof, keepdims, where])

Returns the variance of the array elements, along given axis.

view([dtype][, type])

New view of array with the same data.

dot

to_device

multi_voxel_fit#

dipy.reconst.multi_voxel.multi_voxel_fit(single_voxel_fit)[source]#

Method decorator to turn a single voxel model fit definition into a multi voxel model fit definition

OdfModel#

class dipy.reconst.odf.OdfModel(gtab)[source]#

Bases: ReconstModel

An abstract class to be sub-classed by specific odf models

All odf models should provide a fit method which may take data as it’s first and only argument.

Methods

fit(data)

To be implemented by specific odf models

fit(data)[source]#

To be implemented by specific odf models

OdfFit#

class dipy.reconst.odf.OdfFit(model, data)[source]#

Bases: ReconstFit

Methods

odf(sphere)

To be implemented but specific odf models

odf(sphere)[source]#

To be implemented but specific odf models

gfa#

dipy.reconst.odf.gfa(samples)[source]#

The general fractional anisotropy of a function evaluated on the unit sphere

Parameters:
samplesndarray

Values of data on the unit sphere.

Returns:
gfandarray

GFA evaluated in each entry of the array, along the last dimension. An np.nan is returned for coordinates that contain all-zeros in samples.

Notes

The GFA is defined as [63]:

\[\sqrt{\frac{n \sum_i{(\Psi_i - <\Psi>)^2}}{(n-1) \sum{\Psi_i ^ 2}}}\]

Where \(\Psi\) is an orientation distribution function sampled discretely on the unit sphere and angle brackets denote average over the samples on the sphere.

References

minmax_normalize#

dipy.reconst.odf.minmax_normalize(samples, *, out=None)[source]#

Min-max normalization of a function evaluated on the unit sphere

Normalizes samples to (samples - min(samples)) / (max(samples) - min(samples)) for each unit sphere.

Parameters:
samplesndarray (…, N)

N samples on a unit sphere for each point, stored along the last axis of the array.

outndrray (…, N), optional

An array to store the normalized samples.

Returns:
outndarray, (…, N)

Normalized samples.

QtdmriModel#

class dipy.reconst.qtdmri.QtdmriModel(gtab, *, radial_order=6, time_order=2, laplacian_regularization=False, laplacian_weighting=0.2, l1_regularization=False, l1_weighting=0.1, cartesian=True, anisotropic_scaling=True, normalization=False, constrain_q0=True, bval_threshold=10000000000.0, eigenvalue_threshold=0.0001, cvxpy_solver='CLARABEL')[source]#

Bases: Cache

The q:math:tau-dMRI model to analytically and continuously represent the q:math:tau diffusion signal attenuation over diffusion sensitization q and diffusion time \(\tau\).

The model [64] can be seen as an extension of the MAP-MRI basis [58] towards different diffusion times.

The main idea is to model the diffusion signal over time and space as a linear combination of continuous functions,

\hat{E}(\textbf{q},\tau;\textbf{c}) = \sum_i^{N_{\textbf{q}}}\sum_k^{N_\tau} \textbf{c}_{ik} \,\Phi_i(\textbf{q})\,T_k(\tau)

where \(\Phi\) and \(T\) are the spatial and temporal basis functions, \(N_{\textbf{q}}\) and \(N_\tau\) are the maximum spatial and temporal order, and \(i,k\) are basis order iterators.

The estimation of the coefficients \(c_i\) can be regularized using either analytic Laplacian regularization, sparsity regularization using the l1-norm, or both to do a type of elastic net regularization.

From the coefficients, there exists an analytical formula to estimate the ODF, RTOP, RTAP, RTPP, QIV and MSD, for any diffusion time.

Parameters:
gtabGradientTable,

gradient directions and bvalues container class. The bvalues should be in the normal s/mm^2. big_delta and small_delta need to be given in seconds.

radial_orderunsigned int,

an even integer representing the spatial/radial order of the basis.

time_orderunsigned int,

an integer larger or equal than zero representing the time order of the basis.

laplacian_regularizationbool,

Regularize using the Laplacian of the qt-dMRI basis.

laplacian_weighting: string or scalar,

The string ‘GCV’ makes it use generalized cross-validation to find the regularization weight [60]. A scalar sets the regularization weight to that value.

l1_regularizationbool,

Regularize by imposing sparsity in the coefficients using the l1-norm.

l1_weighting‘CV’ or scalar,

The string ‘CV’ makes it use five-fold cross-validation to find the regularization weight. A scalar sets the regularization weight to that value.

cartesianbool

Whether to use the Cartesian or spherical implementation of the qt-dMRI basis, which we first explored in [65].

anisotropic_scalingbool

Whether to use anisotropic scaling or isotropic scaling. This option can be used to test if the Cartesian implementation is equivalent with the spherical one when using the same scaling.

normalizationbool

Whether to normalize the basis functions such that their inner product is equal to one. Normalization is only necessary when imposing sparsity in the spherical basis if cartesian=False.

constrain_q0bool

whether to constrain the q0 point to unity along the tau-space. This is necessary to ensure that \(E(0,\tau)=1\).

bval_thresholdfloat

the threshold b-value to be used, such that only data points below that threshold are used when estimating the scale factors.

eigenvalue_thresholdfloat,

Sets the minimum of the tensor eigenvalues in order to avoid stability problem.

cvxpy_solverstr, optional

cvxpy solver name. Optionally optimize the positivity constraint with a particular cvxpy solver. See https://www.cvxpy.org/ for details. Default: None (cvxpy chooses its own solver)

Methods

cache_clear()

Clear the cache.

cache_get(tag, key, *[, default])

Retrieve a value from the cache.

cache_set(tag, key, value)

Store a value in the cache.

fit(data, *[, mask])

Fit method for every voxel in data

References

fit(data, *, mask=None, **kwargs)#

Fit method for every voxel in data

QtdmriFit#

class dipy.reconst.qtdmri.QtdmriFit(model, qtdmri_coef, us, ut, tau_scaling, R, lopt, alpha, cvxpy_solution_optimal)[source]#

Bases: object

Methods

fitted_signal(*[, gtab])

Recovers the fitted signal for the given gradient table.

msd(tau)

Calculates the analytical Mean Squared Displacement (MSD) for a given diffusion time tau.

norm_of_laplacian_signal()

Calculates the norm of the laplacian of the fitted signal.

odf(sphere, tau, *[, s])

Calculates the analytical Orientation Distribution Function (ODF) for a given diffusion time tau from the signal.

odf_sh(tau, *[, s])

Calculates the real analytical odf for a given discrete sphere.

pdf(rt_points)

Diffusion propagator on a given set of real points.

predict(qvals_or_gtab, *[, S0])

Recovers the reconstructed signal for any qvalue array or gradient table.

qiv(tau)

Calculates the analytical Q-space Inverse Variance (QIV) for given diffusion time tau.

qtdmri_to_mapmri_coef(tau)

This function converts the qtdmri coefficients to mapmri coefficients for a given tau.

rtap(tau)

Calculates the analytical return to the axis probability (RTAP) for a given diffusion time tau.

rtop(tau)

Calculates the analytical return to the origin probability (RTOP) for a given diffusion time tau.

rtpp(tau)

Calculates the analytical return to the plane probability (RTPP) for a given diffusion time tau.

sparsity_abs(*[, threshold])

As a measure of sparsity, calculates the number of largest coefficients needed to absolute sum up to 99% of the total absolute sum of all coefficients

sparsity_density(*[, threshold])

As a measure of sparsity, calculates the number of largest coefficients needed to squared sum up to 99% of the total squared sum of all coefficients

fitted_signal(*, gtab=None)[source]#

Recovers the fitted signal for the given gradient table. If no gradient table is given it recovers the signal for the gtab of the model object.

msd(tau)[source]#

Calculates the analytical Mean Squared Displacement (MSD) for a given diffusion time tau.

It is defined as the Laplacian of the origin of the estimated signal Cheng[56]. The analytical formula for the MAP-MRI basis was derived in [57] eq. (C13, D1). The qtdmri coefficients are first converted to mapmri coefficients following [64].

Parameters:
taufloat

diffusion time (big_delta - small_delta / 3.) in seconds

References

norm_of_laplacian_signal()[source]#

Calculates the norm of the laplacian of the fitted signal.

This information could be useful to assess if the extrapolation of the fitted signal contains spurious oscillations. A high laplacian norm may indicate that these are present, and any q-space indices that use integrals of the signal may be corrupted (e.g. RTOP, RTAP, RTPP, QIV). In contrast to Fick et al.[57], the Laplacian now describes oscillations in the 4-dimensional qt-signal [64].

See [57] for a definition of the metric.

References

odf(sphere, tau, *, s=2)[source]#

Calculates the analytical Orientation Distribution Function (ODF) for a given diffusion time tau from the signal.

See [58] Eq. (32). The qtdmri coefficients are first converted to mapmri coefficients following [64].

Parameters:
spheredipy sphere object

sphere object with vertice orientations to compute the ODF on.

taufloat

diffusion time (big_delta - small_delta / 3.) in seconds

sunsigned int

radial moment of the ODF

References

odf_sh(tau, *, s=2)[source]#

Calculates the real analytical odf for a given discrete sphere.

Computes the design matrix of the ODF for the given sphere vertices and radial moment [58] eq. (32). The radial moment s acts as a sharpening method. The analytical equation for the spherical ODF basis is given in [57] eq. (C8). The qtdmri coefficients are first converted to mapmri coefficients following [64].

Parameters:
taufloat

diffusion time (big_delta - small_delta / 3.) in seconds

sunsigned int

radial moment of the ODF

References

pdf(rt_points)[source]#

Diffusion propagator on a given set of real points. if the array r_points is non writeable, then intermediate results are cached for faster recalculation

predict(qvals_or_gtab, *, S0=1.0)[source]#

Recovers the reconstructed signal for any qvalue array or gradient table.

qiv(tau)[source]#

Calculates the analytical Q-space Inverse Variance (QIV) for given diffusion time tau.

It is defined as the inverse of the Laplacian of the origin of the estimated propagator [59] eq. (22). The analytical formula for the MAP-MRI basis was derived in [57] eq. (C14, D2). The qtdmri coefficients are first converted to mapmri coefficients following Fick et al.[64].

Parameters:
taufloat

diffusion time (big_delta - small_delta / 3.) in seconds

References

qtdmri_to_mapmri_coef(tau)[source]#

This function converts the qtdmri coefficients to mapmri coefficients for a given tau.

Defined in [64], the conversion is performed by a matrix multiplication that evaluates the time-depenent part of the basis and multiplies it with the coefficients, after which coefficients with the same spatial orders are summed up, resulting in mapmri coefficients.

Parameters:
taufloat

diffusion time (big_delta - small_delta / 3.) in seconds

References

rtap(tau)[source]#

Calculates the analytical return to the axis probability (RTAP) for a given diffusion time tau.

See [58] eq. (40, 44a). The analytical formula for the isotropic MAP-MRI basis was derived in [57] eq. (C11). The qtdmri coefficients are first converted to mapmri coefficients following [64].

Parameters:
taufloat

diffusion time (big_delta - small_delta / 3.) in seconds

References

rtop(tau)[source]#

Calculates the analytical return to the origin probability (RTOP) for a given diffusion time tau.

See [58] eq. (36, 43). The analytical formula for the isotropic MAP-MRI basis was derived in [57] eq. (C11). The qtdmri coefficients are first converted to mapmri coefficients following [64].

Parameters:
taufloat

diffusion time (big_delta - small_delta / 3.) in seconds

References

rtpp(tau)[source]#

Calculates the analytical return to the plane probability (RTPP) for a given diffusion time tau.

See [58] eq. (42). The analytical formula for the isotropic MAP-MRI basis was derived in [57] eq. (C11). The qtdmri coefficients are first converted to mapmri coefficients following [64].

Parameters:
taufloat

diffusion time (big_delta - small_delta / 3.) in seconds

References

sparsity_abs(*, threshold=0.99)[source]#

As a measure of sparsity, calculates the number of largest coefficients needed to absolute sum up to 99% of the total absolute sum of all coefficients

sparsity_density(*, threshold=0.99)[source]#

As a measure of sparsity, calculates the number of largest coefficients needed to squared sum up to 99% of the total squared sum of all coefficients

qtdmri_to_mapmri_matrix#

dipy.reconst.qtdmri.qtdmri_to_mapmri_matrix(radial_order, time_order, ut, tau)[source]#

Generate the matrix that maps the qtdmri coefficients to MAP-MRI coefficients for the anisotropic case.

The conversion is done by only evaluating the time basis for a diffusion time tau and summing up coefficients with the same spatial basis orders [64].

Parameters:
radial_orderunsigned int,

an even integer representing the spatial/radial order of the basis.

time_orderunsigned int,

an integer larger or equal than zero representing the time order of the basis.

utfloat

temporal scaling factor

taufloat

diffusion time (big_delta - small_delta / 3.) in seconds

References

qtdmri_isotropic_to_mapmri_matrix#

dipy.reconst.qtdmri.qtdmri_isotropic_to_mapmri_matrix(radial_order, time_order, ut, tau)[source]#

Generate the matrix that maps the spherical qtdmri coefficients to MAP-MRI coefficients for the isotropic case.

The conversion is done by only evaluating the time basis for a diffusion time tau and summing up coefficients with the same spatial basis orders [64].

Parameters:
radial_orderunsigned int,

an even integer representing the spatial/radial order of the basis.

time_orderunsigned int,

an integer larger or equal than zero representing the time order of the basis.

utfloat

temporal scaling factor

taufloat

diffusion time (big_delta - small_delta / 3.) in seconds

References

qtdmri_temporal_normalization#

dipy.reconst.qtdmri.qtdmri_temporal_normalization(ut)[source]#

Normalization factor for the temporal basis

qtdmri_mapmri_normalization#

dipy.reconst.qtdmri.qtdmri_mapmri_normalization(mu)[source]#

Normalization factor for Cartesian MAP-MRI basis. The scaling is the same for every basis function depending only on the spatial scaling mu.

qtdmri_mapmri_isotropic_normalization#

dipy.reconst.qtdmri.qtdmri_mapmri_isotropic_normalization(j, ell, u0)[source]#

Normalization factor for Spherical MAP-MRI basis. The normalization for a basis function with orders [j,l,m] depends only on orders j,l and the isotropic scale factor.

qtdmri_signal_matrix#

dipy.reconst.qtdmri.qtdmri_signal_matrix(radial_order, time_order, us, ut, q, tau)[source]#

Constructs the design matrix as a product of 3 separated radial, angular and temporal design matrices. It precomputes the relevant basis orders for each one and finally puts them together according to the index matrix

qtdmri_eap_matrix#

dipy.reconst.qtdmri.qtdmri_eap_matrix(radial_order, time_order, us, ut, grid)[source]#

Constructs the design matrix as a product of 3 separated radial, angular and temporal design matrices. It precomputes the relevant basis orders for each one and finally puts them together according to the index matrix

qtdmri_isotropic_signal_matrix#

dipy.reconst.qtdmri.qtdmri_isotropic_signal_matrix(radial_order, time_order, us, ut, q, tau)[source]#

qtdmri_isotropic_eap_matrix#

dipy.reconst.qtdmri.qtdmri_isotropic_eap_matrix(radial_order, time_order, us, ut, grid)[source]#

Constructs the design matrix as a product of 3 separated radial, angular and temporal design matrices. It precomputes the relevant basis orders for each one and finally puts them together according to the index matrix

radial_basis_opt#

dipy.reconst.qtdmri.radial_basis_opt(j, ell, us, q)[source]#

Spatial basis dependent on spatial scaling factor us

angular_basis_opt#

dipy.reconst.qtdmri.angular_basis_opt(ell, m, q, theta, phi)[source]#

Angular basis independent of spatial scaling factor us. Though it includes q, it is independent of the data and can be precomputed.

radial_basis_EAP_opt#

dipy.reconst.qtdmri.radial_basis_EAP_opt(j, ell, us, r)[source]#

angular_basis_EAP_opt#

dipy.reconst.qtdmri.angular_basis_EAP_opt(j, ell, m, r, theta, phi)[source]#

temporal_basis#

dipy.reconst.qtdmri.temporal_basis(o, ut, tau)[source]#

Temporal basis dependent on temporal scaling factor ut

qtdmri_index_matrix#

dipy.reconst.qtdmri.qtdmri_index_matrix(radial_order, time_order)[source]#

Computes the SHORE basis order indices according to [1].

qtdmri_isotropic_index_matrix#

dipy.reconst.qtdmri.qtdmri_isotropic_index_matrix(radial_order, time_order)[source]#

Computes the SHORE basis order indices according to [1].

qtdmri_laplacian_reg_matrix#

dipy.reconst.qtdmri.qtdmri_laplacian_reg_matrix(ind_mat, us, ut, *, S_mat=None, T_mat=None, U_mat=None, part1_ut_precomp=None, part23_ut_precomp=None, part4_ut_precomp=None, normalization=False)[source]#

Computes the cartesian qt-dMRI Laplacian regularization matrix.

If given, uses precomputed matrices for temporal and spatial regularization matrices to speed up computation. Follows the formulation of Appendix B in [64].

References

qtdmri_isotropic_laplacian_reg_matrix#

dipy.reconst.qtdmri.qtdmri_isotropic_laplacian_reg_matrix(ind_mat, us, ut, *, part1_uq_iso_precomp=None, part1_ut_precomp=None, part23_ut_precomp=None, part4_ut_precomp=None, normalization=False)[source]#

Computes the spherical qt-dMRI Laplacian regularization matrix.

If given, uses precomputed matrices for temporal and spatial regularization matrices to speed up computation. Follows the formulation of Appendix C in [64].

References

part23_reg_matrix_q#

dipy.reconst.qtdmri.part23_reg_matrix_q(ind_mat, U_mat, T_mat, us)[source]#

Partial cartesian spatial Laplacian regularization matrix.

The implementation follows the second line of Eq. (B2) in [64].

References

part23_iso_reg_matrix_q#

dipy.reconst.qtdmri.part23_iso_reg_matrix_q(ind_mat, us)[source]#

Partial spherical spatial Laplacian regularization matrix.

The implementation follows the equation below Eq. (C4) in [64].

References

part4_reg_matrix_q#

dipy.reconst.qtdmri.part4_reg_matrix_q(ind_mat, U_mat, us)[source]#

Partial cartesian spatial Laplacian regularization matrix.

The implementation follows equation Eq. (B2) in [64].

References

part4_iso_reg_matrix_q#

dipy.reconst.qtdmri.part4_iso_reg_matrix_q(ind_mat, us)[source]#

Partial spherical spatial Laplacian regularization matrix.

The implementation follows the equation below Eq. (C4) in [64].

References

part1_reg_matrix_tau#

dipy.reconst.qtdmri.part1_reg_matrix_tau(ind_mat, ut)[source]#

Partial temporal Laplacian regularization matrix.

The implementation follows Appendix B in [64].

References

part23_reg_matrix_tau#

dipy.reconst.qtdmri.part23_reg_matrix_tau(ind_mat, ut)[source]#

Partial temporal Laplacian regularization matrix.

The implementation follows Appendix B in [64].

References

part4_reg_matrix_tau#

dipy.reconst.qtdmri.part4_reg_matrix_tau(ind_mat, ut)[source]#

Partial temporal Laplacian regularization matrix.

The implementation follows Appendix B in [64].

References

H#

dipy.reconst.qtdmri.H(value)[source]#

Step function of H(x)=1 if x>=0 and zero otherwise. Used for the temporal laplacian matrix.

generalized_crossvalidation#

dipy.reconst.qtdmri.generalized_crossvalidation(data, M, LR, *, startpoint=0.0005)[source]#

Generalized Cross Validation Function.

See [60] for further details about the method.

References

GCV_cost_function#

dipy.reconst.qtdmri.GCV_cost_function(weight, arguments)[source]#

Generalized Cross Validation Function that is iterated.

See [60] for further details about the method.

References

qtdmri_isotropic_scaling#

dipy.reconst.qtdmri.qtdmri_isotropic_scaling(data, q, tau)[source]#

Constructs design matrix for fitting an exponential to the diffusion time points.

qtdmri_anisotropic_scaling#

dipy.reconst.qtdmri.qtdmri_anisotropic_scaling(data, q, bvecs, tau)[source]#

Constructs design matrix for fitting an exponential to the diffusion time points.

design_matrix_spatial#

dipy.reconst.qtdmri.design_matrix_spatial(bvecs, qvals)[source]#

Constructs design matrix for DTI weighted least squares or least squares fitting. (Basser et al., 1994a)

Parameters:
bvecsarray (N x 3)

unit b-vectors of the acquisition.

qvalsarray (N,)

corresponding q-values in 1/mm

Returns:
design_matrixarray (g,7)

Design matrix or B matrix assuming Gaussian distributed tensor model design_matrix[j, :] = (Bxx, Byy, Bzz, Bxy, Bxz, Byz, dummy)

create_rt_space_grid#

dipy.reconst.qtdmri.create_rt_space_grid(grid_size_r, max_radius_r, grid_size_tau, min_radius_tau, max_radius_tau)[source]#

Generates EAP grid (for potential positivity constraint).

qtdmri_number_of_coefficients#

dipy.reconst.qtdmri.qtdmri_number_of_coefficients(radial_order, time_order)[source]#

Computes the total number of coefficients of the qtdmri basis given a radial and temporal order.

See equation given below Eq (9) in Fick et al.[64].

References

l1_crossvalidation#

dipy.reconst.qtdmri.l1_crossvalidation(b0s_mask, E, M, *, weight_array=None)[source]#

cross-validation function to find the optimal weight of alpha for sparsity regularization

elastic_crossvalidation#

dipy.reconst.qtdmri.elastic_crossvalidation(b0s_mask, E, M, L, lopt, *, weight_array=None)[source]#

cross-validation function to find the optimal weight of alpha for sparsity regularization when also Laplacian regularization is used.

visualise_gradient_table_G_Delta_rainbow#

dipy.reconst.qtdmri.visualise_gradient_table_G_Delta_rainbow(gtab, *, big_delta_start=None, big_delta_end=None, G_start=None, G_end=None, bval_isolines=array([0, 250, 1000, 2500, 5000, 7500, 10000, 14000]), alpha_shading=0.6)[source]#

This function visualizes a q-tau acquisition scheme as a function of gradient strength and pulse separation (big_delta). It represents every measurements at its G and big_delta position regardless of b-vector, with a background of b-value isolines for reference. It assumes there is only one unique pulse length (small_delta) in the acquisition scheme.

Parameters:
gtabGradientTable object

constructed gradient table with big_delta and small_delta given as inputs.

big_delta_startfloat,

optional minimum big_delta that is plotted in seconds

big_delta_endfloat,

optional maximum big_delta that is plotted in seconds

G_startfloat,

optional minimum gradient strength that is plotted in T/m

G_endfloat,

optional maximum gradient strength that is plotted in T/m

bval_isolinesarray,

optional array of bvalue isolines that are plotted in the background

alpha_shadingfloat between [0-1]

optional shading of the bvalue colors in the background

QtiModel#

class dipy.reconst.qti.QtiModel(gtab, *, fit_method='WLS', cvxpy_solver='SCS')[source]#

Bases: ReconstModel

Methods

fit(data, *[, mask])

Fit QTI to data.

predict(params)

Generate signals from this model class instance and given parameters.

fit(data, *, mask=None)[source]#

Fit QTI to data.

Parameters:
datanumpy.ndarray

Array of shape (…, number of acquisitions).

masknumpy.ndarray, optional

Array with the same shape as the data array of a single acquisition.

Returns:
qtifitdipy.reconst.qti.QtiFit

The fitted model.

predict(params)[source]#

Generate signals from this model class instance and given parameters.

Parameters:
paramsnumpy.ndarray

Array of shape (…, 28) containing the model parameters. Element 0 is the natural logarithm of the signal without diffusion-weighting, elements 1-6 are the diffusion tensor elements in Voigt notation, and elements 7-27 are the covariance tensor elements in Voigt notation.

Returns:
Snumpy.ndarray

Signals.

QtiFit#

class dipy.reconst.qti.QtiFit(params)[source]#

Bases: object

Methods

S0_hat()

Estimated signal without diffusion-weighting.

c_c()

Microscopic orientation coherence.

c_m()

Normalized macroscopic anisotropy.

c_md()

Normalized variance of mean diffusivities.

c_mu()

Normalized microscopic anisotropy.

d_sq()

Diffusion tensor's outer product with itself.

fa()

Fractional anisotropy.

k_bulk()

Bulk kurtosis.

k_mu()

Microscopic kurtosis.

k_shear()

Shear kurtosis.

md()

Mean diffusivity.

mean_d_sq()

Average of microscopic diffusion tensors' outer products with themselves.

mk()

Mean kurtosis.

predict(gtab)

Generate signals from this model fit and a given gradient table.

ufa()

Microscopic fractional anisotropy.

v_iso()

Total isotropic variance.

v_md()

Variance of microscopic mean diffusivities.

v_shear()

Shear variance.

S0_hat()[source]#

Estimated signal without diffusion-weighting.

Returns:
S0numpy.ndarray
c_c()[source]#

Microscopic orientation coherence.

Returns:
c_cnumpy.ndarray

Notes

Microscopic orientation coherence is calculated as

\[C_c = \frac{C_\text{M}}{C_\mu}\]
c_m()[source]#

Normalized macroscopic anisotropy.

Returns:
c_mnumpy.ndarray

Notes

Normalized macroscopic anisotropy is calculated as

\[C_\text{M} = \frac{3}{2} \frac{\langle \mathbf{D} \rangle \otimes \langle \mathbf{D} \rangle : \mathbb{E}_\text{shear}} {\langle \mathbf{D} \rangle \otimes \langle \mathbf{D} \rangle : \mathbb{E}_\text{iso}}\]
c_md()[source]#

Normalized variance of mean diffusivities.

Returns:
c_mdnumpy.ndarray

Notes

Normalized variance of microscopic mean diffusivities is calculated as

\[C_\text{MD} = \frac{\mathbb{C} : \mathbb{E}_\text{bulk}} {\langle \mathbf{D} \otimes \mathbf{D} \rangle : \mathbb{E}_\text{bulk}}\]
c_mu()[source]#

Normalized microscopic anisotropy.

Returns:
c_munumpy.ndarray

Notes

Normalized microscopic anisotropy is calculated as

\[C_\mu = \frac{3}{2} \frac{\langle \mathbf{D} \otimes \mathbf{D} \rangle : \mathbb{E}_\text{shear}}{\langle \mathbf{D} \otimes \mathbf{D} \rangle : \mathbb{E}_\text{iso}}\]
d_sq()[source]#

Diffusion tensor’s outer product with itself.

Returns:
d_sqnumpy.ndarray
fa()[source]#

Fractional anisotropy.

Returns:
fanumpy.ndarray

Notes

Fractional anisotropy is calculated as

\[\text{FA} = \sqrt{C_\text{M}}\]
k_bulk()[source]#

Bulk kurtosis.

Returns:
k_bulknumpy.ndarray

Notes

Bulk kurtosis is calculated as

\[K_\text{bulk} = 3 \frac{\mathbb{C} : \mathbb{E}_\text{bulk}} {\langle \mathbf{D} \rangle \otimes \langle \mathbf{D} \rangle : \mathbb{E}_\text{bulk}}\]
k_mu()[source]#

Microscopic kurtosis.

Returns:
k_munumpy.ndarray

Notes

Microscopic kurtosis is calculated as

\[K_\mu = \frac{6}{5} \frac{\langle \mathbf{D} \otimes \mathbf{D} \rangle : \mathbb{E}_\text{shear}}{\langle \mathbf{D} \rangle \otimes \langle \mathbf{D} \rangle : \mathbb{E}_\text{bulk}}\]
k_shear()[source]#

Shear kurtosis.

Returns:
k_shearnumpy.ndarray

Notes

Shear kurtosis is calculated as

\[K_\text{shear} = \frac{6}{5} \frac{\mathbb{C} : \mathbb{E}_\text{shear}}{\langle \mathbf{D} \rangle \otimes \langle \mathbf{D} \rangle : \mathbb{E}_\text{bulk}}\]
md()[source]#

Mean diffusivity.

Returns:
mdnumpy.ndarray

Notes

Mean diffusivity is calculated as

\[\text{MD} = \langle \mathbf{D} \rangle : \mathbf{E}_\text{iso}\]
mean_d_sq()[source]#

Average of microscopic diffusion tensors’ outer products with themselves.

Returns:
mean_d_sqnumpy.ndarray

Notes

Average of microscopic diffusion tensors’ outer products with themselves is calculated as

\[\langle \mathbf{D} \otimes \mathbf{D} \rangle = \mathbb{C} + \langle \mathbf{D} \rangle \otimes \langle \mathbf{D} \rangle\]
mk()[source]#

Mean kurtosis.

Returns:
mknumpy.ndarray

Notes

Mean kurtosis is calculated as

\[\text{MK} = K_\text{bulk} + K_\text{shear}\]
predict(gtab)[source]#

Generate signals from this model fit and a given gradient table.

Parameters:
gtabdipy.core.gradients.GradientTable

Gradient table with b-tensors.

Returns:
Snumpy.ndarray

Signals.

ufa()[source]#

Microscopic fractional anisotropy.

Returns:
ufanumpy.ndarray

Notes

Microscopic fractional anisotropy is calculated as

\[\mu\text{FA} = \sqrt{C_\mu}\]
v_iso()[source]#

Total isotropic variance.

Returns:
v_isonumpy.ndarray

Notes

Total isotropic variance is calculated as

\[V_\text{iso} = \mathbb{C} : \mathbb{E}_\text{iso}\]
v_md()[source]#

Variance of microscopic mean diffusivities.

Returns:
v_mdnumpy.ndarray

Notes

Variance of microscopic mean diffusivities is calculated as

\[V_\text{MD} = \mathbb{C} : \mathbb{E}_\text{bulk}\]
v_shear()[source]#

Shear variance.

Returns:
v_shearnumpy.ndarray

Notes

Shear variance is calculated as

\[V_\text{shear} = \mathbb{C} : \mathbb{E}_\text{shear}\]

from_3x3_to_6x1#

dipy.reconst.qti.from_3x3_to_6x1(T)[source]#

Convert symmetric 3 x 3 matrices into 6 x 1 vectors.

Parameters:
Tnumpy.ndarray

An array of size (…, 3, 3).

Returns:
Vnumpy.ndarray

Converted vectors of size (…, 6, 1).

Notes

The conversion of a matrix into a vector is defined as

\[\mathbf{V} = \begin{bmatrix} T_{11} & T_{22} & T_{33} & \sqrt{2} T_{23} & \sqrt{2} T_{13} & \sqrt{2} T_{12} \end{bmatrix}^T\]

from_6x1_to_3x3#

dipy.reconst.qti.from_6x1_to_3x3(V)[source]#

Convert 6 x 1 vectors into symmetric 3 x 3 matrices.

Parameters:
Vnumpy.ndarray

An array of size (…, 6, 1).

Returns:
Tnumpy.ndarray

Converted matrices of size (…, 3, 3).

Notes

The conversion of a matrix into a vector is defined as

\[\mathbf{V} = \begin{bmatrix} T_{11} & T_{22} & T_{33} & \sqrt{2} T_{23} & \sqrt{2} T_{13} & \sqrt{2} T_{12} \end{bmatrix}^T\]

from_6x6_to_21x1#

dipy.reconst.qti.from_6x6_to_21x1(T)[source]#

Convert symmetric 6 x 6 matrices into 21 x 1 vectors.

Parameters:
Tnumpy.ndarray

An array of size (…, 6, 6).

Returns:
Vnumpy.ndarray

Converted vectors of size (…, 21, 1).

Notes

The conversion of a matrix into a vector is defined as

\[\begin{matrix} \mathbf{V} = & \big[ T_{11} & T_{22} & T_{33} \ & \sqrt{2} T_{23} & \sqrt{2} T_{13} & \sqrt{2} T_{12} \ & \sqrt{2} T_{14} & \sqrt{2} T_{15} & \sqrt{2} T_{16} \ & \sqrt{2} T_{24} & \sqrt{2} T_{25} & \sqrt{2} T_{26} \ & \sqrt{2} T_{34} & \sqrt{2} T_{35} & \sqrt{2} T_{36} \ & T_{44} & T_{55} & T_{66} \ & \sqrt{2} T_{45} & \sqrt{2} T_{56} & \sqrt{2} T_{46} \big]^T \end{matrix}\]

from_21x1_to_6x6#

dipy.reconst.qti.from_21x1_to_6x6(V)[source]#

Convert 21 x 1 vectors into symmetric 6 x 6 matrices.

Parameters:
Vnumpy.ndarray

An array of size (…, 21, 1).

Returns:
Tnumpy.ndarray

Converted matrices of size (…, 6, 6).

Notes

The conversion of a matrix into a vector is defined as

\[\begin{matrix} \mathbf{V} = & \big[ T_{11} & T_{22} & T_{33} \ & \sqrt{2} T_{23} & \sqrt{2} T_{13} & \sqrt{2} T_{12} \ & \sqrt{2} T_{14} & \sqrt{2} T_{15} & \sqrt{2} T_{16} \ & \sqrt{2} T_{24} & \sqrt{2} T_{25} & \sqrt{2} T_{26} \ & \sqrt{2} T_{34} & \sqrt{2} T_{35} & \sqrt{2} T_{36} \ & T_{44} & T_{55} & T_{66} \ & \sqrt{2} T_{45} & \sqrt{2} T_{56} & \sqrt{2} T_{46} \big]^T \end{matrix}\]

cvxpy_1x6_to_3x3#

dipy.reconst.qti.cvxpy_1x6_to_3x3(V)[source]#

Convert a 1 x 6 vector into a symmetric 3 x 3 matrix.

Parameters:
Vnumpy.ndarray

An array of size (1, 6).

Returns:
Tcvxpy.bmat

Converted matrix of size (3, 3).

Notes

The conversion of a matrix into a vector is defined as

\[\mathbf{V} = \begin{bmatrix} T_{11} & T_{22} & T_{33} & \sqrt{2} T_{23} & \sqrt{2} T_{13} & \sqrt{2} T_{12} \end{bmatrix}^T\]

cvxpy_1x21_to_6x6#

dipy.reconst.qti.cvxpy_1x21_to_6x6(V)[source]#

Convert 1 x 21 vector into a symmetric 6 x 6 matrix.

Parameters:
Vnumpy.ndarray

An array of size (1, 21).

Returns:
Tcvxpy.bmat

Converted matrices of size (6, 6).

Notes

The conversion of a matrix into a vector is defined as

\[\begin{matrix} \mathbf{V} = & \big[ T_{11} & T_{22} & T_{33} \ & \sqrt{2} T_{23} & \sqrt{2} T_{13} & \sqrt{2} T_{12} \ & \sqrt{2} T_{14} & \sqrt{2} T_{15} & \sqrt{2} T_{16} \ & \sqrt{2} T_{24} & \sqrt{2} T_{25} & \sqrt{2} T_{26} \ & \sqrt{2} T_{34} & \sqrt{2} T_{35} & \sqrt{2} T_{36} \ & T_{44} & T_{55} & T_{66} \ & \sqrt{2} T_{45} & \sqrt{2} T_{56} & \sqrt{2} T_{46} \big]^T \end{matrix}\]

dtd_covariance#

dipy.reconst.qti.dtd_covariance(DTD)[source]#

Calculate covariance of a diffusion tensor distribution (DTD).

Parameters:
DTDnumpy.ndarray

Diffusion tensor distribution of shape (number of tensors, 3, 3) or (number of tensors, 6, 1).

Returns:
Cnumpy.ndarray

Covariance tensor of shape (6, 6).

Notes

The covariance tensor is calculated according to the following equation and converted into a rank-2 tensor [3]:

\[\mathbb{C} = \langle \mathbf{D} \otimes \mathbf{D} \rangle - \langle \mathbf{D} \rangle \otimes \langle \mathbf{D} \rangle\]

References

qti_signal#

dipy.reconst.qti.qti_signal(gtab, D, C, *, S0=1)[source]#

Generate signals using the covariance tensor signal representation.

Parameters:
gtabdipy.core.gradients.GradientTable

Gradient table with b-tensors.

Dnumpy.ndarray

Diffusion tensors of shape (…, 3, 3), (…, 6, 1), or (…, 6).

Cnumpy.ndarray

Covariance tensors of shape (…, 6, 6), (…, 21, 1), or (…, 21).

S0numpy.ndarray, optional

Signal magnitudes without diffusion-weighting. Must be a single number or an array of same shape as D and C without the last two dimensions.

Returns:
Snumpy.ndarray

Simulated signals.

Notes

The signal is generated according to

\[S = S_0 \exp \left(- \mathbf{b} : \langle \mathbf{D} \rangle + \frac{1}{2}(\mathbf{b} \otimes \mathbf{b}) : \mathbb{C} \right)\]

design_matrix#

dipy.reconst.qti.design_matrix(btens)[source]#

Calculate the design matrix from the b-tensors.

Parameters:
btensnumpy.ndarray

An array of b-tensors of shape (number of acquisitions, 3, 3).

Returns:
Xnumpy.ndarray

Design matrix.

Notes

The design matrix is generated according to

\[X = \begin{pmatrix} 1 & -\mathbf{b}_1^T & \frac{1}{2}( \mathbf{b}_1 \otimes\mathbf{b}_1)^T \ \vdots & \vdots & \vdots \ 1 & -\mathbf{b}_n^T & \frac{1}{2}(\mathbf{b}_n\otimes \mathbf{b}_n)^T \end{pmatrix}\]

quick_squash#

dipy.reconst.quick_squash.quick_squash(obj_arr, mask=None, fill=0)#

Try and make a standard array from an object array

This function takes an object array and attempts to convert it to a more useful dtype. If array can be converted to a better dtype, Nones are replaced by fill. To make the behaviour of this function more clear, here are the most common cases:

  1. obj_arr is an array of scalars of type T. Returns an array like obj_arr.astype(T)

  2. obj_arr is an array of arrays. All items in obj_arr have the same shape S. Returns an array with shape obj_arr.shape + S

  3. obj_arr is an array of arrays of different shapes. Returns obj_arr.

  4. Items in obj_arr are not ndarrays or scalars. Returns obj_arr.

Parameters:
obj_arrarray, dtype=object

The array to be converted.

maskarray, dtype=bool, optional

mask is nonzero where obj_arr has Nones.

fillnumber, optional

Nones are replaced by fill.

Returns:
resultarray

Examples

>>> arr = np.empty(3, dtype=object)
>>> arr.fill(2)
>>> quick_squash(arr)
array([2, 2, 2])
>>> arr[0] = None
>>> quick_squash(arr)
array([0, 2, 2])
>>> arr.fill(np.ones(2))
>>> r = quick_squash(arr)
>>> r.shape
(3, 2)
>>> r.dtype
dtype('float64')

reduce#

dipy.reconst.quick_squash.reduce(function, iterable[, initial]) value#

Apply a function of two arguments cumulatively to the items of an iterable, from left to right.

This effectively reduces the iterable to a single value. If initial is present, it is placed before the items of the iterable in the calculation, and serves as a default when the iterable is empty.

For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates ((((1 + 2) + 3) + 4) + 5).

adj_to_countarrs#

dipy.reconst.recspeed.adj_to_countarrs(adj_inds)#

Convert adjacency sequence to counts and flattened indices

We use this to provide expected input to argmax_from_countarrs

Parameters:
adj_indicessequence

length V sequence of sequences, where sequence i contains the neighbors of a particular vertex.

Returns:
counts(V,) array

Number of neighbors for each vertex

adj_inds(n,) array

flat array containing adj_indices unrolled as a vector

argmax_from_adj#

dipy.reconst.recspeed.argmax_from_adj(vals, vertex_inds, adj_inds)#

Indices of local maxima from vals given adjacent points

Parameters:
vals(N,) array, dtype np.float64

values at all vertices referred to in either of vertex_inds or adj_inds

vertex_inds(V,) array

indices into vals giving vertices that may be local maxima.

adj_indssequence

For every vertex in vertex_inds, the indices (into vals) of the neighboring points

Returns:
inds(M,) array

Indices into vals giving local maxima of vals, given topology from adj_inds, and restrictions from vertex_inds. Inds are returned sorted by value at that index - i.e. smallest value (at index) first.

argmax_from_countarrs#

dipy.reconst.recspeed.argmax_from_countarrs(vals, vertinds, adj_counts, adj_inds)#

Indices of local maxima from vals from count, array neighbors

Parameters:
vals(N,) array, dtype float

values at all vertices referred to in either of vertex_inds or adj_inds

vertinds(V,) array, dtype uint32

indices into vals giving vertices that may be local maxima.

adj_counts(V,) array, dtype uint32

For every vertex i in vertex_inds, the number of neighbors for vertex i

adj_inds(P,) array, dtype uint32

Indices for neighbors for each point. P=sum(adj_counts)

Returns:
inds(M,) array

Indices into vals giving local maxima of vals, given topology from adj_counts and adj_inds, and restrictions from vertex_inds. Inds are returned sorted by value at that index - i.e. smallest value (at index) first.

le_to_odf#

dipy.reconst.recspeed.le_to_odf(odf, LEs, radius, odfn, radiusn, anglesn)#

odf for interpolated Laplacian normalized signal

local_maxima#

dipy.reconst.recspeed.local_maxima(odf, edges)#

Local maxima of a function evaluated on a discrete set of points.

If a function is evaluated on some set of points where each pair of neighboring points is an edge in edges, find the local maxima.

Parameters:
odfarray, 1d, dtype=double

The function evaluated on a set of discrete points.

edgesarray (N, 2)

The set of neighbor relations between the points. Every edge, ie edges[i, :], is a pair of neighboring points.

Returns:
peak_valuesndarray

Value of odf at a maximum point. Peak values is sorted in descending order.

peak_indicesndarray

Indices of maximum points. Sorted in the same order as peak_values so odf[peak_indices[i]] == peak_values[i].

See also

dipy.core.sphere

Notes

A point is a local maximum if it is > at least one neighbor and >= all neighbors. If no points meet the above criteria, 1 maximum is returned such that odf[maximum] == max(odf).

proc_reco_args#

dipy.reconst.recspeed.proc_reco_args(vals, vertinds)#

remove_similar_vertices#

dipy.reconst.recspeed.remove_similar_vertices(vertices, theta, return_mapping=False, return_index=False, remove_antipodal=True)#

Remove vertices that are less than theta degrees from any other

Returns vertices that are at least theta degrees from any other vertex. Vertex v and -v are considered the same so if v and -v are both in vertices only one is kept. Also if v and w are both in vertices, w must be separated by theta degrees from both v and -v to be unique. To disable this, set remove_antipodal to False to keep both directions.

Parameters:
vertices(N, 3) ndarray

N unit vectors.

thetafloat

The minimum separation between vertices in degrees.

return_mapping{False, True}, optional

If True, return mapping as well as vertices and maybe indices (see below).

return_indices{False, True}, optional

If True, return indices as well as vertices and maybe mapping (see below).

remove_antipodal{False, True}, optional

If True, v and -v are considered equal, and only one will be kept.

Returns:
unique_vertices(M, 3) ndarray

Vertices sufficiently separated from one another.

mapping(N,) ndarray

For each element vertices[i] (\(i \in 0..N-1\)), the index \(j\) to a vertex in unique_vertices that is less than theta degrees from vertices[i]. Only returned if return_mapping is True.

indices(N,) ndarray

indices gives the reverse of mapping. For each element unique_vertices[j] (\(j \in 0..M-1\)), the index \(i\) to a vertex in vertices that is less than theta degrees from unique_vertices[j]. If there is more than one element of vertices that is less than theta degrees from unique_vertices[j], return the first (lowest index) matching value. Only return if return_indices is True.

search_descending#

dipy.reconst.recspeed.search_descending(a, relative_threshold)#

i in descending array a so a[i] < a[0] * relative_threshold

Call T = a[0] * relative_threshold. Return value i will be the smallest index in the descending array a such that a[i] < T. Equivalently, i will be the largest index such that all(a[:i] >= T). If all values in a are >= T, return the length of array a.

Parameters:
andarray, ndim=1, c-contiguous

Array to be searched. We assume a is in descending order.

relative_thresholdfloat

Applied threshold will be T with T = a[0] * relative_threshold.

Returns:
inp.intp

If T = a[0] * relative_threshold then i will be the largest index such that all(a[:i] >= T). If all values in a are >= T then i will be len(a).

Examples

>>> a = np.arange(10, 0, -1, dtype=float)
>>> np.allclose(a, np.array([10., 9., 8., 7., 6., 5., 4., 3., 2., 1.]))
True
>>> search_descending(a, 0.5)
6
>>> np.allclose(a < 10 * 0.5, np.array([False, False, False, False, False,
... False,  True,  True,  True,  True]))
True
>>> search_descending(a, 1)
1
>>> search_descending(a, 2)
0
>>> search_descending(a, 0)
10

sum_on_blocks_1d#

dipy.reconst.recspeed.sum_on_blocks_1d(arr, blocks, out, outn)#

Summations on blocks of 1d array

RumbaSDModel#

class dipy.reconst.rumba.RumbaSDModel(gtab, *, wm_response=(0.0017, 0.0002, 0.0002), gm_response=0.0008, csf_response=0.003, n_iter=600, recon_type='smf', n_coils=1, R=1, voxelwise=True, use_tv=False, sphere=None, verbose=False)[source]#

Bases: OdfModel

Methods

fit(data)

To be implemented by specific odf models

RumbaFit#

class dipy.reconst.rumba.RumbaFit(model, model_params)[source]#

Bases: OdfFit

Methods

combined_odf_iso()

Constructs fODF combined with isotropic volume fraction at discrete vertices on model sphere.

f_csf()

Constructs CSF volume fraction for each voxel.

f_gm()

Constructs GM volume fraction for each voxel.

f_iso()

Constructs isotropic volume fraction for each voxel.

f_wm()

Constructs white matter volume fraction for each voxel.

odf(*[, sphere])

Constructs fODF at discrete vertices on model sphere for each voxel.

predict(*[, gtab, S0])

Compute signal prediction on model gradient table given given fODF and GM/CSF volume fractions for each voxel.

combined_odf_iso()[source]#

Constructs fODF combined with isotropic volume fraction at discrete vertices on model sphere.

Distributes isotropic compartments evenly along each fODF direction. Sums to 1.

Returns:
combinedndarray ([x, y, z], M-2)

fODF combined with isotropic volume fraction.

f_csf()[source]#

Constructs CSF volume fraction for each voxel.

Returns:
f_csfndarray ([x, y, z])

CSF volume fraction.

f_gm()[source]#

Constructs GM volume fraction for each voxel.

Returns:
f_gmndarray ([x, y, z])

GM volume fraction.

f_iso()[source]#

Constructs isotropic volume fraction for each voxel.

Equivalent to sum of GM and CSF volume fractions.

Returns:
f_isondarray ([x, y, z])

Isotropic volume fraction.

f_wm()[source]#

Constructs white matter volume fraction for each voxel.

Equivalent to sum of fODF.

Returns:
f_wmndarray ([x, y, z])

White matter volume fraction.

odf(*, sphere=None)[source]#

Constructs fODF at discrete vertices on model sphere for each voxel.

Parameters:
sphereSphere, optional

Sphere on which to construct fODF. If specified, must be the same sphere used by the RumbaSDModel model. Default: None.

Returns:
odfndarray ([x, y, z], M-2)

fODF computed at each vertex on model sphere.

predict(*, gtab=None, S0=None)[source]#

Compute signal prediction on model gradient table given given fODF and GM/CSF volume fractions for each voxel.

Parameters:
gtabGradientTable, optional

The gradients for which the signal will be predicted. Use the model’s gradient table if None. Default: None

S0ndarray ([x, y, z]) or float, optional

The non diffusion-weighted signal value for each voxel. If a float, the same value is used for each voxel. If None, 1 is used for each voxel. Default: None

Returns:
pred_signdarray ([x, y, z], N)

The predicted signal.

rumba_deconv#

dipy.reconst.rumba.rumba_deconv(data, kernel, *, n_iter=600, recon_type='smf', n_coils=1)[source]#

Fit fODF and GM/CSF volume fractions for a voxel using RUMBA-SD.

Deconvolves the kernel from the diffusion-weighted signal by computing a maximum likelihood estimation of the fODF [66]. Minimizes the negative log-likelihood of the data under Rician or Noncentral Chi noise distributions by adapting the iterative technique developed in Richardson-Lucy deconvolution.

Parameters:
data1d ndarray (N,)

Signal values for a single voxel.

kernel2d ndarray (N, M)

Deconvolution kernel mapping volume fractions of the M compartments to N-length signal. Last two columns should be for GM and CSF.

n_iterint, optional

Number of iterations for fODF estimation. Must be a positive int. Default: 600

recon_type{‘smf’, ‘sos’}, optional

MRI reconstruction method: spatial matched filter (SMF) or sum-of-squares (SoS). SMF reconstruction generates Rician noise while SoS reconstruction generates Noncentral Chi noise. Default: ‘smf’

n_coilsint, optional

Number of coils in MRI scanner – only relevant in SoS reconstruction. Must be a positive int. Default: 1

Returns:
fit_vec1d ndarray (M,)

Vector containing fODF and GM/CSF volume fractions. First M-2 components are fODF while last two are GM and CSF respectively.

Notes

The diffusion MRI signal measured at a given voxel is a sum of contributions from each intra-voxel compartment, including parallel white matter (WM) fiber populations in a given orientation as well as effects from GM and CSF. The equation governing these contributions is:

\(S_i = S_0\left(\sum_{j=1}^{M}f_j\exp(-b_i\textbf{v}_i^T\textbf{D}_j \textbf{v}_i) + f_{GM}\exp(-b_iD_{GM})+f_{CSF}\exp(-b_iD_{CSF})\right)\)

Where \(S_i\) is the resultant signal along the diffusion-sensitizing gradient unit vector \(\textbf{v_i}; i = 1, ..., N\) with a b-value of \(b_i\). \(f_j; j = 1, ..., M\) is the volume fraction of the \(j^{th}\) fiber population with an anisotropic diffusion tensor \(\textbf{D_j}\).

\(f_{GM}\) and \(f_{CSF}\) are the volume fractions and \(D_{GM}\) and \(D_{CSF}\) are the mean diffusivities of GM and CSF respectively.

This equation is linear in \(f_j, f_{GM}, f_{CSF}\) and can be simplified to a single matrix multiplication:

\(\textbf{S} = \textbf{Hf}\)

Where \(\textbf{S}\) is the signal vector at a certain voxel, \(\textbf{H}\) is the deconvolution kernel, and \(\textbf{f}\) is the vector of volume fractions for each compartment.

Modern MRI scanners produce noise following a Rician or Noncentral Chi distribution, depending on their signal reconstruction technique footcite:p:`Constantinides1997. Using this linear model, it can be shown that the likelihood of a signal under a Noncentral Chi noise model is:

\(P(\textbf{S}|\textbf{H}, \textbf{f}, \sigma^2, n) = \prod_{i=1}^{N}\left( \frac{S_i}{\bar{S_i}}\right)^n\exp\left\{-\frac{1}{2\sigma^2}\left[ S_i^2 + \bar{S}_i^2\right]\right\}I_{n-1}\left(\frac{S_i\bar{S}_i} {\sigma^2}\right)u(S_i)\)

Where \(S_i\) and \(\bar{S}_i = \textbf{Hf}\) are the measured and expected signals respectively, and \(n\) is the number of coils in the scanner, and \(I_{n-1}\) is the modified Bessel function of first kind of order \(n-1\). This gives the likelihood under a Rician distribution when \(n\) is set to 1.

By taking the negative log of this with respect to \(\textbf{f}\) and setting the derivative to 0, the \(\textbf{f}\) maximizing likelihood is found to be:

\(\textbf{f} = \textbf{f} \circ \frac{\textbf{H}^T\left[\textbf{S}\circ \frac{I_n(\textbf{S}\circ \textbf{Hf}/\sigma^2)} {I_{n-1}(\textbf{S} \circ\textbf{Hf}\sigma^2)} \right ]} {\textbf{H}^T\textbf{Hf}}\)

The solution can be found using an iterative scheme, just as in the Richardson-Lucy algorithm:

\(\textbf{f}^{k+1} = \textbf{f}^k \circ \frac{\textbf{H}^T\left[\textbf{S} \circ\frac{I_n(\textbf{S}\circ\textbf{Hf}^k/\sigma^2)} {I_{n-1}(\textbf{S} \circ\textbf{Hf}^k/\sigma^2)} \right ]} {\textbf{H}^T\textbf{Hf}^k}\)

In order to apply this, a reasonable estimate of \(\sigma^2\) is required. To find this, a separate iterative scheme is found using the derivative of the negative log with respect to \(\sigma^2\), and is run in parallel. This is shown here:

\(\alpha^{k+1} = \frac{1}{nN}\left\{ \frac{\textbf{S}^T\textbf{S} + \textbf{f}^T\textbf{H}^T\textbf{Hf}}{2} - \textbf{1}^T_N\left[(\textbf{S} \circ\textbf{Hf})\circ\frac{I_n(\textbf{S}\circ\textbf{Hf}/\alpha^k)} {I_{n-1}(\textbf{S}\circ\textbf{Hf}/\alpha^k)} \right ]\right \}\)

For more details, see [66].

References

mbessel_ratio#

dipy.reconst.rumba.mbessel_ratio(n, x)[source]#

Fast computation of modified Bessel function ratio (first kind).

Computes:

\(I_{n}(x) / I_{n-1}(x)\)

using Perron’s continued fraction equation where \(I_n\) is the modified Bessel function of first kind, order \(n\) [67].

Parameters:
nint

Order of Bessel function in numerator (denominator is of order n-1). Must be a positive int.

xfloat or ndarray

Value or array of values with which to compute ratio.

Returns:
yfloat or ndarray

Result of ratio computation.

References

generate_kernel#

dipy.reconst.rumba.generate_kernel(gtab, sphere, wm_response, gm_response, csf_response)[source]#

Generate deconvolution kernel

Compute kernel mapping orientation densities of white matter fiber populations (along each vertex of the sphere) and isotropic volume fractions to a diffusion weighted signal.

Parameters:
gtabGradientTable

Gradient table.

sphereSphere

Sphere with which to sample discrete fiber orientations in order to construct kernel

wm_response1d ndarray or 2d ndarray or AxSymShResponse, optional

Tensor eigenvalues as a (3,) ndarray, multishell eigenvalues as a (len(unique_bvals_tolerance(gtab.bvals))-1, 3) ndarray in order of smallest to largest b-value, or an AxSymShResponse.

gm_responsefloat, optional

Mean diffusivity for GM compartment. If None, then grey matter compartment set to all zeros.

csf_responsefloat, optional

Mean diffusivity for CSF compartment. If None, then CSF compartment set to all zeros.

Returns:
kernel2d ndarray (N, M)

Computed kernel; can be multiplied with a vector consisting of volume fractions for each of M-2 fiber populations as well as GM and CSF fractions to produce a diffusion weighted signal.

rumba_deconv_global#

dipy.reconst.rumba.rumba_deconv_global(data, kernel, mask, *, n_iter=600, recon_type='smf', n_coils=1, R=1, use_tv=True, verbose=False)[source]#

Fit fODF for all voxels simultaneously using RUMBA-SD.

Deconvolves the kernel from the diffusion-weighted signal at each voxel by computing a maximum likelihood estimation of the fODF [66]. Global fitting also permits the use of total variation regularization (RUMBA-SD + TV). The spatial dependence introduced by TV promotes smoother solutions (i.e. prevents oscillations), while still allowing for sharp discontinuities [68]. This promotes smoothness and continuity along individual tracts while preventing smoothing of adjacent tracts.

Generally, global_fit will proceed more quickly than the voxelwise fit provided that the computer has adequate RAM (>= 16 GB should be more than sufficient).

Parameters:
data4d ndarray (x, y, z, N)

Signal values for entire brain. None of the volume dimensions x, y, z can be 1 if TV regularization is required.

kernel2d ndarray (N, M)

Deconvolution kernel mapping volume fractions of the M compartments to N-length signal. Last two columns should be for GM and CSF.

mask3d ndarray(x, y, z)

Binary mask specifying voxels of interest with 1; fODF will only be fit at these voxels (0 elsewhere).

n_iterint, optional

Number of iterations for fODF estimation. Must be a positive int.

recon_type{‘smf’, ‘sos’}, optional

MRI reconstruction method: spatial matched filter (SMF) or sum-of-squares (SoS). SMF reconstruction generates Rician noise while SoS reconstruction generates Noncentral Chi noise.

n_coilsint, optional

Number of coils in MRI scanner – only relevant in SoS reconstruction. Must be a positive int.

use_tvbool, optional

If true, applies total variation regularization. This requires a brain volume with no singleton dimensions.

verbosebool, optional

If true, logs updates on estimated signal-to-noise ratio after each iteration.

Returns:
fit_array4d ndarray (x, y, z, M)

fODF and GM/CSF volume fractions computed for each voxel. First M-2 components are fODF, while last two are GM and CSf respectively.

Notes

TV modifies our cost function as follows:

\[\]

J(textbf{f}) = -log{P(textbf{S}|textbf{H}, textbf{f}, sigma^2, n)})+ alpha_{TV}TV(textbf{f})

where the first term is the negative log likelihood described in the notes of rumba_deconv, and the second term is the TV energy, or the sum of gradient absolute values for the fODF across the entire brain. This results in a new multiplicative factor in the iterative scheme, now becoming:

\[\]

textbf{f}^{k+1} = textbf{f}^k circ frac{textbf{H}^Tleft[textbf{S} circfrac{I_n(textbf{S}circtextbf{Hf}^k/sigma^2)} {I_{n-1}(textbf{S} circtextbf{Hf}^k/sigma^2)} right ]} {textbf{H}^Ttextbf{Hf}^k}circ textbf{R}^k

where \(\textbf{R}^k\) is computed voxelwise by:

\[\]

(textbf{R}^k)_j = frac{1}{1 - alpha_{TV}divleft(frac{triangledown[ textbf{f}^k_{3D}]_j}{lverttriangledown[textbf{f}^k_{3D}]_j rvert} right)biggrrvert_{x, y, z}}

Here, \(\triangledown\) is the symbol for the 3D gradient at any voxel.

The regularization strength, \(\alpha_{TV}\) is updated after each iteration by the discrepancy principle – specifically, it is selected to match the estimated variance after each iteration [69].

References

IsotropicModel#

class dipy.reconst.sfm.IsotropicModel(gtab)[source]#

Bases: ReconstModel

A base-class for the representation of isotropic signals.

The default behavior, suitable for single b-value data is to calculate the mean in each voxel as an estimate of the signal that does not depend on direction.

Methods

fit(data, *[, mask])

Fit an IsotropicModel.

fit(data, *, mask=None, **kwargs)[source]#

Fit an IsotropicModel.

This boils down to finding the mean diffusion-weighted signal in each voxel

Parameters:
datandarray
Returns:
IsotropicFit class instance.

IsotropicFit#

class dipy.reconst.sfm.IsotropicFit(model, params)[source]#

Bases: ReconstFit

A fit object for representing the isotropic signal as the mean of the diffusion-weighted signal.

Methods

predict(*[, gtab])

Predict the isotropic signal.

predict(*, gtab=None)[source]#

Predict the isotropic signal.

Based on a gradient table. In this case, the (naive!) prediction will be the mean of the diffusion-weighted signal in the voxels.

Parameters:
gtaba GradientTable class instance, optional

Defaults to use the gtab from the IsotropicModel from which this fit was derived.

ExponentialIsotropicModel#

class dipy.reconst.sfm.ExponentialIsotropicModel(gtab)[source]#

Bases: IsotropicModel

Representing the isotropic signal as a fit to an exponential decay function with b-values

Methods

fit(data, *[, mask])

fit(data, *, mask=None, **kwargs)[source]#
Parameters:
datandarray
maskarray, optional

A boolean array used to mark the coordinates in the data that should be analyzed. Has the shape data.shape[:-1]. Default: None, which implies that all points should be analyzed.

Returns:
ExponentialIsotropicFit class instance.

ExponentialIsotropicFit#

class dipy.reconst.sfm.ExponentialIsotropicFit(model, params)[source]#

Bases: IsotropicFit

A fit to the ExponentialIsotropicModel object, based on data.

Methods

predict(*[, gtab])

Predict the isotropic signal, based on a gradient table.

predict(*, gtab=None)[source]#

Predict the isotropic signal, based on a gradient table. In this case, the prediction will be for an exponential decay with the mean diffusivity derived from the data that was fit.

Parameters:
gtaba GradientTable class instance, optional

Defaults to use the gtab from the IsotropicModel from which this fit was derived.

SparseFascicleModel#

class dipy.reconst.sfm.SparseFascicleModel(gtab, *, sphere=None, response=(0.0015, 0.0005, 0.0005), solver='ElasticNet', l1_ratio=0.5, alpha=0.001, isotropic=None, seed=42)[source]#

Bases: ReconstModel, Cache

Methods

cache_clear()

Clear the cache.

cache_get(tag, key, *[, default])

Retrieve a value from the cache.

cache_set(tag, key, value)

Store a value in the cache.

design_matrix()

The design matrix for a SFM.

fit(data, *[, mask, num_processes, ...])

Fit the SparseFascicleModel object to data.

design_matrix()[source]#

The design matrix for a SFM.

Returns:
ndarray

The design matrix, where each column is a rotated version of the response function.

fit(data, *, mask=None, num_processes=1, parallel_backend='multiprocessing')[source]#

Fit the SparseFascicleModel object to data.

Parameters:
dataarray

The measured signal.

maskarray, optional

A boolean array used to mark the coordinates in the data that should be analyzed. Has the shape data.shape[:-1]. Default: None, which implies that all points should be analyzed.

num_processesint, optional

Split the fit calculation to a pool of children processes using joblib. This only applies to 4D data arrays. Default is 1, which does not require joblib and will run fit serially. If < 0 the maximal number of cores minus num_processes + 1 is used (enter -1 to use as many cores as possible). 0 raises an error.

parallel_backend: str, ParallelBackendBase instance or None

Specify the parallelization backend implementation. Supported backends are:

  • “loky” used by default, can induce some communication and memory overhead when exchanging input and output data with the worker Python processes.

  • “multiprocessing” previous process-based backend based on multiprocessing.Pool. Less robust than loky.

  • “threading” is a very low-overhead backend but it suffers from the Python Global Interpreter Lock if the called function relies a lot on Python objects. “threading” is mostly useful when the execution bottleneck is a compiled extension that explicitly releases the GIL (for instance a Cython loop wrapped in a “with nogil” block or an expensive call to a library such as NumPy).

Returns:
SparseFascicleFit object

SparseFascicleFit#

class dipy.reconst.sfm.SparseFascicleFit(model, beta, S0, iso)[source]#

Bases: ReconstFit

Methods

odf(sphere)

The orientation distribution function of the SFM

predict(*[, gtab, response, S0])

Predict the signal based on the SFM parameters

odf(sphere)[source]#

The orientation distribution function of the SFM

Parameters:
sphereSphere

The points in which the ODF is evaluated

Returns:
odfndarray of shape (x, y, z, sphere.vertices.shape[0])
predict(*, gtab=None, response=None, S0=None)[source]#

Predict the signal based on the SFM parameters

Parameters:
gtabGradientTable, optional

The bvecs/bvals to predict the signal on. Default: the gtab from the model object.

responselist of 3 elements, optional

The eigenvalues of a tensor which will serve as a kernel function. Default: the response of the model object. Default to use model.response.

S0float or array, optional

The non-diffusion-weighted signal. Default: use the S0 of the data

Returns:
pred_signdarray

The signal predicted in each voxel/direction

sfm_design_matrix#

dipy.reconst.sfm.sfm_design_matrix(gtab, sphere, response, *, mode='signal')[source]#

Construct the SFM design matrix

Parameters:
gtabGradientTable or Sphere

Sets the rows of the matrix, if the mode is ‘signal’, this should be a GradientTable. If mode is ‘odf’ this should be a Sphere.

sphereSphere

Sets the columns of the matrix

responselist of 3 elements

The eigenvalues of a tensor which will serve as a kernel function.

modestr {‘signal’ | ‘odf’}, optional

Choose the (default) ‘signal’ for a design matrix containing predicted signal in the measurements defined by the gradient table for putative fascicles oriented along the vertices of the sphere. Otherwise, choose ‘odf’ for an odf convolution matrix, with values of the odf calculated from a tensor with the provided response eigenvalues, evaluated at the b-vectors in the gradient table, for the tensors with principal diffusion directions along the vertices of the sphere.

Returns:
matndarray

A design matrix that can be used for one of the following operations: when the ‘signal’ mode is used, each column contains the putative signal in each of the bvectors of the gtab if a fascicle is oriented in the direction encoded by the sphere vertex corresponding to this column. This is used for deconvolution with a measured DWI signal. If the ‘odf’ mode is chosen, each column instead contains the values of the tensor ODF for a tensor with a principal diffusion direction corresponding to this vertex. This is used to generate odfs from the fits of the SFM for the purpose of tracking.

References

Examples

>>> import dipy.data as dpd
>>> data, gtab = dpd.dsi_voxels()
>>> sphere = dpd.get_sphere()
>>> from dipy.reconst.sfm import sfm_design_matrix

A canonical tensor approximating corpus-callosum voxels :footcite:p`Rokem2014`:

>>> tensor_matrix = sfm_design_matrix(gtab, sphere,
...                                   [0.0015, 0.0005, 0.0005])

A ‘stick’ function :footcite:p`Behrens2007`:

>>> stick_matrix = sfm_design_matrix(gtab, sphere, [0.001, 0, 0])

SphHarmModel#

class dipy.reconst.shm.SphHarmModel(gtab)[source]#

Bases: OdfModel, Cache

To be subclassed by all models that return a SphHarmFit when fit.

Methods

cache_clear()

Clear the cache.

cache_get(tag, key, *[, default])

Retrieve a value from the cache.

cache_set(tag, key, value)

Store a value in the cache.

fit(data)

To be implemented by specific odf models

sampling_matrix(sphere)

The matrix needed to sample ODFs from coefficients of the model.

sampling_matrix(sphere)[source]#

The matrix needed to sample ODFs from coefficients of the model.

Parameters:
sphereSphere

Points used to sample ODF.

Returns:
sampling_matrixarray

The size of the matrix will be (N, M) where N is the number of vertices on sphere and M is the number of coefficients needed by the model.

QballBaseModel#

class dipy.reconst.shm.QballBaseModel(gtab, sh_order_max, *, smooth=0.006, min_signal=1e-05, assume_normed=False)[source]#

Bases: SphHarmModel

To be subclassed by Qball type models.

Methods

cache_clear()

Clear the cache.

cache_get(tag, key, *[, default])

Retrieve a value from the cache.

cache_set(tag, key, value)

Store a value in the cache.

fit(data, *[, mask])

Fits the model to diffusion data and returns the model fit

sampling_matrix(sphere)

The matrix needed to sample ODFs from coefficients of the model.

fit(data, *, mask=None)[source]#

Fits the model to diffusion data and returns the model fit

SphHarmFit#

class dipy.reconst.shm.SphHarmFit(model, shm_coef, mask)[source]#

Bases: OdfFit

Diffusion data fit to a spherical harmonic model

Attributes:
shape
shm_coeff

The spherical harmonic coefficients of the odf

Methods

odf(sphere)

Samples the odf function on the points of a sphere

predict(*[, gtab, S0])

Predict the diffusion signal from the model coefficients.

gfa

gfa()[source]#
odf(sphere)[source]#

Samples the odf function on the points of a sphere

Parameters:
sphereSphere

The points on which to sample the odf.

Returns:
valuesndarray

The value of the odf on each point of sphere.

predict(*, gtab=None, S0=1.0)[source]#

Predict the diffusion signal from the model coefficients.

Parameters:
gtaba GradientTable class instance

The directions and bvalues on which prediction is desired

S0float array

The mean non-diffusion-weighted signal in each voxel.

property shape#
property shm_coeff#

The spherical harmonic coefficients of the odf

Make this a property for now, if there is a use case for modifying the coefficients we can add a setter or expose the coefficients more directly

CsaOdfModel#

class dipy.reconst.shm.CsaOdfModel(gtab, sh_order_max, *, smooth=0.006, min_signal=1e-05, assume_normed=False)[source]#

Bases: QballBaseModel

Implementation of Constant Solid Angle reconstruction method.

See [6] for further details about the method.

Methods

cache_clear()

Clear the cache.

cache_get(tag, key, *[, default])

Retrieve a value from the cache.

cache_set(tag, key, value)

Store a value in the cache.

fit(data, *[, mask])

Fits the model to diffusion data and returns the model fit

sampling_matrix(sphere)

The matrix needed to sample ODFs from coefficients of the model.

References

max = 0.999#
min = 0.001#

OpdtModel#

class dipy.reconst.shm.OpdtModel(gtab, sh_order_max, *, smooth=0.006, min_signal=1e-05, assume_normed=False)[source]#

Bases: QballBaseModel

Implementation of Orientation Probability Density Transform reconstruction method.

See [8] and [9] for further details about the method.

Methods

cache_clear()

Clear the cache.

cache_get(tag, key, *[, default])

Retrieve a value from the cache.

cache_set(tag, key, value)

Store a value in the cache.

fit(data, *[, mask])

Fits the model to diffusion data and returns the model fit

sampling_matrix(sphere)

The matrix needed to sample ODFs from coefficients of the model.

References

QballModel#

class dipy.reconst.shm.QballModel(gtab, sh_order_max, *, smooth=0.006, min_signal=1e-05, assume_normed=False)[source]#

Bases: QballBaseModel

Implementation of regularized Qball reconstruction method.

See [7] for further details about the method.

Methods

cache_clear()

Clear the cache.

cache_get(tag, key, *[, default])

Retrieve a value from the cache.

cache_set(tag, key, value)

Store a value in the cache.

fit(data, *[, mask])

Fits the model to diffusion data and returns the model fit

sampling_matrix(sphere)

The matrix needed to sample ODFs from coefficients of the model.

References

ResidualBootstrapWrapper#

class dipy.reconst.shm.ResidualBootstrapWrapper(signal_object, B, where_dwi, *, min_signal=1e-05)[source]#

Bases: object

Returns a residual bootstrap sample of the signal_object when indexed

Wraps a signal_object, this signal object can be an interpolator. When indexed, the wrapper indexes the signal_object to get the signal. There wrapper than samples the residual bootstrap distribution of signal and returns that sample.

forward_sdeconv_mat#

dipy.reconst.shm.forward_sdeconv_mat(r_rh, l_values)[source]#

Build forward spherical deconvolution matrix

Parameters:
r_rhndarray

Rotational harmonics coefficients for the single fiber response function. Each element rh[i] is associated with spherical harmonics of order 2*i.

l_valuesndarray

The orders (\(l\)) of spherical harmonic function associated with each row of the deconvolution matrix. Only even orders are allowed

Returns:
Rndarray (N, N)

Deconvolution matrix with shape (N, N)

sh_to_rh#

dipy.reconst.shm.sh_to_rh(r_sh, m_values, l_values)[source]#

Spherical harmonics (SH) to rotational harmonics (RH)

Calculate the rotational harmonic decomposition up to harmonic phase factor m, order l for an axially and antipodally symmetric function. Note that all m != 0 coefficients will be ignored as axial symmetry is assumed. Hence, there will be (sh_order/2 + 1) non-zero coefficients.

See [13] for further details about the method.

Parameters:
r_shndarray (N,)

ndarray of SH coefficients for the single fiber response function. These coefficients must correspond to the real spherical harmonic functions produced by shm.real_sh_descoteaux_from_index.

m_valuesndarray (N,)

The phase factors (\(m\)) of the spherical harmonic function associated with each coefficient.

l_valuesndarray (N,)

The orders (\(l\)) of the spherical harmonic function associated with each coefficient.

Returns:
r_rhndarray ((sh_order + 1)*(sh_order + 2)/2,)

Rotational harmonics coefficients representing the input r_sh

See also

shm.real_sh_descoteaux_from_index, shm.real_sh_descoteaux

References

gen_dirac#

dipy.reconst.shm.gen_dirac(m_values, l_values, theta, phi, *, legacy=True)[source]#

Generate Dirac delta function orientated in (theta, phi) on the sphere

The spherical harmonics (SH) representation of this Dirac is returned as coefficients to spherical harmonic functions produced from descoteaux07 basis.

Parameters:
m_valuesndarray (N,)

The phase factors of the spherical harmonic function associated with each coefficient.

l_valuesndarray (N,)

The order (\(l\)) of the spherical harmonic function associated with each coefficient.

thetafloat [0, pi]

The polar (colatitudinal) coordinate.

phifloat [0, 2*pi]

The azimuthal (longitudinal) coordinate.

legacy: bool, optional

If true, uses DIPY’s legacy descoteaux07 implementation (where \(|m|\) is used for m < 0). Else, implements the basis as defined in Descoteaux et al. 2007 (without the absolute value).

Returns:
diracndarray

SH coefficients representing the Dirac function. The shape of this is (m + 2) * (m + 1) / 2.

See also

shm.real_sh_descoteaux_from_index, shm.real_sh_descoteaux

spherical_harmonics#

dipy.reconst.shm.spherical_harmonics(m_values, l_values, theta, phi, *, use_scipy=True)[source]#

Compute spherical harmonics.

This may take scalar or array arguments. The inputs will be broadcast against each other.

Parameters:
m_valuesarray of int |m| <= l

The phase factors (\(m\)) of the harmonics.

l_valuesarray of int l >= 0

The orders (\(l\)) of the harmonics.

thetafloat [0, 2*pi]

The azimuthal (longitudinal) coordinate.

phifloat [0, pi]

The polar (colatitudinal) coordinate.

use_scipybool, optional

If True, use scipy implementation.

Returns:
y_mncomplex float

The harmonic \(Y_l^m\) sampled at theta and phi.

Notes

This is a faster implementation of scipy.special.sph_harm for scipy version < 0.15.0. For scipy 0.15 and onwards, we use the scipy implementation of the function.

The usual definitions for theta` and `phi used in DIPY are interchanged in the method definition to agree with the definitions in scipy.special.sph_harm, where theta represents the azimuthal coordinate and phi represents the polar coordinate.

Although scipy uses a naming convention where m is the order and n is the degree of the SH, the opposite of DIPY’s, their definition for both parameters is the same as ours, with l >= 0 and |m| <= l.

real_sph_harm#

dipy.reconst.shm.real_sph_harm(m_values, l_values, theta, phi)[source]#

Compute real spherical harmonics.

dipy.reconst.shm.real_sph_harm is deprecated, Please use dipy.reconst.shm.real_sh_descoteaux_from_index instead

  • deprecated from version: 1.3

  • Will raise <class ‘dipy.utils.deprecator.ExpiredDeprecationError’> as of version: 2.0

Where the real harmonic \(Y_l^m\) is defined to be:

Y_l^m = \begin{cases} \sqrt{2} * \Im(Y_l^m) \; if m > 0 \\ Y^0_l \; if m = 0 \\ \sqrt{2} * \Re(Y_l^{|m|}) \; if m < 0 \\ \end{cases}

This may take scalar or array arguments. The inputs will be broadcast against each other.

Parameters:
m_valuesarray of int |m| <= l

The phase factors (\(m\)) of the harmonics.

l_valuesarray of int l >= 0

The orders (\(l\)) of the harmonics.

thetafloat [0, pi]

The polar (colatitudinal) coordinate.

phifloat [0, 2*pi]

The azimuthal (longitudinal) coordinate.

Returns:
y_mnreal float

The real harmonic \(Y_l^m\) sampled at theta and phi.

See also

scipy.special.sph_harm

real_sh_tournier_from_index#

dipy.reconst.shm.real_sh_tournier_from_index(m_values, l_values, theta, phi, *, legacy=True)[source]#

Compute real spherical harmonics.

The SH are computed as initially defined in [13] then updated in MRtrix3 [70], where the real harmonic \(Y_l^m\) is defined to be:

Y_l^m = \begin{cases} \sqrt{2} * \Re(Y_l^m) \; if m > 0 \\ Y^0_l \; if m = 0 \\ \sqrt{2} * \Im(Y_l^{|m|}) \; if m < 0 \\ \end{cases}

This may take scalar or array arguments. The inputs will be broadcast against each other.

Parameters:
m_valuesarray of int |m| <= l

The phase factors (\(m\)) of the harmonics.

l_valuesarray of int l >= 0

The orders (\(l\)) of the harmonics.

thetafloat [0, pi]

The polar (colatitudinal) coordinate.

phifloat [0, 2*pi]

The azimuthal (longitudinal) coordinate.

legacy: bool, optional

If true, uses MRtrix 0.2 SH basis definition, where the sqrt(2) factor is omitted. Else, uses the MRtrix 3 definition presented above.

Returns:
real_shreal float

The real harmonics \(Y_l^m\) sampled at theta and phi.

References

real_sh_descoteaux_from_index#

dipy.reconst.shm.real_sh_descoteaux_from_index(m_values, l_values, theta, phi, *, legacy=True)[source]#

Compute real spherical harmonics.

The definition adopted here follows [7], where the real harmonic \(Y_l^m\) is defined to be:

Y_l^m = \begin{cases} \sqrt{2} * \Im(Y_l^m) \; if m > 0 \\ Y^0_l \; if m = 0 \\ \sqrt{2} * \Re(Y_l^m) \; if m < 0 \\ \end{cases}

This may take scalar or array arguments. The inputs will be broadcast against each other.

Parameters:
m_valuesarray of int |m| <= l

The phase factors (\(m\)) of the harmonics.

l_valuesarray of int l >= 0

The orders (\(l\)) of the harmonics.

thetafloat [0, pi]

The polar (colatitudinal) coordinate.

phifloat [0, 2*pi]

The azimuthal (longitudinal) coordinate.

legacy: bool, optional

If true, uses DIPY’s legacy descoteaux07 implementation (where \(|m|\) is used for m < 0). Else, implements the basis as defined in Descoteaux et al. 2007 (without the absolute value).

Returns:
real_shreal float

The real harmonic \(Y_l^m\) sampled at theta and phi.

References

real_sh_tournier#

dipy.reconst.shm.real_sh_tournier(sh_order_max, theta, phi, *, full_basis=False, legacy=True)[source]#

Compute real spherical harmonics.

The SH are computed as initially defined in [13] then updated in MRtrix3 [70], where the real harmonic \(Y_l^m\) is defined to be:

Y_l^m = \begin{cases} \sqrt{2} * \Re(Y_l^m) \; if m > 0 \\ Y^0_l \; if m = 0 \\ \sqrt{2} * \Im(Y_l^{|m|}) \; if m < 0 \\ \end{cases}

This may take scalar or array arguments. The inputs will be broadcast against each other.

Parameters:
sh_order_maxint

The maximum order (\(l\)) of the spherical harmonic basis.

thetafloat [0, pi]

The polar (colatitudinal) coordinate.

phifloat [0, 2*pi]

The azimuthal (longitudinal) coordinate.

full_basis: bool, optional

If true, returns a basis including odd order SH functions as well as even order SH functions. Else returns only even order SH functions.

legacy: bool, optional

If true, uses MRtrix 0.2 SH basis definition, where the sqrt(2) factor is omitted. Else, uses MRtrix 3 definition presented above.

Returns:
real_shreal float

The real harmonic \(Y_l^m\) sampled at theta and phi.

m_valuesarray of int

The phase factor (\(m\)) of the harmonics.

l_valuesarray of int

The order (\(l\)) of the harmonics.

References

real_sh_descoteaux#

dipy.reconst.shm.real_sh_descoteaux(sh_order_max, theta, phi, *, full_basis=False, legacy=True)[source]#

Compute real spherical harmonics.

The definition adopted here follows [7], where the real harmonic \(Y_l^m\) is defined to be:

Y_l^m = \begin{cases} \sqrt{2} * \Im(Y_l^m) \; if m > 0 \\ Y^0_l \; if m = 0 \\ \sqrt{2} * \Re(Y_l^m) \; if m < 0 \\ \end{cases}

This may take scalar or array arguments. The inputs will be broadcast against each other.

Parameters:
sh_order_maxint

The maximum order (\(l\)) of the spherical harmonic basis.

thetafloat [0, pi]

The polar (colatitudinal) coordinate.

phifloat [0, 2*pi]

The azimuthal (longitudinal) coordinate.

full_basis: bool, optional

If true, returns a basis including odd order SH functions as well as even order SH functions. Otherwise returns only even order SH functions.

legacy: bool, optional

If true, uses DIPY’s legacy descoteaux07 implementation (where \(|m|\) for m < 0). Else, implements the basis as defined in Descoteaux et al. 2007.

Returns:
real_shreal float

The real harmonic \(Y_l^m\) sampled at theta and phi.

m_valuesarray of int

The phase factor (\(m\)) of the harmonics.

l_valuesarray of int

The order (\(l\)) of the harmonics.

References

real_sym_sh_mrtrix#

dipy.reconst.shm.real_sym_sh_mrtrix(sh_order_max, theta, phi)[source]#

dipy.reconst.shm.real_sym_sh_mrtrix is deprecated, Please use dipy.reconst.shm.real_sh_tournier instead

  • deprecated from version: 1.3

  • Will raise <class ‘dipy.utils.deprecator.ExpiredDeprecationError’> as of version: 2.0

Compute real symmetric spherical harmonics.

The SH are computed as initially defined in Tournier et al.[13], where the real harmonic \(Y_l^m\) is defined to be:

Y_l^m = \begin{cases} \Re(Y_l^m) \; if m > 0 \\ Y^0_l \; if m = 0 \\ \Im(Y_l^{|m|}) \; if m < 0 \\ \end{cases}

This may take scalar or array arguments. The inputs will be broadcast against each other.

Parameters:
sh_order_maxint

The maximum order (\(l\)) of the spherical harmonic basis.

thetafloat [0, pi]

The polar (colatitudinal) coordinate.

phifloat [0, 2*pi]

The azimuthal (longitudinal) coordinate.

Returns:
y_mnreal float

The real harmonic \(Y_l^m\) sampled at theta and phi as implemented in mrtrix. Warning: the basis is Tournier et al.[13]; [16] is slightly different.

m_valuesarray

The phase factor (\(m\)) of the harmonics.

l_valuesarray

The order (\(l\)) of the harmonics.

References

real_sym_sh_basis#

dipy.reconst.shm.real_sym_sh_basis(sh_order_max, theta, phi)[source]#

Samples a real symmetric spherical harmonic basis at point on the sphere

dipy.reconst.shm.real_sym_sh_basis is deprecated, Please use dipy.reconst.shm.real_sh_descoteaux instead

  • deprecated from version: 1.3

  • Will raise <class ‘dipy.utils.deprecator.ExpiredDeprecationError’> as of version: 2.0

Samples the basis functions up to order sh_order_max at points on the sphere given by theta and phi. The basis functions are defined here the same way as in [7] where the real harmonic \(Y_l^m\) is defined to be:

Y_l^m = \begin{cases} \sqrt{2} * \Im(Y_l^m) \; if m > 0 \\ Y^0_l \; if m = 0 \\ \sqrt{2} * \Im(Y_l^{|m|}) \; if m < 0 \\ \end{cases}

This may take scalar or array arguments. The inputs will be broadcast against each other.

Parameters:
sh_order_maxint

The maximum order (\(l\)) of the spherical harmonic basis. Even int > 0, max spherical harmonic order

thetafloat [0, 2*pi]

The azimuthal (longitudinal) coordinate.

phifloat [0, pi]

The polar (colatitudinal) coordinate.

Returns:
y_mnreal float

The real harmonic \(Y_l^m\) sampled at theta and phi

m_valuesarray of int

The phase factor (\(m\)) of the harmonics.

l_valuesarray of int

The order (\(l\)) of the harmonics.

References

sph_harm_ind_list#

dipy.reconst.shm.sph_harm_ind_list(sh_order_max, *, full_basis=False)[source]#

Returns the order (l) and phase_factor (m) of all the symmetric spherical harmonics of order less then or equal to sh_order_max. The results, m_list and l_list are kx1 arrays, where k depends on sh_order_max. They can be passed to real_sh_descoteaux_from_index() and :func:real_sh_tournier_from_index.

Parameters:
sh_order_maxint

The maximum order (\(l\)) of the spherical harmonic basis. Even int > 0, max order to return

full_basis: bool, optional

True for SH basis with even and odd order terms

Returns:
m_listarray of int

phase factors (\(m\)) of even spherical harmonics

l_listarray of int

orders (\(l\)) of even spherical harmonics

See also

shm.real_sh_descoteaux_from_index, shm.real_sh_tournier_from_index

order_from_ncoef#

dipy.reconst.shm.order_from_ncoef(ncoef, *, full_basis=False)[source]#

Given a number n of coefficients, calculate back the sh_order_max

Parameters:
ncoef: int

number of coefficients

full_basis: bool, optional

True when coefficients are for a full SH basis.

Returns:
sh_order_max: int

maximum order (\(l\)) of SH basis

smooth_pinv#

dipy.reconst.shm.smooth_pinv(B, L)[source]#

Regularized pseudo-inverse

Computes a regularized least square inverse of B

Parameters:
Barray_like (n, m)

Matrix to be inverted

Larray_like (m,)
Returns:
invndarray (m, n)

regularized least square inverse of B

Notes

In the literature this inverse is often written \((B^{T}B+L^{2})^{-1}B^{T}\). However here this inverse is implemented using the pseudo-inverse because it is more numerically stable than the direct implementation of the matrix product.

lazy_index#

dipy.reconst.shm.lazy_index(index)[source]#

Produces a lazy index

Returns a slice that can be used for indexing an array, if no slice can be made index is returned as is.

normalize_data#

dipy.reconst.shm.normalize_data(data, where_b0, *, min_signal=1e-05, out=None)[source]#

Normalizes the data with respect to the mean b0

hat#

dipy.reconst.shm.hat(B)[source]#

Returns the hat matrix for the design matrix B

lcr_matrix#

dipy.reconst.shm.lcr_matrix(H)[source]#

Returns a matrix for computing leveraged, centered residuals from data

if r = (d-Hd), the leveraged centered residuals are lcr = (r/l)-mean(r/l) returns the matrix R, such that lcr = Rd

bootstrap_data_array#

dipy.reconst.shm.bootstrap_data_array(data, H, R, *, permute=None)[source]#

Applies the Residual Bootstraps to the data given H and R

data must be normalized, ie 0 < data <= 1

This function, and the bootstrap_data_voxel function, calculate residual-bootstrap samples given a Hat matrix and a Residual matrix. These samples can be used for non-parametric statistics or for bootstrap probabilistic tractography,

See [71], [72], and [73].

References

bootstrap_data_voxel#

dipy.reconst.shm.bootstrap_data_voxel(data, H, R, *, permute=None)[source]#

Like bootstrap_data_array but faster when for a single voxel

data must be 1d and normalized

sf_to_sh#

dipy.reconst.shm.sf_to_sh(sf, sphere, *, sh_order_max=4, basis_type=None, full_basis=False, legacy=True, smooth=0.0)[source]#

Spherical function to spherical harmonics (SH).

Parameters:
sfndarray

Values of a function on the given sphere.

sphereSphere

The points on which the sf is defined.

sh_order_maxint, optional

Maximum SH order (l) in the SH fit. For sh_order_max, there will be (sh_order_max + 1) * (sh_order_max + 2) / 2 SH coefficients for a symmetric basis and (sh_order_max + 1) * (sh_order_max + 1) coefficients for a full SH basis.

basis_type{None, ‘tournier07’, ‘descoteaux07’}, optional

None for the default DIPY basis, tournier07 for the Tournier 2007 [13], [70] basis, descoteaux07 for the Descoteaux 2007 [7] basis, (None defaults to descoteaux07).

full_basis: bool, optional

True for using a SH basis containing even and odd order SH functions. False for using a SH basis consisting only of even order SH functions.

legacy: bool, optional

True to use a legacy basis definition for backward compatibility with previous tournier07 and descoteaux07 implementations.

smoothfloat, optional

Lambda-regularization in the SH fit.

Returns:
shndarray

SH coefficients representing the input function.

References

sh_to_sf#

dipy.reconst.shm.sh_to_sf(sh, sphere, *, sh_order_max=4, basis_type=None, full_basis=False, legacy=True)[source]#

Spherical harmonics (SH) to spherical function (SF).

Parameters:
shndarray

SH coefficients representing a spherical function.

sphereSphere

The points on which to sample the spherical function.

sh_order_maxint, optional

Maximum SH order (l) in the SH fit. For sh_order_max, there will be (sh_order_max + 1) * (sh_order_max + 2) / 2 SH coefficients for a symmetric basis and (sh_order_max + 1) * (sh_order_max + 1) coefficients for a full SH basis.

basis_type{None, ‘tournier07’, ‘descoteaux07’}, optional

None for the default DIPY basis, tournier07 for the Tournier 2007 [13], [70] basis, descoteaux07 for the Descoteaux 2007 [7] basis, (None defaults to descoteaux07).

full_basis: bool, optional

True to use a SH basis containing even and odd order SH functions. Else, use a SH basis consisting only of even order SH functions.

legacy: bool, optional

True to use a legacy basis definition for backward compatibility with previous tournier07 and descoteaux07 implementations.

Returns:
sfndarray

Spherical function values on the sphere.

References

sh_to_sf_matrix#

dipy.reconst.shm.sh_to_sf_matrix(sphere, *, sh_order_max=4, basis_type=None, full_basis=False, legacy=True, return_inv=True, smooth=0)[source]#

Matrix that transforms Spherical harmonics (SH) to spherical function (SF).

Parameters:
sphereSphere

The points on which to sample the spherical function.

sh_order_maxint, optional

Maximum SH order in the SH fit. For sh_order_max, there will be (sh_order_max + 1) * (sh_order_max + 2) / 2 SH coefficients for a symmetric basis and (sh_order_max + 1) * (sh_order_max + 1) coefficients for a full SH basis.

basis_type{None, ‘tournier07’, ‘descoteaux07’}, optional

None for the default DIPY basis, tournier07 for the Tournier 2007 [13], [70] basis, descoteaux07 for the Descoteaux 2007 [7] basis, (None defaults to descoteaux07).

full_basis: bool, optional

If True, uses a SH basis containing even and odd order SH functions. Else, uses a SH basis consisting only of even order SH functions.

legacy: bool, optional

True to use a legacy basis definition for backward compatibility with previous tournier07 and descoteaux07 implementations.

return_invbool, optional

If True then the inverse of the matrix is also returned.

smoothfloat, optional

Lambda-regularization in the SH fit.

Returns:
Bndarray

Matrix that transforms spherical harmonics to spherical function sf = np.dot(sh, B).

invBndarray

Inverse of B.

References

calculate_max_order#

dipy.reconst.shm.calculate_max_order(n_coeffs, *, full_basis=False)[source]#

Calculate the maximal harmonic order (l), given that you know the number of parameters that were estimated.

Parameters:
n_coeffsint

The number of SH coefficients

full_basis: bool, optional

True if the used SH basis contains even and odd order SH functions. False if the SH basis consists only of even order SH functions.

Returns:
Lint

The maximal SH order (l), given the number of coefficients

Notes

The calculation in this function for the symmetric SH basis proceeds according to the following logic:

\[n = \frac{1}{2} (L+1) (L+2) \rarrow 2n = L^2 + 3L + 2 \rarrow L^2 + 3L + 2 - 2n = 0 \rarrow L^2 + 3L + 2(1-n) = 0 \rarrow L_{1,2} = \frac{-3 \pm \sqrt{9 - 8 (1-n)}}{2} \rarrow L{1,2} = \frac{-3 \pm \sqrt{1 + 8n}}{2}\]

Finally, the positive value is chosen between the two options.

For a full SH basis, the calculation consists in solving the equation \(n = (L + 1)^2\) for \(L\), which gives \(L = sqrt(n) - 1\).

anisotropic_power#

dipy.reconst.shm.anisotropic_power(sh_coeffs, *, norm_factor=1e-05, power=2, non_negative=True)[source]#

Calculate anisotropic power map with a given SH coefficient matrix.

See [74] for further details about the method.

Parameters:
sh_coeffsndarray

A ndarray where the last dimension is the SH coefficients estimates for that voxel.

norm_factor: float, optional

The value to normalize the ap values.

powerint, optional

The degree to which power maps are calculated.

non_negative: bool, optional

Whether to rectify the resulting map to be non-negative.

Returns:
log_apndarray

The log of the resulting power image.

Notes

Calculate AP image based on a IxJxKxC SH coefficient matrix based on the equation:

\[AP = \sum_{l=2,4,6,...}{\frac{1}{2l+1} \sum_{m=-l}^l{|a_{l,m}|^n}}\]

Where the last dimension, C, is made of a flattened array of \(l`x:math:`m\) coefficients, where \(l\) are the SH orders, and \(m = 2l+1\), So l=1 has 1 coefficient, l=2 has 5, … l=8 has 17 and so on. A l=2 SH coefficient matrix will then be composed of a IxJxKx6 volume. The power, \(n\) is usually set to \(n=2\).

The final AP image is then shifted by -log(norm_factor), to be strictly non-negative. Remaining values < 0 are discarded (set to 0), per default, and this option is controlled through the non_negative keyword argument.

References

convert_sh_to_full_basis#

dipy.reconst.shm.convert_sh_to_full_basis(sh_coeffs)[source]#

Given an array of SH coeffs from a symmetric basis, returns the coefficients for the full SH basis by filling odd order SH coefficients with zeros

Parameters:
sh_coeffs: ndarray

A ndarray where the last dimension is the SH coefficients estimates for that voxel.

Returns:
full_sh_coeffs: ndarray

A ndarray where the last dimension is the SH coefficients estimates for that voxel in a full SH basis.

convert_sh_from_legacy#

dipy.reconst.shm.convert_sh_from_legacy(sh_coeffs, sh_basis, *, full_basis=False)[source]#

Convert SH coefficients in legacy SH basis to SH coefficients of the new SH basis for descoteaux07 or tournier07 bases.

See [7] and [13], [70] for the descoteaux07 and tournier07 bases, respectively.

Parameters:
sh_coeffs: ndarray

A ndarray where the last dimension is the SH coefficients estimates for that voxel.

sh_basis: {‘descoteaux07’, ‘tournier07’}

tournier07 for the Tournier 2007 [13], [70] basis, descoteaux07 for the Descoteaux 2007 [7] basis.

full_basis: bool, optional

True if the input SH basis includes both even and odd order SH functions, else False.

Returns:
out_sh_coeffs: ndarray

The array of coefficients expressed in the new SH basis.

References

convert_sh_to_legacy#

dipy.reconst.shm.convert_sh_to_legacy(sh_coeffs, sh_basis, *, full_basis=False)[source]#

Convert SH coefficients in new SH basis to SH coefficients for the legacy SH basis for descoteaux07 or tournier07 bases.

See [7] and [13], [70] for the descoteaux07 and tournier07 bases, respectively.

Parameters:
sh_coeffs: ndarray

A ndarray where the last dimension is the SH coefficients estimates for that voxel.

sh_basis: {‘descoteaux07’, ‘tournier07’}

tournier07 for the Tournier 2007 [13], [70] basis, descoteaux07 for the Descoteaux 2007 [7] basis.

full_basis: bool, optional

True if the input SH basis includes both even and odd order SH functions.

Returns:
out_sh_coeffs: ndarray

The array of coefficients expressed in the legacy SH basis.

References

convert_sh_descoteaux_tournier#

dipy.reconst.shm.convert_sh_descoteaux_tournier(sh_coeffs)[source]#

Convert SH coefficients between legacy-descoteaux07 and tournier07.

Convert SH coefficients between the legacy descoteaux07 SH basis and the non-legacy tournier07 SH basis. Because this conversion is equal to its own inverse, it can be used to convert in either direction: legacy-descoteaux to non-legacy-tournier or non-legacy-tournier to legacy-descoteaux.

This can be used to convert SH representations between DIPY and MRtrix3.

See [7] and [70] for the origin of these SH bases.

See [mrtrixbasis] for a description of the basis used in MRtrix3. See [mrtrixdipybases] for more details on the conversion.

Parameters:
sh_coeffs: ndarray

A ndarray where the last dimension is the SH coefficients estimates for that voxel.

Returns:
out_sh_coeffs: ndarray

The array of coefficients expressed in the “other” SH basis. If the input was in the legacy-descoteaux basis then the output will be in the non-legacy-tournier basis, and vice versa.

References

ShoreModel#

class dipy.reconst.shore.ShoreModel(gtab, *, radial_order=6, zeta=700, lambdaN=1e-08, lambdaL=1e-08, tau=0.025330295910584444, constrain_e0=False, positive_constraint=False, pos_grid=11, pos_radius=0.02, cvxpy_solver=None)[source]#

Bases: Cache

Simple Harmonic Oscillator based Reconstruction and Estimation (SHORE) of the diffusion signal.

The main idea of SHORE [75] is to model the diffusion signal as a linear combination of continuous functions \(\phi_i\),

\[S(\mathbf{q})= \sum_{i=0}^I c_{i} \phi_{i}(\mathbf{q})\]

where \(\mathbf{q}\) is the wave vector which corresponds to different gradient directions. Numerous continuous functions \(\phi_i\) can be used to model \(S\). Some are presented in [76], [77], and [78].

From the \(c_i\) coefficients, there exist analytical formulae to estimate the ODF, the return to the origin probability (RTOP), the mean square displacement (MSD), amongst others [58].

Methods

cache_clear()

Clear the cache.

cache_get(tag, key, *[, default])

Retrieve a value from the cache.

cache_set(tag, key, value)

Store a value in the cache.

fit(data, *[, mask])

Fit method for every voxel in data

Notes

The implementation of SHORE depends on CVXPY (https://www.cvxpy.org/).

References

fit(data, *, mask=None, **kwargs)#

Fit method for every voxel in data

ShoreFit#

class dipy.reconst.shore.ShoreFit(model, shore_coef)[source]#

Bases: object

Attributes:
shore_coeff

The SHORE coefficients

Methods

fitted_signal()

The fitted signal.

msd()

Calculates the analytical mean squared displacement (MSD).

odf(sphere)

Calculates the ODF for a given discrete sphere.

odf_sh()

Calculates the real analytical ODF in terms of Spherical Harmonics.

pdf(r_points)

Diffusion propagator on a given set of real points.

pdf_grid(gridsize, radius_max)

Applies the analytical FFT on \(S\) to generate the diffusion propagator.

rtop_pdf()

Calculates the analytical return to origin probability (RTOP) from the pdf.

rtop_signal()

Calculates the analytical return to origin probability (RTOP) from the signal.

fitted_signal()[source]#

The fitted signal.

msd()[source]#

Calculates the analytical mean squared displacement (MSD).

See [32] for a definition of the method.

MSD:{DSI}=\int_{-\infty}^{\infty}\int_{-\infty}^{\infty} \int_{-\infty}^{\infty} P(\hat{\mathbf{r}}) \cdot \hat{\mathbf{r}}^{2} \ dr_x \ dr_y \ dr_z

where \(\hat{\mathbf{r}}\) is a point in the 3D propagator space (see Wu and Alexander[32]).

References

odf(sphere)[source]#

Calculates the ODF for a given discrete sphere.

odf_sh()[source]#

Calculates the real analytical ODF in terms of Spherical Harmonics.

pdf(r_points)[source]#

Diffusion propagator on a given set of real points. if the array r_points is non writeable, then intermediate results are cached for faster recalculation

pdf_grid(gridsize, radius_max)[source]#

Applies the analytical FFT on \(S\) to generate the diffusion propagator. This is calculated on a discrete 3D grid in order to obtain an EAP similar to that which is obtained with DSI.

Parameters:
gridsizeunsigned int

dimension of the propagator grid

radius_maxfloat

maximal radius in which to compute the propagator

Returns:
eapndarray

the ensemble average propagator in the 3D grid

rtop_pdf()[source]#

Calculates the analytical return to origin probability (RTOP) from the pdf.

See [58] for further details about the method.

References

rtop_signal()[source]#

Calculates the analytical return to origin probability (RTOP) from the signal.

See [58] for further details about the method.

References

property shore_coeff#

The SHORE coefficients

shore_matrix#

dipy.reconst.shore.shore_matrix(radial_order, zeta, gtab, *, tau=0.025330295910584444)[source]#

Compute the SHORE matrix for modified Merlet’s 3D-SHORE.

See [76] for the definition.

\textbf{E}(q\textbf{u})=\sum_{l=0, even}^{N_{max}} \sum_{n=l}^{(N_{max}+l)/2} \sum_{m=-l}^l c_{nlm} \phi_{nlm}(q\textbf{u})

where \(\phi_{nlm}\) is

\phi_{nlm}^{SHORE}(q\textbf{u})=\Biggl[\dfrac{2(n-l)!} {\zeta^{3/2} \Gamma(n+3/2)} \Biggr]^{1/2} \Biggl(\dfrac{q^2}{\zeta}\Biggr)^{l/2} exp\Biggl(\dfrac{-q^2}{2\zeta}\Biggr) L^{l+1/2}_{n-l} \Biggl(\dfrac{q^2}{\zeta}\Biggr) Y_l^m(\textbf{u})
Parameters:
radial_orderunsigned int,

an even integer that represent the order of the basis

zetaunsigned int,

scale factor

gtabGradientTable,

gradient directions and bvalues container class

taufloat, optional

diffusion time. By default the value that makes q=sqrt(b).

References

shore_matrix_pdf#

dipy.reconst.shore.shore_matrix_pdf(radial_order, zeta, rtab)[source]#

Compute the SHORE propagator matrix.

See [76] for the definition.

Parameters:
radial_orderunsigned int,

an even integer that represent the order of the basis

zetaunsigned int,

scale factor

rtabarray, shape (N,3)

real space points in which calculates the pdf

References

shore_matrix_odf#

dipy.reconst.shore.shore_matrix_odf(radial_order, zeta, sphere_vertices)[source]#

Compute the SHORE ODF matrix.

See [76] for the definition.

Parameters:
radial_orderunsigned int,

an even integer that represent the order of the basis

zetaunsigned int,

scale factor

sphere_verticesarray, shape (N,3)

vertices of the odf sphere

References

l_shore#

dipy.reconst.shore.l_shore(radial_order)[source]#

Returns the angular regularisation matrix for SHORE basis

n_shore#

dipy.reconst.shore.n_shore(radial_order)[source]#

Returns the angular regularisation matrix for SHORE basis

create_rspace#

dipy.reconst.shore.create_rspace(gridsize, radius_max)[source]#
Create the real space table, that contains the points in which

to compute the pdf.

Parameters:
gridsizeunsigned int

dimension of the propagator grid

radius_maxfloat

maximal radius in which compute the propagator

Returns:
vecsarray, shape (N,3)

positions of the pdf points in a 3D matrix

tabarray, shape (N,3)

real space points in which calculates the pdf

shore_indices#

dipy.reconst.shore.shore_indices(radial_order, index)[source]#

Given the basis order and the index, return the shore indices n, l, m for modified Merlet’s 3D-SHORE

\begin{equation} \textbf{E}(q\textbf{u})=\sum_{l=0, even}^{N_{max}} \sum_{n=l}^{(N_{max}+l)/2} \sum_{m=-l}^l c_{nlm} \phi_{nlm}(q\textbf{u}) \end{equation}

where \(\phi_{nlm}\) is

\begin{equation} \phi_{nlm}^{SHORE}(q\textbf{u})=\Biggl[\dfrac{2(n-l)!} {\zeta^{3/2} \Gamma(n+3/2)} \Biggr]^{1/2} \Biggl(\dfrac{q^2}{\zeta}\Biggr)^{l/2} exp\Biggl(\dfrac{-q^2}{2\zeta}\Biggr) L^{l+1/2}_{n-l} \Biggl(\dfrac{q^2}{\zeta}\Biggr) Y_l^m(\textbf{u}). \end{equation}
Parameters:
radial_orderunsigned int

an even integer that represent the maximal order of the basis

indexunsigned int

index of the coefficients, start from 0

Returns:
nunsigned int

the index n of the modified shore basis

lunsigned int

the index l of the modified shore basis

munsigned int

the index m of the modified shore basis

shore_order#

dipy.reconst.shore.shore_order(n, ell, m)[source]#

Given the indices (n,l,m) of the basis, return the minimum order for those indices and their index for modified Merlet’s 3D-SHORE.

Parameters:
nunsigned int

the index n of the modified shore basis

ellunsigned int

the index l of the modified shore basis

munsigned int

the index m of the modified shore basis

Returns:
radial_orderunsigned int

an even integer that represent the maximal order of the basis

indexunsigned int

index of the coefficient corresponding to (n,l,m), start from 0

dki_design_matrix#

dipy.reconst.utils.dki_design_matrix(gtab)[source]#

Construct B design matrix for DKI.

Parameters:
gtabGradientTable

Measurement directions.

Returns:
Barray (N, 22)

Design matrix or B matrix for the DKI model

\[B[j, :] = (Bxx, Bxy, Byy, Bxz, Byz, Bzz, Bxxxx, Byyyy, Bzzzz, Bxxxy, Bxxxz, Bxyyy, Byyyz, Bxzzz, Byzzz, Bxxyy, Bxxzz, Byyzz, Bxxyz, Bxyyz, Bxyzz, BlogS0)\]

cti_design_matrix#

dipy.reconst.utils.cti_design_matrix(gtab1, gtab2)[source]#

Construct B design matrix for CTI.

Parameters:
gtab1: dipy.core.gradients.GradientTable

A GradientTable class instance for first DDE diffusion epoch

gtab2: dipy.core.gradients.GradientTable

A GradientTable class instance for second DDE diffusion epoch

Returns:
B: array(N, 43)
Design matrix or B matrix for the CTI model assuming multiple
Gaussian Components

convert_tensors#

dipy.reconst.utils.convert_tensors(tensor, from_format, to_format)[source]#

Convert tensors from one format to another.

Parameters:
tensorndarray

Input tensor.

from_formatstr

Format of the input tensor. Options: ‘dipy’, ‘mrtrix’, ‘ants’, ‘fsl’.

to_formatstr

Format of the output tensor. Options: ‘dipy’, ‘mrtrix’, ‘ants’, ‘fsl’.

Notes

vec_val_vect#

dipy.reconst.vec_val_sum.vec_val_vect(vecs, vals)#

Vectorize vecs.diag(vals).`vecs`.T for last 2 dimensions of vecs

Parameters:
vecsshape (…, M, N) array

containing tensor in last two dimensions; M, N usually equal to (3, 3)

valsshape (…, N) array

diagonal values carried in last dimension, ... shape above must match that for vecs

Returns:
resshape (…, M, M) array

For all the dimensions ellided by ..., loops to get (M, N) vec matrix, and (N,) vals vector, and calculates vec.dot(np.diag(val).dot(vec.T).

Raises:
ValueErrornon-matching ... dimensions of vecs, vals
ValueErrornon-matching N dimensions of vecs, vals

Examples

Make a 3D array where the first dimension is only 1

>>> vecs = np.arange(9).reshape((1, 3, 3))
>>> vals = np.arange(3).reshape((1, 3))
>>> vec_val_vect(vecs, vals)
array([[[   9.,   24.,   39.],
        [  24.,   66.,  108.],
        [  39.,  108.,  177.]]])

That’s the same as the 2D case (apart from the float casting):

>>> vecs = np.arange(9).reshape((3, 3))
>>> vals = np.arange(3)
>>> np.dot(vecs, np.dot(np.diag(vals), vecs.T))
array([[  9,  24,  39],
       [ 24,  66, 108],
       [ 39, 108, 177]])

simple_cutoff#

dipy.reconst.weights_method.simple_cutoff(residuals, log_residuals, pred_sig, design_matrix, leverages, C, cutoff)[source]#

Define outliers based on the signal (rather than the log-signal).

Parameters:
residualsndarray

Residuals of the signal (observed signal - fitted signal).

log_residualsndarray

Residuals of the log signal (log observed signal - fitted log signal).

pred_signdarray

The predicted signal, given a previous fit.

design_matrixndarray (g, …)

Design matrix holding the covariants used to solve for the regression coefficients.

leveragesndarray

The leverages (diagonal of the ‘hat matrix’) of the fit.

Cfloat

Estimate of the standard deviation of the error.

cutofffloat, optional

Cut-off value for defining outliers based on fitting residuals. Here the condition is:

|residuals| > cut_off x C x HAT_factor

where HAT_factor = sqrt(1 - leverages) adjusts for leverage effects.

two_eyes_cutoff#

dipy.reconst.weights_method.two_eyes_cutoff(residuals, log_residuals, pred_sig, design_matrix, leverages, C, cutoff)[source]#

Define outliers with two-eyes approach.

see [79] for more details.

Parameters:
residualsndarray

Residuals of the signal (observed signal - fitted signal).

log_residualsndarray

Residuals of the log signal (log observed signal - fitted log signal).

pred_signdarray

The predicted signal, given a previous fit.

design_matrixndarray (g, …)

Design matrix holding the covariants used to solve for the regression coefficients.

leveragesndarray

The leverages (diagonal of the ‘hat matrix’) of the fit.

Cfloat

Estimate of the standard deviation of the error.

cutofffloat, optional

Cut-off value for defining outliers based on fitting residuals, see [79] for the two-eyes approached used here.

References

weights_method_wls_m_est#

dipy.reconst.weights_method.weights_method_wls_m_est(data, pred_sig, design_matrix, leverages, idx, total_idx, last_robust, *, m_est='gm', cutoff=3, outlier_condition_func=<function simple_cutoff>)[source]#

Calculate M-estimator weights for WLS model.

Parameters:
datandarray

The measured signal.

pred_signdarray

The predicted signal, given a previous fit. Has the same shape as data.

design_matrixndarray (g, …)

Design matrix holding the covariants used to solve for the regression coefficients.

leveragesndarray

The leverages (diagonal of the ‘hat matrix’) of the fit.

idxint

The current iteration number.

total_idxint

The total number of iterations.

last_robustndarray

True for inlier indices and False for outlier indices. Must have the same shape as data.

m_eststr, optional.

M-estimator weighting scheme to use. Currently, ‘gm’ (Geman-McClure) and ‘cauchy’ are provided.

cutofffloat, optional

Cut-off value for defining outliers based on fitting residuals. Will be passed to the outlier_condition_func. Typical example: |residuals| > cut_off x standard_deviation

outlier_condition_funccallable, optional

A function with args and returns as follows:

is_an_outlier = outlier_condition_func(residuals, log_residuals,
    pred_sig, design_matrix, leverages, C, cutoff)

Notes

Robust weights are calculated specifically for the WLS problem, i.e. the usual form of the WLS problem is accounted for when defining these new weights, see [79]. On the second-to-last iteration, OLS is performed without outliers. On the last iteration, WLS is performed without outliers.

References

weights_method_nlls_m_est#

dipy.reconst.weights_method.weights_method_nlls_m_est(data, pred_sig, design_matrix, leverages, idx, total_idx, last_robust, *, m_est='gm', cutoff=3, outlier_condition_func=<function simple_cutoff>)[source]#

Calculate M-estimator weights for NLLS model.

Parameters:
datandarray

The measured signal.

pred_signdarray

The predicted signal, given a previous fit. Has the same shape as data.

design_matrixndarray (g, …)

Design matrix holding the covariants used to solve for the regression coefficients.

leveragesndarray

The leverages (diagonal of the ‘hat matrix’) of the fit.

idxint

The current iteration number.

total_idxint

The total number of iterations.

last_robustndarray

True for inlier indices and False for outlier indices. Must have the same shape as data.

m_eststr, optional.

M-estimator weighting scheme to use. Currently, ‘gm’ (Geman-McClure) and ‘cauchy’ are provided.

cutofffloat, optional

Cut-off value for defining outliers based on fitting residuals. Will be passed to the outlier_condition_func. Typical example: |residuals| > cut_off x standard_deviation

outlier_condition_funccallable, optional

A function with args and returns as follows:

is_an_outlier = outlier_condition_func(residuals, log_residuals,
    pred_sig, design_matrix, leverages, C, cutoff)

Notes

Robust weights are calculated specifically for the NLLS problem. On the last iteration, NLLS is performed without outliers.