def test_l1_increases_sparsity(radial_order=4, time_order=2): gtab_4d = generate_gtab4D() l1, l2, l3 = [0.0015, 0.0003, 0.0003] S = generate_signal_crossing(gtab_4d, l1, l2, l3) qtdmri_mod_no_l1 = qtdmri.QtdmriModel(gtab_4d, radial_order=radial_order, time_order=time_order, l1_regularization=True, l1_weighting=0.) qtdmri_mod_l1 = qtdmri.QtdmriModel(gtab_4d, radial_order=radial_order, time_order=time_order, l1_regularization=True, l1_weighting=.1) qtdmri_fit_no_l1 = qtdmri_mod_no_l1.fit(S) qtdmri_fit_l1 = qtdmri_mod_l1.fit(S) sparsity_abs_no_reg = qtdmri_fit_no_l1.sparsity_abs() sparsity_abs_reg = qtdmri_fit_l1.sparsity_abs() assert_(sparsity_abs_no_reg > sparsity_abs_reg) sparsity_density_no_reg = qtdmri_fit_no_l1.sparsity_density() sparsity_density_reg = qtdmri_fit_l1.sparsity_density() assert_(sparsity_density_no_reg > sparsity_density_reg)
def test_spherical_l1_increases_sparsity(radial_order=4, time_order=2): gtab_4d = generate_gtab4D() l1, l2, l3 = [0.0015, 0.0003, 0.0003] S = generate_signal_crossing(gtab_4d, l1, l2, l3) qtdmri_mod_no_l1 = qtdmri.QtdmriModel(gtab_4d, radial_order=radial_order, time_order=time_order, l1_regularization=True, cartesian=False, normalization=True, l1_weighting=0.) qtdmri_mod_l1 = qtdmri.QtdmriModel(gtab_4d, radial_order=radial_order, time_order=time_order, l1_regularization=True, cartesian=False, normalization=True, l1_weighting=.1) with warnings.catch_warnings(): warnings.filterwarnings("ignore", message=descoteaux07_legacy_msg, category=PendingDeprecationWarning) qtdmri_fit_no_l1 = qtdmri_mod_no_l1.fit(S) qtdmri_fit_l1 = qtdmri_mod_l1.fit(S) sparsity_abs_no_reg = qtdmri_fit_no_l1.sparsity_abs() sparsity_abs_reg = qtdmri_fit_l1.sparsity_abs() assert_equal(sparsity_abs_no_reg > sparsity_abs_reg, True) sparsity_density_no_reg = qtdmri_fit_no_l1.sparsity_density() sparsity_density_reg = qtdmri_fit_l1.sparsity_density() assert_(sparsity_density_no_reg > sparsity_density_reg)
def test_spherical_laplacian_reduces_laplacian_norm(radial_order=4, time_order=2): gtab_4d = generate_gtab4D() l1, l2, l3 = [0.0015, 0.0003, 0.0003] S = generate_signal_crossing(gtab_4d, l1, l2, l3) qtdmri_mod_no_laplacian = qtdmri.QtdmriModel(gtab_4d, radial_order=radial_order, time_order=time_order, cartesian=False, laplacian_regularization=True, laplacian_weighting=0.) qtdmri_mod_laplacian = qtdmri.QtdmriModel(gtab_4d, radial_order=radial_order, time_order=time_order, cartesian=False, laplacian_regularization=True, laplacian_weighting=1e-4) qtdmri_fit_no_laplacian = qtdmri_mod_no_laplacian.fit(S) qtdmri_fit_laplacian = qtdmri_mod_laplacian.fit(S) laplacian_norm_no_reg = qtdmri_fit_no_laplacian.norm_of_laplacian_signal() laplacian_norm_reg = qtdmri_fit_laplacian.norm_of_laplacian_signal() assert_(laplacian_norm_no_reg > laplacian_norm_reg)
def test_spherical_laplacian_reduces_laplacian_norm(radial_order=4, time_order=2): gtab_4d = generate_gtab4D() l1, l2, l3 = [0.0015, 0.0003, 0.0003] S = generate_signal_crossing(gtab_4d, l1, l2, l3) qtdmri_mod_no_laplacian = qtdmri.QtdmriModel(gtab_4d, radial_order=radial_order, time_order=time_order, cartesian=False, laplacian_regularization=True, laplacian_weighting=0.) qtdmri_mod_laplacian = qtdmri.QtdmriModel(gtab_4d, radial_order=radial_order, time_order=time_order, cartesian=False, laplacian_regularization=True, laplacian_weighting=1e-4) with warnings.catch_warnings(): warnings.filterwarnings("ignore", message=descoteaux07_legacy_msg, category=PendingDeprecationWarning) qtdmri_fit_no_laplacian = qtdmri_mod_no_laplacian.fit(S) qtdmri_fit_laplacian = qtdmri_mod_laplacian.fit(S) laplacian_norm_no_reg = qtdmri_fit_no_laplacian.norm_of_laplacian_signal() laplacian_norm_reg = qtdmri_fit_laplacian.norm_of_laplacian_signal() assert_(laplacian_norm_no_reg > laplacian_norm_reg)
def test_cartesian_normalization(radial_order=4, time_order=2): gtab_4d = generate_gtab4D() l1, l2, l3 = [0.0015, 0.0003, 0.0003] S = generate_signal_crossing(gtab_4d, l1, l2, l3) qtdmri_mod_aniso = qtdmri.QtdmriModel(gtab_4d, radial_order=radial_order, time_order=time_order, cartesian=True, normalization=False) qtdmri_mod_aniso_norm = qtdmri.QtdmriModel(gtab_4d, radial_order=radial_order, time_order=time_order, cartesian=True, normalization=True) qtdmri_fit_aniso = qtdmri_mod_aniso.fit(S) qtdmri_fit_aniso_norm = qtdmri_mod_aniso_norm.fit(S) assert_array_almost_equal(qtdmri_fit_aniso.fitted_signal(), qtdmri_fit_aniso_norm.fitted_signal()) rt_grid = qtdmri.create_rt_space_grid(5, 20e-3, 5, 0.02, .05) pdf_aniso = qtdmri_fit_aniso.pdf(rt_grid) pdf_aniso_norm = qtdmri_fit_aniso_norm.pdf(rt_grid) assert_array_almost_equal(pdf_aniso / pdf_aniso.max(), pdf_aniso_norm / pdf_aniso.max()) norm_laplacian = qtdmri_fit_aniso.norm_of_laplacian_signal() norm_laplacian_norm = qtdmri_fit_aniso_norm.norm_of_laplacian_signal() assert_array_almost_equal(norm_laplacian / norm_laplacian, norm_laplacian_norm / norm_laplacian)
def test_anisotropic_isotropic_equivalence(radial_order=4, time_order=2): # generate qt-scheme and arbitary synthetic crossing data. gtab_4d = generate_gtab4D() l1, l2, l3 = [0.0015, 0.0003, 0.0003] S = generate_signal_crossing(gtab_4d, l1, l2, l3) # initialize both cartesian and spherical models without any kind of # regularization qtdmri_mod_aniso = qtdmri.QtdmriModel(gtab_4d, radial_order=radial_order, time_order=time_order, cartesian=True, anisotropic_scaling=False) qtdmri_mod_iso = qtdmri.QtdmriModel(gtab_4d, radial_order=radial_order, time_order=time_order, cartesian=False, anisotropic_scaling=False) # both implementations fit the same signal qtdmri_fit_cart = qtdmri_mod_aniso.fit(S) qtdmri_fit_sphere = qtdmri_mod_iso.fit(S) # same signal fit assert_array_almost_equal(qtdmri_fit_cart.fitted_signal(), qtdmri_fit_sphere.fitted_signal()) # same PDF reconstruction rt_grid = qtdmri.create_rt_space_grid(5, 20e-3, 5, 0.02, .05) pdf_aniso = qtdmri_fit_cart.pdf(rt_grid) pdf_iso = qtdmri_fit_sphere.pdf(rt_grid) assert_array_almost_equal(pdf_aniso / pdf_aniso.max(), pdf_iso / pdf_aniso.max()) # same norm of the laplacian norm_laplacian_aniso = qtdmri_fit_cart.norm_of_laplacian_signal() norm_laplacian_iso = qtdmri_fit_sphere.norm_of_laplacian_signal() assert_almost_equal(norm_laplacian_aniso / norm_laplacian_aniso, norm_laplacian_iso / norm_laplacian_aniso) # all q-space index is the same for arbitrary tau tau = 0.02 assert_almost_equal(qtdmri_fit_cart.rtop(tau), qtdmri_fit_sphere.rtop(tau)) assert_almost_equal(qtdmri_fit_cart.rtap(tau), qtdmri_fit_sphere.rtap(tau)) assert_almost_equal(qtdmri_fit_cart.rtpp(tau), qtdmri_fit_sphere.rtpp(tau)) assert_almost_equal(qtdmri_fit_cart.msd(tau), qtdmri_fit_sphere.msd(tau)) assert_almost_equal(qtdmri_fit_cart.qiv(tau), qtdmri_fit_sphere.qiv(tau)) # ODF estimation is the same sphere = get_sphere() assert_array_almost_equal(qtdmri_fit_cart.odf(sphere, tau, s=0), qtdmri_fit_sphere.odf(sphere, tau, s=0))
def test_anisotropic_reduced_MSE(radial_order=0, time_order=0): gtab_4d = generate_gtab4D() l1, l2, l3 = [0.0015, 0.0003, 0.0003] S = generate_signal_crossing(gtab_4d, l1, l2, l3) qtdmri_mod_aniso = qtdmri.QtdmriModel(gtab_4d, radial_order=radial_order, time_order=time_order, cartesian=True, anisotropic_scaling=True) qtdmri_mod_iso = qtdmri.QtdmriModel(gtab_4d, radial_order=radial_order, time_order=time_order, cartesian=True, anisotropic_scaling=False) qtdmri_fit_aniso = qtdmri_mod_aniso.fit(S) qtdmri_fit_iso = qtdmri_mod_iso.fit(S) mse_aniso = np.mean((S - qtdmri_fit_aniso.fitted_signal()) ** 2) mse_iso = np.mean((S - qtdmri_fit_iso.fitted_signal()) ** 2) assert_(mse_aniso < mse_iso)
def test_l1_CV(radial_order=4, time_order=2): gtab_4d = generate_gtab4D() l1, l2, l3 = [0.0015, 0.0003, 0.0003] S = generate_signal_crossing(gtab_4d, l1, l2, l3) S_noise = add_noise(S, S0=1., snr=10) qtdmri_mod_l1_cv = qtdmri.QtdmriModel( gtab_4d, radial_order=radial_order, time_order=time_order, l1_regularization=True, l1_weighting="CV" ) qtdmri_fit_noise = qtdmri_mod_l1_cv.fit(S_noise) assert_(qtdmri_fit_noise.alpha >= 0)
def test_number_of_coefficients(radial_order=4, time_order=2): gtab_4d = generate_gtab4D() l1, l2, l3 = [0.0015, 0.0003, 0.0003] S = generate_signal_crossing(gtab_4d, l1, l2, l3) qtdmri_mod = qtdmri.QtdmriModel(gtab_4d, radial_order=radial_order, time_order=time_order) qtdmri_fit = qtdmri_mod.fit(S) number_of_coef_model = qtdmri_fit._qtdmri_coef.shape[0] number_of_coef_analytic = qtdmri.qtdmri_number_of_coefficients( radial_order, time_order) assert_equal(number_of_coef_model, number_of_coef_analytic)
def test_spherical_normalization(radial_order=4, time_order=2): gtab_4d = generate_gtab4D() l1, l2, l3 = [0.0015, 0.0003, 0.0003] S = generate_signal_crossing(gtab_4d, l1, l2, l3) qtdmri_mod_aniso = qtdmri.QtdmriModel(gtab_4d, radial_order=radial_order, time_order=time_order, cartesian=False, normalization=False) qtdmri_mod_aniso_norm = qtdmri.QtdmriModel(gtab_4d, radial_order=radial_order, time_order=time_order, cartesian=False, normalization=True) with warnings.catch_warnings(): warnings.filterwarnings("ignore", message=descoteaux07_legacy_msg, category=PendingDeprecationWarning) qtdmri_fit = qtdmri_mod_aniso.fit(S) qtdmri_fit_norm = qtdmri_mod_aniso_norm.fit(S) assert_array_almost_equal(qtdmri_fit.fitted_signal(), qtdmri_fit_norm.fitted_signal()) rt_grid = qtdmri.create_rt_space_grid(5, 20e-3, 5, 0.02, .05) with warnings.catch_warnings(): warnings.filterwarnings("ignore", message=descoteaux07_legacy_msg, category=PendingDeprecationWarning) pdf = qtdmri_fit.pdf(rt_grid) pdf_norm = qtdmri_fit_norm.pdf(rt_grid) assert_array_almost_equal(pdf / pdf.max(), pdf_norm / pdf.max()) norm_laplacian = qtdmri_fit.norm_of_laplacian_signal() norm_laplacian_norm = qtdmri_fit_norm.norm_of_laplacian_signal() assert_array_almost_equal(norm_laplacian / norm_laplacian, norm_laplacian_norm / norm_laplacian)
def test_laplacian_GCV_higher_weight_with_noise(radial_order=4, time_order=2): gtab_4d = generate_gtab4D() l1, l2, l3 = [0.0015, 0.0003, 0.0003] S = generate_signal_crossing(gtab_4d, l1, l2, l3) S_noise = add_noise(S, S0=1., snr=10) qtdmri_mod_laplacian_GCV = qtdmri.QtdmriModel( gtab_4d, radial_order=radial_order, time_order=time_order, laplacian_regularization=True, laplacian_weighting="GCV" ) qtdmri_fit_no_noise = qtdmri_mod_laplacian_GCV.fit(S) qtdmri_fit_noise = qtdmri_mod_laplacian_GCV.fit(S_noise) assert_(qtdmri_fit_noise.lopt > qtdmri_fit_no_noise.lopt)
def test_q0_constraint_and_unity_of_ODFs(radial_order=6, time_order=2): gtab_4d = generate_gtab4D() tau = gtab_4d.tau l1, l2, l3 = [0.0015, 0.0003, 0.0003] S = generate_signal_crossing(gtab_4d, l1, l2, l3) # first test without regularization qtdmri_mod_ls = qtdmri.QtdmriModel(gtab_4d, radial_order=radial_order, time_order=time_order) qtdmri_fit_ls = qtdmri_mod_ls.fit(S) fitted_signal = qtdmri_fit_ls.fitted_signal() # only first tau_point is normalized with least squares. E_q0_first_tau = fitted_signal[np.all([tau == tau.min(), gtab_4d.b0s_mask], axis=0)] assert_almost_equal(float(E_q0_first_tau), 1.) # now with cvxpy regularization cartesian qtdmri_mod_lap = qtdmri.QtdmriModel(gtab_4d, radial_order=radial_order, time_order=time_order, laplacian_regularization=True, laplacian_weighting=1e-4) qtdmri_fit_lap = qtdmri_mod_lap.fit(S) fitted_signal = qtdmri_fit_lap.fitted_signal() E_q0_first_tau = fitted_signal[np.all([tau == tau.min(), gtab_4d.b0s_mask], axis=0)] E_q0_last_tau = fitted_signal[np.all([tau == tau.max(), gtab_4d.b0s_mask], axis=0)] assert_almost_equal(E_q0_first_tau[0], 1.) assert_almost_equal(E_q0_last_tau[0], 1.) # check if odf in spherical harmonics for cartesian raises an error try: qtdmri_fit_lap.odf_sh(tau=tau.max()) assert_equal(True, False) except ValueError: print('missing spherical harmonics cartesian ODF caught.') # now with cvxpy regularization spherical qtdmri_mod_lap = qtdmri.QtdmriModel(gtab_4d, radial_order=radial_order, time_order=time_order, laplacian_regularization=True, laplacian_weighting=1e-4, cartesian=False) with warnings.catch_warnings(): warnings.filterwarnings("ignore", message=descoteaux07_legacy_msg, category=PendingDeprecationWarning) qtdmri_fit_lap = qtdmri_mod_lap.fit(S) fitted_signal = qtdmri_fit_lap.fitted_signal() E_q0_first_tau = fitted_signal[np.all([tau == tau.min(), gtab_4d.b0s_mask], axis=0)] E_q0_last_tau = fitted_signal[np.all([tau == tau.max(), gtab_4d.b0s_mask], axis=0)] assert_almost_equal(float(E_q0_first_tau), 1.) assert_almost_equal(float(E_q0_last_tau), 1.) # test if marginal ODF integral in sh is equal to one # Integral of Y00 spherical harmonic is 1 / (2 * np.sqrt(np.pi)) # division with this results in normalization odf_sh = qtdmri_fit_lap.odf_sh(s=0, tau=tau.max()) odf_integral = odf_sh[0] * (2 * np.sqrt(np.pi)) assert_almost_equal(odf_integral, 1.)
rtops = [] rtaps = [] rtpps = [] for i, (data_, mask_, gtab_) in enumerate(zip(data, cc_masks, gtabs)): # select the corpus callsoum voxel for every dataset cc_voxels = data_[mask_ == 1] # initialize the qt-dMRI model. # recommended basis orders are radial_order=6 and time_order=2. # The combined Laplacian and l1-regularization using Generalized # Cross-Validation (GCV) and Cross-Validation (CV) settings is most robust, # but can be used separately and with weightings preset to any positive # value to optimize for speed. qtdmri_mod = qtdmri.QtdmriModel(gtab_, radial_order=6, time_order=2, laplacian_regularization=True, laplacian_weighting='GCV', l1_regularization=True, l1_weighting='CV') # fit the model. # Here we take every 5th voxel for speed, but of course all voxels can be # fit for a more robust result later on. qtdmri_fit = qtdmri_mod.fit(cc_voxels[::5]) qtdmri_fits.append(qtdmri_fit) # We estimate MSD, RTOP, RTAP and RTPP for the chosen diffusion times. msds.append(np.array(list(map(qtdmri_fit.msd, taus)))) rtops.append(np.array(list(map(qtdmri_fit.rtop, taus)))) rtaps.append(np.array(list(map(qtdmri_fit.rtap, taus)))) rtpps.append(np.array(list(map(qtdmri_fit.rtpp, taus)))) """ The estimated :math:`q\tau`-indices, for the chosen diffusion times, are now