[Master Index] [Index for Toolbox]

least_squares_parameters_cb

(Toolbox/least_squares_parameters_cb.m in BrainStorm 2.0 (Alpha))


Function Synopsis

ohf = least_squares_parameters_cb(action,GUI,hf);

Help Text

LEAST_SQUARES_PARAMETERS_CB - least_squares GUI setup and execution
 function ohf = least_squares_parameters_cb(action,GUI,hf);
 function hf = least_squares_parameters_cb; % Build and return handle to figure
 function least_squares_parameters_cb(action); % switchyard
 function least_squares_parameters_cb(StudySubject,GUI,hf); % initialize
 Called with no action, it will build the GUI window using least_squares_parameters.fig
 action may be either a string or a StudySubject structure
 StudySubject must be a proper find_brainstorm_structure
 In the initialization, GUI must contain the fields
  GUI.Segment, vector of column indices to process in the data matrix
  GUI.Rank, the rank of the signal subspace to use
  GUI.DataName, the referentially qualified filename of the data set
  GUI.ChannelFlag, +1 for each channel to be used

Cross-Reference Information

This function calls
This function is called by

Listing of function C:\BrainStorm_2001\Toolbox\least_squares_parameters_cb.m

function ohf = least_squares_parameters_cb(action,GUI,hf);
%LEAST_SQUARES_PARAMETERS_CB - least_squares GUI setup and execution
% function ohf = least_squares_parameters_cb(action,GUI,hf);
% function hf = least_squares_parameters_cb; % Build and return handle to figure
% function least_squares_parameters_cb(action); % switchyard
% function least_squares_parameters_cb(StudySubject,GUI,hf); % initialize
% Called with no action, it will build the GUI window using least_squares_parameters.fig
% action may be either a string or a StudySubject structure
% StudySubject must be a proper find_brainstorm_structure
% In the initialization, GUI must contain the fields
%  GUI.Segment, vector of column indices to process in the data matrix
%  GUI.Rank, the rank of the signal subspace to use
%  GUI.DataName, the referentially qualified filename of the data set
%  GUI.ChannelFlag, +1 for each channel to be used

%<autobegin> ---------------------- 26-May-2004 11:30:49 -----------------------
% --------- Automatically Generated Comments Block Using AUTO_COMMENTS ---------
%
% CATEGORY: Inverse Modeling
%
% Alphabetical list of external functions (non-Matlab):
%   toolbox\get_user_directory.m
%   toolbox\least_squares_fit.m
%   toolbox\least_squares_parameters_cb.m  NOTE: Routine calls itself explicitly
%
% Figure Files opened by this function:
%   'least_squares_parameters.fig'
%
%   Format of strings below: Type:Style:Tag, "String", CallBack Type and Call
%   <automatic> callback is <Tag>_Callback by Matlab default
%
% Callbacks by figure least_squares_parameters.fig
%   figure::figure_LeastSquaresGui "" uses KeyPressFcn for dokeypress(gcbf)
%   figure::figure_LeastSquaresGui "" uses ResizeFcn for doresize(gcbf)
%   uicontrol:edit:edit_CurrentDipoleStereo "1" uses Callback for
%     least_squares_parameters_cb('set number')
%   uicontrol:edit:edit_MagneticDipole "1" uses Callback for
%     least_squares_parameters_cb('set number')
%   uicontrol:edit:edit_MagneticDipoleStereo "1" uses Callback for
%     least_squares_parameters_cb('set number')
%   uicontrol:edit:edit_Multipole "1" uses Callback for least_squares_parameters_cb('set number')
%   uicontrol:edit:edit_MultipoleStereo "1" uses Callback for
%     least_squares_parameters_cb('set number')
%   uicontrol:edit:EditCurrentDipole "1" uses Callback for least_squares_parameters_cb('set number')
%   uicontrol:popupmenu:popup_regularization "Regularization . . ." uses Callback for
%     least_squares_parameters_cb('set reg')
%   uicontrol:pushbutton:pushbutton_close "Close" uses Callback for delete(gcbf)
%   uicontrol:pushbutton:pushbutton_EditStartingPoints "Edit" uses Callback for
%     least_squares_parameters_cb('edit starting points');
%   uicontrol:pushbutton:pushbutton_Execute "Execute" uses Callback for
%     least_squares_parameters_cb('execute rap');
%   uicontrol:pushbutton:pushbutton_LoadStartingPoints "Load" uses Callback for
%     least_squares_parameters_cb('load starting points');
%   uicontrol:radiobutton:radio_CurrentDipole "Current Dipole" uses Callback for
%     least_squares_parameters_cb('set source')
%   uicontrol:radiobutton:radio_CurrentDipoleStereo "   Stereo Pair" uses Callback for
%     least_squares_parameters_cb('set source')
%   uicontrol:radiobutton:radio_MagneticDipole "Magnetic Dipole" uses Callback for
%     least_squares_parameters_cb('set source')
%   uicontrol:radiobutton:radio_MagneticDipoleStereo "   Stereo Pair" uses Callback for
%     least_squares_parameters_cb('set source')
%   uicontrol:radiobutton:radio_Moving "Moving" uses Callback for
%     least_squares_parameters_cb('set spatiotemporal')
%   uicontrol:radiobutton:radio_Multipole "1st-order Multipole" uses Callback for
%     least_squares_parameters_cb('set source')
%   uicontrol:radiobutton:radio_MultipoleStereo "   Stereo Pair" uses Callback for
%     least_squares_parameters_cb('set source')
%   uicontrol:radiobutton:radio_OrientationFixed "Fixed" uses Callback for
%     least_squares_parameters_cb('set orientation')
%   uicontrol:radiobutton:radio_OrientationRotating "Rotating" uses Callback for
%     least_squares_parameters_cb('set orientation')
%   uicontrol:radiobutton:radio_OrientationSynchronous "Synchronous" uses Callback for
%     least_squares_parameters_cb('set orientation')
%   uicontrol:radiobutton:radio_Stationary "Stationary" uses Callback for
%     least_squares_parameters_cb('set spatiotemporal')
%
% At Check-in: $Author: Mosher $  $Revision: 13 $  $Date: 5/26/04 9:59a $
%
% 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:30:49 -----------------------

