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

Import.
author Daniele Nicolodi <nicolodi@science.unitn.it>
date Wed, 23 Nov 2011 19:22:13 +0100
parents
children 947e2ff4b1b9
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/m-toolbox/classes/@plist/plist.m	Wed Nov 23 19:22:13 2011 +0100
@@ -0,0 +1,858 @@
+% PLIST Plist class object constructor.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% DESCRIPTION: PLIST Parameter-List Object class object constructor.
+%              Create a plist object.
+%
+% SUPER CLASSES: ltpda_uo < ltpda_obj
+%
+% CONSTRUCTORS:
+%
+%       pl = plist()                     - create an empty plist object.
+%       pl = plist(p)                    - create a plist with elements p
+%                                          where p is an array of param objects.
+%       pl = plist('key', val)           - create a plist with the key/value
+%                                          pair
+%       pl = plsit({'key', 'desc'}, val) - create a plist with the key/value
+%                                          pair and a description for the 'key'
+%       pl = plist('key1', val1, ...     - create a plist with more key/value
+%                  'key2', val2, ...       pairs
+%                  {'key3', 'desc'}, 'val3)
+%       pl = plist({'a', 1, 'b', 2})     - create a plist from a cell
+%       pl = plist('file.xml')           - load a plist-object from xml-file
+%       pl = plist('file.mat')           - load a plist-object from mat-file
+%       pl = plist(pl)                   - copies the input plist.
+%
+% PARAMETERS:
+%
+%  If no recognised parameters are found in the input plist, the input
+%  plist is simply returned. This is the copy constructor.
+%
+% <a href="matlab:utils.helper.displayMethodInfo('plist', 'plist')">Parameters Description</a>
+%
+% VERSION:      $Id: plist.m,v 1.146 2011/08/15 05:58:04 hewitson Exp $
+%
+% SEE ALSO:     ltpda_obj, ltpda_uo, ltpda_uoh, param
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+classdef plist < ltpda_uo
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %                            Property definition                            %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  
+  %---------- Public (read/write) Properties  ----------
+  properties
+  end
+  
+  %---------- Protected read-only Properties ----------
+  properties (SetAccess = protected)
+    params  = []; % list of param-objects
+  end
+  
+  %---------- Removed properties ----------
+  % We have to define the removed properties as hidden constants.
+  % In case of backwards compatibility it is necessary to keep them because
+  % MATLAB will read older MAT-files as structures which we have to convert
+  % into an object if we make major change to a class.
+  % For MATLAB is a major change if we remove a proeprty.
+  properties (Constant = true, Hidden = true)
+    creator = [];
+    created = [];
+  end
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %                          Check property setting                           %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %                                Constructor                                %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  
+  methods
+    function pl = plist(varargin)
+      
+      import utils.const.*
+      
+      %%%%%%%%%%   Set dafault values   %%%%%%%%%%
+      
+      %%%%%%%%%%   Overwrite dafault name   %%%%%%%%%%
+      pl.name = '';
+      
+      %%%%%%%%%%   Copy constructor   %%%%%%%%%%
+      % Collect all plist objects
+      [pls, invars, rest] = utils.helper.collect_objects(varargin(:), 'plist');
+      
+      if isempty(rest) && ~isempty(pls) && numel(pls) ~=1
+        % Do copy constructor and return
+        utils.helper.msg(msg.OPROC1, 'copy constructor');
+        pl = copy(pls, 1);
+        return
+      end
+      
+      if nargin == 0
+        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%   no input   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+        %%%%%%%%%%   pl = plist()   %%%%%%%%%%
+        
+      elseif nargin == 1
+        
+        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%   one input   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+        
+        if isa(varargin{1}, 'plist') && numel(varargin{1}) == 1
+          %%%%%%%%%%  p = param(plist)   %%%%%%%%%%
+          
+          pli = varargin{1};
+          
+          if isempty(varargin{1}.params)
+            %%% If the plist is empty then return an empty plist object
+            
+          else
+            %%% Retrieve from repository?
+            if pli.isparam('hostname') || pli.isparam('conn')
+              utils.helper.msg(msg.OPROC1, 'retrieving from repository %s', pli.find('hostname'));
+              pl = pl.fromRepository(pli);
+            elseif pli.isparam('filename')
+              utils.helper.msg(msg.OPROC1, 'constructing from filename');
+              pl = pl.fromFile(pli);
+            elseif pli.isparam('built-in')
+              utils.helper.msg(msg.OPROC1, 'constructing from model');
+              pl = pl.fromModel(pli);
+            else
+              utils.helper.msg(msg.OPROC1, 'copying from %s', varargin{1}.name);
+              pl = copy(varargin{1}, 1);
+            end
+          end
+          
+        elseif ischar(varargin{1})
+          %%%%%%%%%%% From file %%%%%%%%%%%%%%%%%%%%%%%%
+          
+          filename = varargin{1};
+          utils.helper.msg(msg.OPROC1, 'constructing from file %s', filename);
+          pl = fromFile(pl, filename);
+          
+        elseif isstruct(varargin{1})
+          %%%%%%%%%%   pl = plist(struct)   %%%%%%%%%%
+          
+          utils.helper.msg(msg.OPROC1, 'constructing from struct');
+          pl = fromStruct(pl, varargin{1});
+          
+        elseif isa(varargin{1}, 'param')
+          %%%%%%%%%%   pl = plist(param)   %%%%%%%%%%
+          
+          utils.helper.msg(msg.OPROC1, 'constructing from param');
+          pl.params = varargin{1};
+          
+        elseif iscell(varargin{1})
+          %%%%%%%%%%   pl = plist({'a', 1, 'b', 2})   %%%%%%%%%%
+          c = varargin{1};
+          pl = plist(c{:});
+          
+        else
+          error ('### unknown arguments to construct a parameter list')
+        end
+        
+      elseif nargin == 2
+        
+        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%   two inputs   %%%%%%%%%%%%%%%%%%%%%%%%%%%%
+        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+        
+        if (isa(varargin{1}, 'database') || isa(varargin{1}, 'mpipeline.repository.RepositoryConnection'))
+          %%%%%%%%%%%   From DATABASE   %%%%%%%%%%%
+          utils.helper.msg(msg.OPROC1, 'constructing from database object');
+          pl = pl.fromRepository(plist('conn', varargin{1}, 'id', varargin{2}));
+          
+        elseif ischar(varargin{1})
+          %%%%%%%%%%   pl = plist('key1', val1)   %%%%%%%%%%
+          utils.helper.msg(msg.OPROC1, 'constructing from key/value pair');
+          pl.params = param(varargin{1}, varargin{2});
+          
+        elseif iscell(varargin{1}) && numel(varargin{1}) == 2 && ~iscell(varargin{2})
+          %%%%%%%%%%   pl = plist({'key', 'desc'}, val1)   %%%%%%%%%%
+          utils.helper.msg(msg.OPROC1, 'constructing from [key,desc]/value pair');
+          pl.params = param(varargin{1}{1}, varargin{2}, varargin{1}{2});
+          
+        elseif iscell(varargin{1}) && iscell(varargin{2})
+          %%%%%%%%%%   pl = plist({'key', 'desc'}, {value, {options}, selection})   %%%%%%%%%%
+          pl.params = param(varargin{1}, varargin{2});
+          
+        elseif isa(varargin{1}, 'org.apache.xerces.dom.DeferredElementImpl') && ...
+            isa(varargin{2}, 'history')
+          %%%%%%%%%%   obj = plist(DOM node, history-objects)   %%%%%%%%%%
+          pl = fromDom(pl, varargin{1}, varargin{2});
+          
+        else
+          error('### Unknown constructor method for two inputs.');
+        end
+        
+      elseif nargin > 2
+        
+        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%   more inputs   %%%%%%%%%%%%%%%%%%%%%%%%%%%
+        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+        
+        utils.helper.msg(msg.OPROC1, 'constructing from key/value pairs');
+        
+        %%%%%%%%%%   pl = plist('key1', val1,           'key2', val2 , ...) %%%%%%%%%%
+        %%%%%%%%%%   pl = plist({'key1', 'desc'}, val1, 'key2', val2 , ...) %%%%%%%%%%
+        param_list = [];
+        argin  = varargin;
+        while length(argin) >= 2
+          key  = argin{1};
+          val  = argin{2};
+          desc = '';
+          argin = argin(3:end);
+          
+          % It might be that the key is specified with a description
+          if iscell(key) && numel(key) == 2
+            desc = key{2};
+            key  = key{1};
+          end
+          
+          if ~isempty(param_list)
+            found = any(strcmpi(key, {param_list(:).key}));
+            if found
+              error('### Do not use the same key [%s] twice.\n### REMARK: The key is not case sensitive.', key);
+            end
+          end
+          % add to list
+          if isempty(desc)
+            param_list = [param_list param(key, val)];
+          else
+            param_list = [param_list param(key, val, desc)];
+          end
+        end
+        pl.params  = param_list;
+      else
+        error('### Unknown number of constructor arguments.');
+      end
+      
+    end % End constructor
+  end
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %                          Methods (Static, Public)                         %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  
+  methods (Static = true)
+    
+    function out = VEROUT()
+      out = '$Id: plist.m,v 1.146 2011/08/15 05:58:04 hewitson Exp $';
+    end
+    
+    function ii = getInfo(varargin)
+      ii = utils.helper.generic_getInfo(varargin{:}, 'plist');
+    end
+    
+    function mdls = getBuiltInModels(varargin)
+      mdls = ltpda_uo.getBuiltInModels('plist');
+    end
+    
+    function out = SETS()
+      out = SETS@ltpda_uo;
+    end
+    
+    function plout = getDefaultPlist(set)
+      persistent pl;
+      persistent lastset;
+      if exist('pl', 'var')==0 || isempty(pl) || ~strcmp(lastset, set)
+        pl = plist.buildplist(set);
+        lastset = set;
+      end
+      plout = pl;
+    end
+    
+    varargout = getDefaultAxisPlist(varargin);
+    
+    function out = buildplist(set)
+      
+      if ~utils.helper.ismember(lower(plist.SETS), lower(set))
+        error('### Unknown set [%s]', set);
+      end
+      
+      out = plist();
+      out = buildplist@ltpda_uo(out, set);
+      
+      switch lower(set)
+        % No special sets are dfined.
+      end
+    end
+    
+    %---------- static factory plists
+    
+    % Plist to construct objects from a plist
+    function pl = FROM_PLIST
+      pl = plist();
+      p = param({'Plist','A plist'}, plist);
+      pl.append(p);
+    end
+    
+    % Plist to construct an object from a built-in model
+    function pl = FROM_BUILT_IN
+      pl = plist();
+      p = param({'built-in', 'Choose one of the built-in models. (use <i>class</i>.getBuiltInModels to get a list for a particular user class)'}, paramValue.EMPTY_STRING);
+      pl.append(p);
+    end
+    
+    % Plist to read from an XML file.
+    function pl = FROM_XML_FILE
+      pl = plist();
+      p = param({'filename','XML filename.'},  paramValue.EMPTY_STRING);
+      pl.append(p);
+    end
+    
+    % Plist to read from an XML file.
+    function pl = FROM_MAT_FILE
+      pl = plist();
+      p = param({'filename','MAT filename.'},  paramValue.EMPTY_STRING);
+      pl.append(p);
+    end
+    
+    % Plist for retrieving objects from a repository. This is used in all
+    % user-object constructor default plists for the 'From Repository' set.
+    function pl = FROM_REPOSITORY_PLIST
+      pl = plist();
+      
+      % get repository list
+      prefs = getappdata(0, 'LTPDApreferences');
+      hostNames = prefs.getRepoPrefs.getHostnames;
+      repos = {};
+      for ii=0:hostNames.size()-1
+        repos = [repos {hostNames.get(ii)}];
+      end
+      
+      % Hostname
+      if isempty(repos)
+        repos = {'localhost'};
+      end
+      p = param({'hostname','The repository hostname'}, {1, repos, paramValue.SINGLE});
+      pl.append(p);
+      
+      % ID
+      p = param({'ID','A vector of object IDs.'}, paramValue.EMPTY_DOUBLE);
+      pl.append(p);
+      
+      % CID
+      p = param({'CID','A vector of collection IDs.'}, paramValue.EMPTY_DOUBLE);
+      pl.append(p);
+      
+      % Database
+      p = param({'database','The database name.'}, paramValue.EMPTY_STRING);
+      pl.append(p);
+      
+      % Binary
+      p = param({'Binary','<html>Set to ''yes'' to retrieve from<br>stored binary representation (not always available).</html>'},...
+        paramValue.YES_NO);
+      pl.append(p);
+      
+      % Username
+      p = param({'Username', 'Specify a username to connect with. Leave blank to be prompted.'}, paramValue.EMPTY_STRING);
+      pl.append(p);
+      
+      % Password
+      p = param({'Password', 'Specify a password to connect with. Leave blank to be prompted.'}, paramValue.EMPTY_STRING);
+      pl.append(p);
+    end
+    
+    % Plist for submitting/updating objects from a repository. This is used
+    % in ltpda_uo/ -submit, -bsubmit and -update.
+    function pl = TO_REPOSITORY_PLIST
+      pl = plist();
+      
+      % get repository list
+      prefs = getappdata(0, 'LTPDApreferences');
+      hostNames = prefs.getRepoPrefs.getHostnames;
+      repos = {};
+      for ii=0:hostNames.size()-1
+        repos = [repos {hostNames.get(ii)}];
+      end
+      
+      % Hostname
+      if isempty(repos)
+        repos = {'localhost'};
+      end
+      p = param({'hostname', 'Repository server hostname'}, {1, repos, paramValue.SINGLE});
+      pl.append(p);
+      
+      % Database
+      p = param({'database', 'Database name'}, paramValue.EMPTY_STRING);
+      pl.append(p);
+      
+      % Username
+      p = param({'username', 'User name to access the repository'}, paramValue.EMPTY_STRING);
+      pl.append(p);
+      
+      % Password
+      p = param({'password', 'Password'}, paramValue.EMPTY_STRING);
+      pl.append(p);
+      
+      % experiment title
+      p = param({'experiment title', 'Title for the submission'}, paramValue.EMPTY_STRING);
+      pl.append(p);
+      
+      % experiment description
+      p = param({'experiment description', 'Description of this submission'}, paramValue.EMPTY_STRING);
+      pl.append(p);
+      
+      % analysis description
+      p = param({'analysis description', 'Description of the analysis performed'}, paramValue.EMPTY_STRING);
+      pl.append(p);
+      
+      % quantity
+      p = param({'quantity', 'Physical quantity represented by the data'}, paramValue.EMPTY_STRING);
+      pl.append(p);
+      
+      % keywords
+      p = param({'keywords', 'Comma-delimited list of keywords'}, paramValue.EMPTY_STRING);
+      pl.append(p);
+      
+      % reference ids
+      p = param({'reference ids', 'Comma-delimited list of object IDs'}, paramValue.EMPTY_STRING);
+      pl.append(p);
+      
+      % additional comments
+      p = param({'additional comments', 'Additional comments'}, paramValue.EMPTY_STRING);
+      pl.append(p);
+      
+      % additional authors
+      p = param({'additional authors', 'Additional author names'}, paramValue.EMPTY_STRING);
+      pl.append(p);
+      
+      p = param({'no dialog', 'Do not use of the submission form. Mandatory fields must be supplied in the plist.'}, paramValue.FALSE_TRUE);
+      pl.append(p);
+      
+      p = param({'use selector', 'Allow to select to which database to connect'}, paramValue.TRUE_FALSE);
+      pl.append(p);
+      
+    end
+    
+    % Plist for Welch-based, linearly spaced spectral estimators.
+    % This is used in psd, cpsd, cohere, tfe
+    function pl = WELCH_PLIST
+      pl = plist();
+      
+      % Nfft
+      p = param({'Nfft',['The number of samples in each fft [default: length of input data]. <br>', ...
+        'A string value containing the variable ''fs'' can also be used, e.g., <br> ', ...
+        '<tt>plist(''Nfft'', ''2*fs'')</tt>']}, paramValue.DOUBLE_VALUE(-1));
+      pl.append(p);
+      
+      % Win
+      p = param({'Win',['The window to be applied to the data to remove the ', ...
+        'discontinuities at edges of segments. [default: taken from user prefs] <br>', ...
+        'Only the design parameters of the window object are used. Enter ', ...
+        'a string value containing the window name e.g.<br>', ...
+        '<tt>plist(''Win'', ''Kaiser'', ''psll'', 200)</tt><br>', ...
+        '<tt>plist(''Win'', ''BH92'')</tt>']}, paramValue.WINDOW);
+      pl.append(p);
+      
+      % Psll
+      p = param({'Psll',['The peak sidelobe level for Kaiser windows.<br>', ...
+        'Note: it is ignored for all other windows']}, paramValue.DOUBLE_VALUE(200));
+      pl.append(p);
+      
+      % Olap
+      p = param({'Olap','The segment percent overlap [-1 == take from window function]'}, {1, {-1}, paramValue.OPTIONAL});
+      pl.append(p);
+      
+      % Order
+      p = param({'Order',['The order of segment detrending:<ul>', ...
+        '<li>-1 - no detrending</li>', ...
+        '<li>0 - subtract mean</li>', ...
+        '<li>1 - subtract linear fit</li>', ...
+        '<li>N - subtract fit of polynomial, order N</li></ul>']}, paramValue.DETREND_ORDER);
+      p.val.setValIndex(2);
+      pl.append(p);
+      
+      % Navs
+      p = param({'Navs',['Force number of averages. If set, and if Nfft was set to 0 or -1,<br>', ...
+        'the number of points for each window will be calculated to match the request.']}, paramValue.DOUBLE_VALUE(-1));
+      pl.append(p);
+      
+      % Times
+      p = param({'Times',['The time range to analyze. If not empty, sets the time interval to operate on.<br>', ...
+        'As in ao/split, the interval can be specified by:<ul>' ...
+        '<li>a vector of doubles</li>' ...
+        '<li>a timespan object</li>' ...
+        '<li>a cell array of time strings</li>' ...
+        '<li>a vector of time objects</li></ul>' ...
+        ]}, paramValue.DOUBLE_VALUE([]));
+      pl.append(p);
+      
+      % Split: the same as 'times'
+      p = p.copy(true);
+      pl.append(p.setKey('Split'));
+      
+    end
+    
+    % Plist for Welch-based, log-scale spaced spectral estimators.
+    % This is used in lpsd, lcpsd, lcohere, ltfe
+    function pl = LPSD_PLIST
+      pl = plist();
+      
+      % Kdes
+      p = param({'Kdes', 'The desired number of averages.'}, {1, {100}, paramValue.OPTIONAL});
+      pl.append(p);
+      
+      % Jdes
+      p = param({'Jdes', 'The desired number of spectral frequencies to compute.'}, {1, {1000}, paramValue.OPTIONAL});
+      pl.append(p);
+      
+      % Lmin
+      p = param({'Lmin', 'The minimum segment length.'}, {1, {0}, paramValue.OPTIONAL});
+      pl.append(p);
+      
+      % Win
+      p = param({'Win',['The window to be applied to the data to remove the ', ...
+        'discontinuities at edges of segments. [default: taken from user prefs] <br>', ...
+        'Only the design parameters of the window object are used. Enter ', ...
+        'a string value containing the window name e.g.<br>', ...
+        '<tt>plist(''Win'', ''Kaiser'', ''psll'', 200)</tt><br>', ...
+        '<tt>plist(''Win'', ''BH92'')</tt>']}, paramValue.WINDOW);
+      pl.append(p);
+      
+      % Psll
+      p = param({'Psll',['The peak sidelobe level for Kaiser windows.<br>', ...
+        'Note: it is ignored for all other windows']}, paramValue.DOUBLE_VALUE(200));
+      pl.append(p);
+      
+      % Olap
+      p = param({'Olap','The segment percent overlap [-1 == take from window function]'}, {1, {-1}, paramValue.OPTIONAL});
+      pl.append(p);
+      
+      % Order
+      p = param({'Order',['The order of segment detrending:<ul>', ...
+        '<li>-1 - no detrending</li>', ...
+        '<li>0 - subtract mean</li>', ...
+        '<li>1 - subtract linear fit</li>', ...
+        '<li>N - subtract fit of polynomial, order N</li></ul>']}, paramValue.DETREND_ORDER);
+      p.val.setValIndex(2);
+      pl.append(p);
+      
+      % Times
+      p = param({'Times',['The time range to analyze. If not empty, sets the time interval to operate on.<br>', ...
+        'As in ao/split, the interval can be specified by:<ul>' ...
+        '<li>a vector of doubles</li>' ...
+        '<li>a timespan object</li>' ...
+        '<li>a vector of time objects</li></ul>' ...
+        ]}, paramValue.DOUBLE_VALUE([]));
+      pl.append(p);
+      
+      % Split: the same as 'times'
+      p = p.copy(true);
+      pl.append(p.setKey('Split'));
+
+    end
+    
+    % Plist for linear fitting methods
+    % This is used in linfit, polynomfit
+    
+    function pl = LINEAR_FIT_PLIST
+      pl = plist();
+      
+      % dy
+      p = param({'dy', ['Uncertainty on Y. Can be expressed as<ul>' ...
+        '<li>an AO with single value or</li>' ...
+        '<li>an AO with a vector of the right lenght or</li>' ...
+        '<li>a double or</li>' ...
+        '<li>an array of double of the right lenght</li></ul>' ]}, ...
+        paramValue.EMPTY_DOUBLE);
+      pl.append(p);
+      
+      % dx
+      p = param({'dx', ['Uncertainty on X(1..N). Can be expressed as<ul>' ...
+        '<li>an AO with single value or</li>' ...
+        '<li>an AO with a vector of the right lenght or</li>' ...
+        '<li>a double or</li>' ...
+        '<li>an array of double of the right lenght</li></ul>' ]}, ...
+        paramValue.EMPTY_DOUBLE);
+      pl.append(p);
+      
+      % p0
+      p = param({'p0', ['Initial guess of the fit parameters. Can be expressed as:<ul>' ...
+        '<li>an AOs with a vector</li>' ...
+        '<li>an array of scalars or</li>' ...
+        '<li>a pest object</li></ul>']}, ...
+        paramValue.EMPTY_DOUBLE);
+      pl.append(p);
+      
+    end
+    
+    % Plist for multilinear fitting methods
+    % This is used in bilinfit
+    
+    function pl = MULTILINEAR_FIT_PLIST
+      pl = plist();
+      
+      % dy
+      p = param({'dy', ['Uncertainty on Y. Can be expressed as<ul>' ...
+        '<li>an AO with single value or</li>' ...
+        '<li>an AO with a vector of the right lenght or</li>' ...
+        '<li>a double or</li>' ...
+        '<li>an array of double of the right lenght</li></ul>' ]}, ...
+        paramValue.EMPTY_DOUBLE);
+      pl.append(p);
+      
+      % dx
+      p = param({'dx', ['Uncertainty on X1 ... XN. Can be expressed as<ul>' ...
+        '<li>an array of N AOs with single value or</li>' ...
+        '<li>an array of N AOs with data vectors of the right lenght or</li>' ...
+        '<li>an array of N double</li></ul>' ]}, ...
+        paramValue.EMPTY_DOUBLE);
+      pl.append(p);
+      
+      % p0
+      p = param({'p0', ['Initial guess of the fit parameters. Can be expressed as:<ul>' ...
+        '<li>an AOs with a vector</li>' ...
+        '<li>an array of scalars or</li>' ...
+        '<li>a pest object</li></ul>']}, ...
+        paramValue.EMPTY_DOUBLE);
+      pl.append(p);
+      
+    end
+    
+    % Plist for multichannel fitting methods
+    % This is used in linfitsvd, mcmc, and tdfit
+    
+    function pl = MCH_FIT_PLIST
+      pl = plist();
+      
+      % Model
+      p = param({'Model','System model. It have to be parametric. A matrix of smodel objects or a ssm object'}, paramValue.EMPTY_DOUBLE);
+      pl.append(p);
+      
+      % Input Names
+      p = param({'InNames','A cell array containing cell arrays of the input ports names for each experiment. Used only with ssm models.'}, {});
+      pl.append(p);
+
+      % Output Names
+      p = param({'OutNames','A cell array containing cell arrays of the output ports names for each experiment. Used only with ssm models.'}, {});
+      pl.append(p);
+      
+      % Fit Params
+      p = param({'FitParams','A cell array with the names of the fit parameters'}, {});
+      pl.append(p);
+      
+      % Injected Signals
+      p = param({'Input','Collection of input signals'},paramValue.EMPTY_DOUBLE);
+      pl.append(p);
+      
+    end
+    
+    % Plist for time series
+    % This is used in ao constructor
+    function pl = TSDATA_PLIST
+      pl = plist();
+      % Fs
+      p = param({'fs', 'The sampling frequency of the signal. [for all]'}, paramValue.EMPTY_DOUBLE);
+      pl.append(p);
+      
+      % Nsecs
+      p = param({'nsecs', 'The number of seconds of data. [for all]'}, paramValue.EMPTY_DOUBLE);
+      pl.append(p);
+      
+      % Xunits
+      p = param({'xunits','Unit on X axis.'},  paramValue.STRING_VALUE('s'));
+      pl.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});
+      pl.append(p);
+
+      % toffset
+      p = param({'toffset', 'The offset between the first x sample and t0.'}, paramValue.DOUBLE_VALUE(0));
+      pl.append(p);
+    end
+    
+    % Plist for dotview methods (ltpda_uoh, ssm)
+    function pl = DOTVIEW_PLIST
+      pl = plist();
+      
+      % Filename
+      p = param({'filename','the file name for the graphic file'}, paramValue.EMPTY_STRING);
+      pl.append(p);
+      
+      % View
+      p = param({'view','true or false to view or not'}, paramValue.TRUE_FALSE);
+      p.val.setValIndex(1);
+      pl.append(p);
+      
+    end
+    
+    % Plist for saving objects
+    function pl = SAVE_OBJ_PLIST
+      pl = plist();
+      
+      % Filename
+      p = param({'filename',['Name of the file to save in.<br>', ...
+        'The format is determined based on the file extension:<ul>', ...
+        '<li>.xml for XML format</li>', ...'
+        '<li>.mat for Matlab format</li></ul>']}, paramValue.EMPTY_STRING);
+      pl.append(p);
+      
+      % Filename prefix
+      p = param({'prefix', 'Filename prefix'}, paramValue.EMPTY_STRING);
+      pl.append(p);
+      
+      % Filename postfix
+      p = param({'postfix', 'Filename postfix'}, paramValue.EMPTY_STRING);
+      pl.append(p);
+      
+      % Individual Files
+      p = param({'individual files', 'Save the objects into Individual files'}, paramValue.FALSE_TRUE);
+      pl.append(p);
+      
+    end
+    
+    function pl = AXIS_3D_PLIST
+      pl = plist();
+      p = param({'axis', 'The axis on which to apply the method.'},  ...
+        {3, {'x', 'y', 'z', 'xyz'}, paramValue.SINGLE});
+      pl.append(p);
+      
+      p = param({'dim', ['The dimension of the chosen vector to apply the method '...
+        'to. This is necessary for functions like mean() when ' ...
+        'applied to matrices held in cdata objects. For tsdata, '...
+        'fsdata or xydata, this option has no effect.']}, paramValue.EMPTY_DOUBLE);
+      pl.append(p);
+      
+      p = param({'option', 'Any additional option to pass to the method.'}, paramValue.EMPTY_STRING);
+      pl.append(p);
+      
+    end
+    
+    function pl = AXIS_2D_PLIST
+      pl = plist();
+      p = param({'axis', 'The axis on which to apply the method.'},  ...
+        {2, {'x', 'y', 'xy'}, paramValue.SINGLE});
+      pl.append(p);
+      
+      p = param({'dim', ['The dimension of the chosen vector to apply the method '...
+        'to. This is necessary for functions like mean() when ' ...
+        'applied to matrices held in cdata objects. For tsdata, '...
+        'fsdata or xydata, this option has no effect.']}, paramValue.EMPTY_DOUBLE);
+      pl.append(p);
+      
+      p = param({'option', 'Any additional option to pass to the method.'}, paramValue.EMPTY_STRING);
+      pl.append(p);
+      
+    end
+    
+    function plout = EMPTY_PLIST
+      persistent pl;
+      if ~exist('pl', 'var') || isempty(pl) || pl.nparams>0
+        pl = plist();
+      end
+      plout = pl;
+    end
+    
+    function pl = AXIS_1D_PLIST
+      pl = plist();
+      p = param({'axis', 'The axis on which to apply the method.'},  ...
+        {1, {'y'}, paramValue.SINGLE});
+      pl.append(p);
+      
+      p = param({'dim', ['The dimension of the chosen vector to apply the method '...
+        'to. This is necessary for functions like mean() when ' ...
+        'applied to matrices held in cdata objects. For tsdata, '...
+        'fsdata or xydata, this option has no effect.']}, paramValue.EMPTY_DOUBLE);
+      pl.append(p);
+      
+      p = param({'option', 'Any additional option to pass to the method.'}, paramValue.EMPTY_STRING);
+      pl.append(p);
+      
+    end
+    
+    function obj = initObjectWithSize(n,m)
+      obj = plist.newarray([n m]);
+    end
+    
+    varargout = ltp_parameters(varargin)
+    
+  end
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %                         Methods (static, hidden)                          %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  
+  methods (Static = true, Hidden = true)
+    varargout = loadobj(varargin)
+    varargout = update_struct(varargin)
+  end
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %                          Methods (Private)                                %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  
+  methods (Access = private)
+  end
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %                          Methods (Hidden)                                 %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  methods (Hidden = true)
+    varargout = sort(varargin)
+    varargout = applyDefaults(varargin)
+  end
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %                              Methods (public)                             %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  
+  methods
+    %%% Define Abstract methods
+    varargout = char(varargin)
+    varargout = copy(varargin)
+    varargout = display(varargin)
+    varargout = string(varargin)
+    
+    %%% Define other methods
+    varargout = append(varargin)
+    varargout = combine(varargin)
+    varargout = find(varargin)
+    varargout = isparam(varargin)
+    varargout = nparams(varargin)
+    varargout = pset(varargin)
+    varargout = remove(varargin)
+    
+    
+    varargout = setDescriptionForParam(varargin)
+    varargout = setDefaultForParam(varargin)
+    varargout = setOptionsForParam(varargin)
+    varargout = setSelectionForParam(varargin)
+    
+    varargout = getOptionsForParam(varargin)
+    varargout = getSelectionForParam(varargin)
+    varargout = getDescriptionForParam(varargin)
+    varargout = getKeys(varargin)
+    
+    varargout = setPropertyForKey(varargin)
+    varargout = getPropertyForKey(varargin)
+    
+  end
+  
+  methods (Hidden = true)
+    varargout = attachToDom(varargin)
+  end
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %                              Methods (protected)                          %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  
+  methods (Access = protected)
+    varargout = fromRepository(varargin)
+    varargout = fromFile(varargin)
+    varargout = fromStruct(varargin)
+    varargout = fromDom(varargin)
+    varargout = processSetterValues(varargin)
+  end
+  
+end % Class
+
+