def _get_subjects(self, data_folder):
        dirs = sorted([
            os.path.basename(f)
            for f in glob.glob(os.path.join(data_folder, '*'))
        ])
        subjects = []

        for directory in dirs:
            for resolution in self._resolutions_to_use:
                subject_pjoin = mdt.make_path_joiner(data_folder, directory,
                                                     resolution)

                if os.path.exists(subject_pjoin()):
                    niftis = glob.glob(subject_pjoin('*.nii*'))

                    dwi_fname = list(
                        filter(
                            lambda v: '_mask' not in v and 'grad_dev' not in v,
                            niftis))[0]
                    mask_fname = list(
                        sorted(filter(lambda v: '_mask' in v, niftis)))[0]

                    protocol_fname = glob.glob(subject_pjoin('*prtcl'))[0]
                    protocol_loader = BatchFitProtocolLoader(
                        subject_pjoin(), protocol_fname=protocol_fname)

                    subjects.append(
                        SimpleSubjectInfo(data_folder, subject_pjoin(),
                                          directory + '_' + resolution,
                                          dwi_fname, protocol_loader,
                                          mask_fname))

        return subjects
示例#2
0
 def _get_subjects(self):
     subjects = []
     for subject_id in sorted([os.path.basename(f) for f in glob.glob(os.path.join(self._root_dir, '*'))]):
         pjoin = mdt.make_path_joiner(self._root_dir, subject_id)
         subject_info = self._get_subject_in_directory(subject_id, pjoin)
         if subject_info:
             subjects.append(subject_info)
     return subjects
示例#3
0
    def _run_b1k_b2k_analysis(cls):
        pjoin = mdt.make_path_joiner(
            os.path.join(cls._tmp_dir, cls._tmp_dir_subdir, 'b1k_b2k'))

        input_data = mdt.load_input_data(
            pjoin('b1k_b2k_example_slices_24_38'), pjoin('b1k_b2k.prtcl'),
            pjoin('b1k_b2k_example_slices_24_38_mask'))

        for model_name in ['BallStick_r1', 'Tensor', 'NODDI']:
            mdt.fit_model(model_name, input_data,
                          pjoin('output', 'b1k_b2k_example_slices_24_38_mask'))
示例#4
0
    def _run_b6k_analysis(cls):
        pjoin = mdt.make_path_joiner(
            os.path.join(cls._tmp_dir, cls._tmp_dir_subdir,
                         'multishell_b6k_max'))

        input_data = mdt.load_input_data(
            pjoin('multishell_b6k_max_example_slices_24_38'),
            pjoin('multishell_b6k_max.prtcl'),
            pjoin('multishell_b6k_max_example_slices_24_38_mask'))

        for model_name in ['CHARMED_r1', 'CHARMED_r2', 'CHARMED_r3']:
            mdt.fit_model(
                model_name, input_data,
                pjoin('output',
                      'multishell_b6k_max_example_slices_24_38_mask'))
示例#5
0
    def test_lls_multishell_b6k_max(self):
        known_values = {
            'CHARMED_r1': {
                'LogLikelihood': {
                    'mean': -8038.29248046875,
                    'std': 4703.6005859375
                }
            },
            'CHARMED_r2': {
                'LogLikelihood': {
                    'mean': -7001.50927734375,
                    'std': 4062.600341796875
                }
            },
            'CHARMED_r3': {
                'LogLikelihood': {
                    'mean': -6514.17529296875,
                    'std': 3659.7138671875
                }
            }
        }

        for model_name in ['CHARMED_r1', 'CHARMED_r2', 'CHARMED_r3']:
            pjoin = mdt.make_path_joiner(
                os.path.join(self._tmp_dir, self._tmp_dir_subdir,
                             'multishell_b6k_max'))

            user_volumes = mdt.load_volume_maps(
                pjoin('output', 'multishell_b6k_max_example_slices_24_38_mask',
                      model_name))

            msg_prefix = 'b1k_b2k - {}'.format(model_name)
            roi = mdt.create_roi(
                user_volumes['LogLikelihood'],
                pjoin('multishell_b6k_max_example_slices_24_38_mask'))

            for map_name, test_values in known_values[model_name].items():
                np.testing.assert_allclose(test_values['mean'],
                                           np.mean(roi),
                                           rtol=1e-4,
                                           err_msg='{} - {} - mean'.format(
                                               msg_prefix, map_name))
                np.testing.assert_allclose(test_values['std'],
                                           np.std(roi),
                                           rtol=1e-4,
                                           err_msg='{} - {} - std'.format(
                                               msg_prefix, map_name))
