0001 function explore_ao(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
0029
0030
0031
0032
0033
0034
0035
0036 FIG_X = .150;
0037 FIG_Y = .150;
0038 FIG_dX = .700;
0039 FIG_dY = .600;
0040
0041
0042 TREE_X = .000;
0043 TREE_Y = .000;
0044 TREE_dX = .350;
0045 TREE_dY = 1.000;
0046
0047
0048 PLOT_X = .370;
0049 PLOT_Y = .105;
0050 PLOT_dX = .610;
0051 PLOT_dY = .720;
0052
0053
0054 DISP_X = TREE_X;
0055 DISP_Y = .750;
0056 DISP_dX = TREE_dX;
0057 DISP_dY = 1-DISP_Y;
0058
0059
0060 EXPL_NAME_dX = .370;
0061 EXPL_NAME_dY = .045;
0062 EXPL_NAME_X = PLOT_X+(PLOT_dX-EXPL_NAME_dX)/2;
0063 EXPL_NAME_Y = .030;
0064
0065
0066
0067 N_INFOS = 3;
0068
0069 INFO_X = PLOT_X;
0070 INFO_Y = .915;
0071 INFO_dX = PLOT_dX / N_INFOS;
0072 INFO_dY = .034;
0073
0074 BG_COLOR = [.925 .914 .847];
0075
0076 MAX_HIST_DEPTH = 4;
0077
0078
0079
0080
0081
0082 a = [];
0083 ao_value = [];
0084 ao_name = {};
0085
0086
0087 if nargin==0
0088
0089 tree_name = 'ao_ws';
0090
0091 ws_vars = evalin('base','whos');
0092
0093 for ii=1:length(ws_vars)
0094 if strcmp(ws_vars(ii).class, 'ao')
0095
0096 cmd = sprintf('a = evalin(''base'', ''%s'');', ws_vars(ii).name);
0097 eval(cmd)
0098
0099
0100 if length(a) == 1
0101
0102 ao_value = [ao_value a];
0103 ao_name{end+1} = ws_vars(ii).name;
0104 else
0105
0106 [n,m] = size(a);
0107
0108
0109 if n == 1 || m == 1
0110
0111 for jj=1:length(a)
0112 ao_value = [ao_value a(jj)];
0113 ao_name{end+1} = [ws_vars(ii).name '(' num2str(jj) ')'];
0114 end
0115
0116
0117 elseif n > 1 && m > 1
0118
0119 for gg = 1:n
0120 for hh = 1:m
0121 ao_value = [ao_value a(gg,hh)];
0122 ao_name{end+1} = [ws_vars(ii).name '(' num2str(gg) ',' num2str(hh) ')'];
0123 end
0124 end
0125
0126 else
0127 error ('### this should not happen.');
0128 end
0129
0130 end
0131
0132 end
0133 end
0134
0135 elseif nargin == 1
0136
0137 tree_name = inputname(1);
0138 ao_value = varargin{:};
0139 ao_name = inputname(1);
0140
0141 else
0142 error ('### only use no or one input.')
0143 end
0144
0145 fig_name = ['explore the analysis object: ' tree_name];
0146
0147
0148 fig = figure('Units', 'normalized', ...
0149 'NextPlot', 'add', ...
0150 'NumberTitle', 'off', ...
0151 'Toolbar', 'none', ...
0152 'name', fig_name, ...
0153 'Color', BG_COLOR, ...
0154 'Position', [FIG_X FIG_Y ...
0155 FIG_dX FIG_dY]);
0156
0157
0158
0159
0160
0161 root = ltpda_uitreenode(tree_name, tree_name, [], false);
0162 tree = ltpda_uitree( fig,'Root', root, ...
0163 'ExpandFcn', @myExpfcn4);
0164 set(tree, 'Units', 'normalized', ...
0165 'position', [TREE_X TREE_Y ...
0166 TREE_dX TREE_dY], ...
0167 'NodeWillExpandCallback', @nodeWillExpand_cb4, ...
0168 'NodeSelectedCallback', @nodeSelected_cb4);
0169 tmp = tree.FigureComponent;
0170 cell_Data = cell(3,1);
0171
0172
0173 cell_Data{1} = ao_value;
0174 cell_Data{3} = ao_name;
0175
0176 set(tmp, 'UserData', cell_Data);
0177
0178
0179
0180 haxes = axes('Units', 'normalized', ...
0181 'Position', [PLOT_X PLOT_Y ...
0182 PLOT_dX PLOT_dY], ...
0183 'Box', 'on', ...
0184 'XTick', [], ...
0185 'YTick', []);
0186
0187 box off;
0188 axis off;
0189
0190
0191 txt1 = uicontrol('String', '', ...
0192 'Units', 'normalized', ...
0193 'Style', 'Edit', ...
0194 'Position', [INFO_X INFO_Y ...
0195 INFO_dX INFO_dY], ...
0196 'BackgroundColor', BG_COLOR);
0197
0198 txt2 = uicontrol('String', '', ...
0199 'Units', 'normalized', ...
0200 'Style', 'Edit', ...
0201 'Position', [(INFO_X+INFO_dX) INFO_Y ...
0202 INFO_dX INFO_dY],...
0203 'BackgroundColor', BG_COLOR);
0204
0205 txt3 = uicontrol('String', '', ...
0206 'Units', 'normalized', ...
0207 'Style', 'Edit', ...
0208 'Position', [(INFO_X+2*INFO_dX) INFO_Y ...
0209 INFO_dX INFO_dY],...
0210 'BackgroundColor', BG_COLOR);
0211
0212 txt4 = uicontrol('String', '', ...
0213 'Units', 'normalized', ...
0214 'Style', 'Edit', ...
0215 'Position', [ INFO_X (INFO_Y-INFO_dY) ...
0216 3*INFO_dX INFO_dY], ...
0217 'BackgroundColor', BG_COLOR);
0218
0219
0220 txt5 = uicontrol('String', '', ...
0221 'Units', 'normalized', ...
0222 'Style', 'listbox', ...
0223 'Visible', 'off', ...
0224 'Fontsize', 8, ...
0225 'Position', [DISP_X DISP_Y ...
0226 DISP_dX DISP_dY], ...
0227 'BackgroundColor', BG_COLOR);
0228
0229
0230
0231
0232 col1 = uicontrol('String', 'Name', ...
0233 'Units', 'normalized', ...
0234 'Style', 'Text', ...
0235 'Position', [INFO_X (INFO_Y+INFO_dY)...
0236 INFO_dX INFO_dY], ...
0237 'BackgroundColor', BG_COLOR);
0238 col2 = uicontrol('String', 'Size', ...
0239 'Units', 'normalized', ...
0240 'Style', 'Text', ...
0241 'Position', [(INFO_X+INFO_dX) (INFO_Y+INFO_dY)...
0242 INFO_dX INFO_dY], ...
0243 'BackgroundColor', BG_COLOR);
0244 col3 = uicontrol('String', 'Class', ...
0245 'Units', 'normalized', ...
0246 'Style', 'Text', ...
0247 'Position', [(INFO_X+2*INFO_dX) (INFO_Y+INFO_dY)...
0248 INFO_dX INFO_dY], ...
0249 'BackgroundColor', BG_COLOR);
0250
0251
0252 expl_name = uicontrol('String', 'Analysis Object explorer', ...
0253 'Units', 'normalized', ...
0254 'Style', 'text', ...
0255 'Position', [EXPL_NAME_X EXPL_NAME_Y ...
0256 EXPL_NAME_dX EXPL_NAME_dY],...
0257 'ForeGroundColor', [0.2 0.4 1], ...
0258 'FontSize', 18, ...
0259 'FontWeight', 'bold', ...
0260 'FontAngle', 'italic');
0261
0262 tree_menu = uicontextmenu();
0263 tree_menu1 = uimenu(tree_menu, 'Label', 'Plot', ...
0264 'Callback', @f_tree_menu1);
0265 tree_menu2 = uimenu(tree_menu, 'Label', 'Display', ...
0266 'Callback', @f_tree_menu2);
0267
0268 disp_menu = uicontextmenu;
0269 disp_menu1 = uimenu(disp_menu, 'Label', 'close', ...
0270 'Callback', @f_disp_menu1);
0271
0272 set(tree.Tree, 'MousePressedCallback', @mouse_cb);
0273 set(tree.Tree, 'UIContextMenu', tree_menu);
0274
0275
0276
0277 function mouse_cb(h, ev)
0278 if ev.getModifiers()== ev.META_MASK
0279
0280
0281 vis = get(get(ev, 'Component'), 'VisibleRect');
0282 x_width = get(get(ev, 'Component'), 'Width');
0283 y_height = get(get(ev, 'Component'), 'Height');
0284
0285 new_x = ev.getX-vis(1);
0286 new_y = -ev.getY+y_height-(y_height-vis(4));
0287 set(tree_menu, 'Position', [new_x new_y], ...
0288 'Visible', 'on');
0289 end
0290
0291 end
0292
0293 function f_disp_menu1(h, ev)
0294 set(txt5, 'Visible', 'off')
0295 set(tree, 'position', [TREE_X TREE_Y ...
0296 TREE_dX TREE_dY])
0297 end
0298
0299 function f_tree_menu1(h,ev)
0300 plotselected_cb;
0301 end
0302
0303 function f_tree_menu2(h,ev)
0304 displayselected_cb;
0305 end
0306
0307 function plotselected_cb(h, ev)
0308
0309 tmp = tree.FigureComponent;
0310 S = get(tmp, 'UserData');
0311 s = S{1};
0312 cNode = S{2};
0313 [val, plotted, cNode] = getcNodevalue(cNode, s);
0314
0315 cla(haxes)
0316
0317 if (isa(val,'history'))
0318 if length(val) == 1
0319 figure;
0320 plot (val);
0321 ii = strfind(plotted, 'inhists');
0322 title(haxes, sprintf('History-Level: %d', length(ii)+1))
0323 else
0324 na = text(0.5,0.5,'Select the left or right branch.');
0325 set(na, 'HorizontalAlignment', 'center', ...
0326 'Color', 'r', ...
0327 'FontWeight', 'bold', ...
0328 'EdgeColor', 'k', ...
0329 'BackgroundColor', 'w', ...
0330 'Fontsize', 10, ...
0331 'Margin', 5);
0332 end
0333 elseif isa(val,'fsdata') || isa(val,'tsdata') || ...
0334 isa(val,'xydata') || isa(val,'cdata')
0335 figure;
0336 plot(ao(val))
0337
0338 else
0339
0340 cNode = S{2};
0341 parent = '';
0342
0343 if cNode.getLevel >= 1
0344 parent = cNode.getParent;
0345 end
0346
0347 if strcmp(parent.getValue, 'data')
0348 grandpa = parent.getParent;
0349 grandpa_val = grandpa.getValue;
0350 von = findstr(grandpa_val,'(');
0351 bis = findstr(grandpa_val,')');
0352 if ~isempty(von) && ~isempty(bis)
0353 index = grandpa_val(von+1:bis-1);
0354 else
0355 index = '1';
0356 end
0357
0358 eval (sprintf('val = S{1}(%s);',index))
0359 figure;
0360 plot(val);
0361 end
0362
0363 end
0364
0365 end
0366
0367 function displayselected_cb(h, ev)
0368 tmp = tree. FigureComponent;
0369 S = get(tmp, 'UserData');
0370 s = S{1};
0371 cNode = S{2};
0372 [val, displayed, cNode] = getcNodevalue(cNode, s);
0373
0374 text1 = '';
0375 if isobject(val)
0376 text1 = display(val);
0377 else
0378 disp(val)
0379 end
0380
0381
0382
0383 text1 = strrep(text1, char(10), ' ');
0384
0385 set(tree, 'position', [TREE_X TREE_Y ...
0386 TREE_dX TREE_dY-DISP_dY]);
0387 set(txt5, 'string', text1);
0388 set(txt5, 'Visible', 'on');
0389 set(txt5, 'UIContextMenu', disp_menu);
0390 end
0391
0392
0393 function cNode = nodeSelected_cb4(tree,ev)
0394 cNode = ev.getCurrentNode;
0395 tmp = tree.FigureComponent;
0396 cell_Data = get(tmp, 'UserData');
0397 cell_Data{2} = cNode;
0398 s = cell_Data{1};
0399 val = s;
0400 plotted = cNode.getValue;
0401 selected = plotted;
0402 [val, plotted, cNode] = getcNodevalue(cNode, val);
0403 set(txt1, 'string', selected)
0404 set(txt2, 'string', strcat(num2str(size(val,1)),'x',num2str(size(val,2))) )
0405 set(txt3, 'string', class(val))
0406
0407 str = ' ';
0408 c_str = {};
0409 cla(haxes)
0410
0411 if ~isempty(val)
0412
0413 if isnumeric(val)
0414
0415 si = size(val);
0416 if si(1) > si(2)
0417 val = val.';
0418 else
0419 val = val;
0420 end
0421 if size(val,1) == 1 || size(val,2) == 1
0422 if length(val) > 3
0423 str = strcat(num2str(val(1:3)), ' ...');
0424 else
0425 str = num2str(val);
0426 end
0427 else
0428 str = 'Matrix';
0429 end
0430
0431 elseif ischar(val)
0432 str = val;
0433
0434 elseif islogical(val)
0435 if val
0436 str = 'true';
0437 else
0438 str = 'false';
0439 end
0440
0441 elseif isobject(val)
0442 if isa(val, 'ao')
0443 str = 'Analysis Object';
0444 elseif isa(val, 'cdata')
0445 str = 'C-Data Object';
0446 elseif isa(val, 'fsdata')
0447 str = 'Frequency-Series Object';
0448 elseif isa(val, 'tsdata')
0449 str = 'Time-Series Object';
0450 elseif isa(val, 'xydata')
0451 str = 'X-Y Data Object';
0452
0453 elseif isa(val, 'history')
0454 str = 'History Object';
0455 if length(val) == 1
0456 pl = plist(param('max_depth', MAX_HIST_DEPTH));
0457 plot(haxes, val, pl);
0458 ii = strfind(plotted, 'inhists');
0459 title(haxes, sprintf('History-Level: %d', length(ii)+1))
0460 else
0461 c_str{1} = 'Select the left or right branch.';
0462 end
0463
0464 elseif isa(val, 'param')
0465 if length(val) == 1
0466 str = char(val);
0467 c_str = split_by_comma(str);
0468 else
0469 for ii = 1:length(val)
0470 str = char(val(ii));
0471 c_str1 = split_by_comma(str, '- ');
0472 c_str(end+1:end+length(c_str1)) = c_str1;
0473 end
0474 end
0475 str = 'Parameter Object';
0476
0477 elseif isa(val, 'plist')
0478 for ii=1:length(val.params)
0479 str = char(val.params(ii));
0480 c_str1 = split_by_comma(str, '- ');
0481 c_str(end+1:end+length(c_str1)) = c_str1;
0482 end
0483 str = 'Parameter List Object';
0484
0485 elseif isa(val, 'mfir')
0486 str = 'FIR Filter Object';
0487 elseif isa(val, 'miir')
0488 str = 'IIR Filter Object';
0489 elseif isa(val, 'pole')
0490 str = 'Pole Object';
0491 elseif isa(val, 'provenance')
0492 str = 'Provenance Object';
0493 elseif isa(val, 'pzmodel')
0494 str = 'Pole Zero Object';
0495 elseif isa(val, 'specwin')
0496 str = 'Spectral Window Object';
0497 elseif isa(val, 'zero')
0498 str = 'Zero Object';
0499 elseif isa(val, 'time')
0500 str = 'Time Object';
0501 else
0502 str = 'Unknown class';
0503 end
0504
0505 elseif iscell(val)
0506 for i = 1:min(length(val),3)
0507 if ischar(val{i})
0508 str = strcat(str, val{i});
0509 elseif isnumeric(val)
0510 str = strcat(str, num2str(val{i}));
0511 end
0512 if i < min(length(val),3)
0513 str = strcat(str, ',');
0514 end
0515 end
0516 if length(val) > 3
0517 str = strcat(str,'...');
0518 end
0519
0520 end
0521
0522 if ~isempty(c_str)
0523 c_str = strtrim(c_str);
0524 na = text(0.5,0.5,c_str);
0525 txt_extent = get(na, 'Extent');
0526 set(na, 'Position', [0.5-txt_extent(3)/2, 0.5], ...
0527 'HorizontalAlignment', 'left', ...
0528 'Color', 'k', ...
0529 'FontWeight', 'bold', ...
0530 'EdgeColor', 'k', ...
0531 'BackgroundColor', 'w', ...
0532 'Fontsize', 10, ...
0533 'Margin', 5);
0534 end
0535
0536 else
0537 str = 'The field is empty';
0538 end
0539 set(txt4, 'string', str)
0540 set(tmp, 'UserData', cell_Data);
0541 end
0542
0543
0544
0545
0546
0547 end
0548
0549
0550
0551 function nodes = myExpfcn4(tree,value)
0552
0553 tmp = tree.FigureComponent;
0554 S = get(tmp, 'UserData');
0555 s = S{1};
0556 cNode = S{2};
0557 [val, cNode] = getcNodevalue(cNode, s);
0558 fnames = fieldnames(val);
0559
0560
0561
0562 pth = '';
0563 eval (sprintf('pth = which(''%s'');',mfilename))
0564 index = find(pth==filesep, 1, 'last');
0565 pth = pth(1:index);
0566 pth = [pth 'exp_struct_icons' filesep];
0567
0568 [n,m] = size(val);
0569 count = 0;
0570
0571
0572 if m>1 || n>1
0573
0574 if isa(val, 'ao')
0575 iconpath =[pth,'analysis_object.gif'];
0576 else
0577 iconpath =[pth,'struct_icon.gif'];
0578 end
0579
0580
0581 if m==1 || n==1
0582 L = length(val);
0583
0584 for J = 1:L
0585 count = count + 1;
0586 cNode = S{2};
0587
0588 level = cNode.getLevel;
0589 fname = strcat(cNode.getValue, '(', num2str(J),')');
0590
0591 if level==0 && ~isempty(S{3}) && numel(S{3}) == numel(S{1})
0592 node_str = S{3}(J);
0593 else
0594 node_str = fname;
0595 end
0596
0597 nodes(count) = ltpda_uitreenode(fname, node_str, iconpath, 0);
0598 end
0599
0600 else
0601
0602 for ii=1:n
0603 for jj=1:m
0604 count = count + 1;
0605 cNode = S{2};
0606 fname = [cNode.getValue '(' num2str(ii) ',' num2str(jj) ')'];
0607 nodes(count) = ltpda_uitreenode(fname, fname, iconpath, 0);
0608 end
0609 end
0610
0611 end
0612
0613 else
0614
0615 for i=1:length(fnames)
0616 count = count + 1;
0617 x = getfield(val,fnames{i});
0618
0619 if isa(x, 'ao')
0620 iconpath =[pth,'analysis_object.gif'];
0621 elseif isa(x, 'tsdata')
0622 iconpath =[pth,'ts_data.gif'];
0623 elseif isa(x, 'fsdata')
0624 iconpath =[pth,'fs_data.gif'];
0625 elseif isa(x, 'xydata')
0626 iconpath =[pth,'xy_data.gif'];
0627 elseif isa(x, 'cdata')
0628 iconpath =[pth,'c_data.gif'];
0629 elseif isa(x, 'history')
0630 iconpath =[pth,'history.gif'];
0631 elseif isa(x, 'plist')
0632 iconpath =[pth,'plist.gif'];
0633
0634 elseif isstruct(x)
0635 if length(x) > 1
0636 iconpath =[pth,'structarray_icon.gif'];
0637 else
0638 iconpath =[pth,'struct_icon.gif'];
0639 end
0640 elseif isnumeric(x)
0641 iconpath =[pth,'double_icon.gif'];
0642 elseif iscell(x)
0643 iconpath =[pth,'cell_icon.gif'];
0644 elseif ischar(x)
0645 iconpath =[pth,'char_icon.gif'];
0646 elseif islogical(x)
0647 iconpath =[pth,'logic_icon.gif'];
0648 elseif isobject(x)
0649 iconpath =[pth,'obj_icon.gif'];
0650 else
0651 iconpath =[pth,'unknown_icon.gif'];
0652 end
0653
0654 if isstruct(x) || isobject(x)
0655 isLeaf = 0;
0656 else
0657 isLeaf = 1;
0658 end
0659
0660 nodes(count) = ltpda_uitreenode(fnames{i}, fnames{i}, iconpath, isLeaf);
0661 end
0662 end
0663
0664 if (count == 0)
0665 nodes = [];
0666 end
0667 end
0668
0669
0670
0671 function cNode = nodeWillExpand_cb4(tree,ev)
0672 cNode = ev.getCurrentNode;
0673 tmp = tree.FigureComponent;
0674 cell_Data = get(tmp, 'UserData');
0675 cell_Data{2} = cNode;
0676 set(tmp, 'UserData', cell_Data);
0677 end
0678
0679
0680 function [val, displayed, cNode] = getcNodevalue(cNode, s)
0681
0682 fields = {};
0683 while cNode.getLevel ~=0
0684 fields = [fields; cNode.getValue];
0685 c = findstr(cNode.getValue, '(');
0686 if ~isempty(c) && cNode.getLevel ~=0
0687 cNode = cNode.getParent;
0688 end
0689
0690 if cNode.getLevel ==0, break; end
0691 cNode = cNode.getParent;
0692 end
0693
0694 val = s;
0695
0696 if ~isempty(fields)
0697 L=length(fields);
0698 displayed = fields{L};
0699
0700 for j = L-1:-1:1
0701 displayed = strcat(displayed, '.', fields{j});
0702 end
0703
0704 for i = L:-1:1
0705 field = fields{i};
0706 von = findstr(field,'(');
0707 bis = findstr(field,')');
0708 if ~isempty(von)
0709
0710 idx = field(von+1:bis-1);
0711 field = field(1:von-1);
0712 if (strcmp(field, cNode.getValue))
0713 cmd = sprintf('val = val(%s);',idx);
0714 eval(cmd);
0715 else
0716 cmd = sprintf('val = getfield(val, field, {%s});',idx);
0717 eval(cmd);
0718 end
0719
0720 else
0721 val = getfield(val, field);
0722 end
0723 end
0724 else
0725 displayed = cNode.getValue;
0726 return;
0727 end
0728 end
0729
0730
0731
0732 function c_str = split_by_comma(str, pref)
0733
0734 if nargin < 2
0735 pref = '';
0736 end
0737
0738 c_str = {};
0739 c_str{1} = str;
0740 index = find(str==',');
0741 von = 1;
0742 for ii = 1:length(index)
0743 bis = index(ii)-1;
0744 c_str{ii} = [pref str(von:bis)];
0745 von = bis + 2;
0746 end
0747 if ~isempty(index)
0748 c_str{ii+1} = [pref str(von:end)];
0749 end
0750
0751 c_str = strtrim(c_str);
0752 end
0753