NEXI
Neurite EXchange Imaging based on diffusion MRI (dMRI).
gpuNEXI
NEXI with askAdam solver.
Usage
obj = gpuNEXI(bval, BDELTA);
out = obj.estimate(dwi, mask, extradata, fitting);
Model parameters
% fa : Neurite volume fraction
% Da : longitudinal diffusivity of neurite [ms/us^2]
% De : diffusivity of extracellular water [ms/us^2]
% ra : exchange rate from neurite to extracellular space [1/s]
% p2 : non-linear neurite dispersion index
model_params = {'fa','Da','De','ra','p2'};
ub = [ 1, 3, 3, 1, 1];
lb = [ eps, eps, eps,1/250, eps];
startpoint = [ 0.4, 2, 1, 0.05, 0.2];
I/O overview
obj = gpuNEXI(bval, BDELTA);
Input |
Description |
|---|---|
bval |
1xNshell b-values vector [ms/um2] |
BDELTA |
1xNshell diffusion time, same size as ‘bval’ [ms] |
out = obj.estimate(dwi, mask, extradata, fitting);
Input |
Description |
|---|---|
dwi |
4D dMRI data, can be either full acquisition or SMT signal [x,y,z,diffusion] |
mask |
3D mask, [x,y,z] |
extradata |
Structure array with additional data (Optional) |
extradata.bval |
1D b-values [1xdiffusion], same order as ‘dwi’ [ms/um2] (Optional, only if ‘dwi’ is full acquisition) |
extradata.bvec |
2D b-vector [3xdiffusion], same order as ‘dwi’ (Optional, only if ‘dwi’ is full acquisition) |
extradata.ldelta |
1D gradient duration [1xdiffusion], same order as ‘dwi’ [ms] (Optional, only if ‘dwi’ is full acquisition) |
extradata.BDELTA |
1D diffusion time [1xdiffusion], same order as ‘dwi’ [ms] (Optional, only if ‘dwi’ is full acquisition) |
fitting |
Structure array for model parameter estimation |
fitting.optimiser |
Algorithm for parameter update, ‘adam’ (default) | ‘sgdm’ | ‘rmsprop’ |
fitting.isdisplay |
boolean, display optimisation process in graphic plot |
fitting.convergenceValue |
tolerance in loss gradient to stop the optimisation |
fitting.convergenceWindow |
# of elements in which ‘convergenceValue’ is computed |
fitting.iteration |
maximum # of optimisation iterations |
fitting.initialLearnRate |
initial learn rate of Adam optimiser |
fitting.tol |
tolerance in loss |
fitting.lambda |
regularisation parameter(s) |
fitting.regmap |
model parameter(s) in which regularisation is applied, ‘fa’|’ra’|’Da’|’De’ |
fitting.TVmode |
Mode for total variation (TV) regularisation, ‘2D’|’3D’ |
fitting.lossFunction |
loss function, ‘L1’|’L2’|’huber’|’mse’ |
fitting.lmax |
Maximum order of rotational invariant, 0|2, default = 0 |
fitting.isPrior |
Starting point estimated based on likelihood method instead of fix/random location |
Output |
Description |
|---|---|
out |
structure contains optimisation result |
out.final |
output structure at final iteration |
out.final.loss |
total loss = loss_fidelity + loss_reg |
out.final.loss_fidelity |
loss of data consistency term |
out.final.loss_reg |
loss of regularisation term |
out.final.(model_params{k}) |
estimated model parameter(s) |
out.min |
output structure at loss is minimum |
See example here.
gpuNEXImcmc
NEXI with MCMC solver.
Usage
obj = gpuNEXImcmc(bval, BDELTA);
out = obj.estimate(dwi, mask, extradata, fitting);
Model parameters
% fa : Intraneurite volume fraction
% Da : Intraneurite diffusivity (um2/ms)
% De : Extraneurite diffusivity (um2/ms)
% ra : exchange rate from intra- to extra-neurite compartment
% p2 : dispersion index (if fitting.lmax=2)
% default model parameters and estimation boundary
model_params = { 'fa'; 'Da'; 'De'; 'ra';'p2'; 'noise'};
ub = [ 1; 3; 3; 1; 1; 0.1];
lb = [ 0; 0.002; 0.001; 1/250; 0; 0.01];
step = [ 0.05; 0.15; 0.15; 0.005;0.05; 0.005];
startpoint = [ 0.2; 2; 0.5; 0.05; 0.2; 0.05];
I/O overview
obj = gpuNEXImcmc(bval, BDELTA);
Input |
Description |
|---|---|
bval |
1xNshell unique b-values vector [ms/um2] |
BDELTA |
1xNshell diffusion time, same size as ‘bval’ [ms] |
out = obj.estimate(dwi, mask, extradata, fitting);
Input |
Description |
|---|---|
dwi |
4D dMRI data, can be either full acquisition or SMT signal [x,y,z,diffusion] |
mask |
3D mask, [x,y,z] |
extradata |
Structure array with additional data (Optional) |
extradata.bval |
1D b-values [1xdiffusion], same order as ‘dwi’ [ms/um2] (Optional, only if ‘dwi’ is full acquisition) |
extradata.bvec |
2D b-vector [3xdiffusion], same order as ‘dwi’ (Optional, only if ‘dwi’ is full acquisition) |
extradata.ldelta |
1D gradient duration [1xdiffusion], same order as ‘dwi’ [ms] (Optional, only if ‘dwi’ is full acquisition) |
extradata.BDELTA |
1D diffusion time [1xdiffusion], same order as ‘dwi’ [ms] (Optional, only if ‘dwi’ is full acquisition) |
fitting |
Structure array for model parameter estimation |
fitting.algorithm |
MCMC algorithm, ‘MH’ (Metropolis-Hastings)|’GW’ (Affline-invariant ensemble) |
fitting.iteration |
# MCMC iterations |
fitting.repetition |
# repetition of MCMC proposal |
fitting.thinning |
sampling interval between iterations |
fitting.burnin |
iterations to be discarded at the beginning, if >1, the exact number will be used; else iteration*burnin |
fitting.xStepSize |
step size of model parameter in MCMC proposal, same size and order as ‘model_params’ (‘MH’ only) |
fitting.StepSize |
step size for ‘GW’ in MCMC proposal (‘GW’ only) |
fitting.Nwalker |
# random walkers (‘GW’ only) |
fitting.metric |
cell variable, metric(s) derived from posterior distribution, ‘mean’|’std’|’median’|’iqr’ (can be multiple) |
fitting.start |
Starting point methods, ‘likelihood’|’default’|1xM parameters array |
Output |
Description |
|---|---|
out |
structure contains optimisation result |
out.posterior |
structure contains MCMC posterior samples |
out.posterior.(model_params{k}) |
Model parameter MCMC posterior samples, masked and unshaped for memory preservation |
out.{metric}.(model_params{k}) |
Posterior statistics chosen in fitting.metric |
See example here.