def test_mcsd_model_delta(): sh_order = 8 gtab = get_3shell_gtab() shells = np.unique(gtab.bvals // 100.) * 100. response = sim_response(sh_order, shells, evals_d) model = MultiShellDeconvModel(gtab, response) iso = response.iso theta, phi = default_sphere.theta, default_sphere.phi B = shm.real_sph_harm(response.m, response.n, theta[:, None], phi[:, None]) wm_delta = model.delta.copy() # set isotropic components to zero wm_delta[:iso] = 0. wm_delta = _expand(model.m, iso, wm_delta) for i, s in enumerate(shells): g = GradientTable(default_sphere.vertices * s) signal = model.predict(wm_delta, g) expected = np.dot(response.response[i, iso:], B.T) npt.assert_array_almost_equal(signal, expected) signal = model.predict(wm_delta, gtab) fit = model.fit(signal) m = model.m npt.assert_array_almost_equal(fit.shm_coeff[m != 0], 0., 2)
def test_mcsd_model_delta(): sh_order = 8 gtab = get_3shell_gtab() response = multi_shell_fiber_response(sh_order, [0, 1000, 2000, 3500], wm_response, gm_response, csf_response) model = MultiShellDeconvModel(gtab, response) iso = response.iso theta, phi = default_sphere.theta, default_sphere.phi B = shm.real_sh_descoteaux_from_index( response.m, response.n, theta[:, None], phi[:, None]) wm_delta = model.delta.copy() # set isotropic components to zero wm_delta[:iso] = 0. wm_delta = _expand(model.m, iso, wm_delta) for i, s in enumerate([0, 1000, 2000, 3500]): g = GradientTable(default_sphere.vertices * s) signal = model.predict(wm_delta, g) expected = np.dot(response.response[i, iso:], B.T) npt.assert_array_almost_equal(signal, expected) signal = model.predict(wm_delta, gtab) fit = model.fit(signal) m = model.m npt.assert_array_almost_equal(fit.shm_coeff[m != 0], 0., 2)
def test_MultiShellDeconvModel(): gtab = get_3shell_gtab() mevals = np.array([wm_response[0, :3], wm_response[0, :3]]) angles = [(0, 0), (60, 0)] S_wm, sticks = multi_tensor(gtab, mevals, wm_response[0, 3], angles=angles, fractions=[30., 70.], snr=None) S_gm = gm_response[0, 3] * np.exp(-gtab.bvals * gm_response[0, 0]) S_csf = csf_response[0, 3] * np.exp(-gtab.bvals * csf_response[0, 0]) sh_order = 8 response = multi_shell_fiber_response(sh_order, [0, 1000, 2000, 3500], wm_response, gm_response, csf_response) model = MultiShellDeconvModel(gtab, response) vf = [0.325, 0.2, 0.475] signal = sum(i * j for i, j in zip(vf, [S_csf, S_gm, S_wm])) fit = model.fit(signal) # Testing both ways to predict S_pred_fit = fit.predict() S_pred_model = model.predict(fit.all_shm_coeff) npt.assert_array_almost_equal(S_pred_fit, S_pred_model, 0) npt.assert_array_almost_equal(S_pred_fit, signal, 0)
using ``all_shm_coeff`` for each compartment (isotropic) and ``shm_coeff`` for white matter. """ vf = mcsd_fit.volume_fractions sh_coeff = mcsd_fit.all_shm_coeff csf_sh_coeff = sh_coeff[..., 0] gm_sh_coeff = sh_coeff[..., 1] wm_sh_coeff = mcsd_fit.shm_coeff """ The model allows to predict a signal from sh coefficients. There are two ways of doing this. """ mcsd_pred = mcsd_fit.predict() mcsd_pred = mcsd_model.predict(mcsd_fit.all_shm_coeff) """ From the fit obtained in the previous step, we generate the ODFs which can be visualized as follows: """ mcsd_odf = mcsd_fit.odf(sphere) print("ODF") print(mcsd_odf.shape) print(mcsd_odf[40, 40, 0]) fodf_spheres = actor.odf_slicer(mcsd_odf, sphere=sphere, scale=1, norm=False,