From b44bce4c0a1a8d7fa64f45faea029913b7e0f2f5 Mon Sep 17 00:00:00 2001 From: Satrajit Ghosh Date: Mon, 19 Feb 2018 15:39:56 -0500 Subject: [PATCH 1/5] fix: use matlab_cmd provided as input closes #2442 --- nipype/interfaces/spm/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nipype/interfaces/spm/base.py b/nipype/interfaces/spm/base.py index cb0416392a..75ab60ffbd 100644 --- a/nipype/interfaces/spm/base.py +++ b/nipype/interfaces/spm/base.py @@ -186,7 +186,7 @@ def getinfo(klass, matlab_cmd=None, paths=None, use_mcr=None): } use_mcr = use_mcr or 'FORCE_SPMMCR' in os.environ - matlab_cmd = ((use_mcr and os.getenv('SPMMCRCMD')) + matlab_cmd = matlab_cmd or ((use_mcr and os.getenv('SPMMCRCMD')) or os.getenv('MATLABCMD', 'matlab -nodesktop -nosplash')) mlab = MatlabCommand(matlab_cmd=matlab_cmd, resource_monitor=False) From 94b316d197c0d8d33e7f57c30bba87137af0e4ad Mon Sep 17 00:00:00 2001 From: Satrajit Ghosh Date: Tue, 20 Feb 2018 12:07:08 -0500 Subject: [PATCH 2/5] fix: ensure that changes to matlab paths and commands generate new version info --- nipype/interfaces/spm/base.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/nipype/interfaces/spm/base.py b/nipype/interfaces/spm/base.py index 75ab60ffbd..d28138e8c7 100644 --- a/nipype/interfaces/spm/base.py +++ b/nipype/interfaces/spm/base.py @@ -129,6 +129,8 @@ class Info(PackageInfo): """ _path = None _name = None + _command = None + _paths = None @classmethod def path(klass, matlab_cmd=None, paths=None, use_mcr=None): @@ -178,17 +180,18 @@ def getinfo(klass, matlab_cmd=None, paths=None, use_mcr=None): returns None of path not found """ - if klass._name and klass._path and klass._version: + use_mcr = use_mcr or 'FORCE_SPMMCR' in os.environ + matlab_cmd = matlab_cmd or ((use_mcr and os.getenv('SPMMCRCMD')) + or os.getenv('MATLABCMD', 'matlab -nodesktop -nosplash')) + + if klass._name and klass._path and klass._version and \ + klass._command == matlab_cmd and klass._paths == paths: return { 'name': klass._name, 'path': klass._path, 'release': klass._version } - use_mcr = use_mcr or 'FORCE_SPMMCR' in os.environ - matlab_cmd = matlab_cmd or ((use_mcr and os.getenv('SPMMCRCMD')) - or os.getenv('MATLABCMD', 'matlab -nodesktop -nosplash')) - mlab = MatlabCommand(matlab_cmd=matlab_cmd, resource_monitor=False) mlab.inputs.mfile = False if paths: @@ -225,6 +228,8 @@ def getinfo(klass, matlab_cmd=None, paths=None, use_mcr=None): klass._version = out_dict['release'] klass._path = out_dict['path'] klass._name = out_dict['name'] + klass._command = matlab_cmd + klass._paths = paths return out_dict From 44a7b66595f23596541c6877af09d8c04b21a3bc Mon Sep 17 00:00:00 2001 From: Satrajit Ghosh Date: Tue, 20 Feb 2018 18:26:35 -0500 Subject: [PATCH 3/5] fix: change the way memoization works for the Info class --- nipype/interfaces/spm/base.py | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/nipype/interfaces/spm/base.py b/nipype/interfaces/spm/base.py index d28138e8c7..b7d6a0ca68 100644 --- a/nipype/interfaces/spm/base.py +++ b/nipype/interfaces/spm/base.py @@ -126,6 +126,11 @@ def scans_for_fnames(fnames, keep4d=False, separate_sessions=False): class Info(PackageInfo): """Handles SPM version information + + If you use `SPMCommand.set_mlab_paths` to set alternate entries for + matlab_cmd, paths, and use_mcr, then you will need to use the same entries + to any call in the Info class to maintain memoization. Otherwise, it will + default to the parameters in the `getinfo` function below. """ _path = None _name = None @@ -134,22 +139,16 @@ class Info(PackageInfo): @classmethod def path(klass, matlab_cmd=None, paths=None, use_mcr=None): - if klass._path: - return klass._path klass.getinfo(matlab_cmd, paths, use_mcr) return klass._path @classmethod def version(klass, matlab_cmd=None, paths=None, use_mcr=None): - if klass._version: - return klass._version klass.getinfo(matlab_cmd, paths, use_mcr) return klass._version @classmethod def name(klass, matlab_cmd=None, paths=None, use_mcr=None): - if klass._name: - return klass._name klass.getinfo(matlab_cmd, paths, use_mcr) return klass._name @@ -191,7 +190,6 @@ def getinfo(klass, matlab_cmd=None, paths=None, use_mcr=None): 'path': klass._path, 'release': klass._version } - mlab = MatlabCommand(matlab_cmd=matlab_cmd, resource_monitor=False) mlab.inputs.mfile = False if paths: @@ -217,6 +215,11 @@ def getinfo(klass, matlab_cmd=None, paths=None, use_mcr=None): # if no Matlab at all -- exception could be raised # No Matlab -- no spm logger.debug('%s', e) + klass._version = None + klass._path = None + klass._name = None + klass._command = matlab_cmd + klass._paths = paths return None out = sd._strip_header(out.runtime.stdout) @@ -301,6 +304,10 @@ def set_mlab_paths(cls, matlab_cmd=None, paths=None, use_mcr=None): cls._matlab_cmd = matlab_cmd cls._paths = paths cls._use_mcr = use_mcr + info_dict = Info.getinfo( + matlab_cmd=matlab_cmd, + paths=paths, + use_mcr=use_mcr) def _find_mlab_cmd_defaults(self): # check if the user has set environment variables to enforce From 1572498dfe61adc6977d600d6d0ffcc8d2fa6ab1 Mon Sep 17 00:00:00 2001 From: Satrajit Ghosh Date: Tue, 20 Feb 2018 20:56:27 -0500 Subject: [PATCH 4/5] fix: add missing version --- nipype/interfaces/spm/base.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/nipype/interfaces/spm/base.py b/nipype/interfaces/spm/base.py index 15d705bbfa..b98d938971 100644 --- a/nipype/interfaces/spm/base.py +++ b/nipype/interfaces/spm/base.py @@ -136,6 +136,7 @@ class Info(PackageInfo): _name = None _command = None _paths = None + _version = None @classmethod def path(klass, matlab_cmd=None, paths=None, use_mcr=None): @@ -185,6 +186,7 @@ def getinfo(klass, matlab_cmd=None, paths=None, use_mcr=None): if klass._name and klass._path and klass._version and \ klass._command == matlab_cmd and klass._paths == paths: + return { 'name': klass._name, 'path': klass._path, From 88dbf6e9a7a0ae2ad67dd7d5c87642b23785fcd4 Mon Sep 17 00:00:00 2001 From: Satrajit Ghosh Date: Thu, 22 Feb 2018 20:26:02 -0500 Subject: [PATCH 5/5] fix: address djarecka's questions --- nipype/interfaces/spm/base.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/nipype/interfaces/spm/base.py b/nipype/interfaces/spm/base.py index b98d938971..ee6387a08d 100644 --- a/nipype/interfaces/spm/base.py +++ b/nipype/interfaces/spm/base.py @@ -171,7 +171,10 @@ def getinfo(klass, matlab_cmd=None, paths=None, use_mcr=None): If none of the above was successful, the fallback value of 'matlab -nodesktop -nosplash' will be used. paths : str + Add paths to matlab session use_mcr : bool + Whether to use the MATLAB Common Runtime. In this case, the + matlab_cmd is expected to be a valid MCR call. Returns ------- @@ -192,6 +195,7 @@ def getinfo(klass, matlab_cmd=None, paths=None, use_mcr=None): 'path': klass._path, 'release': klass._version } + logger.debug('matlab command or path has changed. recomputing version.') mlab = MatlabCommand(matlab_cmd=matlab_cmd, resource_monitor=False) mlab.inputs.mfile = False if paths: