From 51123396f398f08598f0cc5d14147db71efa047b Mon Sep 17 00:00:00 2001 From: Paul McCarthy <pauldmccarthy@gmail.com> Date: Sat, 3 Mar 2018 17:34:14 +0000 Subject: [PATCH] Fixed up fslmaths module --- fsl/wrappers/fslmaths.py | 110 ++++++++++++++++++++------------------- 1 file changed, 56 insertions(+), 54 deletions(-) diff --git a/fsl/wrappers/fslmaths.py b/fsl/wrappers/fslmaths.py index a15a26e52..3ad54b784 100644 --- a/fsl/wrappers/fslmaths.py +++ b/fsl/wrappers/fslmaths.py @@ -9,7 +9,8 @@ for the ``fslmaths`` command-line tool. """ -import fsl.utils.run as run +import fsl.utils.run as run +from . import wrapperutils as wutils class fslmaths(object): @@ -17,142 +18,143 @@ class fslmaths(object): def __init__(self, input): """Constructor.""" - self.inputImage = input - self.outputImage = None - self.operations = [] + self.__input = input + self.__args = [] def abs(self): """Absolute value.""" - self.operations.append("-abs") + self.__args.append("-abs") return self def bin(self): """Use (current image>0) to binarise.""" - self.operations.append("-bin") + self.__args.append("-bin") return self def binv(self): """Binarise and invert (binarisation and logical inversion).""" - self.operations.append("-binv") + self.__args.append("-binv") return self def recip(self): """Reciprocal (1/current image).""" - self.operations.append("-recip") + self.__args.append("-recip") return self def Tmean(self): """Mean across time.""" - self.operations.append("-Tmean") + self.__args.append("-Tmean") return self def Tstd(self): """Standard deviation across time.""" - self.operations.append("-Tstd") + self.__args.append("-Tstd") return self def Tmin(self): """Min across time.""" - self.operations.append("-Tmin") + self.__args.append("-Tmin") return self def Tmax(self): """Max across time.""" - self.operations.append("-Tmax") + self.__args.append("-Tmax") return self def fillh(self): """fill holes in a binary mask (holes are internal - i.e. do not touch the edge of the FOV).""" - self.operations.append("-fillh") + self.__args.append("-fillh") return self def ero(self, repeat=1): """Erode by zeroing non-zero voxels when zero voxels in kernel.""" for i in range(repeat): - self.operations.append("-ero") + self.__args.append("-ero") return self def dilM(self, repeat=1): """Mean Dilation of non-zero voxels.""" for i in range(repeat): - self.operations.append("-dilM") + self.__args.append("-dilM") return self def dilF(self, repeat=1): """Maximum filtering of all voxels.""" for i in range(repeat): - self.operations.append("-dilF") + self.__args.append("-dilF") return self - def add(self, input): + def add(self, image): """Add input to current image.""" - self.operations.append("-add {0}".format(input)) + self.__args.extend(("-add", image)) return self - def sub(self, input): - """Subtract input from current image.""" - self.operations.append("-sub {0}".format(input)) + def sub(self, image): + """Subtract image from current image.""" + self.__args.extend(("-sub", image)) return self - def mul(self, input): - """Multiply current image by input.""" - self.operations.append("-mul {0}".format(input)) + def mul(self, image): + """Multiply current image by image.""" + self.__args.extend(("-mul", image)) return self - def div(self, input): - """Divide current image by input.""" - self.operations.append("-div {0}".format(input)) + def div(self, image): + """Divide current image by image.""" + self.__args.extend(("-div", image)) return self def mas(self, image): """Use image (>0) to mask current image.""" - self.operations.append("-mas {0}".format(image)) + self.__args.extend(("-mas", image)) return self - def rem(self, input): - """Divide current image by following input and take remainder.""" - self.operations.append("-rem {0}".format(input)) + def rem(self, image): + """Divide current image by following image and take remainder.""" + self.__args.extend(("-rem", image)) return self - def thr(self, input): - """use input number to threshold current image (zero < input).""" - self.operations.append("-thr {0}".format(input)) + def thr(self, image): + """use image number to threshold current image (zero < image).""" + self.__args.extend(("-thr", image)) return self - def uthr(self, input): - """use input number to upper-threshold current image (zero + def uthr(self, image): + """use image number to upper-threshold current image (zero anything above the number).""" - self.operations.append("-uthr {0}".format(input)) + self.__args.extend(("-uthr", image)) return self - def inm(self, input): + def inm(self, image): """Intensity normalisation (per 3D volume mean)""" - self.operations.append("-inm {0}".format(input)) + self.__args.extend(("-inm", image)) return self def bptf(self, hp_sigma, lp_sigma): """Bandpass temporal filtering; nonlinear highpass and Gaussian linear lowpass (with sigmas in volumes, not seconds); set either sigma<0 to skip that filter.""" - self.operations.append("-bptf {0} {1}".format(hp_sigma, lp_sigma)) + self.__args.extend(("-bptf", hp_sigma, lp_sigma)) return self - def toString(self): - """Generate fslmaths command string.""" - cmd = "fslmaths {0} ".format(self.inputImage) - for oper in self.operations: - cmd = cmd + oper + " " - cmd = cmd + self.outputImage - return cmd - def run(self, output=None): """Save output of operations to image.""" - if output: - self.outputImage = output - else: - self.outputImage = self.inputImage - run.runfsl(self.toString()) + cmd = ['fslmaths', self.__input] + self.__args + + if output is None: cmd += [wutils.LOAD] + else: 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 output - return self.outputImage + @wutils.fileOrImage() + def __run(self, *cmd): + """Run the given ``fslmaths`` command. """ + return run.runfsl([str(c) for c in cmd]) -- GitLab