def test_C2_watson_gamma_equals_gamma_watson():
    scheme = wu_minn_hcp_acquisition_scheme()

    cylinder = cylinder_models.C2CylinderStejskalTannerApproximation()
    watsoncyl = distribute_models.SD1WatsonDistributed([cylinder])

    gammawatsoncyl = distribute_models.DD1GammaDistributed(
        [watsoncyl],
        target_parameter='C2CylinderStejskalTannerApproximation_1_diameter')

    param_name = 'C2CylinderStejskalTannerApproximation_1_lambda_par'
    params1 = {
        'SD1WatsonDistributed_1_' + param_name: 1.7e-9,
        'DD1Gamma_1_alpha': 2.,
        'DD1Gamma_1_beta': 4e-6,
        'SD1WatsonDistributed_1_SD1Watson_1_odi': 0.4,
        'SD1WatsonDistributed_1_SD1Watson_1_mu': [0., 0.]
    }
    gammacyl = distribute_models.DD1GammaDistributed([cylinder])
    watsongammacyl = distribute_models.SD1WatsonDistributed([gammacyl])

    params2 = {
        'DD1GammaDistributed_1_' + param_name: 1.7e-9,
        'DD1GammaDistributed_1_DD1Gamma_1_alpha': 2.,
        'DD1GammaDistributed_1_DD1Gamma_1_beta': 4e-6,
        'SD1Watson_1_odi': 0.4,
        'SD1Watson_1_mu': [0., 0.]
    }

    assert_array_almost_equal(watsongammacyl(scheme, **params2),
                              gammawatsoncyl(scheme, **params1), 5)
Exemple #2
0
def test_multi_tissue_mc_model():
    scheme = wu_minn_hcp_acquisition_scheme()
    ball = gaussian_models.G1Ball()
    cyl = cylinder_models.C1Stick()
    models = [ball, cyl]
    S0_responses = [1., 2.]
    mt_mc = modeling_framework.MultiCompartmentModel(
        models=models, S0_tissue_responses=S0_responses)

    mt_mc.set_fixed_parameter('C1Stick_1_lambda_par', 1.7e-9)
    mt_mc.set_fixed_parameter('G1Ball_1_lambda_iso', 3e-9)
    mt_mc.set_fixed_parameter('C1Stick_1_mu', [0., 0.])
    param_dict = {'partial_volume_0': .5, 'partial_volume_1': .5}
    E = mt_mc.simulate_signal(scheme, param_dict)

    mt_mc_fit = mt_mc.fit(scheme, E)
    sig_fracts = mt_mc_fit.fitted_parameters
    vol_fracts = mt_mc_fit.fitted_multi_tissue_fractions
    vol_fracts_norm = mt_mc_fit.fitted_multi_tissue_fractions_normalized

    assert_almost_equal(
        sig_fracts['partial_volume_0'], vol_fracts['partial_volume_0'], 2)
    assert_almost_equal(
        sig_fracts['partial_volume_1'], vol_fracts['partial_volume_1'] * 2., 2)
    assert_almost_equal(
        vol_fracts_norm['partial_volume_0'], 2 / 3., 2)
    assert_almost_equal(
        vol_fracts_norm['partial_volume_1'], 1 / 3., 2)
def test_acq_scheme_without_deltas_model_catch():
    scheme = wu_minn_hcp_acquisition_scheme()
    test_data = np.random.rand(len(scheme.bvalues))
    scheme_clinical = acquisition_scheme_from_bvalues(
        scheme.bvalues, scheme.gradient_directions)
    mc_model = MultiCompartmentModel([C4CylinderGaussianPhaseApproximation()])
    assert_raises(ValueError, mc_model.fit, scheme_clinical, test_data)
def test_all_models_dispersable():
    scheme = wu_minn_hcp_acquisition_scheme()

    dispersable_models = [
        [cylinder_models.C1Stick()],
        [cylinder_models.C2CylinderStejskalTannerApproximation()],
        [cylinder_models.C3CylinderCallaghanApproximation()],
        [cylinder_models.C4CylinderGaussianPhaseApproximation()],
        [gaussian_models.G1Ball(),
         gaussian_models.G2Zeppelin()], [gaussian_models.G3TemporalZeppelin()],
        [sphere_models.S1Dot(),
         gaussian_models.G2Zeppelin()],
        [
            sphere_models.S2SphereStejskalTannerApproximation(),
            gaussian_models.G2Zeppelin()
        ]
    ]

    spherical_distributions = [
        distribute_models.SD1WatsonDistributed,
        distribute_models.SD2BinghamDistributed
    ]

    for model in dispersable_models:
        for distribution in spherical_distributions:
            dist_mod = distribution(model)
            params = {}
            for param, card in dist_mod.parameter_cardinality.items():
                params[param] = np.random.rand(
                    card) * dist_mod.parameter_scales[param]
            assert_equal(isinstance(dist_mod(scheme, **params), np.ndarray),
                         True)