示例#6
0
    def test_lls_multishell_b6k_max(self):
        known_values = {
            'CHARMED_r1': {
                'LogLikelihood': {
                    'mean': -447.95446,
                    'std': 36.09088
                }
            },
            'CHARMED_r2': {
                'LogLikelihood': {
                    'mean': -436.13861,
                    'std': 25.13305
                }
            },
            'CHARMED_r3': {
                'LogLikelihood': {
                    'mean': -432.15878,
                    'std': 21.87481
                }
            }
        }

        for model_name in ['CHARMED_r1', 'CHARMED_r2', 'CHARMED_r3']:
            pjoin = mdt.make_path_joiner(
                os.path.join(self._tmp_dir, self._tmp_dir_subdir,
                             'multishell_b6k_max'))

            user_volumes = mdt.load_volume_maps(
                pjoin('output', 'multishell_b6k_max_example_slices_24_38_mask',
                      model_name))

            msg_prefix = 'b1k_b2k - {}'.format(model_name)
            roi = mdt.create_roi(
                user_volumes['LogLikelihood'],
                pjoin('multishell_b6k_max_example_slices_24_38_mask'))

            for map_name, test_values in known_values[model_name].items():
                np.testing.assert_allclose(test_values['mean'],
                                           np.mean(roi),
                                           rtol=1e-4,
                                           err_msg='{} - {} - mean'.format(
                                               msg_prefix, map_name))
                np.testing.assert_allclose(test_values['std'],
                                           np.std(roi),
                                           rtol=1e-4,
                                           err_msg='{} - {} - std'.format(
                                               msg_prefix, map_name))
示例#7
0
    def test_lls_b1k_b2k(self):
        known_values = {
            'BallStick_r1': {
                'LogLikelihood': {
                    'mean': -1215.52355,
                    'std': 924.27117
                }
            },
            'Tensor': {
                'LogLikelihood': {
                    'mean': -182.73164,
                    'std': 20.02311
                }
            },
            'NODDI': {
                'LogLikelihood': {
                    'mean': -451.16198,
                    'std': 37.77514
                }
            }
        }

        for model_name in ['BallStick_r1', 'Tensor', 'NODDI']:
            pjoin = mdt.make_path_joiner(
                os.path.join(self._tmp_dir, self._tmp_dir_subdir, 'b1k_b2k'))

            user_volumes = mdt.load_volume_maps(
                pjoin('output', 'b1k_b2k_example_slices_24_38_mask',
                      model_name))

            msg_prefix = 'b1k_b2k - {}'.format(model_name)
            roi = mdt.create_roi(user_volumes['LogLikelihood'],
                                 pjoin('b1k_b2k_example_slices_24_38_mask'))

            for map_name, test_values in known_values[model_name].items():
                np.testing.assert_allclose(test_values['mean'],
                                           np.mean(roi),
                                           rtol=1e-4,
                                           err_msg='{} - {} - mean'.format(
                                               msg_prefix, map_name))
                np.testing.assert_allclose(test_values['std'],
                                           np.std(roi),
                                           rtol=1e-4,
                                           err_msg='{} - {} - std'.format(
                                               msg_prefix, map_name))
