📄 fmri_input_contrast_ui.m
字号:
fig_hdl = h0;
return; % init
%----------------------------------------------------------------------------
function SetupContrastRows()
contrast_template = getappdata(gcf,'ContrastTemplate');
contrast_hdls = getappdata(gcf,'Contrast_hlist');
contrast_h = getappdata(gcf,'ContrastHeight');
a_hdls = getappdata(gcf,'AddRowHdls');
button_pos = get(findobj(gcf,'Tag','ContrastFrame'),'Position');
top_pos = get(contrast_hdls(1,1),'Position');
rows = floor(( top_pos(2) - button_pos(2) ) / contrast_h);
v_pos = top_pos(2) - [0:rows-1]*contrast_h;
edit_name_cbf = 'fmri_input_contrast_ui(''UPDATE_CONTRAST_NAME'');';
delete_cbf = 'fmri_input_contrast_ui(''DELETE_CONTRAST'');';
edit_value_cbf = 'fmri_input_contrast_ui(''UPDATE_CONTRAST_VALUE'');';
plot_cbf = 'fmri_input_contrast_ui(''PLOT_CONTRAST'');';
nr = size(contrast_hdls,1);
if (rows < nr) % too many rows
for i=rows+1:nr,
delete(contrast_hdls(i,:));
end;
contrast_hdls = contrast_hdls(1:rows,:);
else % add new rows
for i=nr+1:rows,
new_c_hdls = copyobj(contrast_template,gcf);
contrast_hdls = [contrast_hdls; new_c_hdls'];
end;
end;
v = 'on';
for i=1:rows,
new_c_hdls = contrast_hdls(i,:);
pos = get(contrast_hdls(1,1),'Position');
pos(2) = v_pos(i);
set(new_c_hdls(1),'String','?','Position',pos,'Visible',v, ...
'UserData',i);
pos = get(contrast_hdls(1,2),'Position');
pos(2) = v_pos(i);
set(new_c_hdls(2),'String','', 'Position',pos, 'Visible',v, ...
'UserData',i,'Callback',edit_name_cbf);
pos = get(contrast_hdls(1,3),'Position');
pos(2) = v_pos(i);
set(new_c_hdls(3),'String','Delete','Position',pos,'Visible',v, ...
'UserData',i,'Callback',delete_cbf);
pos = get(contrast_hdls(1,4),'Position');
pos(2) = v_pos(i)-.05;
set(new_c_hdls(4),'String','', 'Position',pos, 'Visible',v, ...
'UserData',i,'Callback',edit_value_cbf);
pos = get(contrast_hdls(1,5),'Position');
pos(2) = v_pos(i)-.05;
set(new_c_hdls(5),'String','Plot','Position',pos,'Visible',v, ...
'UserData',i,'Callback',plot_cbf);
end;
% set up for the Add row
for i=1:length(a_hdls),
new_pos = get(contrast_hdls(1,i),'Position');
set(a_hdls(i),'Position',new_pos);
end;
setappdata(gcf,'Contrast_hlist',contrast_hdls);
setappdata(gcf,'NumRows',rows);
return; % SetupContrastRows
%----------------------------------------------------------------------------
function DisplayContrasts()
curr_contrast = getappdata(gcf,'CurrContrasts');
top_contrast_idx = getappdata(gcf,'TopContrastIdx');
contrast_hdls = getappdata(gcf,'Contrast_hlist');
rows = getappdata(gcf,'NumRows');
view_only = getappdata(gcf,'ViewOnly');
num_contrast = length(curr_contrast);
last_row = 0;
contrast_idx = top_contrast_idx;
for i=1:rows
c_hdls = contrast_hdls(i,:);
if (contrast_idx <= num_contrast),
contrast_name = curr_contrast(contrast_idx).name;
contrast_values = curr_contrast(contrast_idx).value;
contrast_values_str = Number2String(contrast_values);
set(c_hdls(1),'String',sprintf('%d.',contrast_idx),'Visible','on');
set(c_hdls(2),'String',sprintf('%s',contrast_name),'Visible','on');
if (view_only)
set(c_hdls(3),'String','Delete','Visible','off');
else
set(c_hdls(3),'String','Delete','Visible','on');
end;
set(c_hdls(4),'String',contrast_values_str,'Visible','on');
set(c_hdls(5),'String','Plot','Visible','on');
contrast_idx = contrast_idx + 1;
last_row = i;
else
set(c_hdls(1),'String','','Visible','off');
set(c_hdls(2),'String','','Visible','off');
set(c_hdls(3),'String','Delete','Visible','off');
set(c_hdls(4),'String','','Visible','off');
set(c_hdls(5),'String','Plot','Visible','off');
end;
end;
% display or hide the add row
%
if (last_row < rows) & (view_only ~= 1)
row_idx = last_row+1;
c_hdls = contrast_hdls(row_idx,:);
pos = get(c_hdls(1),'Position');
ShowAddRow(contrast_idx,pos(2),row_idx);
else
HideAddRow;
end;
% display or hide the slider
%
if (top_contrast_idx ~= 1) | (last_row == rows)
ShowSlider;
else
HideSlider;
end;
return; % DisplayContrasts
%----------------------------------------------------------------------------
function CreateAddRow()
contrast_template = getappdata(gcf,'ContrastTemplate');
a_hdls = copyobj(contrast_template,gcf);
set(a_hdls(1),'String','','Foreground',[0 0 0],'Visible','off', ...
'UserData',1);
set(a_hdls(2),'String','< Contrast Name >','Enable','on', ...
'HorizontalAlignment','left', ...
'Foreground',[0 0 0], ...
'Background',[1 1 1],'Visible','off');
set(a_hdls(3),'String','Add','Enable','on', 'Visible','off', ...
'Callback','fmri_input_contrast_ui(''ADD_CONTRAST'');');
set(a_hdls(4),'String','< Contrast Values >','Enable','on', ...
'HorizontalAlignment','left', ...
'Foreground',[0 0 0], ...
'Background',[1 1 1],'Visible','off');
set(a_hdls(5),'String','Plot','Enable','off','Visible','off','Callback','');
setappdata(gcf,'AddRowHdls',a_hdls);
return; % CreateAddRow
%----------------------------------------------------------------------------
function ShowAddRow(contrast_idx,pos,row_idx)
a_hdls = getappdata(gcf,'AddRowHdls');
v_pos = [pos pos pos pos-.05 pos-.05];
for j=1:length(a_hdls),
new_pos = get(a_hdls(j),'Position');
new_pos(2) = v_pos(j);
set(a_hdls(j),'Position',new_pos);
set(a_hdls(j),'Visible','on');
end;
set(a_hdls(2),'string','<Contrast Name>');
set(a_hdls(4),'string','<Contrast Value>');
set(a_hdls(1),'String',sprintf('%d.',contrast_idx),'UserData',row_idx);
set(a_hdls(3),'UserData',row_idx);
return; % ShowAddRow
%----------------------------------------------------------------------------
function HideAddRow()
a_hdls = getappdata(gcf,'AddRowHdls');
for j=1:length(a_hdls),
set(a_hdls(j),'Visible','off');
end;
return; % HideAddRow
%----------------------------------------------------------------------------
function UpdateContrastName(contrast_idx)
view_only = getappdata(gcf,'ViewOnly');
curr_contrast = getappdata(gcf,'CurrContrasts');
contrast_hdls = getappdata(gcf,'Contrast_hlist');
row_idx = get(gcbo,'UserData');
contrast_idx = str2num(get(contrast_hdls(row_idx,1),'String'));
if (view_only), % don't allow changing contrast name
set(gcbo,'String',curr_contrast(contrast_idx).name);
msg = 'ERROR: Contrast name cannot be changed.';
set(findobj(gcf,'Tag','MessageLine'),'String',msg);
return;
end;
curr_contrast(contrast_idx).name = deblank(get(gcbo,'String'));
setappdata(gcf,'CurrContrasts',curr_contrast);
return; % UpdateContrastName
%----------------------------------------------------------------------------
function UpdateContrastValue(contrast_idx)
view_only = getappdata(gcf,'ViewOnly');
curr_contrast = getappdata(gcf,'CurrContrasts');
contrast_hdls = getappdata(gcf,'Contrast_hlist');
conditions = getappdata(gcf,'Conditions');
row_idx = get(gcbo,'UserData');
contrast_idx = str2num(get(contrast_hdls(row_idx,1),'String'));
if (view_only), % don't allow changing contrast name
contrast_values = curr_contrast(contrast_idx).value;
contrast_values_str = Number2String(contrast_values);
set(gcbo,'String',contrast_values_str);
msg = 'ERROR: Contrast values cannot be changed.';
set(findobj(gcf,'Tag','MessageLine'),'String',msg);
return;
end;
contrast_values = str2num(get(gcbo,'String'));
if isempty(contrast_values)
msg = 'ERROR: Invalid contrast values.';
set(findobj(gcf,'Tag','MessageLine'),'String',msg);
return;
end;
if length(conditions) ~= length(contrast_values),
msg = 'ERROR: The number of contrast values does not match the number of conditions.';
set(findobj(gcf,'Tag','MessageLine'),'String',msg);
return;
end;
curr_contrast(contrast_idx).value = contrast_values;
% verify the contrasts are linear independent
%
num_contrasts = length(curr_contrast);
contrast_mat = [];
for i=1:num_contrasts;
if ~isempty(curr_contrast(i).value)
contrast_mat = [contrast_mat; curr_contrast(i).value];
end;
end;
if (rank(contrast_mat) ~= size(contrast_mat,1))
msg = 'ERROR: The specified contrast is not linear independent to the others.';
set(findobj(gcf,'Tag','MessageLine'),'String',msg);
return;
end;
setappdata(gcf,'CurrContrasts',curr_contrast);
PlotContrast;
return; % UpdateContrastValue
%----------------------------------------------------------------------------
function DeleteContrast()
curr_contrast = getappdata(gcf,'CurrContrasts');
contrast_hdls = getappdata(gcf,'Contrast_hlist');
row_idx = get(gcbo,'UserData');
contrast_idx = str2num(get(contrast_hdls(row_idx,1),'String'));
mask = ones(1,length(curr_contrast)); mask(contrast_idx) = 0;
idx = find(mask == 1);
curr_contrast = curr_contrast(idx);
setappdata(gcf,'CurrContrasts',curr_contrast);
DisplayContrasts;
UpdateSlider;
return; % DeleteContrast
%----------------------------------------------------------------------------
function AddContrast()
conditions = getappdata(gcf,'Conditions');
if isempty(conditions),
msg = sprintf('Cannot add contrasts without loading conditions first.');
set(findobj(gcf,'Tag','MessageLine'),'String',['ERROR: ', msg]);
return;
end;
curr_contrast = getappdata(gcf,'CurrContrasts');
old_contrast = curr_contrast; % save, in case roll back
rows = getappdata(gcf,'NumRows');
a_hdls = getappdata(gcf,'AddRowHdls');
contrast_idx = str2num(get(a_hdls(1),'String'));
contrast_name = get(a_hdls(2),'String');
contrast_value = get(a_hdls(4),'String');
num_contrast = length(curr_contrast)+1;
% curr_contrast(num_contrast).name = '';
% curr_contrast(num_contrast).value = [];
curr_contrast(num_contrast).name = contrast_name;
curr_contrast(num_contrast).value = contrast_value;
setappdata(gcf,'CurrContrasts',curr_contrast);
UpdateContrastName2;
err = UpdateContrastValue2;
if err
setappdata(gcf,'CurrContrasts',old_contrast); % roll back
return;
end
new_contrast_row = get(a_hdls(1),'UserData');
if (new_contrast_row == rows), % the new contrast row is the last row
top_contrast_idx = getappdata(gcf,'TopContrastIdx');
setappdata(gcf,'TopContrastIdx',top_contrast_idx+1);
end;
DisplayContrasts;
contrast_hdls = getappdata(gcf,'Contrast_hlist');
if (new_contrast_row == rows), % the new contrast row is the last row
set(gcf,'CurrentObject',contrast_hdls(rows-1,2));
else
set(gcf,'CurrentObject',contrast_hdls(new_contrast_row,2));
end;
UpdateSlider;
return; % AddContrasts
%----------------------------------------------------------------------------
function MoveSlider()
slider_hdl = findobj(gcf,'Tag','ContrastSlider');
curr_value = round(get(slider_hdl,'Value'));
total_rows = round(get(slider_hdl,'Max'));
top_contrast_idx = total_rows - curr_value + 1;
setappdata(gcf,'TopContrastIdx',top_contrast_idx);
DisplayContrasts;
return; % MoveSlider
%----------------------------------------------------------------------------
function SetupSlider()
contrast_hdls = getappdata(gcf,'Contrast_hlist');
top_pos = get(contrast_hdls(1),'Position');
bottom_pos = get(contrast_hdls(end),'Position');
slider_hdl = findobj(gcf,'Tag','ContrastSlider');
pos = get(slider_hdl,'Position');
pos(2) = bottom_pos(2);
pos(4) = top_pos(2)+top_pos(4) - pos(2);
set(slider_hdl,'Position', pos);
return; % SetupSlider
%----------------------------------------------------------------------------
function UpdateSlider()
top_contrast_idx = getappdata(gcf,'TopContrastIdx');
rows = getappdata(gcf,'NumRows');
curr_contrast = getappdata(gcf,'CurrContrasts');
num_contrast = length(curr_contrast);
total_rows = num_contrast+1;
slider_hdl = findobj(gcf,'Tag','ContrastSlider');
if (num_contrast ~= 0) % don't need to update when no contrast
set(slider_hdl,'Min',1,'Max',total_rows, ...
'Value',total_rows-top_contrast_idx+1, ...
'Sliderstep',[1/(total_rows-1)-0.00001 1/(total_rows-1)]);
end;
return; % UpdateSlider
%----------------------------------------------------------------------------
function ShowSlider()
slider_hdl = findobj(gcf,'Tag','ContrastSlider');
set(slider_hdl,'visible','on');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -