From 7d5e6305aaf2fb2908f59ccfd273561e709c93c8 Mon Sep 17 00:00:00 2001 From: Paul McCarthy <pauldmccarthy@gmail.com> Date: Mon, 2 Dec 2019 20:49:35 +0000 Subject: [PATCH] RF: Handle case where fslmaths wrapper is passed output=LOAD. Fix/clarify usage docs. --- fsl/wrappers/__init__.py | 4 ++-- fsl/wrappers/fslmaths.py | 37 +++++++++++++++++++++++++++++++------ 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/fsl/wrappers/__init__.py b/fsl/wrappers/__init__.py index b37413ed3..453313f2c 100644 --- a/fsl/wrappers/__init__.py +++ b/fsl/wrappers/__init__.py @@ -63,11 +63,11 @@ if we want to FLIRT two images and get the result, we can do this:: Similarly, we can run a ``fslmaths`` command on in-memory images:: import nibabel as nib - from fsl.wrappers import fslmaths, LOAD + from fsl.wrappers import fslmaths image = nib.load('image.nii') mask = nib.load('mask.nii') - output = fslmaths(image).mas(mask).bin().run(LOAD) + output = fslmaths(image).mas(mask).bin().run() If you are *writing* wrapper functions, take a look at the diff --git a/fsl/wrappers/fslmaths.py b/fsl/wrappers/fslmaths.py index 5fa790ab4..bc1318c52 100644 --- a/fsl/wrappers/fslmaths.py +++ b/fsl/wrappers/fslmaths.py @@ -13,7 +13,28 @@ from . import wrapperutils as wutils class fslmaths(object): - """Perform mathematical manipulation of images.""" + """Perform mathematical manipulation of images. + + ``fslmaths`` is unlike the other FSL wrapper tools in that it provdes + an object-oriented interface which is hopefully easier to use than + constructing a ``fslmaths`` command-line call. For example, the + following call to the ``fslmaths`` wrapper function:: + + fslmaths('input.nii').thr(0.25).mul(-1).run('output.nii') + + will be translated into the following command-line call:: + + fslmaths input.nii -thr 0.25 -mul -1 output.nii + + The ``fslmaths`` wrapper function can also be used with in-memory + images. If no output file name is passed to the :meth:`run` method, the + result is loaded into memory and returned as a ``nibabel`` image. For + example:: + + import nibabel as nib + input = nib.load('input.nii') + output = fslmaths(input).thr(0.25).mul(-1).run() + """ def __init__(self, input): """Constructor.""" @@ -138,20 +159,24 @@ class fslmaths(object): return self def run(self, output=None): - """Save output of operations to image.""" + """Save output of operations to image. Set ``output`` to a filename to have + the result saved to file, or omit ``output`` entirely to have the + result returned as a ``nibabel`` image. + """ cmd = ['fslmaths', self.__input] + self.__args - if output is None: cmd += [wutils.LOAD] - else: cmd += [output] + if output is None: + output = wutils.LOAD + cmd += [output] result = self.__run(*cmd) # if output is LOADed, there # will only be one entry in # the result dict. - if output is None: return list(result.values())[0] - else: return result + if output == wutils.LOAD: return list(result.values())[0] + else: return result @wutils.fileOrImage() @wutils.fslwrapper -- GitLab