123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 |
- function spm_dcm_graph(xY,A)
- % Region and anatomical graph display
- % FORMAT spm_dcm_graph(xY,[A])
- % xY - cell of region structures (see spm_regions) (fMRI)
- % or ECD locations xY.Lpos and xY.Sname (EEG)
- % A - connections of weighted directed graph
- %__________________________________________________________________________
- % Copyright (C) 2010-2014 Wellcome Trust Centre for Neuroimaging
- % Karl Friston
- % $Id: spm_dcm_graph.m 6012 2014-05-22 18:21:41Z guillaume $
- % get dimensions, locations and names
- %--------------------------------------------------------------------------
- try
- % fMRI
- %----------------------------------------------------------------------
- m = size(xY,2);
- L = [];
- for i = 1:m
- L = [L xY(i).xyz];
- name{i} = xY(i).name(1:min(end,3));
- end
-
- catch
-
- % EEG
- %----------------------------------------------------------------------
- L = xY.Lpos;
- name = xY.Sname;
-
- end
- % display parameters
- %--------------------------------------------------------------------------
- col = {'b','g','r','c','m','y','k','w'};
- m = size(L,2);
- %-Render graph in anatomical space
- %==========================================================================
- ax = subplot(2,1,1); cla(ax);
- set(ax,'position',[0 .5 1 .5])
- options.query = [];
- options.hfig = ancestor(ax,'figure');
- options.ParentAxes = ax;
- options.markersize = 32;
- options.meshsurf = fullfile(spm('Dir'),'canonical','iskull_2562.surf.gii');
- spm_eeg_displayECD(L(:,1),[],0,[],options);
- options.meshsurf = fullfile(spm('Dir'),'canonical','cortex_8196.surf.gii');
- h = spm_eeg_displayECD(L,[],8,name,options);
- set(h.handles.ht,'FontWeight','bold')
- set(h.handles.mesh,'FaceAlpha',1/16);
- % return if no connectivity
- %--------------------------------------------------------------------------
- if nargin < 2, return, end
- % check for cell array connections (EEG)
- %--------------------------------------------------------------------------
- if iscell(A)
- W = 0;
- C = 0;
- for i = 1:length(A)
- C = C + abs(exp(A{i}));
- W = W + max(C,C');
- end
- A = C;
-
- elseif isnumeric(A)
- W = max(abs(A),abs(A'));
-
- else
- W = [];
- end
- % Connections - if weights (W) are defined
- %--------------------------------------------------------------------------
- if numel(W)
-
- W = W - diag(diag(W));
- W = 3*W/max(W(:));
- W = W.*(W > 1/128);
- for i = 1:length(A)
- for j = (i + 1):length(A)
- if W(i,j)
-
- % associate colour with the strongest influence
- %----------------------------------------------------------
- if abs(A(i,j)) > abs(A(j,i)), c = j; else c = i; end
- k = rem(c - 1,length(col)) + 1;
- line(L(1,[i j]),L(2,[i j]),L(3,[i j]),'Color',col{k},...
- 'LineStyle','-',...
- 'LineWidth',W(i,j));
- end
- end
- end
- end
- %-Render graph in functional space (with the locations U)
- %==========================================================================
- if isstruct(A)
-
- P.A = zeros(m,m);
- P = spm_dcm_fmri_graph_gen([],A,P);
- W = P.A;
-
- i = 1:min(size(A.x,1),3);
- U = zeros(3,m);
- U(i,:) = A.x(i,:);
- A = W;
- W = sign(W);
-
- else
-
- % Multidimensional scaling (with the Weighted Graph Laplacian)
- %----------------------------------------------------------------------
- D = diag(sum(W));
- G = D - W;
- [U,V] = eig(full(spm_pinv(G)));
- U = U*sqrt(V);
- [V,i] = sort(-diag(V));
- U = U(:,i(1:3))';
-
- end
- % Procrustean transform
- %----------------------------------------------------------------------
- U = spm_detrend(U')';
- U = real(U*40/max(abs(U(:))));
- ax = subplot(2,1,2); cla(ax);
- set(ax,'position',[0 0 1 .5])
- options.ParentAxes = ax;
- if m > 8; i = 8; else i = 16; end
- g = spm_eeg_displayECD(U,[],i,name,options);
- delete(g.handles.mesh)
- delete(findobj(get(gcf,'Children'),'Type','uicontrol'))
- for i = 1:m
- set(g.handles.ht(i),'FontWeight','bold')
- end
- % Connections
- %--------------------------------------------------------------------------
- for i = 1:m
- for j = (i + 1):m
-
- % associate colour with the strongest influence
- %------------------------------------------------------------------
- if abs(A(i,j)) > abs(A(j,i)), c = j; else c = i; end
- k = rem(c - 1,length(col)) + 1;
-
- if W(i,j) > 0
- line(U(1,[i j]),U(2,[i j]),U(3,[i j]),'Color',col{k},...
- 'LineStyle','-',...
- 'LineWidth', W(i,j));
- elseif W(i,j) < 0
- line(U(1,[i j]),U(2,[i j]),U(3,[i j]),'Color',col{k},...
- 'LineStyle','-.',...
- 'LineWidth',-W(i,j));
- end
- end
- end
|