Skip to content

Instantly share code, notes, and snippets.

@margulies
Last active August 1, 2018 15:33
Show Gist options
  • Save margulies/68213451e1b22612537eda318425dd7b to your computer and use it in GitHub Desktop.
Save margulies/68213451e1b22612537eda318425dd7b to your computer and use it in GitHub Desktop.
function to calculate distance matrix between freesurfer labels
import nibabel as nib, numpy as np, os, sys
#sys.path.insert(0,'../')
import surfdist as sd
from surfdist import viz, load, utils
# function to calculate distance matrix:
def dist_calc_matrix(surf, cortex, labels, exceptions = ['Unknown', 'Medial_wall'], dist_type='min'):
"""
dist_type='min' or 'mean'
returns:
dist_mat: symmetrical nxn matrix of minimum distance between pairs of labels
rois: label names in order of n
"""
import gdist
from surfdist.utils import surf_keep_cortex, translate_src, recort
import numpy as np
cortex_vertices, cortex_triangles = surf_keep_cortex(surf, cortex)
# remove exceptions from label list:
label_list = sd.load.get_freesurfer_label(labels, verbose = False)
rs = np.where([a not in exceptions for a in label_list])[0]
rois = [label_list[r] for r in rs]
print "# of regions: " + str(len(rois))
# calculate distance from each region to all nodes:
dist_roi = []
for roi in rois:
source_nodes = sd.load.load_freesurfer_label(labels, roi)
translated_source_nodes = translate_src(source_nodes, cortex)
dist_roi.append(gdist.compute_gdist(cortex_vertices, cortex_triangles,
source_indices = translated_source_nodes))
print roi
dist_roi = np.array(dist_roi)
# Calculate distance per region:
dist_mat = []
for roi in rois:
source_nodes = sd.load.load_freesurfer_label(labels, roi)
translated_source_nodes = translate_src(source_nodes, cortex)
if dist_type == 'min':
dist_mat.append(np.min(dist_roi[:,translated_source_nodes], axis = 1))
if dist_type == 'mean':
dist_mat.append(np.mean(dist_roi[:,translated_source_nodes], axis = 1))
dist_mat = np.array(dist_mat)
return dist_mat, rois
#######################################################################################################
######################################## Begin here ###################################################
#######################################################################################################
# inputs:
base_dir = '/Applications/freesurfer/subjects/'
surf = nib.freesurfer.read_geometry(os.path.join(base_dir, 'fsaverage5/surf/lh.pial'))
cortex = np.sort(nib.freesurfer.read_label(os.path.join(base_dir, 'fsaverage5/label/lh.cortex.label')))
labels = os.path.join(base_dir, 'fsaverage5/label/lh.aparc.a2009s.annot')
# calculate minimum distance between all pairs of labels:
dist_mat, rois = dist_calc_matrix(surf, cortex, labels, exceptions = ['Unknown', 'Medial_wall'], dist_type='min')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment