diff m-toolbox/classes/@ao/ao.m @ 0:f0afece42f48

Import.
author Daniele Nicolodi <nicolodi@science.unitn.it>
date Wed, 23 Nov 2011 19:22:13 +0100
parents
children a71a40911c27 bc767aaa99a8
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/m-toolbox/classes/@ao/ao.m	Wed Nov 23 19:22:13 2011 +0100
@@ -0,0 +1,1495 @@
+% AO analysis object class constructor.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% DESCRIPTION: AO analysis object class constructor.
+%              Create an analysis object.
+%
+%     Possible constructors:
+%       a = ao()            - creates an empty analysis object
+%       a = ao('a1.xml')    - creates a new AO by loading a file
+%       a = ao('a1.mat')
+%       a = ao('a1.mat')    - creates a new AO by loading the 2-column data .MAT file.
+%       a = ao('file.txt')  - creates a new AO by loading the data.
+%       a = ao('file.dat')
+%       a = ao('file',pl)     (<a href="matlab:utils.helper.displayMethodInfo('ao', 'ao')">Set: From ASCII File</a>)
+%       a = ao(data)        - creates an AO with a data object.
+%       a = ao(constant)    - creates an AO from a constant
+%       a = ao(specwin)     - creates an AO from a specwin object
+%       a = ao(pzm)         - creates an AO from a pole/zero model object
+%       a = ao(pzm,nsecs,fs)
+%       a = ao(smodel)      - creates an AO from a symbolic model object
+%       a = ao(pest)        - creates an AO from a parameter estimates object
+%       a = ao(x,y)         - creates an AO with xy data
+%       a = ao(y, fs)       - creates an AO with time-series data
+%       a = ao(x,y,fs)      - creates an AO with time-series data
+%       a = ao(x,y,pl)      - creates an AO depending from the PLIST (<a href="matlab:utils.helper.displayMethodInfo('ao', 'ao')">Set: From XY Values</a>).
+%       a = ao(plist)       - creates an AO from a <a href="matlab:utils.helper.displayMethodInfo('ao', 'ao')">parameter list</a>
+%
+% <a href="matlab:utils.helper.displayConstructorExamples('ao')">Examples</a>
+%
+% <a href="matlab:utils.helper.displayMethodInfo('ao', 'ao')">Parameters Description</a>
+%
+% VERSION: $Id: ao.m,v 1.361 2011/08/22 05:23:45 hewitson Exp $
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+% AO analysis object class constructor.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% DESCRIPTION: AO analysis object class constructor.
+%              Create an analysis object.
+%
+%     Possible constructors:
+%
+%       a = ao()            - creates an empty analysis object
+%       a = ao('a1.xml')    - creates a new analysis object by loading the
+%                             analysis object from disk.
+%       a = ao('a1.mat')    - creates a new analysis object by loading the
+%                             analysis object from disk.
+%       a = ao('a1.mat')    - creates a new analysis object by loading the
+%                             2-column data set stored in the .MAT file.
+%       a = ao('file.txt')  - creates a new analysis object by loading the
+%       a = ao('file.dat')    data in 'file.txt'. The ascii file is assumed
+%                             to be an equally sampled two-column file of
+%                             time and amplitude. By default, the amplitude
+%                             units are taken to be Volts ('V') and the
+%                             time samples are assumed to be in seconds.
+%       a = ao('file',pl)   - creates a new analysis object by loading the
+%                             data in 'file'. The parameter list decide how the
+%                             analysis object is created. The valid key values
+%                             of the parameter list are:
+%                             'type'        'tsdata','fsdata','xydata'
+%                                            [default: 'tsdata']
+%                             'fs'           if this value is set, the
+%                                            x-axes is computed by the fs value.
+%                                            [default: empty array]
+%                             'columns'      [1 2 1 4]
+%                                            Each pair represented the x- and y-axes.
+%                                            (Each column pair creates an analysis object)
+%                                            If the value 'fs' is used then
+%                                            represent each column the y-axes.
+%                                            (Each column creates an analysis object)
+%                                            [default: [1] ]
+%                             'comment_char' The comment character in the file
+%                                            [default: '']
+%                             'description'  To set the description in the analysis object
+%                             '...'          every property where exist a public
+%                                            set-function in the AO class e.g.
+%                                            setName, setT0, setYunits, ...
+%                             If the constructor creates multiple ao's it is
+%                             possible to give each data class its own e.g.
+%                             'name'. In this case the parameter list with the
+%                             key 'name' must have cell of the different values
+%                             as the name of the different data objects. e.g.
+%                             pl = plist('columns', [1 2 1 3],        ...
+%                                        'name',   {'name1' 'name2'}, ...
+%                                        'xunits', unit('s'),             ...
+%                                        'yunits', {unit('V') unit('Hz'}));
+%                             This parameter list creates two ao's with tsdata.
+%
+%                             'Robust'  - set this to 'yes' to use (slow)
+%                                         robust data reading. Useful for
+%                                         complicated file formats.
+%                                         [default: 'yes']
+%
+%       NOTE: Data files with comments at the end of the lines can only be
+%       read if there are no lines with only comments. In this case, do not
+%       specify a comment character. If you really want to load a file like
+%       this, specify the 'Robust' option; this will be very slow for large
+%       files.
+%
+%       a = ao(data)        - creates an analysis object with a data
+%                             object. Data object can be one of tsdata,
+%                             fsdata, cdata, xydata, xyzdata.
+%       a = ao(data, hist)  - creates an analysis object with a data
+%                             object and a history object
+%       a = ao(specwin)     - creates an analysis object from a specwin
+%                             object
+%       a = ao(plist)       - creates an analysis object from the description
+%                             given in the parameter list
+%
+%
+% VERSION:    $Id: ao.m,v 1.361 2011/08/22 05:23:45 hewitson Exp $
+%
+% Parameter sets for plist constructor (in order of priority):
+%
+% Notes and examples for some parameter sets follow:
+%
+% From complex ASCII File
+% ---------------
+%
+%     >> ao(plist('filename','data.txt','complex_type','real/imag','type','tsdata'));   %!
+%     >> ao(plist('filename','data.txt','complex_type','real/imag','type','fsdata','columns',[1,2,4]));   %!
+%
+% From Function
+% -------------
+%
+%     >> ao(plist('fcn', 'randn(100,1)','yunits','V'));
+%
+% From Values
+% -----------
+%
+%     >> ao(plist('vals',[1 2 3],'N',10));                              % -->  cdata
+%     >> ao(plist('xvals',[1 2 3],'yvals',[10 20 30]));                 % --> xydata
+%     >> ao(plist('xvals',[1 2 3],'yvals',[10 20 30],'type','tsdata')); % --> tsdata
+%     >> ao(plist('xvals',[1 2 3],'yvals',[10 20 30],'type','fsdata')); % --> fsdata
+%     >> ao(plist('fs',1,'yvals',[10 20 30]));                          % --> tsdata
+%     >> ao(plist('fs',1,'yvals',[10 20 30],'type','fsdata'));          % --> fsdata
+%     >> ao(plist('fs',1,'yvals',[10 20 30],'type','fsdata','xunits','mHz','yunits','V'));
+%
+% From XY Function
+% ----------------
+%
+%     >> ao(plist('xyfcn', 'cos(2*pi*x) + randn(size(x))','x',[1:1e5]));
+%
+% From Time-series Function
+% -------------------------
+%
+%     >> ao(plist('tsfcn', 'cos(pi*t) + randn(size(t))', 'fs', 1, 'nsecs', 100));
+%     >> ao(plist('fs',10,'nsecs',10,'tsfcn','sin(2*pi*1.4*t)+0.1*randn(size(t))','t0',time('1980-12-01 12:43:12')));
+%
+%
+% From Frequency-series Function
+% ------------------------------
+%
+%     >> ao(plist('FSFCN','f','f1',1e-5,'f2',1,'yunits','V'));
+%     >> ao(plist('FSFCN','f','f',[0.01:0.01:1]));
+%
+% From Window
+% -----------
+%
+%     >> ao(plist('win', specwin('Hannning', 100)));
+%
+% From Waveform
+% -------------
+%
+%     >> ao(plist('waveform','sine wave','A',3,'f',1,'phi',pi/2,'toff',0.1,'nsecs',10,'fs',100));
+%     >> ao(plist('waveform','noise','type','normal','sigma',2,'nsecs',1000,'fs',1));
+%     >> ao(plist('waveform','chirp','f0',0.1,'f1',1,'t1',1,'nsecs',5,'fs',1000));
+%     >> ao(plist('waveform','gaussian pulse','f0',1','bw',0.2,'nsecs',20,'fs',10));
+%     >> ao(plist('waveform','square wave','f',2,'duty',40,'nsecs',10,'fs',100));
+%     >> ao(plist('waveform','sawtooth','f',1.23,'width',1,'nsecs',10/1.23,'fs',50));
+%
+%
+%
+% From Repository
+% ---------------
+%
+%      >> ao(plist('hostname','123.123.123.123','database','ltpda_test','ID',[1:10],'binary','yes')); %!
+%
+%
+% From Polynomial
+% ---------------
+%
+%   Construct an AO from a set of polynomial coefficients.
+%
+%   'polyval'  - a set of polynomial coefficients. This can also be an AO,
+%                in which case the Y values from the AO are used.
+%                [default: [-0.0001 0.02 -1 -1] ]
+%
+%   Additional parameters:
+%         'Nsecs'           - number of seconds           [default: 10]
+%         'fs'              - sample rate                 [default: 10]
+%   or
+%         't'               - vector of time vertices. The value can also
+%                             be an AO, in which case the X vector is used.
+%                             [default: [] ]
+%
+%   Example:
+%   plist('polyval', [1 2 3], 'Nsecs', 1e2, 'fs', 10)
+%
+% From Pzmodel
+% ------------
+%
+%  Generates an ao with a timeseries with a prescribed spectrum.
+%
+%  'pzmodel'   - a pole/zero model which builds the time-series AO
+%
+%                Additional parameters:
+%                   'Nsecs'           - number of seconds to be generated
+%                   'fs'              - sampling frequency
+%
+%                You can also specify optional parameters:
+%                   'xunits'          - unit of the x-axis
+%                   'yunits'          - unit of the y-axis
+%
+%   Example:  p   = [pz(f1,q1) pz(f2,q2)]
+%             z   = [pz(f3,q3)]
+%             pzm = pzmodel(gain, p, z)
+%   plist('pzmodel', pzm, 'Nsecs', 1e2, 'Fs', 10)
+%
+% From Built-in Model
+% -------------------
+%
+% To get a list of built-in AOs: ao.getBuiltInModels
+%
+% Each model has additional parameters that need to be passed. To see the
+%
+% Additonal model parameters: >> help ao_model_<model_name>
+%
+% Example: >> help ao_model_mdc1_fd_dynamics
+%
+% From Plist
+% ----------
+%
+%   Examples:
+%
+%   1) Normally distributed random noise time-series
+%
+%      >> p = plist('waveform', 'noise', 'fs', 10, 'nsecs', 1000);
+%      >> a = ao(p);
+%
+%      Indexing:
+%
+%      >> b = a(1);           % where a is an array of analysis objects
+%      >> d = a.data;         % get the data object
+%      >> h = a.hist;         % get the history object
+%      >> d = a.data.x(1:20); % get a matrix of data values x;
+%
+%  2) Timeseries with a prescribed spectrum
+%
+%     >> a = ao(plist('pzmodel', pzm, 'fs',10, 'nsecs', 120, 'ndigits', 50)); %!
+%
+%        fs      - sampling frequency
+%        nsecs   - number of seconds in time series
+%        ndigits - number of digits for symbolic math toolbox (default: 32)
+%
+%
+% <a href="matlab:utils.helper.displayMethodInfo('ao', 'ao')">Parameters Description</a>
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% See also tsdata, fsdata, xydata, cdata, xyzdata
+
+% From CSD
+% ------------
+%
+%   Example 1D:  mod is an AO with the target model power spectrum
+%
+%   pl = plist('csd', mod, 'Nsecs', 1e3, 'fs', 10);
+%   an = ao(pl);
+%
+%   Example 2D:  mod is a 2x2 matrix of AOs with the target model cross
+%   spectral density.
+%
+%   pl = plist('csd', mod, 'Nsecs', 1e3, 'fs', 10);
+%   an = ao(pl);
+%
+
+
+classdef ao < ltpda_uoh
+  
+  
+  %------------------------------------------------
+  %-------- Public (read/write) Properties  -------
+  %------------------------------------------------
+  properties (Hidden = true)
+  end % End (read/write) Properties
+  
+  %------------------------------------------------
+  %---------- Private read-only Properties --------
+  %------------------------------------------------
+  properties (GetAccess = public, SetAccess = protected)
+    data        = []; % Data object associated with this AO
+  end % End read only properties
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %                          Check property setting                           %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  
+  methods
+    function set.data(obj, val)
+      if ~(isa(val, 'ltpda_data') || isempty(val))
+        error('### The value for the property ''data'' must be a ltpda_data object');
+      end
+      obj.data = val;
+    end
+  end
+  
+  
+  %------------------------------------------------
+  %---------------- Private Properties ------------
+  %------------------------------------------------
+  properties (GetAccess = protected, SetAccess = protected)
+    
+  end
+  
+  methods
+    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+    %                               Constructor                               %
+    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+    function obj = ao(varargin)
+      
+      import utils.const.*
+      utils.helper.msg(msg.PROC3, 'running ao/ao');
+      
+      % check if the caller was a user of another method
+      callerIsMethod = utils.helper.callerIsMethod;
+      
+      % Check the supported version
+      utils.helper.checkMatlabVersion;
+      
+      %%% Collect all plists and combine them.
+      [pli, invars, args] = utils.helper.collect_objects(varargin, 'plist');
+      
+      if ~isempty(pli)
+        pli = pli.combine();
+        if ~isempty(pli.find('dtype'))
+          warning('LTPDA:ao', 'the parameter name ''dtype'' is now deprecated; please use ''type'' instead.')
+          pli.append('type',pli.find('dtype'));
+          pli.remove('dtype');
+        end
+        if ~isempty(pli.find('use_fs'))
+          warning('LTPDA:ao', 'the parameter name ''use_fs'' is now deprecated; please use ''fs'' instead.')
+          pli.append('fs',pli.find('use_fs'));
+          pli.remove('use_fs');
+        end
+        %%% Append the plist to the input-arguments
+        args{end+1} = pli;
+      end
+      
+      %%% Execute appropriate constructor
+      switch numel(args)
+        case 0
+          %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+          %%%%%%%%%%%%%%%%%%%%%%%%%%%   no input   %%%%%%%%%%%%%%%%%%%%%%%%%%%%
+          %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+          obj.addHistory(ao.getInfo('ao', 'None'), plist(), [], []);
+          
+        case 1
+          %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+          %%%%%%%%%%%%%%%%%%%%%%%%%%%   one input   %%%%%%%%%%%%%%%%%%%%%%%%%%%
+          %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+          
+          if ischar(args{1})
+            %%%%%%%%%%   a1 = ao('foo.mat')   %%%%%%%%%%
+            %%%%%%%%%%   a1 = ao('foo.xml')   %%%%%%%%%%
+            %%%%%%%%%%   a1 = ao('foo.txt')   %%%%%%%%%%
+            %%%%%%%%%%   a1 = ao('foo.dat')   %%%%%%%%%%
+            utils.helper.msg(msg.OPROC1, 'constructing from file %s', varargin{1});
+            obj = fromFile(obj, args{1});
+            
+          elseif isa(args{1}, 'ao')
+            %%%%%%%%%%   a1 = ao(ao)   %%%%%%%%%%
+            utils.helper.msg(msg.PROC1, 'copying %s', args{1}.name);
+            obj = copy(args{1},1);
+            for kk = 1:numel(args{1})
+              obj(kk).addHistory(ao.getInfo('ao', 'None'), [], [], obj(kk).hist);
+            end
+            
+          elseif isstruct(args{1})
+            %%%%%%%%%%   a1 = ao(struct)   %%%%%%%%%%
+            utils.helper.msg(msg.PROC1, 'constructing from struct');
+            obj = fromStruct(obj, varargin{1});
+            
+          elseif isnumeric(args{1})
+            %%%%%%%%%%   a1 = ao(constant)   %%%%%%%%%%
+            %%%%%%%%%%   a1 = ao([1 2; 3 4])   %%%%%%%%%%
+            
+            utils.helper.msg(msg.PROC3, 'constructing from values');
+            obj = fromVals(obj, plist('VALS', args{1}), callerIsMethod);
+            
+          elseif isa(args{1}, 'pzmodel')
+            %%%%%%%%% ao(pzmodel)   %%%%%%%%%%%%
+            obj = obj.fromPzmodel(plist('pzmodel', args{1}));
+            
+            
+          elseif isa(args{1}, 'plist')
+            %%%%%%%%%%   a1 = ao(plist-object)   %%%%%%%%%%
+            utils.helper.msg(msg.PROC1, 'constructing from plist');
+            pl         = args{1};
+            
+            if pl.isparam('filename')
+              
+              %-----------------------------------------------------
+              %--- Construct from file
+              %-----------------------------------------------------
+              utils.helper.msg(msg.PROC2, 'constructing from file %s', pl.find('filename'));
+              obj = fromFile(obj, args{1});
+              
+            elseif pl.isparam('built-in')
+              
+              %--- Construct from model
+              utils.helper.msg(msg.PROC2, 'constructing from built-in model');
+              obj = obj.fromModel(pl);
+              
+            elseif pl.isparam('fcn')
+              
+              %-----------------------------------------------------
+              %--- Construct from function
+              %-----------------------------------------------------
+              utils.helper.msg(msg.PROC2, 'constructing from function %s', pl.find('fcn'));
+              obj = fromFcn(obj, pl);
+              
+            elseif pl.isparam('vals')
+              
+              %-----------------------------------------------------
+              %--- Construct from Values
+              %-----------------------------------------------------
+              utils.helper.msg(msg.PROC2, 'constructing from values');
+              obj = obj.fromVals(pl, callerIsMethod);
+              
+            elseif pl.isparam('xvals') || pl.isparam('yvals')
+              
+              %-----------------------------------------------------
+              %--- Construct from X and Y Values
+              %-----------------------------------------------------
+              utils.helper.msg(msg.PROC2, 'constructing from X and Y values');
+              obj = fromXYVals(obj, pl, callerIsMethod);
+              
+            elseif pl.isparam('tsfcn')
+              
+              %-----------------------------------------------------
+              %--- Construct from Time-series function
+              %-----------------------------------------------------
+              utils.helper.msg(msg.PROC2, 'constructing from fcn(t) %s', pl.find('tsfcn'));
+              obj = fromTSfcn(obj, pl);
+              
+            elseif pl.isparam('xyfcn')
+              
+              %-----------------------------------------------------
+              %--- Construct from XY function
+              %-----------------------------------------------------
+              utils.helper.msg(msg.PROC2, 'constructing from fcn(x) %s', pl.find('xyfcn'));
+              obj = obj.fromXYFcn(pl);
+              
+            elseif pl.isparam('fsfcn')
+              
+              %-----------------------------------------------------
+              %--- Construct from frequency-series function
+              %-----------------------------------------------------
+              utils.helper.msg(msg.PROC2, 'constructing from fcn(f) %s', pl.find('fsfcn'));
+              obj = obj.fromFSfcn(pl);
+              
+            elseif pl.isparam('win')
+              
+              %-----------------------------------------------------
+              %--- Construct from Window
+              %-----------------------------------------------------
+              utils.helper.msg(msg.PROC2, 'constructing from window %s', char(pl.find('win')));
+              obj = obj.fromSpecWin(pl);
+              
+            elseif pl.isparam('waveform')
+              
+              %-----------------------------------------------------
+              %--- Construct from Waveform
+              %-----------------------------------------------------
+              utils.helper.msg(msg.PROC2, 'constructing from waveform %s', pl.find('waveform'));
+              obj = fromWaveform(obj, pl, callerIsMethod);
+              
+            elseif pl.isparam('hostname') || pl.isparam('conn')
+              
+              %-----------------------------------------------------
+              %--- Construct from repository
+              %-----------------------------------------------------
+              utils.helper.msg(msg.PROC2, 'constructing from repository %s', pl.find('hostname'));
+              obj = obj.fromRepository(pl);
+              
+            elseif pl.isparam('polyval')
+              
+              %-----------------------------------------------------
+              %--- Construct from polynomial
+              %-----------------------------------------------------
+              utils.helper.msg(msg.PROC2, 'constructing from polynomial ');
+              obj = obj.fromPolyval(pl);
+              
+            elseif pl.isparam('plist')
+              
+              %-----------------------------------------------------
+              %--- Construct from plist
+              %-----------------------------------------------------
+              obj = ao(pl.find('plist'));
+              
+            elseif pl.isparam('pzmodel')
+              
+              %-----------------------------------------------------
+              %--- Construct from pzmodel
+              %-----------------------------------------------------
+              utils.helper.msg(msg.PROC2, 'constructing from pzmodel %s', char(pl.find('pzmodel')));
+              obj = obj.fromPzmodel(pl);
+              
+            elseif pl.isparam('model')
+              
+              %-----------------------------------------------------
+              %--- Construct from smodel
+              %-----------------------------------------------------
+              utils.helper.msg(msg.PROC2, 'constructing from symbolic model %s', char(pl.find('smodel')));
+              obj = obj.fromSModel(pl, callerIsMethod);
+              
+            elseif pl.isparam('Pest')
+              
+              %-----------------------------------------------------
+              %--- Construct from pest
+              %-----------------------------------------------------
+              utils.helper.msg(msg.PROC2, 'constructing from pest object %s', char(pl.find('pest')));
+              obj = obj.fromPest(pl);
+                            
+              
+            elseif pl.isparam('parameter')
+              
+              utils.helper.msg(msg.PROC2, 'constructing from parameter');
+              obj = obj.fromParameter(pl);
+              
+            else
+              % build a no-data ao from the plist and default values
+              ii = ao.getInfo('ao', 'Default');
+              pl = applyDefaults(ii.plists, pl);
+              obj.setObjectProperties(pl);
+              obj.addHistory(ao.getInfo('ao', 'None'), pl, [], []);
+            end
+            
+          elseif isa(args{1}, 'specwin')
+            %%%%%%%%%%   a1 = ao(specwin)   %%%%%%%%%%
+            utils.helper.msg(msg.PROC1, 'constructing from spectral window %s', char(args{1}));
+            obj = obj.fromSpecWin(plist('win', args{1}));
+            
+          elseif isa(args{1}, 'smodel')
+            %%%%%%%%%%   a1 = ao(smodel)   %%%%%%%%%%
+            utils.helper.msg(msg.PROC1, 'constructing from smodel %s', char(args{1}));
+            obj = obj.fromSModel(plist('model', args{1}), callerIsMethod);
+            
+          elseif isa(args{1}, 'pest')
+            %%%%%%%%%%   a1 = ao(pest)   %%%%%%%%%%
+            utils.helper.msg(msg.PROC1, 'constructing from pest %s', char(args{1}));
+            obj = obj.fromPest(plist('pest', args{1}));
+            
+          elseif isa(args{1}, 'ltpda_data')
+            %%%%%%%%%%   a1 = ao(ltpda_data-object)   %%%%%%%%%%
+            %%%%%%%%%%   a1 = ao(cdata)               %%%%%%%%%%
+            %%%%%%%%%%   a1 = ao(fsdata)              %%%%%%%%%%
+            %%%%%%%%%%   a1 = ao(tsdata)              %%%%%%%%%%
+            %%%%%%%%%%   a1 = ao(xydata)              %%%%%%%%%%
+            %%%%%%%%%%   a1 = ao(xyzdata)             %%%%%%%%%%
+            utils.helper.msg(msg.PROC1, 'constructing from data object %s', class(args{1}));
+            obj             = ao;
+            obj.data        = args{1};
+            obj.addHistory(ao.getInfo('ao', 'None'), [], [], []);
+            
+          elseif islogical(args{1})
+            %%%%%%%%%%% a1 = ao(true)    %%%%%%%%%%%%%
+            utils.helper.msg(msg.PROC3, 'constructing from logical');
+            obj = fromVals(obj, plist('VALS', args{1}), callerIsMethod);
+            
+          else
+            error('### Unknown single input constructor');
+          end
+          
+        case 2
+          %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+          %%%%%%%%%%%%%%%%%%%%%%%%%%%   two inputs   %%%%%%%%%%%%%%%%%%%%%%%%%%
+          %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+          
+          if isa(varargin{1}, 'database') || isa(varargin{1}, 'mpipeline.repository.RepositoryConnection')
+            %%%%%%%%%%   ao(database-object, [IDs])   %%%%%%%%%%
+            utils.helper.msg(msg.PROC1, 'constructing from database object');
+            pl = plist('conn', varargin{1}, 'id', varargin{2});
+            obj = obj.fromRepository(pl);
+            
+          elseif isnumeric(args{1}) && isnumeric(args{2}) && numel(args{1}) == numel(args{2})
+            %%%%%%%%%%   ao(x-vector, y-vector)   %%%%%%%%%%
+            utils.helper.msg(msg.PROC1, 'constructing from X and Y values');
+            obj = obj.fromXYVals(plist('XVALS', args{1}, 'YVALS', args{2}), callerIsMethod);
+            
+          elseif isnumeric(args{1}) && isnumeric(args{2}) && numel(args{2}) == 1
+            %%%%%%%%%%   ao(y-vector, fs)   %%%%%%%%%%
+            utils.helper.msg(msg.PROC1, 'constructing from Y values and fs');
+            obj = obj.fromXYVals(plist('YVALS', args{1}, 'fs', args{2}, 'xunits', 's'), callerIsMethod);
+            
+          elseif isa(args{1}, 'pzmodel') && isa(args{2}, 'plist')
+            %%%%%%%%%%  f = ao(pzmodel-object, plist-object)   %%%%%%%%%%
+            utils.helper.msg(msg.OPROC1, 'constructing from pzmodel %s', args{1}.name);
+            obj = obj.fromPzmodel(combine(plist('pzmodel', args{1}), args{2}));
+          elseif isnumeric(args{1}) && isa(args{2}, 'plist')
+            %%%%%%%%%%   ao(<double>, pl)   %%%%%%%%%%
+            utils.helper.msg(msg.PROC1, 'constructing from constant values and plist');
+            obj = obj.fromVals(combine(plist('VALS', args{1}), args{2}), callerIsMethod);
+            
+          elseif ischar(args{1}) && isa(args{2}, 'plist')
+            %%%%%%%%%%%   ao('foo.txt', pl)   %%%%%%%%%%
+            utils.helper.msg(msg.PROC1, 'constructing from filename and plist');
+            pl = combine(plist('filename', args{1}), args{2});
+            obj = obj.fromFile(pl);
+            
+          elseif isa(args{1}, 'ao') && isa(args{2}, 'ao')
+            %%%%%%%%%%%   ao(ao-object, ao-object)   %%%%%%%%%%
+            % Do we have a list of AOs as input
+            obj = ao([args{1}, args{2}]);
+            
+            %           elseif isa(args{1}, 'ao') && isa(args{2}, 'plist') && isempty(args{2}.params)
+            %             % pass to copy constructor
+            %             a = ao(args{1});
+            %
+            
+          elseif isa(args{1}, 'ao') && isa(args{2}, 'plist') && isempty(varargin{2}.params)
+            %%%%%%%%%%  f = ao(ao-object, <empty plist>) %%%%%%%%%%
+            obj = ao(varargin{1});
+            
+          elseif isa(args{1}, 'org.apache.xerces.dom.DeferredElementImpl') && ...
+              isa(args{2}, 'history')
+            %%%%%%%%%%   obj = ao(DOM node, history-objects)   %%%%%%%%%%
+            obj = fromDom(obj, args{1}, args{2});
+            
+          elseif isa(args{1}, 'ltpda_uoh') && isa(args{2}, 'plist')
+            %%%%%%%%%%%   ao(<ltpda_uoh>-object, plist-object)   %%%%%%%%%%
+            % always recreate from plist
+            
+            % If we are trying to load from file, and the file exists, do
+            % that. Otherwise, copy the input object.
+            if args{2}.isparam('filename')
+              if exist(fullfile('.', find(args{2}, 'filename')), 'file')==2
+                obj = ao(args{2});
+              else
+                obj = ao(args{1});
+              end
+            else
+              obj = ao(args{2});
+            end
+          else
+            error('### Unknown constructor with two inputs');
+          end
+          
+        case 3
+          %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+          %%%%%%%%%%%%%%%%%%%%%%%%%%   three inputs   %%%%%%%%%%%%%%%%%%%%%%%%%
+          %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+          
+          if  isnumeric(args{1}) && isnumeric(args{2}) && isnumeric(args{3}) && ...
+              numel(args{1}) == numel(args{2}) && numel(args{3}) == 1
+            %%%%%%%%%%   ao(x-vector, y-vector, fs)   %%%%%%%%%%
+            
+            utils.helper.msg(msg.PROC1, 'constructing from X and Y values and frequency.');
+            obj = obj.fromXYVals(plist('XVALS', args{1}, 'YVALS', args{2}, 'FS', args{3}), callerIsMethod);
+            
+          elseif isnumeric(args{1}) && isnumeric(args{2}) && isa(args{3}, 'plist')
+            %%%%%%%%%%   ao(x-vector, y-vector, plist)   %%%%%%%%%%
+            
+            utils.helper.msg(msg.PROC1, 'constructing from X and Y values and frequencies.');
+            pl = combine(plist('XVALS', args{1}, 'YVALS', args{2}), args{3});
+            obj = obj.fromXYVals(pl, callerIsMethod);
+            
+          elseif isa(args{1}, 'pzmodel') && isnumeric(args{2}) && isnumeric(args{3})
+            %%%%%%%%%%   ao(pzmodel, nsecs, fs)   %%%%%%%%%%
+            
+            utils.helper.msg(msg.PROC2, 'constructing from pzmodel %s', char(args{1}));
+            pl = plist('pzmodel', args{1}, 'Nsecs', args{2}, 'fs', args{3});
+            obj = obj.fromPzmodel(pl);
+            
+          else
+            
+            [aoi, invars, rest] = utils.helper.collect_objects(args, 'ao');
+            
+            %%% Do we have a list of AOs as input
+            if ~isempty(aoi) && isempty(rest)
+              obj = ao(aoi);
+            else
+              error('### Unknown constructor with three inputs');
+            end
+          end
+          
+        otherwise
+          %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+          %%%%%%%%%%%%%%%%%%%%%%%%%%   other inputs   %%%%%%%%%%%%%%%%%%%%%%%%%
+          %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+          
+          [aoi, invars, rest] = utils.helper.collect_objects(args, 'ao');
+          
+          %%% Do we have a list of AOs as input
+          if ~isempty(aoi) && isempty(rest)
+            obj = ao(aoi);
+          else
+            error('### Unknown number of arguments.');
+          end
+      end
+      
+    end % End constructor
+  end % End public methods
+  
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %                            Methods (static)                               %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  methods (Static = true)
+    
+    function n = randn(varargin)
+      % RANDN convenient constructor of an AO containing random numbers.
+      %
+      % CALL:
+      %        n = ao.randn(nsamples)  % cdata AO
+      %        n = ao.randn(nsecs, fs) % tsdata AO
+      %
+      switch nargin
+        case 1
+          % cdata(nsamples)
+          n = ao(plist('vals', randn(varargin{1},1)));
+        case 2
+          n = ao(plist('tsfcn', 'randn(size(t))', 'fs', varargin{2}, 'nsecs', varargin{1}));
+        otherwise
+          error('Unknown input arguments');
+      end
+      
+      
+    end
+    
+    function n = sinewave(varargin)
+      % SINEWAVE convenient constructor of an AO containing a sine wave.
+      %
+      % CALL:
+      %        n = ao.sinewave(nsecs, fs, f0, phi)  % tsdata AO
+      %
+      switch nargin
+        case 4
+          n = ao(plist('waveform', 'sine wave', ...
+            'f', varargin{3}, 'phi', varargin{4}, ...
+            'fs', varargin{2}, 'nsecs', varargin{1}));
+        otherwise
+          error('Unknown input arguments');
+      end
+    end
+    
+    
+    function mdls = getBuiltInModels(varargin)
+      mdls = ltpda_uo.getBuiltInModels('ao');
+    end
+    
+    function out = SETS()
+      out = [SETS@ltpda_uoh,                ...
+        {'From MAT Data File'},             ...
+        {'From ASCII File'},                ...
+        {'From Complex ASCII File'},        ...
+        {'From Function'},                  ...
+        {'From Values'},                    ...
+        {'From XY Values'},                 ...
+        {'From Time-series Function'},      ...
+        {'From XY Function'},               ...
+        {'From Frequency-series Function'}, ...
+        {'From Window'},                    ...
+        {'From Waveform'},                  ...
+        {'From Polynomial'},                ...
+        {'From Pzmodel'},                   ...
+        {'From Smodel'},                    ...
+        {'From Pest'},                       ...
+        {'From Parameter'}                  ...
+        ];
+      %         {'From CSD'},                       ...
+    end
+    
+    function out = VEROUT()
+      out = '$Id: ao.m,v 1.361 2011/08/22 05:23:45 hewitson Exp $';
+    end
+    
+    function ii = getInfo(varargin)
+      ii = utils.helper.generic_getInfo(varargin{:}, 'ao');
+    end
+    
+    % Return the plist for a particular parameter set
+    function plout = getDefaultPlist(set)
+      persistent pl;
+      persistent lastset;
+      if exist('pl', 'var')==0 || isempty(pl) || ~strcmp(lastset, set)
+        pl = ao.buildplist(set);
+        lastset = set;
+      end
+      plout = pl;
+    end
+    
+    function out = buildplist(set)
+      
+      if ~utils.helper.ismember(lower(ao.SETS), lower(set))
+        error('### Unknown set [%s]', set);
+      end
+      
+      out = plist();
+      out = ao.addGlobalKeys(out);
+      out = buildplist@ltpda_uoh(out, set);
+      
+      % Otherwise we try to find a set for this constructor
+      switch lower(set)
+        case 'from mat data file'
+          % filename
+          p = param({'filename','MAT data filename.'}, paramValue.EMPTY_STRING);
+          out.append(p);
+          
+          % filepath
+          p = param({'filepath','Path to the data file in case the filename is a relative path.'}, paramValue.EMPTY_STRING);
+          out.append(p);
+          
+          % type
+          p = param({'type','Choose the data type.'},  paramValue.DATA_TYPES);
+          out.append(p);
+          
+          % columns
+          p = param({'columns', ['Specify column pairs for the <tt>x-y</tt> variables, e.g. [1 2 1 4].<br>',...
+            'Each column pair creates an analysis object.<br>',...
+            'If the value ''fs'' is set then each column represents only the <tt>y</tt>-axes.<br>']}, ...
+            {1, {[]}, paramValue.OPTIONAL});
+          out.append(p);
+          
+          % Xunits
+          p = param({'xunits','Unit on X axis.'},  paramValue.STRING_VALUE('s'));
+          out.append(p);
+          
+          % Yunits
+          p = param({'yunits','Unit on Y axis.'}, paramValue.STRING_VALUE(''));
+          out.append(p);
+          
+          % Fs
+          p = param({'fs','If this value is set, the x-axes is computed from the fs value.'},  paramValue.EMPTY_DOUBLE);
+          out.append(p);
+          
+        case 'from ascii file'
+          
+          % filename
+          p = param({'filename','ASCII filename.'}, paramValue.EMPTY_STRING);
+          out.append(p);
+          
+          % filepath
+          p = param({'filepath','Path to the data file in case the filename is a relative path.'}, paramValue.EMPTY_STRING);
+          out.append(p);
+          
+          % type
+          p = param({'type','Choose the data type.'},  paramValue.DATA_TYPES);
+          out.append(p);
+          
+          % columns
+          p = param({'columns', ['Specify column pairs for the <tt>x-y</tt> variables, e.g. [1 2 1 4].<br>',...
+            'Each column pair creates an analysis object.<br>',...
+            'If the value ''fs'' is set then each column represents only the <tt>y</tt>-axes.<br>']}, ...
+            {1, {[]}, paramValue.OPTIONAL});
+          out.append(p);
+          
+          % Xunits
+          p = param({'xunits','Unit on X axis.'},  paramValue.STRING_VALUE(''));
+          out.append(p);
+          
+          % Yunits
+          p = param({'yunits','Unit on Y axis.'}, paramValue.STRING_VALUE(''));
+          out.append(p);
+          
+          % Comment char
+          p = param({'comment_char','The comment character in the file.'}, paramValue.EMPTY_STRING);
+          out.append(p);
+          
+          % Maximum number of lines
+          p = param({'maxlines', 'Maximum number of lines which should be read.'}, paramValue.EMPTY_DOUBLE);
+          out.append(p);
+          
+          % Fs
+          p = param({'fs','If this value is set, the x-axes is computed from the fs value.'},  paramValue.EMPTY_DOUBLE);
+          out.append(p);
+          
+          % Robust
+          p = param({'Robust',['Set this to ''yes'' to use (slow) robust data reading.<br>',...
+            'Useful for complicated file formats.']},   paramValue.YES_NO);
+          p.val.setValIndex(2);
+          out.append(p);
+          
+          % Delimiter
+          p = param({'Delimiter', 'Field delimiter character(s).'},   paramValue.STRING_VALUE(''));
+          out.append(p);
+          
+          % T0
+          p = param({'T0', ['The UTC time of the first sample.<br>' ...
+            'For data types other than tsdata, this is ignored.']}, {1, {'1970-01-01 00:00:00.000'}, paramValue.OPTIONAL});
+          out.append(p);
+          
+          
+          
+          %------------------------------------------
+          %--- Read from complex ASCII file
+          %------------------------------------------
+        case 'from complex ascii file'
+          
+          % Filename
+          p = param({'filename','ASCII filename.'},  paramValue.EMPTY_STRING);
+          out.append(p);
+          
+          % filepath
+          p = param({'filepath','Path to the data file in case the filename is a relative path.'}, paramValue.EMPTY_STRING);
+          out.append(p);
+          
+          % Complex type
+          p = param({'complex_type','String defining the format of the complex data.'}, ...
+            {1, {'real/imag', 'abs/deg', 'dB/deg', 'abs/rad', 'dB/rad'}, paramValue.SINGLE});
+          out.append(p);
+          
+          % Type
+          p = param({'type','String defining the data type'},  paramValue.DATA_TYPES);
+          p.val.setValIndex(2);
+          out.append(p);
+          
+          % columns
+          p = param({'columns',['Colums to consider inside the file. <br>',...
+            'It must be 3 or a multiple: the first column defines the x-axis and the next <br>',...
+            'two columns the complex y-axis. If a multiple of 3 columns are specified, <br>',...
+            'the constructor will output multiple aos. (e.g. [1 2 3])']}, ...
+            {1, {[1 2 3]}, paramValue.OPTIONAL});
+          out.append(p);
+          
+          % Xunits
+          p = param({'xunits','Unit on X axis.'},  paramValue.STRING_VALUE('Hz'));
+          out.append(p);
+          
+          % Yunits
+          p = param({'yunits','Unit on Y axis.'}, paramValue.STRING_VALUE(''));
+          out.append(p);
+          
+          % Comment char
+          p = param({'comment_char','The comment character in the file.'}, paramValue.EMPTY_STRING);
+          out.append(p);
+          
+          % T0
+          p = param({'T0', ['The UTC time of the first sample.<br>' ...
+            'For data types other than tsdata, this is ignored.']}, {1, {'1970-01-01 00:00:00.000'}, paramValue.OPTIONAL});
+          out.append(p);
+          
+          %------------------------------------------
+          %--- Create from a function description
+          %------------------------------------------
+        case 'from function'
+          
+          % Fcn
+          p = param({'fcn','Any valid MATLAB function. [e.g. ''randn(100,1)'']'}, paramValue.EMPTY_STRING);
+          out.append(p);
+          
+          % Yunits
+          p = param({'yunits','Unit on Y axis.'},  paramValue.STRING_VALUE(''));
+          out.append(p);
+          
+          % RAND_STREAM
+          p = param({'RAND_STREAM', 'Set the random stream for noise generation. This should be a structure with the fields of the properties for the class RandStream (help RandStream).'}, paramValue.EMPTY_DOUBLE);
+          out.append(p);
+          
+          %------------------------------------------
+          %--- Create from a set of values
+          %------------------------------------------
+        case 'from values'
+          
+          % Vals
+          p = param({'vals','A set of values.'}, paramValue.EMPTY_DOUBLE);
+          out.append(p);
+          
+          % N
+          p = param({'N','Repeat ''N'' times.'},   {1, {1}, paramValue.OPTIONAL});
+          out.append(p);
+          
+          % Yunits
+          p = param({'yunits','Unit on Y axis'}, paramValue.STRING_VALUE(''));
+          out.append(p);
+          
+          %------------------------------------------
+          %--- Create from a set of values
+          %------------------------------------------
+        case 'from xy values'
+          
+          % Type
+          p = param({'type','The data type.'}, {1, {'', 'tsdata', 'fsdata', 'xydata', 'cdata'}, paramValue.SINGLE});
+          out.append(p);
+          
+          % Fs
+          p = param({'fs',['Frequency: if this is set, xvals (if passed) will be ignored and the <br>',...
+            'resulting tsdata will contain an X vector sampled according to fs. <br>', ...
+            'For data types other than tsdata, this is ignored.']}, paramValue.EMPTY_DOUBLE);
+          out.append(p);
+          
+          % T0
+          p = param({'T0', ['The UTC time of the first sample.<br>' ...
+            'For data types other than tsdata, this is ignored.']}, {1, {'1970-01-01 00:00:00.000'}, paramValue.OPTIONAL});
+          out.append(p);
+
+          % toffset
+          p = param({'toffset', ['The offset between the first x sample and t0.<br>' ...
+            'For data types other than tsdata, this is ignored.']}, paramValue.DOUBLE_VALUE(0));
+          out.append(p);
+          
+          % Xvals
+          p = param({'xvals','A set of x values.'}, paramValue.EMPTY_DOUBLE);
+          out.append(p);
+          
+          % Yvals
+          p = param({'yvals','A set of y values.'}, paramValue.EMPTY_DOUBLE);
+          out.append(p);
+          
+          % Xunits
+          p = param({'xunits','Unit on X axis.'},  paramValue.STRING_VALUE(''));
+          out.append(p);
+          
+          % Yunits
+          p = param({'yunits','Unit on Y axis'}, paramValue.STRING_VALUE(''));
+          out.append(p);
+          
+          %------------------------------------------
+          %--- Create from a XY function
+          %------------------------------------------
+        case 'from xy function'
+          
+          % XY fcn
+          p = param({'xyfcn','Specify a function of x. (e.g. x.^2)'},  {1, {'x'}, paramValue.OPTIONAL});
+          out.append(p);
+          
+          % X
+          p = param({'X','The x values.'}, paramValue.EMPTY_DOUBLE);
+          out.append(p);
+          
+          % Xunits
+          p = param({'xunits','Unit on X axis.'},  paramValue.STRING_VALUE(''));
+          out.append(p);
+          
+          % Yunits
+          p = param({'yunits','Unit on Y axis.'},  paramValue.STRING_VALUE(''));
+          out.append(p);
+          
+          % RAND_STREAM
+          p = param({'RAND_STREAM', 'Set the random stream for noise generation. This should be a structure with the fields of the properties for the class RandStream (help RandStream).'}, paramValue.EMPTY_DOUBLE);
+          out.append(p);
+          
+          %------------------------------------------
+          %--- Create from a time-series function
+          %------------------------------------------
+        case 'from time-series function'
+          
+          % TS fcn
+          p = param({'tsfcn','A function of time.'},   {1, {'t'}, paramValue.OPTIONAL});
+          out.append(p);
+          
+          % Fs, Nsecs, Xunits
+          out.append(plist.TSDATA_PLIST);
+          
+          % Yunits
+          p = param({'yunits','Unit on Y axis.'},  paramValue.STRING_VALUE(''));
+          out.append(p);
+          
+          % RAND_STREAM
+          p = param({'RAND_STREAM', 'Set the random stream for noise generation. This should be a structure with the fields of the properties for the class RandStream (help RandStream).'}, paramValue.EMPTY_DOUBLE);
+          out.append(p);
+          
+          %------------------------------------------
+          %--- Create from frequency-series function
+          %------------------------------------------
+        case 'from frequency-series function'
+          
+          % FS fcn
+          p = param({'fsfcn','A function of frequency.'}, {1, {'f'}, paramValue.OPTIONAL});
+          out.append(p);
+          
+          % F1
+          p = param({'f1','The initial frequency.'},  {1, {1e-9}, paramValue.OPTIONAL});
+          out.append(p);
+          
+          % F2
+          p = param({'f2','The final frequency.'},  {1, {10000}, paramValue.OPTIONAL});
+          out.append(p);
+          
+          % Nf
+          p = param({'nf','The number of frequency samples.'}, {1, {1000}, paramValue.OPTIONAL});
+          out.append(p);
+          
+          % Scale
+          p = param({'scale','Choose the frequency spacing.'}, {2, {'lin', 'log'}, paramValue.SINGLE});
+          out.append(p);
+          
+          % F
+          p = param({'f','a vector of frequencies on which to evaluate the function.'}, paramValue.EMPTY_DOUBLE);
+          out.append(p);
+          
+          % Xunits
+          p = param({'xunits','Unit on X axis.'},  paramValue.STRING_VALUE('Hz'));
+          out.append(p);
+          
+          % Yunits
+          p = param({'yunits','Unit on Y axis.'},  paramValue.STRING_VALUE(''));
+          out.append(p);
+          
+          % RAND_STREAM
+          p = param({'RAND_STREAM', 'Set the random stream for noise generation. This should be a structure with the fields of the properties for the class RandStream (help RandStream).'}, paramValue.EMPTY_DOUBLE);
+          out.append(p);
+          
+          %------------------------------------------
+          %--- Create from a window function
+          %------------------------------------------
+        case 'from window'
+          % Win
+          p = param({'win','A Spectral window name.'},  paramValue.WINDOW);
+          out.append(p);
+          
+          % length
+          p = param({'length','The length of the window (number of samples).'},  paramValue.DOUBLE_VALUE(100));
+          out.append(p);
+          
+          % psll
+          p = param({'psll','If you choose a ''kaiser'' window, you can also specify the peak-sidelobe-level.'},  paramValue.DOUBLE_VALUE(150));
+          out.append(p);
+          
+          % level order
+          p = param({'levelOrder','If you choose a ''levelledHanning'' window, you can also specify the order of the contraction.'},  paramValue.DOUBLE_VALUE(2));
+          out.append(p);
+          
+          % Yunits
+          p = param({'yunits','Unit on Y axis.'},  paramValue.STRING_VALUE(''));
+          out.append(p);
+          
+          %------------------------------------------
+          %--- Create from a set of polynomial coefficients
+          %------------------------------------------
+        case 'from polynomial'
+          
+          % Polyval
+          p = param({'polyval',['A set of polynomial coefficients. This can also be an AO, <br>',...
+            'in which case the Y values from the AO are used.']}, paramValue.EMPTY_DOUBLE);
+          out.append(p);
+          
+          % Fs
+          p = param({'fs', 'The sampling frequency of the signal. [for all]'}, paramValue.EMPTY_DOUBLE);
+          out.append(p);
+          
+          % Nsecs
+          p = param({'nsecs', 'The number of seconds of data. [for all]'}, paramValue.EMPTY_DOUBLE);
+          out.append(p);
+          
+          % T0
+          p = param({'T0', 'The UTC time of the first sample. [for all]'}, {1, {'1970-01-01 00:00:00.000'}, paramValue.OPTIONAL});
+          out.append(p);
+          
+          % toffset
+          p = param({'toffset', 'The offset between the first x sample and t0.'}, paramValue.DOUBLE_VALUE(0));
+          out.append(p);
+          
+          % T
+          p = param({'t',['Vector of time vertices for tsdata type. <br>',...
+            'The value can also be an AO, in which case the X vector is used.']}, paramValue.EMPTY_DOUBLE);
+          out.append(p);
+          
+          % X
+          p = param({'x', 'Vector of X values for xydata type. <br>',...
+            'The value can also be an AO, in which case the X vector is used.'}, paramValue.EMPTY_DOUBLE);
+          out.append(p);
+          
+          % F
+          p = param({'f', 'Vector of frequency values for fsdata type. <br>',...
+            'The value can also be an AO, in which case the X vector is used.'}, paramValue.EMPTY_DOUBLE);
+          out.append(p);
+          
+          % Type
+          p = param({'type','The data type. If this is empty, the constructor will attempt to determine the type from the other parameters.'}, {1,{'', 'tsdata', 'fsdata', 'xydata', 'cdata'}, paramValue.SINGLE});
+          p.setDefaultIndex(1); % Set the default to 'tsdata'
+          out.append(p);
+          
+          % Xunits
+          p = param({'xunits','Unit on X axis.'},  paramValue.EMPTY_STRING);
+          out.append(p);
+          
+          % Yunits
+          p = param({'yunits','Unit on Y axis.'},  paramValue.STRING_VALUE(''));
+          out.append(p);
+          
+          %------------------------------------------
+          %--- Create from a waveform description
+          %------------------------------------------
+        case 'from waveform'
+          % Waveform
+          p = param({'waveform', 'A waveform description.<br>A special case is the ''<b>sine wave</b>'' because you can create more sinewaves which are summed. For this case you can add several values for ''A'', ''f'', ''phi'', ''nsecs'' and/or ''Toff'''}, ...
+            {1, {'sine wave', 'noise', 'chirp', 'gaussian pulse', 'square wave', 'sawtooth'}, paramValue.OPTIONAL});
+          out.append(p);
+          
+          % A
+          p = param({'A','Amplitude of the signal. [for ''sine wave''].'}, {1, {1}, paramValue.OPTIONAL});
+          out.append(p);
+          
+          % F
+          p = param({'f', 'Frequency of the signal. [for ''sine wave'', ''square wave'', ''sawtooth''].'}, ...
+            {1, {1}, paramValue.OPTIONAL});
+          out.append(p);
+          
+          % Phi
+          p = param({'phi','Phase of the signal. [for ''sine wave'']'}, {1, {0}, paramValue.OPTIONAL});
+          out.append(p);
+          
+          % Toff
+          p = param({'Toff', ['Offset of the different sine waves, as [for ''sine wave'']<ul>', ...
+            '<li>a vector of seconds</li>', ...
+            '<li>a cell array with the offsets as a string</li>', ...
+            '<li>a vector time objects</li>', ...
+            '</ul>Remark: If t0 is not specified then it will be set to the first value of Toff.<br><br>Offset of the signal, in seconds.  [for all other]']}, {1, {0}, paramValue.OPTIONAL});
+          out.append(p);
+          
+          % gaps
+          p = param({'gaps', 'Instead of defining an offset it is possible to define a gap before the sine wave. [for ''sine wave'']<br/>'}, paramValue.EMPTY_DOUBLE);
+          out.append(p);
+          
+          % Type
+          p = param({'Type', 'Noise type. [for ''noise'']'}, {1, {'Normal', 'Uniform'}, paramValue.SINGLE});
+          out.append(p);
+          
+          % Sigma
+          p = param({'Sigma', 'The standard deviation of the noise. [for ''noise'']'}, {1, {1}, paramValue.OPTIONAL});
+          out.append(p);
+          
+          % F0
+          p = param({'F0', 'A fundamental/start frequency of the signal. [for ''chirp'', ''gaussian pulse'']'}, ...
+            {1, {1}, paramValue.OPTIONAL});
+          out.append(p);
+          
+          % F1
+          p = param({'F1', 'The end frequency of the signal. [for ''chirp'']'}, paramValue.EMPTY_DOUBLE);
+          out.append(p);
+          
+          % T1
+          p = param({'T1', 'The end time of the signal. [for ''chirp'']'}, paramValue.EMPTY_DOUBLE);
+          out.append(p);
+          
+          % BW
+          p = param({'BW', 'The bandwidth of the signal. [for ''gaussian pulse'']'}, paramValue.EMPTY_DOUBLE);
+          out.append(p);
+          
+          % Duty
+          p = param({'Duty', 'The duty-cycle of the signal (in %). [for ''square wave'']'}, {1, {50}, paramValue.OPTIONAL});
+          out.append(p);
+          
+          % Width
+          p = param({'Width', 'The width of the signal. [0-1] [for ''sawtooth'']'}, {1, {0.5}, paramValue.OPTIONAL});
+          out.append(p);
+          
+          % Fs, Nsecs, Xunits
+          out.append(plist.TSDATA_PLIST);
+          out.remove('toffset');
+          
+          % Yunits
+          p = param({'yunits','Unit on Y axis. [for all]'},  paramValue.STRING_VALUE(''));
+          out.append(p);
+          
+          % RAND_STREAM
+          p = param({'RAND_STREAM', 'Set the random stream for noise generation. This should be a structure with the fields of the properties for the class RandStream (help RandStream).'}, paramValue.EMPTY_DOUBLE);
+          out.append(p);
+          
+          %------------------------------------------
+          %--- Create from a set of pzm coefficients
+          %------------------------------------------
+        case 'from pzmodel'
+          
+          % PZModel
+          p = param({'pzmodel','A pole/zero model which builds the time-series AO.'}, {1, {pzmodel}, paramValue.OPTIONAL});
+          out.append(p);
+          
+          % Fs, Nsecs, Xunits
+          out.append(plist.TSDATA_PLIST);
+          
+          % Yunits
+          p = param({'yunits','Unit on Y axis.'},  paramValue.STRING_VALUE(''));
+          out.append(p);
+          
+          % RAND_STREAM
+          p = param({'RAND_STREAM', 'Set the random stream for noise generation. This should be a structure with the fields of the properties for the class RandStream (help RandStream).'}, paramValue.EMPTY_DOUBLE);
+          out.append(p);
+          
+          %------------------------------------------
+          %--- Create from a smodel
+          %------------------------------------------
+        case 'from smodel'
+          
+          % Model
+          p = param({'model', 'The smodel to evaluate and convert to an AO. '}, {1, {smodel()}, paramValue.OPTIONAL});
+          out.append(p);
+          
+          % X
+          p = param({'x','Values for X axis.'},  paramValue.EMPTY_DOUBLE);
+          out.append(p);
+          
+          % Xunits
+          p = param({'xunits','Unit on X axis.'},  paramValue.STRING_VALUE('s'));
+          out.append(p);
+          
+          % Type
+          p = param({'type','Choose the data type.'},  paramValue.DATA_TYPES);
+          p.val.setValIndex(1);
+          out.append(p);
+          
+          %------------------------------------------
+          %--- Create from a pest
+          %------------------------------------------
+        case 'from pest'
+          
+          % Model
+          p = param({'pest', 'The pest object to extract the AO from. '}, paramValue.EMPTY_DOUBLE);
+          out.append(p);
+          
+          % Parameter
+          p = param({'parameter',['Name of the parameter(s) to be extracted.<br>' ...
+            'If empty, all parameters will be extracted into a vector ao AOs.']},  paramValue.STRING_VALUE(''));
+          out.append(p);
+          
+        case 'from parameter'
+          
+          % parameter
+          p = param({'parameter', ['The parameter or plist to make an AO from. <br>' ...
+            'If the plist is a built-in one, it is also possible just to input its name.']}, paramValue.EMPTY_STRING);
+          out.append(p);
+          
+          % key
+          p = param({'key', 'The parameter name to extract from the plist. '}, paramValue.EMPTY_STRING);
+          out.append(p);
+          
+      end
+    end % End getDefaultPlist
+    
+    function obj = initObjectWithSize(n,m)
+      if numel(n) > 1
+        obj = ao.newarray([n(1) n(2)]);
+      else
+        obj = ao.newarray([n m]);
+      end
+    end
+    
+  end
+  
+  
+  methods (Hidden = true)
+    varargout = setData(varargin)
+    varargout = attachToDom(varargin)
+    varargout = welch(varargin)
+    varargout = ifft_core(varargin)
+    varargout = fft_core(varargin)
+    varargout = fftfilt_core(varargin)
+    varargout = xspec(varargin)
+  end
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %                         Methods (static, private)                         %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  methods (Static = true, Access = private)
+    % constructor functions
+    % Spectral estimate function
+    [yy, dyy, info] = welchscale(xx, dxx, win, fs, norm, inunits)
+    [x,M,isreal_x,y,Ly,win,winName,winParam,noverlap,k,L,options] = welchparse(x,esttype,varargin)
+    [P,f] = computeperiodogram(x,win,nfft,esttype,varargin)
+    [Xx,f] = computeDFT(xin,nfft,varargin)
+    
+    % Noise generator functions
+    varargout = ngconv(varargin)
+    varargout = ngsetup(varargin)
+    varargout = ngsetup_vpa(varargin)
+    varargout = nginit(varargin)
+    varargout = ngprop(varargin)
+    varargout = fq2fac(varargin)
+    varargout = conv_noisegen(varargin)
+    varargout = mchol(varargin)
+    
+    % LPSD-type methods
+    varargout = ltf_plan(varargin)
+    varargout = mlpsd_mex(varargin)
+    varargout = mlpsd_m(varargin)
+    varargout = mltfe(varargin)
+    varargout = findFsMax(varargin)
+    varargout = findFsMin(varargin)
+    varargout = findShortestVector(varargin)
+    varargout = lxspec(varargin)
+    
+    varargout = ltpda_fitChiSquare(varargin)
+    
+    varargout = elementOp(varargin)
+    varargout = melementOp(varargin)
+    
+    varargout = applymethod(varargin)
+    
+  end
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %                         Methods (static, protected)                          %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  
+  methods (Static = true, Access = protected)
+    function pl = addGlobalKeys(pl)
+      
+      % Call super-class
+      addGlobalKeys@ltpda_uoh(pl);
+      
+    end
+    
+    function pl = removeGlobalKeys(pl)
+      
+      % Call super-class
+      removeGlobalKeys@ltpda_uoh(pl);
+      
+      % Remove 'plotinfo'
+      pl.remove('plotinfo');
+    end
+  end
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %                         Methods (static, hidden)                          %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  
+  methods (Static = true, Hidden = true)
+    varargout = loadobj(varargin)
+    varargout = update_struct(varargin)
+  end
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %                              Methods (public)                             %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  methods
+    
+    % Setters
+    varargout = setXunits(varargin)
+    varargout = setYunits(varargin)
+    varargout = setT0(varargin)
+    varargout = setFs(varargin)
+    varargout = setXY(varargin)
+    varargout = setY(varargin)
+    varargout = setX(varargin)
+    varargout = setZ(varargin)
+    varargout = setDy(varargin)
+    varargout = setDx(varargin)
+    
+    % Other methods
+    varargout = copy(varargin)
+    h = md5(varargin)
+    val = fromProcinfo(varargin)
+    
+  end % End public methods
+  
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %                             Methods (protected)                           %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  methods (Access = protected)
+    obj = fromDataInMAT(obj, data, filename)
+    obj = fromDatafile(obj, pli)
+    obj = fromComplexDatafile(obj, pli)
+    obj = fromStruct(obj, a_struct)
+    varargout = fromDom(varargin)
+    varargout = csvGenerateData(varargin)
+    varargout = checkDataType(varargin)
+  end
+  
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %                           Methods (private)                               %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  methods (Access = private)
+    % Constructors
+    varargout = fromParameter(varargin)
+    varargout = fromVals(varargin)
+    varargout = fromXYVals(varargin)
+    varargout = fromTSfcn(varargin)
+    varargout = fromWaveform(varargin)
+    varargout = fromFcn(varargin)
+    varargout = fromFSfcn(varargin)
+    varargout = fromSpecWin(varargin)
+    varargout = fromPolyval(varargin)
+    varargout = fromSModel(varargin)
+    varargout = fromPzmodel(varargin)
+    varargout = fromXYFcn(varargin)
+    varargout = fromCSD(varargin)
+    varargout = fromPest(varargin)
+    
+    varargout = fixAxisData(varargin)
+    varargout = smallvec_coef(in,pl)
+    
+    varargout = setUnitsForAxis(varargin)
+    varargout = clearErrors(varargin)
+    
+    % Others
+    varargout = applyoperator(varargin)
+  end
+  
+end