nipy / nipype

Workflows and interfaces for neuroimaging packages
https://nipype.readthedocs.org/en/latest/
Other
751 stars 530 forks source link

nipype.interfaces.spm.model use_vox_fdr_correction attribute error #3669

Open Claar727 opened 2 months ago

Claar727 commented 2 months ago

Summary

In the documentation for the Threshold method within the nipype SPM interface it shows use_vox_fdr_correction as an optional input with description "Whether to use voxel-based FDR correction for initial threshold (height_threshold_type has to be set to q-value)." Whenever I set this to True and set height_threshold_type to 'q-value' I get the error TraitError: Cannot set the undefined 'use_vox_fdr_correction' attribute of a 'ThresholdInputSpec' object. I tried importing ThresholdInputSpec directly and creating an instance to check its available attributes via dir and did not see use_vox_fdr_correction. I also tried setting the height_threshold_type to 'q-value' without including the use_vox_fdr_correction and got an error stating that 'q-value' was not a valid value for height_threshold_type. My workflow works perfectly if I use Topographical FDR or FWE. I can replicate the error using the code snippet below.

Using the inspect module to look at the Threshold definition (i.e., inspect.getsource(spm.Threshold) I can see that there is no use_vox_fdr_correction attribute but when I look through the github it appears in the Threshold class definition. Should I be using a different NiPyPe version to use this capability or should I clone the github instead of installing NiPyPe via pip? Any help is appreciated!

Actual behavior

TraitError

Expected behavior

Voxel-wise FDR correction of contrast images with significance level set via q-value.

How to replicate the behavior

import nipype.interfaces.spm as spm matlab_cmd = 'path/to/standalone/SPM12 path/to/mcr script' spm.SPMCommand.set_mlab_paths(matlab_cmd=matlab_cmd, use_mcr=True) spm.Threshold(height_threshold=0.05, height_threshold_type='q-value', use_vox_fdr_correction=True)

Script/Workflow details

NA Please put URL to code or code here (if not too long). import nipype.interfaces.spm as spm matlab_cmd = 'path/to/standalone/SPM12 path/to/mcr script' spm.SPMCommand.set_mlab_paths(matlab_cmd=matlab_cmd, use_mcr=True) spm.Threshold(height_threshold=0.05, height_threshold_type='q-value', use_vox_fdr_correction=True)

Platform details:

SPM version: 12.7771 MCR: v910 Python: 3.10.14 NiPyPe: 1.8.6 OS: Linux

{'commit_hash': '<not found>',
 'commit_source': '(none found)',
 'networkx_version': '3.3',
 'nibabel_version': '5.2.1',
 'nipype_version': '1.8.6',
 'numpy_version': '1.26.4',
 'pkg_path': '/blue/vabfmc/data/working/robert727/.conda/envs/cda2_nipype_wf/lib/python3.10/site-packages/nipype',
 'scipy_version': '1.13.0',
 'sys_executable': '/blue/vabfmc/data/working/robert727/.conda/envs/cda2_nipype_wf/bin/python',
 'sys_platform': 'linux',
 'sys_version': '3.10.14 | packaged by conda-forge | (main, Mar 20 2024, '
                '12:45:18) [GCC 12.3.0]',
 'traits_version': '6.3.2'}

Execution environment

Choose one

effigies commented 1 week ago

Is this resolved in 1.9.0?

Claar727 commented 1 week ago

Thanks for getting back to me and for what you do with NiPype, it's been super helpful with my PhD research.

I created a new conda environment with python version 3.11.10 just nipype 1.9.0 and its dependencies and ran my simple working example from above

import nipype.interfaces.spm as spm matlab_cmd = 'path/to/standalone/SPM12 path/to/mcr script' spm.SPMCommand.set_mlab_paths(matlab_cmd=matlab_cmd, use_mcr=True) spm.Threshold(height_threshold=0.05, height_threshold_type='q-value', use_vox_fdr_correction=True)

This raised the error

Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/blue/vabfmc/data/working/robert727/.conda/envs/test_nipype/lib/python3.11/site-packages/nipype/interfaces/spm/base.py", line 303, in __init__ super().__init__(**inputs) File "/blue/vabfmc/data/working/robert727/.conda/envs/test_nipype/lib/python3.11/site-packages/nipype/interfaces/base/core.py", line 204, in __init__ self.inputs.trait_set(**inputs) File "/blue/vabfmc/data/working/robert727/.conda/envs/test_nipype/lib/python3.11/site-packages/traits/has_traits.py", line 1509, in trait_set setattr(self, name, value) File "/blue/vabfmc/data/working/robert727/.conda/envs/test_nipype/lib/python3.11/site-packages/traits/base_trait_handler.py", line 74, in error raise TraitError( traits.trait_errors.TraitError: The 'height_threshold_type' trait of a ThresholdInputSpec instance must be 'p-value' or 'stat', but a value of 'q-value' <class 'str'> was specified.

Looking at the 1.9.0 documentation it still states

use_vox_fdr_correction (a boolean) – Whether to use voxel-based FDR correction for initial threshold (height_threshold_type has to be set to q-value). (Nipype default value: False)

and when I ran

>>> spm.Threshold(height_threshold=0.05, use_vox_fdr_correction=True)

it returned

<nipype.interfaces.spm.model.Threshold object at 0x1474eb8803d0>

with no error. So perhaps this issue was partially fixed, or maybe it was completely fixed and the documentation does not reflect it.