From d001a2829ae818767732e4b0f595ab5ce86767aa Mon Sep 17 00:00:00 2001 From: Matteo Visconti dOC Date: Sun, 10 Dec 2017 14:24:21 +0100 Subject: [PATCH 01/11] BF: if --x1D_stop, do not assume out_file exists --- nipype/interfaces/afni/model.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/nipype/interfaces/afni/model.py b/nipype/interfaces/afni/model.py index d5730d15f9..311072b7e6 100644 --- a/nipype/interfaces/afni/model.py +++ b/nipype/interfaces/afni/model.py @@ -290,6 +290,10 @@ def _parse_inputs(self, skip=None): return super(Deconvolve, self)._parse_inputs(skip) def _list_outputs(self): + if isdefined(self.inputs.x1D_stop): + # we are stopping early, so out_file doesn't exist + self.output_spec.out_file.exists = False + outputs = self.output_spec().get() _gen_fname_opts = {} From 66343ae88e04e3bfedb0166fc26e9d668200052e Mon Sep 17 00:00:00 2001 From: Matteo Visconti dOC Date: Sun, 10 Dec 2017 14:25:49 +0100 Subject: [PATCH 02/11] Check that x1d_stop is true --- nipype/interfaces/afni/model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nipype/interfaces/afni/model.py b/nipype/interfaces/afni/model.py index 311072b7e6..68a7053065 100644 --- a/nipype/interfaces/afni/model.py +++ b/nipype/interfaces/afni/model.py @@ -290,7 +290,7 @@ def _parse_inputs(self, skip=None): return super(Deconvolve, self)._parse_inputs(skip) def _list_outputs(self): - if isdefined(self.inputs.x1D_stop): + if isdefined(self.inputs.x1D_stop) and self.inputs.x1D_stop: # we are stopping early, so out_file doesn't exist self.output_spec.out_file.exists = False From dde61d3172dd066d22ba49a0cfaf748030b1e5f9 Mon Sep 17 00:00:00 2001 From: Matteo Visconti dOC Date: Sun, 10 Dec 2017 14:43:27 +0100 Subject: [PATCH 03/11] Update zenodo.json --- .zenodo.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.zenodo.json b/.zenodo.json index fb7ccfc0b8..dc0d4522e5 100644 --- a/.zenodo.json +++ b/.zenodo.json @@ -516,6 +516,11 @@ { "name": "Flandin, Guillaume" }, + { + "affiliation": "Dartmouth College", + "name": "Visconti di Oleggio Castello, Matteo", + "orcid": "0000-0001-7931-5272" + }, { "affiliation": "CEA", "name": "Papadopoulos Orfanos, Dimitri", From d79f2cc7bd0ad070ef2d9efe770a131c66991889 Mon Sep 17 00:00:00 2001 From: Matteo Visconti dOC Date: Sun, 10 Dec 2017 15:31:00 +0100 Subject: [PATCH 04/11] FIX: force_TR is float not int --- nipype/interfaces/afni/model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nipype/interfaces/afni/model.py b/nipype/interfaces/afni/model.py index 68a7053065..54ed3ce0f7 100644 --- a/nipype/interfaces/afni/model.py +++ b/nipype/interfaces/afni/model.py @@ -57,7 +57,7 @@ class DeconvolveInputSpec(AFNICommandInputSpec): '* If the auto-catenation feature isn\'t used, then this option ' 'has no effect, no how, no way.', argstr='-noblock') - force_TR = traits.Int( + force_TR = traits.Float( desc='use this value instead of the TR in the \'input\' ' 'dataset. (It\'s better to fix the input using Refit.)', argstr='-force_TR %d') From ca18a389c24e92bdc1fbeb9ea1e6d7a8479d715d Mon Sep 17 00:00:00 2001 From: Matteo Visconti dOC Date: Sun, 10 Dec 2017 16:10:16 +0100 Subject: [PATCH 05/11] Format as float, force_tr must precede input --- nipype/interfaces/afni/model.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/nipype/interfaces/afni/model.py b/nipype/interfaces/afni/model.py index 54ed3ce0f7..b530e7491a 100644 --- a/nipype/interfaces/afni/model.py +++ b/nipype/interfaces/afni/model.py @@ -36,7 +36,7 @@ class DeconvolveInputSpec(AFNICommandInputSpec): argstr='-input %s', copyfile=False, sep=" ", - position=0) + position=1) sat = traits.Bool( desc='check the dataset time series for initial saturation transients,' ' which should normally have been excised before data analysis.', @@ -60,7 +60,8 @@ class DeconvolveInputSpec(AFNICommandInputSpec): force_TR = traits.Float( desc='use this value instead of the TR in the \'input\' ' 'dataset. (It\'s better to fix the input using Refit.)', - argstr='-force_TR %d') + argstr='-force_TR %f', + position=0) input1D = File( desc='filename of single (fMRI) .1D time series where time runs down ' 'the column.', From e5f36a89afacb39a37c1d0aebab74ef10d7d3a4a Mon Sep 17 00:00:00 2001 From: Matteo Visconti dOC Date: Sun, 10 Dec 2017 22:56:19 +0100 Subject: [PATCH 06/11] Update autotest deconvolve --- nipype/interfaces/afni/tests/test_auto_Deconvolve.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/nipype/interfaces/afni/tests/test_auto_Deconvolve.py b/nipype/interfaces/afni/tests/test_auto_Deconvolve.py index 972b9a0128..f688897889 100644 --- a/nipype/interfaces/afni/tests/test_auto_Deconvolve.py +++ b/nipype/interfaces/afni/tests/test_auto_Deconvolve.py @@ -25,7 +25,8 @@ def test_Deconvolve_inputs(): environ=dict(nohash=True, usedefault=True, ), - force_TR=dict(argstr='-force_TR %d', + force_TR=dict(argstr='-force_TR %f', + position=0, ), fout=dict(argstr='-fout', ), @@ -47,7 +48,7 @@ def test_Deconvolve_inputs(): ), in_files=dict(argstr='-input %s', copyfile=False, - position=0, + position=1, sep=' ', ), input1D=dict(argstr='-input1D %s', From 14ab0a8c64332b9e23d39e1ea913e1669d4ba155 Mon Sep 17 00:00:00 2001 From: Matteo Visconti dOC Date: Mon, 11 Dec 2017 08:46:55 +0100 Subject: [PATCH 07/11] Fix by setting exists to False --- nipype/interfaces/afni/model.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/nipype/interfaces/afni/model.py b/nipype/interfaces/afni/model.py index b530e7491a..dff7f672bb 100644 --- a/nipype/interfaces/afni/model.py +++ b/nipype/interfaces/afni/model.py @@ -233,7 +233,7 @@ class DeconvolveInputSpec(AFNICommandInputSpec): class DeconvolveOutputSpec(TraitedSpec): out_file = File( - desc='output statistics file', exists=True) + desc='output statistics file', exists=False) reml_script = File( desc='automatical generated script to run 3dREMLfit', exists=True) x1D = File( @@ -291,10 +291,6 @@ def _parse_inputs(self, skip=None): return super(Deconvolve, self)._parse_inputs(skip) def _list_outputs(self): - if isdefined(self.inputs.x1D_stop) and self.inputs.x1D_stop: - # we are stopping early, so out_file doesn't exist - self.output_spec.out_file.exists = False - outputs = self.output_spec().get() _gen_fname_opts = {} From 5b88f2f39956f08cca4ef15e89266658d95f5470 Mon Sep 17 00:00:00 2001 From: Matteo Visconti dOC Date: Mon, 11 Dec 2017 10:03:12 +0100 Subject: [PATCH 08/11] Fix parsing of ortvec --- nipype/interfaces/afni/model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nipype/interfaces/afni/model.py b/nipype/interfaces/afni/model.py index dff7f672bb..c16de0ed28 100644 --- a/nipype/interfaces/afni/model.py +++ b/nipype/interfaces/afni/model.py @@ -148,7 +148,7 @@ class DeconvolveInputSpec(AFNICommandInputSpec): desc='this option lets you input a rectangular array of 1 or more ' 'baseline vectors from a file. This method is a fast way to ' 'include a lot of baseline regressors in one step. ', - argstr='ortvec %s') + argstr='-ortvec %s %s') x1D = File( desc='specify name for saved X matrix', argstr='-x1D %s') From e95c0a0ca8ef84f4fea1eb77ce731861b9527e9d Mon Sep 17 00:00:00 2001 From: Matteo Visconti dOC Date: Mon, 11 Dec 2017 19:26:10 +0100 Subject: [PATCH 09/11] Update auto test Deconvolve --- nipype/interfaces/afni/tests/test_auto_Deconvolve.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nipype/interfaces/afni/tests/test_auto_Deconvolve.py b/nipype/interfaces/afni/tests/test_auto_Deconvolve.py index f688897889..3505f42eac 100644 --- a/nipype/interfaces/afni/tests/test_auto_Deconvolve.py +++ b/nipype/interfaces/afni/tests/test_auto_Deconvolve.py @@ -81,7 +81,7 @@ def test_Deconvolve_inputs(): num_threads=dict(nohash=True, usedefault=True, ), - ortvec=dict(argstr='ortvec %s', + ortvec=dict(argstr='-ortvec %s %s', ), out_file=dict(argstr='-bucket %s', ), From c4d6e31c2b62900b5f9ee20d311d3a1c6362b9d7 Mon Sep 17 00:00:00 2001 From: Matteo Visconti dOC Date: Thu, 18 Jan 2018 18:43:52 -0500 Subject: [PATCH 10/11] Remove out_file if x1d_stop set to True --- nipype/interfaces/afni/model.py | 6 +++++- nipype/interfaces/afni/tests/test_deconvolve.py | 10 ++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 nipype/interfaces/afni/tests/test_deconvolve.py diff --git a/nipype/interfaces/afni/model.py b/nipype/interfaces/afni/model.py index b4bddbc52c..0d56f2dbb5 100644 --- a/nipype/interfaces/afni/model.py +++ b/nipype/interfaces/afni/model.py @@ -295,7 +295,11 @@ def _list_outputs(self): outputs['reml_script'] = self._gen_fname( suffix='.REML_cmd', **_gen_fname_opts) - outputs['out_file'] = os.path.abspath(self.inputs.out_file) + # remove out_file from outputs if x1d_stop set to True + if self.inputs.x1D_stop: + del outputs['out_file'] + else: + outputs['out_file'] = os.path.abspath(self.inputs.out_file) return outputs diff --git a/nipype/interfaces/afni/tests/test_deconvolve.py b/nipype/interfaces/afni/tests/test_deconvolve.py new file mode 100644 index 0000000000..b80af90cf5 --- /dev/null +++ b/nipype/interfaces/afni/tests/test_deconvolve.py @@ -0,0 +1,10 @@ +"""Test afni deconvolve""" + +from ..model import Deconvolve + +def test_x1dstop(): + deconv = Deconvolve() + deconv.inputs.out_file = 'file.nii' + assert 'out_file' in deconv._list_outputs() + deconv.inputs.x1D_stop = True + assert not 'out_file' in deconv._list_outputs() \ No newline at end of file From 4798ba2f81a5eaa88d0f9c365d2bb50cb2dea58f Mon Sep 17 00:00:00 2001 From: Matteo Visconti dOC Date: Fri, 19 Jan 2018 14:31:46 -0500 Subject: [PATCH 11/11] Rename extra test, add auto test --- .../afni/tests/test_auto_Deconvolve.py | 232 ++++++++---------- ...deconvolve.py => test_extra_Deconvolve.py} | 0 2 files changed, 108 insertions(+), 124 deletions(-) rename nipype/interfaces/afni/tests/{test_deconvolve.py => test_extra_Deconvolve.py} (100%) diff --git a/nipype/interfaces/afni/tests/test_auto_Deconvolve.py b/nipype/interfaces/afni/tests/test_auto_Deconvolve.py index 3505f42eac..634b8c9dbf 100644 --- a/nipype/interfaces/afni/tests/test_auto_Deconvolve.py +++ b/nipype/interfaces/afni/tests/test_auto_Deconvolve.py @@ -4,137 +4,121 @@ def test_Deconvolve_inputs(): - input_map = dict(STATmask=dict(argstr='-STATmask %s', - ), - TR_1D=dict(argstr='-TR_1D %f', - ), - allzero_OK=dict(argstr='-allzero_OK', - ), - args=dict(argstr='%s', - ), - automask=dict(argstr='-automask', - ), - cbucket=dict(argstr='-cbucket %s', - ), - censor=dict(argstr='-censor %s', - ), - dmbase=dict(argstr='-dmbase', - ), - dname=dict(argstr='-D%s=%s', - ), - environ=dict(nohash=True, - usedefault=True, - ), - force_TR=dict(argstr='-force_TR %f', - position=0, - ), - fout=dict(argstr='-fout', - ), - global_times=dict(argstr='-global_times', - xor=['local_times'], - ), - glt_label=dict(argstr='-glt_label %d %s...', - position=-1, - requires=['gltsym'], - ), - gltsym=dict(argstr="-gltsym 'SYM: %s'...", - position=-2, - ), - goforit=dict(argstr='-GOFORIT %i', - ), - ignore_exception=dict(deprecated='1.0.0', - nohash=True, - usedefault=True, - ), - in_files=dict(argstr='-input %s', - copyfile=False, - position=1, - sep=' ', - ), - input1D=dict(argstr='-input1D %s', - ), - jobs=dict(argstr='-jobs %d', - ), - legendre=dict(argstr='-legendre', - ), - local_times=dict(argstr='-local_times', - xor=['global_times'], - ), - mask=dict(argstr='-mask %s', - ), - noblock=dict(argstr='-noblock', - ), - nocond=dict(argstr='-nocond', - ), - nodmbase=dict(argstr='-nodmbase', - ), - nolegendre=dict(argstr='-nolegendre', - ), - nosvd=dict(argstr='-nosvd', - ), - num_glt=dict(argstr='-num_glt %d', - position=-3, - ), - num_stimts=dict(argstr='-num_stimts %d', - position=-6, - ), - num_threads=dict(nohash=True, - usedefault=True, - ), - ortvec=dict(argstr='-ortvec %s %s', - ), - out_file=dict(argstr='-bucket %s', - ), - outputtype=dict(), - polort=dict(argstr='-polort %d', - ), - rmsmin=dict(argstr='-rmsmin %f', - ), - rout=dict(argstr='-rout', - ), - sat=dict(argstr='-sat', - xor=['trans'], - ), - singvals=dict(argstr='-singvals', - ), - stim_label=dict(argstr='-stim_label %d %s...', - position=-4, - requires=['stim_times'], - ), - stim_times=dict(argstr="-stim_times %d %s '%s'...", - position=-5, - ), - stim_times_subtract=dict(argstr='-stim_times_subtract %f', - ), - svd=dict(argstr='-svd', - ), - terminal_output=dict(deprecated='1.0.0', - nohash=True, - ), - tout=dict(argstr='-tout', - ), - trans=dict(argstr='-trans', - xor=['sat'], - ), - vout=dict(argstr='-vout', - ), - x1D=dict(argstr='-x1D %s', - ), - x1D_stop=dict(argstr='-x1D_stop', - ), + input_map = dict( + STATmask=dict(argstr='-STATmask %s', ), + TR_1D=dict(argstr='-TR_1D %f', ), + allzero_OK=dict(argstr='-allzero_OK', ), + args=dict(argstr='%s', ), + automask=dict(argstr='-automask', ), + cbucket=dict(argstr='-cbucket %s', ), + censor=dict(argstr='-censor %s', ), + dmbase=dict(argstr='-dmbase', ), + dname=dict(argstr='-D%s=%s', ), + environ=dict( + nohash=True, + usedefault=True, + ), + force_TR=dict( + argstr='-force_TR %f', + position=0, + ), + fout=dict(argstr='-fout', ), + global_times=dict( + argstr='-global_times', + xor=['local_times'], + ), + glt_label=dict( + argstr='-glt_label %d %s...', + position=-1, + requires=['gltsym'], + ), + gltsym=dict( + argstr="-gltsym 'SYM: %s'...", + position=-2, + ), + goforit=dict(argstr='-GOFORIT %i', ), + ignore_exception=dict( + deprecated='1.0.0', + nohash=True, + usedefault=True, + ), + in_files=dict( + argstr='-input %s', + copyfile=False, + position=1, + sep=' ', + ), + input1D=dict(argstr='-input1D %s', ), + jobs=dict(argstr='-jobs %d', ), + legendre=dict(argstr='-legendre', ), + local_times=dict( + argstr='-local_times', + xor=['global_times'], + ), + mask=dict(argstr='-mask %s', ), + noblock=dict(argstr='-noblock', ), + nocond=dict(argstr='-nocond', ), + nodmbase=dict(argstr='-nodmbase', ), + nolegendre=dict(argstr='-nolegendre', ), + nosvd=dict(argstr='-nosvd', ), + num_glt=dict( + argstr='-num_glt %d', + position=-3, + ), + num_stimts=dict( + argstr='-num_stimts %d', + position=-6, + ), + num_threads=dict( + nohash=True, + usedefault=True, + ), + ortvec=dict(argstr='ortvec %s', ), + out_file=dict(argstr='-bucket %s', ), + outputtype=dict(), + polort=dict(argstr='-polort %d', ), + rmsmin=dict(argstr='-rmsmin %f', ), + rout=dict(argstr='-rout', ), + sat=dict( + argstr='-sat', + xor=['trans'], + ), + singvals=dict(argstr='-singvals', ), + stim_label=dict( + argstr='-stim_label %d %s...', + position=-4, + requires=['stim_times'], + ), + stim_times=dict( + argstr="-stim_times %d %s '%s'...", + position=-5, + ), + stim_times_subtract=dict(argstr='-stim_times_subtract %f', ), + svd=dict(argstr='-svd', ), + terminal_output=dict( + deprecated='1.0.0', + nohash=True, + ), + tout=dict(argstr='-tout', ), + trans=dict( + argstr='-trans', + xor=['sat'], + ), + vout=dict(argstr='-vout', ), + x1D=dict(argstr='-x1D %s', ), + x1D_stop=dict(argstr='-x1D_stop', ), ) inputs = Deconvolve.input_spec() for key, metadata in list(input_map.items()): for metakey, value in list(metadata.items()): assert getattr(inputs.traits()[key], metakey) == value - - def test_Deconvolve_outputs(): - output_map = dict(cbucket=dict(), - out_file=dict(), - reml_script=dict(), - x1D=dict(), + output_map = dict( + cbucket=dict(), + out_file=dict(), + reml_script=dict(), + x1D=dict(), ) outputs = Deconvolve.output_spec() diff --git a/nipype/interfaces/afni/tests/test_deconvolve.py b/nipype/interfaces/afni/tests/test_extra_Deconvolve.py similarity index 100% rename from nipype/interfaces/afni/tests/test_deconvolve.py rename to nipype/interfaces/afni/tests/test_extra_Deconvolve.py