Hello,
I am trying to migrate my MrTrix workflow to DIPY (1.4.1). I have multishell data (1 average b0, 64 directions at b=1000 and 2000) preprocessed with QSIPrep that I want to run MSMT CSD on. The only thing that has happened with the data between preprocessing and this script is running MRtrix dwigradcheck
to make sure the gradient table is correct. I am working with the tutorial linked here. My code is below.
# DEFINE PATHS TO DATA
dwi_fodf_path ='/om4/group/gablab/data/HBN/derivatives/sbci/sub-NDARAA306NT2/dwi/dwi.nii.gz'
bvals_path = '/om4/group/gablab/data/HBN/derivatives/sbci/sub-NDARAA306NT2/dwi/dwi.bval'
bvecs_path = '/om4/group/gablab/data/HBN/derivatives/sbci/sub-NDARAA306NT2/dwi/dwi.bvec'
# LOAD DATA
data, affine = load_nifti(dwi_fodf_path)
bvals, bvecs = read_bvals_bvecs(bvals_path, bvecs_path)
bvals=bvals.round(1) # round b-vals to whole numbers for easier indexing
gtab = gradient_table(bvals,bvecs)
# INDEX B-VALS < 1200 FOR BETTER TENSOR FITTING
low_b = np.logical_or(bvals == 0, bvals == 1000)
data_low_b = data[..., low_b]
gtab_low_b = gradient_table(bvals[low_b], bvecs[low_b])
# GET TISSUE MASKS
mask_wm, mask_gm, mask_csf = mask_for_response_msmt(gtab_low_b, data_low_b, 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)
# GET TISSUE RESPONSES
response_wm, response_gm, response_csf = response_from_mask_msmt(gtab, data,
mask_wm,
mask_gm,
mask_csf)
# GET MSMT FIBNER RESPONSE
ubvals = unique_bvals_tolerance(gtab.bvals)
response_mcsd = multi_shell_fiber_response(sh_order=8,
bvals=ubvals,
wm_rf=response_wm,
gm_rf=response_gm,
csf_rf=response_csf)
response = np.array([response_wm, response_gm, response_csf])
# DEFINE AND FIT MULTI SHELL SPHERICAL DECONVOLUTION MODEL
mcsd_model_simple_response = MultiShellDeconvModel(gtab, response, sh_order=8)
mcsd_model = MultiShellDeconvModel(gtab, response_mcsd)
mcsd_fit = mcsd_model.fit(data)
I get the following error message at the last step of the process:
---------------------------------------------------------------------------
ArpackNoConvergence Traceback (most recent call last)
/om2/user/smeisler/anaconda3/envs/nipype/lib/python3.8/site-packages/cvxpy/expressions/constants/constant.py in is_psd_within_tol(A, tol)
260 try:
→ 261 ev = SA_eigsh(-tol) # might return np.NaN, or raise exception
262 finally:
/om2/user/smeisler/anaconda3/envs/nipype/lib/python3.8/site-packages/cvxpy/expressions/constants/constant.py in SA_eigsh(sigma)
244 def SA_eigsh(sigma):
--> 245 return eigsh(A, k=1, sigma=sigma, which='SA', return_eigenvectors=False)
246 # Returns the eigenvalue w[i] of A where 1/(w[i] - sigma) is minimized.
/om2/user/smeisler/anaconda3/envs/nipype/lib/python3.8/site-packages/scipy/sparse/linalg/eigen/arpack/arpack.py in eigsh(A, k, M, sigma, which, v0, ncv, maxiter, tol, return_eigenvectors, Minv, OPinv, mode)
1689 while not params.converged:
-> 1690 params.iterate()
1691
/om2/user/smeisler/anaconda3/envs/nipype/lib/python3.8/site-packages/scipy/sparse/linalg/eigen/arpack/arpack.py in iterate(self)
569 elif self.info == 1:
--> 570 self._raise_no_convergence()
571 else:
/om2/user/smeisler/anaconda3/envs/nipype/lib/python3.8/site-packages/scipy/sparse/linalg/eigen/arpack/arpack.py in _raise_no_convergence(self)
375 k_ok = 0
--> 376 raise ArpackNoConvergence(msg % (num_iter, k_ok, self.k), ev, vec)
377
ArpackNoConvergence: ARPACK error -1: No convergence (471 iterations, 0/1 eigenvectors converged)
MSMT CSD has worked on MrTrix for this subject. Any suggestions on what I can do here?
Thanks,
Steven