Source code for cmp.project

# Copyright (C) 2009-2021, Ecole Polytechnique Federale de Lausanne (EPFL) and
# Hospital Center and University of Lausanne (UNIL-CHUV), Switzerland, and CMP3 contributors
# All rights reserved.
#
#  This software is distributed under the open-source license Modified BSD.

"""Definition of classes and functions for handling non-GUI general events."""

# General imports
import multiprocessing
import fnmatch

import sys
import os
import warnings

from traits.api import *

from bids import BIDSLayout

# Own imports
from cmtklib.bids.utils import write_derivative_description
from cmp.pipelines.anatomical import anatomical as Anatomical_pipeline
from cmp.pipelines.diffusion import diffusion as Diffusion_pipeline
from cmp.pipelines.functional import fMRI as FMRI_pipeline
from cmtklib.config import anat_load_config_ini, anat_save_config, \
    dmri_load_config_ini, dmri_save_config, fmri_load_config_ini, fmri_save_config

# Ignore some warnings
warnings.filterwarnings("ignore",
                        message="UserWarning: No valid root directory found for domain 'derivatives'."
                                " Falling back on the Layout's root directory. If this isn't the intended behavior, "
                                "make sure the config file for this domain includes a 'root' key.")

# from cmtklib.util import remove_aborded_interface_pickles, fix_dataset_directory_in_pickles


