From 4d2a5961cce813066db393d461acd15d10fc6f0e Mon Sep 17 00:00:00 2001 From: Chris Filo Gorgolewski Date: Fri, 11 Sep 2015 17:41:21 -0700 Subject: [PATCH 1/3] added outlier detection interface --- nipype/interfaces/fsl/__init__.py | 2 +- nipype/interfaces/fsl/utils.py | 41 +++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/nipype/interfaces/fsl/__init__.py b/nipype/interfaces/fsl/__init__.py index 3e83516795..4f6b5c38fc 100644 --- a/nipype/interfaces/fsl/__init__.py +++ b/nipype/interfaces/fsl/__init__.py @@ -17,7 +17,7 @@ PlotTimeSeries, PlotMotionParams, ConvertXFM, SwapDimensions, PowerSpectrum, Reorient2Std, Complex, InvWarp, WarpUtils, ConvertWarp, WarpPoints, - WarpPointsToStd, RobustFOV, CopyGeom) + WarpPointsToStd, RobustFOV, CopyGeom, MotionOutliers) from .epi import (PrepareFieldmap, TOPUP, ApplyTOPUP, Eddy, EPIDeWarp, SigLoss, EddyCorrect, EpiReg) diff --git a/nipype/interfaces/fsl/utils.py b/nipype/interfaces/fsl/utils.py index 986ad8cbfa..6f122bc1ee 100644 --- a/nipype/interfaces/fsl/utils.py +++ b/nipype/interfaces/fsl/utils.py @@ -1980,3 +1980,44 @@ class WarpPointsToStd(WarpPoints): input_spec = WarpPointsToStdInputSpec output_spec = WarpPointsOutputSpec _cmd = 'img2stdcoord' + + +class MotionOutliersInputSpec(FSLCommandInputSpec): + in_file = File(exists=True, mandatory=True, desc="unfiltered 4D image", argstr="-i %s") + out_file = File(argstr="-o %s", name_source='in_file', name_template='%s_outliers.txt', + keep_extension=True, desc='output outlier file name', hash_files=False) + mask = File(exists=True, argstr="-m %s", desc="mask image for calculating metric") + metric = traits.Enum('refrms', ['refrms', 'dvars', 'refmse', 'fd', 'fdrms'], argstr="--%s", desc="metrics: refrms - RMS intensity difference to reference volume as metric [default metric],\ +refmse - Mean Square Error version of refrms (used in original version of fsl_motion_outliers) \ +dvars - DVARS \ +fd - frame displacement \ +fdrms - FD with RMS matrix calculation") + threshold = traits.Float(argstr="--thresh=%g", desc="specify absolute threshold value (otherwise use box-plot cutoff = P75 + 1.5*IQR)") + no_motion_correction = traits.Bool(argstr="--nomoco", desc="do not run motion correction (assumed already done)") + dummy = traits.Int(argstr="--dummy=%d", desc='number of dummy scans to delete (before running anything and creating EVs)') + out_metric_values = File(argstr="-s %s", name_source='in_file', name_template='%s_metrics.txt', + keep_extension=True, desc='output metric values (DVARS etc.) file name', hash_files=False) + out_metric_plot = File(argstr="-p %s", name_source='in_file', name_template='%s_metrics.png', + keep_extension=True, desc='output metric values plot (DVARS etc.) file name', hash_files=False) + +class MotionOutliersOutputSpec(TraitedSpec): + out_file = File(exists=True) + out_metric_values = File(exists=True) + out_metric_plot = File(exists=True) + +class MotionOutliers(FSLCommand): + """ + Use FSL fsl_motion_outliers`http://fsl.fmrib.ox.ac.uk/fsl/fslwiki/FSLMotionOutliers`_ to find outliers in timeseries (4d) data. + Examples + -------- + >>> from nipype.interfaces.fsl import MotionOutliers + >>> mo = MotionOutliers() + >>> mo.inputs.in_file = "epi.nii.gz" + >>> mo.cmdline # doctest: +ELLIPSIS + 'img2imgcoord -mm -dest T1.nii -src epi.nii -warp warpfield.nii surf.txt' + >>> res = mo.run() # doctest: +SKIP + """ + + input_spec = MotionOutliersInputSpec + output_spec = MotionOutliersOutputSpec + _cmd = 'fsl_motion_outliers' From 39c3d004095e759298ea68abab046d1eb5b9d724 Mon Sep 17 00:00:00 2001 From: Chris Filo Gorgolewski Date: Fri, 11 Sep 2015 17:44:11 -0700 Subject: [PATCH 2/3] added tests --- .../fsl/tests/test_auto_MotionOutliers.py | 65 +++++++++++++++++++ nipype/interfaces/fsl/utils.py | 1 + 2 files changed, 66 insertions(+) create mode 100644 nipype/interfaces/fsl/tests/test_auto_MotionOutliers.py diff --git a/nipype/interfaces/fsl/tests/test_auto_MotionOutliers.py b/nipype/interfaces/fsl/tests/test_auto_MotionOutliers.py new file mode 100644 index 0000000000..bc2f31a2d0 --- /dev/null +++ b/nipype/interfaces/fsl/tests/test_auto_MotionOutliers.py @@ -0,0 +1,65 @@ +# AUTO-GENERATED by tools/checkspecs.py - DO NOT EDIT +from nipype.testing import assert_equal +from nipype.interfaces.fsl.utils import MotionOutliers + +def test_MotionOutliers_inputs(): + input_map = dict(args=dict(argstr='%s', + ), + dummy=dict(argstr='--dummy=%d', + ), + environ=dict(nohash=True, + usedefault=True, + ), + ignore_exception=dict(nohash=True, + usedefault=True, + ), + in_file=dict(argstr='-i %s', + mandatory=True, + ), + mask=dict(argstr='-m %s', + ), + metric=dict(argstr='--%s', + ), + no_motion_correction=dict(argstr='--nomoco', + ), + out_file=dict(argstr='-o %s', + hash_files=False, + keep_extension=True, + name_source='in_file', + name_template='%s_outliers.txt', + ), + out_metric_plot=dict(argstr='-p %s', + hash_files=False, + keep_extension=True, + name_source='in_file', + name_template='%s_metrics.png', + ), + out_metric_values=dict(argstr='-s %s', + hash_files=False, + keep_extension=True, + name_source='in_file', + name_template='%s_metrics.txt', + ), + output_type=dict(), + terminal_output=dict(nohash=True, + ), + threshold=dict(argstr='--thresh=%g', + ), + ) + inputs = MotionOutliers.input_spec() + + for key, metadata in input_map.items(): + for metakey, value in metadata.items(): + yield assert_equal, getattr(inputs.traits()[key], metakey), value + +def test_MotionOutliers_outputs(): + output_map = dict(out_file=dict(), + out_metric_plot=dict(), + out_metric_values=dict(), + ) + outputs = MotionOutliers.output_spec() + + for key, metadata in output_map.items(): + for metakey, value in metadata.items(): + yield assert_equal, getattr(outputs.traits()[key], metakey), value + diff --git a/nipype/interfaces/fsl/utils.py b/nipype/interfaces/fsl/utils.py index 6f122bc1ee..347d136b60 100644 --- a/nipype/interfaces/fsl/utils.py +++ b/nipype/interfaces/fsl/utils.py @@ -2005,6 +2005,7 @@ class MotionOutliersOutputSpec(TraitedSpec): out_metric_values = File(exists=True) out_metric_plot = File(exists=True) + class MotionOutliers(FSLCommand): """ Use FSL fsl_motion_outliers`http://fsl.fmrib.ox.ac.uk/fsl/fslwiki/FSLMotionOutliers`_ to find outliers in timeseries (4d) data. From d65318ad512ef28d08078c499369e11bc7988506 Mon Sep 17 00:00:00 2001 From: Chris Filo Gorgolewski Date: Fri, 11 Sep 2015 23:24:52 -0700 Subject: [PATCH 3/3] fixed test --- nipype/interfaces/fsl/utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nipype/interfaces/fsl/utils.py b/nipype/interfaces/fsl/utils.py index 347d136b60..d9b09904d9 100644 --- a/nipype/interfaces/fsl/utils.py +++ b/nipype/interfaces/fsl/utils.py @@ -2013,9 +2013,9 @@ class MotionOutliers(FSLCommand): -------- >>> from nipype.interfaces.fsl import MotionOutliers >>> mo = MotionOutliers() - >>> mo.inputs.in_file = "epi.nii.gz" + >>> mo.inputs.in_file = "epi.nii" >>> mo.cmdline # doctest: +ELLIPSIS - 'img2imgcoord -mm -dest T1.nii -src epi.nii -warp warpfield.nii surf.txt' + 'fsl_motion_outliers -i epi.nii -o epi_outliers.txt -p epi_metrics.png -s epi_metrics.txt' >>> res = mo.run() # doctest: +SKIP """