Skip to content

Commit 8ddca5a

Browse files
authored
Merge pull request #1723 from shoshber/FAST
[FIX] FAST output files
2 parents 6640e6f + f685f14 commit 8ddca5a

File tree

2 files changed

+43
-15
lines changed

2 files changed

+43
-15
lines changed

nipype/interfaces/fsl/preprocess.py

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -323,17 +323,20 @@ def _list_outputs(self):
323323
nclasses = self.inputs.number_classes
324324
# when using multichannel, results basename is based on last
325325
# input filename
326+
_gen_fname_opts = {}
326327
if isdefined(self.inputs.out_basename):
327-
basefile = self.inputs.out_basename
328+
_gen_fname_opts['basename'] = self.inputs.out_basename
329+
_gen_fname_opts['cwd'] = os.getcwd()
328330
else:
329-
basefile = self.inputs.in_files[-1]
331+
_gen_fname_opts['basename'] = self.inputs.in_files[-1]
332+
_gen_fname_opts['cwd'], _, _ = split_filename(_gen_fname_opts['basename'])
330333

331-
outputs['tissue_class_map'] = self._gen_fname(basefile, suffix='_seg')
334+
outputs['tissue_class_map'] = self._gen_fname(suffix='_seg', **_gen_fname_opts)
332335
if self.inputs.segments:
333336
outputs['tissue_class_files'] = []
334337
for i in range(nclasses):
335338
outputs['tissue_class_files'].append(
336-
self._gen_fname(basefile, suffix='_seg_%d' % i))
339+
self._gen_fname(suffix='_seg_%d' % i, **_gen_fname_opts))
337340
if isdefined(self.inputs.output_biascorrected):
338341
outputs['restored_image'] = []
339342
if len(self.inputs.in_files) > 1:
@@ -342,22 +345,21 @@ def _list_outputs(self):
342345
for val, f in enumerate(self.inputs.in_files):
343346
# image numbering is 1-based
344347
outputs['restored_image'].append(
345-
self._gen_fname(basefile,
346-
suffix='_restore_%d' % (val + 1)))
348+
self._gen_fname(suffix='_restore_%d' % (val + 1), **_gen_fname_opts))
347349
else:
348350
# single image segmentation has unnumbered output image
349351
outputs['restored_image'].append(
350-
self._gen_fname(basefile, suffix='_restore'))
352+
self._gen_fname(suffix='_restore', **_gen_fname_opts))
351353

352-
outputs['mixeltype'] = self._gen_fname(basefile, suffix='_mixeltype')
354+
outputs['mixeltype'] = self._gen_fname(suffix='_mixeltype', **_gen_fname_opts)
353355
if not self.inputs.no_pve:
354356
outputs['partial_volume_map'] = self._gen_fname(
355-
basefile, suffix='_pveseg')
357+
suffix='_pveseg', **_gen_fname_opts)
356358
outputs['partial_volume_files'] = []
357359
for i in range(nclasses):
358360
outputs[
359361
'partial_volume_files'].append(
360-
self._gen_fname(basefile, suffix='_pve_%d' % i))
362+
self._gen_fname(suffix='_pve_%d' % i, **_gen_fname_opts))
361363
if self.inputs.output_biasfield:
362364
outputs['bias_field'] = []
363365
if len(self.inputs.in_files) > 1:
@@ -366,18 +368,17 @@ def _list_outputs(self):
366368
for val, f in enumerate(self.inputs.in_files):
367369
# image numbering is 1-based
368370
outputs['bias_field'].append(
369-
self._gen_fname(basefile,
370-
suffix='_bias_%d' % (val + 1)))
371+
self._gen_fname(suffix='_bias_%d' % (val + 1), **_gen_fname_opts))
371372
else:
372373
# single image segmentation has unnumbered output image
373374
outputs['bias_field'].append(
374-
self._gen_fname(basefile, suffix='_bias'))
375+
self._gen_fname(suffix='_bias', **_gen_fname_opts))
375376

376377
if self.inputs.probability_maps:
377378
outputs['probability_maps'] = []
378379
for i in range(nclasses):
379380
outputs['probability_maps'].append(
380-
self._gen_fname(basefile, suffix='_prob_%d' % i))
381+
self._gen_fname(suffix='_prob_%d' % i, **_gen_fname_opts))
381382
return outputs
382383

383384

nipype/interfaces/fsl/tests/test_preprocess.py

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from nipype.testing import (assert_equal, assert_not_equal, assert_raises,
1313
skipif)
1414

15-
from nipype.utils.filemanip import split_filename
15+
from nipype.utils.filemanip import split_filename, filename_to_list
1616
from .. import preprocess as fsl
1717
from nipype.interfaces.fsl import Info
1818
from nipype.interfaces.base import File, TraitError, Undefined, isdefined
@@ -167,6 +167,33 @@ def test_fast():
167167
"-S 1 %s" % tmp_infile])
168168
teardown_infile(tmp_dir)
169169

170+
@skipif(no_fsl)
171+
def test_fast_list_outputs():
172+
''' By default (no -o), FSL's fast command outputs files into the same
173+
directory as the input files. If the flag -o is set, it outputs files into
174+
the cwd '''
175+
def _run_and_test(opts, output_base):
176+
outputs = fsl.FAST(**opts)._list_outputs()
177+
for output in outputs.values():
178+
filenames = filename_to_list(output)
179+
if filenames is not None:
180+
for filename in filenames:
181+
assert_equal(filename[:len(output_base)], output_base)
182+
183+
# set up
184+
infile, indir = setup_infile()
185+
cwd = tempfile.mkdtemp()
186+
os.chdir(cwd)
187+
yield assert_not_equal, indir, cwd
188+
out_basename = 'a_basename'
189+
190+
# run and test
191+
opts = {'in_files': tmp_infile}
192+
input_path, input_filename, input_ext = split_filename(tmp_infile)
193+
_run_and_test(opts, os.path.join(input_path, input_filename))
194+
195+
opts['out_basename'] = out_basename
196+
_run_and_test(opts, os.path.join(cwd, out_basename))
170197

171198
@skipif(no_fsl)
172199
def setup_flirt():

0 commit comments

Comments
 (0)