示例#8
0
    def test_lls_b1k_b2k(self):
        known_values = {
            'BallStick_r1': {
                'LogLikelihood': {
                    'mean': -327297.53125,
                    'std': 359791.5625
                }
            },
            'Tensor': {
                'LogLikelihood': {
                    'mean': -5891.28515625,
                    'std': 7691.93408203125
                }
            },
            'NODDI': {
                'LogLikelihood': {
                    'mean': -19352.4609375,
                    'std': 14489.8623046875
                }
            }
        }

        for model_name in ['BallStick_r1', 'Tensor', 'NODDI']:
            pjoin = mdt.make_path_joiner(
                os.path.join(self._tmp_dir, self._tmp_dir_subdir, 'b1k_b2k'))

            user_volumes = mdt.load_volume_maps(
                pjoin('output', 'b1k_b2k_example_slices_24_38_mask',
                      model_name))

            msg_prefix = 'b1k_b2k - {}'.format(model_name)
            roi = mdt.create_roi(user_volumes['LogLikelihood'],
                                 pjoin('b1k_b2k_example_slices_24_38_mask'))

            for map_name, test_values in known_values[model_name].items():
                np.testing.assert_allclose(test_values['mean'],
                                           np.mean(roi),
                                           rtol=1e-4,
                                           err_msg='{} - {} - mean'.format(
                                               msg_prefix, map_name))
                np.testing.assert_allclose(test_values['std'],
                                           np.std(roi),
                                           rtol=1e-4,
                                           err_msg='{} - {} - std'.format(
                                               msg_prefix, map_name))
def single_subject_results(subject_info):
    output_folder = subject_info.data_folder[:-1] + '_output'
    subject_id = subject_info.subject_id

    input_data = subject_info.get_input_data()
    wm_mask = output_folder + '/' + subject_id + '/wm_mask'
    snrs = estimate_snr_wm_mask(input_data, wm_mask)
    results_pjoin = mdt.make_path_joiner(output_folder + '/' + subject_id)

    results = {}

    for model in model_names:
        results_per_method = {}
        for method in ['sample', 'optimization']:
            results_per_snr = {}

            if method == 'sample':
                std_data = get_mcmc_std(results_pjoin, model)
            else:
                std_data = get_mle_std(results_pjoin, model)

            std_data = mdt.create_roi(std_data, wm_mask)

            for snr in noise_snrs:
                bin_width = 2.5
                std_values_in_snr = std_data[np.where(
                    (snr - bin_width <= snrs) & (snrs <= snr + bin_width))[0]]

                cutoff = 1
                std_values_in_snr = std_values_in_snr[
                    np.isfinite(std_values_in_snr)
                    & (std_values_in_snr < cutoff) & (std_values_in_snr > 0)]

                results_per_snr.update({snr: np.mean(std_values_in_snr)})

            results_per_method[method] = results_per_snr
        results[model] = results_per_method
    return results
import mdt
import matplotlib.pyplot as plt
from mdt.lib.post_processing import DTIMeasures
import numpy as np
import seaborn
seaborn.set()


__author__ = 'Robbert Harms'
__date__ = '2018-11-02'
__maintainer__ = 'Robbert Harms'
__email__ = '*****@*****.**'
__licence__ = 'LGPL v3'


input_pjoin = mdt.make_path_joiner('/home/robbert/programming/python/uncertainty_paper/data/single_slice/')
output_base_pjoin = mdt.make_path_joiner('/home/robbert/phd-data/papers/uncertainty_paper/single_slice/')
figure_output_pjoin = mdt.make_path_joiner('/tmp/uncertainty_paper/mean_mode_comparison')


def set_matplotlib_font_size(font_size):
    import matplotlib.pyplot as plt
    plt.rc('font', size=font_size)  # controls default text sizes
    plt.rc('axes', titlesize=font_size)  # fontsize of the axes title
    plt.rc('axes', labelsize=font_size)  # fontsize of the x and y labels
    plt.rc('xtick', labelsize=font_size)  # fontsize of the tick labels
    plt.rc('ytick', labelsize=font_size)  # fontsize of the tick labels
    plt.rc('legend', fontsize=font_size)  # legend fontsize
    plt.rc('figure', titlesize=font_size)

