[Master Index]
[Index for Toolbox]
zscore_gui
(Toolbox/zscore_gui.m in BrainStorm 2.0 (Alpha))
Function Synopsis
varargin = zscore_gui(action,varargin)
Help Text
ZSCORE_GUI - : management of zscore visualization
function varargin = zscore_gui(action,varargin)
Cross-Reference Information
This function calls
This function is called by
Listing of function C:\BrainStorm_2001\Toolbox\zscore_gui.m
function varargin = zscore_gui(action,varargin)
%ZSCORE_GUI - : management of zscore visualization
% function varargin = zscore_gui(action,varargin)
%<autobegin> ---------------------- 26-May-2004 11:34:45 -----------------------
% --------- Automatically Generated Comments Block Using AUTO_COMMENTS ---------
%
% CATEGORY: GUI and Related
%
% Alphabetical list of external functions (non-Matlab):
% toolbox\bst_color_scheme.m
% toolbox\bst_imaging_display.m
% toolbox\bst_layout.m
% toolbox\bst_message_window.m
% toolbox\dataplot_cb.m
% toolbox\findclosest.m
% toolbox\inorcol.m
% toolbox\patch_swell.m
% toolbox\save_fieldnames.m
% toolbox\togglebuttoncolor.m
% toolbox\vertices_connectivity.m
% toolbox\zscore_gui.m NOTE: Routine calls itself explicitly
%
% Application data and their calls in this file:
% 'TileType'
%
% setappdata(zscore_fig,'TileType','T')
%
%
% Figure Files opened by this function:
% 'zscore_gui.fig'
%
% Format of strings below: Type:Style:Tag, "String", CallBack Type and Call
% <automatic> callback is <Tag>_Callback by Matlab default
%
% Callbacks by figure zscore_gui.fig
% uicontrol:edit:Baseline "" uses Callback for zscore_gui DefineBaseline
% uicontrol:edit:CorrectionFactor "" uses Callback for zscore_gui ZScoreThreshold
% uicontrol:edit:ZScoreThreshold "5" uses Callback for zscore_gui ZScoreThreshold
% uicontrol:pushbutton:AnalyzeCorticalMap "Spatiotemp. Segment" uses Callback for
% zscore_gui AnalyzeCorticalMap
% uicontrol:pushbutton:AverageMaps "Avrg" uses Callback for zscore_gui AverageMaps
% uicontrol:pushbutton:pushbutton55 "Load" uses Callback for zscore_gui LoadBaseline
% uicontrol:pushbutton:pushbutton56 "Fetch files" uses Callback for zscore_gui ZScoreBatch
% uicontrol:pushbutton:Qpushbutton7 "Close" uses Callback for close(gcbf)
% uicontrol:pushbutton:STHistogram "Histo" uses Callback for zscore_gui STHistogram
% uicontrol:togglebutton:IntSTH "Integ." uses Callback for zscore_gui IntegSTHistogram
% uicontrol:togglebutton:ZScore "Z-score" uses Callback for togglebuttoncolor ; zscore_gui ZScore
% uicontrol:togglebutton:ZScoreThresholdApply "Apply" uses Callback for
% togglebuttoncolor; zscore_gui ZScoreThreshold
%
% At Check-in: $Author: Mosher $ $Revision: 12 $ $Date: 5/26/04 10:02a $
%
% This software is part of BrainStorm Toolbox Version 2.0 (Alpha) 24-May-2004
%
% Principal Investigators and Developers:
% ** Richard M. Leahy, PhD, Signal & Image Processing Institute,
% University of Southern California, Los Angeles, CA
% ** John C. Mosher, PhD, Biophysics Group,
% Los Alamos National Laboratory, Los Alamos, NM
% ** Sylvain Baillet, PhD, Cognitive Neuroscience & Brain Imaging Laboratory,
% CNRS, Hopital de la Salpetriere, Paris, France
%
% See BrainStorm website at http://neuroimage.usc.edu for further information.
%
% Copyright (c) 2004 BrainStorm by the University of Southern California
% This software distributed under the terms of the GNU General Public License
% as published by the Free Software Foundation. Further details on the GPL
% license can be found at http://www.gnu.org/copyleft/gpl.html .
%
% FOR RESEARCH PURPOSES ONLY. THE SOFTWARE IS PROVIDED "AS IS," AND THE
% UNIVERSITY OF SOUTHERN CALIFORNIA AND ITS COLLABORATORS DO NOT MAKE ANY
% WARRANTY, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO WARRANTIES OF
% MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, NOR DO THEY ASSUME ANY
% LIABILITY OR RESPONSIBILITY FOR THE USE OF THIS SOFTWARE.
%<autoend> ------------------------ 26-May-2004 11:34:45 -----------------------
global data
ImageGridTime = data.Display.Time(1):data.Display.SamplingRate:data.Display.Time(end);
switch(action)
case 'create'
zscore_fig = openfig('zscore_gui.fig','reuse');
setappdata(zscore_fig,'TileType','T')
bst_color_scheme(zscore_fig)
bst_layout('align',zscore_fig,2,2,4)
set(zscore_fig,'visible','on')
%----------------------------------------------------------------------------
case 'DefineBaseline'
hZScore_fig = guihandles(gcbf);
set(hZScore_fig.ZScore,'Value',1)
dataplot_cb('ToggleButtonColor',hZScore_fig.ZScore)
if ~strcmp(get(hZScore_fig.Baseline,'String'),'File')
set(hZScore_fig.Baseline,'Userdata',0) % FLAG: Baseline defined on current file
end
togglebuttoncolor
zscore_gui('ZScore',1) % Force ZScore computation
%----------------------------------------------------------------------------
case 'LoadBaseline' % Define Baseline from a different result file
cd(Users.STUDIES)
[resfile, respath] = uigetfile('*result*.mat','Please Select a Result File Containing the Activation Baseline');
if resfile == 0, return, end
Zscore_fig = findobj(0,'Tag','tesselation_select');
hZScore_fig = guihandles(Zscore_fig);
set(hZScore_fig.LoadBaseline,'userdata',fullfile(respath, resfile));
set(hZScore_fig.Baseline,'String','File');
set(hZScore_fig.Baseline,'Userdata',1) % FLAG: Baseline defined on a pre-loaded file
dataplot_cb DefineBaseline
%----------------------------------------------------------------------------
case 'ZScore' % Switches from Z-Score to Absolute current density mapping
ZScore_fig = gcbf;
hZScore_fig = guihandles(ZScore_fig);
switch get(hZScore_fig.ZScore,'Value')
case 1 % Switch to ZScore map
% Are we switching from ZScore to Absolute mapping or vice-versa ?
if get(hZScore_fig.Baseline,'Userdata') == 1 % Baseline is defined from an existing result file, load it
data.Results = load(get(hZScore_fig.LoadBaseline,'Userdata'));
FlagBaselineFile = 1;
else % else use current loaded results
FlagBaselineFile = 0;
end
if isempty(data.Results), return, end % No results were loaded
test = 0; % By default, consider not computing a new ZScore - check if a previously computation is available -
% if test is set to 1 anytime below, this will conduct to a new ZScore computation either because the baseline has changed
% or the computation is conducted on a new set of data.
if nargin == 1
varargin{1} = 0;
end
if (~isfield(data.Results,'ZScore') | varargin{1} == 1) % No ZScore was defined beforehand or computation is forced
data.Results.ZScore.Baseline = [-Inf Inf]; % Dummy Score
test = 1; % Force ZScore computation
end
%Get baseline time limits
if FlagBaselineFile == 1
set(hZScore_fig.Baseline,'String',...
[num2str(ImageGridTime(1)*1000,'%3.1f'),' ',num2str(ImageGridTime(end)*1000,'%3.1f')]);
baseline = [ImageGridTime(1) ImageGridTime(end)];
else
baseline = str2num(get(hZScore_fig.Baseline,'String'))/1000;
end
if length(baseline) < 2
errordlg('Please enter 2 time values to define the baseline interval')
return
end
if isfield(data.Results.ZScore,'FlagBaselineFile') % Was this ZScore computed from a stored baseline ?
if data.Results.ZScore.FlagBaselineFile == 0 % No - check new baseline limits
% Get exact time samples closest to these values
if round(1000*baseline(1)) < round(1000*ImageGridTime(1)) | round(1000*baseline(2)) > round(1000*ImageGridTime(end)) % Accuracy set to the ms
errordlg('Please set baseline time extremas within the available time window for this result file')
return
end
[tmp, tmin] = min(abs(ImageGridTime-baseline(1)));
[tmp, tmax] = min(abs(ImageGridTime-baseline(2)));
baseline_new = [tmin tmax];
test = (sum(baseline_new == ...
data.Results.ZScore.Baseline) ~= 2); % New baseline requested - recompute Z-Score
elseif test ~= 1 % Yes - Baseline was stored in a file - do not recompute the ZScore
[tmp, tmin] = min(abs(ImageGridTime-baseline(1)));
[tmp, tmax] = min(abs(ImageGridTime-baseline(2)));
test = 0;
elseif varargin{1} == 1 % Force computation
[tmp, tmin] = min(abs(ImageGridTime-baseline(1)));
[tmp, tmax] = min(abs(ImageGridTime-baseline(2)));
test = 1;
end
else
[tmp, tmin] = min(abs(ImageGridTime-baseline(1)));
[tmp, tmax] = min(abs(ImageGridTime-baseline(2)));
test = 1;
end
if 1%test
set(ZScore_fig,'Pointer','watch')
bst_message_window('wrap',...
{'Computing a new Z-Score map from this baseline. . .',...
sprintf('Baseline is %d time samples large (out of %d samples available)',...
tmax-tmin+1, length(ImageGridTime)),...
})
% Store original results patter in memory
if 1%(~isfield(data.Results,'ImageGridAmpOrig') & FlagBaselineFile == 0) | varargin{1} == 1
data.Results.ImageGridAmpOrig = data.Results.ImageGridAmp;
end
if FlagBaselineFile == 0 % remove the zero here !!!
data.Results.ImageGridAmp = data.Results.ImageGridAmpOrig;
end
%data.Results.ImageGridAmp = abs(data.Results.ImageGridAmp);
% Compute ZScores on that baseline
data.Results.ZScore.Baseline = [tmin tmax];
data.Results.ZScore.BaselineTime = [baseline(1) baseline(2)];
data.Results.ImageGridAmp = double(data.Results.ImageGridAmp);
% Average activity and its standard deviation over the baseline, for each source
data.Results.ZScore.ImageGridZ.mean = ...
mean((data.Results.ImageGridAmp(:,tmin:tmax)),2);
data.Results.ZScore.ImageGridZ.std = ...
std((data.Results.ImageGridAmp(:,tmin:tmax)),0,2);
data.Results.ZScore.ImageGridZ.std = ...
data.Results.ZScore.ImageGridZ.std + max(data.Results.ZScore.ImageGridZ.std)*eps; % Avoid devide-by-zero issues
if ~isempty(get(hZScore_fig.CorrectionFactor,'String'))
data.Results.ZScore.ImageGridZ.std = str2num(get(hZScore_fig.CorrectionFactor,'String'))*data.Results.ZScore.ImageGridZ.std;
end
% Compute Z-Scores
if FlagBaselineFile == 1 % Now load current results
ZScore = data.Results.ZScore;
data.Results = get(hZScore_fig.ResultFiles,'Userdata');
data.Results.ZScore = ZScore; clear ZScore
if ~isfield(data.Results,'ImageGridAmpOrig')
data.Results.ImageGridAmpOrig = [];
end
if isempty(data.Results.ImageGridAmpOrig)
data.Results.ImageGridAmpOrig = data.Results.ImageGridAmp; % Store original current density map
end
data.Results.ImageGridAmp = data.Results.ImageGridAmpOrig;
data.Results.ZScore.BaselineFile = get(hZScore_fig.LoadBaseline,'Userdata');
data.Results.ZScore.FlagBaselineFile = 1;
else
data.Results.ZScore.FlagBaselineFile = 0;
data.Results.ZScore.BaselineFile = '';
end
% bst_message_window('Updating Result File...'), drawnow
% % data.Results.ImageGridAmp = single(data.Results.ImageGridAmpOrig);
% % tmp = data.Results.ImageGridAmpOrig;
% % data.Results.ImageGridAmpOrig = [];
% % save_fieldnames(data.Results,get(hZScore_fig.Refresh,'Userdata'));
% ZScore = data.Results.ZScore;
% Users = get_user_directory;
% save(fullfile(Users.STUDIES,data.Results.FileName{1}),'ZScore','-append');
% clear ZScore
% % data.Results.ImageGridAmpOrig = tmp; clear tmp
% data.Results.ImageGridAmp = double(data.Results.ImageGridAmp);
data.Results.ImageGridAmp = (data.Results.ImageGridAmp)-repmat(data.Results.ZScore.ImageGridZ.mean,1,size(data.Results.ImageGridAmp,2));
iStd = spdiags(1./data.Results.ZScore.ImageGridZ.std, 0, length(data.Results.ZScore.ImageGridZ.std), length(data.Results.ZScore.ImageGridZ.std)) ;
%data.Results.ZScore.ImageGridZ.Amp = data.Results.ImageGridAmp;
bst_message_window('Computing a new Z-Score map from this baseline...-> DONE'), drawnow
else % Compute ZScore from saved mean and std maps
data.Results.ImageGridAmpOrig = double(data.Results.ImageGridAmp);
%data.Results.ImageGridAmp= data.Results.ZScore.ImageGridZ.Amp ;
data.Results.ImageGridAmp = (data.Results.ImageGridAmp)-repmat(data.Results.ZScore.ImageGridZ.mean,1,size(data.Results.ImageGridAmp,2));
iStd = spdiags(1./data.Results.ZScore.ImageGridZ.std, 0, length(data.Results.ZScore.ImageGridZ.std), length(data.Results.ZScore.ImageGridZ.std)) ;
end
%data.Results.ImageGridAmp = rand(size(iStd*data.Results.ImageGridAmp));
data.Results.ImageGridAmp = single(abs(iStd*data.Results.ImageGridAmp));
set(ZScore_fig,'Pointer','arrow')
case 0 % Switch to absolute current density mapping
bst_message_window('Previous Z-Score map on same baseline is used'), drawnow
data.Results.ImageGridAmp = data.Results.ImageGridAmpOrig;
set(hZScore_fig.ZScoreThresholdApply,'Value',0)
dataplot_cb('ToggleButtonColor',hZScore_fig.ZScoreThresholdApply)
end
% Update display
global hDataplot
ctime = get(hDataplot.TimeSlider,'Value');
tindx = findclosest(ctime,[data.Display.Time(1):data.Display.SamplingRate:data.Display.Time(end)]');
if ishandle(data.Results.Display.Handles.hPatch) % surface handle for result display is valid
data.Results.Display.OPTIONS.Time = tindx;
[tmp,OPTIONS] = bst_imaging_display(data.Results.ImageGridAmp,data.Results.Display.OPTIONS); clear tmp
end
%----------------------------------------------------------------------------
case 'ZScoreThreshold'
%Thresholded ZScore map in terms of multiples of sigmas in the baseline
Zscore_fig = findobj(0,'Tag','tesselation_select');
hZScore_fig = guihandles(Zscore_fig);
TessWin = findobj(0,'tag','tessellation_window');
%if isempty(TessWin), return, end
%hTessWin = guihandles(TessWin);
%TessWinUserData = get(TessWin,'Userdata');
% Are we switching from ZScore to Absolute mapping or vice-versa ?
data.Results = get(hZScore_fig.ResultFiles,'Userdata');
switch get(hZScore_fig.ZScoreThresholdApply,'Value')
case 1 % Switch to ZScore map and threshold it
if isempty(data.Results), return, end % No results were loaded
if ~isfield(data.Results,'ZScore') % No ZScore was defined beforehand
dataplot_cb ZScore % Compute the ZScore map
data.Results = get(hZScore_fig.ResultFiles,'Userdata');
end
set(hZScore_fig.ZScore,'Value',1);
dataplot_cb('ToggleButtonColor',hZScore_fig.ZScore)
ZThres = str2num(get(hZScore_fig.ZScoreThreshold,'String'));
if isempty(ZThres)
set(hZScore_fig.ZScoreThreshold,'String',2); % Apply Default
ZThres = str2num(get(hZScore_fig.ZScoreThreshold,'String'));
end
data.Results.ZScore.ImageGridZ.ZThres = ZThres;
set(hZScore_fig.ZScoreThreshold,'Userdata',ZThres / max(data.Results.ImageGridAmp(:)))
case 0
% Don't apply thresholded map
set(hZScore_fig.ZScoreThreshold,'Userdata',0)
end
%data.Results.ImageGridAmp(iZeroed) = eps ; %Thresholded Map
% Update display
set(hZScore_fig.ResultFiles,'Userdata',data.Results);
dataplot_cb ScaleColormap
%dataplot_cb tesselation_select_done
%----------------------------------------------------------------------------
case 'IntegSTHistogram' % Integrate Saptio-temporal histogram overtime
Zscore_fig = findobj(0,'Tag','tesselation_select');
hZScore_fig = guihandles(Zscore_fig);
avResults = get(hZScore_fig.ResultFiles,'Userdata');
if ~isfield(avResults,'HistoSrc'), return, end % This is not an histogram result set
% Integrate over time
figure, imagesc(avResults.ImageGridTime, 1:size(avResults.ImageGridAmp,1),avResults.ImageGridAmp)
colorbar
avResults.ImageGridAmp = max(avResults.ImageGridAmp,[],2) *ones(1,size(avResults.ImageGridAmp,2));
set(hZScore_fig.ResultFiles,'Userdata',avResults);
%----------------------------------------------------------------------------
case 'STHistogram' % Spatio-temporal histogram of activations (in terms of ZScore) on a series of result files
Zscore_fig = findobj(0,'Tag','tesselation_select');
hZScore_fig = guihandles(Zscore_fig);
% Look for data.Results file in the current study folder
% Get the path
[path,file,ext] = fileparts(Users.CurrentData.StudyFile);
% Dir list and look for result files
cd(fullfile(Users.STUDIES,path))
ResFiles = dir('*result*.mat');
for k = 1:length(ResFiles)
ResFiles(k).name = strrep(ResFiles(k).name,'.mat','');
end
[ResSelect,ok] = listdlg('Liststring',{ResFiles.name},'Selectionmode','multiple','Name','Please select one or sevral result files',...
'listsize',[400 400]);
if ok == 0
return
end
hw = waitbar(0,['Computing the spatio-temporal histogram of activation maps through a set of ',int2str(length(ResSelect)),' result files...']);
nDataFiles = 0;
% Get Value for Z threshold
ZThres = str2num(get(hZScore_fig.ZScoreThreshold,'String'));
if isempty(ZThres)
set(hZScore_fig.ZScoreThreshold,'String',2); % Apply Default
ZThres = str2num(get(hZScore_fig.ZScoreThreshold,'String'));
end
for k = 1:length(ResSelect)
dataplot_cb('LoadResultFile',ResFiles(ResSelect(k)).name)
ResFiles(ResSelect(k)).name
data.Results = get(hZScore_fig.ResultFiles,'Userdata');
if k == 1
avResults = data.Results;
avResults.ImageGridAmp = 0* avResults.ImageGridAmp; % ImageGridAmp becomes a hit-count table -
% cell (i,j) will indicate how many times source i had a ZScore > ZThres at time j
avResults.HistoSrc = cell(length(ResSelect));
end
if isfield(data.Results,'ZScore')
% % Adapt length to the length of shortest result file
% cropMin = 0;
% cropMax = 0;
% if data.Results.Time(1) > avResults.Time(1)
% cropMin = data.Results.Time(1)-avResults.Time(1);
% avResults.ImageGridAmp = avResults.ImageGridAmp(:,cropMin+1:end);
% avResults.ImageGridTime = avResults.ImageGridTime(:,cropMin+1:end);
% avResults.Fsynth = avResults.Fsynth(:,cropMin+1:end);
% avResults.ZScore.ImageGridZ.Amp = avResults.ZScore.ImageGridZ.Amp(:,cropMin+1:end);
%
% end
% if data.Results.Time(1) < avResults.Time(1)
% cropMin = -data.Results.Time(1)+avResults.Time(1);
% % data.Results.ImageGridAmp = data.Results.ImageGridAmp(:,cropMin+1:end);
% data.Results.ZScore.ImageGridZ.Amp = data.Results.ZScore.ImageGridZ.Amp(:,cropMin+1:end);
% data.Results.Time = data.Results.Time(cropMin+1:end);
% end
% if data.Results.Time(end) > avResults.Time(end)
% cropMax = data.Results.Time(end)-avResults.Time(end);
% % data.Results.ImageGridAmp = data.Results.ImageGridAmp(:,1:end-cropMax);
% data.Results.ZScore.ImageGridZ.Amp = data.Results.ZScore.ImageGridZ.Amp(:,1:end-cropMax);
% data.Results.Time = data.Results.Time(1:end-cropMax);
% end
% if data.Results.Time(end) < avResults.Time(end)
% cropMax = -data.Results.Time(end)+avResults.Time(end);
% avResults.ImageGridAmp = avResults.ImageGridAmp(:,1:end-cropMax);
% avResults.ImageGridTime = avResults.ImageGridTime(:,1:end-cropMax);
% avResults.Fsynth = avResults.Fsynth(:,1:end-cropMax);
% avResults.ZScore.ImageGridZ.Amp = avResults.ZScore.ImageGridZ.Amp(:,1:end-cropMax);
% end
%
avResults.Time = data.Results.Time;
data.Results.ZScore.ImageGridZ.Amp = (data.Results.ImageGridAmp)-repmat(data.Results.ZScore.ImageGridZ.mean,1,size(data.Results.ImageGridAmp,2));
iStd = spdiags(1./data.Results.ZScore.ImageGridZ.std, 0, length(data.Results.ZScore.ImageGridZ.std), length(data.Results.ZScore.ImageGridZ.std)) ;
data.Results.ZScore.ImageGridZ.Amp = abs(iStd*data.Results.ZScore.ImageGridZ.Amp);
avResults.HistoSrc{k} = sparse(data.Results.ZScore.ImageGridZ.Amp > ZThres);
% avResults.HistoSrc{k} stores the source indices and time where sources had greater ZScore that ZThres
avResults.ImageGridAmp = avResults.ImageGridAmp + avResults.HistoSrc{k} ;
if k == 1
prev = figure;
end
nDataFiles = nDataFiles + 1;
k
figure(prev)
plot(avResults.ImageGridTime, sum(avResults.HistoSrc{k},1))
else % No ZScore available - skip file
bst_message_window([ResFiles(ResSelect(k)).name,' does not contain any ZScore map - skip file'])
end
waitbar(k/length(ResSelect))
end
avResults.ImageGridAmp = 100*avResults.ImageGridAmp/nDataFiles; % Scale to 100% hits
cd(Users.STUDIES);
[path,file,ext] = fileparts(Users.CurrentData.StudyFile);
cd(path)
c = clock;
ResFiletmp = strrep(ResFiles(ResSelect(end)).name,Users.STUDIES,'');
ResFiletmp = strrep(ResFiletmp,'.mat','');
Iunder = findstr(ResFiletmp,'_');
DataFile= [ResFiletmp(1:Iunder(end)-1)];
newname = ([DataFile sprintf('_HISTO_%02.0f%02.0f',c(4:5)) ext]);
i = 0;
while(exist(newname,'file')),
i = i+1; % subtract another minute
c(5) = mod(c(5) - 1,60);
newname = ([DataFile sprintf('_HISTO_%02.0f%02.0f',MethodeCode,c(4),c(5)) ext]);
end
save_fieldnames(avResults,newname)
delete(hw)
msgbox(['Average activation maps saved in ', newname])
set(hZScore_fig.ResultFiles,'Userdata',avResults)
% Refresh results list
dataplot_cb mesh_rendering
ResFiles = get(hZScore_fig.ResultFiles,'String');
iFile = find(strcmp(ResFiles,strrep(newname,'.mat','')));
set(hZScore_fig.ResultFiles,'Value',iFile)
%----------------------------------------------------------------------------
case 'AverageMaps' % Average activations across multiple result files
Zscore_fig = findobj(0,'Tag','tesselation_select');
hZScore_fig = guihandles(Zscore_fig);
% Look for data.Results file in the current study folder
% Get the path
[path,file,ext] = fileparts(Users.CurrentData.StudyFile);
% Dir list and look for result files
cd(fullfile(Users.STUDIES,path))
ResFiles = dir('*result*.mat');
for k = 1:length(ResFiles)
ResFiles(k).name = strrep(ResFiles(k).name,'.mat','');
end
[ResSelect,ok] = listdlg('Liststring',{ResFiles.name},'Selectionmode','multiple','Name','Please select one or sevral result files',...
'listsize',[400 400]);
if ok == 0
return
end
% Now compute ZScore for each of the selected files
hw = waitbar(0,['Averaging activation maps through a set of ',int2str(length(ResSelect)),' result files...']);
for k = 1:length(ResSelect)
dataplot_cb('LoadResultFile',ResFiles(ResSelect(k)).name)
ResFiles(ResSelect(k)).name
data.Results = get(hZScore_fig.ResultFiles,'Userdata');
if k == 1
avResults = data.Results;
avResults.ImageGridAmp = avResults.ImageGridAmp/length(ResSelect);
end
% !!!!!!Suppose all result files were computed on the same time window - discard what's commented below
% % Adapt length to the length of shortes result file
% cropMin = 0;
% cropMax = 0;
% if data.Results.Time(1) > avResults.Time(1)
% cropMin = data.Results.Time(1)-avResults.Time(1);
% avResults.ImageGridAmp = avResults.ImageGridAmp(:,cropMin+1:end);
% avResults.ImageGridTime = avResults.ImageGridTime(:,cropMin+1:end);
% avResults.Time = avResults.Time(:,cropMin+1:end);
% avResults.Fsynth = avResults.Fsynth(:,cropMin+1:end);
%
% if isfield(data.Results,'ZScore')
% avResults.ZScore.ImageGridZ.Amp = avResults.ZScore.ImageGridZ.Amp(:,cropMin+1:end);
% end
% end
% if data.Results.Time(1) < avResults.Time(1)
% cropMin = -data.Results.Time(1)+avResults.Time(1);
% data.Results.ImageGridAmp = data.Results.ImageGridAmp(:,cropMin+1:end);
% ImageGridTime = ImageGridTime(:,cropMin+1:end);
% data.Results.Time = data.Results.Time(:,cropMin+1:end);
% if isfield(data.Results,'ZScore')
% data.Results.ZScore.ImageGridZ.Amp = data.Results.ZScore.ImageGridZ.Amp(:,cropMin+1:end);
% end
% end
% if data.Results.Time(end) > avResults.Time(end)
% cropMax = data.Results.Time(end)-avResults.Time(end);
% data.Results.ImageGridAmp = data.Results.ImageGridAmp(:,1:end-cropMax);
% ImageGridTime = ImageGridTime(:,1:end-cropMax);
% data.Results.Time = data.Results.Time(:,1:end-cropMax);
% if isfield(data.Results,'ZScore')
% data.Results.ZScore.ImageGridZ.Amp = data.Results.ZScore.ImageGridZ.Amp(:,1:end-cropMax);
% end
% end
% if data.Results.Time(end) < avResults.Time(end)
% cropMax = -data.Results.Time(end)+avResults.Time(end);
% avResults.ImageGridAmp = avResults.ImageGridAmp(:,1:end-cropMax);
% avResults.ImageGridTime = avResults.ImageGridTime(:,1:end-cropMax);
% avResults.Fsynth = avResults.Fsynth(:,1:end-cropMax);
% avResults.Time = avResults.Time(:,1:end-cropMax);
% if isfield(data.Results,'ZScore')
% avResults.ZScore.ImageGridZ.Amp = avResults.ZScore.ImageGridZ.Amp(:,1:end-cropMax);
% end
% end
if k == 1
prev = figure;
if isfield(data.Results,'ZScore')
data.Results.ZScore.ImageGridZ.Amp = (data.Results.ImageGridAmp)-repmat(data.Results.ZScore.ImageGridZ.mean,1,size(data.Results.ImageGridAmp,2));
iStd = spdiags(1./data.Results.ZScore.ImageGridZ.std, 0, length(data.Results.ZScore.ImageGridZ.std), length(data.Results.ZScore.ImageGridZ.std)) ;
data.Results.ZScore.ImageGridZ.Amp = abs(iStd*data.Results.ZScore.ImageGridZ.Amp);
end
end
if k >1
avResults.ImageGridAmp = avResults.ImageGridAmp + (data.Results.ImageGridAmp)/length(ResSelect);
if isfield(data.Results,'ZScore')
avResults.ZScore.ImageGridZ.Amp = avResults.ZScore.ImageGridZ.Amp + (data.Results.ZScore.ImageGridZ.Amp)/length(ResSelect);
end
end
figure(prev)
plot(ImageGridTime,mean(abs(data.Results.ImageGridAmp),1),'b'), hold on
plot(avResults.ImageGridTime,mean(abs(avResults.ImageGridAmp),1),'r'), hold off
waitbar(k/length(ResSelect))
end
%avResults.ImageGridAmp = avResults.ImageGridAmp/length(ResSelect);
% if isfield(avResults,'ZScore')
% avResults.ZScore.ImageGridZ.Amp = avResults.ZScore.ImageGridZ.Amp/length(ResSelect);
% end
cd(Users.STUDIES);
[path,file,ext] = fileparts(Users.CurrentData.StudyFile);
cd(path)
c = clock;
ResFiletmp = strrep(ResFiles(ResSelect(end)).name,Users.STUDIES,'');
ResFiletmp = strrep(ResFiletmp,'.mat','');
Iunder = findstr(ResFiletmp,'_');
DataFile= [ResFiletmp(1:Iunder(end-1)-1)];
newname = ([DataFile sprintf('_AVRresults_%02.0f%02.0f',c(4:5)) ext]);
i = 0;
while(exist(newname,'file')),
i = i+1; % subtract another minute
c(5) = mod(c(5) - 1,60);
newname = ([DataFile sprintf('_AVRresults_%02.0f%02.0f',MethodeCode,c(4),c(5)) ext]);
end
save_fieldnames(avResults,newname)
delete(hw)
msgbox(['Average activation maps saved in ', newname])
set(hZScore_fig.ResultFiles,'Userdata',avResults)
% Refresh results list
dataplot_cb mesh_rendering
ResFiles = get(hZScore_fig.ResultFiles,'String');
iFile = find(strcmp(ResFiles,strrep(newname,'.mat','')));
set(hZScore_fig.ResultFiles,'Value',iFile)
%----------------------------------------------------------------------------
case 'ZScoreBatch' % Compute ZScore on a set of Result files
% Look for data.Results file in the current study folder
% Get the path
[path,file,ext] = fileparts(Users.CurrentData.StudyFile);
% Dir list and look for result files
cd(fullfile(Users.STUDIES,path))
ResFiles = dir('*result*.mat');
for k = 1:length(ResFiles)
ResFiles(k).name = strrep(ResFiles(k).name,'.mat','');
end
[ResSelect,ok] = listdlg('Liststring',{ResFiles.name},'Selectionmode','multiple','Name','Please select one or sevral result files',...
'listsize',[400 400]);
if ok == 0
return
end
% Now compute ZScore for each of the selected files
hw = waitbar(0,['Computing ZScore for the selected set of ',int2str(length(ResSelect)),' result files...']);
for k = 1:length(ResSelect)
dataplot_cb('LoadResultFile',ResFiles(ResSelect(k)).name)
ResFiles(ResSelect(k)).name
Zscore_fig = findobj(0,'Tag','tesselation_select');
hZScore_fig = guihandles(Zscore_fig);
set(hZScore_fig.ZScore,'Value',1)
dataplot_cb('ToggleButtonColor',hZScore_fig.ZScore)
dataplot_cb('ZScore',1) % Force the computation of the ZScore for each of the file (ie force test to 1 in dataplot_cb ZScore)
waitbar(k/length(ResSelect))
end
set(hZScore_fig.Baseline,'Userdata',0)
delete(hw)
%----------------------------------------------------------------------------
case 'AnalyzeCorticalMap' % Spatio-temporal segmentation of the cortical current density maps
Zscore_fig = findobj(0,'Tag','tesselation_select');
hTessSelect = guihandles(Zscore_fig);
available = findobj(Zscore_fig,'Tag','available');
removed = findobj(Zscore_fig,'Tag','removed');
availableID = get(removed,'Value');
IDs = get(removed,'String');
if isempty(IDs), return, end
% Identification of the active mesh surfaces
Visu = get(DATAPLOT,'Userdata');
try
load(Visu.Tesselation,'Comment')
catch
cd(Users.SUBJECTS)
load(Visu.Tesselation,'Comment')
end
if ~iscell(IDs)
imesh = find(strcmp(IDs,Comment));
end
nsurf = imesh(availableID); % Selected surface
TessWin = findobj(0,'tag','tessellation_window');
hTessWin = guihandles(TessWin);
TessWinUserData = get(TessWin,'Userdata');
if ~isfield(TessWinUserData,'VertConn') % Vertex connectivity not available here - load or compute
nsurfaces = length(Comment);
% ----------------- Load current surface parameters -
load(Visu.Tesselation,'Faces','Vertices')
FV.faces = Faces{nsurf}; clear Faces
FV.vertices = Vertices{nsurf}'; clear Vertices
% ----------------- Load current surface parameters - DONE
load(fullfile(Users.SUBJECTS,Users.CurrentData.SubjectFile),'VertConn'); % Is the vertex connectivity available ?
if isempty(VertConn) % Vertex connectivity was not defined before
VertConn = cell(nsurfaces,1);
else
if exist(VertConn,'file')
load(VertConn)
else
VertConn = cell(nsurfaces,1);
end
end
if isempty(VertConn{nsurf}) % Compute the vertex connectivity
[pathname, filename] = fileparts(Visu.Tesselation);
VertConn{nsurf} = vertices_connectivity(FV);
clear FV
VertConnFile = [filename,'_vertconn.mat'];
% Save this file in the current subject folder
[path,name,ext] = fileparts(fullfile(Users.SUBJECTS,Users.CurrentData.SubjectFile));
if ~isempty(path)
cd(path)
else
cd(Users.SUBJECTS)
end
save(VertConnFile,'VertConn');
VertConn = VertConnFile;
save(Users.CurrentData.SubjectFile,'VertConn','-append')
else % Load VC from the file
load(Users.CurrentData.SubjectFile,'VertConn');
end
load(VertConn);
VertConn = VertConn{nsurf};
TessWinUserData.VertConn = VertConn; clear VertConn;
end
% Get Z threshold
ZThres = str2num(get(hTessSelect.ZScoreThreshold,'String')) ;
% Vertices which maximum Z score is above ZThres
data.Results = get(hTessSelect.ResultFiles,'Userdata');
ImageGridAmp = data.Results.ImageGridAmp; clear data.Results
% Get baseline info
data.Results = get(hTessSelect.ResultFiles,'userdata');
AnalyzeWin = [30 90]/1000; % in sec
[tmp, tmin] = min(abs(ImageGridTime-AnalyzeWin(1)));
[tmp, tmax] = min(abs(ImageGridTime-AnalyzeWin(2)));
clear data.Results
%Baseline = data.Results.ZScore.Baseline; clear data.Results
%Time = Baseline(end)+1:size(ImageGridAmp,2); %setdiff([1:size(ImageGridAmp,2)],[Baseline(1):Baseline(end)]);
Time = [tmin:tmax];
MaxVerts = max(ImageGridAmp(:,Time)');
iThres = find(MaxVerts > ZThres);
% Threshold in terms of correlation
CorrThres = .9;
Scout{1} = [];
iScout = 1;
imax = 1;
% Sort MaxVerts
[s, iMaxVertsSort] = sort(MaxVerts); clear s
CONNEX = 1; % if 1; enforce connexity of each clusters
while ~isempty(imax)
%%%% Segmentation process
if iScout == 1 % We are starting from scratch
% Initialization
% Start region growing from the vertex with maximum ZScore
imax = iMaxVertsSort(end);
else
tmp = setdiff(iMaxVertsSort,[Scout{:}]);
[mm, imax] = max(MaxVerts(tmp)); clear mm
imax = tmp(imax);
end
% Does imax checks iThres
if isempty(find(iThres == imax))
break
end
if CONNEX == 1
% Look for his neighbors
voiz = patch_swell(imax,TessWinUserData.VertConn);
% Select those that check the Zthres condition
voiz = intersect(iThres,voiz);
else % Just look for all the points above ZThres
voiz = setdiff(iThres,imax);
end
% Remove those previously selected
voiz = setdiff(voiz,[Scout{:}]);
% Compute correlation coefficients of their time series
%CorrCoeff = abs(corrcoef(ImageGridAmp([imax,voiz],Time)'));
if ~isempty(voiz)
CorrCoeff = abs(ImageGridAmp(imax,Time)/norm(ImageGridAmp(imax,Time)))...
*abs(ImageGridAmp(voiz,Time)'*inorcol(ImageGridAmp(voiz,Time)'));
else
CorrCoeff = CorrThres/10;
end
% Apply Correlation Threshold
%icorr = find(CorrCoeff(1,2:end)>CorrThres);
icorr = find(CorrCoeff>CorrThres);
Scout{iScout} = [imax,voiz(icorr)];
while ~isempty(icorr)
if CONNEX == 1
voiz = patch_swell(voiz(icorr),TessWinUserData.VertConn);
% Select those that check the Zthres condition
voiz = intersect(iThres,voiz);
else
voiz = setdiff(iThres,imax);
end
% Remove those previously selected
voiz = setdiff(voiz,[Scout{:}]);
% Compute correlation coefficients of their time series
%CorrCoeff = abs(corrcoef(ImageGridAmp([imax,voiz],Time)'));
if ~isempty(voiz)
CorrCoeff = abs(ImageGridAmp(imax,Time)/norm(ImageGridAmp(imax,Time)))...
*abs(ImageGridAmp(voiz,Time)'*inorcol(ImageGridAmp(voiz,Time)'));
CorrCoeffBaseLine = abs(ImageGridAmp(imax,125:500)/norm(ImageGridAmp(imax,125:500)))...
*abs(ImageGridAmp(voiz,125:500)'*inorcol(ImageGridAmp(voiz,125:500)'));
else
CorrCoeff = CorrThres/10;
end
% Apply Correlation Threshold
%icorr = find(CorrCoeff(1,2:end)>CorrThres);
icorr = find(CorrCoeff>CorrThres);
Scout{iScout} = [Scout{iScout},voiz(icorr)];
end
if length([Scout{:}]) ~= length(unique([Scout{:}]))
keyboard
end
length(iThres) - length([Scout{:}])
CorticalScouts.CorticalProbePatches(iScout) = Scout(iScout);
CorticalScouts.CorticalMarkersLabels{iScout} = int2str(iScout);
CorticalScouts.CorticalSpots(iScout) = imax;
if iScout == 1
load(Visu.Tesselation,'Vertices')
end
CorticalScouts.CorticalMarkers(iScout,:) = Vertices{nsurf}(:,Scout{iScout}(1));
iScout = iScout+1;
bst_message_window('')
end
newScout = 1;
for iScout = 1:length(Scout)
if length(Scout{iScout}) == 1 % Single point scout: do we keep it ?
% Check if its neighbors with activation < ZThres have time series that correlate with his with corrcoeff > CorrThres
voiz = patch_swell(Scout{iScout},TessWinUserData.VertConn);
if ~isempty(voiz)
CorrCoeff = abs(ImageGridAmp(imax,Time)/norm(ImageGridAmp(imax,Time)))...
*abs(ImageGridAmp(voiz,Time)'*inorcol(ImageGridAmp(voiz,Time)'));
else
CorrCoeff = CorrThres/10;
end
icorr = find(CorrCoeff>CorrThres);
if isempty(icorr)
bst_message_window('Remove spurious Scout')
% Scout{iScout} = [];
% iScout = iScout - 1;
else
newCorticalScouts.CorticalProbePatches(newScout) = Scout(iScout);
newCorticalScouts.CorticalMarkersLabels{newScout} = int2str(newScout);
newCorticalScouts.CorticalSpots(newScout) = Scout{iScout}(1);
if newScout == 1
load(Visu.Tesselation,'Vertices')
end
newCorticalScouts.CorticalMarkers(newScout,:) = Vertices{nsurf}(:,Scout{iScout}(1));
newScout = newScout + 1;
end
else
newCorticalScouts.CorticalProbePatches(newScout) = Scout(iScout);
newCorticalScouts.CorticalMarkersLabels{newScout} = int2str(newScout);
newCorticalScouts.CorticalSpots(newScout) = Scout{iScout}(1);
if newScout == 1
load(Visu.Tesselation,'Vertices')
end
newCorticalScouts.CorticalMarkers(newScout,:) = Vertices{nsurf}(:,Scout{iScout}(1));
newScout = newScout + 1;
end
clear CorticalScouts
CorticalScouts = newCorticalScouts;
end
CorticalScouts.VertConn = TessWinUserData.VertConn;
CorticalScouts.CorticalProbeDepth = ones(1,length(Scout));
cd(Users.STUDIES)
length(CorticalScouts.CorticalProbePatches)
save test CorticalScouts
%----------------------------------------------------------------------------
end
Produced by color_mat2html, a customized BrainStorm 2.0 (Alpha) version of mat2html on Tue Oct 12 12:05:14 2004
Cross-Directory links are: ON