[Master Index] [Index for Toolbox]

# data_manager

## (Toolbox/data_manager.m in BrainStorm 2.0 (Alpha))

### Function Synopsis

    varargout = data_manager(varargin)

### Help Text

    DATA_MANAGER - Edit/select database, subjects, studies, datasets, build headmodels, import data.
     function varargout = data_manager(varargin)
        FIG = DATA_MANAGER launch data_manager GUI.
        DATA_MANAGER('callback_name', ...) invoke the named callback.

     This GUI concentrates a lot of data management. The user can edit/select the
      database. The information in any study or subject can be edited. Data from
      the vendors and in ASCII format can be loaded.  Tesselation files can be
      loaded through the subject editor. Headmodels for any study can be generated.

     In addition to generating the appropriate Mat-files, a primary output of this
      manager is the setting of the structures in the BrainStorm Taskbar, which
      allows other routines to determine exactly what data the user wants in the
      other routines. Use get_user_directory to retrieve this structure. This
      structure is also mirrored in the BrainStorm Preferences, so that subsequent
      sessions can begin at the last point, or batch routines can be run.

### Cross-Reference Information

This function calls

    browse_study_folder                C:\BrainStorm_2001\Toolbox\browse_study_folder.m
    bst_color_scheme                   C:\BrainStorm_2001\Toolbox\bst_color_scheme.m
    bst_headmodeler                    C:\BrainStorm_2001\Toolbox\bst_headmodeler.m
    bst_layout                         C:\BrainStorm_2001\Toolbox\bst_layout.m
    bst_message_window                 C:\BrainStorm_2001\Toolbox\bst_message_window.m
    bst_static_taskbar                 C:\BrainStorm_2001\Toolbox\bst_static_taskbar.m
    bst_win_manager                    C:\BrainStorm_2001\Toolbox\bst_win_manager.m
    database_manager                   C:\BrainStorm_2001\Toolbox\database_manager.m
    dataplot_cb                        C:\BrainStorm_2001\Toolbox\dataplot_cb.m
    eeg_bem                            C:\BrainStorm_2001\Toolbox\eeg_bem.m
    engstr                             C:\BrainStorm_2001\Toolbox\engstr.m
    find_brainstorm_files              C:\BrainStorm_2001\Toolbox\find_brainstorm_files.m
    get_channel                        C:\BrainStorm_2001\Toolbox\get_channel.m
    get_user_directory                 C:\BrainStorm_2001\Toolbox\get_user_directory.m
    good_channel                       C:\BrainStorm_2001\Toolbox\good_channel.m
    headmodeler_gui                    C:\BrainStorm_2001\Toolbox\headmodeler_gui.m
    importdata                         C:\BrainStorm_2001\Toolbox\importdata.m
    make_default_database              C:\BrainStorm_2001\Toolbox\make_default_database.m
    makeuswait                         C:\BrainStorm_2001\Toolbox\makeuswait.m
    meg_bem                            C:\BrainStorm_2001\Toolbox\meg_bem.m
    mritool_cb                         C:\BrainStorm_2001\Toolbox\mritool_cb.m
    save_fieldnames                    C:\BrainStorm_2001\Toolbox\save_fieldnames.m
    study_editor                       C:\BrainStorm_2001\Toolbox\study_editor.m
    subject_editor                     C:\BrainStorm_2001\Toolbox\subject_editor.m

This function is called by

    bst_static_taskbar                 C:\BrainStorm_2001\Toolbox\bst_static_taskbar.m
    get_user_directory                 C:\BrainStorm_2001\Toolbox\get_user_directory.m
    headmodeler_gui                    C:\BrainStorm_2001\Toolbox\headmodeler_gui.m
    parametric_estimation              C:\BrainStorm_2001\Toolbox\parametric_estimation.m

