def surface_transform(vals, subj, hemi, direction="reverse"):
"""Transform a surface scalar map using spherical transform.
Parameters
----------
vals : array or Series
Scalar value map to transform.
subj : string
Freesurfer subject ID.
hemi : lh | rh
Hemisphere data are defined on
direction : reverse | forward
Whether transformation should be from group space to subject space
(reverse) or the other direction (forward).
Returns
-------
out_vals : array or Series
Scalar value map defined on new surface.
"""
data_dir = PROJECT["data_dir"]
sphere_reg_fname = op.join(data_dir, subj, "surf", hemi + ".sphere.reg")
avg_sphere_fname = op.join(data_dir, "fsaverage/surf", hemi + ".sphere")
sphere_reg, _ = nib.freesurfer.read_geometry(sphere_reg_fname)
avg_sphere, _ = nib.freesurfer.read_geometry(avg_sphere_fname)
if direction.startswith("f"):
src_sphere, trg_sphere = sphere_reg, avg_sphere
elif direction.startswith("r"):
src_sphere, trg_sphere = avg_sphere, sphere_reg
interpolator = interpolate.NearestNDInterpolator(src_sphere, vals)
out_vals = interpolator(trg_sphere)
if isinstance(vals, pd.Series):
out_vals = pd.Series(out_vals)
return out_vals
评论列表
文章目录