Skip to content

Commit 2117e8d

Browse files
committed
Merge pull request #1093 from oesteban/bug/FixDCMStackOutpath
A new solution to DCMStack output folder
2 parents 82107dd + 9d194e4 commit 2117e8d

File tree

6 files changed

+51
-25
lines changed

6 files changed

+51
-25
lines changed

CHANGES

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
Next release
22
============
33

4-
* FIX: Enable absolute path definitions in DCMStack (https://github.com/nipy/nipype/pull/1089)
4+
* FIX: Enable absolute path definitions in DCMStack (https://github.com/nipy/nipype/pull/1089,
5+
replaced by https://github.com/nipy/nipype/pull/1093)
56
* ENH: New algorithm: mesh.WarpPoints applies displacements fields to point sets.
67
* ENH: Improved FieldMap-Based (FMB) workflow for correction of susceptibility distortions
78
in EPI seqs. (https://github.com/nipy/nipype/pull/1019)

nipype/interfaces/dcmstack.py

Lines changed: 45 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@
99
"""
1010

1111
from __future__ import absolute_import
12-
import os, string
13-
from os import path
12+
import os
13+
import string
14+
import errno
15+
from os import path as op
1416
from glob import glob
1517
from nipype.interfaces.base import (TraitedSpec,
1618
DynamicTraitedSpec,
@@ -33,6 +35,7 @@
3335
except ImportError:
3436
have_dcmstack = False
3537

38+
3639
def sanitize_path_comp(path_comp):
3740
result = []
3841
for char in path_comp:
@@ -48,8 +51,7 @@ class NiftiGeneratorBaseInputSpec(TraitedSpec):
4851
"meta data to create the output filename(s)")
4952
out_ext = traits.Str('.nii.gz', usedefault=True,
5053
desc="Determines output file type")
51-
use_cwd = traits.Bool(True, usedefault=True,
52-
desc='use interface\'s current working directory')
54+
out_path = Directory(desc='output path, current working directory if not set')
5355

5456

5557
class NiftiGeneratorBase(BaseInterface):
@@ -77,10 +79,20 @@ def _get_out_path(self, meta, idx=None):
7779
out_fn = (out_fmt % meta) + self.inputs.out_ext
7880
out_fn = sanitize_path_comp(out_fn)
7981

80-
if self.inputs.use_cwd:
81-
return path.join(os.getcwd(), out_fn)
82-
else:
83-
return path.abspath(out_fn)
82+
out_path = os.getcwd()
83+
if isdefined(self.inputs.out_path):
84+
out_path = op.abspath(self.inputs.out_path)
85+
86+
# now, mkdir -p $out_path
87+
try:
88+
os.makedirs(out_path)
89+
except OSError as exc: # Python >2.5
90+
if exc.errno == errno.EEXIST and op.isdir(out_path):
91+
pass
92+
else:
93+
raise
94+
95+
return op.join(out_path, out_fn)
8496

8597

8698
class DcmStackInputSpec(NiftiGeneratorBaseInputSpec):
@@ -100,6 +112,7 @@ class DcmStackInputSpec(NiftiGeneratorBaseInputSpec):
100112
class DcmStackOutputSpec(TraitedSpec):
101113
out_file = File(exists=True)
102114

115+
103116
class DcmStack(NiftiGeneratorBase):
104117
'''Create one Nifti file from a set of DICOM files. Can optionally embed
105118
meta data.
@@ -119,8 +132,8 @@ class DcmStack(NiftiGeneratorBase):
119132

120133
def _get_filelist(self, trait_input):
121134
if isinstance(trait_input, six.string_types):
122-
if path.isdir(trait_input):
123-
return glob(path.join(trait_input, '*.dcm'))
135+
if op.isdir(trait_input):
136+
return glob(op.join(trait_input, '*.dcm'))
124137
else:
125138
return glob(trait_input)
126139

@@ -155,9 +168,11 @@ def _list_outputs(self):
155168
outputs["out_file"] = self.out_path
156169
return outputs
157170

171+
158172
class GroupAndStackOutputSpec(TraitedSpec):
159173
out_list = traits.List(desc="List of output nifti files")
160174

175+
161176
class GroupAndStack(DcmStack):
162177
'''Create (potentially) multiple Nifti files for a set of DICOM files.
163178
'''
@@ -185,6 +200,7 @@ def _list_outputs(self):
185200
outputs["out_list"] = self.out_list
186201
return outputs
187202

203+
188204
class LookupMetaInputSpec(TraitedSpec):
189205
in_file = File(mandatory=True,
190206
exists=True,
@@ -197,6 +213,7 @@ class LookupMetaInputSpec(TraitedSpec):
197213
"lookup and the values specify the output names")
198214
)
199215

216+
200217
class LookupMeta(BaseInterface):
201218
'''Lookup meta data values from a Nifti with embeded meta data.
202219
@@ -233,13 +250,13 @@ def _outputs(self):
233250
outputs.add_trait(out_name, traits.Any)
234251
undefined_traits[out_name] = Undefined
235252
outputs.trait_set(trait_change_notify=False, **undefined_traits)
236-
#Not sure why this is needed
253+
# Not sure why this is needed
237254
for out_name in self._meta_keys.values():
238255
_ = getattr(outputs, out_name)
239256
return outputs
240257

241258
def _run_interface(self, runtime):
242-
#If the 'meta_keys' input is a list, covert it to a dict
259+
# If the 'meta_keys' input is a list, covert it to a dict
243260
self._make_name_map()
244261
nw = NiftiWrapper.from_filename(self.inputs.in_file)
245262
self.result = {}
@@ -253,6 +270,7 @@ def _list_outputs(self):
253270
outputs.update(self.result)
254271
return outputs
255272

273+
256274
class CopyMetaInputSpec(TraitedSpec):
257275
src_file = File(mandatory=True, exists=True)
258276
dest_file = File(mandatory=True, exists=True)
@@ -262,9 +280,11 @@ class CopyMetaInputSpec(TraitedSpec):
262280
exclude_classes = traits.List(desc="List of meta data "
263281
"classifications to exclude")
264282

283+
265284
class CopyMetaOutputSpec(TraitedSpec):
266285
dest_file = File(exists=True)
267286

287+
268288
class CopyMeta(BaseInterface):
269289
'''Copy meta data from one Nifti file to another. Useful for preserving
270290
meta data after some processing steps.'''
@@ -296,8 +316,8 @@ def _run_interface(self, runtime):
296316
dest.meta_ext.slice_dim = src.meta_ext.slice_dim
297317
dest.meta_ext.shape = src.meta_ext.shape
298318

299-
self.out_path = path.join(os.getcwd(),
300-
path.basename(self.inputs.dest_file))
319+
self.out_path = op.join(os.getcwd(),
320+
op.basename(self.inputs.dest_file))
301321
dest.to_filename(self.out_path)
302322

303323
return runtime
@@ -307,6 +327,7 @@ def _list_outputs(self):
307327
outputs['dest_file'] = self.out_path
308328
return outputs
309329

330+
310331
class MergeNiftiInputSpec(NiftiGeneratorBaseInputSpec):
311332
in_files = traits.List(mandatory=True,
312333
desc="List of Nifti files to merge")
@@ -318,16 +339,19 @@ class MergeNiftiInputSpec(NiftiGeneratorBaseInputSpec):
318339
"specified, the last singular or "
319340
"non-existant dimension is used.")
320341

342+
321343
class MergeNiftiOutputSpec(TraitedSpec):
322344
out_file = File(exists=True, desc="Merged Nifti file")
323345

346+
324347
def make_key_func(meta_keys, index=None):
325348
def key_func(src_nii):
326349
result = [src_nii.get_meta(key, index) for key in meta_keys]
327350
return result
328351

329352
return key_func
330353

354+
331355
class MergeNifti(NiftiGeneratorBase):
332356
'''Merge multiple Nifti files into one. Merges together meta data
333357
extensions as well.'''
@@ -361,18 +385,23 @@ def _list_outputs(self):
361385
outputs['out_file'] = self.out_path
362386
return outputs
363387

388+
364389
class SplitNiftiInputSpec(NiftiGeneratorBaseInputSpec):
365390
in_file = File(exists=True, mandatory=True, desc="Nifti file to split")
366391
split_dim = traits.Int(desc="Dimension to split along. If not "
367392
"specified, the last dimension is used.")
368393

394+
369395
class SplitNiftiOutputSpec(TraitedSpec):
370396
out_list = traits.List(File(exists=True),
371397
desc="Split Nifti files")
372398

399+
373400
class SplitNifti(NiftiGeneratorBase):
374-
'''Split one Nifti file into many along the specified dimension. Each
375-
result has an updated meta data extension as well.'''
401+
'''
402+
Split one Nifti file into many along the specified dimension. Each
403+
result has an updated meta data extension as well.
404+
'''
376405
input_spec = SplitNiftiInputSpec
377406
output_spec = SplitNiftiOutputSpec
378407

nipype/interfaces/tests/test_auto_DcmStack.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@ def test_DcmStack_inputs():
1313
out_ext=dict(usedefault=True,
1414
),
1515
out_format=dict(),
16-
use_cwd=dict(usedefault=True,
17-
),
16+
out_path=dict(),
1817
)
1918
inputs = DcmStack.input_spec()
2019

nipype/interfaces/tests/test_auto_GroupAndStack.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@ def test_GroupAndStack_inputs():
1313
out_ext=dict(usedefault=True,
1414
),
1515
out_format=dict(),
16-
use_cwd=dict(usedefault=True,
17-
),
16+
out_path=dict(),
1817
)
1918
inputs = GroupAndStack.input_spec()
2019

nipype/interfaces/tests/test_auto_MergeNifti.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,8 @@ def test_MergeNifti_inputs():
99
out_ext=dict(usedefault=True,
1010
),
1111
out_format=dict(),
12+
out_path=dict(),
1213
sort_order=dict(),
13-
use_cwd=dict(usedefault=True,
14-
),
1514
)
1615
inputs = MergeNifti.input_spec()
1716

nipype/interfaces/tests/test_auto_SplitNifti.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,8 @@ def test_SplitNifti_inputs():
88
out_ext=dict(usedefault=True,
99
),
1010
out_format=dict(),
11+
out_path=dict(),
1112
split_dim=dict(),
12-
use_cwd=dict(usedefault=True,
13-
),
1413
)
1514
inputs = SplitNifti.input_spec()
1615

0 commit comments

Comments
 (0)