示例#11
0
    def _get_subjects(self):
        pjoin = mdt.make_path_joiner(self._root_dir)

        files = [os.path.basename(f) for f in glob.glob(pjoin('*'))]
        basenames = sorted(list({split_image_path(f)[1] for f in files}))
        subjects = []

        protocol_options = ['TE', 'TR', 'Delta', 'delta', 'maxG']

        default_mask = None
        if list(glob.glob(pjoin('mask.nii*'))):
            default_mask = list(glob.glob(pjoin('mask.nii*')))[0]

        for basename in basenames:
            dwi_fname = None
            if basename + '.nii' in files:
                dwi_fname = pjoin(basename + '.nii')
            elif basename + '.nii.gz' in files:
                dwi_fname = pjoin(basename + '.nii.gz')
            elif basename + '.hdr' in files and basename + '.img' in files:
                dwi_fname = pjoin(basename + '.hdr')

            noise_std = self._autoload_noise_std(basename,
                                                 file_path=pjoin(basename +
                                                                 '.noise_std'))

            prtcl_fname = None
            if basename + '.prtcl' in files:
                prtcl_fname = pjoin(basename + '.prtcl')

            bval_fname = None
            if basename + '.bval' in files:
                bval_fname = pjoin(basename + '.bval')

            bvec_fname = None
            if basename + '.bvec' in files:
                bvec_fname = pjoin(basename + '.bvec')

            mask_fname = default_mask
            if basename + '_mask.nii' in files:
                mask_fname = pjoin(basename + '_mask.nii')
            elif basename + '_mask.nii.gz' in files:
                mask_fname = pjoin(basename + '_mask.nii.gz')

            extra_cols_from_file = {}
            for option in protocol_options:
                if basename + '.' + option in files:
                    extra_cols_from_file.update(
                        {option: pjoin(basename + '.' + option)})

            if dwi_fname and (prtcl_fname or (bval_fname and bvec_fname)):
                protocol_loader = BatchFitProtocolLoader(
                    pjoin(),
                    protocol_fname=prtcl_fname,
                    bvec_fname=bvec_fname,
                    bval_fname=bval_fname,
                    protocol_columns=extra_cols_from_file)

                output_dir = self._get_subject_output_dir(
                    basename, mask_fname, pjoin(self.output_base_dir,
                                                basename))

                subjects.append(
                    SimpleSubjectInfo(basename,
                                      dwi_fname,
                                      protocol_loader,
                                      mask_fname,
                                      output_dir,
                                      noise_std=noise_std))
        return subjects
示例#12
0
from scipy.ndimage import binary_erosion

import mdt

__author__ = 'Robbert Harms'
__date__ = '2018-12-20'
__maintainer__ = 'Robbert Harms'
__email__ = '*****@*****.**'
__licence__ = 'LGPL v3'

output_pjoin = mdt.make_path_joiner(
    '/home/robbert/phd-data/papers/uncertainty_paper/registration/')
mask = mdt.load_brain_mask(
    '/usr/share/data/fsl-mni152-templates/FMRIB58_FA_1mm.nii.gz')
mask = binary_erosion(mask, iterations=1)

maps = {}

subjects_to_load = ['mgh_1005', 'mgh_1016', 'mgh_1017']

for subject in subjects_to_load:
    point_map = mdt.load_nifti(
        output_pjoin(subject, 'warped_BinghamNODDI_r1_w_in0.w')).get_data()
    std_map = mdt.load_nifti(
        output_pjoin(subject,
                     'warped_BinghamNODDI_r1_w_in0.w.std')).get_data()

    maps[subject + '.std'] = std_map
    maps[subject] = point_map

mdt.apply_mask(maps, mask)
import glob
import mdt
import os
from mdt.lib.batch_utils import BatchFitProtocolLoader, SimpleSubjectInfo
import matplotlib.pyplot as plt
import numpy as np
import seaborn
seaborn.set()
from mdt.lib.batch_utils import SimpleBatchProfile
from matplotlib.ticker import FuncFormatter, MaxNLocator, FixedLocator

figure_output_pjoin = mdt.make_path_joiner('/tmp/uncertainty_paper/std_snr/',
                                           make_dirs=True)


