diff --git a/bip/pipelines/struct_FS/FS_proc.py b/bip/pipelines/struct_FS/FS_proc.py index 28f239647aa790138bdd9e64b793872f780c846d..1a7255808e5da712ad63fbfb6c200e372ec33eab 100755 --- a/bip/pipelines/struct_FS/FS_proc.py +++ b/bip/pipelines/struct_FS/FS_proc.py @@ -13,9 +13,8 @@ import os import shutil import logging -import subprocess from pipe_tree import In, Out, Ref -from bip.utils.log_utils import redirect_logging +from bip.utils.log_utils import redirect_logging, run_command log = logging.getLogger(__name__) @@ -28,25 +27,24 @@ def run(ctx, with redirect_logging('FS_proc', outdir=logs_dir): + # We need to delete the folder because otherwise, FreeSurfer complains if os.path.exists(FreeSurfer_dir): shutil.rmtree(FreeSurfer_dir) subjects_dir=os.getcwd() os.environ["SUBJECTS_DIR"] = subjects_dir + "/" + ctx.subject - cmd = 'recon-all -all -s FreeSurfer -i ' + subjects_dir + "/" + T1_unbiased + T1_path = subjects_dir + "/" + T1_unbiased + T2_path = subjects_dir + "/" + T2_FLAIR_unbiased + + cmd = 'recon-all -all -s FreeSurfer -i ' + T1_path if os.path.exists(T2_FLAIR_unbiased): - cmd += " -FLAIR " + subjects_dir + "/" + T2_FLAIR_unbiased + " -FLAIRpial" - - try: - returned_val = subprocess.call(cmd, shell=True) - print(returned_val) - except Exception as e: - print('Command: ' + cmd) - print('Exception type: \t' + str(type(e))) - print('Exception args: \t' + str(e.args)) - print('Exception message: \t' + str(e)) + cmd += " -FLAIR " + T2_path + " -FLAIRpial" + + output = run_command(log, cmd) + + log.info(output) #ext_wrappers.recon_all(subjects_dir=os.getcwd(), # directive="all", subjid="FreeSurfer", diff --git a/bip/pipelines/struct_T1/T1_brain_extract.py b/bip/pipelines/struct_T1/T1_brain_extract.py index 57d545e0b56a3d0ef557dfdb66fdd8e0a2a3dd92..749e59acb6ca8fa28fc933dbaa64623d4df5df06 100755 --- a/bip/pipelines/struct_T1/T1_brain_extract.py +++ b/bip/pipelines/struct_T1/T1_brain_extract.py @@ -15,7 +15,7 @@ import logging from shutil import copyfile from fsl import wrappers from bip.utils.log_utils import redirect_logging, tempdir -from pipe_tree import In, Out, Ref, update_closure +from pipe_tree import In, Out, Ref log = logging.getLogger(__name__) @@ -35,11 +35,12 @@ def run(ctx, T1: Ref, tmp_dir: Ref, tmp_T1_prefix: Ref, - transform_outputs: Ref("T1*_to_*")): + T1_orig_to_MNI_warp: Out, + T1_orig_ud_to_std_mat: Out, + T1_to_MNI_warp_coef: Out, + T1_to_MNI_warp_jac: Out): - with redirect_logging('T1_brain_extract', outdir=logs_dir),\ - tempdir(tmp_dir),\ - update_closure(transform_outputs): + with redirect_logging('T1_brain_extract', outdir=logs_dir),tempdir(tmp_dir): T1_tmp_1 = tmp_dir + '/T1_tmp_1.nii.gz' T1_tmp_2 = tmp_dir + '/T1_tmp_2.nii.gz' diff --git a/bip/pipelines/struct_T1/T1_fast.py b/bip/pipelines/struct_T1/T1_fast.py index 2bccfee1d5d2afa75390cfb1a3cdcb0c9cbbb3eb..3dfde59bfceb4a76b62a83f459456139ca3e17bc 100755 --- a/bip/pipelines/struct_T1/T1_fast.py +++ b/bip/pipelines/struct_T1/T1_fast.py @@ -13,23 +13,26 @@ import logging from fsl import wrappers from bip.utils.log_utils import redirect_logging -from pipe_tree import In, Out, Ref, update_closure +from pipe_tree import In, Out, Ref log = logging.getLogger(__name__) def run(ctx, - T1: In, - T1_brain: In, - logs_dir: Ref, - T1_unbiased: Out, - T1_unbiased_brain: Out, - T1_fast_pve_0: Out, - T1_fast_pve_1: Out, - T1_fast_pve_2: Out, - fast_outputs: Out("T1_fast_*")): + T1: In, + T1_brain: In, + logs_dir: Ref, + T1_fast_dir: Ref, + T1_unbiased: Out, + T1_unbiased_brain: Out, + T1_fast_pve_0: Out, + T1_fast_pve_1: Out, + T1_fast_pve_2: Out, + T1_fast_CSF_mask: Out, + T1_fast_GM_mask: Out, + T1_fast_WM_mask: Out, + T1_fast_brain_bias: Out): - with redirect_logging('T1_fast', outdir=logs_dir),\ - update_closure(fast_outputs): + with redirect_logging('T1_fast', outdir=logs_dir): #Run fast wrappers.fast(T1_brain, out = T1_fast_dir + '/T1_brain', b=True) diff --git a/bip/pipelines/struct_T2_FLAIR/T2_FLAIR_brain_extract.py b/bip/pipelines/struct_T2_FLAIR/T2_FLAIR_brain_extract.py index a9a1aba48c16711523adb85e37c89c6e844c58db..62dda36448c77d1aea894c1560f2d5cec43933f9 100755 --- a/bip/pipelines/struct_T2_FLAIR/T2_FLAIR_brain_extract.py +++ b/bip/pipelines/struct_T2_FLAIR/T2_FLAIR_brain_extract.py @@ -13,33 +13,33 @@ import logging from shutil import copyfile from fsl import wrappers from bip.utils.log_utils import redirect_logging, tempdir -from pipe_tree import In, Out, Ref, update_closure +from pipe_tree import In, Out, Ref log = logging.getLogger(__name__) def run(ctx, - T1_brain: In, - T1_brain_mask: In, - T1_orig_ud: In, - T1_orig_ud_to_T1_mat: In, - T1_to_MNI_linear_mat: In, - T1_to_MNI_warp: In, - T2_FLAIR_orig: In, - T2_FLAIR_orig_ud: In, - T2_FLAIR_orig_ud_warp: In, - T2_FLAIR_brain: Out, - T2_FLAIR_brain_mask: Out, - T2_FLAIR_brain_to_MNI: Out, - T2_FLAIR_to_MNI_linear_mat: Out, - T2_FLAIR_orig_ud_to_T2_FLAIR_mat: Out, - T2_FLAIR: Ref, - logs_dir: Ref, - tmp_dir: Ref, - transform_outputs: Ref("T2_FLAIR*_to_*")): + T1_brain: In, + T1_brain_mask: In, + T1_orig_ud: In, + T1_orig_ud_to_T1_mat: In, + T1_to_MNI_linear_mat: In, + T1_to_MNI_warp: In, + T2_FLAIR_orig: In, + T2_FLAIR_orig_ud: In, + T2_FLAIR_orig_ud_warp: In, + T2_FLAIR_brain: Out, + T2_FLAIR_brain_mask: Out, + T2_FLAIR_brain_to_MNI: Out, + T2_FLAIR_to_MNI_linear_mat: Out, + T2_FLAIR_orig_ud_to_T2_FLAIR_mat: Out, + T2_FLAIR_orig_ud_to_MNI_linear_mat: Out, + T2_FLAIR_orig_to_MNI_warp: Out, + T2_FLAIR: Ref, + logs_dir: Ref, + tmp_dir: Ref): with redirect_logging('T2_FLAIR_brain_extract', outdir=logs_dir),\ - tempdir(tmp_dir),\ - update_closure(transform_outputs): + tempdir(tmp_dir): T2_FLAIR_tmp_1_mat = tmp_dir + '/T2_FLAIR_tmp_1.mat' T2_FLAIR_tmp_2_mat = tmp_dir + '/T2_FLAIR_tmp_2.mat' diff --git a/bip/utils/log_utils.py b/bip/utils/log_utils.py index adf57f12638303736daf17bfffeceb1f2c3f8081..abcc8700913ce1b0b8fcb39e5caaa8f205e717b6 100755 --- a/bip/utils/log_utils.py +++ b/bip/utils/log_utils.py @@ -1,3 +1,14 @@ +#!/usr/bin/env python +# +# logs_utils.py - Tools for logging. +# +# Author: Paul McCarthy <pauldmccarthy@gmail.com> +# Author: Fidel Alfaro Almagro <fidel.alfaroalmagro@ndcn.ox.ac.uk> +# Author: Michiel Cottaar <michiel.cottaar@ndcn.ox.ac.uk> +# +# pylint: disable=C0103,E0602,C0114,C0115,C0116,R0913,R0914,R0915 +# pylint: disable=W0613 +# import os import os.path as op import socket @@ -7,9 +18,25 @@ import logging import traceback import contextlib import functools as ft +from subprocess import check_output from fsl import wrappers +def run_command(logger, command): + try: + logger.info('COMMAND TO RUN: \t' + command.strip()) + job_output = check_output(command, shell=True).decode('UTF-8') + logger.info('COMMAND OUTPUT: \t' + job_output.strip()) + except Exception as e: + logger.error('Exception raised during: \t' + command.strip()) + logger.error('Exception type: \t' + str(type(e))) + logger.error('Exception args: \t' + str(e.args)) + logger.error('Exception message: \t' + str(e)) + + job_output = "" + return job_output.strip() + + def create_formatter(): """Create a logging.Formatter. """ return logging.Formatter('%(asctime)s ' @@ -105,12 +132,12 @@ def redirect_logging(name, outdir='.', level=logging.INFO): @contextlib.contextmanager -def tempdir(dirName): - os.makedirs(dirName, exist_ok=True) - yield dirName - for fileName in os.listdir(dirName): - filePath = os.path.join(dirName, fileName) +def tempdir(dir_name): + os.makedirs(dir_name, exist_ok=True) + yield dir_name + for file_name in os.listdir(dir_name): + file_path = os.path.join(dir_name, file_name) try: - shutil.rmtree(filePath) + shutil.rmtree(file_path) except OSError: - os.remove(filePath) + os.remove(file_path)