⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bfm_input_run_ui.m

📁 绝对经典,老外制作的功能强大的matlab实现PLS_TOOBOX
💻 M
📖 第 1 页 / 共 4 页
字号:
   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 + -