From 044c458c0b0572ae909c787ba558f7ce575643e8 Mon Sep 17 00:00:00 2001
From: Fidel Alfaro Almagro <falmagro@fmrib.ox.ac.uk>
Date: Fri, 10 Feb 2023 08:17:13 +0000
Subject: [PATCH] Correcting generic bugs

---
 bip/pipelines/struct_FS/FS_proc.py            | 24 +++++------
 bip/pipelines/struct_T1/T1_brain_extract.py   | 11 ++---
 bip/pipelines/struct_T1/T1_fast.py            | 27 ++++++------
 .../struct_T2_FLAIR/T2_FLAIR_brain_extract.py | 42 +++++++++----------
 bip/utils/log_utils.py                        | 41 ++++++++++++++----
 5 files changed, 87 insertions(+), 58 deletions(-)

diff --git a/bip/pipelines/struct_FS/FS_proc.py b/bip/pipelines/struct_FS/FS_proc.py
index 28f2396..1a72558 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 57d545e..749e59a 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 2bccfee..3dfde59 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 a9a1aba..62dda36 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 adf57f1..abcc870 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)
-- 
GitLab