@@ -130,7 +130,8 @@ def _run_interface(self, runtime):
130130
131131 # Volume fractions of isotropic compartments
132132 nballs = len (self .inputs .in_vfms )
133- vfs = np .squeeze (nb .concat_images ([nb .load (f ) for f in self .inputs .in_vfms ]).get_data ())
133+ vfs = np .squeeze (nb .concat_images (
134+ [nb .load (f ) for f in self .inputs .in_vfms ]).get_data ())
134135 if nballs == 1 :
135136 vfs = vfs [..., np .newaxis ]
136137 total_vf = np .sum (vfs , axis = 3 )
@@ -194,19 +195,25 @@ def _run_interface(self, runtime):
194195 else :
195196 dirs = np .hstack ((dirs , fd [msk > 0 ]))
196197
197-
198198 sf_evals = list (self .inputs .diff_sf )
199199 ba_evals = list (self .inputs .diff_iso )
200200
201- mevals = [sf_evals ] * nsticks + [[ba_evals [d ]]* 3 for d in range (nballs )]
201+ mevals = [sf_evals ] * nsticks + \
202+ [[ba_evals [d ]] * 3 for d in range (nballs )]
203+ ba_sticks = [(1.0 , 0.0 , 0.0 )] * nballs
204+ b0 = b0_im .get_data ()[msk > 0 ]
205+
202206 args = []
203207 for i in range (nvox ):
204208 args .append (
205209 {'fractions' : fracs [i , ...].tolist (),
206- 'sticks' : [tuple (dirs [i , j :j + 3 ]) for j in range (nsticks )] + [(1.0 , 0.0 , 0.0 )] * nballs ,
210+ 'sticks' : [tuple (dirs [i , j :j + 3 ])
211+ for j in range (nsticks )] + ba_sticks ,
207212 'gradients' : gtab ,
208- 'mevals' : mevals
209- })
213+ 'mevals' : mevals ,
214+ 'S0' : b0 [i ],
215+ 'snr' : self .inputs .snr
216+ })
210217
211218 n_proc = self .inputs .n_proc
212219 if n_proc == 0 :
@@ -219,23 +226,14 @@ def _run_interface(self, runtime):
219226
220227 # Simulate sticks using dipy
221228 iflogger .info (('Starting simulation of %d voxels, %d diffusion'
222- ' directions.' ) % (len (args ), ndirs ))
229+ ' directions.' ) % (len (args ), ndirs ))
223230 result = np .array (pool .map (_compute_voxel , args ))
224231 if np .shape (result )[1 ] != ndirs :
225232 raise RuntimeError (('Computed directions do not match number'
226233 'of b-values.' ))
227234
228235 signal = np .zeros ((shape [0 ], shape [1 ], shape [2 ], ndirs ))
229- signal [msk > 0 ] += result
230-
231- # Add noise
232- if self .inputs .snr > 0 :
233- signal [msk > 0 ] = add_noise (signal [msk > 0 ], self .inputs .snr , 1 )
234-
235- # S0
236- b0 = b0_im .get_data ()
237- for i in xrange (ndirs ):
238- signal [..., i ] *= b0
236+ signal [msk > 0 ] = result
239237
240238 simhdr = hdr .copy ()
241239 simhdr .set_data_dtype (np .float32 )
@@ -279,10 +277,12 @@ def _compute_voxel(args):
279277 # Simulate sticks
280278 if sf_vf > 1.0e-3 :
281279 ffs = ((np .array (ffs ) / sf_vf ) * 100 )
282- signal , _ = multi_tensor (gtab , args ['mevals' ], S0 = 1.0 ,
280+ snr = args ['snr' ] if args ['snr' ] > 0 else None
281+ signal , _ = multi_tensor (gtab , args ['mevals' ],
282+ S0 = args ['S0' ],
283283 angles = args ['sticks' ],
284284 fractions = ffs ,
285- snr = None )
285+ snr = snr )
286286 else :
287287 signal = np .zeros_like (gtab .bvals , dtype = np .float32 )
288288
0 commit comments