From 86962294a560512a60ac9fd3ed075620f10ae707 Mon Sep 17 00:00:00 2001 From: Satrajit Ghosh Date: Sun, 24 Apr 2016 12:14:53 -0400 Subject: [PATCH 1/7] fix: to have recon-all work with 5.3 on OSX --- nipype/interfaces/freesurfer/utils.py | 1 - nipype/workflows/smri/freesurfer/autorecon3.py | 2 +- nipype/workflows/smri/freesurfer/recon.py | 5 ++--- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/nipype/interfaces/freesurfer/utils.py b/nipype/interfaces/freesurfer/utils.py index b8ba2a3260..6c3585a70b 100644 --- a/nipype/interfaces/freesurfer/utils.py +++ b/nipype/interfaces/freesurfer/utils.py @@ -1668,7 +1668,6 @@ class SphereInputSpec(FSTraitedSpecOpenMP): seed = traits.Int(argstr="-seed %d", desc="Seed for setting random number generator") magic = traits.Bool(argstr="-q", - requires=['in_smoothwm'], desc="No documentation. Direct questions to analysis-bugs@nmr.mgh.harvard.edu") in_smoothwm = File( exists=True, copyfile=True, desc="Input surface required when -q flag is not selected") diff --git a/nipype/workflows/smri/freesurfer/autorecon3.py b/nipype/workflows/smri/freesurfer/autorecon3.py index daace1c8c7..1c5729c777 100644 --- a/nipype/workflows/smri/freesurfer/autorecon3.py +++ b/nipype/workflows/smri/freesurfer/autorecon3.py @@ -1,4 +1,4 @@ -from nipype.interfaces.utility import IdentityInterface, Merge +from nipype.interfaces.utility import IdentityInterface, Merge, Function import nipype.pipeline.engine as pe # pypeline engine from nipype.interfaces.freesurfer import * from .ba_maps import create_ba_maps_wf diff --git a/nipype/workflows/smri/freesurfer/recon.py b/nipype/workflows/smri/freesurfer/recon.py index 4010923bc5..0d8b9931d5 100644 --- a/nipype/workflows/smri/freesurfer/recon.py +++ b/nipype/workflows/smri/freesurfer/recon.py @@ -84,9 +84,8 @@ def create_reconall_workflow(name="ReconAll", plugin_args=None): Example ------- - >>> from nipype.workflows.smri.freesurfer import create_skullstripped_recon_flow - >>> import nipype.interfaces.freesurfer as fs - >>> recon_all = create_skullstripped_recon_flow() + >>> from nipype.workflows.smri.freesurfer import create_reconall_workflow + >>> recon_all = create_reconall_flow() >>> recon_all.inputs.inputspec.subject_id = 'subj1' >>> recon_all.inputs.inputspec.subjects_dir = '.' >>> recon_all.inputs.inputspec.T1_files = 'T1.nii.gz' From 850de7669d304d62e322f695042dc262a19f8b6b Mon Sep 17 00:00:00 2001 From: Satrajit Ghosh Date: Sun, 24 Apr 2016 15:03:19 -0400 Subject: [PATCH 2/7] fix: updated specs and proper import --- nipype/interfaces/freesurfer/tests/test_auto_Sphere.py | 1 - nipype/workflows/smri/freesurfer/recon.py | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/nipype/interfaces/freesurfer/tests/test_auto_Sphere.py b/nipype/interfaces/freesurfer/tests/test_auto_Sphere.py index ceab66da9f..f66f910ea7 100644 --- a/nipype/interfaces/freesurfer/tests/test_auto_Sphere.py +++ b/nipype/interfaces/freesurfer/tests/test_auto_Sphere.py @@ -20,7 +20,6 @@ def test_Sphere_inputs(): in_smoothwm=dict(copyfile=True, ), magic=dict(argstr='-q', - requires=['in_smoothwm'], ), num_threads=dict(), out_file=dict(argstr='%s', diff --git a/nipype/workflows/smri/freesurfer/recon.py b/nipype/workflows/smri/freesurfer/recon.py index 0d8b9931d5..4726980c89 100644 --- a/nipype/workflows/smri/freesurfer/recon.py +++ b/nipype/workflows/smri/freesurfer/recon.py @@ -85,7 +85,7 @@ def create_reconall_workflow(name="ReconAll", plugin_args=None): Example ------- >>> from nipype.workflows.smri.freesurfer import create_reconall_workflow - >>> recon_all = create_reconall_flow() + >>> recon_all = create_reconall_workflow() >>> recon_all.inputs.inputspec.subject_id = 'subj1' >>> recon_all.inputs.inputspec.subjects_dir = '.' >>> recon_all.inputs.inputspec.T1_files = 'T1.nii.gz' From 15cede0a617ec6a961bc80aaa601e1d53fd7bfae Mon Sep 17 00:00:00 2001 From: Satrajit Ghosh Date: Sun, 24 Apr 2016 17:29:52 -0400 Subject: [PATCH 3/7] fix: remove print --- nipype/workflows/smri/freesurfer/recon.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/nipype/workflows/smri/freesurfer/recon.py b/nipype/workflows/smri/freesurfer/recon.py index 4726980c89..f0b48b57d1 100644 --- a/nipype/workflows/smri/freesurfer/recon.py +++ b/nipype/workflows/smri/freesurfer/recon.py @@ -7,6 +7,7 @@ from ....interfaces.freesurfer import AddXFormToHeader, Info from ....interfaces.io import DataSink from .utils import getdefaultconfig +from ....pipeline.engine.base import logger def create_skullstripped_recon_flow(name="skullstripped_recon_all"): """Performs recon-all on voulmes that are already skull stripped. @@ -164,7 +165,7 @@ def create_reconall_workflow(name="ReconAll", plugin_args=None): entorhinal = False rb_date = "2008-03-26" - print("FreeSurfer Version: {0}".format(fs_version)) + logger.info("FreeSurfer Version: {0}".format(fs_version)) def setconfig(reg_template=None, reg_template_withskull=None, From 1b1bcd640cea076e5b46c8a94159cd49c4095b81 Mon Sep 17 00:00:00 2001 From: Satrajit Ghosh Date: Sun, 24 Apr 2016 18:05:44 -0400 Subject: [PATCH 4/7] fix: assume version 5.3 when none available --- nipype/workflows/smri/freesurfer/recon.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/nipype/workflows/smri/freesurfer/recon.py b/nipype/workflows/smri/freesurfer/recon.py index f0b48b57d1..9d6f3ff702 100644 --- a/nipype/workflows/smri/freesurfer/recon.py +++ b/nipype/workflows/smri/freesurfer/recon.py @@ -136,7 +136,7 @@ def create_reconall_workflow(name="ReconAll", plugin_args=None): # check freesurfer version and set parameters fs_version_full = Info.version() - if 'v6.0' in fs_version_full or 'dev' in fs_version_full: + if fs_version_full and 'v6.0' in fs_version_full or 'dev' in fs_version_full: # assuming that dev is 6.0 fsvernum = 6.0 fs_version = 'v6.0' @@ -153,7 +153,10 @@ def create_reconall_workflow(name="ReconAll", plugin_args=None): if 'v5.3' in fs_version_full: fs_version = 'v5.3' else: - fs_vesion = fs_version_full.split('-')[-1] + if fs_version_full: + fs_version = fs_version_full.split('-')[-1] + else: + fs_version = 5.3 # assume version 5.3 print("Warning: Workflow may not work properly if FREESURFER_HOME " + "environmental variable is not set or if you are using an older " + "version of FreeSurfer") From fb6fbca7ee291d4764d39de2b9142c834448e9e5 Mon Sep 17 00:00:00 2001 From: Satrajit Ghosh Date: Mon, 25 Apr 2016 09:20:33 -0400 Subject: [PATCH 5/7] fix: logic of if --- nipype/workflows/smri/freesurfer/recon.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/nipype/workflows/smri/freesurfer/recon.py b/nipype/workflows/smri/freesurfer/recon.py index 9d6f3ff702..32b6bce820 100644 --- a/nipype/workflows/smri/freesurfer/recon.py +++ b/nipype/workflows/smri/freesurfer/recon.py @@ -136,7 +136,8 @@ def create_reconall_workflow(name="ReconAll", plugin_args=None): # check freesurfer version and set parameters fs_version_full = Info.version() - if fs_version_full and 'v6.0' in fs_version_full or 'dev' in fs_version_full: + if fs_version_full and ('v6.0' in fs_version_full or + 'dev' in fs_version_full): # assuming that dev is 6.0 fsvernum = 6.0 fs_version = 'v6.0' From bf46eef76d5761318780e18121b771d062090a0f Mon Sep 17 00:00:00 2001 From: Satrajit Ghosh Date: Mon, 25 Apr 2016 10:34:38 -0400 Subject: [PATCH 6/7] fix: logic errors --- nipype/workflows/smri/freesurfer/recon.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/nipype/workflows/smri/freesurfer/recon.py b/nipype/workflows/smri/freesurfer/recon.py index 32b6bce820..da1516fcfe 100644 --- a/nipype/workflows/smri/freesurfer/recon.py +++ b/nipype/workflows/smri/freesurfer/recon.py @@ -151,16 +151,17 @@ def create_reconall_workflow(name="ReconAll", plugin_args=None): else: # 5.3 is default fsvernum = 5.3 - if 'v5.3' in fs_version_full: - fs_version = 'v5.3' - else: - if fs_version_full: - fs_version = fs_version_full.split('-')[-1] + if fs_version_full: + if 'v5.3' in fs_version_full: + fs_version = 'v5.3' else: - fs_version = 5.3 # assume version 5.3 - print("Warning: Workflow may not work properly if FREESURFER_HOME " + - "environmental variable is not set or if you are using an older " + - "version of FreeSurfer") + fs_version = fs_version_full.split('-')[-1] + logger.info(("Warning: Workflow may not work properly if " + "FREESURFER_HOME environmental variable is not " + "set or if you are using an older version of " + "FreeSurfer")) + else: + fs_version = 5.3 # assume version 5.3 th3 = False shrink = None distance = 50 From 73f50650dc9faa3d3637bed0c2e87bbdfcd03cfa Mon Sep 17 00:00:00 2001 From: David Ellis Date: Mon, 25 Apr 2016 09:41:35 -0500 Subject: [PATCH 7/7] DOC: Explains how subject_id is used in workflow --- nipype/workflows/smri/freesurfer/recon.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/nipype/workflows/smri/freesurfer/recon.py b/nipype/workflows/smri/freesurfer/recon.py index da1516fcfe..454321ff83 100644 --- a/nipype/workflows/smri/freesurfer/recon.py +++ b/nipype/workflows/smri/freesurfer/recon.py @@ -105,6 +105,17 @@ def create_reconall_workflow(name="ReconAll", plugin_args=None): Outpus:: postdatasink_outputspec.subject_id : name of the datasinked output folder in the subjects directory + Note: + The input subject_id is not passed to the commands in the workflow. Commands + that require subject_id are reading implicit inputs from + {SUBJECTS_DIR}/{subject_id}. For those commands the subject_id is set to the + default value and SUBJECTS_DIR is set to the node directory. The implicit + inputs are then copied to the node directory in order to mimic a SUBJECTS_DIR + structure. For example, if the command implicitly reads in brainmask.mgz, the + interface would copy that input file to + {node_dir}/{subject_id}/mri/brainmask.mgz and set SUBJECTS_DIR to node_dir. + The workflow only uses the input subject_id to datasink the outputs to + {subjects_dir}/{subject_id}. """ reconall = pe.Workflow(name=name)