mne-python
mne-python copied to clipboard
ENH: API for subcortical surface source spaces
It turns out (I think!) you can take just about any subcortical ROI and turn it into a surface using a few FreeSurfer commands:
mri_tessellate aseg.mgz 17 lh.hippocampus.orig
mri_tessellate aseg.mgz 53 rh.hippocampus.orig
mris_extract_main_component lh.hippocampus.orig lh.hippocampus.orig
mris_extract_main_component rh.hippocampus.orig rh.hippocampus.orig
mris_smooth -nw lh.hippocampus.orig lh.hippocampus.smooth
mris_smooth -nw rh.hippocampus.orig rh.hippocampus.smooth
The .smooth surfaces look reasonable for the MNE sample subject:

And they can be inflated to a sphere (so that they can be subdivided via ico/oct) with:
mris_inflate -no-save-sulc lh.hippocampus.smooth lh.hippocampus.inflated
mris_inflate -no-save-sulc rh.hippocampus.smooth rh.hippocampus.inflated
mris_sphere -q lh.hippocampus.inflated lh.hippocampus.qsphere
mris_sphere -q rh.hippocampus.inflated rh.hippocampus.qsphere
Here is a starting API proposal:
setup_source_space(..., surf='...')allowsurfto be a list/tuple of names in aseg.mgz, not justsurf/files. The default would stay'white', which is an alias for (as would bepialand other cortical surfaces)('lh.white', 'rh.white')to create a cortical surface source space.- Currently we use
FIFF.FIFFV_MNE_SURF_LEFT_HEMI = 101for left, 102 for right; maybe we should use1000+aseg_valuefor any non-cortical surface, and left/right hemi would keep their "special" / exceptional values of 101 and 102 (their numbers inaseg.mgzappear to be 2 or 3 and 41 or 42) - The
.kindfor aSourceSpaceswith just these surfaces would be not'surf'(keep this for cortical surf source spaces only) but instead'subcortical_surf'or something. And combinations of cortical surf + subcortical surf would be, as usual,'mixed'. - Figure out morphing somehow. In theory we might be able to do this procedure for
fsaverageand use FreeSurfer commands to align the surfaces (make.sphereinstead of just.qspheresurfaces). Now thatmake_morph_mapsis not horribly slow anymore, creating the morph maps on the fly might be acceptable since these surfaces in general will have way fewer vertices. - Improve plotting to support multiple surfaces.
sounds good !
From a meeting with @jasmainak it seems like a tentative workable plan is:
- Leave subcortical segmentation to a separate Python package for now (it's a hard problem that takes a while to run, so a separate tool makes sense)
- Get that package to output FreeSurfer-compatible
.surffiles tosubjects_dir/subject/...somewhere (surf/subcort.lh.*?) - Build source space support for those files using a variant of the API above. Depending on how FreeSurfer-like the outputs are, it might make sense to create a separate
mne.setup_subcortical_source_space, e.g., if thespacingparameter no longer makes sense. - Figure out how to support across-subject smoothing using
SourceMorph
Good next steps would be:
- [x] @jasmainak share code with me for segmenting cerebellum with me
- [ ] I run it on
sample - [ ] Examine outputs
- [ ] Try hacking something with
mne.setup_source_spacefrom it, then forward, then inverse. Then visualize traces withmatplotlibfor now