📄 bfm_input_run_ui.m
字号:
if get(findobj('tag','ReplicateLabel'),'value')
curr_onsets = run_info(1).blk_onsets;
curr_length = run_info(1).blk_length;
end
% ------- set up the field values ------------------------------------
%
% assume the number of scans same as previous run when it is empty
if isempty(curr_num_scans) & (run_idx > 1)
curr_num_scans = run_info(run_idx-1).num_scans;
end
set(findobj(gcf,'Tag','NumScansEdit'),'String',num2str(curr_num_scans));
fname = [];
for i=1:length(curr_data_files),
fname = [fname ' ' curr_data_files{i}];
end;
set(findobj(gcf,'Tag','DataDirectoryEdit'),'String',curr_data_path);
data_info = { curr_data_path, curr_data_files, curr_file_pattern };
set(findobj(gcf,'Tag','DataFileEdit'),'String',fname, ...
'Userdata',data_info);
set(findobj(gcf,'Tag','NumRunEdit'),'String',num2str(run_idx));
setappdata(gcf,'CurrRun',run_idx);
setappdata(gcf,'CurrNumScans',curr_num_scans);
setappdata(gcf,'CurrDataPath',curr_data_path);
setappdata(gcf,'CurrDataFiles',curr_data_files);
setappdata(gcf,'CurrDataPattern',curr_file_pattern);
setappdata(gcf,'CurrOnsets',curr_onsets);
setappdata(gcf,'CurrLength',curr_length);
return; % LoadRunInfo
% --------------------------------------------------------------------
function is_ok = CheckRunInfo
data_path = getappdata(gcf,'CurrDataPath');
data_files = getappdata(gcf,'CurrDataFiles');
if isempty(data_path) | isempty(data_files)
errmsg = 'ERROR: Data Directory and Data Files must be selected';
set(findobj(gcf,'Tag','MessageLine'),'String',errmsg);
is_ok = 0;
return;
end
is_ok = 1;
return; % CheckRunInfo
% --------------------------------------------------------------------
function SaveRunInfo(run_idx, done)
run_info = getappdata(gcf,'SessionRunInfo');
run_info(run_idx).num_scans = getappdata(gcf,'CurrNumScans');
run_info(run_idx).data_path = getappdata(gcf,'CurrDataPath');
run_info(run_idx).data_files = getappdata(gcf,'CurrDataFiles');
run_info(run_idx).file_pattern = getappdata(gcf,'CurrDataPattern');
run_info(run_idx).blk_onsets = getappdata(gcf,'CurrOnsets');
run_info(run_idx).blk_length = getappdata(gcf,'CurrLength');
setappdata(gcf,'SessionRunInfo',run_info);
if exist('done','var')
uiresume(gcbf);
end
return; % SaveRunInfo
%----------------------------------------------------------------------------
function SelectDataFile
old_pointer = get(gcf,'Pointer');
set(gcf,'Pointer','watch');
h = findobj(gcf,'Tag','DataFileEdit');
previous_selected_files = get(h,'Userdata');
if isempty(previous_selected_files{1}),
data_path = getappdata(gcf,'DataDirectory');
curr_files = [];
fpattern = getappdata(gcf,'FilterPattern');
if isempty(fpattern), fpattern = '*.img'; end;
else
data_path = previous_selected_files{1};
curr_files = previous_selected_files{2};
fpattern = previous_selected_files{3};
if isempty(fpattern), fpattern = '*.img'; end;
end;
fig_title = 'Select Data Files';
[num_scans, selected_path, selected_files, filter_pattern] = ...
fmri_getfiles(fig_title,data_path,fpattern,curr_files);
if ~isempty(selected_files),
num_files = length(selected_files);
if (num_scans ~= getappdata(gcf,'CurrNumScans')),
errmsg = 'ERROR: The # of selected scans does not match the # of scans';
set(findobj(gcf,'Tag','MessageLine'),'String',errmsg);
else
img_files = [];
for i=1:num_files,
img_files = [img_files ' ' selected_files{i}];
end;
set(h,'String',img_files);
set(h,'Userdata',{selected_path, selected_files, filter_pattern});
setappdata(gcf,'CurrDataPath', selected_path);
setappdata(gcf,'CurrDataFiles', selected_files);
setappdata(gcf,'CurrDataPattern', filter_pattern);
h = findobj(gcf,'Tag','DataDirectoryEdit');
set(h,'String',selected_path,'TooltipString',selected_path);
data_path = fileparts(selected_path);
setappdata(gcf,'DataDirectory',data_path);
setappdata(gcf,'FilterPattern',filter_pattern);
end;
end;
set(gcf,'Pointer',old_pointer);
return; % SelectDataFile
%----------------------------------------------------------------------------
function SaveButtonPressed()
return; % SaveButtonPressed
%----------------------------------------------------------------------------
function EditNumScans()
num_scans = str2num(get(findobj(gcf,'Tag','NumScansEdit'),'String'));
if isempty(num_scans) | (length(num_scans) > 1),
errmsg = 'The input of number of scans is invalid';
set(findobj(gcf,'Tag','MessageLine'),'String',errmsg);
return;
end;
setappdata(gcf,'CurrNumScans',num_scans);
return; % EditNumScans
%----------------------------------------------------------------------------
function status = EditOnsets(h_onset)
status = 0;
if ~exist('h_onset', 'var')
h_onset = gcbo;
end
num_scans = str2num(get(findobj(gcf,'Tag','NumScansEdit'),'String'));
if isempty(num_scans),
errmsg = 'ERROR: Number of scans must be specified first';
set(findobj(gcf,'Tag','MessageLine'),'String',errmsg);
return;
end;
curr_run = getappdata(gcf,'CurrRun');
curr_onsets = getappdata(gcf,'CurrOnsets');
top_onset_idx = getappdata(gcf,'TopOnsetIdx');
row_idx = get(h_onset,'Userdata');
onset_idx = top_onset_idx + row_idx - 1;
blk_onset = deblank(strjust(get(h_onset,'String'),'left'));
% evaluate the matlab statement if the first character is '@'
% '@@' - last matlab statement
%
if ~isempty(blk_onset) & (blk_onset(1) == '@') % matlab statement
cmd_str = blk_onset(2:end);
if isequal(cmd_str,'@'), % display the last matlab statement
cmd_str = getappdata(gcf,'LastCommand');
set(h_onset,'String', cmd_str);
return;
else
setappdata(gcf,'LastCommand',blk_onset);
cmd_str = strrep(cmd_str,'{run#}',num2str(curr_run));
cmd_str = strrep(cmd_str,'{cond#}',num2str(onset_idx));
onset_list = eval(cmd_str,'[]')';
if isempty(onset_list),
errmsg = 'ERROR: Invalid MATLAB statement to generate the onsets.';
set(findobj(gcf,'Tag','MessageLine'),'String',errmsg);
end;
end;
set(h_onset,'String', Number2String(onset_list));
else
onset_list = str2num(blk_onset)';
end;
if (length(blk_onset) > 0) & isempty(onset_list)
errmsg = 'ERROR: Invalid input onsets';
set(findobj(gcf,'Tag','MessageLine'),'String',errmsg);
return;
end;
if (length(find(onset_list >= num_scans)) ~= 0),
errmsg = 'Cannot have an onset larger than the number of scans';
set(findobj(gcf,'Tag','MessageLine'),'String',errmsg);
return;
end;
curr_onsets{onset_idx} = onset_list;
setappdata(gcf,'CurrOnsets',curr_onsets);
if get(findobj('tag','ReplicateLabel'),'value')
run_info = getappdata(gcf,'SessionRunInfo');
SaveRunInfo(curr_run);
for i = 1:length(run_info)
LoadRunInfo(i);
setappdata(gcf,'CurrOnsets',curr_onsets);
SaveRunInfo(i);
end
ShowRunInfo(curr_run);
end
status = 1;
return; % EditOnsets
%----------------------------------------------------------------------------
function MoveSlider()
slider_hdl = findobj(gcf,'Tag','BlockOnsetSlider');
curr_value = round(get(slider_hdl,'Value'));
total_rows = round(get(slider_hdl,'Max'));
top_onset_idx = total_rows - curr_value + 1;
setappdata(gcf,'TopOnsetIdx',top_onset_idx);
DisplayBlockOnsets;
return; % MoveSlider
%----------------------------------------------------------------------------
function SetupSlider()
top_onset_idx = getappdata(gcf,'TopOnsetIdx');
rows = getappdata(gcf,'NumOnsetRows');
curr_onsets = getappdata(gcf,'CurrOnsets');
num_onset = length(curr_onsets);
total_rows = num_onset;
slider_hdl = findobj(gcf,'Tag','BlockOnsetSlider');
if (total_rows > 1) % don't need to update when no condition
set(slider_hdl,'Min',1,'Max',total_rows, ...
'Value',total_rows-top_onset_idx+1, ...
'Sliderstep',[1/(total_rows-1)-0.00001 1/(total_rows-1)]);
end;
return; % UpdateSlider
%----------------------------------------------------------------------------
function ClearRunInfo()
run_info = getappdata(gcf,'SessionRunInfo');
conditions = getappdata(gcf,'SessionConditions');
curr_run = getappdata(gcf,'CurrRun');
total_runs = getappdata(gcf,'TotalRuns');
run_info(curr_run).num_scans = [];
run_info(curr_run).data_path = [];
run_info(curr_run).data_files = [];
run_info(curr_run).file_pattern = '*.img';
for j=1:length(conditions)
run_info(curr_run).blk_onsets{j} = [];
run_info(curr_run).blk_length{j} = [];
end
setappdata(gcf,'SessionRunInfo',run_info);
LoadRunInfo(curr_run);
DisplayBlockOnsets;
return; % ClearRunInfo
%----------------------------------------------------------------------------
function ShowRunInfo(run_idx)
curr_run = getappdata(gcf,'CurrRun');
total_runs = getappdata(gcf,'TotalRuns');
if (run_idx < 1) | (run_idx > total_runs)
errmsg = 'The run index is out of range';
set(findobj(gcf,'Tag','MessageLine'),'String',errmsg);
set(findobj(gcf,'Tag','NumRunEdit'),'String',num2str(curr_run));
return;
else
SaveRunInfo(curr_run);
end;
LoadRunInfo(run_idx);
DisplayBlockOnsets;
return; % ShowRunInfo
%----------------------------------------------------------------------------
function DeleteRunInfo()
run_info = getappdata(gcf,'SessionRunInfo');
total_runs = getappdata(gcf,'TotalRuns');
curr_run = getappdata(gcf,'CurrRun');
if (total_runs == 1), % it is the only run
ClearRunInfo;
return;
end;
mask = zeros(1,total_runs);
mask(curr_run) = 1;
run_idx = find(mask == 0);
run_info = run_info(run_idx);
setappdata(gcf,'TotalRuns',total_runs-1);
setappdata(gcf,'SessionRunInfo',run_info);
if (curr_run == total_runs),
curr_run = curr_run - 1;
end;
LoadRunInfo(curr_run);
DisplayBlockOnsets;
return; % DeleteRunInfo
%----------------------------------------------------------------------------
function EditDataDirectory
data_dir = get(gcbo,'String');
if (exist(data_dir,'dir') ~= 7)
msg = 'ERROR: Invalid directory.';
set(findobj(gcf,'Tag','MessageLine'),'String',msg);
return;
elseif (strcmp(data_dir,getappdata(gcf,'CurrDataPath')) == 1)
return; %directory has not been changed
else
% update the data directory, and clear the field of the data files
% after changing directory
%
h = findobj(gcf,'Tag','DataFileEdit');
curr_selected_files = get(h,'Userdata');
curr_selected_files{1} = data_dir;
curr_selected_files{2} = [];
set(h,'String','','Userdata',curr_selected_files);
setappdata(gcf,'CurrDataPath',data_dir);
setappdata(gcf,'CurrDataFiles',[]);
end;
return; % EditDataDirectory
%----------------------------------------------------------------------------
function num_str = Number2String(numbers)
if isempty(numbers),
num_str = '';
return;
end;
len = length(numbers);
num = numbers(:); % make sure it is a column vector;
tmp_str = strjust(num2str(num),'left');
num_str = deblank(tmp_str(1,:));
for i=2:len,
num_str = [num_str ' ' deblank(tmp_str(i,:))];
end;
return; % Number2String
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -