[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

    get_user_directory                 C:\BrainStorm_2001\Toolbox\get_user_directory.m
    least_squares_fit                  C:\BrainStorm_2001\Toolbox\least_squares_fit.m

This function is called by

    data_selector_cb                   C:\BrainStorm_2001\Toolbox\data_selector_cb.m
    parametric_estimation              C:\BrainStorm_2001\Toolbox\parametric_estimation.m

### 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 Nov 2 16:17:59 2004
Cross-Directory links are: ON