init
This commit is contained in:
178
PDToolkit/utils/TFCEobj.m
Normal file
178
PDToolkit/utils/TFCEobj.m
Normal file
@@ -0,0 +1,178 @@
|
||||
classdef TFCEobj<handle
|
||||
properties
|
||||
%default values for H and E represpenting area under the curve
|
||||
H=0;
|
||||
E=1; %NB there is one E value per dimension.
|
||||
D=[]; %A 2D (future N-D) matrix where dim1 is instance (i.e. independend TFCE's to be calculated,
|
||||
%dim2 is time .
|
||||
%In the future, dim 3, dim 4, and dim 5 could become space dimensions (more akin to smith et al)
|
||||
nstep=100; %number of stepts to use over your range
|
||||
hmax=100;
|
||||
TFCE=[];
|
||||
S=[]; %place holder for surrogate data
|
||||
STFCE=[]; %place holder for TFCE values of surrogate data
|
||||
P=struct('uncorrected',[]); %place holder for P values
|
||||
end
|
||||
%% put the public functions here
|
||||
methods
|
||||
function T=TFCEobj(varargin) %constructor
|
||||
%% TFCE Object for performing Threshold free cluster enhancement
|
||||
%
|
||||
% Example usage: T = TFCEobj('D', X, 'H' 0, 'E', 1, 'HMAX', 1);
|
||||
%
|
||||
% Input parameter:
|
||||
% - D / data = 2-dimensional data matrix
|
||||
% - H = Height parameter in the TFCE
|
||||
% - E = Extent parameter in the TFCE
|
||||
% - HMAX = Hmax parameter
|
||||
for k=1:2:nargin;
|
||||
if k+1<=nargin;
|
||||
switch varargin{k}
|
||||
case {'D','d','data','DATA'}
|
||||
T.D=varargin{k+1};
|
||||
T.InitTFCE;
|
||||
case {'H','h'}
|
||||
T.H=varargin{k+1};
|
||||
case {'E','e'}
|
||||
T.E=varargin{k+1};
|
||||
case {'n','N','nstep','NSTEP'}
|
||||
T.nstep=varargin{k+1};
|
||||
case {'hmax','HMAX'}
|
||||
T.hmax=varargin{k+1};
|
||||
|
||||
otherwise
|
||||
error('invalid name-value pair');
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
function set.hmax(T,hmax)
|
||||
if ~isnumeric(hmax);error('use a numeric value for hmax');end
|
||||
T.hmax=hmax;
|
||||
T.Check_hmax;
|
||||
end
|
||||
function set.D(T,D)
|
||||
if size(D,2)<2||size(D,1)==0; error('don''t be silly, now I''ve nothing to do');end
|
||||
if any(~isnumeric(D)); error('data is not a numerica matrix');end
|
||||
T.D=D;
|
||||
end
|
||||
function varargout=Surrogate(T,storeflag,n)
|
||||
% Create surrogate data.
|
||||
% function call S=T.Surrogate(n)
|
||||
% n: number of surrogates to create
|
||||
% S is a 3D matrix of size(D) by n
|
||||
|
||||
%build surrogate timecourses using the DVV toolbox by Danilo P. Mandic
|
||||
%http://www.commsp.ee.ic.ac.uk/~mandic/dvv.htm
|
||||
if isempty(n);n=25;end
|
||||
if ~isnumeric(n);error('invalid number of surrogates to create');end
|
||||
if isempty(storeflag);storeflag=false;end
|
||||
if nargout<1&&~storeflag;error('don''t be silly. Now I''ve nowhere to store my results');end
|
||||
S=zeros([size(T.D),n]);
|
||||
% loop over instances
|
||||
h=waitbar(0,'generating surrogate data');
|
||||
for k=1:size(T.D,1);
|
||||
S(k,:,:)=surrogate(T.D(k,:),n);
|
||||
waitbar(k./size(T.D,1),h);
|
||||
end
|
||||
close(h);
|
||||
if storeflag;
|
||||
T.S=S;
|
||||
end
|
||||
if nargout==1;varargout{1}=S;end
|
||||
end
|
||||
function varargout=SurrogateTFCE(T,storeflag,n)
|
||||
if nargout<1&&~storeflag;error('don''t be silly. Now I''ve nowhere to store my results');end
|
||||
if isempty(T.S);
|
||||
S=T.Surrogate(false,n);
|
||||
else
|
||||
S=T.S;
|
||||
end
|
||||
STFCE=zeros(size(S));
|
||||
hsteps=linspace(0,T.hmax,T.nstep);
|
||||
|
||||
for k=1:size(S,3); %loop over surrogate data
|
||||
for v=1:size(S,1);%loop over instances
|
||||
STFCE(v,:,k)=T.TFCECore(squeeze(S(v,:,k)),hsteps);
|
||||
end
|
||||
end
|
||||
if storeflag;T.STFCE=STFCE;end
|
||||
if nargout==1;varargout{1}=STFCE;end
|
||||
end
|
||||
function Pvalues(T,n)
|
||||
if isempty(T.TFCE);error('calculate TFCE before running stats');end;
|
||||
PosCount=zeros(size(T.TFCE));
|
||||
NegCount=zeros(size(T.TFCE));
|
||||
Count=zeros(size(T.TFCE));
|
||||
if isempty(T.STFCE) && ~isempty(T.S)
|
||||
T.SurrogateTFCE;
|
||||
end
|
||||
if ~isempty(T.STFCE);
|
||||
n=size(T.STFCE,3);
|
||||
for k=1:n;
|
||||
PosCount=PosCount+squeeze(T.STFCE(:,:,k))>T.TFCE;
|
||||
NegCount=NegCount+squeeze(T.STFCE(:,:,k))<T.TFCE;
|
||||
end
|
||||
else
|
||||
for k=1:n; %count over number of permutations;
|
||||
T.Surrogate(true,1);
|
||||
T.SurrogateTFCE(true);
|
||||
PosCount=PosCount+squeeze(T.STFCE(:,:))>T.TFCE;
|
||||
NegCount=NegCount+squeeze(T.STFCE(:,:))<T.TFCE;
|
||||
end
|
||||
end
|
||||
T.P=struct('Pos_Uncorr',PosCount./n,...
|
||||
'Neg_Uncorr',NegCount./n);
|
||||
end
|
||||
end
|
||||
%% put the private functions here. NB during testing these will still be public
|
||||
methods
|
||||
function InitTFCE(T)
|
||||
T.TFCE=zeros(size(T.D));
|
||||
end
|
||||
function TFCECalc(T)
|
||||
hsteps=linspace(0,T.hmax,T.nstep);
|
||||
for v=1:size(T.D,1);%loop over instances
|
||||
I=T.D(v,:);
|
||||
if any(~isfinite(I));continue;end%if NaN go to next one.
|
||||
T.TFCE(v,:)=T.TFCECore(I,hsteps);
|
||||
end
|
||||
end
|
||||
end
|
||||
methods
|
||||
%below are the support methods for the TFCE object. They won't alter any fields within the object
|
||||
function Check_hmax(T)
|
||||
m=max(T.D(:));
|
||||
if ~isempty(m)
|
||||
if T.hmax<m; warning('maximum value for integration set below the maximum value in T.D'); end
|
||||
end
|
||||
end
|
||||
function TFCEtmp=TFCECore(T,I,hsteps)
|
||||
%this function will actually calculate the TFCE values.
|
||||
%It supports the function TFCECalc.
|
||||
TFCEtmp=zeros(size(I));
|
||||
for h=hsteps;
|
||||
%% positive part
|
||||
[L,n]=bwlabel(I>h); % find beta > h and get clusters %all numbers belonging to cluster 1 get a 1, to cluster 2 a 2 etc.
|
||||
if n==0;
|
||||
else
|
||||
ind=1:numel(L);
|
||||
S=sparse(L(logical(L)),ind(logical(L)),1);
|
||||
% a bit of a trick, but it seems to work :-)
|
||||
E=sum(repmat(diag(S*transpose(S)),1,size(S,2)).*S); %#ok<PROP>
|
||||
TFCEtmp(logical(E))=TFCEtmp(logical(E))+E(logical(E)).^T.E*h.^T.H; %#ok<PROP> % get tfce value by tfce=tfce_h(-1)+h^ch*e^ce per voxel
|
||||
end
|
||||
%% negative part
|
||||
[L2,n2]=bwlabel(I<-h);
|
||||
if n2==0;
|
||||
else
|
||||
ind=1:numel(L2);
|
||||
S=sparse(L2(logical(L2)),ind(logical(L2)),1);
|
||||
% a bit of a trick, but it seems to work :-)
|
||||
E2=sum(repmat(diag(S*transpose(S)),1,size(S,2)).*S);
|
||||
TFCEtmp(logical(E2))=TFCEtmp(logical(E2))-E2(logical(E2)).^T.E*h.^T.H; % get tfce value by tfce=tfce_h(-1)+h^ch*e^ce per voxel
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
3236
PDToolkit/utils/findjobj.m
Normal file
3236
PDToolkit/utils/findjobj.m
Normal file
File diff suppressed because it is too large
Load Diff
61
PDToolkit/utils/gamma_fitting.m
Normal file
61
PDToolkit/utils/gamma_fitting.m
Normal file
@@ -0,0 +1,61 @@
|
||||
range= -5:1:5
|
||||
xBF.dt = 0.0625;
|
||||
xBF.name = 'Gamma functions';
|
||||
xBF.length = 32;
|
||||
xBF.order = 4;
|
||||
BM = spm_get_bf(xBF);
|
||||
|
||||
figure; hold on;
|
||||
|
||||
a =0;b=0;c=0;d=0;
|
||||
wait_s = 0.5;
|
||||
for a = range
|
||||
f = [a b c d] * BM.bf';
|
||||
plot(f)
|
||||
pause(wait_s)
|
||||
display('changing a');
|
||||
end
|
||||
a =0;b=0;c=0;d=0;
|
||||
for b = range
|
||||
f = [a b c d] * BM.bf';
|
||||
plot(f)
|
||||
pause(wait_s)
|
||||
display('changing b');
|
||||
end
|
||||
a =0;b=0;c=0;d=0;
|
||||
for c = range
|
||||
f = [a b c d] * BM.bf';
|
||||
plot(f)
|
||||
pause(wait_s)
|
||||
display('changing c');
|
||||
end
|
||||
a =0;b=0;c=0;d=0;
|
||||
for d = range
|
||||
f = [a b c d] * BM.bf';
|
||||
plot(f)
|
||||
pause(wait_s)
|
||||
display('changing d');
|
||||
end
|
||||
|
||||
clf;hold on;
|
||||
for i = 1:100
|
||||
a = rand
|
||||
b = rand
|
||||
c = rand
|
||||
d = rand
|
||||
f = [a b c d] * BM.bf';
|
||||
plot(f, 'Color', [0.5 .5 .5])
|
||||
end
|
||||
figure; hold on;
|
||||
for a = range
|
||||
for b = range
|
||||
for c = range
|
||||
for d = range
|
||||
f = [a b c d] * BM.bf';
|
||||
plot(f)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
8
PDToolkit/utils/get_plotwindow_id.m
Normal file
8
PDToolkit/utils/get_plotwindow_id.m
Normal file
@@ -0,0 +1,8 @@
|
||||
function[plotwindow_id] = get_plotwindow_id(fig)
|
||||
|
||||
|
||||
if (getversion >= 8.4)
|
||||
plotwindow_id = num2str(fig.Number);
|
||||
else
|
||||
plotwindow_id = num2str(fig);
|
||||
end
|
57
PDToolkit/utils/getversion.m
Normal file
57
PDToolkit/utils/getversion.m
Normal file
@@ -0,0 +1,57 @@
|
||||
function v = getversion
|
||||
%GETVERSION return MATLAB version number as a double.
|
||||
% GETVERSION determines the MATLAB version, and returns it as a double. This
|
||||
% allows simple inequality comparisons to select code variants based on ranges
|
||||
% of MATLAB versions.
|
||||
%
|
||||
% As of MATLAB 7.10, the version numbers are listed below:
|
||||
%
|
||||
% MATLAB version getversion return value
|
||||
% ------------------------------- -----------------------
|
||||
% 7.10.0.499 (R2010a) 8.0 (this needs to be fixed).
|
||||
% 7.9.0.529 (R2009b) 7.9
|
||||
% 7.8.0.347 (R2009a) 7.8
|
||||
% 7.7.0.xxx (R2008b) 7.7
|
||||
% 7.6.0.324 (R2008a) 7.6
|
||||
% 7.5.0.342 (R2007b) 7.5
|
||||
% 7.4.0.287 (R2007a) 7.4
|
||||
% 7.3.0.267 (R2006b) 7.3
|
||||
% 7.2.0.232 (R2006a) 7.2
|
||||
% 7.1.0.246 (R14) Service Pack 3 7.1
|
||||
% 7.0.4.365 (R14) Service Pack 2 7.04
|
||||
% 7.0.1.24704 (R14) Service Pack 1 7.01
|
||||
% 6.5.2.202935 (R13) Service Pack 2 6.52
|
||||
% 6.1.0.4865 (R12.1) 6.1
|
||||
% ...
|
||||
% 5.3.1.something (R11.1) 5.31
|
||||
% 3.2 whatever 3.2
|
||||
%
|
||||
% Example:
|
||||
%
|
||||
% v = getversion ;
|
||||
% if (v >= 7.0)
|
||||
% this code is for MATLAB 7.x and later
|
||||
% elseif (v == 6.52)
|
||||
% this code is for MATLAB 6.5.2
|
||||
% else
|
||||
% this code is for MATLAB versions prior to 6.5.2
|
||||
% end
|
||||
%
|
||||
% This getversion function has been tested on versions 6.1 through 7.10, but it
|
||||
% should work in any MATLAB that has the functions version, sscanf, and length.
|
||||
%
|
||||
% MATLAB 7.10 adds a twist. It is the first subversion that is 2 digits
|
||||
% ("10"). I need to decide how to handle this case. I can't return 7.1,
|
||||
% of course. But returning 8.0 is also problematic.
|
||||
%
|
||||
% See also version, ver, verLessThan.
|
||||
|
||||
% Copyright 2007, Timothy A. Davis
|
||||
|
||||
% This function does not use ver, in the interest of speed and portability.
|
||||
% "version" is a built-in that is about 100 times faster than the ver m-file.
|
||||
% ver returns a struct, and structs do not exist in old versions of MATLAB.
|
||||
% All 3 functions used here (version, sscanf, and length) are built-in.
|
||||
|
||||
v = sscanf (version, '%d.%d.%d') ;
|
||||
v = 10.^(0:-1:-(length(v)-1)) * v ;
|
12
PDToolkit/utils/onDataPointClick.m
Normal file
12
PDToolkit/utils/onDataPointClick.m
Normal file
@@ -0,0 +1,12 @@
|
||||
function[e output_text] = onDataPointClick(varargin)
|
||||
|
||||
|
||||
% e = varargin{1};
|
||||
hobj = varargin{2};
|
||||
e = varargin{3};
|
||||
%
|
||||
% pos = get(event_obj, 'Position')
|
||||
% display(['clicked at pos : ' pos]);
|
||||
guidata(fig);
|
||||
|
||||
output_text = {'test1111'};
|
Reference in New Issue
Block a user