Exemple #5
0
def test_all_models_dispersable():
    scheme = wu_minn_hcp_acquisition_scheme()

    dispersable_models = [
        cylinder_models.C1Stick,
        cylinder_models.C2CylinderSodermanApproximation,
        cylinder_models.C3CylinderCallaghanApproximation,
        cylinder_models.C4CylinderGaussianPhaseApproximation,
        gaussian_models.G2Zeppelin, gaussian_models.G3RestrictedZeppelin
    ]

    spherical_distributions = [
        distribute_models.SD1WatsonDistributed,
        distribute_models.SD2BinghamDistributed
    ]

    for model in dispersable_models:
        for distribution in spherical_distributions:
            mod = model()
            dist_mod = distribution([mod])
            params = {}
            for param, card in dist_mod.parameter_cardinality.items():
                params[param] = np.random.rand(
                    card) * dist_mod.parameter_scales[param]
            assert_equal(isinstance(dist_mod(scheme, **params), np.ndarray),
                         True)
def test_acquisition_scheme_pruning():
    scheme = wu_minn_hcp_acquisition_scheme()
    test_data = np.random.rand(len(scheme.bvalues))

    scheme_pr, data_pr = scheme.return_pruned_acquisition_scheme([2],
                                                                 test_data)
    assert_array_equal(scheme_pr.bvalues,
                       scheme.bvalues[scheme.shell_indices == 2])
    assert_array_equal(data_pr, test_data[scheme.shell_indices == 2])
def test_raise_mix_with_tortuosity_in_mcmodel():
    scheme = wu_minn_hcp_acquisition_scheme()
    stick = cylinder_models.C1Stick()
    zeppelin = gaussian_models.G2Zeppelin()
    mc = modeling_framework.MultiCompartmentModel([stick, zeppelin])
    mc.set_tortuous_parameter('G2Zeppelin_1_lambda_perp',
                              'C1Stick_1_lambda_par', 'partial_volume_0',
                              'partial_volume_1')

    data = stick(scheme, lambda_par=1.7e-9, mu=[0., 0.])

    assert_raises(ValueError, mc.fit, scheme, data, solver='mix')
Exemple #8
0
def test_amico(lambda_1=[0, 0.0001], lambda_2=[0, 0.0000001], Nt=12):
    """Tests amico optimizer."""
    """
        Arguments:
            lambda_1: list
                list of L1 regularization constants for each compartment
            lambda_2: list
                list of L2 regularization constants for each compartment
            Nt: int
                number of samples for tessellation of parameter range
    """
    mc_model = create_noddi_watson_model()
    scheme_hcp = saved_acquisition_schemes.wu_minn_hcp_acquisition_scheme()
    grid_params = [
        p for p in mc_model.parameter_names
        if not p.endswith('mu') and not p.startswith('partial_volume')
    ]

    x0_len = 0
    for m_idx in range(len(mc_model.models)):
        m_atoms = 1
        for p in mc_model.models[m_idx].parameter_names:
            if mc_model.model_names[m_idx] + p in grid_params:
                m_atoms *= Nt
        x0_len += m_atoms
    x0_vector = np.zeros(x0_len)

    amico_opt = amico_cvxpy.AmicoCvxpyOptimizer(mc_model,
                                                scheme_hcp,
                                                x0_vector=x0_vector,
                                                lambda_1=lambda_1,
                                                lambda_2=lambda_2)

    signals, gt, dirs = simulate_signals(mc_model, scheme_hcp)

    v_iso_estim = np.zeros(signals.shape[0])
    v_ic_estim = np.zeros(signals.shape[0])
    od_estim = np.zeros(signals.shape[0])
    for i in range(signals.shape[0]):
        model_dirs = [dirs[i, :]]
        M, grid, idx = \
            forward_model_matrix(mc_model, scheme_hcp, model_dirs, Nt)
        parameters = amico_opt(signals[i, :], M, grid, idx)
        v_iso_estim[i] = parameters[0]
        od_estim[i] = parameters[2]
        v_ic_estim[i] = parameters[3]

    assert_almost_equal(v_iso_estim, gt['partial_volume_0'], 2)
    assert_almost_equal(v_ic_estim,
                        gt['SD1WatsonDistributed_1_partial_volume_0'], 2)
    assert_almost_equal(od_estim, gt['SD1WatsonDistributed_1_SD1Watson_1_odi'],
                        1)
