diff --git a/fsl/utils/run.py b/fsl/utils/run.py index e4a4c51961c74c23554fca53cb3fd0394000467b..f469af4873effcb400a9ef2f3a181c98100f96f7 100644 --- a/fsl/utils/run.py +++ b/fsl/utils/run.py @@ -162,8 +162,8 @@ def run(*args, **kwargs): - stderr: Optional file-like object to which the command's standard error stream can be forwarded. - - cmd: If ``True``, the command itself is logged to the - standard output stream(s). + - cmd: Optional file-like object to which the command itself + is logged. :returns: If ``submit`` is provided, the return value of :func:`.fslsub` is returned. Otherwise returns a single @@ -179,7 +179,7 @@ def run(*args, **kwargs): tee = log .get('tee', False) logStdout = log .get('stdout', None) logStderr = log .get('stderr', None) - logCmd = log .get('cmd', False) + logCmd = log .get('cmd', None) args = _prepareArgs(args) if not bool(submit): @@ -257,8 +257,8 @@ def _realrun(tee, logStdout, logStderr, logCmd, *args): :arg logStderr: Optional file-like object to which the command's standard error stream can be forwarded. - :arg logCmd: If ``True``, the command itself is logged to the standard - output stream(s). + :arg logCmd: Optional file-like object to which the command itself is + logged. :arg args: Command to run @@ -293,15 +293,13 @@ def _realrun(tee, logStdout, logStderr, logCmd, *args): if logStdout is not None: outstreams.append(logStdout) if logStderr is not None: errstreams.append(logStderr) - # log the command to - # stdout if requested - if logCmd: + # log the command if requested + if logCmd is not None: cmd = ' '.join(args) + '\n' - for o in outstreams: - if 'b' in getattr(o, 'mode', 'w'): - o.write(cmd.encode('utf-8')) - else: - o.write(cmd) + if 'b' in getattr(logCmd, 'mode', 'w'): + logCmd.write(cmd.encode('utf-8')) + else: + logCmd.write(cmd) stdoutt = _forwardStream(proc.stdout, *outstreams) stderrt = _forwardStream(proc.stderr, *errstreams) @@ -325,23 +323,35 @@ def _realrun(tee, logStdout, logStderr, logCmd, *args): def runfsl(*args, **kwargs): - """Call a FSL command and return its output. This function simply prepends - ``$FSLDIR/bin/`` to the command before passing it to :func:`run`. + """Call a FSL command and return its output. + + This function searches for the command in the following + locations (ordered by priority): + + 1. ``FSL_PREFIX`` + 2. ``$FSLDEVDIR/bin`` + 3. ``$FSLDIR/bin`` + + If found, the full path to the command is then passed to :func:`run`. """ - - prefix = None + prefixes = [] if FSL_PREFIX is not None: - prefix = FSL_PREFIX - elif fslplatform.fsldevdir is not None: - prefix = op.join(fslplatform.fsldevdir, 'bin') - elif fslplatform.fsldir is not None: - prefix = op.join(fslplatform.fsldir, 'bin') - else: + prefixes.append(FSL_PREFIX) + if fslplatform.fsldevdir is not None: + prefixes.append(op.join(fslplatform.fsldevdir, 'bin')) + if fslplatform.fsldir is not None: + prefixes.append(op.join(fslplatform.fsldir, 'bin')) + + if not prefixes: raise FSLNotPresent('$FSLDIR is not set - FSL cannot be found!') - args = _prepareArgs(args) - args[0] = op.join(prefix, args[0]) + args = _prepareArgs(args) + for prefix in prefixes: + cmdpath = op.join(prefix, args[0]) + if op.isfile(cmdpath): + args[0] = cmdpath + break return run(*args, **kwargs) diff --git a/fsl/wrappers/__init__.py b/fsl/wrappers/__init__.py index 3a0297a3ef7af4574087ff3e4f3ace977d1b8d3f..b37413ed3678a5fbd84f9056bdae2d52f76a64dd 100644 --- a/fsl/wrappers/__init__.py +++ b/fsl/wrappers/__init__.py @@ -80,8 +80,10 @@ from .wrapperutils import (LOAD,) # noqa from .bet import (bet, # noqa robustfov) from .eddy import (eddy_cuda, # noqa - topup) + topup, + applytopup) from .fast import (fast,) # noqa +from .fsl_anat import (fsl_anat,) # noqa from .flirt import (flirt, # noqa invxfm, applyxfm, diff --git a/fsl/wrappers/bet.py b/fsl/wrappers/bet.py index 09282f117b26374ab99a40420976fa0c1771dc8d..31660d122addd1f30fb0de857a97219d64f350f0 100644 --- a/fsl/wrappers/bet.py +++ b/fsl/wrappers/bet.py @@ -35,6 +35,7 @@ def bet(input, output, **kwargs): 'robust' : 'R', 'fracintensity' : 'f', 'seg' : 'n', + 'centre' : 'c', } valmap = { @@ -55,6 +56,14 @@ def bet(input, output, **kwargs): } cmd = ['bet', input, output] + + # The 'centre' argument requires three co-ordinates and can't be passed + # as a single value, so needs to be handled separately. Assume it is + # passed as a Python sequence + centre = kwargs.pop("c", None) + if centre is not None: + cmd += ['-c', ] + [str(v) for v in centre] + cmd += wutils.applyArgStyle('-', argmap=argmap, valmap=valmap, **kwargs) return cmd diff --git a/fsl/wrappers/eddy.py b/fsl/wrappers/eddy.py index ae5c7bb4f0075c65fa363970237b26baf7797bd1..3419c99d133045a4b34762e85de4d1e5f24528d1 100644 --- a/fsl/wrappers/eddy.py +++ b/fsl/wrappers/eddy.py @@ -61,8 +61,8 @@ def eddy_cuda(imain, mask, index, acqp, bvecs, bvals, out, **kwargs): return cmd -@wutils.fileOrImage('imain', 'fout', 'iout') -@wutils.fileOrArray('datain') +@wutils.fileOrImage('imain', 'fout', 'iout', outprefix='out') +@wutils.fileOrArray('datain', outprefix='out') @wutils.fslwrapper def topup(imain, datain, **kwargs): """Wrapper for the ``topup`` command.""" @@ -78,3 +78,25 @@ def topup(imain, datain, **kwargs): cmd += wutils.applyArgStyle('--=', valmap=valmap, **kwargs) return cmd + +@wutils.fileOrImage('imain', 'out') +@wutils.fileOrArray('datain') +@wutils.fslwrapper +def applytopup(imain, datain, index, **kwargs): + """Wrapper for the ``applytopup`` command.""" + + valmap = { + 'verbose' : wutils.SHOW_IF_TRUE + } + + asrt.assertFileExists(datain) + asrt.assertIsNifti(imain) + + cmd = [ + 'applytopup', '--imain={}'.format(imain), + '--inindex={}'.format(index), + '--datain={}'.format(datain), + ] + cmd += wutils.applyArgStyle('--=', valmap=valmap, **kwargs) + + return cmd diff --git a/fsl/wrappers/fast.py b/fsl/wrappers/fast.py index a944ea77ad31f2c8487c2e8e4aec2e3b8aea1b77..b1cd712ac99e9e45d2e97f74f5dae5b38c6e80c0 100644 --- a/fsl/wrappers/fast.py +++ b/fsl/wrappers/fast.py @@ -33,12 +33,19 @@ def fast(imgs, out='fast', **kwargs): asrt.assertIsNifti(*imgs) + valmap = { + 'nobias' : wutils.SHOW_IF_TRUE, + 'verbose' : wutils.SHOW_IF_TRUE, + 'Prior' : wutils.SHOW_IF_TRUE, + 'segments' : wutils.SHOW_IF_TRUE, + } + argmap = { 'n_classes' : 'class', } cmd = ['fast', '-v', '--out=%s' % out] - cmd += wutils.applyArgStyle('--=', argmap=argmap, **kwargs) + cmd += wutils.applyArgStyle('--=', valmap=valmap, argmap=argmap, singlechar_args=True, **kwargs) cmd += imgs return cmd diff --git a/fsl/wrappers/flirt.py b/fsl/wrappers/flirt.py index cac769bf26f428d4bed62d830ec661cf43b8dd74..8b5d1d526dc6a893441204d788d58b7302d59260 100644 --- a/fsl/wrappers/flirt.py +++ b/fsl/wrappers/flirt.py @@ -59,14 +59,15 @@ def flirt(src, ref, **kwargs): return cmd -def applyxfm(src, ref, mat, out, interp='spline'): +def applyxfm(src, ref, mat, out, interp='spline', **kwargs): """Convenience function which runs ``flirt -applyxfm ...``.""" return flirt(src, ref, out=out, applyxfm=True, init=mat, - interp=interp) + interp=interp, + **kwargs) @wutils.fileOrArray() diff --git a/fsl/wrappers/fnirt.py b/fsl/wrappers/fnirt.py index bd457337357694e3bb869ef8a0c516cebd1c7cb1..f4ca120fceebed4cdd97310087a1f816e544a979 100644 --- a/fsl/wrappers/fnirt.py +++ b/fsl/wrappers/fnirt.py @@ -27,12 +27,12 @@ from . import wrapperutils as wutils 'refout', 'refmask', 'inmask') @wutils.fileOrArray('aff') @wutils.fslwrapper -def fnirt(src, ref, **kwargs): +def fnirt(src, **kwargs): """Wrapper for the ``fnirt`` command.""" - asrt.assertIsNifti(src, ref) + asrt.assertIsNifti(src) - cmd = ['fnirt', '--in={}'.format(src), '--ref={}'.format(ref)] + cmd = ['fnirt', '--in={}'.format(src)] cmd += wutils.applyArgStyle('--=', **kwargs) return cmd @@ -41,7 +41,7 @@ def fnirt(src, ref, **kwargs): @wutils.fileOrImage('src', 'ref', 'out', 'warp', 'mask') @wutils.fileOrArray('premat', 'postmat') @wutils.fslwrapper -def applywarp(src, ref, out, warp, **kwargs): +def applywarp(src, ref, out, **kwargs): """Wrapper for the ``applywarp`` command. """ valmap = { @@ -55,8 +55,7 @@ def applywarp(src, ref, out, warp, **kwargs): cmd = ['applywarp', '--in={}'.format(src), '--ref={}'.format(ref), - '--out={}'.format(out), - '--warp={}'.format(warp)] + '--out={}'.format(out)] cmd += wutils.applyArgStyle('--=', valmap=valmap, **kwargs) @@ -76,7 +75,7 @@ def invwarp(warp, ref, out, **kwargs): 'verbose' : wutils.SHOW_IF_TRUE, } - asrt.assertIsNifti(warp, ref, out) + asrt.assertIsNifti(warp, ref) cmd = ['invwarp', '--warp={}'.format(warp), @@ -88,7 +87,7 @@ def invwarp(warp, ref, out, **kwargs): return cmd -@wutils.fileOrImage('out', 'ref', 'warp1', 'warp2', 'shiftmap') +@wutils.fileOrImage('out', 'ref', 'warp1', 'warp2', 'shiftmap', 'jacobian') @wutils.fileOrArray('premat', 'midmat', 'postmat') @wutils.fslwrapper def convertwarp(out, ref, **kwargs): @@ -99,7 +98,6 @@ def convertwarp(out, ref, **kwargs): 'rel' : wutils.SHOW_IF_TRUE, 'absout' : wutils.SHOW_IF_TRUE, 'relout' : wutils.SHOW_IF_TRUE, - 'jacobian' : wutils.SHOW_IF_TRUE, 'jstats' : wutils.SHOW_IF_TRUE, 'constrainj' : wutils.SHOW_IF_TRUE, 'verbose' : wutils.SHOW_IF_TRUE, @@ -107,5 +105,4 @@ def convertwarp(out, ref, **kwargs): cmd = ['convertwarp', '--ref={}'.format(ref), '--out={}'.format(out)] cmd += wutils.applyArgStyle('--=', valmap=valmap, **kwargs) - return cmd diff --git a/fsl/wrappers/fsl_anat.py b/fsl/wrappers/fsl_anat.py new file mode 100644 index 0000000000000000000000000000000000000000..a1ea260c137049a0dd26b1a84dbbd3184dc1e78c --- /dev/null +++ b/fsl/wrappers/fsl_anat.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python +# +# fsl_anat.py - Wrapper for the FSL_ANAT command. +# +# Author: Martin Craig <martin.craig@eng.ox.ac.uk> +# +"""This module provides the :func:`fsl_anat` function, a wrapper for the FSL +`FSL_ANAT <https://fsl.fmrib.ox.ac.uk/fsl/fslwiki/fsl_anat>`_ command. +""" + +import six + +import fsl.utils.assertions as asrt +from . import wrapperutils as wutils + +@wutils.fileOrImage('img', outprefix='out') +@wutils.fslwrapper +def fsl_anat(img, out='fsl_anat', **kwargs): + """Wrapper for the ``fsl_anat`` command. + + :arg img: Input structural image + :arg out: Output directory name + """ + asrt.assertIsNifti(img) + + valmap = { + 'strongbias' : wutils.SHOW_IF_TRUE, + 'weakbias' : wutils.SHOW_IF_TRUE, + 'noreorient' : wutils.SHOW_IF_TRUE, + 'nocrop' : wutils.SHOW_IF_TRUE, + 'nobias' : wutils.SHOW_IF_TRUE, + 'noreg' : wutils.SHOW_IF_TRUE, + 'nononlinreg' : wutils.SHOW_IF_TRUE, + 'noseg' : wutils.SHOW_IF_TRUE, + 'nosubcortseg' : wutils.SHOW_IF_TRUE, + 'nosearch' : wutils.SHOW_IF_TRUE, + 'nocleanup' : wutils.SHOW_IF_TRUE, + } + + argmap = { + } + + img_type = kwargs.pop("img_type", "T1") + cmd = ['fsl_anat', '-i', img, '-o', out, '-t', img_type] + smoothing = kwargs.pop("bias_smoothing", None) + if smoothing is not None: + cmd += ['-s', str(smoothing)] + + cmd += wutils.applyArgStyle('--=', valmap=valmap, argmap=argmap, singlechar_args=True, **kwargs) + + return cmd diff --git a/fsl/wrappers/wrapperutils.py b/fsl/wrappers/wrapperutils.py index d3fc2db2379224aa1f3582a1c8e6a96afc8ac164..2bda19793ffca266038421e734738b55743604e4 100644 --- a/fsl/wrappers/wrapperutils.py +++ b/fsl/wrappers/wrapperutils.py @@ -153,11 +153,13 @@ def cmdwrapper(func): :func:`fsl.utils.run.run` function in a standardised manner. """ def wrapper(*args, **kwargs): - submit = kwargs.pop('submit', None) + stdout = kwargs.pop('stdout', True) stderr = kwargs.pop('stderr', True) + exitcode = kwargs.pop('exitcode', False) + submit = kwargs.pop('submit', None) log = kwargs.pop('log', {'tee' : True}) cmd = func(*args, **kwargs) - return run.run(cmd, stderr=stderr, log=log, submit=submit) + return run.run(cmd, stderr=stderr, log=log, submit=submit, stdout=stdout, exitcode=exitcode) return _update_wrapper(wrapper, func) @@ -167,11 +169,13 @@ def fslwrapper(func): :func:`fsl.utils.run.runfsl` function in a standardised manner. """ def wrapper(*args, **kwargs): - submit = kwargs.pop('submit', None) + stdout = kwargs.pop('stdout', True) stderr = kwargs.pop('stderr', True) + exitcode = kwargs.pop('exitcode', False) + submit = kwargs.pop('submit', None) log = kwargs.pop('log', {'tee' : True}) cmd = func(*args, **kwargs) - return run.runfsl(cmd, stderr=stderr, log=log, submit=submit) + return run.runfsl(cmd, stderr=stderr, log=log, submit=submit, stdout=stdout, exitcode=exitcode) return _update_wrapper(wrapper, func) @@ -193,7 +197,7 @@ generated command line arguments. """ -def applyArgStyle(style, valsep=None, argmap=None, valmap=None, **kwargs): +def applyArgStyle(style, valsep=None, argmap=None, valmap=None, singlechar_args=False, **kwargs): """Turns the given ``kwargs`` into command line options. This function is intended to be used to automatically generate command line options from arguments passed into a Python function. @@ -252,6 +256,9 @@ def applyArgStyle(style, valsep=None, argmap=None, valmap=None, **kwargs): The argument for any options not specified in the ``valmap`` will be converted into strings. + :arg singlechar_args: If True, single character arguments always take a single + hyphen prefix (e.g. -h) regardless of the style + :arg kwargs: Arguments to be converted into command-line options. :returns: A list containing the generated command-line options. @@ -277,7 +284,7 @@ def applyArgStyle(style, valsep=None, argmap=None, valmap=None, **kwargs): if valmap is None: valmap = {} def fmtarg(arg): - if style in ('-', '-='): arg = '-{}'.format(arg) + if style in ('-', '-=') or (singlechar_args and len(arg) == 1): arg = '-{}'.format(arg) elif style in ('--', '--='): arg = '--{}'.format(arg) return arg @@ -304,11 +311,12 @@ def applyArgStyle(style, valsep=None, argmap=None, valmap=None, **kwargs): for k, v in kwargs.items(): + if v is None: continue + k = argmap.get(k, k) mapv = valmap.get(k, fmtval(v)) k = fmtarg(k) - if mapv in (SHOW_IF_TRUE, HIDE_IF_TRUE): if (mapv is SHOW_IF_TRUE and v) or \ (mapv is HIDE_IF_TRUE and not v): @@ -850,7 +858,6 @@ class _FileOrThing(object): for prefixed in it.chain(*allPrefixed): fullpath = prefixed prefixed = op.relpath(prefixed, workdir) - for prefPat, prefName in prefixes.items(): if not fnmatch.fnmatch(prefixed, '{}*'.format(prefPat)): continue @@ -863,10 +870,17 @@ class _FileOrThing(object): # not of the correct type. fval = self.__load(fullpath) if fval is not None: - prefixed = self.__removeExt(prefixed) + noext = self.__removeExt(prefixed) prefPat = prefPat.replace('\\', '\\\\') - prefixed = re.sub('^' + prefPat, prefName, prefixed) - result[prefixed] = fval + noext = re.sub('^' + prefPat, prefName, noext) + # If there is already an item in result with the + # name (stripped of prefix), then instead store + # the result with the full prefixed name + if noext not in result: + result[noext] = fval + else: + withext = re.sub('^' + prefPat, prefName, prefixed) + result[withext] = fval break return result @@ -888,8 +902,11 @@ def fileOrImage(*args, **kwargs): infile = None - if isinstance(val, (fslimage.Image, nib.nifti1.Nifti1Image)): - intypes.append(type(val)) + if isinstance(val, fslimage.Image): + intypes.append(fslimage.Image) + + elif isinstance(val, nib.nifti1.Nifti1Image): + intypes.append(nib.nifti1.Nifti1Image) if isinstance(val, fslimage.Image): val = val.nibImage @@ -989,3 +1006,43 @@ def fileOrArray(*args, **kwargs): return _update_wrapper(wrapper, func) return decorator + +def fileOrText(*args, **kwargs): + """Decorator which can be used to ensure that any text output (e.g. log file are saved + to text files, and output files can be loaded and returned as strings. + """ + + def prepIn(workdir, name, val): + + infile = None + + if isinstance(val, six.string_types): + with tempfile.NamedTemporaryFile(mode='w', suffix='.txt') as f: + f.write(val) + infile = f.name + return infile + + def prepOut(workdir, name, val): + return op.join(workdir, '{}.txt'.format(name)) + + def load(path): + try: + with open(path, "r") as f: + return f.read() + except Exception: return None + + def decorator(func): + fot = _FileOrThing(func, + prepIn, + prepOut, + load, + fslpath.removeExt, + *args, + **kwargs) + + def wrapper(*args, **kwargs): + return fot(*args, **kwargs) + + return _update_wrapper(wrapper, func) + + return decorator diff --git a/tests/__init__.py b/tests/__init__.py index 4960e909532e5d5f1a970fd9f44368ed23c7d31e..06bd6b5b7095dade252133f67754b9dd7c66f2cb 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -35,7 +35,7 @@ logging.getLogger().setLevel(logging.WARNING) @contextlib.contextmanager -def mockFSLDIR(): +def mockFSLDIR(**kwargs): oldfsldir = fslplatform.fsldir oldfsldevdir = fslplatform.fsldevdir @@ -45,6 +45,12 @@ def mockFSLDIR(): fsldir = op.join(td, 'fsl') bindir = op.join(fsldir, 'bin') os.makedirs(bindir) + for subdir, files in kwargs.items(): + subdir = op.join(fsldir, subdir) + if not op.isdir(subdir): + os.makedirs(subdir) + for fname in files: + touch(op.join(subdir, fname)) fslplatform.fsldir = fsldir fslplatform.fsldevdir = None diff --git a/tests/test_run.py b/tests/test_run.py index bc77a46fd14f494a4269ecb90d2749a5bace5ab5..422222fb9b6454982197ee04720a561bf1da5868 100644 --- a/tests/test_run.py +++ b/tests/test_run.py @@ -353,20 +353,22 @@ def test_run_logcmd(): exit 0 """).strip() - expstdout = './script.sh 1 2 3\noutput 1 2 3\n' + expcmd = './script.sh 1 2 3\n' + expstdout = 'output 1 2 3\n' with tempdir.tempdir(): mkexec('script.sh', test_script) - stdout = run.run('./script.sh 1 2 3', log={'cmd' : True}) - assert stdout == expstdout - mkexec('script.sh', test_script) - stdout = run.run('./script.sh 1 2 3', log={'cmd' : True}) - assert stdout == expstdout + with open('my_stdout', 'wt') as stdoutf: + stdout = run.run('./script.sh 1 2 3', + log={'cmd' : stdoutf}) + + assert stdout == expstdout + assert open('my_stdout', 'rt').read() == expcmd with open('my_stdout', 'wt') as stdoutf: stdout = run.run('./script.sh 1 2 3', - log={'cmd' : True, 'stdout' : stdoutf}) + log={'cmd' : stdoutf, "stdout" : stdoutf}) assert stdout == expstdout - assert open('my_stdout', 'rt').read() == expstdout + assert open('my_stdout', 'rt').read() == expcmd + expstdout diff --git a/tests/test_wrappers.py b/tests/test_wrappers.py index af2a95fb6df0c7254ebde60625ccc2264ebdaa2e..b1517b32cd69fcc26d39409a58311961b422cdd9 100644 --- a/tests/test_wrappers.py +++ b/tests/test_wrappers.py @@ -39,7 +39,7 @@ def checkResult(cmd, base, args, stripdir=None): def test_bet(): - with asrt.disabled(), run.dryrun(), mockFSLDIR() as fsldir: + with asrt.disabled(), run.dryrun(), mockFSLDIR(bin=('bet',)) as fsldir: bet = op.join(fsldir, 'bin', 'bet') result = fw.bet('input', 'output', mask=True, c=(10, 20, 30)) expected = (bet + ' input output', ('-m', '-c 10 20 30')) @@ -47,7 +47,7 @@ def test_bet(): def test_robustfov(): - with asrt.disabled(), run.dryrun(), mockFSLDIR() as fsldir: + with asrt.disabled(), run.dryrun(), mockFSLDIR(bin=('robustfov',)) as fsldir: rfov = op.join(fsldir, 'bin', 'robustfov') result = fw.robustfov('input', 'output', b=180) expected = (rfov + ' -i input', ('-r output', '-b 180')) @@ -55,7 +55,7 @@ def test_robustfov(): def test_eddy_cuda(): - with asrt.disabled(), run.dryrun(), mockFSLDIR() as fsldir: + with asrt.disabled(), run.dryrun(), mockFSLDIR(bin=('eddy_cuda',)) as fsldir: eddy = op.join(fsldir, 'bin', 'eddy_cuda') result = fw.eddy_cuda('imain', 'mask', 'index', 'acqp', 'bvecs', 'bvals', 'out', dont_mask_output=True) @@ -72,7 +72,7 @@ def test_eddy_cuda(): def test_topup(): - with asrt.disabled(), run.dryrun(), mockFSLDIR() as fsldir: + with asrt.disabled(), run.dryrun(), mockFSLDIR(bin=('topup',)) as fsldir: topup = op.join(fsldir, 'bin', 'topup') result = fw.topup('imain', 'datain', minmet=1) expected = topup + ' --imain=imain --datain=datain --minmet=1' @@ -80,7 +80,7 @@ def test_topup(): def test_flirt(): - with asrt.disabled(), run.dryrun(), mockFSLDIR() as fsldir: + with asrt.disabled(), run.dryrun(), mockFSLDIR(bin=('flirt',)) as fsldir: flirt = op.join(fsldir, 'bin', 'flirt') result = fw.flirt('src', 'ref', usesqform=True, anglerep='euler') expected = (flirt + ' -in src -ref ref', @@ -89,7 +89,7 @@ def test_flirt(): def test_applyxfm(): - with asrt.disabled(), run.dryrun(), mockFSLDIR() as fsldir: + with asrt.disabled(), run.dryrun(), mockFSLDIR(bin=('flirt',)) as fsldir: flirt = op.join(fsldir, 'bin', 'flirt') result = fw.applyxfm('src', 'ref', 'mat', 'out', interp='trilinear') expected = (flirt + ' -in src -ref ref', @@ -101,7 +101,7 @@ def test_applyxfm(): def test_invxfm(): - with asrt.disabled(), run.dryrun(), mockFSLDIR() as fsldir: + with asrt.disabled(), run.dryrun(), mockFSLDIR(bin=('convert_xfm',)) as fsldir: cnvxfm = op.join(fsldir, 'bin', 'convert_xfm') result = fw.invxfm('mat', 'output') expected = cnvxfm + ' -omat output -inverse mat' @@ -109,7 +109,7 @@ def test_invxfm(): def test_concatxfm(): - with asrt.disabled(), run.dryrun(), mockFSLDIR() as fsldir: + with asrt.disabled(), run.dryrun(), mockFSLDIR(bin=('convert_xfm',)) as fsldir: cnvxfm = op.join(fsldir, 'bin', 'convert_xfm') result = fw.concatxfm('mat1', 'mat2', 'output') expected = cnvxfm + ' -omat output -concat mat2 mat1' @@ -117,7 +117,7 @@ def test_concatxfm(): def test_mcflirt(): - with asrt.disabled(), run.dryrun(), mockFSLDIR() as fsldir: + with asrt.disabled(), run.dryrun(), mockFSLDIR(bin=('mcflirt',)) as fsldir: mcflirt = op.join(fsldir, 'bin', 'mcflirt') result = fw.mcflirt('input', out='output', cost='normcorr', dof=12) expected = (mcflirt + ' -in input', @@ -128,28 +128,29 @@ def test_mcflirt(): def test_fnirt(): - with asrt.disabled(), run.dryrun(), mockFSLDIR() as fsldir: + with asrt.disabled(), run.dryrun(), mockFSLDIR(bin=('fnirt',)) as fsldir: fnirt = op.join(fsldir, 'bin', 'fnirt') - result = fw.fnirt('src', 'ref', iout='iout', fout='fout', + result = fw.fnirt('src', ref='ref', iout='iout', fout='fout', subsamp=(8, 6, 4, 2)) - expected = (fnirt + ' --in=src --ref=ref', - ('--iout=iout', + expected = (fnirt + ' --in=src', + ('--ref=ref', + '--iout=iout', '--fout=fout', '--subsamp=8,6,4,2')) assert checkResult(result.output[0], *expected) def test_applywarp(): - with asrt.disabled(), run.dryrun(), mockFSLDIR() as fsldir: + with asrt.disabled(), run.dryrun(), mockFSLDIR(bin=('applywarp',)) as fsldir: applywarp = op.join(fsldir, 'bin', 'applywarp') - result = fw.applywarp('src', 'ref', 'out', 'warp', abs=True, super=True) - expected = (applywarp + ' --in=src --ref=ref --out=out --warp=warp', - ('--abs', '--super')) + result = fw.applywarp('src', 'ref', 'out', warp='warp', abs=True, super=True) + expected = (applywarp + ' --in=src --ref=ref --out=out', + ('--warp=warp', '--abs', '--super')) assert checkResult(result.output[0], *expected) def test_invwarp(): - with asrt.disabled(), run.dryrun(), mockFSLDIR() as fsldir: + with asrt.disabled(), run.dryrun(), mockFSLDIR(bin=('invwarp',)) as fsldir: invwarp = op.join(fsldir, 'bin', 'invwarp') result = fw.invwarp('warp', 'ref', 'out', rel=True, noconstraint=True) @@ -159,16 +160,16 @@ def test_invwarp(): def test_convertwarp(): - with asrt.disabled(), run.dryrun(), mockFSLDIR() as fsldir: + with asrt.disabled(), run.dryrun(), mockFSLDIR(bin=('convertwarp',)) as fsldir: cnvwarp = op.join(fsldir, 'bin', 'convertwarp') - result = fw.convertwarp('out', 'ref', absout=True, jacobian=True) + result = fw.convertwarp('out', 'ref', absout=True, jacobian='jacobian') expected = (cnvwarp + ' --ref=ref --out=out', - ('--absout', '--jacobian')) + ('--absout', '--jacobian=jacobian')) assert checkResult(result.output[0], *expected) def test_fugue(): - with asrt.disabled(), run.dryrun(), mockFSLDIR() as fsldir: + with asrt.disabled(), run.dryrun(), mockFSLDIR(bin=('fugue',)) as fsldir: fugue = op.join(fsldir, 'bin', 'fugue') result = fw.fugue(input='input', warp='warp', median=True, dwell=10) @@ -181,7 +182,7 @@ def test_fugue(): def test_sigloss(): - with asrt.disabled(), run.dryrun(), mockFSLDIR() as fsldir: + with asrt.disabled(), run.dryrun(), mockFSLDIR(bin=('sigloss',)) as fsldir: sigloss = op.join(fsldir, 'bin', 'sigloss') result = fw.sigloss('input', 'sigloss', mask='mask', te=0.5) expected = (sigloss + ' --in input --sigloss sigloss', @@ -190,7 +191,7 @@ def test_sigloss(): def test_melodic(): - with asrt.disabled(), run.dryrun(), mockFSLDIR() as fsldir: + with asrt.disabled(), run.dryrun(), mockFSLDIR(bin=('melodic',)) as fsldir: melodic = op.join(fsldir, 'bin', 'melodic') result = fw.melodic('input', dim=50, mask='mask', Oall=True) expected = (melodic + ' --in=input', @@ -199,7 +200,7 @@ def test_melodic(): def test_fsl_regfilt(): - with asrt.disabled(), run.dryrun(), mockFSLDIR() as fsldir: + with asrt.disabled(), run.dryrun(), mockFSLDIR(bin=('fsl_regfilt',)) as fsldir: regfilt = op.join(fsldir, 'bin', 'fsl_regfilt') result = fw.fsl_regfilt('input', 'output', 'design', filter=(1, 2, 3, 4), vn=True) @@ -210,7 +211,7 @@ def test_fsl_regfilt(): def test_fslreorient2std(): - with asrt.disabled(), run.dryrun(), mockFSLDIR() as fsldir: + with asrt.disabled(), run.dryrun(), mockFSLDIR(bin=('fslreorient2std',)) as fsldir: r2std = op.join(fsldir, 'bin', 'fslreorient2std') result = fw.fslreorient2std('input', 'output') expected = r2std + ' input output' @@ -218,7 +219,7 @@ def test_fslreorient2std(): def test_fslroi(): - with asrt.disabled(), run.dryrun(), mockFSLDIR() as fsldir: + with asrt.disabled(), run.dryrun(), mockFSLDIR(bin=('fslroi',)) as fsldir: fslroi = op.join(fsldir, 'bin', 'fslroi') result = fw.fslroi('input', 'output', 1, 10) @@ -235,7 +236,7 @@ def test_fslroi(): def test_slicer(): - with asrt.disabled(), run.dryrun(), mockFSLDIR() as fsldir: + with asrt.disabled(), run.dryrun(), mockFSLDIR(bin=('slicer',)) as fsldir: slicer = op.join(fsldir, 'bin', 'slicer') result = fw.slicer('input1', 'input2', i=(20, 100), x=(20, 'x.png')) expected = slicer + ' input1 input2 -i 20 100 -x 20 x.png' @@ -243,7 +244,7 @@ def test_slicer(): def test_cluster(): - with asrt.disabled(), run.dryrun(), mockFSLDIR() as fsldir: + with asrt.disabled(), run.dryrun(), mockFSLDIR(bin=('cluster',)) as fsldir: cluster = op.join(fsldir, 'bin', 'cluster') result = fw.cluster('input', 'thresh', fractional=True, osize='osize') @@ -253,7 +254,7 @@ def test_cluster(): def test_fslmaths(): - with asrt.disabled(), run.dryrun(), mockFSLDIR() as fsldir: + with asrt.disabled(), run.dryrun(), mockFSLDIR(bin=('fslmaths',)) as fsldir: cmd = op.join(fsldir, 'bin', 'fslmaths') result = fw.fslmaths('input') \ .abs().bin().binv().recip().Tmean().Tstd().Tmin().Tmax() \ @@ -274,7 +275,7 @@ def test_fslmaths(): # TODO test LOAD output def test_fast(): - with asrt.disabled(), run.dryrun(), mockFSLDIR() as fsldir: + with asrt.disabled(), run.dryrun(), mockFSLDIR(bin=('fast',)) as fsldir: cmd = op.join(fsldir, 'bin', 'fast') diff --git a/tests/test_wrapperutils.py b/tests/test_wrapperutils.py index 29e569c9f011cea38e9ceaf0ec1dde42eedd7785..54cf16f4c44b06af65dae7df906f095768ef1388 100644 --- a/tests/test_wrapperutils.py +++ b/tests/test_wrapperutils.py @@ -598,7 +598,7 @@ def test_fslwrapper(): def func(a, b): return ['func', str(a), str(b)] - with run.dryrun(), mockFSLDIR() as fsldir: + with run.dryrun(), mockFSLDIR(bin=('func',)) as fsldir: expected = '{} 1 2'.format(op.join(fsldir, 'bin', 'func')) assert func(1, 2)[0] == expected