0001 function varargout = iplot(varargin)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028 if nargin == 2
0029 if isa(varargin{1}, 'ao') && ischar(varargin{2})
0030 in = char(varargin{1});
0031 if strcmp(in, 'Params')
0032 varargout{1} = getDefaultPL();
0033 return
0034 end
0035 end
0036 end
0037
0038 axes_handle = [];
0039 ao_s = [];
0040 pl_s = [];
0041 line_spec = [];
0042 prop_val = {};
0043
0044
0045 for ii = 1:nargin
0046 if ishandle(varargin{ii}) & isempty(axes_handle)
0047 axes_handle = varargin{ii};
0048 elseif isa(varargin{ii}, 'ao')
0049 varargin{ii} = reshape(varargin{ii}, 1, []);
0050 ao_s = [ao_s varargin{ii}];
0051 elseif isa(varargin{ii}, 'plist')
0052 pl_s = [pl_s varargin{ii}];
0053 elseif ischar(varargin{ii}) && islinespec(varargin{ii}) && isempty(line_spec)
0054 line_spec = varargin{ii};
0055 else
0056 prop_val = [prop_val, varargin{ii}];
0057 end
0058 end
0059
0060 pl_s = combine(pl_s, getDefaultPL());
0061
0062
0063
0064
0065 len_legend = getappdata(0, 'wraplegendstringat');
0066
0067
0068
0069
0070 sort_ao = [];
0071 T0_off = 1e20;
0072
0073 for ii = 1:length(ao_s)
0074
0075 [x,y] = get_xy_axis(ao_s(ii).data);
0076
0077
0078 class_name = class(ao_s(ii).data);
0079
0080
0081
0082 if isempty(sort_ao) || ~ismember(class_name, fieldnames(sort_ao))
0083 sort_ao.(class_name) = [];
0084 end
0085
0086
0087 if isempty(sort_ao.(class_name))
0088 sort_ao.(class_name) = struct('ao', [], ...
0089 'complex', false, ...
0090 'complex_view', '', ...
0091 'legend_names', '', ...
0092 'xlabel_des', '', ...
0093 'ylabel_des', '', ...
0094 'xscale', 'linear', ...
0095 'yscale', 'linear');
0096 end
0097
0098
0099 sort_ao.(class_name).ao = [sort_ao.(class_name).ao ao_s(ii)];
0100 sort_ao.(class_name).complex_view = find(pl_s, 'complex_view');
0101 sort_ao.(class_name).title_str = find(pl_s, 'title_str');
0102 sort_ao.(class_name).legend_names = find(pl_s, 'legend_names');
0103 sort_ao.(class_name).xlabel_des = find(pl_s, 'xlabel_des');
0104 sort_ao.(class_name).ylabel_des = find(pl_s, 'ylabel_des');
0105
0106 if ~isreal(y)
0107 sort_ao.(class_name).complex = true;
0108 end
0109 if (max(x)-min(x)) / 10^floor(log10(mean(abs(x)))) > 9
0110 sort_ao.(class_name).xscale = 'log';
0111 end
0112 if min(x) < 0
0113 sort_ao.(class_name).xscale = 'linear';
0114 end
0115 if (max(y)-min(y)) / 10^floor(log10(mean(abs(y)))) > 9
0116 sort_ao.(class_name).yscale = 'log';
0117 end
0118 if min(y) < 0
0119 sort_ao.(class_name).yscale = 'linear';
0120 end
0121
0122
0123
0124
0125
0126 if strcmp(class_name, 'fsdata')
0127 if length (ao_s(ii).data.enbw) > 1
0128 sort_ao.(class_name).enbw = find(pl_s, 'enbw');
0129 end
0130 end
0131
0132
0133 if strcmp(class_name, 'tsdata')
0134
0135 t0 = ao_s(ii).data.t0.utc_epoch_milli/1000;
0136 if t0 < T0_off
0137 T0_off = t0;
0138 sort_ao.(class_name).T0_off = t0;
0139 end
0140 end
0141
0142 end
0143
0144
0145
0146
0147 fields = fieldnames(sort_ao);
0148
0149 out_line_h = [];
0150 out_axes_h = [];
0151 out_figure_h = [];
0152
0153 for ii = 1:length(fields)
0154 class_name = fields{ii};
0155
0156
0157 if strcmp(class_name, 'tsdata')
0158 for jj = 1:length(sort_ao.(class_name).ao)
0159 curr_ao = sort_ao.(class_name).ao(jj);
0160
0161 t0 = curr_ao.data.t0.utc_epoch_milli/1000;
0162 curr_ao.data.t = curr_ao.data.t + t0 - sort_ao.(class_name).T0_off;
0163
0164 sort_ao.(class_name).ao(jj) = curr_ao;
0165 end
0166 end
0167
0168
0169
0170 if isempty (sort_ao.(class_name).title_str)
0171 if sort_ao.(class_name).complex == true
0172 add_text = 'complex ';
0173 else
0174 add_text = '';
0175 end
0176 switch (class_name)
0177 case 'fsdata'
0178 sort_ao.(class_name).title_str = sprintf('Plot of %sfrequency series AOs', add_text);
0179 case 'tsdata'
0180 sort_ao.(class_name).title_str = sprintf('Plot of %stime series AOs', add_text);
0181 case 'cdata'
0182 sort_ao.(class_name).title_str = sprintf('Plot of %sconstant data AOs', add_text);
0183 case 'xydata'
0184 sort_ao.(class_name).title_str = sprintf('Plot of %sxy data AOs', add_text);
0185 otherwise
0186 error('### Unknown data object ''%s''', class_name);
0187 end
0188 end
0189
0190
0191 if isempty(sort_ao.(class_name).ao(1).data.xunits)
0192 xunits = 'unknown';
0193 else
0194 xunits= sort_ao.(class_name).ao(1).data.xunits;
0195 end
0196 if isempty(sort_ao.(class_name).ao(1).data.yunits)
0197 yunits = 'unknown';
0198 else
0199 yunits= sort_ao.(class_name).ao(1).data.yunits;
0200 end
0201
0202 fig_h = figure;
0203
0204
0205 if sort_ao.(class_name).complex == true
0206
0207 if strcmp(sort_ao.(class_name).complex_view, 're/im')
0208 axes_h1 = subplot(2,1,1);
0209 line_h1 = plot(axes_h1, real(sort_ao.(class_name).ao), line_spec, prop_val);
0210 axes_h2 = subplot(2,1,2);
0211 line_h2 = plot(axes_h2, imag(sort_ao.(class_name).ao), line_spec, prop_val);
0212
0213 label_x1 = [sort_ao.(class_name).xlabel_des ' [' xunits ']'];
0214 label_y1 = [sort_ao.(class_name).ylabel_des 'Real [' yunits ']'];
0215 label_y2 = [sort_ao.(class_name).ylabel_des 'Imaginary [' yunits ']'];
0216
0217
0218 if ~ismember('xscale', lower(prop_val))
0219
0220
0221
0222
0223 pl_s = combine(pl_s, plist('xscale', sort_ao.(class_name).xscale));
0224 end
0225
0226
0227 pl_s = set(pl_s, 'Yscale', 'linear');
0228
0229 else
0230 axes_h1 = subplot(3,1,1:2);
0231 line_h1 = plot(axes_h1, abs(sort_ao.(class_name).ao), line_spec, prop_val);
0232 axes_h2 = subplot(3,1,3);
0233 line_h2 = plot(axes_h2, phase(sort_ao.(class_name).ao), line_spec, prop_val);
0234
0235 label_x1 = [sort_ao.(class_name).xlabel_des ' [' xunits ']'];
0236 label_y1 = [sort_ao.(class_name).ylabel_des 'Magnitude [' yunits ']'];
0237 label_y2 = [sort_ao.(class_name).ylabel_des 'Phase [' yunits ']'];
0238
0239
0240 if ~ismember('xscale', lower(prop_val))
0241
0242
0243
0244
0245 pl_s = combine(pl_s, plist('xscale', sort_ao.(class_name).xscale));
0246 end
0247
0248
0249 if ~ismember('yscale', lower(prop_val))
0250
0251
0252
0253
0254 pl_s = combine(pl_s, plist('yscale', sort_ao.(class_name).yscale));
0255 end
0256
0257
0258 pl_s = set(pl_s, 'Yscale2', 'linear');
0259 end
0260
0261
0262 xlabel(axes_h2, label_x1);
0263 ylabel(axes_h1, label_y1);
0264 ylabel(axes_h2, label_y2);
0265
0266 out_line_h = [out_line_h, line_h1, line_h2];
0267 out_axes_h = [out_axes_h, axes_h1, axes_h2];
0268 out_figure_h = [out_figure_h, fig_h];
0269
0270
0271 else
0272 [line_h1, axes_h1] = plot(real(sort_ao.(class_name).ao), line_spec, prop_val);
0273
0274 axes_h2 = axes_h1;
0275 line_h2 = line_h1;
0276
0277
0278 xlabel(axes_h1, [sort_ao.(class_name).xlabel_des ' [' xunits ']']);
0279 ylabel(axes_h1, [sort_ao.(class_name).ylabel_des ' [' yunits ']']);
0280
0281 out_line_h = [out_line_h, line_h1];
0282 out_axes_h = [out_axes_h, axes_h1];
0283 out_figure_h = [out_figure_h, fig_h];
0284
0285
0286 if ~ismember('xscale', lower(prop_val))
0287
0288
0289
0290
0291 pl_s = combine(pl_s, plist('xscale', sort_ao.(class_name).xscale));
0292 end
0293
0294
0295 if ~ismember('yscale', lower(prop_val))
0296
0297
0298
0299
0300 pl_s = combine(pl_s, plist('yscale', sort_ao.(class_name).yscale));
0301 end
0302
0303 end
0304
0305
0306 title (axes_h1, sort_ao.(class_name).title_str);
0307
0308
0309 grid(axes_h1, 'on');
0310 grid(axes_h2, 'on');
0311
0312
0313
0314 if isempty(sort_ao.(class_name).legend_names)
0315 for jj = 1:length(line_h1)
0316
0317 display_name = sort_ao.(class_name).ao(jj).name;
0318 display_name = ltpda_label(display_name);
0319 display_name = wrapLegendString(sprintf('%s', ltpda_label(display_name)), len_legend);
0320 set(line_h1(jj), 'DisplayName', display_name)
0321 end
0322 legend(axes_h1, 'toggle')
0323
0324 else
0325 legend(axes_h1, sort_ao.(class_name).legend_names);
0326 end
0327
0328
0329 for jj = 1:length(pl_s.params)
0330 p = pl_s.params(jj);
0331
0332 [idx_b, idx_e, dummy, match] = regexp(p.key, '\d', 'once');
0333 p.key = strrep(p.key, match, '');
0334
0335
0336 if isprop(line_h1, p.key)
0337 if strcmp(match, '1')
0338 set(line_h1, p.key, p.val);
0339 elseif strcmp(match, '2')
0340 set(line_h2, p.key, p.val);
0341 else
0342 set(line_h1, p.key, p.val);
0343 set(line_h2, p.key, p.val);
0344 end
0345
0346 elseif isprop(axes_h1, p.key)
0347 if strcmp(match, '1')
0348 set(axes_h1, p.key, p.val);
0349 elseif strcmp(match, '2')
0350 set(axes_h2, p.key, p.val);
0351 else
0352 set(axes_h1, p.key, p.val);
0353 set(axes_h2, p.key, p.val);
0354 end
0355 end
0356
0357 end
0358
0359 end
0360
0361
0362
0363
0364
0365
0366 if nargout == 0
0367 elseif nargout == 1
0368 varargout{1} = out_line_h;
0369 elseif nargout == 2
0370 varargout{1} = out_line_h;
0371 varargout{2} = out_axes_h;
0372 elseif nargout == 3
0373 varargout{1} = out_line_h;
0374 varargout{2} = out_axes_h;
0375 varargout{3} = out_figure_h;
0376 else
0377 error('### Unknown number of outputs.')
0378 end
0379
0380
0381 end
0382
0383
0384
0385
0386
0387
0388
0389
0390
0391
0392
0393 function pl_default = getDefaultPL()
0394
0395 pl_default = plist();
0396 pl_default = append(pl_default, 'complex_view', 'mag/deg');
0397 end
0398
0399
0400
0401
0402
0403
0404
0405
0406
0407
0408
0409
0410 function so = wrapLegendString(s, N)
0411
0412 sc = wrapstring(s, N);
0413
0414 so = sc{1};
0415
0416 for j=2:length(sc)
0417 so = [so sprintf('\n%s', sc{j})];
0418 end
0419 end
0420
0421
0422
0423