Source code for mdt.component_templates.batch_profiles
import glob
import os
from itertools import filterfalse
from mdt.lib.batch_utils import SimpleBatchProfile, BatchFitProtocolLoader, SimpleSubjectInfo
from mdt.component_templates.base import ComponentBuilder, ComponentTemplate
__author__ = 'Robbert Harms'
__date__ = "2017-02-14"
__maintainer__ = "Robbert Harms"
__email__ = "robbert@xkls.nl"
[docs]class BatchProfileBuilder(ComponentBuilder):
def _create_class(self, template):
"""Creates classes with as base class SimpleBatchProfile
Args:
template (BatchProfileTemplate): the batch profile config template
Returns:
SimpleBatchProfile: an subclass of a batch profile
"""
class AutoCreatedBatchProfile(SimpleBatchProfile):
def _get_subjects(self, data_folder):
dirs = sorted([os.path.basename(f) for f in glob.glob(os.path.join(data_folder, '*'))])
subjects = []
for subject_id in dirs:
subject_base_folder = os.path.join(
data_folder, template.subject_base_folder.format(subject_id=subject_id))
def _prepare_path(template_path):
if template_path is None:
return None
return template_path.format(data_folder=data_folder,
subject_id=subject_id,
subject_base_folder=subject_base_folder)
data_glob = glob.glob(_prepare_path(template.data_fname))
if not list(data_glob):
break
noise_std = self._autoload_noise_std(data_folder, subject_id,
file_pattern=_prepare_path(template.noise_std_fname))
protocol_loader = BatchFitProtocolLoader(
_prepare_path(template.protocol_auto_dir),
protocol_fname=_prepare_path(template.protocol_fname),
bvec_fname=_prepare_path(template.bvec_fname),
bval_fname=_prepare_path(template.bval_fname),
protocol_columns=template.protocol_columns)
mask_fname = None
if list(glob.glob(_prepare_path(template.mask_fname))):
mask_fname = glob.glob(_prepare_path(template.mask_fname))[0]
data_glob = list(filterfalse(lambda v: v == mask_fname, data_glob))
grad_dev = None
if list(glob.glob(_prepare_path(template.gradient_deviations_fname))):
grad_dev = glob.glob(_prepare_path(template.gradient_deviations_fname))[0]
data_glob = list(filterfalse(lambda v: v == grad_dev, data_glob))
subjects.append(SimpleSubjectInfo(
data_folder, subject_base_folder, subject_id, data_glob[0],
protocol_loader, mask_fname, noise_std=noise_std,
gradient_deviations=grad_dev))
return subjects
def __str__(self):
return template.name
for name, method in template.bound_methods.items():
setattr(AutoCreatedBatchProfile, name, method)
return AutoCreatedBatchProfile
[docs]class BatchProfileTemplate(ComponentTemplate):
"""The batch profile template to inherit.
Attributes:
name (str): the name of this batch profile
description (str): the description
subject_base_folder (str): the base folder for this subject. Allows expansion of ``{subject_id}``.
data_fname (str): the filename of the data volumes file. Allows expansion of ``{subject_id}``
and ``{subject_base_folder}``, and supports globbing. Results are afterwards filtered to exclude matches
of the mask and gradient deviations files.
mask_fname (str): the filename of the mask. Allows expansion of ``{subject_id}`` and ``{subject_base_folder}``,
and supports globbing.
noise_std_fname (str): the filename of the noise standard deviation file. Can be textfile or a nifti file.
Allows expansion of ``{subject_id}`` and ``{subject_base_folder}``, and supports globbing.
gradient_deviations_fname (str): the filename of the gradient deviations. Allows expansion of
``{subject_id}`` and ``{subject_base_folder}``, and supports globbing.
protocol_auto_dir (str): the directory from which MDT will try to autoload a directory.
Supports ``{subject_id}`` and ``{subject_base_folder}``, and supports globbing.
protocol_fname (str): the filename of the protocol file to use. Supports ``{subject_id}``
and ``{subject_base_folder}``, and supports globbing. If provided, we use it instead of the automatically
searched default.
bvec_fname (str): the filename of the bvec file to use. Supports ``{subject_id}``
and ``{subject_base_folder}``, and supports globbing. If provided, we use it instead of the automatically
searched default.
bval_fname (str): the filename of the bval file to use. Supports ``{subject_id}``
and ``{subject_base_folder}``, and supports globbing. If provided, we use it instead of the automatically
searched default.
protocol_columns (dict): a dictionary with additional columns to add to the protocol file. Use this for
default values for all subjects in your study.
"""
_component_type = 'batch_profiles'
_builder = BatchProfileBuilder()
name = None
description = ''
subject_base_folder = '{subject_id}'
data_fname = '{subject_base_folder}/*.nii*'
mask_fname = '{subject_base_folder}/*mask.nii*'
noise_std_fname = '{subject_base_folder}/noise_std*'
gradient_deviations_fname = '{subject_base_folder}/grad_dev.nii*'
protocol_auto_dir = '{subject_base_folder}'
protocol_fname = None
bvec_fname = None
bval_fname = None
protocol_columns = {}