Skip to content

Commit 7e18a32

Browse files
committed
Merge pull request #381 from akeshavan/avscale
enh: fsl avscale and removed nipy FmriRealign4d interleaved
2 parents ddce410 + 7001f28 commit 7e18a32

File tree

2 files changed

+83
-17
lines changed

2 files changed

+83
-17
lines changed

nipype/interfaces/fsl/utils.py

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -458,6 +458,64 @@ def aggregate_outputs(self, runtime=None, needed_outputs=None):
458458
outputs.out_stat = out_stat
459459
return outputs
460460

461+
class AvScaleInputSpec(FSLCommandInputSpec):
462+
mat_file = File(exists=True, argstr="%s",
463+
desc='mat file to read', position=0)
464+
465+
466+
class AvScaleOutputSpec(TraitedSpec):
467+
rotation_translation_matrix=traits.Any(desc='Rotation and Translation Matrix')
468+
scales = traits.Any(desc='Scales (x,y,z)')
469+
skews = traits.Any(desc='Skews')
470+
average_scaling = traits.Any(desc='Average Scaling')
471+
determinant = traits.Any(desc='Determinant')
472+
forward_half_transform = traits.Any(desc='Forward Half Transform')
473+
backward_half_transform = traits.Any(desc='Backwards Half Transform')
474+
left_right_orientation_preserved = traits.Bool(desc='True if LR orientation preserved')
475+
476+
class AvScale(FSLCommand):
477+
"""Use FSL avscale command to extract info from mat file output of FLIRT
478+
479+
Examples
480+
--------
481+
avscale = AvScale()
482+
avscale.inputs.mat_file = 'flirt.mat'
483+
res = avscale.run() # doctest: +SKIP
484+
485+
"""
486+
input_spec = AvScaleInputSpec
487+
output_spec = AvScaleOutputSpec
488+
489+
_cmd = 'avscale'
490+
491+
def _format_arg(self, name, trait_spec, value):
492+
return super(AvScale, self)._format_arg(name, trait_spec, value)
493+
494+
def aggregate_outputs(self, runtime=None, needed_outputs=None):
495+
outputs = self._outputs()
496+
497+
def lines_to_float(lines):
498+
out = []
499+
for line in lines:
500+
values = line.split()
501+
out.append([float(val) for val in values])
502+
return out
503+
504+
out = runtime.stdout.split('\n')
505+
506+
outputs.rotation_translation_matrix = lines_to_float(out[1:5])
507+
outputs.scales = lines_to_float([out[6].split(" = ")[1]])
508+
outputs.skews = lines_to_float([out[8].split(" = ")[1]])
509+
outputs.average_scaling = lines_to_float([out[10].split(" = ")[1]])
510+
outputs.determinant = lines_to_float([out[12].split(" = ")[1]])
511+
if out[13].split(": ")[1] == 'preserved':
512+
outputs.left_right_orientation_preserved = True
513+
else:
514+
outputs.left_right_orientation_preserved = False
515+
outputs.forward_half_transform = lines_to_float(out[16:20])
516+
outputs.backward_half_transform = lines_to_float(out[22:-1])
517+
518+
return outputs
461519

462520
class OverlayInputSpec(FSLCommandInputSpec):
463521
transparency = traits.Bool(desc='make overlay colors semi-transparent',

nipype/interfaces/nipy/preprocess.py

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -74,29 +74,39 @@ class FmriRealign4dInputSpec(BaseInterfaceInputSpec):
7474
desc="File to realign")
7575
tr = traits.Float(desc="TR in seconds",
7676
mandatory=True)
77-
slice_order = traits.Either(traits.List(traits.Int),
78-
traits.Enum("ascending", "descending"),
79-
mandatory=True, desc='slice order')
80-
interleaved = traits.Bool(desc="True if interleaved",
81-
mandatory=True)
77+
slice_order = traits.List(traits.Int(),
78+
desc='0 based slice order',
79+
requires=["time_interp"])
8280
tr_slices = traits.Float(desc="TR slices")
8381
start = traits.Float(0.0, usedefault=True,
8482
desc="time offset into TR to align slices to")
85-
time_interp = traits.Bool(True, usedefault=True,
86-
desc="Assume smooth changes across time e.g., fmri series")
87-
loops = traits.Int(5, usedefault=True, desc="loops within each run")
88-
between_loops = traits.Int(5, usedefault=True, desc="loops used to \
83+
time_interp = traits.Enum(True, requires=["slice_order"],
84+
desc="Assume smooth changes across time e.g.,\
85+
fmri series. If you don't want slice timing \
86+
correction set this to undefined")
87+
loops = traits.Either(traits.Int(5,usedefault=True),
88+
traits.List(traits.Int),
89+
usedefault=True,
90+
desc="loops within each run")
91+
between_loops = traits.Either(traits.Int(5),
92+
traits.List(traits.Int),
93+
usedefault=True, desc="loops used to \
8994
realign different \
9095
runs")
91-
speedup = traits.Int(5, usedefault=True, desc="successive image \
92-
sub-sampling factors \
93-
for acceleration")
96+
speedup = traits.Either(traits.Int(5),
97+
traits.List(traits.Int(5)),
98+
usedefault=True,
99+
desc="successive image \
100+
sub-sampling factors \
101+
for acceleration")
94102

95103

96104
class FmriRealign4dOutputSpec(TraitedSpec):
97105

98-
out_file = OutputMultiPath(File(exists=True), desc="Realigned files")
99-
par_file = OutputMultiPath(File(exists=True), desc="Motion parameter files")
106+
out_file = OutputMultiPath(File(exists=True),
107+
desc="Realigned files")
108+
par_file = OutputMultiPath(File(exists=True),
109+
desc="Motion parameter files")
100110

101111

102112
class FmriRealign4d(BaseInterface):
@@ -110,8 +120,7 @@ class FmriRealign4d(BaseInterface):
110120
>>> realigner = FmriRealign4d()
111121
>>> realigner.inputs.in_file = ['functional.nii']
112122
>>> realigner.inputs.tr = 2
113-
>>> realigner.inputs.slice_order = 'ascending'
114-
>>> realigner.inputs.interleaved = True
123+
>>> realigner.inputs.slice_order = range(0,67)
115124
>>> res = realigner.run() # doctest: +SKIP
116125
117126
References
@@ -144,7 +153,6 @@ def _run_interface(self, runtime):
144153

145154
R = FR4d(all_ims, tr=self.inputs.tr,
146155
slice_order=self.inputs.slice_order,
147-
interleaved=self.inputs.interleaved,
148156
tr_slices=TR_slices,
149157
time_interp=self.inputs.time_interp,
150158
start=self.inputs.start)

0 commit comments

Comments
 (0)