### Listing of function C:\BrainStorm_2001\Toolbox\data_manager.m

    function varargout = data_manager(varargin)
    %DATA_MANAGER - Edit/select database, subjects, studies, datasets, build headmodels, import data.
    % function varargout = data_manager(varargin)
    %    FIG = DATA_MANAGER launch data_manager GUI.
    %    DATA_MANAGER('callback_name', ...) invoke the named callback.
    %
    % This GUI concentrates a lot of data management. The user can edit/select the
    %  database. The information in any study or subject can be edited. Data from
    %  the vendors and in ASCII format can be loaded.  Tesselation files can be
    %  loaded through the subject editor. Headmodels for any study can be generated.
    %
    % In addition to generating the appropriate Mat-files, a primary output of this
    %  manager is the setting of the structures in the BrainStorm Taskbar, which
    %  allows other routines to determine exactly what data the user wants in the
    %  other routines. Use get_user_directory to retrieve this structure. This
    %  structure is also mirrored in the BrainStorm Preferences, so that subsequent
    %  sessions can begin at the last point, or batch routines can be run.

    %<autobegin> ---------------------- 14-Jun-2004 17:10:24 -----------------------
    % --------- Automatically Generated Comments Block Using AUTO_COMMENTS ---------
    %
    % CATEGORY: GUI and Related
    %
    % Alphabetical list of external functions (non-Matlab):
    %   toolbox\browse_study_folder.m
    %   toolbox\bst_color_scheme.m
    %   toolbox\bst_headmodeler.m
    %   toolbox\bst_layout.m
    %   toolbox\bst_message_window.m
    %   toolbox\bst_static_taskbar.m
    %   toolbox\bst_win_manager.m
    %   toolbox\data_manager.m  NOTE: Routine calls itself explicitly
    %   toolbox\database_manager.m
    %   toolbox\dataplot_cb.m
    %   toolbox\engstr.m
    %   toolbox\find_brainstorm_files.m
    %   toolbox\get_channel.m
    %   toolbox\get_user_directory.m
    %   toolbox\good_channel.m
    %   toolbox\headmodeler_gui.m
    %   toolbox\importdata.m
    %   toolbox\make_default_database.m
    %   toolbox\makeuswait.m
    %   toolbox\mritool_cb.m
    %   toolbox\save_fieldnames.m
    %   toolbox\study_editor.m
    %   toolbox\subject_editor.m
    %
    % Subfunctions in this file, in order of occurrence in file:
    %   initialize_database(handles); % initialize the database portion
    %   load_listbox_Study(handles);
    %   varargout = popup_CurrentDatabase_Callback(h, eventdata, handles, varargin)
    %   varargout = StudyFolder_Callback(h, eventdata, handles, varargin)
    %   varargout = SubjectFolder_Callback(h, eventdata, handles, varargin)
    %   varargout = listbox_Study_Callback(h, eventdata, handles, varargin)
    %   varargout = listbox_Data_Callback(h, eventdata, handles, varargin)
    %   varargout = LoadSelectedData_Callback(h, eventdata, handles, varargin)
    %   varargout = menu_close_Callback(h, eventdata, handles, varargin)
    %   varargout = menu_import_data_Callback(h, eventdata, handles, varargin)
    %   varargout = menu_edit_subject_Callback(h, eventdata, handles, varargin)
    %   varargout = menu_edit_study_Callback(h, eventdata, handles, varargin)
    %   varargout = menu_edit_database_Callback(h, eventdata, handles, varargin)
    %   varargout = menu_edit_rebuild_Callback(h, eventdata, handles, varargin)
    %   varargout = menu_view_information_Callback(h, eventdata, handles, varargin)
    %   varargout = menu_view_datafiles_Callback(h, eventdata, handles, varargin)
    %   varargout = menu_view_results_Callback(h, eventdata, handles, varargin)
    %   varargout = menu_pooled_define_Callback(h, eventdata, handles, varargin)
    %   varargout = menu_pooled_allow_Callback(h, eventdata, handles, varargin)
    %   varargout = ComputeDefaultHeadModel_Callback(h, eventdata, handles, varargin)
    %   varargout = pushbutton_CoRegisterStudies_Callback(h, eventdata, handles, varargin)
    %   varargout = DataInformation_Callback(h, eventdata, handles, varargin)
    %   varargout = HeadModelAdvanced_Callback(h, eventdata, handles, varargin)
    %   varargout = pushbutton_importdata_Callback(h, eventdata, handles, varargin)
    %   varargout = RefreshHeadModelList_Callback(h, eventdata, handles, varargin)
    %   varargout = Manage_DataBase_Callback(h, eventdata, handles, varargin)
    %   varargout = ResultFiles_Callback(h, eventdata, handles, varargin)
    %   varargout = DataFiles_Callback(h, eventdata, handles, varargin)
    %   varargout = StudyBatch_Callback(h, eventdata, handles, varargin)
    %   varargout = MRITool_Callback(h, eventdata, handles, varargin)
    %   varargout = HeadModelList_Callback(h, eventdata, handles, varargin)
    %   varargout = pushbutton_LoadView_Callback(h, eventdata, handles, varargin)
    %   varargout = StudyFile_Callback(h, eventdata, handles, varargin)
    %   varargout = SubjectFile_Callback(h, eventdata, handles, varargin)
    %   varargout = Quit_Callback(h, eventdata, handles, varargin)
    %   varargout = Refresh_Callback(h, eventdata, handles, varargin)
    %
    % Group : Preference data and their calls in this file:
    %   'BrainStorm' : 'CurrentData'
    %   'BrainStorm' : 'Studies'
    %   'BrainStorm' : 'Subjects'
    %   'BrainStorm' : 'UserDataBase'
    %   'BrainStorm' : 'iUserDataBase'
    %
    %   setpref('BrainStorm','CurrentData',CurrentData);
    %   setpref('BrainStorm','CurrentData',Users.CurrentData);
    %   setpref('BrainStorm','Studies', Studies);
    %   setpref('BrainStorm','Subjects', Subjects);
    %   setpref('BrainStorm','UserDataBase',UserDB)
    %   setpref('BrainStorm','UserDataBase',UserDB);
    %   setpref('BrainStorm','iUserDataBase',iDatabase);
    %
    %   Layout = getpref('BrainStorm','Layout');
    %   UserDB = getpref('BrainStorm','UserDataBase');
    %   iDB = getpref('BrainStorm','iUserDataBase');
    %   iUserDB = getpref('BrainStorm','iUserDataBase');
    %
    % Application data and their calls in this file:
    %   'DataFiles'
    %   'DataParam'
    %   'FileList'
    %   'TileType'
    %
    %   Users.FILELIST = FileList; %setappdata(fig,'FileList',FileList);
    %   setappdata(fig,'DataFiles',DataFiles);
    %   setappdata(fig,'DataFiles',[]);
    %   setappdata(fig,'DataParam',DataParam);
    %   setappdata(fig,'DataParam',DataParamStr)
    %   setappdata(fig,'FileList',FileList);
    %   setappdata(fig,'TileType','T');
    %   setappdata(h,'TileType','T');
    %
    %   DataFiles = getappdata(fig,'DataFiles');
    %   DataParam = getappdata(figs.DataManager,'DataParam');
    %   DataParamStr = getappdata(fig,'DataParam');
    %   FileList = Users.FILELIST; %getappdata(fig,'FileList');
    %   char(getappdata(handles.DataParam,'HeadModelFunction'))}
    %
    % Figure Files opened by this function:
    %   mfilename
    %
    %   Format of strings below: Type:Style:Tag, "String", CallBack Type and Call
    %   <automatic> callback is <Tag>_Callback by Matlab default
    %
    % Callbacks by figure data_manager.fig
    %   uicontrol:listbox:listbox_Data "Select a data folder in the list above" uses Callback for <automatic>
    %   uicontrol:listbox:listbox_Study "Scanning Current Folder Tree..." uses Callback for <automatic>
    %   uicontrol:popupmenu:popup_CurrentDatabase "Databases" uses Callback for <automatic>
    %   uimenu::menu_close "" uses Callback for <automatic>
    %   uimenu::menu_edit_database "" uses Callback for <automatic>
    %   uimenu::menu_edit_rebuild "" uses Callback for <automatic>
    %   uimenu::menu_edit_study "" uses Callback for <automatic>
    %   uimenu::menu_edit_subject "" uses Callback for <automatic>
    %   uimenu::menu_import_data "" uses Callback for <automatic>
    %   uimenu::menu_pooled_allow "" uses Callback for <automatic>
    %   uimenu::menu_pooled_define "" uses Callback for <automatic>
    %   uimenu::menu_view_datafiles "" uses Callback for <automatic>
    %   uimenu::menu_view_information "" uses Callback for <automatic>
    %   uimenu::menu_view_results "" uses Callback for <automatic>
    %
    % At Check-in: $Author: Mosher $  $Revision: 71 $  $Date: 6/14/04 3:37p $
    %
    % This software is part of BrainStorm Toolbox Version 2.0 (Alpha) 14-Jun-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> ------------------------ 14-Jun-2004 17:10:24 -----------------------

    % Descriptions of Group: Preference data
    %
    % Group BrainStorm, Preferences:
    %   'CurrentData' is a structure comprising fields:
    %     StudyFile and SubjectFile,both referential filenames to the
    %       current *_brainstormstudy.mat and *_brainstormsujbect.mat files.
    %     SubjectName, string giving current name
    %     DataFile, referential name to the current data file in use
    %     OtherDataFiles, list of additional data filenames to be processed identically
    %      to the DataFile (CHEAT: Are they referential or absolute?)
    %
    %   'UserDataBase' is the User structured array, User(i) comprising the fields
    %     Comment, STUDIES,and SUBJECTS. Comment is a string AKA the database name,
    %     STUDIES is the absolute path to the root of the studies folders, and
    %     SUBJECTS is the absolute path to the root of the subjects folders.
    %
    %   'iUserDataBase' is simply an integer, giving the index to the current User
    %     structure in use. Since stored as a Preference, can be recalled at the
    %     next startup of BST to return the user to the same database
    %
    %
    % Descriptions of Application Data
    %
    %   'BrainStormTaskbar', set in the root window 0, is retrieved only, as set in the
    %     startup of BST. Gives the handle to the Taskbar, as in
    %    TASKBAR = getappdata(0,'BrainStormTaskbar').
    %
    %   'BrainStormDataBase', stored in the GUI TASKBAR, is the current database, i.e. in
    %     Preference terms, UserDataBase(iUserDataBase). Called by get_user_directory
    %     to determine the user's current database.
    %
    %   'FileList', stored in figure,
    %     begins in browse_study_folder as a "dir" structure,
    %       with the following features
    %     name is referential to Users.STUDIES, not just the name
    %     Subject has subfields Name and SubjectFile, the namestring and the referential
    %       filename for each study file
    %     display is a prettyprint display of the name
    %     This application m-file also adds:
    %     HeadModel is a cell array for each Study, that has subfields
    %       HeadModelName and GridName
    %     Tesselation is a cell array of tesselation infor for each study
    %
    %   'DataFiles', stored in the figure, is a Mathworks structure resulting from
    %     "dir", plus an additional field called "display". The "display" is used to
    %     display a pretty print of filename in the data files listbox. If DataFiles
    %     is of  length zero, then no data or results files are available in the
    %     current study.
    %     JCM modified 6-Jun-2002 such that the field name is now also referential
    %
    %   'HeadModelFunction'
    %     JCM: I don't understand the utility of this, disabled some parts
    %
    %   'UserDB'
    %     Identical to Preference UserDataBase,
    %       kept locally for convenience and older code

    % /---Script Authors-------------------------------------\
    % |  *** Sylvain Baillet, Ph.D.                          |
    % |  Cognitive Neuroscience & Brain Imaging Laboratory   |
    % |  CNRS UPR640 - LENA                                  |
    % |  Hopital de la Salpetriere, Paris, France            |
    % |  sylvain.baillet@chups.jussieu.fr                    |
    % |                                                      |
    % |  *** John C. Mosher, Ph.D.                           |
    % |  Biophysics Group                                    |
    % |  Los Alamos National Laboratory                      |
    % |  Los Alamos, New Mexico, USA                         |
    % |  mosher@lanl.gov                                     |
    % \------------------------------------------------------/

    % Date of creation: January 1999 as bst_datamanager_gui
    % ----------------------------- Script History ---------------------------------
    % SB  18-Feb 2002 added coregistration of multiple studies (STILL UNDER DEVELOPMENT)
    % JCM 23-Mar-2002 cosmetic changes to GUI
    % JCM 25-Mar-2002 cosmetic changes to script
    % SB  05-Apr-2002 cosmetic changes to GUI and script + initiated addition of
    %                  links to MRITool & HeadModeler
    % SB  29-Apr-2002 added calls to HeadModeling routines + added reference to
    %                  TASKBAR's BrainStormWindows appdata for window management
    % JCM  8-May-2002 shrinking GUI to XGA size, cleaning up comments and format of
    % ............... this file, trying to understand Sylvain's opening sequence,
    %                 "fullfile" additions to handle referential names correctly
    %
    % ............... This GUI figure now has the following application data:
    % ............... FileList, list of files as represented in the
    %                 Available Studies window
    % ............... DataFiles, list of Data Sets as represented in the data list box
    % ............... some (not all) of the GuiData = guidata(h) calls have
    %                 been updated for this new application data
    % JCM 23-May-2002 major rewriting to make process flow clearer, snake out bugs
    % JCM 24-May-2002 updated select_folder calls to be modal style, simple return
    % JCM 24-May-2002 Changed to data_manager.m, updated all calls to it
    % SB  27-May-2002 Changed display for tessellation file information according to
    % ............... MMII conventions on TESS files (look for tess files in current folder).
    % JCM 28-May-2002 Lots of changes to make the load routines less error prone, particularly for
    %                 empty directories or older formats. Added buttons at end, so that now
    %                 all callbacks in the GUI come first through this feval switchyard.
    %                 Used whos('-file') function to determine if variables were missing
    %                 before loading. Users.CurrentData.Database now Users.Comments.
    % SB  30-May-2002 Still working at the link with HEADMODELER_GUI with new structures of Tessellation files
    % ............... Upgraded and lightened StudyInformation display
    % ............... Added the HeadModel and Tessellation fields to FileList for quicker access
    % ............... to the related files in HEADMODELER_GUI
    % JCM 4-Jun-2002  Added lots of comments above detailing the Preferences and
    %                 Application data, then carefully went through this code again
    %                 updating its use to correspond to above description. Made all
    %                 DataFiles.name to be referential instead of filename only.
    %                 Disabled some code related to HeadModelFunction, since it
    %                 appears to be unused and it relies on an old headmodel
    %                 filename
    % JCM 10-Jun-2002 Updated auto comments to include figure information. Fixed simple bug in
    %                 DataFiles and ResultFiles toggles that caused them to reset studies
    %                 to the first one. Added new button to Load and View, and now the Load button
    %                 only loads the selected trial into the User information. The Load and View
    %                 brings up the dataplot_cb window.
    % SB  22-Jul-2002 Fixed minor display bug for available headmodels
    %                 (when BsT2000 headmodel files are available)
    % ............... Changed call to ImportData routine
    % SB  23-Jul-2002 Added available Studies and Subjects to preferences
    %                 BrainStorm/Studies /Subjects respectively
    % ............... StudyFile name is accessible through FileList(k).StudyFile
    %                 and not .name anymore
    % SB  29-Jul-2002 Fixed display bug when no tessellation file is available.
    % SB  30-Jul-2002 As per our new convention for MMII, there should be only one
    %                 StudyFile and one SubjectFile
    %                 per Study or Subject folder.
    %                 This brings out two new things for data_manager
    %                 1) Only the names of the StudyFolders are displayed in the Study Lisbox;
    %                      Displaying the name of the brainstormstudy file is not relevant anymore.
    %                 2) data_manager now operates some sanity checks on the Study and Subject files
    %                      checking that there actually is only a single of those files per folder.
    % SB 08-Aug-2002  Added a 'Watch' pointer when initializing databases.
    % SB 10-Sep-2002  HeadModelFiles from older BrainStorm version are now automatically
    %                 re-written in appropriate format and older files are renamed as '.old'
    % JCM 30-Oct-2002 Comment editing, cleaning up to rely on preferences only for databasing.
    %                 Accounting for empty preferences if no files in database.
    % JCM 05-Nov-2002 Further ensurance that preferences are used, checking for defaults.
    %                 Populating defaults if necessary. Now looks for *channel* file in Study.
    %                 Disabled deprecated use of guidata for data storage, everything uses
    %                 Preferences now.
    % SB  07-Nov-2002 Removed uiwait command during call to importdata.m
    % SB  20-Nov-2002 Added automatic update of older channel files to newer format.
    % JCM 20-Nov-2002 Fixed problem with automatic updating. Must test first to see if field
    %                 exists. Here fixed mapping of old "Gcoef" data.
    % SB  02-Dec-2002 Fixed issue when importing older channel structure
    % JCM 13-May-2003 Layout upgrade
    % JCM 29-May-2003 Links into the new bst_static_taskbar. No deletions, just additional
    %                 actions to make the new taskbar begin functioning.
    % SB  03-Jun-2003 - Avoid systematic sifting through the entire data and subject roots.
    % ...............   Unless the user hits the 'Refresh' button, file list from
    %                   current Study root is recalled
    %                   from new field of the Users structure called .FileList
    %                 - Clicking on 'Information' displays full information about
    %                   selected data in separate quartertile
    % SB  04-Jun-2003 Various minor fixes
    % SB  12-Jun-2003 Use the 'Unique' option of bst_message_window to display data information
    % SB  09-Jul-2003 Display an OK message when selected data set is ok for
    %                 display/further processing
    %                 Add a context menu to display selected study information
    % JCM 19-Aug-2003 Rebuild case to also rebuild the Studies and Subjects pref
    % JCM 09-Sep-2003 Disabling old taskbar
    % JCM 11-Sep-2003 Adjusting "default" database cases to use the word "data"
    %                 instead of "study". Note that programming code still refers to
    %                 "study", we are only changing the apparent words for the user
    %                 to say "data" to lessen the confusion.
    % JCM 12-Sep-2003 Adjusting to new use of make_default_database for creating default data sets
    %                 in both the brainstorm home area and the users present
    %                 database. Startup will have created the BrainStorm default, if
    %                 necessary. The 'Rebuild' command checks the present database
    %                 and copies the BrainStorm default if necessary.
    %                 make_default_database will have also confirmed the preference
    %                 UserDataBase, so checking here is not necessary.
    % JCM 17-Nov-2003 Moving buttons into menu items
    % SB  15-Dec-2003 Minor display fixes
    % SB  19-Jan-2004 Adding contextual menu to data listbox to load selected data set quickly using right-clicking over
    %                 data listbox
    % SB  16-Fev-2004 Fixed bug in creation of above-mentioned contextual menu
    % JCM 11-May-2004 reinstated make_default_database(0) commands blocked by SB, which are
    %                 necessary
    % JCM 16-May-2004 Comments updating
    % JCM 19-May-2004 Fixed problem around line 900, when DataFiles was empty, should
    %                 not call listbox_Data_Callback.
    % ----------------------------- Script History ---------------------------------

    % Last Modified by GUIDE v2.0 17-Nov-2003 13:49:47

    if nargin == 0  % LAUNCH GUI

       fig = openfig(mfilename,'reuse'); % there can be only one
       % JCM 24-May-2002 .fig is now set invisible

       % Generate a structure of handles to pass to callbacks, and store it.
       handles = guihandles(fig);
       guidata(fig, handles); % Mathworks convention to store handles

       if nargout > 0
          varargout{1} = fig;
       end

       % customize window

       % movegui(fig,[5,-5]); % near top left
       bst_color_scheme(fig);
       setappdata(fig,'TileType','T');
       bst_layout('align',fig,1,1,1);

       if(0) % disabled cheat JCM 11 November 2003
          % cheat for the datamanager to get it to look like a dynamic
          %  taskbar on the right
          Layout = getpref('BrainStorm','Layout');
          pos = get(fig,'position'); % the tiled position
          pos(3) = pos(3) + Layout.winpos(3,3); % add the width of the dynamic bar
          set(fig,'position',pos);
       end
       set(fig,'visible','on'); % it's moved and colored, now show
       drawnow

       % Update the BrainStormWindows fields
       bst_win_manager(fig,'DataManager');

       set(fig, 'pointer', 'watch'),
       drawnow
       initialize_database(handles); % initialize the database portion
       set(fig, 'pointer', 'arrow')

    elseif ischar(varargin{1}) % INVOKE NAMED SUBFUNCTION OR CALLBACK

       try
          [varargout{1:nargout}] = feval(varargin{:}); % FEVAL switchyard
       catch
          disp(lasterr);
       end
    end

    % -------------------------- Local Functions --------------------------------------------------------

    function initialize_database(handles); % initialize the database portion
    % GUI has just been built, populate the database section of the GUI

    % JCM 30-Oct-2002, should use only preferences here, set by default in startup if needed
    % JCM 12-Sep-2003, make_default_database will have already confirmed the UserDataBase

    fig = handles.DataManager; % convenient shortcut

    % Now browse the current Study and Subject folders and look for data...
    % JCM 21-Mar-2002
    % ask the taskbar switchyard to perform tasks on itself
    % JCM 09-Sep-2003 disabling old taskbar
    % taskbar('inactive'); % make the taskbar buttons inactive until valid database setup

    % ensure we have a default database in the present working directory
    if 1 % deprecated code | SB - default should exist because it's created at startup
       UserDefault = make_default_database(0); % check only the present database
    end

    UserDB = getpref('BrainStorm','UserDataBase');
    iUserDB = getpref('BrainStorm','iUserDataBase'); % what was the last one used

    Current_User = UserDB(iUserDB); % most recent used

    % load the popup with current values
    if ~isfield(UserDB,'Comment')
       UserDB.Comment = 'Default Database';
       setpref('BrainStorm','UserDataBase',UserDB)
    end

    set(handles.popup_CurrentDatabase,'String',{UserDB.Comment},'Value',iUserDB);

    % now continue as though the user just selected an item in the popup
    popup_CurrentDatabase_Callback(handles.popup_CurrentDatabase,[],handles);

    % ----------------- UPDATE THE LISTBOX OF STUDIES ---------------------
    function load_listbox_Study(handles);
    % The Study Folder has been changed, so update the listbox of studies

    fig = handles.DataManager; % handy shortcut

    if 1 % deprecated code | SB - default should exist because it's created at startup
       UserDefault = make_default_database(0); % ensure a default exists
    end

    Users = get_user_directory; % where are we?

    % Avoid systematic sifting through the entire data branches of the study root
    % Use listing structure stored in database
    FileList = Users.FILELIST; % make_default_database ensured this exists
    if isempty(FileList)
       Users.FILELIST = browse_study_folder(Users.STUDIES);
       FileList = Users.FILELIST;
    end

    % we have a valid list of study files
    % setup the Preferences for the list of Studies and Subjects in this database

    listbox_display = {FileList.display}; % made by browse_study_folder
    set(handles.listbox_Study,'enable','on');

    % Store available Studies and Subjects BrainStorm Preferences for this user
    Studies = rmfield(FileList,{'isdir','date','bytes','Subject','display'});

    setpref('BrainStorm','Studies', Studies);

    % now find list of subjects in the database
    if(0), % JCM is altering SB's attempt here 20-August-2003
       %    issue is that an unassigned subject is not being seen in the study list
       % original SB section
       SubjectFile = find_brainstorm_files('subjects',Users.SUBJECTS); % CBB - should store subjects information in Users structure of users.mat file
       % [FileList(:).Subject]; % Contains Subject's Name and SubjectFile locations (as structure fields)
       % Find unique subjects
       Subjects = rmfield(FileList,{'isdir','date','bytes','StudyFile','StudyName','StudyFolder','display'});
       Subjects = [Subjects.Subject];
       %    for k = 1:length(SubjectFile) % Load Subject names
       %       load(fullfile(Users.SUBJECTS,SubjectFile{k}),'Name');
       %       Subjects(k).Name = Name;
       %       Subjects(k).SubjectFile = SubjectFile{k};
       %    end
       % make the list of subjects unique
       [tmp,iUnique] = unique(cellstr(char(Subjects.SubjectFile)));
       Subjects = Subjects(iUnique);
    else
       % new JCM section, extrapolated from above.
       % get list of valid subjects in the current tree
       SubjectFile = find_brainstorm_files('subjects',Users.SUBJECTS);
       % we now have a list of valid "brainstormsubject" files, get their names

       [Subjects(1:length(SubjectFile))] = deal(struct('Name',[],'SubjectFile',[]));
       for k = 1:length(SubjectFile) % Load Subject names
          load(fullfile(Users.SUBJECTS,SubjectFile{k}),'Name');
          Subjects(k).Name = Name;
          Subjects(k).SubjectFile = SubjectFile{k};
       end
       % make the list of subjects unique
       [tmp,iUnique] = unique(cellstr(char(Subjects.SubjectFile)));
       Subjects = Subjects(iUnique);
    end

    % Give the User a default subject to select.
    % Created and confirmed by the popup_CurrentDatabase_Callback
    % Thus the user will always have a default subject if needed

    setpref('BrainStorm','Subjects', Subjects);

    % Preferences Studies and Subjects have now been loaded, or are empty
    % JCM 12-Sep-2003, should never be empty anymore, since defaults always available

    % load the listbox
    set(handles.listbox_Study,'String',listbox_display,...
       'Value',1,'FontName','fixedwidth');

    % if batch mode allowed, adjust the max
    if 0, % old method with buttons
       if get(handles.StudyBatch,'Value')
          set(handles.listbox_Study,'Max',length(FileList))
       else
          set(handles.listbox_Study,'Max',1)
       end
    else
       % new method of pull down menus
       switch get(handles.menu_pooled_allow,'Checked');
          case 'off'
             % not doing pooled, can only select one file
             set(handles.listbox_Study,'Max',1)
          case 'on'
             % allow selection of multiple files
             set(handles.listbox_Study,'Max',length(FileList))
       end
    end

    % initialize the data listbox
    set(handles.listbox_Data,'Value',1)
    set(handles.listbox_Data,'String','Select a study in the list above');
    set(handles.listbox_Data,'Enable','inactive'); % not ready for action yet

    % store the filelist
    % deprecated code
    if(0), % disabled, SB 03-Jun-2003, should be stored in a specific entry of the user database
       setappdata(fig,'FileList',FileList);
    end
    setappdata(fig,'DataFiles',[]); % empty them out, not yet loaded

    % deprecated code:
    if(0), % disabled JCM 5-nov-2002, should be handled by above setappdata of FileList
       GuiData.FileList = FileList;
       guidata(fig,GuiData); % write the GuiData into the figure
    end

    % Display number of available studies in database
    set(handles.BAvailableStudies,'String',sprintf('%d Data Folders in Current Database',length(FileList)))

    % Mathworks convention 12.1 is to pass handles as guidata(gcbo)
    % CHEAT should use a setappdata instead, but need to update
    % all calls below

    % with the Study Listbox loaded, now find data, possibly creating new DataFiles
    if(strcmp('on',get(handles.listbox_Study,'enable'))),
       % it may be disabled for a lack of studies
       listbox_Study_Callback(fig, [], handles);
    end

    % ---------------------------- Button Callbacks --------------------------------

    % --------------------- POPUP FOR CHANGING THE DATABASE ------------------------

    function varargout = popup_CurrentDatabase_Callback(h, eventdata, handles, varargin)
    % User changes the current database

    % JCM 30-Oct-2002, enforcing use of preferences only
    % JCM 05-Nov-2002, ensure that defaults exist
    %  So this routine enforces that there be a Default_Subject and Default_Study
    %  every time.
    % JCM 12-Sep-2003 updating to use make_default_database

    %  The Users structure is updated on disk

    set(findobj(0,'type','figure'),'pointer','watch'); % we will be busy reloading listboxes
    drawnow

    handles = guihandles(h); % necessary because guidata may have been overwritten
    fig = handles.DataManager; % handy shorthand

    % 05-Nov-2002 TASKBAR no longer needed, use Preferences instead
    % TASKBAR = getappdata(0,'BrainStormTaskbar'); % JCM 21-Mar-2002
    % GuiData = guidata(h); % command not needed here

    % which entry is the user centered on
    iDatabase = get(handles.popup_CurrentDatabase,'Value'); % which popup selection

    % save this index number as the most recent database pointer
    setpref('BrainStorm','iUserDataBase',iDatabase);

    % check it for existence and defaults
    if 0 % deprecated code | SB - default should exist because it's created at startup
       UserDefault = make_default_database(0); % check only this database
    end

    UserDB = getpref('BrainStorm','UserDataBase'); % current database
    %iDatabase = getpref('BrainStorm','iUserDataBase'); % unlikely that it was updated

    Users = UserDB(iDatabase); % select the one from the popup

    % set the edit text fields, the other routines read these
    set(handles.edit_StudyFolder,'String',Users.STUDIES);
    set(handles.edit_SubjectFolder,'String',Users.SUBJECTS);

    % ensure that popup strings are accurate
    set(handles.popup_CurrentDatabase,'String',{UserDB.Comment});

    load_listbox_Study(handles); % now load the listbox

    set(findobj(0,'type','figure'),'pointer','arrow')
    drawnow

    % --------------------------------------------------------------------
    function varargout = StudyFolder_Callback(h, eventdata, handles, varargin)
    % activated by the edit window, but JCM 23-May-2002 made inactive to
    %  keep things simpler
    % Keep as an inactive edit window for nice look, treat as a text window

    % --------------------------------------------------------------------
    function varargout = SubjectFolder_Callback(h, eventdata, handles, varargin)
    % activated by the edit window, but JCM 23-May-2002 made inactive to
    %  keep things simpler
    % Keep as an inactive edit window for nice look, treat as a text window

    % ------------------- STUDIES LISTBOX CALLBACK -----------------
    function varargout = listbox_Study_Callback(h, eventdata, handles, varargin)
    % A study has changed in the listbox, update the associated data files

    handles = guihandles(h); % reloads handles for insurance

    % jcm disabled 05-Nov-2002
    % GuiData = guidata(h); % deprecated,but may still be necessary

    fig = handles.DataManager; % handy shortcut
    %FileList = getappdata(fig,'FileList');

    Users = get_user_directory; % the current database structure
    FileList = Users.FILELIST;

    if ~isfield(FileList,'StudyFile'), % Empty Study Folder
       return,
    end

    % let user know something is happening
    set(handles.DataManager,'pointer','watch');

    % What was selected ?
    Selection = get(handles.listbox_Study,'Value');

    % Make the selected StudyFile current in the TASKBAR
    Users.CurrentData.StudyFile = FileList(Selection).StudyFile; % referential filename

    % Does this studyfile have a BrainStormSubject?
    % Deprecated code
    if(0), % SB 03-Jun-2003 | all necessary information should now be stored in FileList
       StudyFile_whos = whos('-file',fullfile(Users.STUDIES,Users.CurrentData.StudyFile));
       if(strmatch('BrainStormSubject',{StudyFile_whos.name})),
          % BrainStormSubject exists in the desired studyfile
          % Make the selected SubjectFile current in the TASKBAR
          load(fullfile(Users.STUDIES,Users.CurrentData.StudyFile),'BrainStormSubject')
          Users.CurrentData.SubjectFile = BrainStormSubject;
       else
          % Studyfile doesn't have one defined
          Users.CurrentData.SubjectFile = '';
       end
    end
    Users.CurrentData.SubjectFile = FileList(Selection).Subject.SubjectFile;

    % update the preferences, used by get_user_directory
    setpref('BrainStorm','CurrentData',Users.CurrentData);

    % ------- NOW LOAD UP THE DATAFILES IN THIS STUDY ----------------------
    % ------- AND IN THE FOLLOWING SECTION, UPDATE THE HEADMODEL INFO ------

    refpath = fileparts(FileList(Selection).StudyFile);
    % path is relative, cd to it
    StudyPath = fullfile(Users.STUDIES,refpath);
    cd(StudyPath);

    % -------------------- DATAFILES -------------------
    % now get all of the desired data or results files in that directory

    % check status of toggle buttons
    if 0,
       % old method of pulldowns
       DATA = get(handles.DataFiles,'Value'); % Are we looking for data files ?
       RESULTS = get(handles.ResultFiles,'Value'); % Are we looking for result files ?
    else
       % new method of menu pulldowns
       switch get(handles.menu_view_datafiles,'Checked')
          case 'on'
             DATA = 1;
          case 'off'
             DATA = 0;
       end

       switch get(handles.menu_view_results,'Checked')
          case 'on'
             RESULTS = 1;
          case 'off'
             RESULTS = 0;
       end
    end

    % Create list of datafiles from this study directory
    if ~DATA & RESULTS
       DataFiles = dir('*results*.mat');
    elseif DATA & ~RESULTS
       TestFiles = dir('*data*.mat'); % tentative list
       DataFiles = TestFiles; % initialize array
       i = 0;
       for k = 1:length(TestFiles)
          if isempty(findstr(TestFiles(k).name,'results')), % remove the results files
             i = i+1;
             DataFiles(i) = TestFiles(k);
          end
       end
       DataFiles((i+1):end) = []; % remove the rest
    else % both off
       % set DATA on
       set(handles.menu_view_datafiles,'Checked','on')
       DATA = 1;
       DataFiles = dir('*data*.mat'); % look for BsT files only - maybe consider .ds and .fiff ?
    end

    % we now have a list of DataFiles in the current Study folder
    % It is possible that this list is empty

    % Now also update the popup in the static taskbar
    % set the results popup to default to the first file
    if(~isempty(DataFiles)),
       DataRefNames = {DataFiles.name};
       for i = 1:length(DataRefNames),
          DataRefNames{i} = fullfile(refpath,DataRefNames{i}); % make referential
       end
       if(0)
          [ignore,tempname] = fileparts(DataFiles(1).name); % the first file, name only
          tempname = strrep(tempname,'data','results'); % leader with results substituted
          ResultsFiles = dir(sprintf('*%s*',tempname));
          if(~isempty(ResultsFiles)),
             ResultsFiles = {ResultsFiles.name};
             for i = 1:length(ResultsFiles),
                ResultsFiles{i} = fullfile(refpath,ResultsFiles{i});
             end
          else
             ResultsFiles = [];
          end
       end

       bst_static_taskbar('SET','DATA',DataRefNames);
       % bst_static_taskbar('SET','RESULTS',ResultsFiles);
       % now get the current setting
       if (0) % SB 18-Jun-2003 | deprecated code - the following calls duplicate the subsequent ones done in listbox_data_callback
          [fname,h] = bst_static_taskbar('GET','DATA');
          % and pretend to press the button
          bst_static_taskbar('popupmenu_DATA_Callback',h,[],guihandles(h));
       end

    else
       bst_static_taskbar('SET','DATA',[]); %set to empty
       bst_static_taskbar('SET','RESULTS',[]);
    end

    % Fill text field in STATIC-TASKBAR with StudySubject information
    sstring = sprintf('%s | %s', FileList(Selection).StudyName,FileList(Selection).Subject.Name);
    ffig = findobj(get(0,'chil'),'flat','tag','static_taskbar');
    figHandles = guihandles(ffig);
    set(figHandles.Btext_STUDY,'String',sstring); clear sstring ffig figHandles

    if isempty(DataFiles) % No Data files available

       listbox_display = {['No data files available for this study; ',...
                'consider importing a new data set']};
       set(handles.listbox_Data,'Enable','inactive');

    else

       % let's make a nice listbox display by creating for each DataFiles a field
       %  called "display" that pretty prints the filename

       for k = 1:length(DataFiles)
          FileName{k} = strrep(DataFiles(k).name,'.mat','');
          FileSize{k} = engstr(DataFiles(k).bytes,1);
       end

       % Now make all of the filenames referential
       for k = 1:length(DataFiles),
          DataFiles(k).name = fullfile(refpath,DataFiles(k).name);
       end

       % Now improve the layout of the final .display field
       FileName = deblank(char(FileName)); % Pad all names to same character length
       FileSize = deblank(char(FileSize));

       fmtstr = sprintf('%%-%ds | %%-%dsbytes',size(FileName,2),size(FileSize,2));
       for k = 1:length(DataFiles)
          % also put in some "dots" to track across the blank spaces in the filename
          % jcm removed "." from file size 28-May-2002
          DataFiles(k).display = sprintf(fmtstr,...
             strrep(FileName(k,:),' ','.'),FileSize(k,:));
       end

       listbox_display = {DataFiles.display}; % create cell array of display names

       set(handles.listbox_Data,'Enable','on');

    end

    % at this point, DataFiles is either a "dir" structure, enhanced such that all
    %  names are referential, and with the additional "display" field for
    %  pretty printing each filename,
    % or DataFiles is of length 0 "dir" structure and tests as empty
    % Enable is set accordingly in the above if statements

    % load the listbox for Data
    set(handles.listbox_Data,'string',listbox_display,'Value',1,'Max',length(listbox_display))

    % load the banner text over this listbox
    if DATA
       % viewing Data files
       if length(DataFiles) < 2
          set(handles.BDataSets,'String',sprintf('%d Data Set in Selected Data Folder',length(DataFiles)))
       else
          set(handles.BDataSets,'String',sprintf('%d Data Sets in Selected Data Folder',length(DataFiles)))
       end
    elseif RESULTS
       % Results file
       if length(DataFiles) < 2
          set(handles.BDataSets,'String',sprintf('%d Result File in Selected Data Folder',length(DataFiles)))
       else
          set(handles.BDataSets,'String',sprintf('%d Results Files in Selected Data Folder',length(DataFiles)))
       end

    else
       set(handles.BDataSets,'String',sprintf('(Mixed state of data and results)'))
    end

    % blank out the Study Information list box
    % deprecated code
    if 0 % SB - 03-Jun-2003 | .DataParam was removed. Now data information may be displayed in a specific quartile upon request
       set(handles.DataParam,'String',''); % the study information box
    end

    % save the DataFiles data
    setappdata(fig,'DataFiles',DataFiles); % update

    if(0), % JCM disabled 05-Nov-2002
       GuiData.DataFiles = DataFiles; % deprecated code
       guidata(h,GuiData); % deprecated
    end

    % With the listbox for Data now loaded, update the data listbox,
    %  tesselation availability, and populate the study information list box

    if isempty(DataFiles) % No Data files available

       listbox_display = {['No data files available for this study; ',...
                'consider importing a new data set']};
       set(handles.listbox_Data,'Enable','inactive');

    else

       listbox_Data_Callback(handles.listbox_Data, [], handles);

    end

    % ------------------------ HEADMODELS ----------------------------------------

    % the lisbox_Data_Callback will have added tesselation information
    % Update FileList information about available tessellation files

    FileList = Users.FILELIST; %getappdata(fig,'FileList');

    % Get DataParam string for upcoming update once headmodel files are listed
    %DataParamStr = get(handles.DataParam,'String');
    DataParamStr = getappdata(fig,'DataParam');

    % any file in the current study folder with the keyword "headmodel"
    [HeadModelFiles,DataPopup,Leader] = find_brainstorm_files('headmodel',StudyPath);

    % Load the bst_static_taskbar

    HEADMODELFILES = HeadModelFiles;
    for i = 1:length(HeadModelFiles),
       HEADMODELFILES{i} = fullfile(refpath,HeadModelFiles{i}); % referential name
    end

    if(length(HeadModelFiles) > 0),
       bst_static_taskbar('SET','HEADMODEL',HEADMODELFILES);
    else
       % empty
       bst_static_taskbar('SET','HEADMODEL',[]);
    end

    % Load info from each headmodel file and append in the DataParam window

    iokfile = 0;% Number of valid headmodel files

    for k = 1:length(HeadModelFiles) % For all headmodel files in current studypath
       fileisold = 0; % Flag - 1 meaning file is writtent in older format

       % Go through each headmodel file
       %_____Test whether it's a valid BsT hdmodel file (older or newest format)
       %___________If older, update the file by creating new copies and move older file to a new file with extension .old

       % Test for file validity
       cd(StudyPath)
       HeadModelWhos = whos('-file',HeadModelFiles{k}); % Look for variables in headmodel file

       % Valid headmodel file ?
       if (~isempty(strmatch('SearchGain',{HeadModelWhos.name})) | ...
             ~isempty(strmatch('ImageGain',{HeadModelWhos.name})) | ...
             ~isempty(strmatch('Gain',{HeadModelWhos.name}))) & ...
             ~isempty(strmatch('Param',{HeadModelWhos.name})) & ...
             ~isempty(strmatch('Function',{HeadModelWhos.name})) % Valid newest or older headmodel file

          if ~isempty(strmatch('SearchGain',{HeadModelWhos.name}))   % Older SearchGrid file
             % HeadModel file is from older version of BrainStorm
             % Translate to newer version

             % VolumeSourceGrid is available

             bst_message_window('wrap',...
                sprintf('Updating (search grid): %s ...', HeadModelFiles{k}))

             [path,file,ext] = fileparts(HeadModelFiles{k}); % Original file name

             fileisold = 1; % Flag meaning file is old

             bst_message_window('wrap',{...
                   sprintf('"%s" is from older version of BrainStorm',HeadModelFiles{k}),...
                   sprintf('Automatically translating this file to newest file format...')...
                })

             % Load related material
             tmp = load(HeadModelFiles{k},'SearchGain','SearchGridLoc','SearchTess','Function','Param');

             for gain = 1:length(tmp.SearchGain) % Create a separate file for each cell in SearchGain

                % Now save VolumeSourceGrid headmodel(s) in separate files
                SaveHeadModel.HeadModelType = 'SearchGrid';
                SaveHeadModel.Param = tmp.Param;
                SaveHeadModel.Function = tmp.Function;
                % Headmodel name
                SaveHeadModel.HeadModelName = '';
                tmp.HDMName = deblank(cellstr(unique(char(SaveHeadModel.Function{:}),'rows')));
                for kk=1:length(tmp.HDMName) % Create HeadModelName entry - remove empty cells from tmp.HDMName
                   if ~isempty(tmp.HDMName{kk})
                      SaveHeadModel.HeadModelName = sprintf('%s | %s',SaveHeadModel.HeadModelName,tmp.HDMName{kk});
                   end
                end

                bemndx = findstr('bem', SaveHeadModel.HeadModelName); % Find whether bem was used for this headmodel file

                if isempty(bemndx) % Spherical models only
                   if ~isempty(findstr('meg', SaveHeadModel.HeadModelName)) % MEG and Sphere
                      SaveHeadModel.MEGMethod = 'meg_sphere';
                   end
                   if ~isempty(findstr('eeg', SaveHeadModel.HeadModelName)) % EEG and Sphere
                      switch(tmp.Param(end).EEGType)
                         case 'EEG_BERG'
                            SaveHeadModel.EEGMethod = 'eeg_3sphereBerg' ;
                         case 'EEG_SINGLE'
                            SaveHeadModel.EEGMethod = 'eeg_sphere' ;
                         case 'EEG_3SHELL'
                            SaveHeadModel.EEGMethod = 'eeg_3sphere' ;
                      end
                      SaveHeadModel.EEGMethod = tmp.Param(end).EEGType;
                   end

                   if isempty(findstr('meg', SaveHeadModel.HeadModelName)) & isempty(findstr('eeg', SaveHeadModel.HeadModelName))
                      error(sprintf('Unvalid headmodel file: %s',HeadModelFiles{k}))
                   end

                elseif length(bemndx) == 2 % Bem was used for EEG and MEG
                   SaveHeadModel.MEGMethod = 'meg_bem';
                   SaveHeadModel.EEGMethod = 'eeg_bem';
                end

                % Specify Source Model Name and Other Fields
                switch gain
                   case 1
                      SourceOrderString = 'CD'; % Current Dipole
                   case 2
                      SourceOrderString = 'MD'; % Magnetic Dipole
                   case 3
                      SourceOrderString = 'CME'; % Current Multipole
                   case 4
                      SourceOrderString = 'CDpairs';
                   case 5
                      SourceOrderString = 'MDpairs';
                   case 6
                      SourceOrderString = 'CMEpairs';
                end

                % Source Order
                SaveHeadModel.SourceOrder = gain - 2;
                % Grid Gain Matrix
                SaveHeadModel.Gain{1} = single(tmp.SearchGain{gain});
                SaveHeadModel.GainCovar = {};
                SaveHeadModel.GainCovarName = '';
                SaveHeadModel.GridLoc = {tmp.SearchGridLoc{gain}};
                % Detailed grid name
                SaveHeadModel.GridName = {sprintf('%s Volumic Grid',SourceOrderString)};

                % now collect together and save
                SaveHeadModelFileOrig = strrep(HeadModelFiles{k},'headmodel',['headmodel',sprintf('VolGrid_%s',SourceOrderString)]);
                SaveHeadModelFileOrig = strrep(SaveHeadModelFileOrig,'.mat','');
                SaveHeadModelFile = SaveHeadModelFileOrig;

                ifile = 0;
                while exist([SaveHeadModelFile,'.mat'],'file') % Do not overwrite headmodel files
                   ifile = ifile + 1;
                   SaveHeadModelFile = [SaveHeadModelFileOrig,'_',int2str(ifile)];
                end

                bst_message_window('wrap',...
                   sprintf('Writing HeadModel file in new BrainStorm format: %s ...', SaveHeadModelFile))

                save_fieldnames(SaveHeadModel, [SaveHeadModelFile,'.mat']);
                clear SaveHeadModel SourceOrderString

                bst_message_window(...
                   {' -> DONE',' '}),

             end % For each cell in SearchGain

             clear tmp

          end % SearchGrid

          if ~isempty(find(strcmp(cellstr(char(HeadModelWhos(:).name)),'ImageGain')))

             % ImageGrid is available
             fileisold = 1; % Flag meaning file is old

             bst_message_window('wrap',...
                sprintf('Updating (imaging grid): %s ...', HeadModelFiles{k}))

             SourceOrderString = 'CD'; % Only Current Dipole models for ImageGain in older BsT files

             % Load related material
             tmp = load(HeadModelFiles{k},'ImageGain','ImageGridLoc','ImageGainCovar','Function','Param');
             clear SearchTess % Obsolete

             for grid = 1: length(tmp.ImageGain)
                if ~isempty(tmp.ImageGain{grid})

                   SaveHeadModel.HeadModelType = 'ImageGrid';

                   % Now save VolumeSourceGrid headmodel(s) in separate files
                   SaveHeadModel.Param = tmp.Param;
                   SaveHeadModel.Function = tmp.Function;
                   % Headmodel name
                   SaveHeadModel.HeadModelName = '';
                   tmp.HDMName = unique(SaveHeadModel.Function);
                   for kk=1:length(tmp.HDMName) % Create HeadModelName entry - remove empty cells from tmp.HDMName
                      if ~isempty(tmp.HDMName{kk})
                         SaveHeadModel.HeadModelName = sprintf('%s | %s',SaveHeadModel.HeadModelName,tmp.HDMName{kk});
                      end
                   end

                   bemndx = findstr('bem', SaveHeadModel.HeadModelName); % Find whether bem was used for this headmodel file

                   if isempty(bemndx) % Spherical models only
                      if ~isempty(findstr('meg', SaveHeadModel.HeadModelName)) % MEG and Sphere
                         SaveHeadModel.MEGMethod = 'meg_sphere';
                      end
                      if ~isempty(findstr('eeg', SaveHeadModel.HeadModelName)) % EEG and Sphere
                         switch(tmp.Param(end).EEGType)
                            case 'EEG_BERG'
                               SaveHeadModel.EEGMethod = 'eeg_3sphereBerg' ;
                            case 'EEG_SINGLE'
                               SaveHeadModel.EEGMethod = 'eeg_sphere' ;
                            case 'EEG_3SHELL'
                               SaveHeadModel.EEGMethod = 'eeg_3sphere' ;
                         end
                      end

                      if isempty(findstr('meg', SaveHeadModel.HeadModelName)) & isempty(findstr('eeg', SaveHeadModel.HeadModelName))
                         error(sprintf('Unvalid headmodel file: %s',HeadModelFiles{k}))
                      end

                   elseif length(bemndx) == 2 % Bem was used for EEG and MEG
                      SaveHeadModel.MEGMethod = 'meg_bem';
                      SaveHeadModel.EEGMethod = 'eeg_bem';
                   end
                   % Grid Gain Matrix
                   SaveHeadModel.SourceOrder = -1; % Current dipoles only.
                   SaveHeadModel.Gain = {tmp.ImageGain{grid}{1}};
                   SaveHeadModel.GainCovar = {tmp.ImageGainCovar{grid}};
                   SaveHeadModel.GainCovarName = '';
                   tmp.SubjectFolder = fileparts(FileList(Selection).Subject.SubjectFile);
                   tmp2 = load(fullfile(Users.SUBJECTS,FileList(Selection).Subject.SubjectFile),'Tesselation');
                   if isempty(fieldnames(tmp2)) % No tessellation available
                      tmp.Tess.Tesselation = [];
                   else
                      tmp.Tess.Tesselation = tmp2.Tesselation;
                   end
                   if isempty(tmp.Tess.Tesselation)
                      % Tessellation file not stored in Subject file (as in MMII file format):
                      % Ask user to point at tessellation file manually
                      hh = msgbox('Tessellation file was not found, please select from list.','File not found');
                      waitfor(hh)
                      cd(Users.SUBJECTS)
                      [filename, pathname] = uigetfile('*.mat', 'Pick a Tessellation file from list');
                      if isequal(filename,0) | isequal(pathname,0), return , end
                      tmp.Tess.Tesselation = fullfile(strrep(pathname,Users.SUBJECTS,''),filename);
                      cd(StudyPath)
                   end

                   %SaveHeadModel.GridLoc = {fullfile(tmp.SubjectFolder,tmp.Tess.Tesselation)};
                   SaveHeadModel.GridLoc = {tmp.Tess.Tesselation};
                   SaveHeadModel.iGrid = grid;

                   if ~isempty(find(strcmp(cellstr(char(HeadModelWhos(:).name)),'ImageGain_RowNorm'))) % Complete with other available information in older file
                      load(HeadModelFiles{k},'ImageGain_RowNorm');
                      SaveHeadModel.Gain_RowNorm = {ImageGain_RowNorm{grid}};
                   end

                   if ~isempty(find(strcmp(cellstr(char(HeadModelWhos(:).name)),'ImageGainCovar_ColNormFus')))
                      load(HeadModelFiles{k},'ImageGainCovar_ColNormFus');
                      SaveHeadModel.GainCovar_ColNormFus = ImageGainCovar_ColNormFus{grid};
                   end

                   if ~isempty(find(strcmp(cellstr(char(HeadModelWhos(:).name)),'ImageGainCovar_ColNorm')))
                      load(HeadModelFiles{k},'ImageGainCovar_ColNorm');
                      SaveHeadModel.GainCovar_ColNorm = ImageGainCovar_ColNorm{grid};
                   end

                   % Detailed grid name
                   try
                      load(fullfile(Users.SUBJECTS,tmp.Tess.Tesselation),'Comment'); % Load surface names
                   catch
                      load(tmp.Tess.Tesselation,'Comment'); % Load surface names
                   end

                   try
                      Comment = Comment{grid};
                   catch
                      errordlg(sprintf(...
                         'Please check that the tessellation file contains as many envelopes (here %d) as the ones specified in the headmodel (here %d)', length(Comment),length(tmp.ImageGain)))
                      return
                   end

                   SaveHeadModel.GridName = {sprintf('%s Surface Grid : %s',SourceOrderString,Comment)};

                   % now collect together and save
                   SaveHeadModelFileOrig = strrep(HeadModelFiles{k},'headmodel',['headmodel',sprintf('SurfGrid_%s',SourceOrderString)]);
                   SaveHeadModelFileOrig = strrep(SaveHeadModelFileOrig,'.mat','');
                   SaveHeadModelFile = SaveHeadModelFileOrig;

                   ifile = 0;
                   while exist([SaveHeadModelFile,'.mat'],'file') % Do not overwrite headmodel files
                      ifile = ifile + 1;
                      SaveHeadModelFile = [SaveHeadModelFileOrig,'_',int2str(ifile)];
                   end

                   bst_message_window('wrap',...
                      sprintf('Writing HeadModel file in new BrainStorm format: %s ...', SaveHeadModelFile))

                   save_fieldnames(SaveHeadModel, [SaveHeadModelFile,'.mat']);
                   clear SaveHeadModel
                   bst_message_window(...
                      {' -> DONE',' '}),
                end

             end % For each cell in ImageGain

          end % ImageGrid

          clear tmp

          if fileisold == 1 % HeadModelFiles{k} was an older file - store it as an .old file
             % Create name for each new headmodel file
             [path,file,ext]  = fileparts(HeadModelFiles{k});

             % Now move older file to new name with .old extension
             oldfile = [file,ext,'.old'];
             switch(upper(computer))
                case('PCWIN')
                   dos(sprintf('move %s %s', [file,ext], oldfile));
                case ('UNIX')
                   unix(sprintf('mv %s %s', [file,ext], oldfile));
             end

             % Reload study information
             listbox_Study_Callback(h, eventdata, handles, varargin)
             return
          end

          % GridName and HeadModelName exist, load them
          load(fullfile(StudyPath,HeadModelFiles{k}),'GridName','HeadModelName')
          if ~isempty(GridName)
             InfoStr{k} = {...
                   sprintf('    HeadModel type: '),...
                   sprintf('    --> %s',HeadModelName),...
                   sprintf('    Source Grid:'),...
                   sprintf('    --> %s',GridName{1})...
                };
          else
             load(fullfile(StudyPath,HeadModelFiles{k}),'GridLoc')
             if ~isempty(GridLoc)
                InfoStr{k} = {...
                      sprintf('    HeadModel type: '),...
                      sprintf('    --> %s',HeadModelName),...
                      sprintf('    Source Grid:'),...
                      sprintf('    --> %s','Specific Grid Locations')...
                   };
             else
                InfoStr{k} = {...
                      sprintf('    HeadModel type: '),...
                      sprintf('    --> %s',HeadModelName),...
                      sprintf('    Unrecognized format')...
                   };
             end
          end

          iokfile = iokfile+1;
          % Update the Study FileList with HeadModel information
          FileList(Selection).HeadModel{iokfile}.HeadModelName = HeadModelName;
          FileList(Selection).HeadModel{iokfile}.GridName = GridName;

       else

          InfoStr{k} = {sprintf('%s is not a valid BrainStorm headmodel file',HeadModelFiles{k})};

       end % Valid (newest or older) file ?

       if k == 1, % initialize a header string
          DataParamStr = {DataParamStr{:},...
                ' ',...
                'available Head Model file(s) :',...
                ' '};
       end

       DataParamStr = {DataParamStr{:},...
             sprintf('*** %s',strrep(HeadModelFiles{k},'.mat','')),...
             InfoStr{k}{:},...
             ' '};

    end % For each headmodel file

    % update the banner text in the GUI
    if length(HeadModelFiles) == 0,
       set(handles.AvailableHeadModels,...
          'String','0 Available Head Models','ForegroundColor','r');
    elseif length(HeadModelFiles) == 1,
       set(handles.AvailableHeadModels,...
          'String',sprintf('%d Available Head Model',length(HeadModelFiles)),...
          'ForegroundColor','g');
    else
       set(handles.AvailableHeadModels,...
          'String',sprintf('%d Available Head Models',length(HeadModelFiles)),...
          'ForegroundColor','g');
    end

    % update the Study Information listbox with the new data
    setappdata(fig,'DataParam',DataParamStr)

    % save the new filelist information
    Users.FILELIST = FileList; % SB 03-Jun-2003 --- CBB this kind of FileList update should be done in a specific (sub)function
    iDB = getpref('BrainStorm','iUserDataBase');
    UserDB = getpref('BrainStorm','UserDataBase');
    UserDB(iDB).FILELIST = Users.FILELIST;
    setpref('BrainStorm','UserDataBase',UserDB);

    % let the user know we are done.
    makeuswait('stop')

    % ------ CALLBACK FOR THE DATA LISTBOX --------------------------------------
    function varargout = listbox_Data_Callback(h, eventdata, handles, varargin)
    % Displays the parameters of a data set in the DataManager window

    makeuswait('start')

    handles = guihandles(h); % have to rebuild
    if(0), % disable 05-nov-2002
       GuiData = guidata(h); % deprecated
    end

    % JCM 09-Sep-2003 disabling old taskbar
    % TASKBAR = getappdata(0,'BrainStormTaskbar');
    % htaskbar = guihandles(TASKBAR); % to control the estimation enable
    fig = handles.DataManager; % handy shortcut

    DataFiles = getappdata(fig,'DataFiles');
    %FileList = getappdata(fig,'FileList');

    Users = get_user_directory; % current database
    FileList = Users.FILELIST;

    % JCM 09-Sep-2003 disabling old taskbar
    % taskbar('inactive'); % set buttons inactive on the taskbar

    % What was selected ?
    StudySelection = get(handles.listbox_Study,'Value'); % Current Study
    DataSelection = get(handles.listbox_Data,'Value');

    % Look for data files in this folder
    [refpath, file,ext] = fileparts(FileList(StudySelection).StudyFile);
    StudyPath = fullfile(Users.STUDIES,refpath);  % fully qualified name

    cd(Users.STUDIES) % names are referential from here

    % -------------- CHANNEL FILE INFORMATION ------------------------
    % Load associated channel file
    % referential name

    [Channel,ChannelFile] = get_channel(DataFiles(DataSelection).name);

    % % change JCM 05-Nov-2002, only one channel file in a study folder
    % if(0),
    %    ChannelFile = strrep(FileList(StudySelection).StudyFile,'brainstormstudy','channel');
    % else
    %    % new search for a channel file
    %    ChannelFile = dir(fullfile(StudyPath,'*channel*mat')); % any channel files
    %    switch length(ChannelFile)
    %    case 0
    %       % no channel file!
    %       DataParam = {...
    %               ' ','DATABASE ERROR XXXXXX',...
    %               ['A Channel file in',StudyPath],...
    %               'is missing.',...
    %               'Please consider importing',...
    %               'the original data set again'};
    %
    %       %set(handles.DataParam,'String',DataParam)
    %       bst_message_window('wrap',DataParam)
    %       %set(handles.LoadSelectedData,'Enable','off')
    %       set(fig,'Pointer','arrow')
    %       return
    %
    %    case 1
    %       % no problem, we found a single channel file
    %    otherwise
    %       % more than one channel file!
    %       DataParam = {...
    %               ' ','DATABASE ERROR XXXXXX',...
    %               sprintf('More than one Channel file in: %s',StudyPath),...
    %               'Please manually remove the extra Channel files.'};
    %
    %       %set(handles.DataParam,'String',DataParam)
    %       bst_message_window('wrap',DataParam)
    %       %set(handles.LoadSelectedData,'Enable','off')
    %       set(fig,'Pointer','arrow')
    %       return
    %
    %    end
    %    ChannelFile = ChannelFile(1).name; % keep only the first as a string name
    %    ChannelFile = fullfile(refpath,ChannelFile); % make referential
    % end
    % load(ChannelFile) % CBB : should load structure "Channel" into local workspace

    % check whether this ChannelFile is from an older version of BrainStorm

    % Check for EEG locations - should be 3x1 per electrode - not 3x2 anymore
    ieeg = good_channel(Channel,[],'EEG');
    Old = 0; % Flag
    if ~isempty(ieeg)
       if size(Channel(ieeg(1)).Loc,2) == 2 % Old channel file format
          Old = 1; % Flag
       end
    end

    if isfield(Channel,'imegsens') | isfield(Channel,'ieegsens')  | Old

       bst_message_window('wrap',{...
             'WARNING! Old channel file detected',...
             sprintf('Backing up %s to %s.old. . .', ChannelFile,ChannelFile),...
             sprintf('Updating Channel structure. . .')...
          })

       % Back-up of all channel structure
       save(fullfile(fileparts(DataFiles(DataSelection).name),[ChannelFile,'.old']), 'Channel','-mat');

       % Update channel structure
       imegsens = good_channel(Channel,[],'MEG');
       ieegsens = good_channel(Channel,[],'EEG');

       if ~isempty(imegsens)
          [Channel(imegsens).Comment] = deal('');
          if(isfield(Channel,'Gcoef')), % does the old Gcoef field exist
             if ~isempty(Channel(imegsens(1)).Gcoef), % and is it not empty
                Channel(imegsens(1)).Comment = Channel(imegsens(1)).Gcoef;
                Channel = rmfield(Channel,'Gcoef');
             end
          end
       end

       if ~isempty(ieegsens)

          % Update .Loc field (now only a single column)
          for k = ieegsens
             Channel(k).Loc = Channel(k).Loc(:,1);
          end
          % Update EEG reference information
          refndx = strmatch(char(Channel(ieegsens).Comment),'EEG REF');
          if ~isempty(refndx) % Specific reference electrode is used
             Channel(ieegsens(refndx)).Comment = '';
             Channel(ieegsens(refndx)).Type = 'EEG REF';
             bst_message_window({...
                   sprintf('EEG reference is %s',Channel(ieegsens(refndx)).Name)...
                })
          else % Average reference is assumed
             [Channel(ieegsens).Comment] = deal('AVERAGE REF');
             bst_message_window({...
                   sprintf('EEG reference is AVERAGE')...
                })
          end

       end

       % now clean up old structures
       if(isfield(Channel,'imegsens')),
          Channel = rmfield(Channel,'imegsens');
       end

       if isfield(Channel,'RefChannel')
          Channel = rmfield(Channel,'RefChannel');
       end

       if isfield(Channel,'ieegsens')
          Channel = rmfield(Channel,'ieegsens');
       end

       if isfield(Channel,'irefsens')
          % Assign proper type to MEG reference channels
          [Channel(Channel(imegsens(1)).irefsens).Type] = deal('MEG REF');
          Channel = rmfield(Channel,'irefsens');
          irefsens = good_channel(Channel,[],'MEG REF');
          [Channel(irefsens).Comment] = deal('');
       end

       save(fullfile(fileparts(DataFiles(DataSelection).name),ChannelFile),'Channel')

       bst_message_window('wrap',...
          sprintf('Updated Channel structure saved in %s.', ChannelFile)...
          )
    end

    if ~exist('Channel','var')
       % something wrong with the load
       DataParam = {...
             ' ','DATABASE ERROR XXXXXX',...
             sprintf('Channel file %s wrong format.',ChannelFile),...
             'Please update the Study info',...
             'or consider importing the original data set into BrainStorn again.'};

       bst_message_window('wrap',DataParam)
       set(handles.LoadSelectedData,'Enable','off')
       set(h,'Pointer','arrow')
       return
    end

    ChannelFlag = ones(length(Channel),1);
    MEGchan = good_channel(Channel,ChannelFlag,'MEG'); % MEG Channels
    MEGRef = good_channel(Channel,ChannelFlag,'MEG REF'); % MEG Reference Channels
    EEGchan = good_channel(Channel,ChannelFlag,'EEG'); % EEG channels
    EEGRef = good_channel(Channel,ChannelFlag,'EEG REF'); % EEG REF, if empty : average reference
    OTHERchan = good_channel(Channel,ChannelFlag,'OTHER'); % STIM, EOG, ECG...

    % NOTE: If ChannelFlag exists already, will overwrite the above definition
    % 6-Jun-2002 DataFiles.name is now referential to Users.STUDIES

    load(DataFiles(DataSelection).name,'ChannelFlag','Comment','Device','Time')

    if ~exist('Comment','var')
       Comment = 'No name defined';
    end
    DataComment = Comment;
    clear Comment

    bst_static_taskbar('SET','STUDY',DataComment); % set the study name

    % now set the checkboxes depending on the data detected
    TEMPSTR = {'MEG','EEG','OTHER'};
    for i = 1:length(TEMPSTR),
       eval(sprintf('tempchan = %schan;',TEMPSTR{i})); % which channel information
       if(length(tempchan)),
          bst_static_taskbar('SET',TEMPSTR{i},'on')%,'value',1);
       else
          bst_static_taskbar('SET',TEMPSTR{i},'off')%,'value',0);
       end
    end

    % update the filename to the next one in the list
    [fname,hDATA] = bst_static_taskbar('GET','DATA');
    gDATA = guihandles(hDATA); % the handles
    % first unselect the one we were looking at in the task bar
    bst_static_taskbar('select_deselect_file',hDATA,gDATA,'CLEAR');

    % now set the popup to our new selection
    set(hDATA,'val',DataSelection);

    % activate the popup on the taskbar
    bst_static_taskbar('popupmenu_DATA_Callback',hDATA,[],gDATA);

    % and ensure that we have actually set this file
    bst_static_taskbar('select_deselect_file',hDATA,gDATA,'SET');

    % -------------- TESSELATION INFORMATION ----------------------------
    % Check if Tessellation is available
    % We are still referential at the Users.STUDIES

    load(FileList(StudySelection).StudyFile,'BrainStormSubject');

    if exist('BrainStormSubject','var')
       % That may not be the case for older file names
       % go to the subjects folders
       cd(Users.SUBJECTS);
       if ~exist(BrainStormSubject,'file') % Study file is obsolete - let the user update its database
          if isempty(BrainStormSubject)
             DataParam = {...
                   ' ','DATABASE ERROR XXXXXX',...
                   'No subject was assigned to this study.',...
                   'Please run Study Editor to update.',...
                };
          else
             DataParam = {...
                   ' ','DATABASE ERROR XXXXXX',...
                   sprintf('Subject file %s',BrainStormSubject),...
                   'was not found.',...
                   'Please update the Study info',...
                   'with the new location of the Subject file'};
          end

          %set(handles.DataParam,'String',(DataParam))
          bst_message_window('wrap',DataParam)
          set(fig,'Pointer','Arrow')
          %deprecated code
          %set(handles.LoadSelectedData,'Enable','on') % SB | 03-Jun-2003 button's removed
          return
       end

       % Find tessellation files for this subject
       TessPath = fileparts(BrainStormSubject); % referential
       TessPath = fullfile(Users.SUBJECTS,TessPath); % absolute
       [Tess,DataPopup,Leader] = find_brainstorm_files('tess',TessPath);

       % also find the MRI files at this point, for convenience and loading of the
       % bst_static_taskbar

       MRIFILES = find_brainstorm_files('anatomy',TessPath);

       if isempty(Tess) % No Tessellation file availble for this subject
          %bst_message_window('No Tessellation file specified for this subject');
          Tess = [];%'N/A';
          DispComment = {''};
       else
          cd(TessPath)
          for k = 1:length(Tess) % Explore Tess files and read Comments
             TessWhos = whos('-file',Tess{k});
             if ~isempty(strmatch('Comment',{TessWhos.name}))
                load(Tess{k},'Comment');
                DispComment{k} = char(Comment{:});
             else
                DispComment{k} = 'Not a valid tessellation file (Comment missing in file)';
             end
          end
       end
    else
       Tess = []%;'N/A';
       MRIFILES = [];
       DispComment = {''};
    end

    % load the static taskbar

    refpath = strrep(TessPath,[Users.SUBJECTS,filesep],''); % referential path to tessfiles and MRIfiles
    TESSFILES = Tess;
    for i = 1:length(Tess),
       TESSFILES{i} = fullfile(refpath,Tess{i}); % referential filename
    end
    if(length(Tess) > 0),
       bst_static_taskbar('SET','TESS',TESSFILES);
    else
       % empty
       bst_static_taskbar('SET','TESS',[]);
    end

    for i = 1:length(MRIFILES),
       MRIFILES{i} = fullfile(refpath,MRIFILES{i});
    end
    if(length(MRIFILES) > 0),
       bst_static_taskbar('SET','MRI',MRIFILES);
    else
       bst_static_taskbar('SET','MRI',[]);
    end

    % this was loaded above the deprecated section
    if ~exist('Device','var') % That's the case of older file names
       Device = 'Undefined';
    end

    % ditto, attempted load above the deprecated section
    if ~exist('ChannelFlag','var') % That's the case of older file names
       DataParam = {...
             ' ','DATABASE ERROR XXXXXX',...
             'Old or altered version of data file detected.',...
             'Please consider importing the original data set into BrainStorm'...
          };
    else
       % Bad Channels
       %try
       if ~isempty(MEGchan)
          bc_MEG = find(ChannelFlag(MEGchan)==0);
       else
          bc_MEG = 0;
       end
       if ~isempty(EEGchan)
          bc_EEG = find(ChannelFlag(EEGchan)==0);
       else
          bc_EEG = 0;
       end
       if ~isempty(OTHERchan)
          bc_OTHER = find(ChannelFlag(OTHERchan)==0);
       else
          bc_OTHER = 0;
       end

       % Build cell array for display of available tessellation files and corresponding envelopes
       TessDisp = {            '_______________',...
             ' ',...
             sprintf('%d Tessellation File(s)',length(Tess)),...
             'Available for this Subject'};

       for k = 1:length(Tess)
          TessDisp{end+1} =  sprintf('      --> %s',strrep(Tess{k},'.mat',''));
          % Add Tessellation Information to FileList.
          FileList(StudySelection).Tessellation{k} = Tess{k};
       end

       if length(Tess) > 1
          TessDisp = {TessDisp{:},...
                'Run Subject Info for more details',...
                'about each envelope',...
                '_______________',...
             };
       end

       % EEG ref display
       if isempty(MEGRef) % No MEG reference channel
          MEGRef = 0;
       end
       % EEG ref display
       if isempty(EEGRef) % EEG is average-reference
          EEGRefDisp = 'Average Ref';
       else
          EEGRefDisp = Channel(EEGRef).Name;
       end

       DataParam = {...
             DataComment,...
             ' ',...
             sprintf('Device Type: %s',Device),...
             sprintf('Time Range: %3.2f to %3.2f ms',1000 * Time(1), 1000*Time(end)),...
             '',...
             '_______________',...
             '',...
             'Channel Count :',...
             sprintf('MEG   : %3d (%3d bad channel(s))',length(MEGchan), length(bc_MEG)),...
             sprintf('-> MEG REF : %3d',length(MEGRef)),...
             sprintf('EEG   : %3d (%3d bad channel(s))',length(EEGchan), length(bc_EEG)),...
             sprintf('-> EEG REF : %s',EEGRefDisp),...
             sprintf('OTHER : %3d (%3d bad channel(s))',length(OTHERchan), length(bc_OTHER)),...
             '_______________',...
             '',...
             char(TessDisp),...
          };

       bst_message_window('wrap',...
          'Right-click for full information on current data set')

       InformationMenu = uicontextmenu; set(InformationMenu,'Parent',get(handles.listbox_Study,'parent'));
       uimenu(InformationMenu,'Label','See Study Information','Callback','data_manager(''DataInformation_Callback'',gcbo,[],guidata(gcbo))')
       set(handles.listbox_Study,'UIcontextMenu',InformationMenu)

       bst_message_window('wrap',...
          {' ',...
             'OK -> Ready for Visualization/Processing',...
             ' '})
    end

    % set(handles.DataParam,'String',(DataParam));
    setappdata(fig,'DataParam',DataParam);

    % deprecated, not needed
    % setappdata(handles.DataParam,'HeadModelFunction',HeadModelFunction)
    % set(handles.LoadSelectedData,'Enable','on')

    % if exist('HeadModelName','var') & exist('GridName','var')
    %     set(handles.HeadModelInfo,'String',{HeadModelName,GridName})
    % end

    Users.FILELIST = FileList; %setappdata(fig,'FileList',FileList); % updated with tesselation information
    iDB = getpref('BrainStorm','iUserDataBase');
    UserDB = getpref('BrainStorm','UserDataBase');
    UserDB(iDB).FILELIST = Users.FILELIST;
    setpref('BrainStorm','UserDataBase',UserDB);

    % JCM 09-Sep-2003 disabling old taskbar
    % taskbar('active'); % activate all buttons

    % Adding contextual menu to load selected data set quickly

    LoadDataMenu = uicontextmenu('Parent',fig);
    uimenu(LoadDataMenu,'Label','See Study Information','Callback','data_manager(''DataInformation_Callback'',gcbo,[],guidata(gcbo))')
    uimenu(LoadDataMenu,'Label','Load Selected','Callback','bst_static_taskbar(''menu_viewer_Callback'',gcbo,[],guidata(gcbo))','separator','on')
    set(handles.listbox_Study,'UIcontextMenu',InformationMenu)
    set(handles.listbox_Data,'UiContextMenu',LoadDataMenu)

    makeuswait('stop')

    % ---------------ROUTINE TO LOAD THE DATA (was pushbutton) --------------------
    function varargout = LoadSelectedData_Callback(h, eventdata, handles, varargin)
    % Load selected data, update the taskbar information, application data, BrainStorm Preferences

    handles = guihandles(h); % ensure we have the handles (mop up of legacy coding)
    % GuiData = guidata(h); % obsolete 05-Nov-2002

    % JCM 09-Sep-2003 disabling old taskbar
    % TASKBAR = getappdata(0,'BrainStormTaskbar'); % JCM 21-Mar-2002
    % htaskbar = guihandles(TASKBAR);

    fig = handles.DataManager; % handy shortcut

    Users = get_user_directory;
    FileList = Users.FILELIST; %getappdata(fig,'FileList');

    DataFiles = getappdata(fig,'DataFiles');

    cd(get(handles.edit_StudyFolder,'String')) % goto current study

    UserDB = getpref('BrainStorm','UserDataBase'); % all of the databases
    iDB = get(handles.popup_CurrentDatabase,'Val'); % selected
    Users = UserDB(iDB);

    CurrentData = struct('StudyFile',[],'SubjectFile',[]);

    % what study and subject are selected
    StudySelection = get(handles.listbox_Study,'Value');
    SubjectSelection = get(handles.listbox_Data,'Value');

    CurrentData.StudyFile = FileList(StudySelection).StudyFile;
    CurrentData.SubjectName = FileList(StudySelection).Subject.Name;
    CurrentData.SubjectFile = FileList(StudySelection).Subject.SubjectFile;

    load(fullfile(Users.STUDIES,CurrentData.StudyFile),'Name')

    [StudyPath, file, path] = fileparts(CurrentData.StudyFile);

    if length(SubjectSelection) == 1 % Only one file selected
       CurrentData.DataFile = DataFiles(SubjectSelection).name; % referential name

       % deprecated, info for the old taskbar window
       if(0), % disabled 5-sep-2003 by jcm
          set(htaskbar.Sedit_CurrentData,'String',...
             { ['Study: ',Name],...
                ['Subject: ', CurrentData.SubjectName],...
                ['Data File: ',CurrentData.DataFile],...
                ['Database: ',Users.Comment]...
             });
       end

    else % Mutliple data sets are selected

       CurrentData.DataFile =  DataFiles(SubjectSelection(1)).name;

       CurrentData.OtherDataFiles = {DataFiles(SubjectSelection(2:end)).name};

       % deprecated, info for the old taskbar window
       if(0), % disabled 5-sep-2003 by jcm
          set(htaskbar.Sedit_CurrentData,'String',...
             sprintf('Study: %s\nSubject: %s\n\n%d DATA SETS SELECTED\n\nFirst Data File: %s\nDatabase: %s',...
             Name, CurrentData.SubjectName,length(SubjectSelection),...
             CurrentData.DataFile,Users.Comment))
       end
    end

    Users.CurrentData = CurrentData;

    if(0), % JCM 09-Sep-2003 disabling old taskbar
       if(0) % disable, JCM 21-Mar-2002
          set(findobj(TASKBAR,'tag','DataPlot'),'enable','on');
          set(findobj(TASKBAR,'tag','MRITool'),'enable','on');
          set(findobj(TASKBAR,'tag','Visualization'),'enable','on');
          set(findobj(TASKBAR,'tag','head_modeler'),'enable','on');
       else % JCM 21-Mar-2002
          % JCM 09-Sep-2003 disabling old taskbar
          % taskbar('active'); % set the buttons active
       end
    end

    % JCM 09-Sep-2003 disabling old taskbar
    % setappdata(TASKBAR,'BrainStormDataBase',Users);

    setpref('BrainStorm','CurrentData',CurrentData); % permanent storage
    % Database information itself did not change

    % NOTE: JCM 10-JUN-2002, moved dataplot_cb to another pushbutton, Load and View
    % dataplot_cb('create')

    % ---------------------- MENU CALLBACKS ------------------------------
    % ---------------------- FILE MENU -----------------------------------
    % --------------------------------------------------------------------
    function varargout = menu_close_Callback(h, eventdata, handles, varargin)
    close(handles.DataManager); % close this figure

    % --------------------------------------------------------------------
    function varargout = menu_import_data_Callback(h, eventdata, handles, varargin)

    fig = importdata('create');

    % ---------------------- EDIT MENU -----------------------------------
    % --------------------------------------------------------------------
    function varargout = menu_edit_subject_Callback(h, eventdata, handles, varargin)
    % Edit the Subject File
    handles = guihandles(h); % rebuild

    % Which study was selected ?
    Selection = get(handles.listbox_Study,'Value');

    fig = subject_editor('create');
    uiwait(fig);

    % then reinitialize
    initialize_database(handles);

    % and finally back to selected study
    set(handles.listbox_Study,'Value',Selection);
    listbox_Study_Callback(h, eventdata, handles, varargin)

    % --------------------------------------------------------------------
    function varargout = menu_edit_study_Callback(h, eventdata, handles, varargin)

    % Call the Study File editor.
    handles = guihandles(h); % rebuild

    % Which study was selected ?
    Selection = get(handles.listbox_Study,'Value');

    fig = study_editor('create');
    uiwait(fig);

    % then rebuild database
    data_manager % initialize_database(handles);

    % and finally back to selected study
    set(handles.listbox_Study,'Value',Selection);
    listbox_Study_Callback(h, eventdata, handles, varargin)

    % --------------------------------------------------------------------
    function varargout = menu_edit_database_Callback(h, eventdata, handles, varargin)

    User = database_manager;
    if(isempty(User)),
       % cancelled
       return
    end

    initialize_database(handles); % now reinitialize the database with the new database

    % --------------------------------------------------------------------
    function varargout = menu_edit_rebuild_Callback(h, eventdata, handles, varargin)

    set(findobj(0,'type','figure'),'pointer','watch')

    bst_message_window('wrap',...
       'Rebuilding database. . .')

    iDB = getpref('BrainStorm','iUserDataBase');
    UserDB = getpref('BrainStorm','UserDataBase');
    UserDB(iDB).FILELIST = browse_study_folder(UserDB(iDB).STUDIES); % Update file list in current study folder
    setpref('BrainStorm','UserDataBase',UserDB);

    load_listbox_Study(handles); %rebuild Studies and Subjects list as well

    data_manager % why the recursive call? 19-Aug-2003. apparently should rebuild, but doesn't sometimes

    bst_message_window('wrap',...
       'Rebuilding database -> DONE')

    set(findobj(0,'type','figure'),'pointer','arrow')

    % ---------------------- VIEW MENU -----------------------------------
    % --------------------------------------------------------------------
    function varargout = menu_view_information_Callback(h, eventdata, handles, varargin)

    figs = bst_win_manager;
    DataParam = getappdata(figs.DataManager,'DataParam'); % Fetch Display Information
    h = bst_message_window('unique',DataParam); % SB - 12-jun-2003 | Use the new feature from bst_message_window instead of creating and altering a message box.

    set(h,'visible','off');
    bst_color_scheme(h);
    setappdata(h,'TileType','T');
    bst_layout('align',h,1,2,2);

    set(h,'Visible','on')

    % --------------------------------------------------------------------
    function varargout = menu_view_datafiles_Callback(h, eventdata, handles, varargin)

    State = get(h,'Checked'); % current state of on or off
    switch State
       case 'on'
          set(h,'Checked','off');
          set(handles.menu_view_results,'Checked','on'); % mutual exclusive
       case 'off'
          set(h,'Checked','on');
          set(handles.menu_view_results,'Checked','off'); % mutual exclusive
    end

    % now update the datafiles again
    listbox_Study_Callback(handles.listbox_Study,[],handles);

    % --------------------------------------------------------------------
    function varargout = menu_view_results_Callback(h, eventdata, handles, varargin)

    State = get(h,'Checked'); % current state of on or off
    switch State
       case 'on'
          set(h,'Checked','off');
          set(handles.menu_view_datafiles,'Checked','on'); % mutual exclusive
       case 'off'
          set(h,'Checked','on');
          set(handles.menu_view_datafiles,'Checked','off'); % mutual exclusive
    end

    % now update the datafiles again
    listbox_Study_Callback(handles.listbox_Study,[],handles);

    % ------------- MENU POOLED ANALYSIS -----------------------
    % --------------------------------------------------------------------
    function varargout = menu_pooled_define_Callback(h, eventdata, handles, varargin)
    % do nothing for now

    bst_message_window('not implemented')

    % --------------------------------------------------------------------
    function varargout = menu_pooled_allow_Callback(h, eventdata, handles, varargin)
    % do nothing for now, leave off
    set(h,'Checked','off')
    bst_message_window('not implemented')

    % ------------------------ OLD PUSHBUTTON ROUTINES ------------------------------
    % --------------------------------------------------------------------
    function varargout = ComputeDefaultHeadModel_Callback(h, eventdata, handles, varargin)
    % Compute head model(s) of selected study(ies) with default
    %  parameters as described in bst_headmodeler;

    handles = guihandles(h); % rebuild handles

    % Fetch StudyFile
    Users = get_user_directory;
    GUIs = bst_win_manager;

    set(GUIs.DataManager,'Pointer','Watch')

    bst_message_window('wrap',{...
          'Computing head model for study: ',...
          strrep(Users.CurrentData.StudyFile,'.mat',''),...
          'with default parameters',...
       });

    OPTIONS.HeadModelFile = 'Default';
    bst_headmodeler(Users.CurrentData.StudyFile,OPTIONS);

    bst_message_window('wrap',{...
          strrep(Users.CurrentData.StudyFile,'.mat',''),...
          '-> DONE',...
       });

    % Refresh DM display

    if(strcmp('on',get(handles.listbox_Study,'enable'))),
       % study listbox is on, update the data
       data_manager('listbox_Study_Callback',GUIs.DataManager);
    end

    set(GUIs.DataManager,'Pointer','Arrow')

    % --------------------------------------------------------------------
    function varargout = pushbutton_CoRegisterStudies_Callback(h, eventdata, handles, varargin)
    % JCM 28-May-2002, added this buttons so that ALL callbacks MUST first come
    % through the feval switchyard, for easier tracking

    bst_RegisterStudies('Create');

    % --------------------------------------------------------------------
    function varargout = DataInformation_Callback(h, eventdata, handles, varargin)
    % Display specific information about selected data set in a separate quatertile

    figs = bst_win_manager;
    DataParam = getappdata(figs.DataManager,'DataParam'); % Fetch Display Information

    % Create a Message ListBox --------------------- SB 04-Jun-2003 | CBB, could be a function call

    % h = msgbox(DataParam,'Data Information','none'); % Create message boc
    % set(h,'Visible','off')
    % set(h,'resize','on'); % in case it is too big
    %
    % child = findobj(h); % get all of the children
    % set(child,'Units','normal');
    % a = unique(findobj(child,'type','text'));
    % set(a,'visible','off');
    % b = uicontrol(h,'Style','listbox','units','normal','position',[0.04 0.08 0.92 0.92],...
    %     'FontName','FixedWidth');
    % set(b,'String',DataParam);
    %
    % okbttn = findobj(child,'String','OK');
    % set(okbttn,'Tag','H_OK')

    h = bst_message_window('unique',DataParam); % SB - 12-jun-2003 | Use the new feature from bst_message_window instead of creating and altering a message box.

    % Create a Message ListBox --------------------- DONE

    bst_color_scheme(h); % looks too dark, need a special
    setappdata(h,'TileType','T');
    bst_layout('align',h,1,2,2);

    set(h,'Visible','on')

    % --------------------------------------------------------------------
    function varargout = HeadModelAdvanced_Callback(h, eventdata, handles, varargin)

    % Basic call - will change when new headmodelling routine will be available
    %GuiData = guidata(h); % obsolete
    Users = get_user_directory;
    headmodeler_gui('LoadStudy',Users.CurrentData.StudyFile)

    % --------------------------------------------------------------------
    function varargout = pushbutton_importdata_Callback(h, eventdata, handles, varargin)
    % JCM 28-May-2002, added this buttons so that ALL callbacks MUST first come
    % through the feval switchyard, for easier tracking
    handles = guihandles(h); % rebuild handles

    fig = importdata('create');
    % uiwait(fig); % wait on the user to finish
    %
    % % then try reloading the database again, to detect any new data
    %
    % initialize_database(handles);

    % --------------------------------------------------------------------
    function varargout = RefreshHeadModelList_Callback(h, eventdata, handles, varargin)
    % Refresh HeadModelList display with new files available
    % (useful after call to HeadModeler when new HeadModel files were created)

    % --------------------------------------------------------------------
    function varargout = Manage_DataBase_Callback(h, eventdata, handles, varargin)
    % Refresh DataManager display with new files available

    handles = guihandles(h); % rebuild handles

    if(0), % deprecated code
       initialize_users('create'); % Let the user pick-up a new data base
    end

    % new code 24-May-2002
    User = database_manager;
    if(isempty(User)),
       % cancelled
       return
    end

    initialize_database(handles); % now reinitialize the database with the new database

    % --------------------------------------------------------------------
    function varargout = ResultFiles_Callback(h, eventdata, handles, varargin)
    handles = guihandles(h); % ensure handles
    % GuiData = guidata(h); % obsolete

    Green = [.66 1 .43];
    Dark = [.4 .4 .4];
    if get(handles.ResultFiles,'Value')
       set(handles.ResultFiles,'Backgroundcolor',Green,'Foregroundcolor',Dark)
    else
       set(handles.ResultFiles,'Backgroundcolor',Dark,'Foregroundcolor','w')
    end

    % now update the datafiles again
    listbox_Study_Callback(handles.listbox_Study,[],handles);

    % --------------------------------------------------------------------
    function varargout = DataFiles_Callback(h, eventdata, handles, varargin)

    handles = guihandles(h); % ensure handles
    % GuiData = guidata(h); % obsolete

    Green = [.66 1 .43];
    Dark = [.4 .4 .4];
    if get(handles.DataFiles,'Value')
       set(handles.DataFiles,'Backgroundcolor',Green,'Foregroundcolor',Dark)
    else
       set(handles.DataFiles,'Backgroundcolor',Dark,'Foregroundcolor','w')
    end

    % now update the datafiles again
    listbox_Study_Callback(handles.listbox_Study,[],handles);

    % --------------------------------------------------------------------
    function varargout = StudyBatch_Callback(h, eventdata, handles, varargin)

    data_manager

    % --------------------------------------------------------------------
    function varargout = MRITool_Callback(h, eventdata, handles, varargin)
    % Basic call
    % NOTE: Need to install Alex' new code instead

    mritool_cb('create')

    % --------------------------------------------------------------------
    function varargout = HeadModelList_Callback(h, eventdata, handles, varargin)
    % Display HeadModelName and GridName

    GUI = bst_win_manager;
    handles = guihandles(GUI.DataManager);
    HeadModelPath = get(handles.HeadModelList,'Userdata'); % Full path to the headmodel files
    if isempty(HeadModelPath),
       return,
    end

    HeadModelFiles = get(handles.HeadModelList,'String');
    HeadModel = get(handles.HeadModelList,'Value');

    HeadModel_whos = whos('-file',fullfile(StudyPath,HeadModelFiles{HeadModel}));

    % Load info from file
    if(isempty(strmatch('GridName',{HeadModel_whos.name})) | ...
          isempty(strmatch('HeadModelName',{HeadModel_whos.name}))) % Not valid or older headmodel file

       if isempty(strmatch('Function',{HeadModel_whos.name})),
          InfoStr = 'Not a valid HeadModel file';
       else
          % function does exist
          load(fullfile(HeadModelPath,HeadModelFiles{HeadModel}),'Function')
          InfoStr = {'File is from older version of BrainStorm', ...
                char(getappdata(handles.DataParam,'HeadModelFunction'))};
       end

    else

       % valid file
       load(fullfile(HeadModelPath,[HeadModelFiles{HeadModel},'.mat']),'GridName','HeadModelName')
       InfoStr = {...
             sprintf('HeadModel type: '),...
             sprintf('\t%s',HeadModelName),...
             'GridName:',...
             sprintf('\t%s',GridName{1})...
          };

    end

    %set(handles.HeadModelInfo,'String',InfoStr)
    varargout{1} = InfoStr;

    % --------------------------------------------------------------------
    function varargout = pushbutton_LoadView_Callback(h, eventdata, handles, varargin)

    handles = guihandles(h); % we have to rebuild

    % first load the selected data
    LoadSelectedData_Callback(handles.LoadSelectedData,[],handles);

    % now view it
    dataplot_cb('create')

    % --------------- EDIT THE STUDY FILES --------------------------------
    function varargout = StudyFile_Callback(h, eventdata, handles, varargin)
    % Call the Study File editor.
    handles = guihandles(h); % rebuild

    % Which study was selected ?
    Selection = get(handles.listbox_Study,'Value');

    fig = study_editor('create');
    uiwait(fig);

    % then rebuild database
    data_manager % initialize_database(handles);

    % and finally back to selected study
    set(handles.listbox_Study,'Value',Selection);
    listbox_Study_Callback(h, eventdata, handles, varargin)

    % --------------- EDIT THE SUBJECT FILES --------------------------------
    function varargout = SubjectFile_Callback(h, eventdata, handles, varargin)

    % Edit the Subject File
    handles = guihandles(h); % rebuild

    % Which study was selected ?
    Selection = get(handles.listbox_Study,'Value');

    fig = subject_editor('create');
    uiwait(fig);

    % then reinitialize
    initialize_database(handles);

    % and finally back to selected study
    set(handles.listbox_Study,'Value',Selection);
    listbox_Study_Callback(h, eventdata, handles, varargin)

    % --------------------------------------------------------------------
    function varargout = Quit_Callback(h, eventdata, handles, varargin)
    % Stub for Callback of the uicontrol handles.Quit.

    delete(gcbf)

    % --------------------------------------------------------------------
    function varargout = Refresh_Callback(h, eventdata, handles, varargin)
    % Refresh DataManager display with new files available

    set(findobj(0,'type','figure'),'pointer','watch')

    bst_message_window('wrap',...
       'Rebuilding database. . .')

    iDB = getpref('BrainStorm','iUserDataBase');
    UserDB = getpref('BrainStorm','UserDataBase');
    UserDB(iDB).FILELIST = browse_study_folder(UserDB(iDB).STUDIES); % Update file list in current study folder
    setpref('BrainStorm','UserDataBase',UserDB);

    load_listbox_Study(handles); %rebuild Studies and Subjects list as well

    data_manager % why the recursive call? 19-Aug-2003. apparently should rebuild, but doesn't sometimes

    bst_message_window('wrap',...
       'Rebuilding database -> DONE')

    set(findobj(0,'type','figure'),'pointer','arrow')

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