Browse code

starting som prediction fine-tuned class-performance visualisation

git-svn-id: https://svn.discofish.de/MATLAB/spmtoolbox/SVMCrossVal@112 83ab2cfd-5345-466c-8aeb-2b2739fb922d

Christoph Budziszewski authored on21/01/2009 16:34:25
Showing1 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,716 @@
1
+function varargout=som_select(c_vect,plane_h,arg)
2
+
3
+%SOM_SELECT  Manual selection of map units from a visualization.
4
+%
5
+% som_select(c_vect,[plane_h])
6
+%     
7
+%   som_select(3)
8
+%   som_select(sM.labels(:,1))
9
+%
10
+%  Input arguments ([]'s are optional):
11
+%   c_vect    (scalar) number of classes 
12
+%             (vector) initial class identifiers
13
+%             (cell array) of strings, class names
14
+%             (matrix) size * x 3, the color of each class
15
+%   [plane_h] (scalar) handle of the plane (axes) to be marked. 
16
+%                      By default, the current axes is used (GCA).
17
+%                      For the function to work, the plot in the 
18
+%                      axes must have been created with the
19
+%                      SOM_CPLANE function (or SOM_SHOW).
20
+% 
21
+% Launches a GUI which allows user to select nodes from plane by 
22
+% clicking them or by choosing a region (a polygon). 
23
+% 
24
+%   Middle mouse button: selects (or clears selection of) a single node
25
+%   Left mouse button:   lets user draw a polygon
26
+%   Right mouse button:  selects (or clears selection of) the units 
27
+%                        inside the polygon
28
+% 
29
+% From the GUI, the color (class) is selected as well as whether
30
+% but buttons select or clear the selection from the units. The
31
+% buttons on the bottom have the following actions: 
32
+% 
33
+%   'OK'    Assigns the class identifiers to the 'ans' variable in 
34
+%           workspace. The value is an array of class identifiers: 
35
+%           strings (cellstr) if the c_vect was an array of
36
+%           strings, a vector otherwise.
37
+%   'Clear' Removes marks from the plane.
38
+%   'Close' Closes the application. 
39
+%
40
+% See also SOM_SHOW, SOM_CPLANE.
41
+
42
+% Contributed to SOM Toolbox vs2, February 2nd, 2000 by Juha Parhankangas 
43
+% Copyright (c) by Juha Parhankangas
44
+% http://www.cis.hut.fi/projects/somtoolbox/
45
+
46
+% Juha Parhankangas 050100, juuso 010200
47
+
48
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
49
+%% input arguments
50
+
51
+if nargin < 2, plane_h = gca; end
52
+if(isempty(gcbo)), arg='start'; end
53
+
54
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
55
+%% action
56
+
57
+switch arg
58
+ case 'start'
59
+  patch_h=find_patch(plane_h);
60
+  lattice=getfield(size(get(patch_h,'XData')),{1});
61
+  msize(1)=floor(getfield(get(plane_h,'YLim'),{2})); 
62
+  msize(2)=floor(getfield(get(plane_h,'XLim'),{2})-0.5);   
63
+  if lattice==6
64
+    lattice='hexa';
65
+  else
66
+    lattice='rect';
67
+  end
68
+  
69
+  if any(strcmp(get(patch_h,'Tag'),{'planeBar','planePie'}))
70
+    tmp_dim=size(get(patch_h,'XData'),2)/prod(msize);
71
+    tmp_xdata=get(patch_h,'XData');
72
+    tmp_x=tmp_xdata(:,(msize(1)*(msize(2)-1)+2)*tmp_dim);
73
+    if floor(tmp_x(1)) ~= round(tmp_x(1))
74
+      lattice = 'hexa';
75
+    else
76
+      lattice = 'rect';
77
+    end
78
+  elseif strcmp(get(patch_h,'Tag'),'planePlot')
79
+    tmp_lines_h=get(gca,'Children');
80
+    test_x=mean(get(tmp_lines_h(2),'XData'));
81
+    if round(test_x) ~= floor(test_x)
82
+      lattice = 'hexa';
83
+    else
84
+      lattice = 'rect';
85
+    end
86
+    form=0.5*vis_patch('hexa');
87
+    l = size(form,1);
88
+    
89
+    nx = repmat(form(:,1),1,prod(msize));
90
+    ny = repmat(form(:,2),1,prod(msize));
91
+    
92
+    x=reshape(repmat(1:msize(2),l*msize(1),1),l,prod(msize));
93
+    y=repmat(repmat(1:msize(1),l,1),1,msize(2));
94
+    
95
+    if strcmp(lattice,'hexa')
96
+      t = find(~rem(y(1,:),2));
97
+      x(:,t)=x(:,t)+.5;
98
+    end
99
+    x=x+nx;
100
+    y=y+ny;
101
+    
102
+    colors=reshape(ones(prod(msize),1)*[NaN NaN NaN],...
103
+		   [1 prod(msize) 3]);
104
+    v=caxis;
105
+    patch_h=patch(x,y,colors,...
106
+		  'EdgeColor','none',...
107
+		  'ButtonDownFcn',...
108
+		  'som_select([],[],''click'')',...
109
+		  'Tag','planePlot');
110
+    set([gca gcf],'ButtonDownFcn','som_select([],[],''click'')');
111
+    caxis(v)
112
+  end
113
+
114
+  c_colors = []; 
115
+  if iscell(c_vect)
116
+    [c_vect,c_names,c_classes]=class2num(c_vect);
117
+    if length(c_classes)<prod(msize), 
118
+      c_classes = zeros(prod(msize),1);
119
+    end
120
+  else
121
+    if all(size(c_vect)>1), 
122
+      c_colors = c_vect; 
123
+      c_names = 1:size(c_vect,1); 
124
+      c_vect = size(c_vect,1); 
125
+      c_classes = zeros(prod(msize),1);
126
+    elseif length(c_vect)==prod(msize),
127
+      c_classes = c_vect;
128
+      u = unique(c_classes(isfinite(c_classes) & c_classes>0));
129
+      c_names = u;
130
+      c_vect = length(u);       
131
+    elseif length(c_vect)>1, 
132
+      c_names = c_vect; 
133
+      c_vect = length(c_vect);
134
+      c_classes = zeros(prod(msize),1);
135
+    elseif length(c_vect)==1,
136
+      c_names = 1:c_vect;        
137
+      c_classes = zeros(prod(msize),1);
138
+    end
139
+  end
140
+  
141
+  udata.lattice=lattice;
142
+  udata.patch_h=patch_h;
143
+  udata.plane_h=plane_h;
144
+  udata.type=get(udata.patch_h,'Tag');
145
+  udata.msize=msize;
146
+  set(patch_h,'UserData',udata);
147
+  if strcmp(udata.type,'planePlot')
148
+    set([gca gcf],'UserData',udata);
149
+  end
150
+  str=cat(2,'som_select([],[],''click'')');
151
+  set(patch_h,'ButtonDownFcn',str);
152
+
153
+  draw_colorselection(c_names,c_colors);
154
+  tmp_data=findobj(get(0,'Children'),'Tag','SELECT_GUI');
155
+  tmp_data=get(tmp_data,'UserData');
156
+  tmp_data.c_names=c_names;
157
+  tmp_data.mat=reshape(c_classes,msize);
158
+  tmp_data.patch_h=patch_h;
159
+  tmp_data.plane_h=plane_h;
160
+  tmp_data.type=get(udata.patch_h,'Tag');
161
+  tmp_data.lattice=lattice;
162
+  tmp_data.coords=[];
163
+  tmp_data.poly_h=[];
164
+  tmp_data.msize=msize;
165
+  tmp_data.mode='select';  
166
+  set(tmp_data.fig_h,'UserData',tmp_data);   
167
+  draw_classes;
168
+  
169
+ case 'click'
170
+  switch get(gcf,'SelectionType')
171
+   case 'open'
172
+    return;
173
+   case {'normal','alt'}
174
+    draw_poly;
175
+   case 'extend'
176
+    click;
177
+  end 
178
+ case 'choose'
179
+  draw_colorselection(0,0,'choose');
180
+ case 'close'
181
+  close_gui;
182
+ case 'clear'
183
+  clear_plane;
184
+ case 'rb'
185
+  rb_control;
186
+ case 'ret_mat'
187
+  gui=findobj(get(0,'Children'),'Tag','SELECT_GUI');
188
+  gui=get(gui,'UserData');
189
+  mat=reshape(gui.mat,prod(size(gui.mat)),1);
190
+  if ~isempty(gui.c_names)
191
+    if isnumeric(gui.c_names), tmp=zeros(length(mat),1);
192
+    else tmp=cell(length(mat),1);
193
+    end
194
+    for i=1:length(gui.c_names)
195
+      inds=find(mat==i);
196
+      tmp(inds)=gui.c_names(i);
197
+    end       
198
+    mat=tmp;
199
+  end  
200
+  varargout{1}=mat;
201
+  %gui.mat=zeros(size(gui.mat));
202
+  %set(gui.fig_h,'UserData',gui);
203
+  %h=findobj(get(gui.plane_h,'Children'),'Tag','SEL_PATCH');
204
+  %delete(h);
205
+end  
206
+
207
+return;
208
+
209
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
210
+%% subfunctions
211
+
212
+function rb_control;
213
+
214
+h=findobj(get(gcf,'Children'),'Style','radiobutton');
215
+set(h,'Value',0);
216
+set(gcbo,'Value',1);
217
+
218
+udata=get(gcf,'UserData');
219
+if strcmp(get(gcbo,'Tag'),'Radiobutton1')
220
+  udata.mode='select';
221
+else
222
+  udata.mode='clear';
223
+end
224
+
225
+set(gcf,'UserData',udata);
226
+
227
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
228
+
229
+function clear_plane
230
+
231
+h=findobj(get(0,'Children'),'Tag','SELECT_GUI');
232
+gui=get(h,'UserData');
233
+
234
+if strcmp(get(gui.patch_h,'Tag'),'planePlot')
235
+  colors=reshape(get(gui.patch_h,'FaceVertexCData'),[prod(gui.msize) 3]);
236
+  colors(:,:)=NaN;
237
+  set(gui.patch_h,'FaceVertexCData',colors);
238
+end
239
+
240
+h=findobj(get(gui.plane_h,'Children'),'Tag','SEL_PATCH');
241
+gui.mat=zeros(gui.msize);
242
+set(gui.fig_h,'UserData',gui);
243
+delete(h);
244
+
245
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
246
+
247
+function click
248
+
249
+udata=get(gcbo,'UserData');
250
+
251
+udata=get(udata.patch_h,'UserData');  
252
+coords=get(gca,'CurrentPoint');
253
+row=round(coords(1,2));
254
+if row > udata.msize(1), row = udata.msize(1); end
255
+if row < 1, row = 1; end
256
+if any(strcmp(udata.lattice,{'hexa','hexaU'})) & ~mod(row,2), 
257
+  col=floor(coords(1,1))+0.5;
258
+  if col > udata.msize(2)+0.5, col=udata.msize(2)+0.5; end
259
+else
260
+  col=round(coords(1,1));
261
+  if col > udata.msize(2), col=udata.msize(2); end
262
+end
263
+if col < 1, col = 1; end
264
+
265
+if strcmp(udata.type,'planePlot')
266
+
267
+  if ~mod(row,2) & strcmp(udata.lattice,'hexa'), col=round(col-0.5); end
268
+  
269
+  ind=sub2ind(udata.msize,row,col);
270
+  colors=reshape(get(udata.patch_h,'FaceVertexCData'),[prod(udata.msize) 3]);
271
+  gui=findobj(get(0,'Children'),'Tag','SELECT_GUI');
272
+  gui=get(gui,'UserData');
273
+  
274
+  if ~isempty(gui.curr_col) & all(~isnan(colors(ind,1,:))),
275
+    if ~strcmp(gui.mode,'clear') & ~all(gui.curr_col == colors(ind,:))
276
+      colors(ind,:)=gui.curr_col;
277
+      gui.mat(row,col)=gui.class;
278
+    else
279
+      colors(ind,:)=[NaN NaN NaN];
280
+      gui.mat(row,col)=0;
281
+    end
282
+  elseif strcmp(gui.mode,'clear')
283
+    colors(ind,:)=[NaN NaN NaN];
284
+    gui.mat(row,col)=0;
285
+  elseif isempty(gui.curr_col)
286
+    return;
287
+  else
288
+    gui.mat(row,col)=gui.class;
289
+    colors(ind,:)=gui.curr_col;
290
+  end
291
+  set(udata.patch_h,'FaceVertexCData',colors);
292
+  set(gui.fig_h,'UserData',gui);
293
+  return;
294
+end  
295
+
296
+if any(strcmp(udata.type,{'planePie','planeBar'}))
297
+  [x,y]=pol2cart(0:0.1:2*pi,0.5);
298
+  coords=[x';0.5]*0.7;
299
+  coords(:,2)=[y';0]*0.7;
300
+elseif strcmp(udata.lattice,'hexa');
301
+  coords=0.7*vis_patch('hexa');
302
+else
303
+  coords=0.7*vis_patch('rect');
304
+end
305
+coords(:,1)=coords(:,1)+col;
306
+coords(:,2)=coords(:,2)+row;
307
+if ~mod(row,2) & strcmp(udata.lattice,'hexa'), col=round(col-0.5); end
308
+ 
309
+hold on;
310
+if gco == udata.patch_h
311
+  gui=findobj(get(0,'Children'),'Tag','SELECT_GUI');
312
+  gui=get(gui,'UserData');
313
+  if isnan(gui.curr_col) | strcmp(gui.mode,'clear'), return; end
314
+  h=fill(coords(:,1),coords(:,2),gui.curr_col);
315
+  str=cat(2,'som_select([],[],''click'')');
316
+  set(h,'ButtonDownFcn',str,'Tag','SEL_PATCH');
317
+  tmp.patch_h=udata.patch_h;
318
+  set(h,'UserData',tmp);
319
+  gui.mat(row,col)=gui.class;
320
+  set(gui.fig_h,'UserData',gui);
321
+else
322
+  gui=findobj(get(0,'Children'),'Tag','SELECT_GUI');
323
+  gui=get(gui,'UserData');
324
+  if ~all(get(gcbo,'FaceColor') == gui.curr_col) & ~strcmp(gui.mode,'clear'),
325
+    if ~isnan(gui.curr_col), 
326
+      set(gcbo,'FaceColor',gui.curr_col);
327
+      gui.mat(row,col) = gui.class;
328
+    end
329
+  else
330
+    gui.mat(row,col)=0;
331
+    delete(gco);
332
+  end
333
+  set(gui.fig_h,'UserData',gui);
334
+end
335
+
336
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
337
+
338
+function draw_colorselection(varargin)
339
+
340
+if length(varargin)==2, 
341
+
342
+  if length(varargin{1})==1, 
343
+    n = varargin{1};
344
+    names = 1:n;
345
+  else
346
+    n = length(varargin{1}); 
347
+    names = varargin{1}; 
348
+  end
349
+  colors = varargin{2}; 
350
+  
351
+  shape=[0.5 -0.5;0.5 0.5;1.5 0.5;1.5 -0.5];
352
+  rep_x=repmat(shape(:,1),1,n);
353
+  rep_y=repmat(shape(:,2),1,n);
354
+  for i=0:getfield(size(rep_y,2))-1, rep_x(:,i+1)=rep_x(:,i+1)+i; end
355
+  if isempty(colors), colors=jet(n); end
356
+  data=som_select_gui;
357
+  data.colors=colors;
358
+  data.curr_col=NaN;
359
+  data.class=0;
360
+  set(0,'CurrentFigure',data.fig_h);
361
+  hold on;
362
+  tmp=fill(rep_x,rep_y,0.8);
363
+  for i=1:n
364
+    set(tmp(i),...
365
+        'EdgeColor',[0 0 0],...
366
+        'FaceColor',colors(i,:),...
367
+        'ButtonDownFcn','som_select([],0,''choose'');');
368
+  end
369
+  axis('equal');
370
+  axis('on');
371
+  set(gca,'XTick',1:n,'XTickLabel',names,'XAxisLocation','top');
372
+  set(data.a_h,'YLim',[-0.5,0.5],...
373
+	       'XLim',[0.5 n+0.5],...
374
+	       'YTickLabel','');
375
+  set(data.fig_h,'UserData',data);
376
+
377
+elseif strcmp(varargin{3},'choose')
378
+  
379
+  udata=get(gcf,'UserData');
380
+  if strcmp(get(gcbo,'Selected'),'off')
381
+    old=findobj(get(gca,'Children'),'Type','patch');
382
+    set(old,'Selected','off');
383
+    set(gcbo,'Selected','on');
384
+    udata.curr_col=udata.colors(round(mean(get(gcbo,'XData'))),:);
385
+    udata.class=mean(get(gcbo,'XData'));
386
+  else
387
+    set(gcbo,'Selected','off');
388
+    udata.curr_col=NaN;
389
+    udata.class=0;
390
+  end
391
+  set(gcf,'UserData',udata);
392
+
393
+end
394
+
395
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
396
+
397
+function data=som_select_gui()
398
+
399
+
400
+a = figure('Color',[0.8 0.8 0.8], ...
401
+	'PaperType','a4letter', ...
402
+	'Position',[586 584 560 210], ...
403
+	'Tag','SELECT_GUI');
404
+
405
+data.fig_h=a;
406
+
407
+b = axes('Parent',a, ...
408
+	'Box','on', ...
409
+	'CameraUpVector',[0 1 0], ...
410
+	'Color',[1 1 1], ...
411
+	'DataAspectRatioMode','manual', ...
412
+	'PlotBoxAspectRatio',[20 1 2], ...
413
+	'PlotBoxAspectRatioMode','manual', ...
414
+	'Position',[0.13 0.11 0.775 0.815], ...
415
+	'Tag','Axes1', ...
416
+	'WarpToFill','off', ...
417
+	'XColor',[0 0 0], ...
418
+	'XLimMode','manual', ...
419
+	'YColor',[0 0 0], ...
420
+	'YLimMode','manual', ...
421
+	'YTickLabelMode','manual', ...
422
+	'ZColor',[0 0 0]);
423
+
424
+data.a_h=b;
425
+
426
+b = uicontrol('Parent',a, ...
427
+	'Units','points', ...
428
+	'BackgroundColor',[0.701961 0.701961 0.701961], ...
429
+	'Callback','som_select([],[],''close'')', ...
430
+	'FontWeight','demi', ...
431
+	'Position',[150 12 50 20], ...
432
+	'String','CLOSE', ...
433
+	'Tag','Pushbutton1');
434
+
435
+b = uicontrol('Parent',a, ...
436
+	'Units','points', ...
437
+	'BackgroundColor',[0.701961 0.701961 0.701961], ...
438
+        'Callback','som_select([],0,''ret_mat'')',...
439
+	'FontWeight','demi', ...
440
+	'Position',[365 12 50 20], ...
441
+	'String','OK', ...
442
+	'Tag','Pushbutton2');
443
+
444
+b = uicontrol('Parent',a, ...
445
+	'Units','points', ...
446
+	'BackgroundColor',[0.701961 0.701961 0.701961], ...
447
+        'Callback','som_select([],0,''clear'')',...
448
+	'FontWeight','demi', ...
449
+	'Position',[257.5 12 50 20], ...
450
+	'String','CLEAR', ...
451
+	'Tag','Pushbutton3');
452
+
453
+b = uicontrol('Parent',a, ...
454
+        'Units','points', ...
455
+        'Position',[50 27 17 16], ...
456
+        'Callback','som_select([],[],''rb'')',...
457
+        'Style','radiobutton', ...
458
+        'Tag','Radiobutton1', ...
459
+        'Value',1);
460
+b = uicontrol('Parent',a, ...
461
+        'Units','points', ...
462
+        'BackgroundColor',[0.701961 0.701961 0.701961], ...
463
+        'Callback','som_select([],[],''rb'')',...
464
+        'Position',[50 7 17 16], ...
465
+        'Style','radiobutton', ...
466
+        'Tag','Radiobutton2');
467
+b = uicontrol('Parent',a, ...
468
+        'Units','points', ...
469
+        'BackgroundColor',[0.8 0.8 0.8], ...
470
+        'FontSize',9, ...
471
+        'FontWeight','demi', ...
472
+        'HorizontalAlignment','left', ...
473
+        'Position',[72 25 28 15], ...
474
+        'String','Select', ...
475
+        'Style','text', ...
476
+        'Tag','StaticText1');
477
+b = uicontrol('Parent',a, ...
478
+        'Units','points', ...
479
+        'BackgroundColor',[0.8 0.8 0.8], ...
480
+        'FontSize',9, ...
481
+        'FontWeight','demi', ...
482
+        'HorizontalAlignment','left', ...
483
+        'Position',[72 7 25 13.6], ...
484
+        'String','Clear', ...
485
+        'Style','text', ...
486
+        'Tag','StaticText2');
487
+
488
+
489
+
490
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
491
+
492
+function close_gui
493
+
494
+udata=get(get(gcbo,'Parent'),'UserData');
495
+
496
+if strcmp(udata.type,'planePlot');
497
+  set(udata.plane_h,'ButtonDownFcn','','UserData',[]);
498
+  set(get(udata.plane_h,'Parent'),'ButtonDownFcn','');
499
+  delete(udata.patch_h);
500
+  return;
501
+end  
502
+
503
+h=findobj(get(udata.plane_h,'Children'),'Tag','SEL_PATCH');
504
+set(udata.patch_h,'ButtonDownFcn','','UserData',[]);
505
+delete(h);
506
+close(udata.fig_h);
507
+
508
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
509
+
510
+function draw_poly
511
+
512
+udata=get(findobj(get(0,'Children'),'Tag','SELECT_GUI'),'UserData');
513
+
514
+if isempty(udata.coords) & strcmp(get(gcf,'SelectionType'),'alt')
515
+  return;
516
+end
517
+
518
+coords(1,1) = getfield(get(gca,'CurrentPoint'),{3});
519
+coords(1,2) = getfield(get(gca,'CurrentPoint'),{1});
520
+udata.coords = cat(1,udata.coords,coords);
521
+delete(udata.poly_h);
522
+subplot(udata.plane_h);
523
+
524
+hold on;
525
+switch get(gcf,'SelectionType');
526
+ case 'normal'
527
+  udata.poly_h=plot(udata.coords(:,2),udata.coords(:,1),'black',...
528
+		    'ButtonDownFcn','som_select([],[],''click'')',...
529
+		    'LineWidth',2);
530
+  set(udata.fig_h,'UserData',udata);
531
+ case 'alt'
532
+  udata.coords=cat(1,udata.coords,udata.coords(1,:));
533
+  udata.poly_h=plot(udata.coords(:,2),udata.coords(:,1),'black',...
534
+		    'LineWidth',2);
535
+  delete(udata.poly_h);
536
+  if ~isnan(udata.curr_col)
537
+    tmp=sort(repmat((1:udata.msize(1))',udata.msize(2),1));
538
+    tmp(:,2)=repmat((1:udata.msize(2))',udata.msize(1),1);
539
+    tmp2=tmp;
540
+    if strcmp(udata.type,'planePlot')
541
+      in=find(inpolygon(tmp(:,2),tmp(:,1),...
542
+			udata.coords(:,2),udata.coords(:,1)));
543
+      row=tmp2(in,1);
544
+      col=tmp2(in,2);
545
+      in=sub2ind(udata.msize,row,col);
546
+      colors=reshape(get(udata.patch_h,'FaceVertexCData'),...
547
+		     [prod(udata.msize) 3]);
548
+      if ~isnan(udata.curr_col) & ~strcmp(udata.mode,'clear')
549
+        colors(in,:)=ones(length(in),1)*udata.curr_col;
550
+        udata.mat(row,col)=udata.class;
551
+      elseif strcmp(udata.mode,'clear')
552
+        colors(in,:)=[NaN NaN NaN];
553
+        udata.mat(row,col)=0;
554
+      end
555
+      udata.poly_h=[];
556
+      udata.coords=[];
557
+      set(udata.patch_h,'FaceVertexCData',colors);
558
+      set(udata.fig_h,'UserData',udata);
559
+      return;
560
+    end
561
+    if strcmp(udata.lattice,'hexa');
562
+      t=find(~rem(tmp(:,1),2));
563
+      tmp(t,2)=tmp(t,2)+0.5;
564
+      if any(strcmp(get(udata.patch_h,'Tag'),{'planeC','planeU'}))
565
+        p=0.7*vis_patch('hexa');
566
+      else
567
+        [x,y]=pol2cart(0:0.1:2*pi,0.5);
568
+        p=[x';0.5]*0.7;
569
+        p(:,2)=[y';0]*0.7;
570
+      end
571
+    else
572
+      if any(strcmp(get(udata.patch_h,'Tag'),{'planeC','planeU'}))
573
+        p=0.7*vis_patch('rect');
574
+      else
575
+        [x,y]=pol2cart(0:0.1:2*pi,0.5);
576
+        p=[x';0.5]*0.7;
577
+        p(:,2)=[y';0]*0.7;
578
+      end 
579
+    end
580
+    in=find(inpolygon(tmp(:,2),tmp(:,1),udata.coords(:,2),udata.coords(:,1)));
581
+    set(udata.fig_h,'UserData',udata);
582
+    if strcmp(udata.mode,'select')
583
+      remove_selpatches;
584
+      udata=get(udata.fig_h,'UserData');
585
+      for i=1:length(in)
586
+	udat.patch_h=udata.patch_h;
587
+	h=patch(p(:,1)+tmp(in(i),2),p(:,2)+tmp(in(i),1),...
588
+		udata.curr_col,...
589
+		'EdgeColor','black',...
590
+		'ButtonDownFcn','som_select([],[],''click'')', ...
591
+		'Tag','SEL_PATCH',...
592
+		'UserData',udat);
593
+	udata.mat(tmp2(in(i),1),tmp2(in(i),2))=udata.class;
594
+      end
595
+    else
596
+      remove_selpatches;
597
+      udata=get(udata.fig_h,'UserData');
598
+      %h=findobj(get(udata.plane_h,'Children'),'Tag','SEL_PATCH');
599
+      %for i=1:length(h)
600
+      %    if all(get(h(i),'FaceColor')==udata.curr_col) & ...
601
+      %       inpolygon(mean(get(h(i),'XData')),mean(get(h(i),'YData')),...
602
+      %       udata.coords(:,2),udata.coords(:,1))
603
+      %       coords=[floor(mean(get(h(i),'YData')))...
604
+      %               floor(mean(get(h(i),'XData')))];
605
+      %       udata.mat(coords(1),coords(2))=0;
606
+      %      delete(h(i));
607
+      %    end
608
+      %end
609
+    end
610
+  end
611
+  udata.poly_h=[];
612
+  udata.coords=[];
613
+  set(udata.fig_h,'UserData',udata);
614
+end
615
+
616
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
617
+
618
+function remove_selpatches
619
+
620
+udata=get(findobj(get(0,'Children'),'Tag','SELECT_GUI'),'UserData');
621
+h=findobj(get(udata.plane_h,'Children'),'Tag','SEL_PATCH');
622
+for i=1:length(h)
623
+  if inpolygon(mean(get(h(i),'XData')),mean(get(h(i),'YData')),...
624
+               udata.coords(:,2),udata.coords(:,1));
625
+    coords=[floor(mean(get(h(i),'YData')))...           
626
+            floor(mean(get(h(i),'XData')))];
627
+    udata.mat(coords(1),coords(2))=0;
628
+    delete(h(i));
629
+  end
630
+end
631
+
632
+set(udata.fig_h,'UserData',udata);
633
+
634
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
635
+
636
+function [n,names,classes]=class2num(class)
637
+
638
+names = {};
639
+classes = zeros(length(class),1);
640
+for i=1:length(class)
641
+  if ~isempty(class{i}), 
642
+    a = find(strcmp(class{i},names));
643
+    if isempty(a), 
644
+      names=cat(1,names,class(i));
645
+      classes(i) = length(names);
646
+    else
647
+      classes(i) = a;
648
+    end
649
+  end
650
+end
651
+n=length(names);
652
+
653
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
654
+
655
+function h=find_patch(a_h)
656
+
657
+h=[];
658
+
659
+tags={'planeC','planeU','planePie','planeBar','planePlot'};
660
+
661
+for i=1:5
662
+  if ~isempty(findobj(get(a_h,'Children'),'Tag',tags{i}))
663
+    h=findobj(get(gca,'Children'),'Tag',tags{i});
664
+    if length(h) > 1
665
+      h=h(1);
666
+    end
667
+    return;
668
+  end
669
+end
670
+  
671
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
672
+
673
+function draw_classes
674
+
675
+udata=get(findobj(get(0,'Children'),'Tag','SELECT_GUI'), ...
676
+	  'UserData');
677
+figure(get(udata.plane_h,'Parent'))
678
+subplot(udata.plane_h);
679
+
680
+colors=zeros(prod(udata.msize),3)+NaN;
681
+c_map=jet(length(udata.c_names));
682
+inds = find(udata.mat);
683
+for i=1:length(inds), 
684
+  colors(inds(i),:) = c_map(udata.mat(inds(i)),:);
685
+end
686
+
687
+if strcmp(udata.type,'planePlot'),
688
+
689
+  set(udata.patch_h,'FaceVertexCData',colors);
690
+  set(udata.fig_h,'UserData',udata);
691
+
692
+else
693
+
694
+  hold on
695
+  co = som_vis_coords(udata.lattice,udata.msize);
696
+  if any(strcmp(get(udata.patch_h,'Tag'),{'planeC','planeU'}))
697
+    p=0.7*vis_patch(udata.lattice);
698
+  else
699
+    [x,y]=pol2cart(0:0.1:2*pi,0.5);
700
+    p=[x';0.5]*0.7;
701
+    p(:,2)=[y';0]*0.7;
702
+  end
703
+  for i=1:length(inds),
704
+    udat.patch_h=udata.patch_h;
705
+    h=patch(p(:,1)+co(inds(i),1),p(:,2)+co(inds(i),2),...
706
+	    colors(inds(i),:),...
707
+	    'EdgeColor','black',...
708
+	    'ButtonDownFcn','som_select([],[],''click'')', ...
709
+	    'Tag','SEL_PATCH',...
710
+	    'UserData',udat);
711
+  end 
712
+  
713
+end
714
+
715
+
716
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%