Skip to content

Commit 622f827

Browse files
committed
ENH: Allow control of meta data filtering in DcmStack.
Allow multiple sort keys in MergeNifti
1 parent 56e5e9b commit 622f827

File tree

1 file changed

+21
-7
lines changed

1 file changed

+21
-7
lines changed

nipype/interfaces/dicomstack.py

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ class DcmStackInputSpec(NiftiGeneratorBaseInputSpec):
5555
traits.Str(),
5656
mandatory=True)
5757
embed_meta = traits.Bool(desc="Embed DICOM meta data into result")
58+
exclude_regexes = traits.List(desc="Meta data to exclude, suplementing any default exclude filters")
59+
include_regexes = traits.List(desc="Meta data to include, overriding any exclude filters")
5860

5961
class DcmStackOutputSpec(TraitedSpec):
6062
out_file = traits.File(exists=True)
@@ -75,7 +77,15 @@ def _get_filelist(self, trait_input):
7577

7678
def _run_interface(self, runtime):
7779
src_paths = self._get_filelist(self.inputs.dicom_files)
78-
stack = dcmstack.DicomStack()
80+
include_regexes = dcmstack.default_key_incl_res
81+
if not self.inputs.include_regexes is Undefined:
82+
include_regexes += self.inputs.include_regexes
83+
exclude_regexes = dcmstack.default_key_excl_res
84+
if not self.inputs.exclude_regexes is Undefined:
85+
exclude_regexes += self.inputs.exclude_regexes
86+
meta_filter = dcmstack.make_key_regex_filter(exclude_regexes,
87+
include_regexes)
88+
stack = dcmstack.DicomStack(meta_filter=meta_filter)
7989
for src_path in src_paths:
8090
src_dcm = dicom.read_file(src_path, force=True)
8191
stack.add_dcm(src_dcm)
@@ -214,7 +224,10 @@ def _list_outputs(self):
214224
class MergeNiftiInputSpec(NiftiGeneratorBaseInputSpec):
215225
in_files = traits.List(mandatory=True,
216226
desc="List of Nifti files to merge")
217-
sort_order = traits.Str(desc="Meta data key to sort files by")
227+
sort_order = traits.Either(traits.Str(),
228+
traits.List(),
229+
desc="One or more meta data keys to "
230+
"sort files by.")
218231
merge_dim = traits.Int(desc="Dimension to merge along. If not "
219232
"specified, the last singular or "
220233
"non-existant dimension is used.")
@@ -223,11 +236,9 @@ class MergeNiftiOutputSpec(TraitedSpec):
223236
out_file = traits.File(exists=True,
224237
desc="Merged Nifti file")
225238

226-
def make_key_func(meta_key, index=None):
239+
def make_key_func(meta_keys, index=None):
227240
def key_func(src_nii):
228-
result = src_nii.get_meta(meta_key, index)
229-
if result is None:
230-
raise ValueError('Key not found: %s' ) % meta_key
241+
result = [src_nii.get_meta(key, index) for key in meta_keys]
231242
return result
232243

233244
return key_func
@@ -246,7 +257,10 @@ def _run_interface(self, runtime):
246257
for nii in niis
247258
]
248259
if self.inputs.sort_order:
249-
nws.sort(key=make_key_func(self.inputs.sort_order))
260+
sort_order = self.inputs.sort_order
261+
if isinstance(sort_order, str):
262+
sort_order = [sort_order]
263+
nws.sort(key=make_key_func(sort_order))
250264
if self.inputs.merge_dim == traits.Undefined:
251265
merge_dim = None
252266
else:

0 commit comments

Comments
 (0)