Skip to content

Commit

Permalink
FIX: Mask fieldmap before fitting spline field
Browse files Browse the repository at this point in the history
Previously, we fit a spline field to the within-mask portion of a
fieldmap, which could lead to large peaks outside the mask. Applying the
mask to the reconstructed field can produce discontinuities in
resampling. Instead of attempting to attenuate the peaks outside the
mask in a smooth way, we set the fit values outside the mask to zero,
and let the spline fit find a smooth field.

In practice, we've found that even fields with large peaks on the edge
of the mask are well fit by this method.
  • Loading branch information
effigies committed Sep 29, 2023
1 parent 71a9ae3 commit d518851
Showing 1 changed file with 2 additions and 1 deletion.
3 changes: 2 additions & 1 deletion sdcflows/interfaces/bspline.py
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,7 @@ def _run_interface(self, runtime):
center = np.mean(data[mask])

data -= center
data[~mask] = 0

# Calculate collocation matrix from (possibly resized) image and knot grids
colmat = sparse_hstack(
Expand All @@ -214,7 +215,7 @@ def _run_interface(self, runtime):
alpha=self.inputs.ridge_alpha, fit_intercept=False, solver="lsqr"
)
for attempt in range(3):
model.fit(colmat[mask.reshape(-1), :], data[mask])
model.fit(colmat, data.reshape(-1))
extreme = np.abs(model.coef_).max()
LOGGER.debug(f"Model fit attempt {attempt}: max(|coeffs|) = {extreme}")
# Normal values seem to be ~1e2, bad ~1e8. May want to tweak this if
Expand Down

0 comments on commit d518851

Please sign in to comment.