📄 fmri_result_sa_ui.m
字号:
num_lv = getappdata(gcf,'NumLVs');
eigen_plot = getappdata(gcbf,'EigenPlotHdl');
if ~isempty(eigen_plot) & ishandle(eigen_plot)
msg = 'ERROR: Singular Values are already been plotted';
set(findobj(gcf,'Tag','MessageLine'),'String',msg);
return;
end
h = findobj(gcbf,'Tag','ResultFile');
PLSresultFile = get(h,'UserData');
eigen = load(PLSresultFile,'s','perm_result');
c = findobj(gcbf,'Tag','OpenContrastWindow');
eigen_fig = ...
rri_plot_eigen_ui({eigen.s, eigen.perm_result, strcmpi(get(c,'Visible'),'on')});
link_info.hdl = gcbf;
link_info.name = 'EigenPlotHdl';
setappdata(eigen_fig,'LinkFigureInfo',link_info);
setappdata(gcbf,'EigenPlotHdl',eigen_fig);
return; % OpenEigenPlot
%-------------------------------------------------------------------------
%
function SetClusterReportOptions()
sa = getappdata(gcbf,'sa');
st_origin = getappdata(gcbf,'STOrigin');
st_dims = getappdata(gcbf,'STDims');
setting = getappdata(gcf,'setting');
if isempty(setting) | ~isfield(setting,'cluster_mask_size')
cluster_mask_size = getappdata(gcbf,'ClusterMaskSize');
cluster_min_size = getappdata(gcbf,'ClusterMinSize');
cluster_min_dist = getappdata(gcbf,'ClusterMinDist');
else
cluster_mask_size = setting.cluster_mask_size;
cluster_min_size = setting.cluster_min_size;
cluster_min_dist = setting.cluster_min_dist;
end;
if isempty(st_origin) | all(st_origin == 0)
st_voxel_size = getappdata(gcf,'STVoxelSize');
if all(st_dims == [40 48 1 34]) & all(st_voxel_size == [4 4 4])
st_origin = [20 29 12];
elseif all(st_dims == [91 109 1 91]) & all(st_voxel_size == [2 2 2])
st_origin = [46 64 37];
else
% according to SPM: if the origin field contains 0, then the origin is
% assumed to be at the center of the volume.
%
st_origin = floor((st_dims([1 2 4])+1)/2);
% st_origin = round(st_dims([1 2 4])/2);
end;
end;
if 0
if sa
st_origin = st_origin([2 3 1]);
else
st_origin = st_origin([1 3 2]);
end
end
xyz = getappdata(gcf,'xyz');
lag = getappdata(gcbf,'lag');
% prompt = {'Cluster Mask marker size', ...
prompt = {'Minimum cluster size (in voxels)', ...
'Minimum distance (in mm) between cluster peaks', ...
'Origin location (in voxels)' };
% 'Current location (in voxels)', ...
% 'Current lag' };
% defValues = { num2str(cluster_mask_size), ...
defValues = { num2str(cluster_min_size), ...
num2str(cluster_min_dist), ...
num2str(st_origin) };
% num2str(xyz), ...
% num2str(lag) };
dlgTitle='Cluster Report Options';
lineNo = 1;
answer = inputdlg(prompt,dlgTitle,lineNo,defValues);
if isempty(answer),
return;
end;
invalid_options = 0;
% mask_size = str2num(answer{1});
min_size = str2num(answer{1});
min_dist = str2num(answer{2});
origin_xyz = str2num(answer{3});
if 0
if sa
origin_xyz = origin_xyz([3 1 2]);
else
origin_xyz = origin_xyz([1 3 2]);
end
end
% cur_xyz = str2num(answer{4});
% cur_lag = str2num(answer{5});
%isempty(mask_size) | (mask_size <= 0) |
if isempty(min_size) | isempty(min_dist) | isempty(origin_xyz)
invalid_options = 1;
elseif (min_size <= 0) | (min_dist <= 0) | (sum(origin_xyz<= 0) ~= 0)
invalid_options = 1;
end;
if (invalid_options)
msg = 'Invalid cluster report options. Options did not changed';
set(findobj(gcbf,'Tag','MessageLine'),'String',msg);
return;
end;
setappdata(gcbf,'ClusterMaskSize',4); %mask_size);
setappdata(gcbf,'ClusterMinSize',min_size);
setappdata(gcbf,'ClusterMinDist',min_dist);
setappdata(gcbf,'Origin',origin_xyz);
setappdata(gcbf,'STOrigin',origin_xyz);
setting.cluster_mask_size = 4; %mask_size;
setting.cluster_min_size = min_size;
setting.cluster_min_dist = min_dist;
setting.origin = origin_xyz;
setappdata(gcf,'setting',setting);
if 0
if ~isempty(cur_xyz) | ~isempty(cur_lag)
if isempty(cur_xyz) | ~all(size(cur_xyz) == [1 3])
msg = 'Please use 3 numbers for xyz.';
set(findobj(gcbf,'Tag','MessageLine'),'String',msg);
return;
elseif isempty(cur_lag) | ~all(size(cur_lag) == [1 1])
msg = 'Please use 1 number for lag number.';
set(findobj(gcbf,'Tag','MessageLine'),'String',msg);
return;
end
EditXYZ(cur_xyz, cur_lag + 1);
end
end
% xyz = getappdata(gcf,'xyz'); % move ahead
if 0
if ~isempty(xyz)
EditXYZ;
end
end
if ~isempty(xyz)
voxel_size = getappdata(gcf,'STVoxelSize');
xyz_offset = xyz - origin_xyz;
xyz_mm = xyz_offset .* voxel_size;
h = findobj(gcbf,'Tag','XYZmm');
set(h,'String',sprintf('%2.1f %2.1f %2.1f',xyz_mm));
end;
return; % SetClusterReportOptions
%-------------------------------------------------------------------------
%
function OpenClusterReport()
% wait message
old_pointer = get(gcbf,'Pointer');
set(gcbf,'Pointer','watch');
msg = 'Generating Cluster Report ... please wait';
h = rri_wait_box(msg, [0.5 0.1]);
cluster_min_size = getappdata(gcbf,'ClusterMinSize');
cluster_min_dist = getappdata(gcbf,'ClusterMinDist');
cluster_hdl = getappdata(gcbf,'cluster_hdl');
if ~isempty(cluster_hdl)
msg = 'Please close any opening cluster report window';
set(findobj(gcf,'Tag','MessageLine'),'String',msg);
return;
end;
[tmp cluster_hdl] = fmri_cluster_report(cluster_min_size,cluster_min_dist);
link_info.hdl = gcbf;
link_info.name = 'cluster_hdl';
setappdata(cluster_hdl,'LinkFigureInfo',link_info);
setappdata(gcbf,'cluster_hdl',cluster_hdl);
set(gcbf,'Pointer',old_pointer);
set(findobj(gcbf,'Tag','MessageLine'),'String','');
delete(h);
return; % OpenClusterReport
%-------------------------------------------------------------------------
function OpenContrastWindow()
contrast_fig = getappdata(gcbf,'ContrastFigHdl');
if ~isempty(contrast_fig)
msg = 'ERROR: Constrasts information has already been dispalyed.';
set(findobj(gcf,'Tag','MessageLine'),'String',msg);
return;
end
h = findobj(gcbf,'Tag','ResultFile');
PLSresultFile = get(h,'UserData');
load(PLSresultFile,'cond_name','design');
num_groups = length(getappdata(gcf,'SessionFileList'));
if num_groups * length(cond_name) ~= size(design, 1)
design = repmat(design, [num_groups 1]);
end
contrast_fig = rri_input_contrast_ui({'fMRI'}, cond_name, [], num_groups, design, 1);
if 0
if isequal(ContrastFile,'NONE'),
msg = 'No contrast was used for this PLS analysis.';
set(findobj(gcf,'Tag','MessageLine'),'String',msg);
return;
end;
if isequal(ContrastFile,'HELMERT'), % using Helmert matrix for contrasts
load(SessionProfiles{1}{1});
conditions = session_info.condition;
num_conditions = length(conditions);
helmert_contrasts = rri_helmert_matrix(num_conditions);
for i=1:num_conditions-1,
pls_contrasts(i).name = sprintf('Contrast #%d',i);
pls_contrasts(i).value = helmert_contrasts(:,i)';
end;
else
try
load(ContrastFile);
catch
msg = sprintf('ERROR: Cannot open contrast file "%s".',ContrastFile);
set(findobj(gcf,'Tag','MessageLine'),'String',msg);
return;
end;
end;
end
% contrast_fig = fmri_input_contrast_ui(pls_contrasts,conditions,1);
link_info.hdl = gcbf;
link_info.name = 'ContrastFigHdl';
setappdata(contrast_fig,'LinkFigureInfo',link_info);
setappdata(gcbf,'ContrastFigHdl',contrast_fig);
return; % OpenContrastWindow
%-------------------------------------------------------------------------
%
function ShowResult(action,update)
% action=0 - plot with the control figure
% action=1 - plot in a seperate figure
%
mainfig = gcf;
h = findobj(gcf,'Tag','ResultFile'); PLSresultFile = get(h,'Userdata');
sa = getappdata(gcf,'sa');
try % load the dimension info of the st_datamat
load(PLSresultFile,'st_dims'),
catch
msg =sprintf('ERROR: Cannot load the PLS result file "%s".',PLSresultFile);
set(findobj(gcf,'Tag','MessageLine'),'String',msg);
return;
end;
if sa
st_dims_sa = st_dims([2,4,3,1]);
else
st_dims_sa = st_dims([1,4,3,2]);
end
h = findobj(gcf,'Tag','LVIndexEdit'); lv_idx = get(h,'Userdata');
curr_lv_idx = getappdata(gcf,'CurrLVIdx');
if (lv_idx ~= curr_lv_idx),
lv_idx = curr_lv_idx;
set(h,'String',num2str(lv_idx));
end;
h = findobj(gcf,'Tag','FirstSlice'); first_slice = str2num(get(h,'String'));
h = findobj(gcf,'Tag','SliceStep'); step = str2num(get(h,'String'));
h = findobj(gcf,'Tag','LastSlice'); last_slice = str2num(get(h,'String'));
if (first_slice < 1) | (first_slice > st_dims_sa(4))
msg =sprintf('ERROR: The first slice must be between 1 and %d.',st_dims_sa(4));
set(findobj(gcf,'Tag','MessageLine'),'String',msg);
return;
end;
if (last_slice < 1) | (last_slice > st_dims_sa(4))
msg =sprintf('ERROR: The last slice must be between 1 and %d.',st_dims_sa(4));
set(findobj(gcf,'Tag','MessageLine'),'String',msg);
return;
end;
slice_idx = [first_slice:step:last_slice];
if isempty(slice_idx),
msg = 'ERROR: Invalid slice range.';
set(findobj(gcf,'Tag','MessageLine'),'String',msg);
return;
end;
old_pointer = get(gcf,'Pointer');
fig_hdl = gcf;
set(fig_hdl,'Pointer','watch');
%%%%%%%%%%%%%%%% take out cluster_info %%%%%%%%%%%%%%%%
cluster_mask_state = get(findobj(gcf,'tag','ClusterMask'),'Userdata');
isbsr = getappdata(gcf,'ViewBootstrapRatio');
if isbsr
cluster_info = getappdata(gcf, 'cluster_bsr');
else
cluster_info = getappdata(gcf, 'cluster_blv');
end
if length(cluster_info) < curr_lv_idx
cluster_info = [];
else
cluster_info = cluster_info{curr_lv_idx};
end
% if ~isempty(cluster_info) & ~cluster_mask_state
% fmri_plot_cluster_mask(cluster_info);
%end
if cluster_mask_state
cluster_info = [];
end
if (getappdata(gcf,'ViewBootstrapRatio') == 0), % plot brain lv
h = findobj(gcf,'Tag','Threshold'); thresh = str2num(get(h,'String'));
h = findobj(gcf,'Tag','MaxValue'); max_blv = str2num(get(h,'String'));
h = findobj(gcf,'Tag','MinValue'); min_blv = str2num(get(h,'String'));
if isempty(max_blv) | isempty(min_blv) | isempty(thresh) | ...
(abs(max_blv) < thresh) | (abs(min_blv) < thresh)
msg = 'ERROR: Invalid threshold.';
set(findobj(gcf,'Tag','MessageLine'),'String',msg);
set(fig_hdl,'Pointer',old_pointer);
return;
end;
range = [min_blv max_blv];
switch action
case {0}
plot_st_brainlv(PLSresultFile,lv_idx,slice_idx,thresh,range,0,sa,cluster_info,update);
case {1}
plot_st_brainlv(PLSresultFile,lv_idx,slice_idx,thresh,range,1,sa,cluster_info,update);
end;
else % plot bootstrap ratio
h = findobj(gcf,'Tag','BSThreshold');
thresh_ratio = str2num(get(h,'String'));
h = findobj(gcf,'Tag','MaxRatio'); max_ratio = str2num(get(h,'String'));
h = findobj(gcf,'Tag','MinRatio'); min_ratio = str2num(get(h,'String'));
if isempty(max_ratio) | isempty(min_ratio) | isempty(thresh_ratio) | ...
(abs(max_ratio) < thresh_ratio) | (abs(min_ratio) < thresh_ratio)
msg = 'ERROR: Invalid threshold.';
set(findobj(gcf,'Tag','MessageLine'),'String',msg);
set(fig_hdl,'Pointer',old_pointer);
return;
end;;
range = [min_ratio max_ratio];
switch action
case {0}
plot_bs_ratio(PLSresultFile,lv_idx,slice_idx,thresh_ratio,range,0,sa,cluster_info,update);
case {1}
plot_bs_ratio(PLSresultFile,lv_idx,slice_idx,thresh_ratio,range,1,sa,cluster_info,update);
end;
end;
set(fig_hdl,'Pointer',old_pointer);
if ~action
setting = getappdata(gcf,'setting');
if isempty(setting) | ~isfield(setting,'origin')
setting.origin = getappdata(gcf,'STOrigin');
else
setappdata(gcf,'STOrigin',setting.origin);
setappdata(gcf,'Origin',setting.origin);
end;
setting.lv_idx = lv_idx;
setting.rot_amount = getappdata(gcf,'RotateAmount');
setting.rescale = get(findobj(gcf,'Tag','RESCALECheckbox'),'value');
setting.first_slice = first_slice;
setting.slice_step = step;
setting.last_slice = last_slice;
if (getappdata(gcf,'ViewBootstrapRatio') == 0), % plot brain lv
setting.thresh{lv_idx} = str2num(get(findobj(gcf,'Tag','Threshold'),'String'));
setting.min_blv{lv_idx} = min_blv;
setting.max_blv{lv_idx} = max_blv;
else % plot bootstrap ratio
setting.bs_thresh{lv_idx} = str2num(get(findobj(gcf,'Tag','BSThreshold'),'String'));
setting.min_ratio{lv_idx} = min_ratio;
setting.max_ratio{lv_idx} = max_ratio;
end
setappdata(gcf,'setting',setting);
end
% create / or re-create xhair
%
ax = getappdata(gcf,'BlvAxes');
p_img = getappdata(gcf,'p_img');
if isempty(p_img)
p_img = [-1 -1];
end
img_xhair = getappdata(gcf,'img_xhair');
img_xhair = rri_xhair(p_img,img_xhair,ax);
%%%%%%%%%%% update xhair %%%%%%%%%%%%
h_img = findobj(gcf,'tag','BLVImg');
img_xlim = get(h_img, 'xdata');
img_ylim = get(h_img, 'ydata');
img_lx = img_xhair.lx;
img_ly = img_xhair.ly;
set(img_lx,'xdata', img_xlim, 'ydata', [p_img(2) p_img(2)]);
se
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -