From 4681775ae288c7a5dbecf9f255b3a9894974fdd1 Mon Sep 17 00:00:00 2001 From: "Christopher J. Markiewicz" Date: Wed, 23 Mar 2016 12:13:04 -0400 Subject: [PATCH 1/6] FIX: Use relative path for concatenated_file input to Concatenate() --- nipype/interfaces/freesurfer/model.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/nipype/interfaces/freesurfer/model.py b/nipype/interfaces/freesurfer/model.py index e72252bf8b..607586d6f6 100644 --- a/nipype/interfaces/freesurfer/model.py +++ b/nipype/interfaces/freesurfer/model.py @@ -603,11 +603,11 @@ class Concatenate(FSCommand): def _list_outputs(self): outputs = self.output_spec().get() - if not isdefined(self.inputs.concatenated_file): - outputs['concatenated_file'] = os.path.join(os.getcwd(), - 'concat_output.nii.gz') - else: - outputs['concatenated_file'] = self.inputs.concatenated_file + + fname = self.inputs.concatenated_file + if not isdefined(fname): + fname = 'concat_output.nii.gz' + outputs['concatenated_file'] = os.path.join(os.getcwd(), fname) return outputs def _gen_filename(self, name): From f10d92eac8e5861c178173b964a20766574aeaba Mon Sep 17 00:00:00 2001 From: "Christopher J. Markiewicz" Date: Thu, 24 Mar 2016 14:08:59 -0400 Subject: [PATCH 2/6] TEST: Basic exercise of freesurfer.model.Concatenate --- .../interfaces/freesurfer/tests/test_model.py | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 nipype/interfaces/freesurfer/tests/test_model.py diff --git a/nipype/interfaces/freesurfer/tests/test_model.py b/nipype/interfaces/freesurfer/tests/test_model.py new file mode 100644 index 0000000000..e41048eb77 --- /dev/null +++ b/nipype/interfaces/freesurfer/tests/test_model.py @@ -0,0 +1,48 @@ +# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*- +# vi: set ft=python sts=4 ts=4 sw=4 et: + +import os +import tempfile +import shutil +import numpy as np +import nibabel as nib + +from nipype.testing import assert_equal +from nipype.interfaces.freesurfer import model + + +def test_concatenate(): + tmp_dir = tempfile.mkdtemp() + cwd = os.getcwd() + os.chdir(tmp_dir) + in1 = 'cont1.nii' + in2 = 'cont2.nii' + out = 'bar.nii' + + data1 = np.zeros((3, 3, 3, 1), dtype=np.float32) + data2 = np.ones((3, 3, 3, 5), dtype=np.float32) + out_data = np.concatenate((data1, data2), axis=3) + mean_data = np.mean(out_data, axis=3) + + nib.Nifti1Image(data1, affine=np.eye(4)).to_filename(in1) + nib.Nifti1Image(data2, affine=np.eye(4)).to_filename(in2) + + # Test default behavior + res = model.Concatenate(in_files=[in1, in2]).run() + yield (assert_equal, res.outputs.concatenated_file, + os.path.join(tmp_dir, 'concat_output.nii.gz')) + yield (assert_equal, nib.load('concat_output.nii.gz').get_data(), out_data) + + # Test specified concatenated_file + res = model.Concatenate(in_files=[in1, in2], concatenated_file=out).run() + yield (assert_equal, res.outputs.concatenated_file, + os.path.join(tmp_dir, out)) + yield (assert_equal, nib.load(out).get_data(), out_data) + + # Test a simple statistic + res = model.Concatenate(in_files=[in1, in2], concatenated_file=out, + stats='mean').run() + yield (assert_equal, nib.load(out).get_data(), mean_data) + + os.chdir(cwd) + shutil.rmtree(tmp_dir) From b34aab2606004ee095794c0bf7d26e1f30e7af65 Mon Sep 17 00:00:00 2001 From: "Christopher J. Markiewicz" Date: Thu, 24 Mar 2016 14:10:22 -0400 Subject: [PATCH 3/6] DOC: Add gh-1411 to CHANGES --- CHANGES | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGES b/CHANGES index 8dce5813e2..337ae51f42 100644 --- a/CHANGES +++ b/CHANGES @@ -1,5 +1,6 @@ Next release ============ + * ENH: Created interface for BrainSuite Cortical Surface Extraction command line tools (https://github.com/nipy/nipype/pull/1305) * FIX: job execution on systems/approaches where locale is undefined (https://github.com/nipy/nipype/pull/1401) * FIX: Clean up byte/unicode issues using subprocess (https://github.com/nipy/nipype/pull/1394) @@ -26,6 +27,7 @@ Next release * FIX: Use realpath to determine hard link source (https://github.com/nipy/nipype/pull/1388) * FIX: Correct linking/copying fallback behavior (https://github.com/nipy/nipype/pull/1391) * ENH: Nipype workflow and interfaces for FreeSurfer's recon-all (https://github.com/nipy/nipype/pull/1326) +* FIX: Permit relative path for concatenated_file input to Concatenate() (https://github.com/nipy/nipype/pull/1411) Release 0.11.0 (September 15, 2015) ============ From 9b478876f986ab7c7921cb73075c20e45f8b6799 Mon Sep 17 00:00:00 2001 From: "Christopher J. Markiewicz" Date: Thu, 24 Mar 2016 14:28:50 -0400 Subject: [PATCH 4/6] TEST: Condition freesurfer test on command installation --- nipype/interfaces/freesurfer/__init__.py | 2 +- nipype/interfaces/freesurfer/base.py | 15 +++++++++++---- nipype/interfaces/freesurfer/tests/test_model.py | 5 +++-- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/nipype/interfaces/freesurfer/__init__.py b/nipype/interfaces/freesurfer/__init__.py index ebfb773fec..c48e6a44c4 100644 --- a/nipype/interfaces/freesurfer/__init__.py +++ b/nipype/interfaces/freesurfer/__init__.py @@ -2,7 +2,7 @@ # vi: set ft=python sts=4 ts=4 sw=4 et: """Top-level namespace for freesurfer.""" -from .base import Info, FSCommand +from .base import Info, FSCommand, no_freesurfer from .preprocess import (ParseDICOMDir, UnpackSDICOMDir, MRIConvert, Resample, ReconAll, BBRegister, ApplyVolTransform, Smooth, DICOMConvert, RobustRegister, FitMSParams, diff --git a/nipype/interfaces/freesurfer/base.py b/nipype/interfaces/freesurfer/base.py index c1e02bb829..5e88638983 100644 --- a/nipype/interfaces/freesurfer/base.py +++ b/nipype/interfaces/freesurfer/base.py @@ -117,10 +117,6 @@ def _subjects_dir_update(self): def set_default_subjects_dir(cls, subjects_dir): cls._subjects_dir = subjects_dir - @property - def version(self): - return Info.version() - def run(self, **inputs): if 'subjects_dir' in inputs: self.inputs.subjects_dir = inputs['subjects_dir'] @@ -220,3 +216,14 @@ def run(self, **inputs): self.inputs.num_threads = inputs['num_threads'] self._num_threads_update() return super(FSCommandOpenMP, self).run(**inputs) + + +def no_freesurfer(): + """Checks if FreeSurfer is NOT installed + used with skipif to skip tests that will + fail if FreeSurfer is not installed""" + + if Info.version() is None: + return True + else: + return False diff --git a/nipype/interfaces/freesurfer/tests/test_model.py b/nipype/interfaces/freesurfer/tests/test_model.py index e41048eb77..440c2ffcca 100644 --- a/nipype/interfaces/freesurfer/tests/test_model.py +++ b/nipype/interfaces/freesurfer/tests/test_model.py @@ -7,10 +7,11 @@ import numpy as np import nibabel as nib -from nipype.testing import assert_equal -from nipype.interfaces.freesurfer import model +from nipype.testing import assert_equal, skipif +from nipype.interfaces.freesurfer import model, no_freesurfer +@skipif(no_freesurfer) def test_concatenate(): tmp_dir = tempfile.mkdtemp() cwd = os.getcwd() From d6be84c55f15534d35d7a9407e9a4c52625cc2e9 Mon Sep 17 00:00:00 2001 From: "Christopher J. Markiewicz" Date: Wed, 30 Mar 2016 13:07:33 -0400 Subject: [PATCH 5/6] REF: Deduplicate no_freesurfer --- .../freesurfer/tests/test_preprocess.py | 16 ++++------------ nipype/interfaces/freesurfer/tests/test_utils.py | 15 ++++----------- 2 files changed, 8 insertions(+), 23 deletions(-) diff --git a/nipype/interfaces/freesurfer/tests/test_preprocess.py b/nipype/interfaces/freesurfer/tests/test_preprocess.py index 3086c85bf7..d4e1021204 100644 --- a/nipype/interfaces/freesurfer/tests/test_preprocess.py +++ b/nipype/interfaces/freesurfer/tests/test_preprocess.py @@ -5,18 +5,10 @@ import nibabel as nif import numpy as np from tempfile import mkdtemp -from nipype.testing import (assert_equal, assert_false, assert_true, - assert_raises, skipif) +from nipype.testing import assert_equal, assert_raises, skipif import nipype.interfaces.freesurfer as freesurfer -def no_freesurfer(): - if freesurfer.Info().version is None: - return True - else: - return False - - def create_files_in_directory(): outdir = os.path.realpath(mkdtemp()) cwd = os.getcwd() @@ -38,7 +30,7 @@ def clean_directory(outdir, old_wd): os.chdir(old_wd) -@skipif(no_freesurfer) +@skipif(freesurfer.no_freesurfer) def test_robustregister(): filelist, outdir, cwd = create_files_in_directory() @@ -66,7 +58,7 @@ def test_robustregister(): clean_directory(outdir, cwd) -@skipif(no_freesurfer) +@skipif(freesurfer.no_freesurfer) def test_fitmsparams(): filelist, outdir, cwd = create_files_in_directory() @@ -91,7 +83,7 @@ def test_fitmsparams(): clean_directory(outdir, cwd) -@skipif(no_freesurfer) +@skipif(freesurfer.no_freesurfer) def test_synthesizeflash(): filelist, outdir, cwd = create_files_in_directory() diff --git a/nipype/interfaces/freesurfer/tests/test_utils.py b/nipype/interfaces/freesurfer/tests/test_utils.py index 8b49303b20..fca748e081 100644 --- a/nipype/interfaces/freesurfer/tests/test_utils.py +++ b/nipype/interfaces/freesurfer/tests/test_utils.py @@ -15,13 +15,6 @@ import nipype.interfaces.freesurfer as fs -def no_freesurfer(): - if fs.Info().version is None: - return True - else: - return False - - def create_files_in_directory(): outdir = os.path.realpath(mkdtemp()) cwd = os.getcwd() @@ -60,7 +53,7 @@ def clean_directory(outdir, old_wd): os.chdir(old_wd) -@skipif(no_freesurfer) +@skipif(fs.no_freesurfer) def test_sample2surf(): s2s = fs.SampleToSurface() @@ -104,7 +97,7 @@ def set_illegal_range(): clean_directory(cwd, oldwd) -@skipif(no_freesurfer) +@skipif(fs.no_freesurfer) def test_surfsmooth(): smooth = fs.SurfaceSmooth() @@ -139,7 +132,7 @@ def test_surfsmooth(): clean_directory(cwd, oldwd) -@skipif(no_freesurfer) +@skipif(fs.no_freesurfer) def test_surfxfm(): xfm = fs.SurfaceTransform() @@ -173,7 +166,7 @@ def test_surfxfm(): clean_directory(cwd, oldwd) -@skipif(no_freesurfer) +@skipif(fs.no_freesurfer) def test_surfshots(): fotos = fs.SurfaceSnapshots() From cd985f10f62325c0bd9699357363c7bfb8fc2486 Mon Sep 17 00:00:00 2001 From: "Christopher J. Markiewicz" Date: Wed, 30 Mar 2016 17:34:13 -0400 Subject: [PATCH 6/6] TEST: Test Concatenate() in workflow TraitError occurred in workflow, not when run directly. --- nipype/interfaces/freesurfer/tests/test_model.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/nipype/interfaces/freesurfer/tests/test_model.py b/nipype/interfaces/freesurfer/tests/test_model.py index 440c2ffcca..9421647855 100644 --- a/nipype/interfaces/freesurfer/tests/test_model.py +++ b/nipype/interfaces/freesurfer/tests/test_model.py @@ -9,6 +9,7 @@ from nipype.testing import assert_equal, skipif from nipype.interfaces.freesurfer import model, no_freesurfer +import nipype.pipeline.engine as pe @skipif(no_freesurfer) @@ -16,8 +17,8 @@ def test_concatenate(): tmp_dir = tempfile.mkdtemp() cwd = os.getcwd() os.chdir(tmp_dir) - in1 = 'cont1.nii' - in2 = 'cont2.nii' + in1 = os.path.join(tmp_dir, 'cont1.nii') + in2 = os.path.join(tmp_dir, 'cont2.nii') out = 'bar.nii' data1 = np.zeros((3, 3, 3, 1), dtype=np.float32) @@ -40,6 +41,17 @@ def test_concatenate(): os.path.join(tmp_dir, out)) yield (assert_equal, nib.load(out).get_data(), out_data) + # Test in workflow + wf = pe.Workflow('test_concatenate', base_dir=tmp_dir) + concat = pe.Node(model.Concatenate(in_files=[in1, in2], + concatenated_file=out), + name='concat') + wf.add_nodes([concat]) + wf.run() + yield (assert_equal, nib.load(os.path.join(tmp_dir, 'test_concatenate', + 'concat', out)).get_data(), + out_data) + # Test a simple statistic res = model.Concatenate(in_files=[in1, in2], concatenated_file=out, stats='mean').run()