@@ -179,25 +179,27 @@ def _list_outputs(self):
179
179
180
180
class EstimateModelInputSpec (SPMCommandInputSpec ):
181
181
spm_mat_file = File (exists = True , field = 'spmmat' ,
182
- desc = 'absolute path to SPM.mat' ,
183
- copyfile = True ,
184
- mandatory = True )
185
- estimation_method = traits .Dict ( traits . Enum ('Classical' , 'Bayesian2' ,
186
- 'Bayesian' ) ,
187
- field = 'method' ,
188
- desc = ( 'Classical, Bayesian2, '
189
- 'Bayesian (dict)' ) ,
190
- mandatory = True )
191
- flags = traits .Str (desc = 'optional arguments (opt) ' )
182
+ copyfile = True , mandatory = True ,
183
+ desc = 'Absolute path to SPM.mat' )
184
+ estimation_method = traits . Dict (
185
+ traits .Enum ('Classical' , 'Bayesian2' , 'Bayesian' ) ,
186
+ field = 'method' , mandatory = True ,
187
+ desc = ( 'Dictionary of either Classical: 1, Bayesian: 1, '
188
+ 'or Bayesian2: 1 (dict)' ))
189
+ write_residuals = traits . Bool ( field = 'write_residuals' ,
190
+ desc = "Write individual residual images" )
191
+ flags = traits .Dict (desc = 'Additional arguments' )
192
192
193
193
194
194
class EstimateModelOutputSpec (TraitedSpec ):
195
195
mask_image = File (exists = True ,
196
- desc = 'binary mask to constrain estimation' )
196
+ desc = 'binary mask to constrain estimation' )
197
197
beta_images = OutputMultiPath (File (exists = True ),
198
- desc = 'design parameter estimates' )
198
+ desc = 'design parameter estimates' )
199
199
residual_image = File (exists = True ,
200
- desc = 'Mean-squared image of the residuals' )
200
+ desc = 'Mean-squared image of the residuals' )
201
+ residual_images = OutputMultiPath (File (exists = True ),
202
+ desc = "individual residual images (requires `write_residuals`" )
201
203
RPVimage = File (exists = True , desc = 'Resels per voxel image' )
202
204
spm_mat_file = File (exists = True , desc = 'Updated SPM mat file' )
203
205
@@ -225,7 +227,7 @@ def _format_arg(self, opt, spec, val):
225
227
return np .array ([str (val )], dtype = object )
226
228
if opt == 'estimation_method' :
227
229
if isinstance (val , (str , bytes )):
228
- return {'%s' % val : 1 }
230
+ return {'{}' . format ( val ) : 1 }
229
231
else :
230
232
return val
231
233
return super (EstimateModel , self )._format_arg (opt , spec , val )
@@ -235,7 +237,8 @@ def _parse_inputs(self):
235
237
"""
236
238
einputs = super (EstimateModel , self )._parse_inputs (skip = ('flags' ))
237
239
if isdefined (self .inputs .flags ):
238
- einputs [0 ].update (self .inputs .flags )
240
+ einputs [0 ].update ({flag : val for (flag , val ) in
241
+ self .inputs .flags .items ()})
239
242
return einputs
240
243
241
244
def _list_outputs (self ):
@@ -262,6 +265,9 @@ def _list_outputs(self):
262
265
rpv = os .path .join (pth , 'RPV.nii' )
263
266
else :
264
267
rpv = os .path .join (pth , 'RPV.img' )
268
+ if self .inputs .write_residuals :
269
+ outres = [x for x in glob (os .path .join (pth , 'Res_*' ))]
270
+ outputs ['residual_images' ] = outres
265
271
outputs ['RPVimage' ] = rpv
266
272
spm = os .path .join (pth , 'SPM.mat' )
267
273
outputs ['spm_mat_file' ] = spm
0 commit comments