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/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 986ad8cbfa..d9b09904d9 100644 --- a/nipype/interfaces/fsl/utils.py +++ b/nipype/interfaces/fsl/utils.py @@ -1980,3 +1980,45 @@ 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" + >>> mo.cmdline # doctest: +ELLIPSIS + 'fsl_motion_outliers -i epi.nii -o epi_outliers.txt -p epi_metrics.png -s epi_metrics.txt' + >>> res = mo.run() # doctest: +SKIP + """ + + input_spec = MotionOutliersInputSpec + output_spec = MotionOutliersOutputSpec + _cmd = 'fsl_motion_outliers'