[docs]class CMP_Project_Info(HasTraits): """Class used to store all properties of a processing project. Attributes ----------- base_directory: traits.Directory BIDS dataset root directory output_directory: traits.Directory Output directory bids_layout : bids.BIDSLayout Instance of pybids `BIDSLayout` subjects : traits.List List of subjects in the dataset subject : Subject being processed in the form ``sub-XX`` subject_sessions : traits.List List of sessions for the subject being processed subject_session : trait.Str Session of the subject being processed in the form ``ses-YY`` diffusion_imaging_model : traits.Str Diffusion imaging model that can be 'DSI', 'DTI', or 'multi-shell' dmri_bids_acqs : traits.List List diffusion imaging models extracted from ``acq-<label>`` filename part. dmri_bids_acq : Diffusion imaging model being processed anat_runs : traits.List List of run labels for T1w scans with multiple runs anat_run : traits.Str Run being processed for T1w scans with multiple runs dmri_runs : traits.List List of run labels for DWI scans with multiple runs dmri_run : traits.Str Run being processed for DWI scans with multiple runs fmri_runs : traits.List List of run labels for fMRI scans with multiple runs fmri_run : traits.Str Run being processed for fMRI scans with multiple runs parcellation_scheme : traits.Str Parcellation scheme used (Default: 'Lausanne2008') atlas_info : traits.Dict Dictionary storing parcellation atlas information See :class:`~cmp.parcellation.parcellation.ParcellationStage` for more details freesurfer_subjects_dir : traits.Str Freesurfer subjects directory freesurfer_subject_id : traits.Str Freesurfer subject ID t1_available : Bool True if T1w scans were found (Default: False) dmri_available : Bool True if DWI scans were found (Default: False) fmri_available : Bool True if fMRI scans were found (Default: False) anat_config_error_msg : traits.Str Error message for the anatomical pipeline configuration file anat_config_to_load : traits.Str Path to a configuration file for the anatomical pipeline anat_available_config : traits.List List of configuration files for the anatomical pipeline anat_stage_names : traits.List List of anatomical pipeline stage names anat_custom_last_stage : traits.Str Custom last anatomical pipeline stage to be processed dmri_config_error_msg : traits.Str Error message for the diffusion pipeline configuration file dmri_config_to_load : traits.Str Path to a configuration file for the diffusion pipeline dmri_available_config : traits.List List of configuration files for the anatomical pipeline dmri_stage_names : traits.List List of diffusion pipeline stage names dmri_custom_last_stage : traits.Str Custom last diffusion pipeline stage to be processed fmri_config_error_msg : traits.Str Error message for the fMRI pipeline configuration file fmri_config_to_load : traits.Str Path to a configuration file for the fMRI pipeline fmri_available_config : traits.List List of configuration files for the fMRI pipeline fmri_stage_names : traits.List List of fMRI pipeline stage names fmri_custom_last_stage : traits.Str Custom last fMRI pipeline stage to be processed number_of_cores : int Number of cores used by Nipype workflow execution engine to distribute independent processing nodes (Must be in the range of your local resources) """ base_directory = Directory output_directory = Directory bids_layout = Instance(BIDSLayout) subjects = List([]) subject = Enum(values='subjects') number_of_subjects = Int() subject_sessions = List([]) subject_session = Enum(values='subject_sessions') # current_subj = Str() anat_warning_msg = Str( '\nWarning: selected directory is already configured for anatomical data processing.\n\n' 'Do you want to reset the configuration to default parameters ?\n') dmri_warning_msg = Str( '\nWarning: selected directory is already configured for diffusion data processing.\n\n' 'Do you want to reset the configuration to default parameters ?\n') fmri_warning_msg = Str( '\nWarning: selected directory is already configured for resting-state data processing.\n\n' 'Do you want to reset the configuration to default parameters ?\n') # process_type = Enum('diffusion',['diffusion','fMRI']) diffusion_imaging_model = Enum('DTI', ['DSI', 'DTI', 'HARDI']) parcellation_scheme = Str('Lausanne2008') atlas_info = Dict() freesurfer_subjects_dir = Str('') freesurfer_subject_id = Str('') pipeline_processing_summary = List() t1_available = Bool(False) dmri_available = Bool(False) fmri_available = Bool(False) anat_config_error_msg = Str('') anat_config_to_load = Str() anat_available_config = List() anat_config_to_load_msg = Str( 'Several configuration files available. Select which one to load:\n') anat_last_date_processed = Str('Not yet processed') anat_last_stage_processed = Str('Not yet processed') anat_stage_names = List anat_custom_last_stage = Str dmri_config_error_msg = Str('') dmri_config_to_load = Str() dmri_available_config = List() dmri_config_to_load_msg = Str( 'Several configuration files available. Select which one to load:\n') dmri_last_date_processed = Str('Not yet processed') dmri_last_stage_processed = Str('Not yet processed') dmri_stage_names = List dmri_custom_last_stage = Str fmri_config_error_msg = Str('') fmri_config_to_load = Str() fmri_available_config = List() fmri_config_to_load_msg = Str( 'Several configuration files available. Select which one to load:\n') fmri_last_date_processed = Str('Not yet processed') fmri_last_stage_processed = Str('Not yet processed') fmri_stage_names = List fmri_custom_last_stage = Str number_of_cores = Enum(1, list(range(1, multiprocessing.cpu_count() + 1)))
[docs]def refresh_folder(bids_directory, derivatives_directory, subject, input_folders, session=None): """Creates (if needed) the folder hierarchy. Parameters ---------- bids_directory : os.path BIDS dataset root directory derivatives_directory : os.path Output (derivatives) directory subject : string BIDS subject label (``sub-XX``) input_folders : List of string List of folder to be created in ``derivatives_directory``/'cmp'/``subject`` session : string BIDS session label (``ses-YY``) """ paths = [] if session is None or session == '': paths.append(os.path.join( derivatives_directory, 'freesurfer', subject)) paths.append(os.path.join(derivatives_directory, 'cmp', subject)) paths.append(os.path.join(derivatives_directory, 'nipype', subject)) for in_f in input_folders: paths.append(os.path.join( derivatives_directory, 'cmp', subject, in_f)) # paths.append(os.path.join(derivatives_directory,'nipype',subject,in_f)) else: paths.append(os.path.join(derivatives_directory, 'freesurfer', '%s_%s' % (subject, session))) paths.append(os.path.join( derivatives_directory, 'cmp', subject, session)) paths.append(os.path.join(derivatives_directory, 'nipype', subject, session)) for in_f in input_folders: paths.append(os.path.join(derivatives_directory, 'cmp', subject, session, in_f)) # paths.append(os.path.join(derivatives_directory,'nipype',subject,session,in_f)) for full_p in paths: if not os.path.exists(full_p): try: os.makedirs(full_p) except os.error: print("%s was already existing" % full_p) finally: print("Created directory %s" % full_p) write_derivative_description(bids_directory, derivatives_directory, 'cmp') write_derivative_description( bids_directory, derivatives_directory, 'freesurfer') write_derivative_description( bids_directory, derivatives_directory, 'nipype')
[docs]def init_dmri_project(project_info, bids_layout, is_new_project, gui=True, debug=False): """Initialize the diffusion processing pipeline. Parameters ---------- project_info : cmp.project.CMP_Project_Info Instance of ``cmp.project.CMP_Project_Info`` object bids_layout : bids.BIDSLayout Instance of ``BIDSLayout`` object is_new_project : bool Specify if it corresponds or not to a new project. If `True`, it will create initial pipeline configuration files. gui : bool Might be obsolete and removed in future versions debug : bool If `True`, display extra prints to support debugging Returns ------- dmri_pipeline : Instance(cmp.pipelines.diffusion.diffusion.DiffusionPipeline) `DiffusionPipeline` object instance """ dmri_pipeline = Diffusion_pipeline.DiffusionPipeline(project_info) bids_directory = os.path.abspath(project_info.base_directory) derivatives_directory = os.path.abspath(project_info.output_directory) if len(project_info.subject_sessions) > 0: refresh_folder(bids_directory, derivatives_directory, project_info.subject, dmri_pipeline.input_folders, session=project_info.subject_session) else: refresh_folder(bids_directory, derivatives_directory, project_info.subject, dmri_pipeline.input_folders) dmri_inputs_checked = dmri_pipeline.check_input( layout=bids_layout, gui=gui) if dmri_inputs_checked: if is_new_project and dmri_pipeline is not None: # and dmri_pipelineis not None: print("> Initialize dmri project") if not os.path.exists(derivatives_directory): try: os.makedirs(derivatives_directory) except os.error: print("... Info : %s was already existing" % derivatives_directory) finally: print("... Info : Created directory %s" % derivatives_directory) if (project_info.subject_session != '') and (project_info.subject_session is not None): project_info.dmri_config_file = os.path.join(derivatives_directory, '%s_%s_diffusion_config.ini' % ( project_info.subject, project_info.subject_session)) else: project_info.dmri_config_file = os.path.join(derivatives_directory, '%s_diffusion_config.ini' % project_info.subject) if os.path.exists(project_info.dmri_config_file): warn_res = project_info.configure_traits( view='dmri_warning_view') if warn_res: print("... Read : Diffusion config file (%s)" % project_info.dmri_config_file) dmri_save_config( dmri_pipeline, project_info.dmri_config_file) else: return None else: print("... Create : Diffusion config file (%s)" % project_info.dmri_config_file) dmri_save_config(dmri_pipeline, project_info.dmri_config_file) else: if debug: print("int_project dmri_pipeline.global_config.subjects : ") print(dmri_pipeline.global_conf.subjects) dmri_conf_loaded = dmri_load_config_ini( dmri_pipeline, project_info.dmri_config_file) if not dmri_conf_loaded: return None dmri_pipeline.config_file = project_info.dmri_config_file else: print("INFO: Missing diffusion inputs") return dmri_inputs_checked, dmri_pipeline
[docs]def init_fmri_project(project_info, bids_layout, is_new_project, gui=True, debug=False): """Initialize the fMRI processing pipeline. Parameters ---------- project_info : cmp.project.CMP_Project_Info Instance of ``cmp.project.CMP_Project_Info`` object bids_layout : bids.BIDSLayout Instance of ``BIDSLayout`` object is_new_project : bool Specify if it corresponds or not to a new project. If `True`, it will create initial pipeline configuration files. gui : bool Might be obsolete and removed in future versions debug : bool If `True`, display extra prints to support debugging Returns ------- fmri_pipeline : Instance(cmp.pipelines.functional.fMRI.fMRIPipeline) `fMRIPipeline` object instance """ fmri_pipeline = FMRI_pipeline.fMRIPipeline(project_info) bids_directory = os.path.abspath(project_info.base_directory) derivatives_directory = os.path.abspath(project_info.output_directory) if len(project_info.subject_sessions) > 0: refresh_folder(bids_directory, derivatives_directory, project_info.subject, fmri_pipeline.input_folders, session=project_info.subject_session) else: refresh_folder(bids_directory, derivatives_directory, project_info.subject, fmri_pipeline.input_folders) fmri_inputs_checked = fmri_pipeline.check_input( layout=bids_layout, gui=gui, debug=False) if fmri_inputs_checked: if is_new_project and fmri_pipeline is not None: # and fmri_pipelineis not None: print("> Initialize fmri project") if not os.path.exists(derivatives_directory): try: os.makedirs(derivatives_directory) except os.error: print("... Info : %s was already existing" % derivatives_directory) finally: print("... Info : Created directory %s" % derivatives_directory) if (project_info.subject_session != '') and (project_info.subject_session is not None): project_info.fmri_config_file = os.path.join(derivatives_directory, '%s_%s_fMRI_config.ini' % ( project_info.subject, project_info.subject_session)) else: project_info.fmri_config_file = os.path.join(derivatives_directory, '%s_fMRI_config.ini' % project_info.subject) if os.path.exists(project_info.fmri_config_file): warn_res = project_info.configure_traits( view='fmri_warning_view') if warn_res: print("... Read : fMRI config file (%s)" % project_info.fmri_config_file) fmri_load_config_ini( fmri_pipeline, project_info.fmri_config_file) else: return None else: print("... Create : fMRI config file (%s)" % project_info.fmri_config_file) fmri_save_config(fmri_pipeline, project_info.fmri_config_file) else: if debug: print("int_project fmri_pipeline.global_config.subjects : ") print(fmri_pipeline.global_conf.subjects) fmri_conf_loaded = fmri_load_config_ini( fmri_pipeline, project_info.fmri_config_file) if not fmri_conf_loaded: return None fmri_pipeline.config_file = project_info.fmri_config_file else: print("INFO : Missing fmri inputs") return fmri_inputs_checked, fmri_pipeline
[docs]def init_anat_project(project_info, is_new_project, debug=False): """Initialize the anatomical processing pipeline. Parameters ---------- project_info : cmp.project.CMP_Project_Info Instance of ``cmp.project.CMP_Project_Info`` object is_new_project : bool Specify if it corresponds or not to a new project. If `True`, it will create initial pipeline configuration files. debug : bool If `True`, display extra prints to support debugging Returns ------- anat_pipeline : Instance(cmp.pipelines.anatomical.anatomical.AnatomicalPipeline) `AnatomicalPipeline` object instance """ anat_pipeline = Anatomical_pipeline.AnatomicalPipeline(project_info) bids_directory = os.path.abspath(project_info.base_directory) derivatives_directory = os.path.abspath(project_info.output_directory) if (project_info.subject_session != '') and (project_info.subject_session is not None): if debug: print('Refresh folder WITH session') refresh_folder(bids_directory, derivatives_directory, project_info.subject, anat_pipeline.input_folders, session=project_info.subject_session) else: if debug: print('Refresh folder WITHOUT session') refresh_folder(bids_directory, derivatives_directory, project_info.subject, anat_pipeline.input_folders) if is_new_project and anat_pipeline is not None: # and dmri_pipelineis not None: print("> Initialize anatomical project") if not os.path.exists(derivatives_directory): try: os.makedirs(derivatives_directory) except os.error: print("... Info: %s was already existing" % derivatives_directory) finally: print("... Info : Created directory %s" % derivatives_directory) if (project_info.subject_session != '') and (project_info.subject_session is not None): project_info.anat_config_file = os.path.join(derivatives_directory, '%s_%s_anatomical_config.ini' % ( project_info.subject, project_info.subject_session)) else: project_info.anat_config_file = os.path.join(derivatives_directory, '%s_anatomical_config.ini' % project_info.subject) if os.path.exists(project_info.anat_config_file): warn_res = project_info.configure_traits(view='anat_warning_view') if warn_res: anat_save_config(anat_pipeline, project_info.anat_config_file) else: return None else: anat_save_config(anat_pipeline, project_info.anat_config_file) else: if debug: print("int_project anat_pipeline.global_config.subjects : ") print(anat_pipeline.global_conf.subjects) anat_conf_loaded = anat_load_config_ini( anat_pipeline, project_info.anat_config_file) if not anat_conf_loaded: return None anat_pipeline.config_file = project_info.anat_config_file return anat_pipeline
[docs]def update_anat_last_processed(project_info, pipeline): """Update last processing information of a :class:`~cmp.pipelines.anatomical.anatomical.AnatomicalPipeline`. Parameters ---------- project_info : cmp.project.CMP_Project_Info Instance of `CMP_Project_Info` object pipeline : cmp.pipelines.anatomical.anatomical.AnatomicalPipeline Instance of `AnatomicalPipeline` object """ # last date if os.path.exists(os.path.join(project_info.output_directory, 'nipype', project_info.subject)): # out_dirs = os.listdir(os.path.join( # project_info.output_directory, 'nipype', project_info.subject)) # for out in out_dirs: # if (project_info.last_date_processed == "Not yet processed" or # out > project_info.last_date_processed): # pipeline.last_date_processed = out # project_info.last_date_processed = out if (project_info.anat_last_date_processed == "Not yet processed" or pipeline.now > project_info.anat_last_date_processed): pipeline.anat_last_date_processed = pipeline.now project_info.anat_last_date_processed = pipeline.now # last stage if os.path.exists( os.path.join(project_info.output_directory, 'nipype', project_info.subject, 'anatomical_pipeline')): stage_dirs = [] for _, dirnames, _ in os.walk( os.path.join(project_info.output_directory, 'nipype', project_info.subject, 'anatomical_pipeline')): for dirname in fnmatch.filter(dirnames, '*_stage'): stage_dirs.append(dirname) for stage in pipeline.ordered_stage_list: if stage.lower() + '_stage' in stage_dirs: pipeline.last_stage_processed = stage project_info.anat_last_stage_processed = stage # last parcellation scheme project_info.parcellation_scheme = pipeline.parcellation_scheme project_info.atlas_info = pipeline.atlas_info
[docs]def update_dmri_last_processed(project_info, pipeline): """Update last processing information of an :class:`~cmp.pipelines.diffusion.diffusion.DiffusionPipeline`. Parameters ---------- project_info : cmp.project.CMP_Project_Info Instance of `CMP_Project_Info` object pipeline : cmp.pipelines.diffusion.diffusion.DiffusionPipeline Instance of `DiffusionPipeline` object """ # last date if os.path.exists(os.path.join(project_info.output_directory, 'nipype', project_info.subject)): # out_dirs = os.listdir(os.path.join( # project_info.output_directory, 'nipype', project_info.subject)) # for out in out_dirs: # if (project_info.last_date_processed == "Not yet processed" or # out > project_info.last_date_processed): # pipeline.last_date_processed = out # project_info.last_date_processed = out if (project_info.dmri_last_date_processed == "Not yet processed" or pipeline.now > project_info.dmri_last_date_processed): pipeline.dmri_last_date_processed = pipeline.now project_info.dmri_last_date_processed = pipeline.now # last stage if os.path.exists( os.path.join(project_info.output_directory, 'nipype', project_info.subject, 'diffusion_pipeline')): stage_dirs = [] for _, dirnames, _ in os.walk( os.path.join(project_info.output_directory, 'nipype', project_info.subject, 'diffusion_pipeline')): for dirname in fnmatch.filter(dirnames, '*_stage'): stage_dirs.append(dirname) for stage in pipeline.ordered_stage_list: if stage.lower() + '_stage' in stage_dirs: pipeline.last_stage_processed = stage project_info.dmri_last_stage_processed = stage
[docs]def update_fmri_last_processed(project_info, pipeline): """Update last processing information of an :class:`~cmp.pipelines.functional.fMRI.fMRIPipeline`. Parameters ---------- project_info : cmp.project.CMP_Project_Info Instance of `CMP_Project_Info` object pipeline : cmp.pipelines.functional.fMRI.fMRIPipeline Instance of `fMRIPipeline` object """ # last date if os.path.exists(os.path.join(project_info.output_directory, 'nipype', project_info.subject)): # out_dirs = os.listdir(os.path.join( # project_info.output_directory, 'nipype', project_info.subject)) # for out in out_dirs: # if (project_info.last_date_processed == "Not yet processed" or # out > project_info.last_date_processed): # pipeline.last_date_processed = out # project_info.last_date_processed = out if (project_info.fmri_last_date_processed == "Not yet processed" or pipeline.now > project_info.fmri_last_date_processed): pipeline.fmri_last_date_processed = pipeline.now project_info.fmri_last_date_processed = pipeline.now # last stage if os.path.exists(os.path.join(project_info.output_directory, 'nipype', project_info.subject, 'fMRI_pipeline')): stage_dirs = [] for _, dirnames, _ in os.walk( os.path.join(project_info.output_directory, 'nipype', project_info.subject, 'fMRI_pipeline')): for dirname in fnmatch.filter(dirnames, '*_stage'): stage_dirs.append(dirname) for stage in pipeline.ordered_stage_list: if stage.lower() + '_stage' in stage_dirs: pipeline.last_stage_processed = stage project_info.dmri_last_stage_processed = stage
[docs]def run_individual(bids_dir, output_dir, participant_label, session_label, anat_pipeline_config, dwi_pipeline_config, func_pipeline_config, number_of_threads=1): """Function that creates the processing pipeline for complete coverage. Parameters ---------- bids_dir : string BIDS dataset root directory output_dir : string Output (derivatives) directory participant_label : string BIDS participant / subject label (``sub-XX``) session_label : string BIDS session label (``ses-XX``) anat_pipeline_config : string Path to anatomical pipeline configuration file dwi_pipeline_config : string Path to diffusion pipeline configuration file func_pipeline_config : string Path to fMRI pipeline configuration file number_of_threads : int Number of threads used by programs relying on the OpenMP library """ project = CMP_Project_Info() project.base_directory = os.path.abspath(bids_dir) project.output_directory = os.path.abspath(output_dir) project.subjects = ['{}'.format(participant_label)] project.subject = '{}'.format(participant_label) try: bids_layout = BIDSLayout(project.base_directory) except Exception: print("Exception : Raised at BIDSLayout") sys.exit(1) if session_label is not None: project.subject_sessions = ['{}'.format(session_label)] project.subject_session = '{}'.format(session_label) print("INFO : Detected session(s)") else: print("INFO : No detected session") project.subject_sessions = [''] project.subject_session = '' project.anat_config_file = os.path.abspath(anat_pipeline_config) # Perform only the anatomical pipeline if dwi_pipeline_config is None and func_pipeline_config is None: anat_pipeline = init_anat_project(project, False) if anat_pipeline is not None: anat_valid_inputs = anat_pipeline.check_input(bids_layout, gui=False) print('--- Set Freesurfer and ANTs to use {} threads by the means of OpenMP'.format(number_of_threads)) anat_pipeline.stages['Segmentation'].config.number_of_threads = number_of_threads if anat_valid_inputs: print(">> Process anatomical pipeline") anat_pipeline.process() else: print("ERROR : Invalid inputs") sys.exit(1) anat_pipeline.fill_stages_outputs() # Perform the anatomical and the diffusion pipelines elif dwi_pipeline_config is not None and func_pipeline_config is None: project.dmri_config_file = os.path.abspath(dwi_pipeline_config) anat_pipeline = init_anat_project(project, False) if anat_pipeline is not None: anat_valid_inputs = anat_pipeline.check_input(bids_layout, gui=False) print('--- Set Freesurfer and ANTs to use {} threads by the means of OpenMP'.format(number_of_threads)) anat_pipeline.stages['Segmentation'].config.number_of_threads = number_of_threads if anat_valid_inputs: print(">> Process anatomical pipeline") anat_pipeline.process() else: print("ERROR : Invalid inputs") sys.exit(1) anat_valid_outputs, msg = anat_pipeline.check_output() anat_pipeline.fill_stages_outputs() project.freesurfer_subjects_dir = anat_pipeline.stages['Segmentation'].config.freesurfer_subjects_dir project.freesurfer_subject_id = anat_pipeline.stages['Segmentation'].config.freesurfer_subject_id if anat_valid_outputs: dmri_valid_inputs, dmri_pipeline = init_dmri_project(project, bids_layout, False) if dmri_pipeline is not None: dmri_pipeline.parcellation_scheme = anat_pipeline.parcellation_scheme dmri_pipeline.atlas_info = anat_pipeline.atlas_info if dmri_valid_inputs: dmri_pipeline.process() else: print(" ... ERROR : Invalid inputs") sys.exit(1) else: print(msg) sys.exit(1) # Perform the anatomical and the fMRI pipelines elif dwi_pipeline_config is None and func_pipeline_config is not None: project.fmri_config_file = os.path.abspath(func_pipeline_config) anat_pipeline = init_anat_project(project, False) if anat_pipeline is not None: anat_valid_inputs = anat_pipeline.check_input(bids_layout, gui=False) print('--- Set Freesurfer and ANTs to use {} threads by the means of OpenMP'.format(number_of_threads)) anat_pipeline.stages['Segmentation'].config.number_of_threads = number_of_threads if anat_valid_inputs: print(">> Process anatomical pipeline") anat_pipeline.process() else: print("ERROR : Invalid inputs") sys.exit(1) anat_valid_outputs, msg = anat_pipeline.check_output() anat_pipeline.fill_stages_outputs() project.freesurfer_subjects_dir = anat_pipeline.stages['Segmentation'].config.freesurfer_subjects_dir project.freesurfer_subject_id = anat_pipeline.stages['Segmentation'].config.freesurfer_subject_id if anat_valid_outputs: fmri_valid_inputs, fmri_pipeline = init_fmri_project(project, bids_layout, False) if fmri_pipeline is not None: fmri_pipeline.parcellation_scheme = anat_pipeline.parcellation_scheme fmri_pipeline.atlas_info = anat_pipeline.atlas_info # fmri_pipeline.subjects_dir = anat_pipeline.stages['Segmentation'].config.freesurfer_subjects_dir # fmri_pipeline.subject_id = anat_pipeline.stages['Segmentation'].config.freesurfer_subject_id # print('Freesurfer subjects dir: {}'.format(fmri_pipeline.subjects_dir)) # print('Freesurfer subject id: {}'.format(fmri_pipeline.subject_id)) # print sys.argv[offset+9] if fmri_valid_inputs: print(">> Process fmri pipeline") fmri_pipeline.process() else: print(" ... ERROR : Invalid inputs") sys.exit(1) else: print(msg) sys.exit(1) # Perform all pipelines (anatomical/diffusion/fMRI) elif dwi_pipeline_config is not None and func_pipeline_config is not None: project.dmri_config_file = os.path.abspath(dwi_pipeline_config) project.fmri_config_file = os.path.abspath(func_pipeline_config) anat_pipeline = init_anat_project(project, False) if anat_pipeline is not None: anat_valid_inputs = anat_pipeline.check_input(bids_layout, gui=False) print('--- Set Freesurfer and ANTs to use {} threads by the means of OpenMP'.format(number_of_threads)) anat_pipeline.stages['Segmentation'].config.number_of_threads = number_of_threads if anat_valid_inputs: print(">> Process anatomical pipeline") anat_pipeline.process() else: print(" ... ERROR : Invalid inputs") sys.exit(1) anat_valid_outputs, msg = anat_pipeline.check_output() anat_pipeline.fill_stages_outputs() project.freesurfer_subjects_dir = anat_pipeline.stages['Segmentation'].config.freesurfer_subjects_dir project.freesurfer_subject_id = anat_pipeline.stages['Segmentation'].config.freesurfer_subject_id if anat_valid_outputs: dmri_valid_inputs, dmri_pipeline = init_dmri_project(project, bids_layout, False) if dmri_pipeline is not None: dmri_pipeline.parcellation_scheme = anat_pipeline.parcellation_scheme dmri_pipeline.atlas_info = anat_pipeline.atlas_info # print sys.argv[offset+7] if dmri_valid_inputs: print(">> Process diffusion pipeline") dmri_pipeline.process() else: print(" ... ERROR : Invalid inputs") sys.exit(1) fmri_valid_inputs, fmri_pipeline = init_fmri_project(project, bids_layout, False) if fmri_pipeline is not None: fmri_pipeline.parcellation_scheme = anat_pipeline.parcellation_scheme fmri_pipeline.atlas_info = anat_pipeline.atlas_info fmri_pipeline.subjects_dir = anat_pipeline.stages['Segmentation'].config.freesurfer_subjects_dir fmri_pipeline.subject_id = anat_pipeline.stages['Segmentation'].config.freesurfer_subject_id print('Freesurfer subjects dir: {}'.format(fmri_pipeline.subjects_dir)) print('Freesurfer subject id: {}'.format(fmri_pipeline.subject_id)) # print sys.argv[offset+9] if fmri_valid_inputs: print(">> Process fmri pipeline") fmri_pipeline.process() else: print(" ... ERROR : Invalid inputs") sys.exit(1) else: print(msg) sys.exit(1)