[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
This function is called by

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