Freesurfer Subparcellation
Freesurfer annotations and labels describe swaths of cortical regions, defined anatomically during the recon-all process, or functionally or statistically (e.g., significant GLM clusters). Tools exist to further subdivide these regions to the desired level of granularity.
Using mris_divide_parcellation
This program divides one or more parcellations into divisions perpendicular to the long axis of the label. The number of divisions can be specified in one of two ways, depending upon the nature of the fourth argument.
First, a splitfile can be specified as the fourth argument. The splitfile is a text file with two columns. The first column is the name of the label in the source annotation, and the second column is the number of units that label should be divided into. The names of the labels depends upon the source parcellation. For aparc.annot and aparc.a2005.annot, the names can be found in $FREESURFER_HOME/FreeSurferColorLUT.txt. For aparc.annot, the labels are between the ranges of 1000-1034. For aparc.a2005s.annot, the labels are between the ranges of 1100-1181. The name for the label is the name of the segmentation without the 'ctx-lh'. Note that the name included in the splitfile does not indicate the hemisphere. For example, 1023 is 'ctx-lh-posteriorcingulate'. You should put 'posteriorcingulate' in the splitfile. Eg, to divide it into three segments, the following line should appear in the splitfile:
posteriorcingulate 3
Only labels that should be split need be specified in the splitfile.
The second method is to specify an area threshold (in mm^2) as the fourth argument, in which case each label is divided until each subdivision is smaller than the area threshold.
The output label name will be the original name with _divN appended, where N is the division number. N will go from 2 to the number of divisions. The first division has the same name as the original label.
Sample Split File (Functional Clusters)
In this example, I have carried out a one-sample group mean (OSGM) analysis and did a cluster-size threshold. This saved a number of clusters in two .annot files (one in each hemisphere). There are also some *.cluster.summary files in this directory. Reading these files, I see the smallest clusters are about 120mm2. I would like to subdivide the larger clusters so that they are all between about 100-150mm2. I load the corresponding .annot file in Freesurfer just to verify the cluster names (the summary file lists 10 clusters, but the names do not follow a consistent naming convention). From the file, I see that clusters 1,2,3,4,6 and 8 need to be subdivided. Simple division by the desired cluster size tells me the number of divisions I want for each cluster:
echo cluster-001 6 > rsplittable.txt echo cluster-002 7 >> rsplittable.txt echo cluster-003 5 >> rsplittable.txt echo cluster-004 5 >> rsplittable.txt echo cluster-006 2 >> rsplittable.txt echo cluster-008 2 >> rsplittable.txt
Repeat the process for the lh clusters, creating an lsplittable.txt file.
The group analysis used the fsaverage surface. Since mris_divide_parcellation assumes we're subdividing a particular subject's annotation, it makes sense to copy the source .annot files into the fsaverage label/ folder (giving the appropriate ?h prefix)
cp cache.th30.abs.sig.ocn.annot \ $SUBJECTS_DIR\fsaverage\label\rh.cache.th30.abs.sig.ocn.annot
Then call the program thus (assuming that rsplittable.txt is in your current working directory):
mris_divide_parcellation fsaverage rh \ cache.th30.abs.sig.ocn.annot rsplittable.txt \ functional_subclusters
Program output:
reading colortable from annotation file... colortable with 11 entries read (originally none) interpreting 4th command line arg as split file name dividing cluster-001 (1) into 6 parts dividing cluster-002 (2) into 7 parts dividing cluster-003 (3) into 5 parts dividing cluster-004 (4) into 5 parts dividing cluster-006 (6) into 2 parts dividing cluster-008 (8) into 2 parts allocating new colortable with 31 additional units... saving annotation to functional_subclusters
Repeat for lh.
Note: the first time I ran this, I have no idea where the rh.functional_subclusters.annot file went! Running the lh and re-running the rh subparcellation generated the expected files in the fsaverage/label directory.
Check Subparcellation
Presumably the python wrapper does this iteratively because all subdivisions are done along the same axis. As I discovered , when you have a roughly circular region, you end up with a striped series of regions (beloq). In this case, it might be best to subdivide larger regions over a series of calls (e.g., divide cluster_001 into three in the first call, then divide each third in half on the second call, then divide the sixths in half on the third call).