Source code for capsul.study_config.config_modules.freesurfer_config

# -*- coding: utf-8 -*-
'''
FreeSurfer configuration module

Classes
=======
:class:`FreeSurferConfig`
-------------------------
'''

# System import
from __future__ import absolute_import
import os
import six

# Trait import
from traits.api import File, Bool, Undefined, Directory

# Capsul import
from capsul.study_config.study_config import StudyConfigModule
from capsul.engine import CapsulEngine


[docs] class FreeSurferConfig(StudyConfigModule): """ Class to set up freesurfer configuration. Parse the 'SetUpFreeSurfer.sh' file and update dynamically the system environment. """ def __init__(self, study_config, configuration): """ Initilaize the FreeSurferConfig class. Parameters ---------- study_config: StudyConfig object the study configuration we want to update in order to deal with freesurfer functions. """ super(FreeSurferConfig, self).__init__(study_config, configuration) self.study_config.add_trait("freesurfer_config", File( Undefined, desc="Path to 'FreeSurferEnv.sh'", groups=['freesurfer'])) self.study_config.add_trait('freesurfer_subjectsdir', Directory( Undefined, desc='FreeSurfer subjects data directory', groups=['freesurfer'])) self.study_config.add_trait("use_freesurfer", Bool( False, desc="If True, FreeSurfer configuration is set up on startup", groups=['freesurfer']))
[docs] def initialize_module(self): """ Set up FSL environment variables according to current configuration. """ if 'capsul.engine.module.freesurfer' \ not in self.study_config.engine._loaded_modules: self.study_config.engine.load_module( 'capsul.engine.module.freesurfer') if type(self.study_config.engine) is not CapsulEngine: # engine is a proxy, thus we are initialized from a real # CapsulEngine, which holds the reference values self.sync_from_engine() else: self.sync_to_engine()
[docs] def initialize_callbacks(self): self.study_config.on_trait_change( self.sync_to_engine, ['freesurfer_config', 'freesurfer_subjectsdir']) # WARNING ref to self in callback self.study_config.engine.settings.module_notifiers[ 'capsul.engine.module.freesurfer'] = [self.sync_from_engine]
def sync_to_engine(self, param=None, value=None): if getattr(self, '_syncing', False): # manage recursive calls return self._syncing = True try: if 'FreeSurferConfig' in self.study_config.modules \ and 'capsul.engine.module.freesurfer' \ in self.study_config.engine._loaded_modules: with self.study_config.engine.settings as session: cif = self.study_config.engine.settings.config_id_field params = { 'freesurfer_config': 'setup', 'freesurfer_subjectsdir': 'subjects_dir', } config = session.config('freesurfer', 'global') if config is None: values = {cif: 'freesurfer'} for param, ceparam in six.iteritems(params): val = getattr(self.study_config, param) if val is Undefined: val = None values[ceparam] = val session.new_config('freesurfer', 'global', values) else: for param, ceparam in six.iteritems(params): val = getattr(self.study_config, param) if val is Undefined: val = None setattr(config, ceparam, val) finally: del self._syncing def sync_from_engine(self, param=None, value=None): if getattr(self, '_syncing', False): # manage recursive calls return self._syncing = True try: if 'FreeSurferConfig' in self.study_config.modules \ and 'capsul.engine.module.freesurfer' \ in self.study_config.engine._loaded_modules: with self.study_config.engine.settings as session: config = session.config('freesurfer', 'global') if config: params = { 'freesurfer_config': 'setup', 'freesurfer_subjectsdir': 'subjects_dir', } for param, ceparam in six.iteritems(params): val = getattr(config, ceparam) if val in (None, ''): val = Undefined setattr(self.study_config, param, val) if self.study_config.freesurfer_config: self.study_config.use_freesurfer = True else: self.study_config.use_freesurfer = False finally: del self._syncing