Skip to content

Commit d496b3f

Browse files
committed
Merge remote-tracking branch 'nipy/master'
2 parents d9779eb + 368e184 commit d496b3f

File tree

6 files changed

+36
-7
lines changed

6 files changed

+36
-7
lines changed

nipype/algorithms/confounds.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ def _list_outputs(self):
208208

209209
class FramewiseDisplacementInputSpec(BaseInterfaceInputSpec):
210210
in_file = File(exists=True, mandatory=True, desc='motion parameters')
211-
parameter_source = traits.Enum("FSL", "AFNI", "SPM", "FSFAST",
211+
parameter_source = traits.Enum("FSL", "AFNI", "SPM", "FSFAST", "NIPY",
212212
desc="Source of movement parameters",
213213
mandatory=True)
214214
radius = traits.Float(50, usedefault=True,

nipype/algorithms/modelgen.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
traits, File, Bunch, BaseInterfaceInputSpec,
3434
isdefined)
3535
from ..utils.filemanip import filename_to_list
36+
from ..utils.misc import normalize_mc_params
3637
from .. import config, logging
3738
iflogger = logging.getLogger('interface')
3839

@@ -195,6 +196,9 @@ class SpecifyModelInputSpec(BaseInterfaceInputSpec):
195196
desc='Realignment parameters returned '
196197
'by motion correction algorithm',
197198
copyfile=False)
199+
parameter_source = traits.Enum("SPM", "FSL", "AFNI", "FSFAST", "NIPY",
200+
usedefault=True,
201+
desc="Source of motion parameters")
198202
outlier_files = InputMultiPath(File(exists=True),
199203
desc='Files containing scan outlier indices '
200204
'that should be tossed',
@@ -392,8 +396,10 @@ def _generate_design(self, infolist=None):
392396
realignment_parameters = []
393397
if isdefined(self.inputs.realignment_parameters):
394398
for parfile in self.inputs.realignment_parameters:
395-
realignment_parameters.append(np.loadtxt(parfile))
396-
399+
realignment_parameters.append(
400+
np.apply_along_axis(func1d=normalize_mc_params,
401+
axis=1, arr=np.loadtxt(parfile),
402+
source=self.inputs.parameter_source))
397403
outliers = []
398404
if isdefined(self.inputs.outlier_files):
399405
for filename in self.inputs.outlier_files:
@@ -556,7 +562,9 @@ def _generate_design(self, infolist=None):
556562
if isdefined(self.inputs.realignment_parameters):
557563
realignment_parameters = []
558564
for parfile in self.inputs.realignment_parameters:
559-
mc = np.loadtxt(parfile)
565+
mc = np.apply_along_axis(func1d=normalize_mc_params,
566+
axis=1, arr=np.loadtxt(parfile),
567+
source=self.inputs.parameter_source)
560568
if not realignment_parameters:
561569
realignment_parameters.insert(0, mc)
562570
else:

nipype/algorithms/tests/test_auto_SpecifyModel.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ def test_SpecifyModel_inputs():
1919
),
2020
outlier_files=dict(copyfile=False,
2121
),
22+
parameter_source=dict(usedefault=True,
23+
),
2224
realignment_parameters=dict(copyfile=False,
2325
),
2426
subject_info=dict(mandatory=True,

nipype/algorithms/tests/test_auto_SpecifySPMModel.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ def test_SpecifySPMModel_inputs():
2323
),
2424
output_units=dict(usedefault=True,
2525
),
26+
parameter_source=dict(usedefault=True,
27+
),
2628
realignment_parameters=dict(copyfile=False,
2729
),
2830
subject_info=dict(mandatory=True,

nipype/algorithms/tests/test_auto_SpecifySparseModel.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ def test_SpecifySparseModel_inputs():
2020
model_hrf=dict(),
2121
outlier_files=dict(copyfile=False,
2222
),
23+
parameter_source=dict(usedefault=True,
24+
),
2325
realignment_parameters=dict(copyfile=False,
2426
),
2527
save_plot=dict(),

nipype/utils/misc.py

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -248,10 +248,25 @@ def unflatten(in_list, prev_structure):
248248
def normalize_mc_params(params, source):
249249
"""
250250
Normalize a single row of motion parameters to the SPM format.
251+
252+
SPM saves motion parameters as:
253+
x Right-Left (mm)
254+
y Anterior-Posterior (mm)
255+
z Superior-Inferior (mm)
256+
rx Pitch (rad)
257+
ry Yaw (rad)
258+
rz Roll (rad)
251259
"""
252-
if source == 'FSL':
260+
if source.upper() == 'FSL':
253261
params = params[[3, 4, 5, 0, 1, 2]]
254-
elif source in ('AFNI', 'FSFAST'):
262+
elif source.upper() in ('AFNI', 'FSFAST'):
255263
params = params[np.asarray([4, 5, 3, 1, 2, 0]) + (len(params) > 6)]
256264
params[3:] = params[3:] * np.pi / 180.
257-
return params
265+
elif source.upper() == 'NIPY':
266+
from nipy.algorithms.registration import to_matrix44, aff2euler
267+
matrix = to_matrix44(params)
268+
params = np.zeros(6)
269+
params[:3] = matrix[:3, 3]
270+
params[-1:2:-1] = aff2euler(matrix)
271+
272+
return params

0 commit comments

Comments
 (0)