% FROMDATAINMAT Convert a saved data-array into an AO with a tsdata-object
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% FUNCTION:    fromDataInMAT
%
% DESCRIPTION: Convert a saved data-array into an AO with a tsdata-object
%
% CALL:        obj = fromLISO(obj, data-array, plist)
%
% PARAMETER:   data-array: data-array
%              plist:      plist-object (must contain the filename)
%
% VERSION:     $Id: fromDataInMAT.m,v 1.8 2011/08/12 11:38:03 hewitson Exp $
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function objs = fromDataInMAT(obj, loadData, pli)
  
  VERSION = '$Id: fromDataInMAT.m,v 1.8 2011/08/12 11:38:03 hewitson Exp $';
  
  ii = obj.getInfo(class(obj), 'From MAT Data File');
  
  % Set the method version string in the minfo object
  ii.setMversion([VERSION '-->' ii.mversion]);
  
  %%%%%%%%%%   Get default parameter list   %%%%%%%%%%
  dpl = ii.plists();
  pl  = applyDefaults(dpl, pli);
  
  % Get filename
  filename = find(pli, 'filename');
  [pathstr, f_name, ext] = fileparts(filename);
  
  pl = pset(pl, 'filename', [f_name ext]);
  pl = pset(pl, 'filepath', pathstr);
  
  data_type = find (pl, 'type');
  columns   = find (pl, 'columns');
  fs        = find (pl, 'fs');
  
  objs = [];
  
  %%%%
  if strcmpi(data_type, 'cdata')
    fs = 1;
  end
  
  % Then we try for a numerical data set in
  % the first numerical field we come to
  fnames = fieldnames(loadData);
  for jj=1:length(fnames)
    if isnumeric(loadData.(fnames{jj}))
      % get the data from here
      data = loadData.(fnames{jj});
      
      if isempty(columns)
        columns = 1:size(data,2);
      end
      
      if max(columns) > size(data,2)
        error('### The stored variable [%s] doesn''t contain %d columns. It only contains %d columns.', fnames{jj}, max(columns), size(data,2));
      end
      
      if isempty(fs)
        
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        %%%                       Create from x and y                       %%%
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        
        for kk=1:2:numel(columns)
          
          % Create an empty object.
          obj = obj.initObjectWithSize(1,1);
          
          x = data(:, columns(kk));
          y = data(:, columns(kk+1));
          
          switch lower(data_type)
            case 'tsdata'
              dataObj = tsdata(x, y);
            case 'fsdata'
              dataObj = fsdata(x, y);
            case 'xydata'
              dataObj = xydata(x, y);
            case 'cdata'
              error('### Should not happen');
            otherwise
              error('### unknown data type ''%s''', data_type);
          end
          
          obj.data = dataObj;
          
          plh = pl.pset('columns', [columns(kk) columns(kk+1)]);
          if isempty(pl.find('Name'))
            plh.pset('Name', sprintf('%s_%d_%d', find(pl, 'filename'), columns(kk), columns(kk+1)));
          end
          
          obj.addHistory(ii, plh, [], []);
          
          objs = [objs obj];
          
        end
        
      else
        
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        %%%                       Create from y and fs                      %%%
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        
        for kk=1:numel(columns)
          
          % Create an empty object.
          obj = obj.initObjectWithSize(1,1);
          
          y = data(:, columns(kk));
          
          switch lower(data_type)
            case 'tsdata'
              dataObj = tsdata(y, fs);
            case 'fsdata'
              dataObj = fsdata(y, fs);
            case 'xydata'
              dataObj = xydata(y);
            case 'cdata'
              % Special case for cdata objects.
              % If the user doesn't specify any columns then return only
              % one AO with all the data. But if the user defines any
              % columns then return for each column an AO
              pl.removeKeys({'fs', 'xunits'});
              if isempty(pl.find('columns'))
                obj = obj.initObjectWithSize(1,1);
                obj.data = cdata(data);
                obj.name = pl.find('filename');
                obj.addHistory(ii, pl, [], []);
                objs = [objs obj];
                break;
              else
                dataObj = cdata(data(:,columns));
              end
            otherwise
              error('### unknown data type ''%s''', data_type);
          end
          
          obj.data = dataObj;
          
          plh = pl.pset('columns', columns(kk));
          if isempty(pl.find('Name'))
            plh.pset('Name', sprintf('%s_%d', find(pl, 'filename'), columns(kk)));
          end
          
          % add history
          obj.addHistory(ii, plh, [], []);
          
          objs = [objs obj];
        end
        
      end
      
      % set any object properties
      objs.setObjectProperties(pl);
      
    end % End if the mat file contains numeric data
  end % End loop over filenames
  
  
end