def set_matplotlib_font_size(font_size):
    import matplotlib.pyplot as plt
    plt.rc('font', size=font_size)  # controls default text sizes
    plt.rc('axes', titlesize=font_size)  # fontsize of the axes title
    plt.rc('axes', labelsize=font_size)  # fontsize of the x and y labels
    plt.rc('xtick', labelsize=font_size)  # fontsize of the tick labels
    plt.rc('ytick', labelsize=font_size)  # fontsize of the tick labels
    plt.rc('legend', fontsize=font_size)  # legend fontsize
    plt.rc('figure', titlesize=font_size)


class RheinLandBatchProfile(SimpleBatchProfile):
    def __init__(self, *args, resolutions_to_use=None, **kwargs):
        """Construct the Rheinland study batch profile.

        Args:
from matplotlib.ticker import ScalarFormatter, FuncFormatter, MaxNLocator
import pylab
import mdt
from mdt.lib.post_processing import DTIMeasures
import numpy as np
import matplotlib.pyplot as plt
import seaborn
seaborn.set()

__author__ = 'Robbert Harms'
__date__ = '2018-11-09'
__maintainer__ = 'Robbert Harms'
__email__ = '*****@*****.**'
__licence__ = 'LGPL v3'

input_pjoin = mdt.make_path_joiner(
    '/home/robbert/programming/python/uncertainty_paper/data/snr_simulations/')
output_base_pjoin = mdt.make_path_joiner(
    '/home/robbert/phd-data/papers/uncertainty_paper/snr_simulations/')
figure_output_pjoin = mdt.make_path_joiner(
    '/tmp/uncertainty_paper/snr_simulations/', make_dirs=True)

nmr_trials = 2
simulations_unweighted_signal_height = 1e4

# noise_snrs = [2, 5, 10, 20, 30, 40, 50]
noise_snrs = [5, 10, 20, 30, 40, 50]

protocols = ['hcp_mgh_1003', 'rheinland_v3a_1_2mm']

model_names = [
    'BallStick_r1',
__date__ = '2018-01-01'
__maintainer__ = 'Robbert Harms'
__email__ = '*****@*****.**'
__licence__ = 'LGPL v3'
"""
This script is meant to generate the simulation data needed for figure 4 and 5 of the article.