% ----------------------------- Script History ---------------------------------
% Author: John C. Mosher
% 19-May-2004 JCM Comments Cleaning
% ----------------------------- Script History ---------------------------------

linecolor = [.7 .7 .0]; % Line color for coordinates display

if(~exist('action')),
   open('least_squares_parameters.fig');
   ohf = gcf; %the new figure handle
   return   
end


if(isstruct(action)), % call is rap_parameters_cb(StudySubject,GUI)
   StudySubject = action;
   action = 'initialize';
else
   hf = gcbf; % the figure that called this
end

switch deblank(lower(action))
   
case 'initialize'
   % this action may be called by other windows, so consider gcf, gcbo
   %  do not recommend further recursive calls inside this case.
   Names = fieldnames(GUI); % what did the user provide
   temp = GUI; % will now overwrite
   GUI = struct('DataName',[],'Results',[],'Segment',[],'Order',[],'Rank',[],...
      'Corr',[],'ChannelFlag',[],'DisplayGraphics',[],'Tikhonov',[],'Column_norm',[]);
   for i = 1:length(Names),
      %map data in temp to data in GUI
      GUI = setfield(GUI,Names{i},getfield(temp,Names{i}));
   end
   % is there a slicker way to do this? JCM 2/17/00
   
   % so now I have the initial GUI parameters I need for RAP-MUSIC.
   % Map into the uicontrols
   
   ht = findobj(hf,'Tag','TextBrainStormStudy');
   set(ht,'String',StudySubject.Study);
   ht = findobj(hf,'Tag','TextBrainStormData');
   set(ht,'String',GUI.DataName);
   ht = findobj(hf,'Tag','TextBrainStormComment');
   set(ht,'String',sprintf('Rank: %.0f, From index %.0f to %.0f',...
      GUI.Rank,GUI.Segment(1),GUI.Segment(end)));
   
   % establish starting points
   GUI.StartingPoints = cell(1);
   GUI.StartingPoints = {[NaN NaN NaN]'}; % no starting points declared
   
   % make sure all edit windows are set to one
   TAGS = {'CurrentDipole','MagneticDipole','Multipole'};
   for i = 1:length(TAGS),
      ht = findobj(hf,'Tag',['Edit' TAGS{i}]);
      set(ht,'String','1'); % number of sources
      ht = findobj(hf,'Tag',['Edit' TAGS{i} 'Stereo']);
      set(ht,'String','1'); % number of sources
   end

   % store in the window user data
   set(hf,'UserData',struct('StudySubject',StudySubject,'GUI',GUI));
   
   % view the starting points
   % least_squares_parameters_cb('display starting points') % can't recursively call
   ht = findobj(hf,'Tag','ListBoxStartingPoints');
   set(ht,'String','  Random Start');
      
case 'set reg'
   i = get(gcbo,'Value');
   ht = findobj(hf,'Tag','EditReg'); % the edit field
   switch i
   case 1
      set(ht,'String',' ')
      str = get(gcbo,'String');
      set(gcbo,'String','Select Method');
      pause(1)
      set(gcbo,'String',str)
   case 2
      % truncated SVD
      set(ht,'String','100')
   case 3
      % energy truncation
      set(ht,'String','.98')
   case 4
      % Tikhonov Condition
      set(ht,'String','100')
   case 5
      % none, do nothing
      set(ht,'String',' ')
   end
   
case 'set number'
   % set the number of sources. Also set the radio button of
   %  whomever called it
   NumSources = str2num(get(gcbo,'String'));
   
   % want the existing list of starting points
   UD = get(hf,'UserData');
   GUI = UD.GUI;
   
   if(size(GUI.StartingPoints{1},2) < NumSources),
      GUI.StartingPoints{1}(:,(end+1):NumSources) = NaN; % set to NaN for random
   else
      GUI.StartingPoints{1} = GUI.StartingPoints{1}(:,1:NumSources); % trim to desired
   end
      
   UD = setfield(UD,'GUI',GUI); % replace the userfield data
   set(hf,'UserData',UD); % put it back
   
   % set the radio button of the edit field that called this
   % Possible Tag roots are prefixed by Edit:
   TAGS = {'MultipoleStereo','CurrentDipoleStereo','MagneticDipoleStereo',...
         'Multipole','CurrentDipole','MagneticDipole'};
   for i = 1:length(TAGS),
      ht = findobj(hf,'Tag',TAGS{i});
      set(ht,'Value',0);
   end
   TAG = get(gcbo,'Tag'); % the edit field that called us
   TAG = strrep(TAG,'Edit',''); % strip the edit prefix from it
   ht = findobj(hf,'TAG',TAG); % the corresponding radio button
   set(ht,'Value',1); % set the calling one on
   
   % now display the starting points
   least_squares_parameters_cb('display starting points');
   
case 'display starting points'
   
   UD = get(hf,'UserData');
   StartingPoints = UD.GUI.StartingPoints;
   
   str = cell(1,size(StartingPoints{1},2));
   for i = 1:size(StartingPoints{1},2), % cells
      if(isnan(StartingPoints{1}(1,i))),
         % a random point
         str{i} = '  Random Start';
      else
         str{i} = sprintf(' [ %6.1f %6.1f %6.1f ] mm',...
            StartingPoints{1}(:,i)*1000);
      end
   end
   str = [{' '} str]; %prepend with a blank line for aesthetics
   
   ht = findobj(hf,'Tag','ListBoxStartingPoints');
   set(ht,'String',str);
   
case 'load starting points'
   % load a set of starting points from a file, presumably a results file
   % All that really matters is that the file contain SourceLoc, a 
   %  cell array of three-dimensional locations
   User = get_user_directory; % the default locations of files
   cd(User.STUDIES); % set to the studies tree
   [Filename,Pathname]= uigetfile('*results*.mat',...
      'Select a File to Load in a Set of Starting Points'); 
   if(Filename == 0),
      % user selected nothing, do nothing
      return
   end
   
   UserFile = load(fullfile(Pathname,Filename));
   if(~isfield(UserFile,'SourceLoc')),
      errordlg('The file you selected does not have SourceLoc',...
         'Least Squares Load Error');
      return
   end
   UD = get(hf,'UserData');
   % extract matrix of starting points
   StartingPoints{1} =  [UserFile.SourceLoc{:}]; % map all starting points
   
   UD.GUI = setfield(UD.GUI,'StartingPoints',StartingPoints); 
   set(hf,'UserData',UD); % put it back
   
   % set all edit windows to this number
   TAGS = {'CurrentDipole','MagneticDipole','Multipole'};
   for i = 1:length(TAGS),
      ht = findobj(hf,'Tag',['Edit' TAGS{i}]);
      set(ht,'String',num2str(size(StartingPoints{1},2))); % number of sources
      ht = findobj(hf,'Tag',['Edit' TAGS{i} 'Stereo']);
      set(ht,'String',num2str(size(StartingPoints{1},2))); % number of sources
   end

   % now display the starting points
   least_squares_parameters_cb('display starting points');
   
case 'edit starting points'
   UD = get(hf,'UserData');
   StartingPoints = UD.GUI.StartingPoints;

   % edit the starting points to include non-random points
   dlgTitle = 'Starting Points';
   lineNo = 1;
   prompt = cell(1,size(StartingPoints{1},2));
   def = cell(1,size(StartingPoints{1},2));
   for i = 1:size(StartingPoints{1},2),
      prompt{i} = sprintf('Source %.0f (x y z triplet, (r)andom, or (d)elete)',i);
      if(isnan(StartingPoints{1}(1,i))),
         def{i} = 'random';
      else
         def{i} = sprintf('%.1f ',StartingPoints{1}(:,i)*1000);
      end
   end
   answer = inputdlg(prompt,dlgTitle,lineNo,def,...
      struct('Interpreter','none','Resize','off','WindowStyle','Modal'));
   
   if(isempty(answer))
      % user cancelled
      return
   end
   
   delete_ndx= []; % delete this starting point
   for i = 1:length(answer),
      switch deblank(lower(answer{i}(1)))
      case 'd' % remove this starting poitn
         delete_ndx = [delete_ndx i];
      case 'r' % random
         StartingPoints{1}(:,i) = [NaN NaN NaN]'; % flag into least squares program
      otherwise         
         StartingPoints{1}(:,i) = sscanf(answer{i},'%f')/1000;
      end
   end
   
   % delete the starting points the user didn't want
   StartingPoints{1}(:,delete_ndx) = [];
   
   % replace the userfield data
   UD.GUI = setfield(UD.GUI,'StartingPoints',StartingPoints); 
   set(hf,'UserData',UD); % put it back
      
   % set all edit windows to this number
   TAGS = {'CurrentDipole','MagneticDipole','Multipole'};
   for i = 1:length(TAGS),
      ht = findobj(hf,'Tag',['Edit' TAGS{i}]);
      set(ht,'String',num2str(size(StartingPoints{1},2))); % number of sources
      ht = findobj(hf,'Tag',['Edit' TAGS{i} 'Stereo']);
      set(ht,'String',num2str(size(StartingPoints{1},2))); % number of sources
   end

   % now display the starting points
   least_squares_parameters_cb('display starting points');
   
case 'set source'
   % for now, we only allow a single source type
   
   % the source checkbox tags
   TAGS = {'MultipoleStereo','CurrentDipoleStereo','MagneticDipoleStereo',...
         'Multipole','CurrentDipole','MagneticDipole'};
   
   for i = 1:length(TAGS),
      ht = findobj(hf,'Tag',TAGS{i});
      set(ht,'Value',0);
   end
   
   set(gcbo,'Value',1); % set the calling one on
   
   % set the number of sources correctly
   TAG = get(gcbo,'Tag'); % get the tag of the caller
   ht = findobj(hf,'Tag',['Edit' TAG]); % it's corresponding edit box
   UD = get(hf,'UserData'); % the present user data
   % set present length of starting points
   set(ht,'String',num2str(size(UD.GUI.StartingPoints{1},2)));

case 'set orientation'
   % either fixed or rotating, not both
   TAGS = {'OrientationRotating','OrientationFixed','OrientationSynchronous'};
   for i = 1:length(TAGS),
      ht = findobj(hf,'Tag',TAGS{i});
      set(ht,'Value',0); % clear all tags
   end
   
   set(gcbo,'Value',1); % set the calling one on

case 'set spatiotemporal'
   % either stationary or moving, not both
   TAGS = {'Stationary','Moving'};
   for i = 1:length(TAGS),
      ht = findobj(hf,'Tag',TAGS{i});
      set(ht,'Value',0); % clear all tags
   end
   
   set(gcbo,'Value',1); % set the calling one on

case 'execute rap'
   
   % collect up the stats
   UD = get(hf,'UserData');
   StudySubject = UD.StudySubject; %stored there
   GUI = UD.GUI;
   clear UD
   
   % now set the Orders to search by checking which flags are set
   % the source checkbox tags
   GUI.Order = []; % initialize
   GUI.Sync = [];
   TAGS = {'CurrentDipole','MagneticDipole','Multipole'};
   for i = 1:length(TAGS),
      ht = findobj(hf,'Tag',TAGS{i});
      if(get(ht,'Value')),
         GUI.Order(end+1) = i-2; % -1, 0, 1
         ht = findobj(hf,'Tag',['Edit' TAGS{i}]);
         GUI.Sync(end+1) = str2num(get(ht,'String')); % number of sources
      end
   end
   % now the stereo ones
   for i = 1:length(TAGS),
      ht = findobj(hf,'Tag',[TAGS{i} 'Stereo']);
      if(get(ht,'Value')),
         GUI.Order(end+1) = i-2; % -1, 0, 1
         ht = findobj(hf,'Tag',['Edit' TAGS{i} 'Stereo']);
         GUI.Sync(end+1) = str2num(get(ht,'String')); % number of sources
         GUI.Sync(end) = -GUI.Sync(end); %flag that sources are stereo
      end
   end
   
   if(isempty(GUI.Order)), % user didn't check anything
      msgbox('You must select a starting model order','Notice','modal');
      return
   end
   
   if(length(GUI.Order) > 1),
      msgbox('Sorry, unable yet to handle multiple source types.','Notice','modal');
      return
   end
      
   ht = findobj(hf,'Tag','PopupReg');
   hs = findobj(hf,'Tag','EditReg');
   i = get(ht,'Value');
   switch i
   case 1
      msgbox('You must select a regularization technique','Notice','modal');
      return
   case 2
      % truncated svd
      GUI.Condition = str2num(get(hs,'String'));
      GUI.Energy = [];
      GUI.Tikhonov = [];
   case 3
      % energy svd
      GUI.Condition = [];
      GUI.Energy = str2num(get(hs,'String'));
      GUI.Tikhonov = [];
   case 4
      % Tikhonov Condition normalization
      GUI.Condition = [];
      GUI.Energy = [];
      GUI.Tikhonov = str2num(get(hs,'String'));
   case 5
      % none
      GUI.Condition = [];
      GUI.Energy = [];
      GUI.Tikhonov = [];
   end
   
   hcn = findobj(hf,'Tag','CheckboxColumnNorm');
   GUI.Column_norm = get(hcn,'Value'); % 0 is no, 1 is yes
   
   % What is the orientation
   % either fixed or rotating, not both
   TAGS = {'OrientationRotating','OrientationFixed','OrientationSynchronous'};
   GUI.Orientation = [];
   for i = 1:length(TAGS),
      ht = findobj(hf,'Tag',TAGS{i});
      if(get(ht,'Value'));
         GUI.Orientation{end+1} = TAGS{i};
      end
   end
   if(length(GUI.Orientation) ~= 1),
      msgbox('Sorry, unable yet to handle multiple orientation models.',...
         'Notice','modal');
      return
   end
   
   % What is temporal model
   % either Stationary or Moving, not both
   TAGS = {'Stationary','Moving'};
   GUI.Temporal = [];
   for i = 1:length(TAGS),
      ht = findobj(hf,'Tag',TAGS{i});
      if(get(ht,'Value'));
         GUI.Temporal{end+1} = TAGS{i};
      end
   end
   if(length(GUI.Temporal) ~= 1),
      msgbox('Sorry, unable yet to handle multiple temporal models.',...
         'Notice','modal');
      return
   end
   
   % now hash together a results name
   [PATH,NAME,EXT,VER] = fileparts(GUI.DataName);
   c = clock;
   newname = fullfile(PATH,[NAME sprintf('_results_%02.0f%02.0f',c(4:5)) EXT VER]);
   i = 0;
   while(exist(newname,'file')),
      i = i+1; % subtract another minute
      c(5) = mod(c(5) - 1,60);
      newname = fullfile(PATH,[NAME sprintf('_results_%02.0f%02.0f',c(4),c(5)) EXT VER]);
   end
   GUI.Results = newname;
   
   more off % let the text flow freely
   
   %% CHEAT %% for displaying graphic
   GUI.DisplayGraphics = 1; % always display
   [PATH,NAME,EXT,VER] = fileparts(StudySubject.SubjectTess);
   
   TessRap = fullfile(PATH,[[NAME '_rap'] EXT VER]); % possible tesselation file
   if(exist(TessRap,'file')), % there is a reduce one for rap
      StudySubject.SubjectTess = TessRap; % map it in
   end
   
   % now adjust for March 2000 version
   temp = GUI.Order;
   temp2 = [GUI.StartingPoints{:}]; % cat all starting points
   
   GUI.Order = cell(1,size(temp2,2)); % one cell per starting poit
   GUI.StartingPoints = GUI.Order; % same size
   for i = 1:length(GUI.StartingPoints),
      GUI.StartingPoints{i} = temp2(:,i); % single starting point
      GUI.Order{i} = temp; % model order
   end
   

   least_squares_fit(StudySubject,GUI);
   
otherwise
   
   errordlg(sprintf('Unknown action: %s',action),'LEAST SQUARES');
   
end % case switch of actions

if(nargout),
   ohf = hf;
end

return

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