-
Notifications
You must be signed in to change notification settings - Fork 1
/
SpectralParcellation.m
181 lines (125 loc) · 5.19 KB
/
SpectralParcellation.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
function res = SpectralParcellation(subjectlist,hemisphere,weight,Nclus,pathToData,wbCommand)
% % Groupwise parcellation using multiscale spectral clustering
%%%%%% INPUTS %%%%%%
% % subjectlist: cell array of strings listing the ID of the subjects to be parcellated
% % hemisphere: 'L' or 'R', whether parcellating the left or right hemisphere
% % weight: multiplicative weight for the inter-subjects links
% % pathToData: base path where the data is stored
% % wbCommand: workbench command, typically
% 'path/to/workbench/installation/wb_command'
% % Nclus: Number of desired parcels
%%%%%% OUTPUTS %%%%%%
% % res: structure containing the obtained parcellation and merged
% connectivity matrices for all subjects
% res structure fields:
% -parcellation: number of vertices x number of subjects, describes for each subject
% the parcel assignment of each vertex
% -Mat: number of parcels x number of parcels x number of subjects, describes the low
% dimensionality connectivity networl obtained after parcellation for each subject.
% -Inlist: cell array, number of subjects x 1, each cell Inlist{i}{j} lists which
% vertices belong to parcel j for subject i. Another way of describing the parcel assignments.
% Copyright (C) Sarah Parisot, Imperial College London, 2015
%
%This program is free software: you can redistribute it and/or modify
%it under the terms of the GNU General Public License as published by
%the Free Software Foundation, either version 3 of the License, or
%(at your option) any later version.
%
%This program is distributed in the hope that it will be useful,
%but WITHOUT ANY WARRANTY; without even the implied warranty of
%MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
%GNU General Public License for more details.
%
%You should have received a copy of the GNU General Public License
%along with this program. If not, see <http://www.gnu.org/licenses/>.
%% Preprocessing: compute the correlation matrix and load structural data
% path to tractography data, TO MODFIFY based on data organisation
pathToCorMat = '/diffusion/preprocessed/T1w/probtrack/';
% path where temporary files are saved, has to be subject specific
for i=1:numel(subjectlist)
savePath{i} = [pathToData subjectlist{i} pathToCorMat hemisphere];
end
R=cell(numel(subjectlist),numel(subjectlist));
match=cell(numel(subjectlist),numel(subjectlist));
for i=1:numel(subjectlist)
subjectID = subjectlist{i};
if ~exist([savePath{i} '/SCM.mat'])
%%% load useful structural data
data = loadSubjectData(subjectID,hemisphere,pathToData);
%%% Get the correlation matrix
CorMat = ComputeCorrelationMatrix(subjectID,pathToData,pathToCorMat,wbCommand);
%%% Create supervertices
SCmatrix = MultiAffinity(data.Sphere,data.BrainSurf,data.roi,CorMat,data.Mat,1,data.LV);
%%% saving results (better for memory than loading all data and SCmatrices at once)
cd(savePath{i})
save('SCM.mat','SCmatrix','data')
clear SCmatrix
clear CorMat
end
%% Construction of inter-subjects links
for j=1:numel(subjectlist)
Subject2=subjectlist{j};
disp(Subject2)
if strcmp(subjectID,Subject2)
continue
end
cd(savePath{i})
load SCM.mat
SCmatrix1=SCmatrix;
cd(savePath{j})
load SCM.mat
SCmatrix2=SCmatrix;
clear SCMatrix
data.Mat=[];
[R{i,j},match{i,j}] = ComputePWlinks(SCmatrix1,SCmatrix2,data);
end
end
%% Do the groupwise parcellation
%%% load all subject data and set up some parameters
for i=1:numel(subjectlist)
cd(savePath{i})
load('SCM.mat','SCmatrix');
SCmatrices{i}=SCmatrix;
clear SCmatrix
end
Nlayers=length(SCmatrices{1}.baseSeg.Seeds);
layer =1; %% supervertex resolution on which the parcellation is visualised
for i=1:Nlayers
nC(i)=numel(SCmatrices{1}.baseSeg.Seeds{i});
end
tmp=[SCmatrices{:}];
C={tmp(:).C};
tmp = [tmp(:).baseSeg];
%%% Parcellation
[Wtot,C,d]=BuildMatrices(C,[tmp(:).Cor],R,nC,weight);
[NcutDiscrete,NcutEigenvectors,Eigenvalues]=Ncut_multi(Wtot,C,d,Nclus);
clear tmp
%%% Project parcellation on the brain surface
for j=1:numel(subjectlist)
cd(savePath{j})
load('SCM.mat','data');
sN=j-1;
if sN==0
Map=zeros(length(data.BrainSurf.vertices),numel(subjectlist));
end
%%% offset to find the subject's parcellation in the global parcellation
%%% matrix
offset=sN*sum(nC(1:Nlayers))+sum(nC(1:layer-1));
for i=offset+1:nC(layer)+offset
Map(SCmatrices{sN+1}.baseSeg.Maps{layer}==i-offset,j)=find(NcutDiscrete(i,:)==1);
end
%%% Compute the merged connectivity profiles and normalise them
[Corr(:,:,j),Inlist{j}] = MergeConnectivityMatrix2(1:Nclus,Map(data.Inc,j),data.Mat(data.Inc,data.Inc),data.Inc);
for i=1:Nclus
if numel(Inlist{j}{i})==0
dg(i)=1;
else
dg(i)=numel(Inlist{j}{i});
end
end
Corr(:,:,j)=bsxfun(@rdivide,Corr(:,:,j),dg');
end
res.parcellation=Map;
res.Mat=Corr;
res.Inlist=Inlist;
end