def test_spherical_harmonics_model_raises(odi=0.15, mu=[0., 0.], lambda_par=1.7e-9): stick = cylinder_models.C1Stick() ball = gaussian_models.G1Ball() watsonstick = distribute_models.SD1WatsonDistributed([stick]) params = { 'SD1Watson_1_odi': odi, 'SD1Watson_1_mu': mu, 'C1Stick_1_lambda_par': lambda_par } data = watsonstick(scheme, **params) assert_raises(ValueError, modeling_framework.MultiCompartmentSphericalHarmonicsModel, [ball]) sh_mod = modeling_framework.MultiCompartmentSphericalHarmonicsModel( [stick]) assert_raises(ValueError, sh_mod.fit, scheme, data, solver='csd_cvxpy') sh_mod = modeling_framework.MultiCompartmentSphericalHarmonicsModel( [stick, ball]) sh_mod.set_fixed_parameter('C1Stick_1_lambda_par', lambda_par) sh_mod.set_fixed_parameter('G1Ball_1_lambda_iso', 3e-9) assert_raises(ValueError, sh_mod.fit, scheme, data, solver='csd_tournier07')
def test_multi_compartment_fod_with_parametric_model( odi=0.15, mu=[0., 0.], lambda_iso=3e-9, lambda_par=1.7e-9, vf_intra=0.7): stick = cylinder_models.C1Stick() ball = gaussian_models.G1Ball() watsonstick = distribute_models.SD1WatsonDistributed( [stick]) mc_mod = modeling_framework.MultiCompartmentModel([watsonstick, ball]) sh_mod = modeling_framework.MultiCompartmentSphericalHarmonicsModel( [stick, ball]) sh_mod.set_fixed_parameter('G1Ball_1_lambda_iso', lambda_iso) sh_mod.set_fixed_parameter('C1Stick_1_lambda_par', lambda_par) simulation_parameters = mc_mod.parameters_to_parameter_vector( G1Ball_1_lambda_iso=lambda_iso, SD1WatsonDistributed_1_SD1Watson_1_mu=mu, SD1WatsonDistributed_1_C1Stick_1_lambda_par=lambda_par, SD1WatsonDistributed_1_SD1Watson_1_odi=odi, partial_volume_0=vf_intra, partial_volume_1=1 - vf_intra) data = mc_mod.simulate_signal(scheme, simulation_parameters) sh_fit = sh_mod.fit(scheme, data) vf_intra_estimated = sh_fit.fitted_parameters['partial_volume_0'] assert_almost_equal(vf_intra, vf_intra_estimated) predicted_signal = sh_fit.predict() assert_array_almost_equal(data, predicted_signal[0], 4)
def test_equivalence_csd_and_parametric_fod( odi=0.15, mu=[0., 0.], lambda_par=1.7e-9): stick = cylinder_models.C1Stick() watsonstick = distribute_models.SD1WatsonDistributed( [stick]) params = {'SD1Watson_1_odi': odi, 'SD1Watson_1_mu': mu, 'C1Stick_1_lambda_par': lambda_par} data = watsonstick(scheme, **params) sh_mod = modeling_framework.MultiCompartmentSphericalHarmonicsModel( [stick]) sh_mod.set_fixed_parameter('C1Stick_1_lambda_par', lambda_par) sh_fit = sh_mod.fit(scheme, data) fod = sh_fit.fod(sphere.vertices) watson = distributions.SD1Watson(mu=[0., 0.], odi=0.15) sf = watson(sphere.vertices) assert_array_almost_equal(fod[0], sf, 2) fitted_signal = sh_fit.predict() assert_array_almost_equal(data, fitted_signal[0], 4)
def test_laplacian_and_AI_with_regularization(odi=0.15, mu=[0., 0.], lambda_par=1.7e-9): stick = cylinder_models.C1Stick() watsonstick = distribute_models.SD1WatsonDistributed([stick]) params = { 'SD1Watson_1_odi': odi, 'SD1Watson_1_mu': mu, 'C1Stick_1_lambda_par': lambda_par } data = watsonstick(scheme, **params) sh_mod = modeling_framework.MultiCompartmentSphericalHarmonicsModel( [stick]) sh_mod.set_fixed_parameter('C1Stick_1_lambda_par', lambda_par) for solver in ['csd_tournier07', 'csd_cvxpy']: sh_fit = sh_mod.fit(scheme, data, solver=solver, lambda_lb=0.) sh_fit_reg = sh_mod.fit(scheme, data, solver=solver, lambda_lb=1e-3) ai = sh_fit.anisotropy_index() lb = sh_fit.norm_of_laplacian_fod() ai_reg = sh_fit_reg.anisotropy_index() lb_reg = sh_fit_reg.norm_of_laplacian_fod() assert_(ai > ai_reg) assert_(lb > lb_reg)
def test_equivalence_sh_distributed_mc_with_mcsh(): """ We test if we can input a Watson-distributed zeppelin and stick into an SD3SphericalHarmonicsDistributedModel in an MC-model, and compare it with an MCSH model with the same watson distribution as a kernel. """ stick = cylinder_models.C1Stick() zep = gaussian_models.G2Zeppelin() mck_dist = distribute_models.SD1WatsonDistributed([stick, zep]) mck_dist.set_equal_parameter('G2Zeppelin_1_lambda_par', 'C1Stick_1_lambda_par') mck_dist.set_tortuous_parameter('G2Zeppelin_1_lambda_perp', 'G2Zeppelin_1_lambda_par', 'partial_volume_0') mcsh = modeling_framework.MultiCompartmentSphericalHarmonicsModel( models=[mck_dist], sh_order=8) mc = modeling_framework.MultiCompartmentModel([ distribute_models.SD3SphericalHarmonicsDistributed([mck_dist], sh_order=8) ]) lambda_par = 0. odi = .02 sh_coeff = np.ones(45) sh_coeff[0] = 1 / (2 * np.sqrt(np.pi)) pv0 = .3 params_mcsh = { 'SD1WatsonDistributed_1_partial_volume_0': pv0, 'SD1WatsonDistributed_1_G2Zeppelin_1_lambda_par': lambda_par, 'SD1WatsonDistributed_1_SD1Watson_1_odi': odi, 'sh_coeff': sh_coeff } basemod = 'SD3SphericalHarmonicsDistributed_1_' params_mc = { basemod + 'SD1WatsonDistributed_1_partial_volume_0': pv0, basemod + 'SD1WatsonDistributed_1_G2Zeppelin_1_lambda_par': lambda_par, basemod + 'SD1WatsonDistributed_1_SD1Watson_1_odi': odi, basemod + 'SD3SphericalHarmonics_1_sh_coeff': sh_coeff } E_mcsh = mcsh.simulate_signal(scheme, params_mcsh) E_mc = mc.simulate_signal(scheme, params_mc) np.testing.assert_array_almost_equal(E_mcsh, E_mc)