We seem to have a problem with nipype's concept of mutually exclusive.
Nipype uses two trait options: mandatory and xor to determine whether a parameter should be defined (different from Undefined).
The trait of a parameter_1 must have a defined value if it has mandatory = True.
But it doesn't stop there. There's also the xor option which, if defined, is a list of parameters that cannot exist concomitantly with parameter_1.
For example, for spm's Normalize12 process, the nipype traits for the following input parameters have these options:
The issue is that Process.get_missing_mandatory_parameters() doesn't take xor into account. It only looks if the parameter is mandatory and has a value. This produces false positives in the case of mutually exclusive parameters...
In mia_processes we can handle this upstream, but when it's a process coming directly from nipype, if, for example in the case above, image_to_align = Apath/to/data.nii' and deformation_file = Undefined, Process.get_missing_mandatory_parameters() return [deformation_file] whereas since the parameters are mutually exclusive, there's no missing parameter here ...
For a complete overview we actually have two issues.
1- The false positive generated in capsul which prevents calculation from starting in Mia
and
2- The raising of an exception by nipype if two mutually exclusive parameters have a value (in the example above image_to_align and deformation_file have a value) which crash Mia.
The two are linked with the concept of Nipype's mutually exclusive, but this ticket is only concerning 1- (I will see 2- later).
We seem to have a problem with nipype's concept of mutually exclusive.
Nipype uses two trait options:
mandatory
andxor
to determine whether a parameter should be defined (different from Undefined). The trait of a parameter_1 must have a defined value if it hasmandatory
= True. But it doesn't stop there. There's also thexor
option which, if defined, is a list of parameters that cannot exist concomitantly with parameter_1.For example, for spm's Normalize12 process, the nipype traits for the following input parameters have these options:
deformation_file: xor = ['image_to_align', 'tpm'] mandatory = True
image_to_align: mandatory = True xor = ['deformation_file']
tpm: xor = ['deformation_file'] mandatory = False
The issue is that Process.get_missing_mandatory_parameters() doesn't take
xor
into account. It only looks if the parameter is mandatory and has a value. This produces false positives in the case of mutually exclusive parameters...In mia_processes we can handle this upstream, but when it's a process coming directly from nipype, if, for example in the case above,
image_to_align
= Apath/to/data.nii' anddeformation_file
= Undefined, Process.get_missing_mandatory_parameters() return [deformation_file] whereas since the parameters are mutually exclusive, there's no missing parameter here ...For a complete overview we actually have two issues. 1- The false positive generated in capsul which prevents calculation from starting in Mia
2- The raising of an exception by nipype if two mutually exclusive parameters have a value (in the example above
image_to_align
anddeformation_file
have a value) which crash Mia.The two are linked with the concept of Nipype's mutually exclusive, but this ticket is only concerning 1- (I will see 2- later).
I will propose a fix for 1-