% LTPDA_DATA is the abstract base class for ltpda data objects.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% DESCRIPTION:   LTPDA_DATA is the base class for ltpda data objects.
%                This is an abstract class.
%
% SUPERCLASSES: ltpda_nuo < ltpda_obj
%
% VERSION:     $Id: ltpda_data.m,v 1.19 2011/03/25 15:33:52 mauro Exp $
%
% SEE ALSO:    data2D, ltpda_nuo, ltpda_obj, cdata
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

classdef (Hidden = true) ltpda_data < ltpda_nuo


  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  %                            Property definition                            %
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

  %---------- Public (read/write) Properties  ----------
  properties (GetAccess = public, SetAccess = public)
    yunits = unit; % units of the y-axis
    y      = []; % data values of the y-axis
    dy     = []; % error on y values
  end

  %---------- Protected read-only Properties ----------
  properties (GetAccess = public, SetAccess = protected)
  end

  %---------- Private Properties ----------
  properties (GetAccess = protected, SetAccess = protected)
  end

  %---------- Abstract Properties ----------
  properties (Abstract = true, SetAccess = protected)
  end

  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  %                          Check property setting                           %
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

  methods
    %--- Yunits
    function set.yunits(obj, val)
      if ~ischar(val) && ~isa(val, 'unit')
        error('### The value for the property ''yunits'' must be a unit-object or a string');
      end
      if ischar(val)
        obj.yunits = unit(val);
      elseif isa(val, 'unit')
        obj.yunits = val;
      else
        error('### The yunits value must be a unit or a string');
      end
    end
    %--- Y
    function set.y(obj, val)
      if ~isempty(val)
        if ~(isnumeric(val) || islogical(val)) || ndims(val) ~= 2
          error('### The value for the property ''y'' must be a matric or a vector');
        end
      end
      if ~isempty(obj.y) && isvector(obj.y) && ((size(val,1) == 1 && size(obj.y,1) ~= 1) || (size(val,2) == 1 && size(obj.y,2) ~= 1))
        val = val.';
      end
      obj.y = val;

      if ~isempty(findprop(obj,'x'))
        sx = size(obj.x);
        sy = size(obj.y);
        if sx(1) == 1 && sy(1) ~= 1
          obj.x = obj.x.';
        end
        if sx(2) == 1 && sy(2) ~= 1
          obj.x = obj.x.';
        end
      end
    end
    %--- dY
    function set.dy(obj, val)
      if ~isempty(val)
        if ~isnumeric(val) || ~(numel(val) == 0 || numel(val) == 1 || numel(val) == numel(obj.y))
          error('### The value for the property ''dy'' must have the length 0, 1 or the length of the y-values');
        end
      end
      obj.dy = val;

      sdy = size(obj.dy);
      sy = size(obj.y);
      if sdy(1) == 1 && sy(1) ~= 1
        obj.dy = obj.dy.';
      end
      if sdy(2) == 1 && sy(2) ~= 1
        obj.dy = obj.dy.';
      end
    end
  end

  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  %                                Constructor                                %
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

  methods

    function obj = ltpda_data(varargin)
    end

  end

  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  %                              Methods (public)                             %
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

  methods
  end

  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  %                              Methods (protected)                          %
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

  methods (Access = protected)
    varargout = fromStruct(varargin)
    varargout = fromDom(varargin)
  end

  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  %                              Methods (private)                            %
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

  methods (Access = private)
  end

  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  %                              Methods (static)                             %
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

  methods (Static)

    function ii = getInfo(varargin)
      ii = utils.helper.generic_getInfo(varargin{:}, 'ltpda_data');
    end

    function out = VEROUT()
      out = '$Id: ltpda_data.m,v 1.19 2011/03/25 15:33:52 mauro Exp $';
    end

    function out = SETS()
      out = {};
    end

    function out = getDefaultPlist()
      out = [];
    end

  end

  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  %                              Methods (abstract)                           %
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

  methods (Abstract)
  end

end