Exemple #9
0
def test_C4_watson_gamma_equals_gamma_watson():
    scheme = wu_minn_hcp_acquisition_scheme()

    cylinder = cylinder_models.C4CylinderGaussianPhaseApproximation()
    watsoncyl = distribute_models.SD1WatsonDistributed([cylinder])

    gammawatsoncyl = distribute_models.DD1GammaDistributed(
        [watsoncyl],
        target_parameter='C4CylinderGaussianPhaseApproximation_1_diameter')

    param = 'SD1WatsonDistributed_1_C4CylinderGaussianPhaseApproximation'
    param += '_1_lambda_par'

    params1 = {
        param: 1.7e-9,
        'DD1Gamma_1_alpha': 2.,
        'DD1Gamma_1_beta': 4e-6,
        'SD1WatsonDistributed_1_SD1Watson_1_odi': 0.4,
        'SD1WatsonDistributed_1_SD1Watson_1_mu': [0., 0.]
    }
    gammacyl = distribute_models.DD1GammaDistributed([cylinder])
    watsongammacyl = distribute_models.SD1WatsonDistributed(
        [gammacyl],
        target_parameter='C4CylinderGaussianPhaseApproximation_1_mu')

    param = 'DD1GammaDistributed_1_C4CylinderGaussianPhaseApproximation'
    param += '_1_lambda_par'

    params2 = {
        param: 1.7e-9,
        'DD1GammaDistributed_1_DD1Gamma_1_alpha': 2.,
        'DD1GammaDistributed_1_DD1Gamma_1_beta': 4e-6,
        'SD1Watson_1_odi': 0.4,
        'SD1Watson_1_mu': [0., 0.]
    }

    assert_array_almost_equal(watsongammacyl(scheme, **params2),
                              gammawatsoncyl(scheme, **params1), 5)
def test_all_models_distributable():
    scheme = wu_minn_hcp_acquisition_scheme()

    distributable_models = [
        plane_models.P3PlaneCallaghanApproximation,
        cylinder_models.C2CylinderStejskalTannerApproximation,
        cylinder_models.C3CylinderCallaghanApproximation,
        cylinder_models.C4CylinderGaussianPhaseApproximation,
        sphere_models.S2SphereStejskalTannerApproximation
    ]

    spatial_distributions = [distribute_models.DD1GammaDistributed]

    for model in distributable_models:
        for distribution in spatial_distributions:
            mod = model()
            dist_mod = distribution([mod])
            params = {}
            for param, card in dist_mod.parameter_cardinality.items():
                params[param] = np.random.rand(
                    card) * dist_mod.parameter_scales[param]
            assert_equal(isinstance(dist_mod(scheme, **params), np.ndarray),
                         True)
Exemple #11
0
from dmipy.signal_models import cylinder_models, gaussian_models
from dmipy.core import modeling_framework
from dmipy.data.saved_acquisition_schemes import (
    wu_minn_hcp_acquisition_scheme)
from numpy.testing import assert_almost_equal

scheme = wu_minn_hcp_acquisition_scheme()


def test_multi_tissue_mc_model():
    scheme = wu_minn_hcp_acquisition_scheme()
    ball = gaussian_models.G1Ball()
    cyl = cylinder_models.C1Stick()
    models = [ball, cyl]
    S0_responses = [1., 2.]
    mt_mc = modeling_framework.MultiCompartmentModel(
        models=models, S0_tissue_responses=S0_responses)

    mt_mc.set_fixed_parameter('C1Stick_1_lambda_par', 1.7e-9)
    mt_mc.set_fixed_parameter('G1Ball_1_lambda_iso', 3e-9)
    mt_mc.set_fixed_parameter('C1Stick_1_mu', [0., 0.])
    param_dict = {'partial_volume_0': .5, 'partial_volume_1': .5}
    E = mt_mc.simulate_signal(scheme, param_dict)

    mt_mc_fit = mt_mc.fit(scheme, E)
    sig_fracts = mt_mc_fit.fitted_parameters
    vol_fracts = mt_mc_fit.fitted_multi_tissue_fractions
    vol_fracts_norm = mt_mc_fit.fitted_multi_tissue_fractions_normalized

    assert_almost_equal(
        sig_fracts['partial_volume_0'], vol_fracts['partial_volume_0'], 2)