diff m-toolbox/test/aorepo_proto_test/repo_test_func.m @ 0:f0afece42f48

Import.
author Daniele Nicolodi <nicolodi@science.unitn.it>
date Wed, 23 Nov 2011 19:22:13 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/m-toolbox/test/aorepo_proto_test/repo_test_func.m	Wed Nov 23 19:22:13 2011 +0100
@@ -0,0 +1,1124 @@
+function varargout = repo_test_func(varargin)
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %
+  % DESCRIPTION: REPO_TEST_FUNC Tests the submit and retrieve of LTPDA objs in
+  % a LTPDA database, measuring the submit/retrieve time.
+  %
+  % CALL:        s =  repo_test_func(pl)
+  %
+  % INPUTS:      pl - parameter list(s)
+  %
+  % OUTPUTS:     s  - an array of plists containing the results of the test.
+  %                   If the submission/retrieve is not performed, most of
+  %                   the keys will be empty
+  %              In detail, each plist will contain:
+  %
+  % OUTPUT PARAMETER LIST:
+  % <key>             <description>
+  % ret_time_xml     - time for retrieval of data from xml (s)
+  % ret_time_bin     - time for retrieval of data from binary (s)
+  %	sub_time         - time for submission (s)
+  % t                - absolute time of test execution
+  % test_ID          - test identifier, also repeated in saved file
+  % status           - result of comparison between submitted and retrieved objs
+  % OBJids           - submitted objs IDs assigned by database
+  % cid              - submitted objs collection ID assigned by database
+  % start_time       - beginning time of test execution
+  % stop_time        - ending time of test execution
+  % obj_filesize     - size on disk of the xml and binary versions of every object
+  % sinfo            - a struct with infos about the connection
+  %
+  % INPUT PARAMETER LIST:
+  % <key>            <default value>             <description>
+  % 'RAND_N_OBJ'      false           produces a random number of objects
+  %                                   at a time
+  % 'N_OBJ'           1               produces N_OBJ objects at a time.
+  %                                   Inserting <= 0 will produce random
+  %                                   number of objects
+  % 'RAND_OBJ_TYPE'   false           produces a random object from ltpda_uo class
+  % 'OBJ_TYPE'        'ao'            defines the object(s) to produce
+  %                                   If empty or 'RAND', it will pick at random within
+  %                                   the ltpda_uo class
+  % 'RAND_AO'             true        Picks at random the parameters for
+  %                                   the AO(s) to produce and submit
+  % 'AO_PARAMS'           plist       plist to build the AO(s)
+  % 'RAND_PLIST'          true        Picks at random the parameters for
+  %                                   the plist(s) to produce and submit
+  % 'PLIST_PARAMS'         plist      plist to build the plist(s)
+  % 'RAND_MFIR'            true       Picks at random the parameters for
+  %                                   the mfir(s) to produce and submit
+  % 'MFIR_PARAMS'         plist       plist to build the mfir(s)
+  % 'RAND_MIIR'           true        Picks at random the parameters for
+  %                                   the miir(s) to produce and submit
+  % 'MIIR_PARAMS'         plist       plist to build the miir(s)
+  % 'RAND_PZMODEL' true               Picks at random the parameters for
+  %                                   the pzmodel(s) to produce and submit
+  % 'PZMODEL_PARAMS'      plist       plist to build the pzmodel(s)
+  % 'RAND_TIMESPAN'         true      Picks at random the parameters for
+  %                                   the timespan object(s)
+  % 'TIMESPAN_PARAMS'      plist      plist to build the timespan(s)
+  % 'RAND_SSM'              true      Picks at random the parameters for
+  %                                   the ssm(s)
+  % 'SSM_PARAMS'           plist      plist to build the ssm(s)
+  % 'RAND_PARFRAC'         true      Picks at random the parameters for
+  %                                   the parfrac object(s)
+  % 'PARFRAC_PARAMS'       plist      plist to build the parfrac(s)
+  % 'RAND_RATIONAL'        true      Picks at random the parameters for
+  %                                   the rational object(s)
+  % 'RATIONAL_PARAMS'      plist     plist to build the rational(s)
+  %
+  % 'HOSTNAME'        '130.75.117.67' the repository host IP (for individual tests)
+  % 'DBASE'           'ltpda_test'    the database name (for individual tests)
+  % 'COLL_RETRIEVE'   false           retrieves via the submitted collection ID
+  % 'SAVE_OBJS'       false           saves the produced objs
+  % 'OBJ_FILENAME'    'submit_trial_obj'  filename to save the produced
+  %                                   obj(s)
+  % 'OBJ_FILEFORMAT'  'xml'           format for the filename to save the produced
+  %                                   obj(s)
+  % 'DIR'             '/Users/MH/exper_data/test/obj_creation'
+  %                                   path to save the produced obj(s) into
+  % 'SUBMIT'          false           actually performs the submit/retrieve test
+  % 'CONN'            empty           a conn struct if the connection was
+  %                                   already open (for group tests)
+  % 'SAVE_RESULTS'    true            saves the individual test results
+  % 'RESULTS_FILENAME' 'repo_test'    filename to save results in
+  % 'OBJ_FILESIZE'    true            calculate sizes (in bytes) of all objects
+  %
+  % VERSION:     $Id: repo_test_func.m,v 1.6 2009/03/25 17:39:01 nicola Exp $
+  %
+  % HISTORY:     05-12-2008 M Hueller
+  %                 Creation
+  %
+  % M-FILE INFO: Get information about this methods by calling
+  %              >> ao.getInfo('repo_test_func')
+  %
+  %              Get information about a specified set-plist by calling:
+  %              >> ao.getInfo('repo_test_func', 'None')
+  %
+  % SEE ALSO: run_UTN_repo_test
+  %
+  % SEE: <a href="matlab: help ao/Contents;">HELP: All Analysis Object Functions:</a>
+  %      <a href="matlab: helpwin ao/Contents;">DOC: All Analysis Object Functions:</a>
+  %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%   global obj_size_xml obj_size_bin
+  
+  %% Check if this is a call for parameters
+  if utils.helper.isinfocall(varargin{:})
+    varargout{1} = getInfo(varargin{3});
+    return
+  end
+  
+  % Collect input variable names
+  in_names = cell(size(varargin));
+  for ii = 1:nargin
+    in_names{ii} = inputname(ii);
+  end
+  
+  % Collect all plists
+  pls = utils.helper.collect_objects(varargin(:), 'plist', in_names);
+  
+  %% ---------------- Produce one plist
+  if isa(pls, 'plist')
+    pls = combine(pls, getDefaultPlist());
+  else
+    pls = getDefaultPlist();
+  end
+  
+  import utils.const.*;
+  
+  %% ---------------- Initial settings
+  
+  % Checks if running on PC
+  if ispc
+    path_symbol = '\';
+  else
+    path_symbol = '/';
+  end
+  
+  % Verify if the user wants only to produce objects or also test repository
+  if find(pls, 'SUBMIT')
+    % Collects the conn struct.
+    conn = find(pls, 'CONN');
+    % If empty, goes ahead and looks for the repository IP and database, and
+    % opens the connection
+    if isempty(conn)
+      
+      % Get the hostname
+      hostname = find(pls, 'HOSTNAME');
+      
+      % Get the database name
+      database_name = find(pls, 'DBASE');
+      
+      % Opens the connection
+      conn = utils.mysql.connect(hostname, database_name);
+    end
+  else
+    utils.helper.msg(msg.MNAME, '%s\n%s', ...
+      '  ','Submission switched off, only producing the objects ');
+  end
+  
+  if ~find(pls, 'SAVE_OBJS')
+    utils.helper.msg(msg.MNAME, '%s\n%s', ...
+      '  ','Saving switched off, only displaying the objects ');
+  end
+    
+  %% Builds the trial objects
+  
+  % Limiting the number of objects in the case of random number to
+  % something reasonable
+  N_MAX_OBJS = 100;
+  
+  % Limiting the number of poles and zeros in the case of random extraction to
+  % something reasonable
+  N_MAX_POLES = 100;
+  N_MAX_ZEROS = 100;
+  
+  % Limitng the number of values for cdata and xydata to something
+  % reasonable
+  N_MAX_VALS = 1000;
+  
+  % Number of objects to be created
+  N_OBJ = find(pls, 'N_OBJ');
+  
+  if N_OBJ < 1 || find(pls, 'RAND_N_OBJ')
+    % Pick a random rumber between 1 and N_MAX_OBJS
+    N_OBJ = utils.math.randelement(N_MAX_OBJS, 1);
+  end
+  
+  % Finds the kind of objects requested by user
+  user_class_list = utils.helper.ltpda_userclasses;
+  
+  obj_type = find(pls, 'OBJ_TYPE');
+  rand_obj_type = true;
+  % Go for random value in the case of:
+  % invalid or empty class name, or explicitely asked random
+  if ~isempty(obj_type) && ~strcmpi(obj_type, 'RAND') && ~find(pls, 'RAND_OBJ_TYPE')
+     % Checks if user entered a user class name
+    for kk = 1:length(user_class_list)
+      if strcmpi(user_class_list{kk}, obj_type)
+        rand_obj_type = false;
+      end
+    end
+  end
+  
+  % Prepares the empty cell array for the object(s) and the plist(s)
+  objs = cell(N_OBJ, 1);
+  pl_objs = cell(N_OBJ, 1);
+  
+  % Main loop over the number of requested objects
+  for kk = 1:N_OBJ
+    if rand_obj_type
+      % Picks up at random one user class name
+      utils.helper.msg(msg.MNAME, '%s\n%s', ...
+        '  ',['User input class ' upper(obj_type) ' not used, go for random class']);
+      index = utils.math.randelement(length(user_class_list),1);
+      obj_type = user_class_list{index};
+    end
+    
+    % Test ID based on time elapsed since a reference time
+    ref_time = time('2008-01-01 00:00:00');
+    test_ID = floor(time - ref_time);
+    
+    % For the time being SSM are disabled:
+    if strcmp(obj_type,'ssm'), obj_type = 'ao'; end
+       
+       
+    switch obj_type
+      case 'ao'
+        ao_params = find(pls, 'AO_PARAMS');
+        if isempty(ao_params) || ~ao_params.nparams || find(pls, 'RAND_AO');
+          % The plist to build the object is built by picking at random from
+          % a "menu" list, based on
+          utils.helper.msg(msg.MNAME, '%s\n%s', ...
+            '  ',['Object from class ' upper(obj_type) ' built from random parameters']);
+          pl_obj = plist();
+          p_menu = provide_menu('ao');
+          
+          % Extract at random a type of data
+          dtype = lower(cell2mat(utils.math.randelement(find(p_menu, 'dtype'), 1)));
+          p_menu_sub = find(p_menu, dtype);
+          
+          switch lower(dtype)
+            case 'tsdata'
+              pl_obj = plist(...
+                'waveform', cell2mat(utils.math.randelement(find(p_menu_sub, 'waveform'), 1)), ...
+                'fs', utils.math.randelement(find(p_menu_sub,'fs'), 1), ...
+                'nsecs', utils.math.randelement(find(p_menu_sub,'nsecs'), 1), ...
+                'name', cell2mat(utils.math.randelement(find(p_menu_sub,'name'), 1)), ...
+                'yunits', unit(cell2mat(utils.math.randelement(find(p_menu_sub, 'yunits'), 1))) ...
+                );
+              switch find(pl_obj, 'waveform')
+                case 'sine wave'
+                  n_freqs = utils.math.randelement(3,1);
+                  pl_obj.combine(pl_obj, plist(...
+                    'A', utils.math.randelement(find(p_menu_sub,'A'), n_freqs), ...
+                    'f', utils.math.randelement(find(p_menu_sub,'f'), n_freqs), ...
+                    'phi', utils.math.randelement(find(p_menu_sub,'phi'), n_freqs), ...
+                    'toff', utils.math.randelement(find(p_menu_sub,'toff'), n_freqs) ...
+                    ));
+                case 'noise'
+                  pl_obj.combine(pl_obj, plist(...
+                    'type', cell2mat(utils.math.randelement(find(p_menu_sub, 'type'), 1)), ...
+                    'sigma', utils.math.randelement(find(p_menu_sub,'sigma'), 1) ...
+                    ));
+                case 'chirp'
+                  pl_obj.combine(pl_obj, plist(...
+                    'f0', utils.math.randelement(find(p_menu_sub,'f0'), 1), ...
+                    'f1', utils.math.randelement(find(p_menu_sub,'f1'), 1), ...
+                    't1', utils.math.randelement(find(p_menu_sub,'t1'), 1) ...
+                    ));
+                case 'gaussian pulse'
+                  pl_obj.combine(pl_obj, plist(...
+                    'f0', utils.math.randelement(find(p_menu_sub,'f0'), 1), ...
+                    'bw', utils.math.randelement(find(p_menu_sub,'bw'), 1) ...
+                    ));
+                case 'square wave'
+                  pl_obj.combine(pl_obj, plist(...
+                    'f', utils.math.randelement(find(p_menu_sub,'f'), 1), ...
+                    'duty', utils.math.randelement(find(p_menu_sub,'duty'), 1) ...
+                    ));
+                case 'sawtooth'
+                  pl_obj.combine(pl_obj, plist(...
+                    'f', utils.math.randelement(find(p_menu_sub,'f'), 1), ...
+                    'width', utils.math.randelement(find(p_menu_sub,'width'), 1) ...
+                    ));
+                otherwise
+                  
+              end
+              
+            case 'fsdata'
+              pl_obj = plist(...
+                'fsfcn', cell2mat(utils.math.randelement(find(p_menu_sub, 'fsfcn'), 1)), ...
+                'name', cell2mat(utils.math.randelement(find(p_menu_sub,'name'), 1)), ...
+                'yunits', unit(cell2mat(utils.math.randelement(find(p_menu_sub, 'yunits'), 1))) ...
+                );
+              
+              switch cell2mat(utils.math.randelement(find(p_menu_sub, 'f_mode'), 1))
+                case 'build'
+                  pl_obj.combine(pl_obj, plist(...
+                    'f1', utils.math.randelement(find(p_menu_sub, 'f1'), 1), ...
+                    'f2', utils.math.randelement(find(p_menu_sub, 'f2'), 1), ...
+                    'nf', utils.math.randelement(find(p_menu_sub, 'nf'), 1), ...
+                    'scale', cell2mat(utils.math.randelement(find(p_menu_sub, 'scale'), 1)) ...
+                    ));
+                case 'list'
+                  f = find(p_menu_sub, 'f');
+                  pl_obj.combine(pl_obj, plist(...
+                    'f', logspace(f(1), f(2), 1e3)  ...
+                    ));
+                otherwise
+                  
+              end
+              
+            case 'cdata'
+              vals = find(p_menu_sub,'vals');
+              nvals = utils.math.randelement(N_MAX_VALS, 1);
+              pl_obj = plist(...
+                'vals', vals(1) + (vals(2) - vals(1))*rand(nvals, 1), ...
+                'name', cell2mat(utils.math.randelement(find(p_menu_sub,'name'), 1)), ...
+                'yunits', unit(cell2mat(utils.math.randelement(find(p_menu_sub, 'yunits'), 1))) ...
+                );
+              
+            case 'xydata'
+              xvals = find(p_menu_sub,'xvals');
+              yvals = find(p_menu_sub,'yvals');
+              nvals = utils.math.randelement(N_MAX_VALS, 1);
+              pl_obj = plist(...
+                'xvals', xvals(1) + (xvals(2) - xvals(1))*rand(nvals, 1), ...
+                'yvals', yvals(1) + (yvals(2) - yvals(1))*rand(nvals, 1), ...
+                'name', cell2mat(utils.math.randelement(find(p_menu_sub,'name'), 1)), ...
+                'xunits', unit(cell2mat(utils.math.randelement(find(p_menu_sub, 'xunits'), 1))), ...
+                'yunits', unit(cell2mat(utils.math.randelement(find(p_menu_sub, 'yunits'), 1))) ...
+                );
+              
+            otherwise
+              
+          end
+        else
+          % The plist to build the object is the input plist
+          utils.helper.msg(msg.MNAME, '%s\n%s', ...
+            '  ',['Object from class ' upper(obj_type) ' built from input plist']);
+          pl_obj = ao_params;
+        end
+        
+        % Builds the trial object, adding the test ID to the input plist
+        obj = ao(pl_obj.append('test_ID', test_ID));
+        
+        % Adds the trial object to the cell array
+        objs{kk} = obj;
+        
+        % Adds the plist for this object to the cell array
+        pl_objs{kk} = pl_obj;
+        
+        
+      case 'plist'
+        plist_params = find(pls, 'PLIST_PARAMS');
+        if isempty(plist_params) || ~plist_params.nparams || find(pls, 'RAND_PLIST');
+          % The plist to build the object is built by picking at random from
+          % a "menu" list, based on random 'key' and 'values' fields
+          utils.helper.msg(msg.MNAME, '%s\n%s', ...
+            '  ',['Object from class ' upper(obj_type) ' built from random parameters']);
+          pl_obj = plist();
+          p_menu = provide_menu('plist');
+          n_params = utils.math.randelement(p_menu.nparams, 1);
+          for jj = 1:n_params
+            pl_obj.append(['Key' num2str(jj)], p_menu.params(utils.math.randelement(n_params, 1)).val)
+          end
+        else
+          % The plist to build the object is the input plist
+          utils.helper.msg(msg.MNAME, '%s\n%s', ...
+            '  ',['Object from class ' upper(obj_type) ' built from input plist']);
+          pl_obj = plist_params;
+        end
+        
+        % Builds the trial object, adding the test ID to the input plist
+        obj = plist(pl_obj.append('test_ID', test_ID));
+        
+        % Adds the trial object to the cell array
+        objs{kk} = obj;
+        
+        % Adds the plist for this object to the cell array
+        pl_objs{kk} = pl_obj;
+        
+        % Saves some memory
+        clear obj pl_obj;
+        
+      case 'mfir'
+        mfir_params = find(pls, 'MFIR_PARAMS');
+        if isempty(mfir_params) || ~mfir_params.nparams || find(pls, 'RAND_MFIR');
+          % The plist to build the object is built by picking at random from
+          % values in a "menu" list, based on the parameters 'From Standard Type'
+          
+          utils.helper.msg(msg.MNAME, '%s\n%s', ...
+            '  ',['Object from class ' upper(obj_type) ' built from random parameters']);
+          p_menu = provide_menu('mfir');
+          
+          pl_obj = plist(...
+            'type', cell2mat(utils.math.randelement(find(p_menu, 'type'), 1)), ...
+            'order', utils.math.randelement(find(p_menu, 'order'), 1), ...
+            'gain', utils.math.randelement(find(p_menu, 'gain'), 1), ...
+            'fs', utils.math.randelement(find(p_menu, 'fs'), 1), ...
+            'fc', [1.0 1.2].*utils.math.randelement(find(p_menu, 'fc'), 1), ...
+            'iunits', unit(cell2mat(utils.math.randelement(find(p_menu, 'iunits'), 1))), ...
+            'ounits', unit(cell2mat(utils.math.randelement(find(p_menu, 'ounits'), 1))) ...
+            );
+        else
+          % The plist to build the object is the input plist
+          utils.helper.msg(msg.MNAME, '%s\n%s', ...
+            '  ',['Object from class ' upper(obj_type) ' built from input plist']);
+          pl_obj = mfir_params;
+        end
+        
+        % Builds the trial object, adding the test ID to the input plist
+        obj = mfir(pl_obj.append('test_ID', test_ID));
+        
+        % Adds the trial object to the cell array
+        objs{kk} = obj;
+        
+        % Adds the plist for this object to the cell array
+        pl_objs{kk} = pl_obj;
+        
+        % Saves some memory
+        clear obj pl_obj;
+        
+      case 'miir'
+        miir_params = find(pls, 'MIIR_PARAMS');
+        if isempty(miir_params) || ~miir_params.nparams || find(pls, 'RAND_MIIR');
+          % The plist to build the object is built by picking at random from
+          % values in a "menu" list, based on the parameters 'From Standard Type'
+          
+          utils.helper.msg(msg.MNAME, '%s\n%s', ...
+            '  ',['Object from class ' upper(obj_type) ' built from random parameters']);
+          p_menu = provide_menu('miir');
+         
+          pl_obj = plist(...
+            'type', cell2mat(utils.math.randelement(find(p_menu, 'type'), 1)), ...
+            'order', utils.math.randelement(find(p_menu, 'order'), 1), ...
+            'gain', utils.math.randelement(find(p_menu, 'gain'), 1), ...
+            'fs', utils.math.randelement(find(p_menu, 'fs'), 1), ...
+            'fc', [1.0 1.2].*utils.math.randelement(find(p_menu, 'fc'), 1), ...
+            'iunits', unit(cell2mat(utils.math.randelement(find(p_menu, 'iunits'), 1))), ...
+            'ounits', unit(cell2mat(utils.math.randelement(find(p_menu, 'ounits'), 1))) ...
+            );
+        else
+          % The plist to build the object is the input plist
+          utils.helper.msg(msg.MNAME, '%s\n%s', ...
+            '  ',['Object from class ' upper(obj_type) ' built from input plist']);
+          pl_obj = miir_params;
+        end
+        
+        % Builds the trial object, adding the test ID to the input plist
+        obj = miir(pl_obj.append('test_ID', test_ID));
+        
+        % Adds the trial object to the cell array
+        objs{kk} = obj;
+        
+        % Adds the plist for this object to the cell array
+        pl_objs{kk} = pl_obj;
+        
+        % Saves some memory
+        clear obj pl_obj;
+        
+      case 'pzmodel'
+        
+        pzmodel_params = find(pls, 'pzmodel_PARAMS');
+        if isempty(pzmodel_params) || ~pzmodel_params.nparams || find(pls, 'RAND_pzmodel');
+          % The plist to build the object is built by picking at random from
+          % values in a "menu" list, from the 'From Poles/Zeros'
+          % constructor
+          
+          utils.helper.msg(msg.MNAME, '%s\n%s', ...
+            '  ',['Object from class ' upper(obj_type) ' built from random parameters']);
+          p_menu = provide_menu('pzmodel');
+          
+          v_poles = [];
+          v_zeros = [];
+          
+          freq = find(p_menu, 'freq');
+          Q = find(p_menu, 'Q');
+          for jj = 1:utils.math.randelement(N_MAX_POLES, 1)
+            v_poles = [v_poles pz(utils.math.randelement(freq, 1), utils.math.randelement(Q, 1))];
+          end
+          for jj = 1:utils.math.randelement(N_MAX_ZEROS, 1)
+            v_zeros = [v_zeros pz(utils.math.randelement(freq, 1), utils.math.randelement(Q, 1))];
+          end
+          
+          pl_obj = plist(...
+            'gain', utils.math.randelement(find(p_menu, 'gain'), 1), ...
+            'poles', v_poles, ...
+            'zeros', v_zeros, ...
+            'name', cell2mat(utils.math.randelement(find(p_menu, 'name'), 1)), ...
+            'iunits', unit(cell2mat(utils.math.randelement(find(p_menu, 'iunits'), 1))), ...
+            'ounits', unit(cell2mat(utils.math.randelement(find(p_menu, 'ounits'), 1))) ...
+            );
+        else
+          % The plist to build the object is the input plist
+          utils.helper.msg(msg.MNAME, '%s\n%s', ...
+            '  ',['Object from class ' upper(obj_type) ' built from input plist']);
+          pl_obj = pzmodel_params;
+        end
+        
+        % Builds the trial object, adding the test ID to the input plist
+        obj = pzmodel(pl_obj.append('test_ID', test_ID));
+        
+        % Adds the trial object to the cell array
+        objs{kk} = obj;
+        
+        % Adds the plist for this object to the cell array
+        pl_objs{kk} = pl_obj;
+        
+        % Saves some memory
+        clear obj pl_obj;
+        
+      case 'timespan'
+        timespan_params = find(pls, 'TIMESPAN_PARAMS');
+        if isempty(timespan_params) || ~timespan_params.nparams || find(pls, 'RAND_TIMESPAN');
+          % The plist to build the object is built by picking at random from
+          % values in a "menu" list, based on the parameters needed to
+          % build it from definition
+          
+          utils.helper.msg(msg.MNAME, '%s\n%s', ...
+            '  ',['Object from class ' upper(obj_type) ' built from random parameters']);
+          p_menu = provide_menu('timespan');
+          
+          t = time;
+          pl_obj = plist(...
+            'startT', t.utc_epoch_milli, ...
+            'endT', t.utc_epoch_milli + randi(t.utc_epoch_milli + 1e12, 1), ...
+            'timezone', cell2mat(utils.math.randelement(find(p_menu, 'timezone'), 1)), ...
+            'timeformat', cell2mat(utils.math.randelement(find(p_menu, 'timeformat'), 1)) ...
+            );
+        else
+          % The plist to build the object is the input plist
+          utils.helper.msg(msg.MNAME, '%s\n%s', ...
+            '  ',['Object from class ' upper(obj_type) ' built from input plist']);
+          pl_obj = timespan_params;
+        end
+        
+        % Builds the trial object, adding the test ID to the input plist
+        obj = timespan(pl_obj.append('test_ID', test_ID));
+        
+        % Adds the trial object to the cell array
+        objs{kk} = obj;
+        
+        % Adds the plist for this object to the cell array
+        pl_objs{kk} = pl_obj;
+        
+        % Saves some memory
+        clear obj pl_obj;
+        
+      case 'ssm'
+        ssm_params = find(pls, 'SSM_PARAMS');
+        if isempty(ssm_params) || ~ssm_params.nparams || find(pls, 'RAND_SSM');
+          % The plist to build the object is built by picking at random from
+          % values in a "menu" list, based on built-in models that can be
+          % constructed without the Control System Toolbox
+          
+          utils.helper.msg(msg.MNAME, '%s\n%s', ...
+            '  ',['Object from class ' upper(obj_type) ' built from random parameters']);
+          p_menu = provide_menu('ssm');
+          
+          pl_obj = plist(...
+            'built-in', cell2mat(utils.math.randelement(find(p_menu, 'model_list'), 1)) ...
+            );
+        else
+          % The plist to build the object is the input plist
+          utils.helper.msg(msg.MNAME, '%s\n%s', ...
+            '  ',['Object from class ' upper(obj_type) ' built from input plist']);
+          pl_obj = ssm_params;
+        end
+        
+        % Builds the trial object, adding the test ID to the input plist
+        obj = ssm(pl_obj.append('test_ID', test_ID));
+        
+        % Adds the trial object to the cell array
+        objs{kk} = obj;
+        
+        % Adds the plist for this object to the cell array
+        pl_objs{kk} = pl_obj;
+        
+        % Saves some memory
+        clear obj pl_obj;
+        
+      case 'parfrac'
+         parfrac_params = find(pls, 'PARFRAC_PARAMS');
+         if isempty(parfrac_params) || ~parfrac_params.nparams || find(pls, 'RAND_PARFRAC');
+            % The plist to build the object is built by picking at random from
+            % values in a "menu" list, based on the parameters 'From Standard Type'
+            utils.helper.msg(msg.MNAME, '%s\n%s', ...
+               '  ',['Object from class ' upper(obj_type) ' built from random parameters']);
+            
+            p_menu = provide_menu('parfrac');
+            num_poles = utils.math.randelement([3:10],1);
+            pl_obj = plist(...
+               'res', utils.math.randelement(find(p_menu, 'res'), num_poles), ...
+               'poles', utils.math.randelement(find(p_menu, 'poles'), num_poles), ... % this extracts num_poles pz objs from a vector of pz objs
+               'dir', find(p_menu, 'dir'), ...
+               'iunits', unit(cell2mat(utils.math.randelement(find(p_menu, 'iunits'), 1))), ...
+               'ounits', unit(cell2mat(utils.math.randelement(find(p_menu, 'ounits'), 1))) ...
+               );
+         else
+            % The plist to build the object is the input plist
+            utils.helper.msg(msg.MNAME, '%s\n%s', ...
+               '  ',['Object from class ' upper(obj_type) ' built from input plist']);
+            pl_obj = parfrac_params;
+         end
+         obj = parfrac(pl_obj.append('test_ID', test_ID));
+         
+         % Adds the trial object to the cell array
+         objs{kk} = obj;
+         % Adds the plist for this object to the cell array
+         pl_objs{kk} = pl_obj;
+         % Saves some memory
+         clear obj pl_obj;
+        
+      case 'rational'
+         rational_params = find(pls, 'RATIONAL_PARAMS');
+         if isempty(rational_params) || ~rational_params.nparams || find(pls, 'RAND_RATIONAL');
+            % The plist to build the object is built by picking at random from
+            % values in a "menu" list, based on the parameters 'From Standard Type'
+            utils.helper.msg(msg.MNAME, '%s\n%s', ...
+               '  ',['Object from class ' upper(obj_type) ' built from random parameters']);
+            
+            p_menu = provide_menu('rational');
+            pl_obj = plist(...
+               'num', utils.math.randelement(find(p_menu, 'num'), utils.math.randelement(10,1)), ...
+               'den', utils.math.randelement(find(p_menu, 'den'), utils.math.randelement(10,1)), ...
+               'iunits', unit(cell2mat(utils.math.randelement(find(p_menu, 'iunits'), 1))), ...
+               'ounits', unit(cell2mat(utils.math.randelement(find(p_menu, 'ounits'), 1))) ...
+               );
+         else
+            % The plist to build the object is the input plist
+            utils.helper.msg(msg.MNAME, '%s\n%s', ...
+               '  ',['Object from class ' upper(obj_type) ' built from input plist']);
+            pl_obj = rational_params;
+         end
+         obj = rational(pl_obj.append('test_ID', test_ID));
+         
+         % Adds the trial object to the cell array
+         objs{kk} = obj;
+         % Adds the plist for this object to the cell array
+         pl_objs{kk} = pl_obj;
+         % Saves some memory
+         clear obj pl_obj;        
+      otherwise
+        utils.helper.msg(msg.MNAME, '%s\n%s', ...
+          '  ',['Object from class ' upper(obj_type) ' not available already, using AO instead']);
+        
+        % Go ahead with a simple tsdata AO
+        p_menu = provide_menu('unsupported');
+        obj = prepare_simple_ao(p_menu.append('test_ID', test_ID));
+        
+        % Adds the trial object to the cell array
+        objs{kk} = obj;
+        
+        % Adds the plist for this object to the cell array
+        pl_objs{kk} = pl_obj;
+        
+        % Saves some memory
+        clear obj pl_obj;
+    end
+  end
+  
+  %% Saves on disk the data objects
+  if find(pls,'save_objs')
+    obj_save_path = find(pls, 'dir');
+    obj_filename = find(pls, 'obj_filename');
+    obj_fileformat = find(pls, 'obj_fileformat');
+    
+    for kk = 1:length(objs)
+      obj = objs{kk};
+      w = whos('obj');
+      path_string = sprintf('%s%s%s_%s_%d_%04d.%s', ...
+        obj_save_path, path_symbol, obj_filename ,...
+        w.class, test_ID, kk, obj_fileformat);
+      
+      save(obj, path_string);
+%       obj_size = dir(path_string);
+%       if strcmpi(obj_fileformat,'xml')
+%          obj_size_xml(kk) = obj_size.bytes;
+%          obj_size_bin(kk) = zeros(size(objs));
+%       else
+%          obj_size_xml(kk) = zeros(size(objs));
+%          obj_size_bin(kk) = obj_size.bytes;
+%       end
+    end
+  else
+     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+     %  To be updated with a proper new function to measure the filesize  %
+     %                 when the objects are not saved                     %
+     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%      obj_size_xml = zeros(size(objs));
+%      obj_size_bin = zeros(size(objs));
+  end
+  
+  if find(pls, 'FILESIZE')
+     clear objs_filesize
+     objs_filesize{1,1} = 'XML';
+     objs_filesize{1,2} = 'BIN';
+     % The function must return the size (in bytes) of the objects generated
+     for kk = 1:length(objs)
+        obj = objs{kk};
+        
+        % Retrieve the XML filesize
+        xml = com.mathworks.xml.XMLUtils.createDocument('obj');
+        parent = xml.getDocumentElement;
+        utils.helper.xmlwrite(obj, xml, parent, '');
+        otxt = xmlwrite(xml);
+        xml_size = whos('otxt');
+        objs_filesize{kk+1,1} = xml_size.bytes;
+        
+        % Retrive the BIN filesize
+        obj = utils.prog.rstruct(obj);
+        bin_size = whos('obj');
+        objs_filesize{kk+1,2} = bin_size.bytes;
+        
+        clear obj xml parent otxt xml_size bin_size
+     end
+  end
+
+  
+  
+  %% Executes the submit/retrieve test
+  if find(pls, 'SUBMIT')
+    
+    start_time = now;
+    
+    utils.helper.msg(msg.MNAME, '\n%s\n%s%d%s\n%s', ...
+      '  ', '*===== Test ', test_ID, ' =========', '  ');
+    
+    % Submission and retrieval
+    results = submitretrieve(conn, objs, test_ID, find(pls, 'coll_retrieve'));
+    
+    % Includes time for start and stop in serial form
+    stop_time = now;
+    results.append('start_time', datestr(start_time,'HH:MM:SS.FFF'), ...
+      'stop_time', datestr(stop_time,'HH:MM:SS.FFF'));
+    
+  else
+    results = plist;
+  end
+    
+    
+  %% Final report
+  
+  % Includes the plists for the creation of the objects
+  results.append('pl_objs', pl_objs );
+  
+  % Includes the plist input by the user, combined with default
+  results.append('pl_used', pls );
+  
+  if find(pls, 'FILESIZE')
+     % Includes the size of the objects
+     results.append('objs_filesize', objs_filesize);
+  end
+  
+  
+  if find(pls, 'save_results')    
+    % Saves the test results
+    save(...
+      [find(pls, 'dir') path_symbol find(pls, 'results_filename') '_' num2str(test_ID) '.mat'], ...
+      'results');
+  end
+  
+  varargout{1} = results;
+  
+  
+  %% Closes connection if stand-alone run
+  if ~isempty(find(pls, 'conn'))
+    % Close connection
+    close(conn);
+  end
+end
+
+%--------------------------------------------------------------------------
+% Provides the "menu" lists where to pick from
+%--------------------------------------------------------------------------
+function out_list = provide_menu(obj)
+  switch lower(obj)
+    case 'ao'
+      t = time;
+      out_list = plist(...
+        'dtype', {'tsdata', 'fsdata', 'cdata', 'xydata'}, ...
+        'tsdata',   plist(...
+        'waveform', {...
+        'sine-wave', 'chirp', 'noise', 'Gaussian pulse', 'Square wave', 'Sawtooth'}, ...
+        'fs', [0.1:0.1:10], ...
+        'nsecs', logspace(1,6,1000), ...
+        't0', t, ...
+        'A', linspace(-10,10,1001), ...
+        'f', logspace(-1,-4,100), ...
+        'phi', linspace(-2*pi,2*pi,21), ...
+        'toff', linspace(0,1e4,101), ...
+        'type', {'Normal', 'Uniform'}, ...
+        'sigma', linspace(0,10,101), ...
+        'f0', logspace(-2,1,100), ...
+        'f1', logspace(1,3,100), ...
+        't1', logspace(1,3,100), ...
+        'bw', linspace(0,1,101), ...
+        'duty', linspace(0,100,101), ...
+        'width', linspace(0,1,101), ...
+        'name', {'One', 'Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight'}, ...
+        'yunits', unit.supportedUnits ...
+        ), ...
+        'fsdata',   plist(...
+        'fsfcn',{'f','1./f', '5./(f.^4) + 2./(f.^2) + 1 + f.^4', 'sinc(f)'}, ...
+        'f_mode', {'build', 'list'}, ...
+        'f1', logspace(-5,-3,100), ...
+        'f2', logspace(-3,1,100), ...
+        'nf', logspace(1,5,100), ...
+        'scale',{'log','lin'}, ...
+        'f', [-6 1], ...
+        'name', {'One', 'Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight'}, ...
+        'yunits', unit.supportedUnits ...
+        ), ...
+        'cdata',    plist(...
+        'vals', [-1e5 1e5], ...
+        'name', {'One', 'Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight'}, ...
+        'yunits', unit.supportedUnits), ...
+        'xydata',   plist(...
+        'xvals', [-1e5 1e5], ...
+        'yvals', [-1e5 1e5], ...
+        'name', {'One', 'Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight'}, ...
+        'xunits', unit.supportedUnits, ...
+        'yunits', unit.supportedUnits) ...
+        );
+      
+    case 'plist'
+      out_list = plist(...
+        'Parameter_01', 1, ...
+        'Parameter_02', '2', ...
+        'Parameter_03', pi, ...
+        'Parameter_04', [1:10]', ...
+        'Parameter_05', 'This is really not important', ...
+        'Parameter_06', -1/sqrt(2), ...
+        'Parameter_07', [1:10]', ...
+        'Parameter_08', 0, ...
+        'Parameter_09', 1./sqrt(2*pi).*exp(-10:0.1:10), ...
+        'Parameter_10', [] ...
+        );
+      
+    case 'mfir'
+      out_list = plist(...
+        'type', {'highpass', 'lowpass', 'bandpass', 'bandreject'}, ...
+        'order', [2:2:100], ...
+        'gain', [1:1:1000], ...
+        'fs', [0.1:0.1:10], ...
+        'fc', [0.01:0.01:0.1], ...
+        'iunits', unit.supportedUnits, ...
+        'ounits', unit.supportedUnits ...
+        );
+      
+    case 'miir'
+      out_list = plist(...
+        'type', {'highpass', 'lowpass', 'bandpass', 'bandreject'}, ...
+        'order', [1:20], ...
+        'gain', [1:1:1000], ...
+        'fs', [0.1:0.1:10], ...
+        'fc', [0.01:0.01:0.1], ...
+        'ripple', [0.5:0.5:2], ...
+        'iunits', unit.supportedUnits, ...
+        'ounits', unit.supportedUnits ...
+        );
+      
+    case 'pzmodel'
+      freq = [0.01:0.01:1];
+      Q = [NaN(1,21) logspace(0,3,21)];
+      
+      out_list = plist(...
+        'gain', [1:1:1000], ...
+        'freq', freq, ...
+        'Q', Q, ...
+        'name', {'One', 'Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight'}, ...
+        'iunits', unit.supportedUnits, ...
+        'ounits', unit.supportedUnits ...
+        );
+      
+    case 'ssm'
+      model_list = {
+        'IS_readout_xcpl', ...
+        'Interferometer_readout', ...
+        'Interferometer_readout_xcpl', ...
+        'LPF_Dynamics', ...
+        'MPS', ...
+        'NSF_IS_readout', ...
+        'NSF_Interferometer_readout', ...
+        'NSF_MPS', ...
+        'NSF_ST_readout', ...
+        'NSF_TM', ...
+        'NSF_TMActuation', ...
+        'NSF_TM_SC', ...
+        'NSF_infrared', ...
+        'NSF_solar', ...
+        'ST_readout', ...
+        'TMActuation_xcpl', ...
+        'delay', ...
+        'delay_IS_readout', ...
+        'delay_Ifo_readout', ...
+        'delay_ST_readout' ...
+        };
+      
+      out_list = plist('model_list', model_list);
+      
+    case 'timespan'
+      t = time;
+      out_list = plist(...
+        'timezone', t.getTimezones, ...
+        'timeformat', {'yyyy-mm-dd HH:MM:SS.FFF', 'HH:MM:SS', 'yyyy-mm-dd HH:MM:SS'} ...
+        );
+      
+    case 'parfrac'
+      out_list = plist(...
+        'res', randn(1,100).^3,...
+        'poles', -randn(1,100).^2,... % all <0
+        'dir', utils.math.randelement([0:3],1),...
+        'iunits', unit.supportedUnits, ...
+        'ounits', unit.supportedUnits ...
+        );
+       
+     case 'rational'
+      out_list = plist(...
+        'num', randn(1,100).*utils.math.randelement([-10:10],100),...
+        'den', randn(1,100).*utils.math.randelement([-10:10],100),...
+        'iunits', unit.supportedUnits, ...
+        'ounits', unit.supportedUnits ...
+        ); %#ok<*NBRAK>
+     
+     case 'unsupported'
+      % In case of class not supported yet by the repository, the function
+      % will provide a plist to create a fixed AO instead.
+      out_list = plist(...
+        'nsecs', 1000, ...
+        'fs', 10, ...
+        'noise_type', 'Normal', ...
+        'f_m', 0.01, ...
+        'phi', 0 ...
+        );
+      
+    otherwise
+      error('Unknown class name ''[%s]'' provided', obj)
+  end
+  
+end
+
+%--------------------------------------------------------------------------
+% Provides simple AOs with tsdata
+%--------------------------------------------------------------------------
+
+function ao_out = prepare_simple_ao(pls)
+  % Makes the trial object(s)
+  nsecs = find(pls, 'NSECS');
+  fs    = find(pls, 'FS');
+  f_m   = find(pls, 'F_M');
+  phi   = find(pls, 'PHI');
+  noise_type = find(pls, 'NOISE_TYPE');
+  test_ID = find(pls, 'TEST_ID');
+  
+  pl_w = plist('fs', fs, 'nsecs', nsecs, ...
+    'waveform', 'sine wave','f', f_m, 'phi', phi, 'test_ID', test_ID);
+  pl_n = plist('fs', fs, 'nsecs', nsecs, ...
+    'waveform', 'noise', 'type', noise_type, 'test_ID', test_ID);
+  
+  ao_out = ao(pl_w) + ao(pl_n);
+end
+
+
+%--------------------------------------------------------------------------
+% Executes the submit/receive actions
+%--------------------------------------------------------------------------
+function sr_report = submitretrieve(conn, sub_obj, test_ID, coll_retr)
+  import utils.const.*;
+  
+  %% Get the current time
+  t1 = char(time());
+  
+  %% Put togehter the information struct
+  sinfo.conn                   = conn;
+  sinfo.username               = conn.username;
+  sinfo.experiment_title       = ['Repository Test ' t1(1:10)];
+  sinfo.experiment_description = sprintf('Submit/retrieve test # %d', test_ID);
+  sinfo.analysis_description   = 'Testing constructors, submit, retrieve';
+  sinfo.quantity               = 'none';
+  sinfo.keywords               = 'none';
+  sinfo.reference_ids          = '';
+  sinfo.additional_comments    = 'Trial data for submission and retrieval';
+  sinfo.additional_authors     = 'M Hewitson';
+  
+  
+  %% Submit the object(s)
+  tic;
+  [OBJids, cid] = submit(sub_obj{:}, sinfo);
+  st = toc;
+  
+  %% Retrieve the object(s) from xml field
+  if coll_retr
+    % Retrieve the object(s) by collection ID
+    utils.helper.msg(msg.MNAME, '\n%s%d\n%s', ...
+      'Retrieve xml object with collection ID ', cid, '  ');
+    tic;
+    ret_obj_xml = ltpda_uo.retrieve(conn, 'Collection', cid);
+  else
+    % retrieve the object(s) by obj IDs
+    utils.helper.msg(msg.MNAME, '\n%s%s\n%s', ...
+      'Retrieve xml object with obj ID ', num2str(OBJids), '  ');
+    tic;
+    ret_obj_xml = ltpda_uo.retrieve(conn, OBJids);
+  end
+  
+  % Single retrieval will give an object, not a cell array
+  if ~isa(ret_obj_xml, 'cell')
+    ret_obj_xml = {ret_obj_xml};
+  end
+  rt_xml = toc;
+  
+  %% Retrieve the object(s) from binary field
+  if coll_retr
+    % Retrieve the object(s) by collection ID
+    utils.helper.msg(msg.MNAME, '\n%s%d\n%s', ...
+      'Retrieve binary object with collection ID ', cid, '  ');
+    tic;
+    ret_obj_bin = ltpda_uo.retrieve(conn, 'binary', 'Collection', cid);
+  else
+    % retrieve the object(s) by obj IDs
+    utils.helper.msg(msg.MNAME, '\n%s%s\n%s', ...
+      'Retrieve binary object with obj ID ', num2str(OBJids), '  ');
+    tic;
+    ret_obj_bin = ltpda_uo.retrieve(conn, 'binary', OBJids);
+  end
+  
+  % Single retrieval will give an object, not a cell array
+  if ~isa(ret_obj_bin, 'cell')
+    ret_obj_bin = {ret_obj_bin};
+  end
+  rt_bin = toc;
+  
+  %% Check consistency of retrieved/submitted object(s)
+  status = zeros(2,length(sub_obj));
+  
+  for kk = 1:length(sub_obj)
+    status(1,kk) = status(1,kk) + ne(sub_obj{kk}, ret_obj_xml{kk}, 'invars', 'hist'); % TODO: remove the hist checking
+    status(2,kk) = status(2,kk) + ne(sub_obj{kk}, ret_obj_bin{kk}, 'invars', 'hist'); % TODO: remove the hist checking
+  end
+  
+  % Edit the time field
+  t = t1(1:19); % Skip milliseconds
+  t(strfind(t,':')) = '_';    % These are correct fieldnames
+  
+  sr_report = plist(...
+    'ret_time_xml', rt_xml, ...
+    'ret_time_bin', rt_bin, ...
+    'sub_time', st, ...
+    't', t, ...
+    'test_ID', test_ID, ...
+    'status', status, ...
+    'OBJids', OBJids, ...
+    'cid', cid, ...
+    'sinfo', rmfield(sinfo, 'conn') ... % Remove the non-serializable substructs
+    );
+  
+end
+
+%--------------------------------------------------------------------------
+% Get Info Object
+%--------------------------------------------------------------------------
+function ii = getInfo(varargin)
+  if nargin == 1 && strcmpi(varargin{1}, 'None')
+    sets = {};
+    pl   = [];
+  else
+    sets = {'Default'};
+    pl   = getDefaultPlist;
+  end
+  % Build info object
+  ii = minfo(mfilename, 'ao', '', utils.const.categories.helper, '$Id: repo_test_func.m,v 1.6 2009/03/25 17:39:01 nicola Exp $', sets, pl);
+end
+
+%--------------------------------------------------------------------------
+% Get Default Plist
+%--------------------------------------------------------------------------
+function plo = getDefaultPlist()
+  
+  disp('* creating default plist...');
+  plo = plist(...
+    'RAND_N_OBJ',      false, ...
+    'N_OBJ',           1, ...
+    'RAND_OBJ_TYPE',   false, ...
+    'OBJ_TYPE',        'ao', ...
+    'RAND_AO',         true, ...
+    'AO_PARAMS',       plist, ...
+    'RAND_PLIST',      true, ...
+    'PLIST_PARAMS',    plist, ...
+    'RAND_MFIR',       true, ...
+    'MFIR_PARAMS',     plist, ...
+    'RAND_MIIR',       true, ...
+    'MIIR_PARAMS',     plist, ...
+    'RAND_PZMODEL',    true, ...
+    'PZMODEL_PARAMS',  plist, ...
+    'RAND_TIMESPAN',   true, ...
+    'TIMESPAN_PARAMS', plist, ...
+    'RAND_SSM',        true, ...
+    'SSM_PARAMS',      plist, ...
+    'RAND_PARFRAC',    true, ...
+    'PARFRAC_PARAMS',  plist, ...
+    'RAND_RATIONAL',   true , ...
+    'RATIONAL_PARAMS', plist, ...
+    'HOSTNAME',        '130.75.117.67', ...
+    'DBASE',           'ltpda_test', ...
+    'COLL_RETRIEVE',   false, ...
+    'SAVE_OBJS',       true, ...
+    'OBJ_FILENAME',    'submit_trial_obj', ...
+    'OBJ_FILEFORMAT',  'xml', ...
+    'DIR',             '/Users/MH/exper_data/test/obj_creation' , ...
+    'SUBMIT',          false, ...
+    'CONN',            [], ...
+    'SAVE_RESULTS',    true, ...
+    'FILESIZE',        false, ...
+    'RESULTS_FILENAME','repo_test' ...
+    );
+  disp('* done.');
+end
+
+% END