@@ -130,7 +130,8 @@ def _run_interface(self, runtime):
130
130
131
131
# Volume fractions of isotropic compartments
132
132
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 ())
134
135
if nballs == 1 :
135
136
vfs = vfs [..., np .newaxis ]
136
137
total_vf = np .sum (vfs , axis = 3 )
@@ -194,19 +195,25 @@ def _run_interface(self, runtime):
194
195
else :
195
196
dirs = np .hstack ((dirs , fd [msk > 0 ]))
196
197
197
-
198
198
sf_evals = list (self .inputs .diff_sf )
199
199
ba_evals = list (self .inputs .diff_iso )
200
200
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
+
202
206
args = []
203
207
for i in range (nvox ):
204
208
args .append (
205
209
{'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 ,
207
212
'gradients' : gtab ,
208
- 'mevals' : mevals
209
- })
213
+ 'mevals' : mevals ,
214
+ 'S0' : b0 [i ],
215
+ 'snr' : self .inputs .snr
216
+ })
210
217
211
218
n_proc = self .inputs .n_proc
212
219
if n_proc == 0 :
@@ -219,23 +226,14 @@ def _run_interface(self, runtime):
219
226
220
227
# Simulate sticks using dipy
221
228
iflogger .info (('Starting simulation of %d voxels, %d diffusion'
222
- ' directions.' ) % (len (args ), ndirs ))
229
+ ' directions.' ) % (len (args ), ndirs ))
223
230
result = np .array (pool .map (_compute_voxel , args ))
224
231
if np .shape (result )[1 ] != ndirs :
225
232
raise RuntimeError (('Computed directions do not match number'
226
233
'of b-values.' ))
227
234
228
235
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
239
237
240
238
simhdr = hdr .copy ()
241
239
simhdr .set_data_dtype (np .float32 )
@@ -279,10 +277,12 @@ def _compute_voxel(args):
279
277
# Simulate sticks
280
278
if sf_vf > 1.0e-3 :
281
279
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' ],
283
283
angles = args ['sticks' ],
284
284
fractions = ffs ,
285
- snr = None )
285
+ snr = snr )
286
286
else :
287
287
signal = np .zeros_like (gtab .bvals , dtype = np .float32 )
288
288
0 commit comments