Before running this script, please copy the protocol files "hcp_mgh_1003.prtcl" and "rheinland_v3a_1_2mm.prtcl"
to the directory where you wish to store the simulation data and results. Set the same path here in this script. 
"""

# the path to where you stored the protocol files.
data_storage_path = r'/home/robbert/phd-data/papers/uncertainty_paper/snr_simulations/'

# an utility for easily appending to paths
pjoin = mdt.make_path_joiner(data_storage_path)

# The names of the protocol files we wish to simulate data for
protocols = ['hcp_mgh_1003', 'rheinland_v3a_1_2mm']

# The models for which we want to simulate the data
models = [
    'BallStick_r1', 'BallStick_r2', 'BallStick_r3', 'NODDI', 'BinghamNODDI_r1',
    'Tensor', 'CHARMED_r1', 'CHARMED_r2', 'CHARMED_r3'
]

# The different SNR's we wish to simulate. Each additional SNR will generate a copy of the simulated data with
# noise corresponding to the desired SNR.
noise_snrs = [2, 5, 10, 20, 30, 40, 50]

# The b0 signal intensity, fixed such that we can easily generate the noise (noise_std = unweighted_signal_height / SNR)
示例#16
0
    def _get_subjects(self):
        dirs = sorted([
            os.path.basename(f)
            for f in glob.glob(os.path.join(self._root_dir, '*'))
        ])
        subjects = []
        for subject_id in dirs:
            pjoin = mdt.make_path_joiner(self._root_dir, subject_id, 'diff',
                                         'preproc')
            if os.path.isdir(pjoin()):
                dwi_fname = list(glob.glob(pjoin('mri',
                                                 'diff_preproc.nii*')))[0]
                noise_std = self._autoload_noise_std(
                    subject_id, file_path=pjoin('noise_std'))

                bval_fname = pjoin('bvals.txt')
                if os.path.isfile(pjoin('diff_preproc.bval')):
                    bval_fname = pjoin('diff_preproc.bval')

                bvec_fname = pjoin('bvecs_fsl_moco_norm.txt')
                if os.path.isfile(pjoin('diff_preproc.bvec')):
                    bvec_fname = pjoin('diff_preproc.bvec')

                prtcl_fname = None
                if os.path.isfile(pjoin('diff_preproc.prtcl')):
                    prtcl_fname = pjoin('diff_preproc.prtcl')

                mask_fname = None
                if list(glob.glob(pjoin('diff_preproc_mask.nii*'))):
                    mask_fname = list(
                        glob.glob(pjoin('diff_preproc_mask.nii*')))[0]

                if mask_fname is None:
                    if list(glob.glob(pjoin('mri', 'diff_preproc_mask.nii*'))):
                        mask_fname = list(
                            glob.glob(pjoin('mri',
                                            'diff_preproc_mask.nii*')))[0]

                protocol_loader = BatchFitProtocolLoader(
                    pjoin(),
                    protocol_fname=prtcl_fname,
                    bvec_fname=bvec_fname,
                    bval_fname=bval_fname,
                    protocol_columns={
                        'Delta': 21.8e-3,
                        'delta': 12.9e-3,
                        'TR': 8800e-3,
                        'TE': 57e-3
                    })

                output_dir = self._get_subject_output_dir(
                    subject_id, mask_fname)

                subjects.append(
                    SimpleSubjectInfo(subject_id,
                                      dwi_fname,
                                      protocol_loader,
                                      mask_fname,
                                      output_dir,
                                      noise_std=noise_std))
        return subjects
import mdt

__author__ = 'Robbert Harms'
__date__ = "2018-08-14"
__maintainer__ = "Robbert Harms"
__email__ = "*****@*****.**"

pjoin = mdt.make_path_joiner(
    '/home/robbert/phd-data/papers/uncertainty_paper/snr_simulations/')
nmr_trials = 10
simulations_unweighted_signal_height = 1e4

nmr_samples = {
    'BallStick_r1': 11000,
    'BallStick_r2': 15000,
    'BallStick_r3': 25000,
    'NODDI': 15000,
    'BinghamNODDI_r1': 20000,
    'Tensor': 13000,
    'CHARMED_r1': 17000,
    'CHARMED_r2': 25000,
    'CHARMED_r3': 25000
}

protocols = ['hcp_mgh_1003', 'rheinland_v3a_1_2mm']
noise_snrs = [2, 5, 10, 20, 30, 40, 50]
model_names = [
    'BallStick_r1', 'BallStick_r2', 'BallStick_r3', 'NODDI', 'BinghamNODDI_r1',
    'Tensor', 'CHARMED_r1', 'CHARMED_r2', 'CHARMED_r3'
]

model_titles = {
    'BallStick_r1': 'BallStick_in1',
    'BallStick_r2': 'BallStick_in2',
    'BallStick_r3': 'BallStick_in3',
    'Tensor': 'Tensor',
    'NODDI': 'NODDI',
    'BinghamNODDI_r1': 'BinghamNODDI',
    'CHARMED_r1': 'CHARMED_in1',
    'CHARMED_r2': 'CHARMED_in2',
    'CHARMED_r3': 'CHARMED_in3'
}


output_base_pjoin = mdt.make_path_joiner('/home/robbert/phd-data/papers/uncertainty_paper/single_subject/')
# output_base_pjoin = mdt.make_path_joiner('/home/robbert/Downloads/single_subject/')

figure_output_pjoin = mdt.make_path_joiner('/tmp/uncertainty_paper/mle_mcmc_scatter/', make_dirs=True)
goc_output_pjoin = mdt.make_path_joiner('/home/robbert/phd-data/papers/uncertainty_paper/single_subject_gocs/')


def get_mle_results(dataset_name, model_name):
    maps = mdt.load_volume_maps(output_base_pjoin(dataset_name, model_name))

    if model_name == 'Tensor':
        return maps['Tensor.FA'], maps['Tensor.FA.std']
    elif model_name == 'BallStick_r1':
        return maps['w_stick0.w'], maps['w_stick0.w.std']
    elif model_name == 'BallStick_r2':
        return maps['FS'], maps['FS.std']