Skip to content

Commit b2493fa

Browse files
authored
Merge pull request #354 from effigies/fix/reorient-fmap
FIX: Reorient fieldmaps to RAS before estimating B-splines
2 parents 5ef62fc + 03b9e8a commit b2493fa

File tree

1 file changed

+17
-8
lines changed

1 file changed

+17
-8
lines changed

sdcflows/interfaces/bspline.py

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ def _run_interface(self, runtime):
140140

141141
# Load in the fieldmap
142142
fmapnii = nb.load(self.inputs.in_data)
143+
fmapnii = nb.as_closest_canonical(fmapnii)
143144
zooms = fmapnii.header.get_zooms()
144145

145146
# Get a mask (or define on the spot to cover the full extent)
@@ -148,6 +149,8 @@ def _run_interface(self, runtime):
148149
if isdefined(self.inputs.in_mask)
149150
else None
150151
)
152+
if masknii is not None:
153+
masknii = nb.as_closest_canonical(masknii)
151154

152155
# Determine the shape of bspline coefficients
153156
# This should not change with resizing, so do it first
@@ -178,17 +181,20 @@ def _run_interface(self, runtime):
178181
)
179182

180183
# Recenter the fieldmap
184+
center = 0
181185
if self.inputs.recenter == "mode":
182186
from scipy.stats import mode
183187

184188
# Handle pre- and post-1.9 mode behavior.
185189
# squeeze can be dropped when the minimum version reaches 1.9
186190
# Will become: data -= mode(data[mask], keepdims=False).mode
187-
data -= np.squeeze(mode(data[mask]).mode)
191+
center = np.squeeze(mode(data[mask]).mode)
188192
elif self.inputs.recenter == "median":
189-
data -= np.median(data[mask])
193+
center = np.median(data[mask])
190194
elif self.inputs.recenter == "mean":
191-
data -= np.mean(data[mask])
195+
center = np.mean(data[mask])
196+
197+
data -= center
192198

193199
# Calculate collocation matrix from (possibly resized) image and knot grids
194200
colmat = sparse_vstack(grid_bspline_weights(fmapnii, grid) for grid in bs_grids).T.tocsr()
@@ -224,11 +230,14 @@ def _run_interface(self, runtime):
224230
# Interpolating in the original grid will require a new collocation matrix
225231
if need_resize:
226232
fmapnii = nb.load(self.inputs.in_data)
227-
data = fmapnii.get_fdata(dtype="float32")
228-
mask = (
229-
np.ones_like(fmapnii.dataobj, dtype=bool) if masknii is None
230-
else np.asanyarray(nb.load(self.inputs.in_mask).dataobj) > 1e-4
231-
)
233+
fmapnii = nb.as_closest_canonical(fmapnii)
234+
data = fmapnii.get_fdata(dtype="float32") - center
235+
if masknii is not None:
236+
masknii = nb.load(self.inputs.in_mask)
237+
masknii = nb.as_closest_canonical(masknii)
238+
mask = np.asanyarray(masknii.dataobj) > 1e-4
239+
else:
240+
mask = np.ones_like(fmapnii.dataobj, dtype=bool)
232241
colmat = sparse_vstack(
233242
grid_bspline_weights(fmapnii, grid) for grid in bs_grids
234243
).T.tocsr()

0 commit comments

Comments
 (0)