comparison toolboxes/MIRtoolbox1.3.2/somtoolbox/vis_trajgui.m @ 0:e9a9cd732c1e tip

first hg version after svn
author wolffd
date Tue, 10 Feb 2015 15:05:51 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:e9a9cd732c1e
1 function vis_trajgui(trajStruct,arg)
2
3 % VIS_TRAJGUI subfuntion for SOM_TRAJECTORY
4 %
5 % This function is the actual GUI called by SOM_TRAJECTORY
6 % function.
7 %
8 % See also SOM_TRAJECTORY.
9
10 % Contributed code to SOM Toolbox 2.0, February 11th, 2000 by Juha Parhankangas
11 % Copyright (c) by Juha Parhankangas.
12 % http://www.cis.hut.fi/projects/somtoolbox/
13
14 % Version 2.0beta juha 180699
15
16 if nargin == 1
17
18 sM_h=trajStruct.figure;
19
20 if size(trajStruct.bmus,1) ~= 1 & size(trajStruct.bmus,2) ~= 1
21 fuzzy_traj(trajStruct,[]);
22 return;
23 end
24
25
26 if size(trajStruct.bmus,1) == 1 | size(trajStruct.bmus,2) == 1
27
28 udata.bmus = trajStruct.bmus;
29 udata.a_h=[findobj(get(sM_h,'Children'),'Tag','Uplane');...
30 findobj(get(sM_h,'Children'),'Tag','Cplane')];
31 udata.sM_h=trajStruct.figure;
32 udata.traj=[];
33 data1 = trajStruct.primary_data;
34 if ~isempty(trajStruct.primary_names)
35 names=trajStruct.primary_names;
36 else
37 for i=1:size(data1,2)
38 names{i,1}=sprintf('Var%d',i);
39 end
40 end
41
42 udata.lattice=trajStruct.lattice;
43 form = 0.7*vis_patch(udata.lattice);
44 udata.msize = trajStruct.msize;
45
46
47 %%%%%%%%%%%%%%%%%%%%%%%%
48 %
49 % forming a patch object, which is placed above every component plane
50 %
51
52
53 l = size(form,1);
54
55 nx = repmat(form(:,1),1,prod(udata.msize));
56 ny = repmat(form(:,2),1,prod(udata.msize));
57
58 x=reshape(repmat(1:udata.msize(2),l*udata.msize(1),1),l,prod(udata.msize));
59 y=repmat(repmat(1:udata.msize(1),l,1),1,udata.msize(2));
60
61 if strcmp(udata.lattice,'hexa')
62 t = find(~rem(y(1,:),2));
63 x(:,t)=x(:,t)+.5;
64 end
65 x=x+nx;
66 y=y+ny;
67
68 colors=reshape(ones(prod(udata.msize),1)*[NaN NaN NaN],...
69 [1 prod(udata.msize) 3]);
70
71 set(0,'CurrentFigure',udata.sM_h);
72
73 %%%%%%%%%%%%%%%%%%%%%%
74 %
75 % drawing patch
76 %
77 % caxis -commands keep the colormap of the original patch unchanged.
78 %
79
80 for i=1:length(udata.a_h)
81 udata.real_patch(i)=get(udata.a_h(i),'Children');
82 set(udata.real_patch(i),'ButtonDownFcn',...
83 'vis_trajgui([],''click'')');
84 subplot(udata.a_h(i));
85 v=caxis;
86 udata.tmp_patch(i)=patch(x,y,colors,'EdgeColor','none',...
87 'ButtonDownFcn',...
88 'vis_trajgui([],''click'')',...
89 'Tag','TmpPatch');
90 caxis(v);
91 end
92
93 %%%%%%%%%%%%%%%%%%%%
94
95
96
97 udata.length_of_traj=length(trajStruct.size);
98 udata.size=trajStruct.size;
99 udata.color=trajStruct.color;
100 udata.poly.x=[];
101 udata.poly.y=[];
102 udata.poly.h=[];
103 udata.new_marks=[];
104 udata.all_marks=[];
105 udata.d_mark2=[];
106 udata.fig1 = figure;
107 set(udata.fig1,'KeyPressFcn','vis_trajgui([],''key'')',...
108 'Name','Primary Data');
109
110
111 %%%%%%%%%%%%%%%%%%%%
112 %
113 % making the 'Tools' -menu
114 %
115
116 udata.m_i=uimenu(udata.fig1,'Label','Trajectoy T&ools');
117 udata.m_i(2)=uimenu(udata.m_i,'Label','&Remove Trajectory',...
118 'Callback',...
119 'vis_trajgui([],''remove_traj'')');
120 udata.m_i(3)=uimenu(udata.m_i(1),'Label','&Dye Nodes',...
121 'Callback',...
122 'vis_trajgui([],''dye_gui'')');
123 udata.m_i(4)=uimenu(udata.m_i(1),'Label','&Clear Markers',...
124 'Callback',...
125 'vis_trajgui([],''clear'')');
126 udata.m_i(5)=uimenu(udata.m_i(1),'Label','&Save',...
127 'Callback',...
128 'vis_trajgui([],''save'')');
129 udata.m_i(6)=uimenu(udata.m_i(1),'Label','&Load',...
130 'Callback',...
131 'vis_trajgui([],''load'')');
132
133 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
134 %
135 % drawing data components to the figure ....
136 %
137 %
138
139 if nargin < 5 | isempty(comps) | (isstr(comps) & strcmp(comps,'all'))
140 comps = 1:size(data1,2);
141 end
142
143 x=1:size(data1,1);
144
145 for i=1:length(comps)
146 subplot(length(comps),1,i);
147 udata.h(i)=gca;
148 udata.d_mark(i).h=[];
149
150 udata.d(i)=plot(x,data1(:,comps(i)),...
151 'ButtonDownFcn',...
152 'vis_trajgui([],''line_down'')');
153 set(gca,'XLim',[1 size(data1,1)],...
154 'XTick',[],...
155 'ButtonDownFcn','vis_trajgui([],''line_down'')'); %,...
156 %'YLim',[min(data1(:,comps(i))) max(data1(:,comps(i)))]);
157
158 ylabel(names{comps(i)});
159 hold on;
160 ymin=get(udata.h(i),'YLim');
161 pos=mean(get(udata.h(i),'XLim'));
162 udata.l(i) = line([pos pos],[ymin(1) ymin(2)],...
163 'Color','red',...
164 'ButtonDownFcn',...
165 'vis_trajgui([],''down'')');
166 end
167 udata.text1=[];
168
169 udata.fig2=[];
170 udata.h2=[];
171 udata.l2=[];
172 udata.text2=[];
173
174 %%%%%%%%%%%%%%%%%%%%%%%%%%%
175 %
176 % ... and to the figure 2.
177 %
178
179
180 if ~isempty(trajStruct.secondary_data)
181 data2=trajStruct.secondary_data;
182 if isempty(trajStruct.secondary_names)
183 for i=1:size(data1,2)
184 names2{i,1}=sprintf('Var%d',i);
185 end
186 else
187 names2=trajStruct.secondary_names;
188 end
189
190 udata.fig2 = figure;
191 set(udata.fig2,'Name','Secondary Data');
192 set(udata.fig2,'KeyPressFcn',...
193 'vis_trajgui([],''key'')');
194 for i=1:size(data2,2)
195 subplot(size(data2,2),1,i);
196 udata.h2(i) = gca;
197 udata.d_mark2(i).h=[];
198 udata.d2(i) = plot(x,data2(:,i),...
199 'ButtonDownFcn',...
200 'vis_trajgui([],''line_down'')');
201 set(gca,'XLim',[1 size(data1,1)],'XTick',[],'ButtonDownFcn',...
202 'vis_trajgui([],[],[],[],[],[],''line_down'')');
203 ylabel(names2{i});
204 hold on;
205 ymin = get(udata.h2(i),'YLim');
206 pos = mean(get(udata.h2(i),'XLim'));
207 udata.l2(i) = line([pos pos],ymin,'Color','red',...
208 'ButtonDownFcn','vis_trajgui([],''down'')');
209 end
210 end
211
212 %%%%%%%%%%%%%%%%%%%%%%%%%%
213
214 set(udata.fig1,'UserData',udata);
215 if ~isempty(udata.fig2);
216 tmp.fig1=udata.fig1;
217 set(udata.fig2,'UserData',tmp);
218 end
219 tmp=get(udata.sM_h,'UserData');
220 tmp.fig1=udata.fig1;
221 set(udata.sM_h,'UserData',tmp);
222 set_numbers(round(pos));
223 return;
224 end
225
226 end
227
228 %%%%%%%%%%%%%%%%%
229 %
230 % if figures have been drawn, the only function calls that may exist
231 % are the ones that change the state of the application.
232 %
233 udata=get(gcf,'UserData');
234 udata=get(udata.fig1,'UserData');
235
236 switch arg
237 case 'fuzzy'
238 fuzzy_traj(tS,[]);
239 return;
240 case 'move_fuzzy'
241 fuzzy_traj([],'move');
242 return;
243 case 'remove_traj'
244 remove_traj;
245 return;
246 case 'line_down'
247 line_bdf('down');
248 return;
249 case 'line_drag'
250 line_bdf('drag');
251 return;
252 case 'line_up'
253 line_bdf('up');
254 return;
255 case 'dye_gui';
256 color_gui(udata.fig1);
257 return;
258 case {'dye','cyan','magenta','yellow','red','green','blue','white','grey'}
259 dye_nodes(arg);
260 return;
261 case 'clear'
262 clear_markers;
263 return;
264 case 'key'
265 key_bdf;
266 return;
267 case 'click'
268 click;
269 return;
270 case 'save'
271 save_data;
272 return;
273 case 'load'
274 load_data;
275 return;
276 end
277
278
279 %%%%%%%%%%
280 %
281 % lines in the data figure(s) are dragged ...
282 %
283
284 udata=get(gcf,'UserData');
285 udata=get(udata.fig1,'UserData');
286
287
288 lims=get(gca,'XLim');
289 x = getfield(get(gca,'CurrentPoint'),{1}); % the location of the line
290
291 if x < lims(1)
292 x=lims(1);
293 elseif x > lims(2)
294 x=lims(2);
295 end
296
297 old = gcf;
298
299 switch arg
300 case 'down',...
301
302 % mouse button is pressed down above the line
303
304 set(gcf,'WindowButtonMotionFcn','vis_trajgui([],''drag'')');
305 set(gcf,'WindowButtonUpFcn','vis_trajgui([],''up'')');
306 set(udata.l,'EraseMode','xor');
307 delete(udata.text1);
308 if ~isempty(udata.l2);
309 set(udata.l2,'EraseMode','xor');
310 delete(udata.text2);
311 end
312 set(gcf,'Pointer','crosshair');
313
314 case 'drag'
315 % change the location of the lines
316
317 set(0,'CurrentFigure',udata.fig1);
318 set(udata.l,'XData',[x x]);
319 if ~isempty(udata.fig2)
320 set(0,'CurrentFigure',udata.fig2);
321 set(udata.l2,'XData',[x x]);
322 end
323 draw_traj(round(x));
324 set(0,'CurrentFigure',old);
325 case 'up'
326
327 % draw trajectory and set figure to the normal state.
328
329 set(udata.l,'EraseMode','normal');
330 set(gcf,'Pointer','arrow','WindowButtonMotionFcn','',...
331 'WindowButtonUpFcn','');
332 draw_traj(round(x));
333 set_numbers(round(x));
334 end
335
336 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
337
338 function draw_traj(point)
339
340 udata=get(gcf,'UserData');
341 udata=get(udata.fig1,'UserData');
342 color=udata.color;
343 eMode='normal';
344 if isstr(udata.color) & strcmp(udata.color,'xor')
345 eMode='xor';
346 color='black';
347 end
348 ind=udata.bmus(point);
349 [i j] = ind2sub(udata.msize,ind);
350 if ~mod(i,2)
351 j=j+0.5;
352 end
353 old = gcf;
354 set(0,'CurrentFigure',udata.sM_h);
355 hold on;
356 if isempty(udata.traj) | length(udata.traj.h) ~= length(udata.a_h)
357
358 % trajectory does not exist
359
360 for i=1:length(udata.a_h)
361 subplot(udata.a_h(i));
362 hold on;
363 new.h = plot(j,i,'Color',color,'EraseMode',eMode,'LineStyle','none');
364 udata.traj.h(i)=new;
365 udata.traj.j=j;
366 udata.traj.i=i;
367 end
368 else
369 if length(udata.traj.j) == udata.length_of_traj
370 % if the length of trajectory == ...,
371 udata.traj.j(1) = []; % the first (the oldest) coordinate pair
372 udata.traj.i(1) = []; % is removed.
373 end
374 udata.traj.j=[udata.traj.j;j]; % the new point is added to the
375 udata.traj.i=[udata.traj.i;i]; % end of coordinate vectors (i and j)
376 for i=1:length(udata.a_h)
377 subplot(udata.a_h(i)); % remove the existing trajectory
378 delete(udata.traj.h(i).h); % and plot the new one.
379 for j=1:length(udata.traj.j)
380 udata.traj.h(i).h(j)=plot(udata.traj.j(j),udata.traj.i(j),...
381 'Color',color,...
382 'EraseMode',eMode,'Marker','o','LineWidth',2,...
383 'MarkerSize',udata.size(udata.length_of_traj-j+1),...
384 'LineStyle','none');
385 end
386 end
387 end
388 set(0,'CurrentFigure',udata.fig1);
389 set(udata.fig1,'UserData',udata);
390
391
392 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
393
394 function set_numbers(x);
395
396 % This function writes the numbers beside of the pointer lines
397
398
399 udata=get(gcf,'UserData');
400 udata=get(udata.fig1,'UserData');
401
402 xlim = get(gca,'XLim');
403 ylim = get(gca,'YLim');
404 p = ylim(1) + 0.9*(ylim(2)-ylim(1));
405
406 old = gcf;
407 set(0,'CurrentFigure',udata.fig1);
408
409
410 for i=1:length(udata.h)
411 subplot(udata.h(i));
412
413 % check if the text is placed to the left side of the line...
414
415 if abs(x-xlim(1)) > (abs(x-xlim(2)))
416 udata.text1(i)=text(x-1,p,sprintf('%d ->',x),...
417 'VerticalAlignment','top',...
418 'HorizontalAlignment','right',...
419 'FontWeight','demi');
420 else
421
422 % or to the right side.
423
424 udata.text1(i)=text(x+1,p,sprintf('<- %d',x),...
425 'VerticalAlignment','top',...
426 'FontWeight','demi');
427 end
428 end
429
430 if ~isempty(udata.fig2)
431 set(0,'CurrentFigure',udata.fig2);
432
433 for i=1:length(udata.h2)
434 subplot(udata.h2(i));
435
436 if abs(x-xlim(1)) > (abs(x-xlim(2)))
437 udata.text2(i)=text(x-1,p,sprintf('%d ->',x),...
438 'VerticalAlignment','top',...
439 'HorizontalAlignment','right',...
440 'FontWeight','demi');
441 else
442 udata.text2(i)=text(x+1,p,sprintf('<- %d',x),...
443 'VerticalAlignment','top',...
444 'FontWeight','demi');
445 end
446 end
447 end
448
449 set(0,'CurrentFigure',old);
450 set(udata.fig1,'UserData',udata);
451
452 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
453
454 function remove_traj()
455
456 % delete trajectory -object from every component plane.
457
458 udata=get(gcf,'UserData');
459 udata=get(udata.fig1,'UserData');
460
461 if isempty(udata.traj)
462 return;
463 end
464
465
466 for i=1:length(udata.traj.h)
467 delete(udata.traj.h(i).h);
468 end
469
470 udata.traj=[];
471 set(udata.fig1,'UserData',udata);
472
473 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
474
475 function line_bdf(arg)
476
477 % this function takes care of action when region is selected in the
478 % data figure.
479
480
481 udata=get(gcf,'UserData');
482 udata=get(udata.fig1,'UserData');
483 xlim=get(gca,'XLim');
484
485 if ~(any(strcmp('THIS',fieldnames(udata))))
486 p = getfield(get(gca,'CurrentPoint'),{1});
487 else
488 p = getfield(get(udata.THIS,'CurrentPoint'),{1});
489 end
490
491 if p < xlim(1)
492 p = xlim(1);
493 elseif p > xlim(2)
494 p = xlim(2);
495 end
496
497
498
499 switch arg
500 case 'down'
501
502 % the mouse button is pressed down, the pointer lines are drawn.
503 % and the state of the figure is changed.
504
505 udata.THIS=gca;
506 set(gcf,'WindowButtonMotionFcn',...
507 'vis_trajgui([],''line_drag'')',...
508 'WindowButtonUpFcn','vis_trajgui([],''line_up'')');
509 udata.start_p=p;
510
511 old = gcf;
512 set(0,'CurrentFigure',udata.fig1);
513
514 for i=1:length(udata.h)
515 subplot(udata.h(i));
516 udata.t_line.h(i)=line([p p],get(gca,'YLim'),'Color','red');
517 udata.t_line.h2(i)=line([p p],get(gca,'YLim'),'Color','red',...
518 'EraseMode','xor');
519 end
520 if ~isempty(udata.h2)
521 set(0,'CurrentFigure',udata.fig2);
522 for i=1:length(udata.h2)
523 subplot(udata.h2(i));
524 udata.t_line2.h(i)=line([p p],get(gca,'YLim'),'Color','red');
525 udata.t_line2.h2(i)=line([p p],get(gca,'YLim'),'Color','red',...
526 'EraseMode','xor');
527 end
528 end
529
530 case 'drag'
531
532 % change the position of the pointer lines
533
534 old = gcf;
535 set(0,'CurrentFigure',udata.fig1);
536 set(udata.t_line.h2,'XData',[p p]);
537 if ~isempty(udata.fig2)
538 set(0,'CurrentFigure',udata.fig2);
539 set(udata.t_line2.h2,'XData',[p p]);
540 end
541 set(0,'CurrentFigure',old);
542 case 'up'
543
544
545 % sort the 'points' -vector and draw the markers to the data and nodes
546
547 points=sort([round(udata.start_p) round(p)]);
548 draw_markers(points(1):points(2));
549 udata=get(udata.fig1,'UserData');
550 udata.new_marks=unique([udata.new_marks ;(points(1):points(2))']);
551 delete([udata.t_line.h2 udata.t_line.h]);
552 if ~isempty(udata.fig2)
553 delete([udata.t_line2.h2 udata.t_line2.h]);
554 end
555 set(get(udata.THIS,'Parent'),'WindowButtonMotionFcn','',...
556 'WindowButtonUpFcn','');
557 udata=rmfield(udata,'THIS');
558 end
559
560 set(udata.fig1,'UserData',udata);
561
562 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
563
564 function draw_markers(x);
565
566 plot2data(x);
567 plot2plane(x);
568
569 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
570
571 function plot2data(x);
572
573 % plot black markers to the data figure(s)
574
575 udata=get(gcf,'UserData');
576 udata=get(udata.fig1,'UserData');
577
578 old = gcf;
579
580 set(0,'CurrentFigure',udata.fig1);
581
582 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
583
584 % if there already exist points in the positions that are members
585 % of the set x, then the old points are removed from data figures...
586
587 for i=1:length(udata.d_mark(1).h)
588 tmp1 = get(udata.d_mark(1).h(i),'XData');
589 tmp2 = setdiff(tmp1,x);
590 if length(tmp1) ~= length(tmp2)
591 inds=[];
592 for j=1:length(tmp2);
593 inds=[inds find(tmp2(j)==tmp1)];
594 end
595 for j=1:length(udata.d_mark)
596 ydata=getfield(get(udata.d_mark(j).h(i),'YData'),{inds});
597 set(udata.d_mark(j).h(i),'XData',tmp2,'YData',ydata);
598 end
599 if ~isempty(udata.fig2)
600 for j=1:length(udata.d_mark2)
601 ydata=getfield(get(udata.d_mark2(j).h(i),'YData'),{inds});
602 set(udata.d_mark2(j).h(i),'XData',tmp2,'YData',ydata);
603 end
604 end
605 end
606 end
607
608
609 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
610
611 % ... and the new ones are plotted.
612
613 for i=1:length(udata.h)
614 subplot(udata.h(i));
615 h=plot(x,getfield(get(udata.d(i),'YData'),{x}),'oblack',...
616 'ButtonDownFcn',...
617 'vis_trajgui([],''line_down'')');
618 udata.d_mark(i).h=[udata.d_mark(i).h;h];
619 end
620
621 if ~isempty(udata.h2)
622 set(0,'CurrentFigure',udata.fig2);
623
624 for i=1:length(udata.h2)
625 subplot(udata.h2(i));
626 h=plot(x,getfield(get(udata.d2(i),'YData'),{x}),'oblack',...
627 'ButtonDownFcn',...
628 'vis_trajgui([],''line_down'')');
629 udata.d_mark2(i).h=[udata.d_mark2(i).h;h];
630 end
631 end
632
633 set(0,'CurrentFigure',old);
634 set(udata.fig1,'UserData',udata);
635
636
637 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
638
639 function plot2plane(x);
640
641 % sets markers to the component planes.
642
643 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
644 %
645 % actually new markers are never plotted, but the color of the patch
646 % lying above the original component plane patch is changed black in
647 % the right positions.
648
649 udata=get(gcf,'UserData');
650 udata=get(udata.fig1,'UserData');
651
652 udata.new_marks=unique([udata.new_marks ;x']);
653
654 for i=1:length(udata.a_h)
655 col=get(udata.tmp_patch(i),'FaceVertexCData');
656 if length(size(col)) == 3
657 col = reshape(col,[size(col,1) 3]);
658 end
659 for j=1:length(udata.new_marks)
660 col(udata.bmus(udata.new_marks(j)),:)=[0 0 0];
661 end
662 set(udata.tmp_patch(i),'FaceVertexCData',col);
663 end
664
665 set(udata.fig1,'UserData',udata);
666
667 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
668
669 function color_gui(fig1)
670
671 % construct the graphical user interface for changing the color of the
672 % black (marked) nodes.
673
674
675 udata=get(fig1,'UserData');
676
677 a = figure('Color',[0.8 0.8 0.8], ...
678 'Name','Colors', ...
679 'PaperType','a4letter', ...
680 'Position',[518 456 120 311], ...
681 'Tag','Fig1');
682
683 udata.c_struct.fig=a;
684
685 b = uicontrol('Parent',a, ...
686 'Units','normalized', ...
687 'BackgroundColor',[0.701961 0.701961 0.701961], ...
688 'Position',[0.0700415 0.28956 0.830492 0.594566], ...
689 'Style','frame', ...
690 'Tag','Frame1');
691 b = uicontrol('Parent',a, ...
692 'Units','normalized', ...
693 'BackgroundColor',[0.8 0.8 0.8], ...
694 'Position',[0.100059 0.301143 0.770456 0.571399], ...
695 'Style','frame', ...
696 'Tag','Frame2');
697
698 b = uicontrol('Parent',a, ...
699 'Units','normalized', ...
700 'Callback','vis_trajgui([],''cyan'')', ...
701 'Position',[0.130077 0.795326 0.170101 0.0617729], ...
702 'Style','radiobutton', ...
703 'Tag','cyan', ...
704 'Value',1);
705
706
707 b = uicontrol('Parent',a, ...
708 'Units','normalized', ...
709 'Callback','vis_trajgui([],''magenta'')', ...
710 'Position',[0.130077 0.733553 0.170101 0.057912], ...
711 'Style','radiobutton', ...
712 'Tag','magenta');
713
714
715 b = uicontrol('Parent',a, ...
716 'Units','normalized', ...
717 'Callback','vis_trajgui([],''yellow'')', ...
718 'Position',[0.130077 0.664059 0.170101 0.0617729], ...
719 'Style','radiobutton', ...
720 'Tag','yellow');
721
722
723 b = uicontrol('Parent',a, ...
724 'Units','normalized', ...
725 'Callback','vis_trajgui([],''red'')', ...
726 'Position',[0.130077 0.590703 0.170101 0.0617729], ...
727 'Style','radiobutton', ...
728 'Tag','red');
729
730
731 b = uicontrol('Parent',a, ...
732 'Units','normalized', ...
733 'Callback','vis_trajgui([],''green'')', ...
734 'Position',[0.130077 0.525068 0.170101 0.057912], ...
735 'Style','radiobutton', ...
736 'Tag','green');
737
738
739 b = uicontrol('Parent',a, ...
740 'Units','normalized', ...
741 'Callback','vis_trajgui([],''blue'')', ...
742 'Position',[0.130077 0.455575 0.170101 0.0617729], ...
743 'Style','radiobutton', ...
744 'Tag','blue');
745
746
747 b = uicontrol('Parent',a, ...
748 'Units','normalized', ...
749 'Callback','vis_trajgui([],''white'')', ...
750 'Position',[0.130077 0.38608 0.170101 0.0617729], ...
751 'Style','radiobutton', ...
752 'Tag','white');
753
754
755 b = uicontrol('Parent',a, ...
756 'Units','normalized', ...
757 'Callback','vis_trajgui([],''grey'')', ...
758 'Position',[0.130077 0.320447 0.170101 0.057912], ...
759 'Style','radiobutton', ...
760 'Tag','grey');
761
762
763 b = uicontrol('Parent',a, ...
764 'Units','normalized', ...
765 'BackgroundColor',[0.8 0.8 0.8], ...
766 'FontWeight','demi', ...
767 'HorizontalAlignment','left', ...
768 'Position',[0.32019 0.795326 0.470278 0.0501905], ...
769 'String','Cyan', ...
770 'Style','text', ...
771 'Tag','StaticText1');
772 b = uicontrol('Parent',a, ...
773 'Units','normalized', ...
774 'BackgroundColor',[0.8 0.8 0.8], ...
775 'FontWeight','demi', ...
776 'HorizontalAlignment','left', ...
777 'Position',[0.32019 0.733553 0.520308 0.0463296], ...
778 'String','Magenta', ...
779 'Style','text', ...
780 'Tag','StaticText2');
781 b = uicontrol('Parent',a, ...
782 'Units','normalized', ...
783 'BackgroundColor',[0.8 0.8 0.8], ...
784 'FontWeight','demi', ...
785 'HorizontalAlignment','left', ...
786 'Position',[0.32019 0.664059 0.470278 0.0501905], ...
787 'String','Yellow', ...
788 'Style','text', ...
789 'Tag','StaticText3');
790 b = uicontrol('Parent',a, ...
791 'Units','normalized', ...
792 'BackgroundColor',[0.8 0.8 0.8], ...
793 'FontWeight','demi', ...
794 'HorizontalAlignment','left', ...
795 'Position',[0.32019 0.590703 0.470278 0.0501905], ...
796 'String','Red', ...
797 'Style','text', ...
798 'Tag','StaticText4');
799 b = uicontrol('Parent',a, ...
800 'Units','normalized', ...
801 'BackgroundColor',[0.8 0.8 0.8], ...
802 'FontWeight','demi', ...
803 'HorizontalAlignment','left', ...
804 'Position',[0.32019 0.525068 0.470278 0.0463296], ...
805 'String','Green', ...
806 'Style','text', ...
807 'Tag','StaticText5');
808 b = uicontrol('Parent',a, ...
809 'Units','normalized', ...
810 'BackgroundColor',[0.8 0.8 0.8], ...
811 'FontWeight','demi', ...
812 'HorizontalAlignment','left', ...
813 'Position',[0.32019 0.455575 0.470278 0.0463296], ...
814 'String','Blue', ...
815 'Style','text', ...
816 'Tag','StaticText6');
817 b = uicontrol('Parent',a, ...
818 'Units','normalized', ...
819 'BackgroundColor',[0.8 0.8 0.8], ...
820 'FontWeight','demi', ...
821 'HorizontalAlignment','left', ...
822 'Position',[0.32019 0.38608 0.470278 0.0501905], ...
823 'String','White', ...
824 'Style','text', ...
825 'Tag','StaticText7');
826 b = uicontrol('Parent',a, ...
827 'Units','normalized', ...
828 'BackgroundColor',[0.8 0.8 0.8], ...
829 'FontWeight','demi', ...
830 'HorizontalAlignment','left', ...
831 'Position',[0.32019 0.320447 0.470278 0.0463296], ...
832 'String','Grey', ...
833 'Style','text', ...
834 'Tag','StaticText8');
835 b = uicontrol('Parent',a, ...
836 'Units','normalized', ...
837 'Position',[0.0700415 0.146711 0.830492 0.135128], ...
838 'Style','frame', ...
839 'Tag','Frame3');
840 b = uicontrol('Parent',a, ...
841 'Units','normalized', ...
842 'BackgroundColor',[0.8 0.8 0.8], ...
843 'Position',[0.100059 0.158293 0.770456 0.111963], ...
844 'Style','frame', ...
845 'Tag','Frame4');
846 b = uicontrol('Parent',a, ...
847 'Units','normalized', ...
848 'BackgroundColor',[0.8 0.8 0.8], ...
849 'FontWeight','demi', ...
850 'HorizontalAlignment','left', ...
851 'Position',[0.130077 0.177597 0.270833 0.0617729], ...
852 'String','RGB', ...
853 'Style','text', ...
854 'Tag','StaticText9');
855 b = uicontrol('Parent',a, ...
856 'Units','normalized', ...
857 'BackgroundColor',[1 1 1], ...
858 'Position',[0.410243 0.173736 0.420249 0.0810768], ...
859 'Style','edit', ...
860 'Tag','EditText1');
861
862 udata.c_struct.RGB=b;
863
864 b = uicontrol('Parent',a, ...
865 'Units','normalized', ...
866 'Callback','vis_trajgui([],''dye'')', ...
867 'FontWeight','demi', ...
868 'Position',[0.0700415 0.0270256 0.360214 0.0772162], ...
869 'String','OK', ...
870 'Tag','Pushbutton1');
871 b = uicontrol('Parent',a, ...
872 'Units','normalized', ...
873 'Callback','close gcf', ...
874 'FontWeight','demi', ...
875 'Position',[0.54032 0.0270256 0.360214 0.0772162], ...
876 'String','Close', ...
877 'Tag','Pushbutton2');
878
879 udata.c_struct.color=[0 1 1];
880
881 tmp.fig1=fig1;
882 set(a,'UserData',tmp);
883 set(udata.fig1,'UserData',udata);
884
885 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
886
887 function dye_nodes(arg)
888
889 % takes care of the action, when radiobuttons are pressed
890 % (or the RGB value is set) in the color_gui -figure.
891 % It also handles the starting of dying nodes and plots.
892
893 udata=get(gcf,'UserData');
894 udata=get(udata.fig1,'UserData');
895
896
897 switch arg
898 case {'cyan','magenta','yellow','red','green','blue','white','grey'}
899 h=findobj(get(gcf,'Children'),'Style','radiobutton');
900 set(h,'Value',0);
901 set(gcbo,'Value',1);
902 end
903
904
905 switch arg
906 case 'cyan'
907 RGB = [0 1 1];
908 case 'magenta'
909 RGB = [1 0 1];
910 case 'yellow'
911 RGB = [1 1 0];
912 case 'red'
913 RGB = [1 0 0];
914 case 'green'
915 RGB = [0 1 0];
916 case 'blue'
917 RGB = [0 0 1];
918 case 'white'
919 RGB = [1 1 1];
920 case 'grey'
921 RGB = [0.4 0.4 0.4];
922 case 'dye'
923
924 RGB = get(udata.c_struct.RGB,'String');
925 if isempty(RGB)
926 dye;
927 return;
928 else
929 str1='The value of RGB must be vector containing three scalars';
930 str2='between 0 and 1.';
931 color = str2num(RGB);
932 set(udata.c_struct.RGB,'String','');
933 if isempty(color)
934 close gcf;
935 udata=rmfield(udata,'c_struct');
936 set(udata.fig1,'UserData',udata);
937 errordlg([{str1};{str2}]);
938 return;
939 end
940 if ~all([1 3] == size(color)) & ~all([3 1] == size(color))
941 close gcf;
942 errordlg([{str1};{str2}]);
943 udata=rmfield(udata,'c_struct',udata);
944 set(udata.fig1,'UserData',udata);
945 return;
946 end
947 if ~isempty(cat(2,find(color>1),find(color<0)))
948 close gcf
949 errordlg([{str1};{str2}]);
950 udata=rmfield(udata,'c_struct',udata);
951 set(udata.fig1,'UserData',udata);
952 return;
953 end
954 udata.c_struct.color=color;
955 set(udata.fig1,'UserData',udata);
956 dye;
957 return;
958 end
959 end
960
961 udata.c_struct.color=RGB;
962 set(udata.fig1,'UserData',udata);
963
964 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
965
966 function dye()
967
968 % dyes black markers in the component planes and in the data figures
969
970 udata=get(gcf,'UserData');
971 udata=get(udata.fig1,'UserData');
972
973 inds=unique([udata.all_marks ; udata.new_marks]);
974
975
976 for i=1:length(udata.d_mark);
977 for j=1:length(udata.d_mark(i).h)
978 if all(get(udata.d_mark(i).h(j),'Color') == [0 0 0])
979 set(udata.d_mark(i).h(j),'Color',udata.c_struct.color);
980 end
981 end
982 end
983
984 if ~isempty(udata.fig2);
985 for i=1:length(udata.d_mark2)
986 for j=1:length(udata.d_mark2(i).h)
987 if all(get(udata.d_mark2(i).h(j),'Color') == [0 0 0])
988 set(udata.d_mark2(i).h(j),'Color',udata.c_struct.color);
989 end
990 end
991 end
992 end
993
994
995 for i=1:length(udata.a_h)
996 col=get(udata.tmp_patch(i),'FaceVertexCData');
997 for j=1:length(udata.new_marks)
998 col(udata.bmus(udata.new_marks(j)),:)=udata.c_struct.color;
999 end
1000 set(udata.tmp_patch(i),'FaceVertexCData',col);
1001 end
1002
1003
1004 udata.all_marks=unique([udata.all_marks;udata.new_marks]);
1005 udata.new_marks=[];
1006 close gcf;
1007 udata=rmfield(udata,'c_struct');
1008 set(udata.fig1,'UserData',udata);
1009
1010 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1011
1012 function clear_markers()
1013
1014 % removes markers from the componentplanes and the data figure(s).
1015
1016 udata=get(gcf,'UserData');
1017 udata=get(udata.fig1,'UserData');
1018
1019 for i=1:length(udata.d_mark)
1020 delete(udata.d_mark(i).h);
1021 udata.d_mark(i).h=[];
1022 end
1023
1024 for i=1:length(udata.d_mark2)
1025 delete(udata.d_mark2(i).h);
1026 udata.d_mark2(i).h=[];
1027 end
1028
1029 col=NaN*get(udata.tmp_patch(1),'FaceVertexCData');
1030 col=reshape(col,[size(col,1) 3]);
1031
1032 for i=1:length(udata.tmp_patch)
1033 set(udata.tmp_patch(i),'FaceVertexCData',col);
1034 end
1035
1036 udata.new_marks=[];
1037 udata.all_marks=[];
1038
1039
1040 if any(strcmp('c_struct',fieldnames(udata)))
1041 udata=rmfield(udata,'c_struct');
1042 end
1043
1044 set(udata.fig1,'UserData',udata);
1045
1046 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1047
1048 function key_bdf
1049
1050 % moves trajectory and pointer lines, when either of
1051 % the keys '>' or '<' is pressed.
1052
1053 udata=get(gcf,'UserData');
1054 udata=get(udata.fig1,'UserData');
1055
1056 key=get(gcbo,'CurrentCharacter');
1057
1058 % The easiest way to get a new coordinates is to get them from the texts...
1059 % The texts are either '<- x' or 'x ->'
1060
1061 x=get(udata.text1(1),'String');
1062 x=str2num(x(4:length(x)));
1063
1064 if isempty(x)
1065 x=get(udata.text1(1),'String');
1066 x=str2num(x(1:length(x)-3));
1067 end
1068
1069 switch(key)
1070 case '<'
1071 if x ~= 1
1072 x= x-1;
1073 end
1074 case '>'
1075 if x ~= getfield(get(get(udata.text1(1),'Parent'),'XLim'),{2})
1076 x = x+1;
1077 end
1078 otherwise
1079 return;
1080 end
1081
1082 set(udata.l,'XData',[x x]);
1083 if ~isempty(udata.fig2)
1084 set(udata.l2,'XData',[x x]);
1085 end
1086
1087 delete(udata.text1);
1088 delete(udata.text2);
1089
1090 set_numbers(x);
1091 draw_traj(x);
1092
1093 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1094
1095 function click()
1096
1097
1098 switch get(gcf,'SelectionType')
1099 case 'open'
1100 return;
1101 case {'normal','alt'}
1102 draw_poly;
1103 case 'extend'
1104 click_node;
1105 end
1106
1107 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1108
1109 function click_node()
1110
1111 % takes care of the action, when the middle mouse button is
1112 % pressed (mouse pointer is above some component plane).
1113
1114 udata=get(gcf,'UserData');
1115 udata=get(udata.fig1,'UserData');
1116 new_marks=[];
1117
1118 old=gcf;
1119
1120 NEW=0;
1121 AGAIN = 0;
1122
1123
1124 coords=get(gca,'CurrentPoint');
1125 row=round(coords(1,2));
1126
1127 if strcmp(udata.lattice,'hexa') & ~mod(row,2)
1128 col = round(coords(1,1) - 0.5);
1129 else
1130 col = round(coords(1,1));
1131 end
1132
1133 ind = sub2ind(udata.msize,row,col);
1134 new_marks=find(udata.bmus==ind);
1135
1136 if strcmp(get(gcbo,'Tag'),'TmpPatch');
1137
1138 % if the callback is made via temporary patch object, node is marked
1139 % (node is black) => the mark is to be removed
1140
1141 node_color = getfield(get(gcbo,'FaceVertexCData'),{ind,[1:3]});
1142 AGAIN = 1;
1143 end
1144
1145
1146
1147 for i=1:length(udata.tmp_patch)
1148 color = get(udata.tmp_patch(i),'FaceVertexCData');
1149 if length(size(color)) ~= 2
1150 color = reshape(color,[size(color,1) 3]);
1151 end
1152 if all(isnan(color(ind,:)))
1153 NEW=1;
1154 color(ind,:)=[0 0 0];
1155 else
1156 color(ind,:)=[NaN NaN NaN];
1157 end
1158 set(udata.tmp_patch(i),'FaceVertexCData',color);
1159 end
1160
1161 set(0,'CurrentFigure',udata.fig1);
1162
1163 for j=1:length(udata.h)
1164 subplot(udata.h(j));
1165 if NEW
1166 y=getfield(get(udata.d(j),'YData'),{new_marks});
1167 udata.d_mark(j).h=[udata.d_mark(j).h;plot(new_marks,y,'Color',[0 0 0],...
1168 'LineStyle','none',...
1169 'Marker','o')];
1170 end
1171 end
1172
1173
1174 if ~isempty(udata.fig2)
1175 set(0,'CurrentFigure',udata.fig2);
1176 for j=1:length(udata.h2);
1177 subplot(udata.h2(j));
1178 if NEW
1179 y=getfield(get(udata.d2(j),'YData'),{new_marks});
1180 udata.d_mark2(j).h=[udata.d_mark2(j).h;plot(new_marks,y,...
1181 'LineStyle','none',...
1182 'Color','black',...
1183 'Marker','o')];
1184 end
1185 end
1186 end
1187
1188 if NEW
1189 udata.new_marks=[udata.new_marks; new_marks];
1190 end
1191
1192 if AGAIN
1193
1194 % find marks from the data that map to the clicked node. if the color
1195 % of the mark(s) is the same as the node's color, remove mark(s), else
1196 % let mark be unchanged.
1197
1198 for i=1:length(udata.d_mark(1).h)
1199 if all(node_color==get(udata.d_mark(1).h(i),'Color'))
1200 tmp1 = get(udata.d_mark(1).h(i),'XData');
1201 tmp2 = setdiff(tmp1,new_marks);
1202 if length(tmp1) ~= length(tmp2)
1203 inds=[];
1204 for j=1:length(tmp2);
1205 inds=[inds find(tmp2(j)==tmp1)];
1206 end
1207 for j=1:length(udata.d_mark)
1208 ydata=getfield(get(udata.d_mark(j).h(i),'YData'),{inds});
1209 set(udata.d_mark(j).h(i),'XData',tmp2,'YData',ydata);
1210 end
1211 if ~isempty(udata.fig2)
1212 for j=1:length(udata.d_mark2)
1213 ydata=getfield(get(udata.d_mark2(j).h(i),'YData'),{inds});
1214 set(udata.d_mark2(j).h(i),'XData',tmp2,'YData',ydata);
1215 end
1216 end
1217 end
1218 end
1219 end
1220 udata.new_marks=setdiff(udata.new_marks, new_marks);
1221 udata.all_marks=setdiff(udata.all_marks,new_marks);
1222 end
1223
1224 set(udata.fig1,'UserData',udata);
1225 set(0,'CurrentFigure',old);
1226
1227 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1228
1229 function draw_poly()
1230
1231 udata=get(gcf,'UserData');
1232 udata=get(udata.fig1,'UserData');
1233
1234 if isempty(udata.poly.x)
1235 if strcmp(get(gcf,'SelectionType'),'alt')
1236 return;
1237 end
1238 udata.poly.THIS = gca;
1239 end
1240
1241 % 'THIS' indicates what was the axes where the polygon was meant to
1242 % drawn. It is not possible to add points, that lie in another axes, to the
1243 % polygon.
1244
1245
1246 if gca ~= udata.poly.THIS
1247 return;
1248 end
1249
1250 coords(1,1) = getfield(get(gca,'CurrentPoint'),{3});
1251 coords(1,2) = getfield(get(gca,'CurrentPoint'),{1});
1252
1253 udata.poly.x=cat(1,udata.poly.x,coords(2));
1254 udata.poly.y=cat(1,udata.poly.y,coords(1));
1255
1256 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1257 % remove old 'polygon' from axis
1258
1259 delete(udata.poly.h);
1260
1261
1262 switch get(gcf,'SelectionType')
1263 case 'normal'
1264
1265 % add point to the 'polygon' and draw it
1266
1267 for i=1:length(udata.a_h)
1268 subplot(udata.a_h(i));
1269 hold on;
1270 udata.poly.h(i) = plot(udata.poly.x,udata.poly.y,'black',...
1271 'EraseMode','xor',...
1272 'ButtonDownFcn',...
1273 'vis_trajgui([],''click'')',...
1274 'LineWidth',2);
1275 end
1276 case 'alt'
1277
1278 % The polygon is ready.
1279
1280
1281 udata.poly.x=cat(1,udata.poly.x,udata.poly.x(1));
1282 udata.poly.y=cat(1,udata.poly.y,udata.poly.y(1));
1283
1284 for i=1:length(udata.a_h)
1285 subplot(udata.a_h(i));
1286 udata.poly.h(i) = plot(udata.poly.x,udata.poly.y,'black',...
1287 'EraseMode','xor',...
1288 'ButtonDownFcn',...
1289 'vis_trajgui([],''click'')',...
1290 'LineWidth',2);
1291 end
1292
1293 tmp=sort(repmat((1:udata.msize(1))',udata.msize(2),1));
1294 tmp(:,2)=repmat((1:udata.msize(2))',udata.msize(1),1);
1295 tmp2=tmp;
1296 if strcmp(udata.lattice,'hexa');
1297 t=find(~rem(tmp(:,1),2));
1298 tmp(t,2)=tmp(t,2)+0.5;
1299 end
1300
1301
1302 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1303 % find the nodes that lie inside polygon and change coordinates to
1304 % linear indices.
1305
1306 in = find(inpolygon(tmp(:,2),tmp(:,1),udata.poly.x,udata.poly.y));
1307 in = sub2ind(udata.msize,tmp2(in,1),tmp2(in,2));
1308
1309 colors=get(udata.tmp_patch(1),'FaceVertexCData');
1310 colors=reshape(colors,[size(colors,1) 3]);
1311 tmp=ones(length(in),1);
1312
1313 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1314 % set the color of the nodes just selected, black.
1315
1316 colors(in,:)=tmp*[0 0 0];
1317 set(udata.tmp_patch,'FaceVertexCData',colors);
1318
1319 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1320 % find the points mapping to the nodes from data
1321
1322 inds = [];
1323 for i=1:length(in)
1324 inds=[inds;find(in(i) == udata.bmus)];
1325 end
1326
1327 %%%%%%%%%%%%%%%%%%%
1328 % plot marks to data
1329
1330 set(udata.fig1,'UserData',udata);
1331 plot2data(inds);
1332 udata=get(udata.fig1,'UserData');
1333 udata.new_marks=union(udata.new_marks,inds);
1334 delete(udata.poly.h);
1335 udata.poly.h=[];
1336 udata.poly.x=[];
1337 udata.poly.y=[];
1338 udata.poly.THIS=[];
1339 end
1340
1341 set(udata.fig1,'UserData',udata);
1342
1343 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1344
1345 function save_data()
1346
1347 udata=get(gcf,'UserData');
1348 udata=get(udata.fig1,'UserData');
1349
1350 data.points=[];
1351 data.nodes=[];
1352 k=1;
1353
1354 for i=1:length(udata.d_mark(1).h)
1355 data.points(i).inds=get(udata.d_mark(1).h(i),'XData');
1356 data.points(i).color=get(udata.d_mark(1).h(i),'Color');
1357 end
1358
1359 color=get(udata.tmp_patch(1),'FaceVertexCData');
1360 color=reshape(color,[size(color,1) 3]);
1361
1362 for i=1:size(color,1)
1363 if all(~isnan(color(i,:)))
1364 tmp.ind=i;
1365 tmp.color=color(i,:);
1366 data.nodes(k)=tmp;
1367 k=k+1;
1368 end
1369 end
1370
1371 answer=inputdlg('Enter the name of the output variable:','',1);
1372
1373 if isempty(answer) | isempty(answer{1})
1374 msgbox('Output is not set to workspace.');
1375 return;
1376 else
1377 assignin('base',answer{1},data);
1378 disp(sprintf('Struct is set to the workspace as ''%s''.',answer{1}));
1379 end
1380
1381 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1382
1383 function load_data()
1384
1385 answer = inputdlg('Enter the name of the struct to be loaded:','',1);
1386
1387 if isempty(answer) | isempty(answer{1})
1388 msgbox('Data is not loaded.');
1389 return;
1390 end
1391
1392 data=evalin('base',answer{1});
1393
1394 if ~isstruct(data)
1395 errordlg('Input variable must be a struct.');
1396 return;
1397 end
1398
1399 tmp1 = fieldnames(data);
1400 tmp2 = {'nodes','points'};
1401
1402 for i=1:length(tmp1)
1403 for j=1:length(tmp2);
1404 if ~any(strcmp(tmp2{j},tmp1))
1405 errordlg('Wrong type of struct.');
1406 return;
1407 end
1408 end
1409 end
1410
1411 if ~isempty(data.points)
1412 tmp1=fieldnames(data.points(1));
1413 end
1414 if ~isempty(data.nodes)
1415 tmp2=fieldnames(data.nodes(1));
1416 end
1417
1418 for i=1:length(tmp1)
1419 if ~any(strcmp(tmp1{i},{'inds','color'}))
1420 errordlg('Wrong type of struct.');
1421 return;
1422 end
1423 end
1424
1425 for i=1:length(tmp2)
1426 if ~any(strcmp(tmp2{i},{'ind','color'}))
1427 errordlg('Wrong type of struct.');
1428 return;
1429 end
1430 end
1431
1432 udata=get(gcf,'UserData');
1433 udata=get(udata.fig1,'UserData');
1434
1435 clear_markers;
1436 remove_traj;
1437
1438 old = gcf;
1439
1440 for i=1:length(data.points)
1441 for j=1:length(udata.h);
1442 set(0,'CurrentFigure',udata.fig1);
1443 subplot(udata.h(j));
1444 ydata=getfield(get(udata.d(j),'YData'),{data.points(i).inds});
1445 udata.d_mark(j).h=[udata.d_mark(j).h;...
1446 plot(data.points(i).inds,ydata,...
1447 'Color',data.points(i).color,...
1448 'LineStyle','none',...
1449 'Marker','o',...
1450 'ButtonDownFcn',...
1451 'vis_trajgui([],''line_down'')')];
1452 if all(data.points(i).color == [0 0 0])
1453 udata.new_marks=unique([udata.new_marks; (data.points(i).inds)']);
1454 else
1455 udata.all_marks=unique([udata.all_marks; (data.points(i).inds)']);
1456 end
1457 end
1458 if ~isempty(udata.fig2)
1459 set(0,'CurrentFigure',udata.fig2);
1460 for j=1:length(udata.h2)
1461 subplot(udata.h2(j));
1462 ydata=getfield(get(udata.d2(j),'YData'),{data.points(i).inds});
1463 udata.d_mark2(j).h=[udata.d_mark2(j).h;...
1464 plot(data.points(i).inds,ydata,...
1465 'Color',data.points(i).color,...
1466 'LineStyle','none',...
1467 'Marker','o',...
1468 'ButtonDownFcn',...
1469 'vis_trajgui([],''line_down'')')];
1470 end
1471 end
1472 end
1473
1474
1475 set(0,'CurrentFigure',udata.sM_h);
1476 color=get(udata.tmp_patch(1),'FaceVertexCData');
1477 color=reshape(color,[size(color,1) 3]);
1478 for i=1:length(data.nodes)
1479 color(data.nodes(i).ind,:)=data.nodes(i).color;
1480 end
1481 for i=1:length(udata.tmp_patch);
1482 set(udata.tmp_patch(i),'FaceVertexCData',color);
1483 end
1484
1485 set(0,'CurrentFigure',old);
1486 set(udata.fig1,'UserData',udata);
1487
1488 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1489
1490 function fuzzy_traj(trajStruct,arg);
1491 %function fuzzy_traj(sM_h,sM,sD,interval,arg)
1492
1493
1494 if isempty(arg)
1495
1496 if strcmp(trajStruct.lattice,'hexa')
1497 udata.lattice='hexa';
1498 udata.form=vis_patch('hexa');
1499 else
1500 data.lattice='rect';
1501 udata.form=vis_patch('rect');
1502 end
1503
1504 % interval=[1 size(trajStruct.primary_data,1)];
1505
1506 l=size(udata.form,1);
1507 dim = size(trajStruct.primary_data,2);
1508 udata.a_h=[findobj(get(trajStruct.figure,'Children'),'Tag','Uplane');...
1509 findobj(get(trajStruct.figure,'Children'),'Tag','Cplane')];
1510
1511 udata.sM_h=trajStruct.figure;
1512 udata.msize=trajStruct.msize;
1513
1514 %%%%%%%%%%%%%%%
1515 %
1516 % constructing patch that is drawn above every plane in map
1517 %
1518
1519 nx = repmat(udata.form(:,1),1,prod(udata.msize));
1520 ny = repmat(udata.form(:,2),1,prod(udata.msize));
1521
1522 x_c=reshape(repmat(1:udata.msize(2),l*udata.msize(1),1),l,prod(udata.msize));
1523 y_c=repmat(repmat(1:udata.msize(1),l,1),1,udata.msize(2));
1524
1525 if strcmp(udata.lattice,'hexa')
1526 t = find(~rem(y_c(1,:),2));
1527 x_c(:,t)=x_c(:,t)+.5;
1528 end
1529
1530 x_c=x_c+nx;
1531 y_c=y_c+ny;
1532
1533 udata.orig_c=ones(prod(udata.msize),1)*[NaN NaN NaN];
1534 colors=reshape(udata.orig_c,[1 size(udata.orig_c,1) 3]);
1535 set(0,'CurrentFigure',trajStruct.figure);
1536
1537 %%%%%%%%%
1538 % drawing
1539
1540 for i=1:length(udata.a_h);
1541 subplot(udata.a_h(i));
1542 v=caxis;
1543 udata.patch_h(i) =patch(x_c,y_c,colors,'EdgeColor','none');
1544 caxis(v);
1545 end
1546
1547
1548 udata.orig_x=get(udata.patch_h(1),'XData');
1549 udata.orig_y=get(udata.patch_h(1),'YData');
1550
1551 % if interval(1) < 1 | interval(2) > size(trajStruct.primary_data,1)
1552 % error('Invalid argument ''interval''.');
1553 % end
1554
1555 x=1:size(trajStruct.primary_data,1);
1556 udata.fig1=figure;
1557 set(udata.fig1,'KeyPressFcn',...
1558 'vis_trajgui([],''move_fuzzy'')');
1559 for i=1:size(trajStruct.primary_data,2)
1560 subplot(size(trajStruct.primary_data,2),1,i);
1561 udata.h(i)=gca;
1562 set(udata.h(1),'XTick',[]);
1563 udata.d(i)=plot(x,trajStruct.primary_data(:,i));
1564 l_x=1;
1565 lims(1) = round(min(trajStruct.primary_data(:,i)));
1566 lims(2) = round(max(trajStruct.primary_data(:,i)));
1567 udata.l(i) = line([l_x l_x],lims,'Color','red','EraseMode','xor');
1568 end
1569
1570 udata.l_x = l_x;
1571 udata.interval=[1 size(trajStruct.bmus,2)];
1572
1573 tmp.fig1=udata.fig1;
1574 % [K,P] = estimate_kernels(sM,sD);
1575 % udata.K=K;
1576 % udata.P=P;
1577 % udata.codebook=sM.codebook;
1578 % udata.data=sD.data;
1579 udata.bmus=trajStruct.bmus;
1580 set(udata.fig1,'UserData',udata);
1581 set(trajStruct.figure,'UserData',tmp);
1582 draw_fuzzy(l_x);
1583 return;
1584 end
1585
1586 move_fuzzy;
1587
1588 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1589
1590 function draw_fuzzy(x)
1591
1592 udata=get(gcf,'UserData');
1593 udata=get(udata.fig1,'UserData');
1594
1595 inds = find(udata.bmus(:,x));
1596 [row col] = ind2sub(udata.msize,inds);
1597 if strcmp(udata.lattice,'hexa')
1598 t=find(~mod(row,2));
1599 col(t)=col(t)+0.5;
1600 end
1601
1602 color=udata.orig_c;
1603 color=reshape(color,[size(color,1) 3]);
1604 xdata=udata.orig_x;
1605 ydata=udata.orig_y;
1606 tmp= ones(size(xdata(:,1),1),1)*udata.bmus(inds,x)';
1607 color(inds,:) = ones(length(inds),1)*[0 0 0];
1608 xdata(:,inds) = udata.form(:,1)*ones(1,length(inds)).*tmp+ones(6,1)*col';
1609 ydata(:,inds) = udata.form(:,2)*ones(1,length(inds)).*tmp+ones(6,1)*row';
1610
1611 set(udata.patch_h,'FaceVertexCData',color,'XData',xdata,'YData',ydata);
1612
1613 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1614
1615 function move_fuzzy
1616
1617 % moves pointer lines and draws fuzzy response.
1618
1619 udata=get(gcf,'UserData');
1620 udata=get(udata.fig1,'UserData');
1621
1622 switch get(gcf,'CurrentCharacter');
1623 case {'<','>'}
1624 key = get(gcf,'CurrentCharacter');
1625 if key == '>'
1626 if udata.l_x + 1 > udata.interval(2)
1627 return;
1628 end
1629 l_x = udata.l_x + 1;
1630 else
1631 if udata.l_x - 1 < udata.interval(1)
1632 return;
1633 end
1634 l_x = udata.l_x - 1;
1635 end
1636 draw_fuzzy(l_x);
1637 set(udata.l,'XData',[l_x l_x]);
1638 udata.l_x=l_x;
1639 set(udata.fig1,'UserData',udata);
1640 otherwise
1641 return;
1642 end
1643
1644 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1645
1646
1647