diff toolboxes/MIRtoolbox1.3.2/somtoolbox/som_select.m @ 0:e9a9cd732c1e tip

first hg version after svn
author wolffd
date Tue, 10 Feb 2015 15:05:51 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/toolboxes/MIRtoolbox1.3.2/somtoolbox/som_select.m	Tue Feb 10 15:05:51 2015 +0000
@@ -0,0 +1,716 @@
+function varargout=som_select(c_vect,plane_h,arg)
+
+%SOM_SELECT  Manual selection of map units from a visualization.
+%
+% som_select(c_vect,[plane_h])
+%     
+%   som_select(3)
+%   som_select(sM.labels(:,1))
+%
+%  Input arguments ([]'s are optional):
+%   c_vect    (scalar) number of classes 
+%             (vector) initial class identifiers
+%             (cell array) of strings, class names
+%             (matrix) size * x 3, the color of each class
+%   [plane_h] (scalar) handle of the plane (axes) to be marked. 
+%                      By default, the current axes is used (GCA).
+%                      For the function to work, the plot in the 
+%                      axes must have been created with the
+%                      SOM_CPLANE function (or SOM_SHOW).
+% 
+% Launches a GUI which allows user to select nodes from plane by 
+% clicking them or by choosing a region (a polygon). 
+% 
+%   Middle mouse button: selects (or clears selection of) a single node
+%   Left mouse button:   lets user draw a polygon
+%   Right mouse button:  selects (or clears selection of) the units 
+%                        inside the polygon
+% 
+% From the GUI, the color (class) is selected as well as whether
+% but buttons select or clear the selection from the units. The
+% buttons on the bottom have the following actions: 
+% 
+%   'OK'    Assigns the class identifiers to the 'ans' variable in 
+%           workspace. The value is an array of class identifiers: 
+%           strings (cellstr) if the c_vect was an array of
+%           strings, a vector otherwise.
+%   'Clear' Removes marks from the plane.
+%   'Close' Closes the application. 
+%
+% See also SOM_SHOW, SOM_CPLANE.
+
+% Contributed to SOM Toolbox vs2, February 2nd, 2000 by Juha Parhankangas 
+% Copyright (c) by Juha Parhankangas
+% http://www.cis.hut.fi/projects/somtoolbox/
+
+% Juha Parhankangas 050100, juuso 010200
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% input arguments
+
+if nargin < 2, plane_h = gca; end
+if(isempty(gcbo)), arg='start'; end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% action
+
+switch arg
+ case 'start'
+  patch_h=find_patch(plane_h);
+  lattice=getfield(size(get(patch_h,'XData')),{1});
+  msize(1)=floor(getfield(get(plane_h,'YLim'),{2})); 
+  msize(2)=floor(getfield(get(plane_h,'XLim'),{2})-0.5);   
+  if lattice==6
+    lattice='hexa';
+  else
+    lattice='rect';
+  end
+  
+  if any(strcmp(get(patch_h,'Tag'),{'planeBar','planePie'}))
+    tmp_dim=size(get(patch_h,'XData'),2)/prod(msize);
+    tmp_xdata=get(patch_h,'XData');
+    tmp_x=tmp_xdata(:,(msize(1)*(msize(2)-1)+2)*tmp_dim);
+    if floor(tmp_x(1)) ~= round(tmp_x(1))
+      lattice = 'hexa';
+    else
+      lattice = 'rect';
+    end
+  elseif strcmp(get(patch_h,'Tag'),'planePlot')
+    tmp_lines_h=get(gca,'Children');
+    test_x=mean(get(tmp_lines_h(2),'XData'));
+    if round(test_x) ~= floor(test_x)
+      lattice = 'hexa';
+    else
+      lattice = 'rect';
+    end
+    form=0.5*vis_patch('hexa');
+    l = size(form,1);
+    
+    nx = repmat(form(:,1),1,prod(msize));
+    ny = repmat(form(:,2),1,prod(msize));
+    
+    x=reshape(repmat(1:msize(2),l*msize(1),1),l,prod(msize));
+    y=repmat(repmat(1:msize(1),l,1),1,msize(2));
+    
+    if strcmp(lattice,'hexa')
+      t = find(~rem(y(1,:),2));
+      x(:,t)=x(:,t)+.5;
+    end
+    x=x+nx;
+    y=y+ny;
+    
+    colors=reshape(ones(prod(msize),1)*[NaN NaN NaN],...
+		   [1 prod(msize) 3]);
+    v=caxis;
+    patch_h=patch(x,y,colors,...
+		  'EdgeColor','none',...
+		  'ButtonDownFcn',...
+		  'som_select([],[],''click'')',...
+		  'Tag','planePlot');
+    set([gca gcf],'ButtonDownFcn','som_select([],[],''click'')');
+    caxis(v)
+  end
+
+  c_colors = []; 
+  if iscell(c_vect)
+    [c_vect,c_names,c_classes]=class2num(c_vect);
+    if length(c_classes)<prod(msize), 
+      c_classes = zeros(prod(msize),1);
+    end
+  else
+    if all(size(c_vect)>1), 
+      c_colors = c_vect; 
+      c_names = 1:size(c_vect,1); 
+      c_vect = size(c_vect,1); 
+      c_classes = zeros(prod(msize),1);
+    elseif length(c_vect)==prod(msize),
+      c_classes = c_vect;
+      u = unique(c_classes(isfinite(c_classes) & c_classes>0));
+      c_names = u;
+      c_vect = length(u);       
+    elseif length(c_vect)>1, 
+      c_names = c_vect; 
+      c_vect = length(c_vect);
+      c_classes = zeros(prod(msize),1);
+    elseif length(c_vect)==1,
+      c_names = 1:c_vect;        
+      c_classes = zeros(prod(msize),1);
+    end
+  end
+  
+  udata.lattice=lattice;
+  udata.patch_h=patch_h;
+  udata.plane_h=plane_h;
+  udata.type=get(udata.patch_h,'Tag');
+  udata.msize=msize;
+  set(patch_h,'UserData',udata);
+  if strcmp(udata.type,'planePlot')
+    set([gca gcf],'UserData',udata);
+  end
+  str=cat(2,'som_select([],[],''click'')');
+  set(patch_h,'ButtonDownFcn',str);
+
+  draw_colorselection(c_names,c_colors);
+  tmp_data=findobj(get(0,'Children'),'Tag','SELECT_GUI');
+  tmp_data=get(tmp_data,'UserData');
+  tmp_data.c_names=c_names;
+  tmp_data.mat=reshape(c_classes,msize);
+  tmp_data.patch_h=patch_h;
+  tmp_data.plane_h=plane_h;
+  tmp_data.type=get(udata.patch_h,'Tag');
+  tmp_data.lattice=lattice;
+  tmp_data.coords=[];
+  tmp_data.poly_h=[];
+  tmp_data.msize=msize;
+  tmp_data.mode='select';  
+  set(tmp_data.fig_h,'UserData',tmp_data);   
+  draw_classes;
+  
+ case 'click'
+  switch get(gcf,'SelectionType')
+   case 'open'
+    return;
+   case {'normal','alt'}
+    draw_poly;
+   case 'extend'
+    click;
+  end 
+ case 'choose'
+  draw_colorselection(0,0,'choose');
+ case 'close'
+  close_gui;
+ case 'clear'
+  clear_plane;
+ case 'rb'
+  rb_control;
+ case 'ret_mat'
+  gui=findobj(get(0,'Children'),'Tag','SELECT_GUI');
+  gui=get(gui,'UserData');
+  mat=reshape(gui.mat,prod(size(gui.mat)),1);
+  if ~isempty(gui.c_names)
+    if isnumeric(gui.c_names), tmp=zeros(length(mat),1);
+    else tmp=cell(length(mat),1);
+    end
+    for i=1:length(gui.c_names)
+      inds=find(mat==i);
+      tmp(inds)=gui.c_names(i);
+    end       
+    mat=tmp;
+  end  
+  varargout{1}=mat;
+  %gui.mat=zeros(size(gui.mat));
+  %set(gui.fig_h,'UserData',gui);
+  %h=findobj(get(gui.plane_h,'Children'),'Tag','SEL_PATCH');
+  %delete(h);
+end  
+
+return;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% subfunctions
+
+function rb_control;
+
+h=findobj(get(gcf,'Children'),'Style','radiobutton');
+set(h,'Value',0);
+set(gcbo,'Value',1);
+
+udata=get(gcf,'UserData');
+if strcmp(get(gcbo,'Tag'),'Radiobutton1')
+  udata.mode='select';
+else
+  udata.mode='clear';
+end
+
+set(gcf,'UserData',udata);
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function clear_plane
+
+h=findobj(get(0,'Children'),'Tag','SELECT_GUI');
+gui=get(h,'UserData');
+
+if strcmp(get(gui.patch_h,'Tag'),'planePlot')
+  colors=reshape(get(gui.patch_h,'FaceVertexCData'),[prod(gui.msize) 3]);
+  colors(:,:)=NaN;
+  set(gui.patch_h,'FaceVertexCData',colors);
+end
+
+h=findobj(get(gui.plane_h,'Children'),'Tag','SEL_PATCH');
+gui.mat=zeros(gui.msize);
+set(gui.fig_h,'UserData',gui);
+delete(h);
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function click
+
+udata=get(gcbo,'UserData');
+
+udata=get(udata.patch_h,'UserData');  
+coords=get(gca,'CurrentPoint');
+row=round(coords(1,2));
+if row > udata.msize(1), row = udata.msize(1); end
+if row < 1, row = 1; end
+if any(strcmp(udata.lattice,{'hexa','hexaU'})) & ~mod(row,2), 
+  col=floor(coords(1,1))+0.5;
+  if col > udata.msize(2)+0.5, col=udata.msize(2)+0.5; end
+else
+  col=round(coords(1,1));
+  if col > udata.msize(2), col=udata.msize(2); end
+end
+if col < 1, col = 1; end
+
+if strcmp(udata.type,'planePlot')
+
+  if ~mod(row,2) & strcmp(udata.lattice,'hexa'), col=round(col-0.5); end
+  
+  ind=sub2ind(udata.msize,row,col);
+  colors=reshape(get(udata.patch_h,'FaceVertexCData'),[prod(udata.msize) 3]);
+  gui=findobj(get(0,'Children'),'Tag','SELECT_GUI');
+  gui=get(gui,'UserData');
+  
+  if ~isempty(gui.curr_col) & all(~isnan(colors(ind,1,:))),
+    if ~strcmp(gui.mode,'clear') & ~all(gui.curr_col == colors(ind,:))
+      colors(ind,:)=gui.curr_col;
+      gui.mat(row,col)=gui.class;
+    else
+      colors(ind,:)=[NaN NaN NaN];
+      gui.mat(row,col)=0;
+    end
+  elseif strcmp(gui.mode,'clear')
+    colors(ind,:)=[NaN NaN NaN];
+    gui.mat(row,col)=0;
+  elseif isempty(gui.curr_col)
+    return;
+  else
+    gui.mat(row,col)=gui.class;
+    colors(ind,:)=gui.curr_col;
+  end
+  set(udata.patch_h,'FaceVertexCData',colors);
+  set(gui.fig_h,'UserData',gui);
+  return;
+end  
+
+if any(strcmp(udata.type,{'planePie','planeBar'}))
+  [x,y]=pol2cart(0:0.1:2*pi,0.5);
+  coords=[x';0.5]*0.7;
+  coords(:,2)=[y';0]*0.7;
+elseif strcmp(udata.lattice,'hexa');
+  coords=0.7*vis_patch('hexa');
+else
+  coords=0.7*vis_patch('rect');
+end
+coords(:,1)=coords(:,1)+col;
+coords(:,2)=coords(:,2)+row;
+if ~mod(row,2) & strcmp(udata.lattice,'hexa'), col=round(col-0.5); end
+ 
+hold on;
+if gco == udata.patch_h
+  gui=findobj(get(0,'Children'),'Tag','SELECT_GUI');
+  gui=get(gui,'UserData');
+  if isnan(gui.curr_col) | strcmp(gui.mode,'clear'), return; end
+  h=fill(coords(:,1),coords(:,2),gui.curr_col);
+  str=cat(2,'som_select([],[],''click'')');
+  set(h,'ButtonDownFcn',str,'Tag','SEL_PATCH');
+  tmp.patch_h=udata.patch_h;
+  set(h,'UserData',tmp);
+  gui.mat(row,col)=gui.class;
+  set(gui.fig_h,'UserData',gui);
+else
+  gui=findobj(get(0,'Children'),'Tag','SELECT_GUI');
+  gui=get(gui,'UserData');
+  if ~all(get(gcbo,'FaceColor') == gui.curr_col) & ~strcmp(gui.mode,'clear'),
+    if ~isnan(gui.curr_col), 
+      set(gcbo,'FaceColor',gui.curr_col);
+      gui.mat(row,col) = gui.class;
+    end
+  else
+    gui.mat(row,col)=0;
+    delete(gco);
+  end
+  set(gui.fig_h,'UserData',gui);
+end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function draw_colorselection(varargin)
+
+if length(varargin)==2, 
+
+  if length(varargin{1})==1, 
+    n = varargin{1};
+    names = 1:n;
+  else
+    n = length(varargin{1}); 
+    names = varargin{1}; 
+  end
+  colors = varargin{2}; 
+  
+  shape=[0.5 -0.5;0.5 0.5;1.5 0.5;1.5 -0.5];
+  rep_x=repmat(shape(:,1),1,n);
+  rep_y=repmat(shape(:,2),1,n);
+  for i=0:getfield(size(rep_y,2))-1, rep_x(:,i+1)=rep_x(:,i+1)+i; end
+  if isempty(colors), colors=jet(n); end
+  data=som_select_gui;
+  data.colors=colors;
+  data.curr_col=NaN;
+  data.class=0;
+  set(0,'CurrentFigure',data.fig_h);
+  hold on;
+  tmp=fill(rep_x,rep_y,0.8);
+  for i=1:n
+    set(tmp(i),...
+        'EdgeColor',[0 0 0],...
+        'FaceColor',colors(i,:),...
+        'ButtonDownFcn','som_select([],0,''choose'');');
+  end
+  axis('equal');
+  axis('on');
+  set(gca,'XTick',1:n,'XTickLabel',names,'XAxisLocation','top');
+  set(data.a_h,'YLim',[-0.5,0.5],...
+	       'XLim',[0.5 n+0.5],...
+	       'YTickLabel','');
+  set(data.fig_h,'UserData',data);
+
+elseif strcmp(varargin{3},'choose')
+  
+  udata=get(gcf,'UserData');
+  if strcmp(get(gcbo,'Selected'),'off')
+    old=findobj(get(gca,'Children'),'Type','patch');
+    set(old,'Selected','off');
+    set(gcbo,'Selected','on');
+    udata.curr_col=udata.colors(round(mean(get(gcbo,'XData'))),:);
+    udata.class=mean(get(gcbo,'XData'));
+  else
+    set(gcbo,'Selected','off');
+    udata.curr_col=NaN;
+    udata.class=0;
+  end
+  set(gcf,'UserData',udata);
+
+end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function data=som_select_gui()
+
+
+a = figure('Color',[0.8 0.8 0.8], ...
+	'PaperType','a4letter', ...
+	'Position',[586 584 560 210], ...
+	'Tag','SELECT_GUI');
+
+data.fig_h=a;
+
+b = axes('Parent',a, ...
+	'Box','on', ...
+	'CameraUpVector',[0 1 0], ...
+	'Color',[1 1 1], ...
+	'DataAspectRatioMode','manual', ...
+	'PlotBoxAspectRatio',[20 1 2], ...
+	'PlotBoxAspectRatioMode','manual', ...
+	'Position',[0.13 0.11 0.775 0.815], ...
+	'Tag','Axes1', ...
+	'WarpToFill','off', ...
+	'XColor',[0 0 0], ...
+	'XLimMode','manual', ...
+	'YColor',[0 0 0], ...
+	'YLimMode','manual', ...
+	'YTickLabelMode','manual', ...
+	'ZColor',[0 0 0]);
+
+data.a_h=b;
+
+b = uicontrol('Parent',a, ...
+	'Units','points', ...
+	'BackgroundColor',[0.701961 0.701961 0.701961], ...
+	'Callback','som_select([],[],''close'')', ...
+	'FontWeight','demi', ...
+	'Position',[150 12 50 20], ...
+	'String','CLOSE', ...
+	'Tag','Pushbutton1');
+
+b = uicontrol('Parent',a, ...
+	'Units','points', ...
+	'BackgroundColor',[0.701961 0.701961 0.701961], ...
+        'Callback','som_select([],0,''ret_mat'')',...
+	'FontWeight','demi', ...
+	'Position',[365 12 50 20], ...
+	'String','OK', ...
+	'Tag','Pushbutton2');
+
+b = uicontrol('Parent',a, ...
+	'Units','points', ...
+	'BackgroundColor',[0.701961 0.701961 0.701961], ...
+        'Callback','som_select([],0,''clear'')',...
+	'FontWeight','demi', ...
+	'Position',[257.5 12 50 20], ...
+	'String','CLEAR', ...
+	'Tag','Pushbutton3');
+
+b = uicontrol('Parent',a, ...
+        'Units','points', ...
+        'Position',[50 27 17 16], ...
+        'Callback','som_select([],[],''rb'')',...
+        'Style','radiobutton', ...
+        'Tag','Radiobutton1', ...
+        'Value',1);
+b = uicontrol('Parent',a, ...
+        'Units','points', ...
+        'BackgroundColor',[0.701961 0.701961 0.701961], ...
+        'Callback','som_select([],[],''rb'')',...
+        'Position',[50 7 17 16], ...
+        'Style','radiobutton', ...
+        'Tag','Radiobutton2');
+b = uicontrol('Parent',a, ...
+        'Units','points', ...
+        'BackgroundColor',[0.8 0.8 0.8], ...
+        'FontSize',9, ...
+        'FontWeight','demi', ...
+        'HorizontalAlignment','left', ...
+        'Position',[72 25 28 15], ...
+        'String','Select', ...
+        'Style','text', ...
+        'Tag','StaticText1');
+b = uicontrol('Parent',a, ...
+        'Units','points', ...
+        'BackgroundColor',[0.8 0.8 0.8], ...
+        'FontSize',9, ...
+        'FontWeight','demi', ...
+        'HorizontalAlignment','left', ...
+        'Position',[72 7 25 13.6], ...
+        'String','Clear', ...
+        'Style','text', ...
+        'Tag','StaticText2');
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function close_gui
+
+udata=get(get(gcbo,'Parent'),'UserData');
+
+if strcmp(udata.type,'planePlot');
+  set(udata.plane_h,'ButtonDownFcn','','UserData',[]);
+  set(get(udata.plane_h,'Parent'),'ButtonDownFcn','');
+  delete(udata.patch_h);
+  return;
+end  
+
+h=findobj(get(udata.plane_h,'Children'),'Tag','SEL_PATCH');
+set(udata.patch_h,'ButtonDownFcn','','UserData',[]);
+delete(h);
+close(udata.fig_h);
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function draw_poly
+
+udata=get(findobj(get(0,'Children'),'Tag','SELECT_GUI'),'UserData');
+
+if isempty(udata.coords) & strcmp(get(gcf,'SelectionType'),'alt')
+  return;
+end
+
+coords(1,1) = getfield(get(gca,'CurrentPoint'),{3});
+coords(1,2) = getfield(get(gca,'CurrentPoint'),{1});
+udata.coords = cat(1,udata.coords,coords);
+delete(udata.poly_h);
+subplot(udata.plane_h);
+
+hold on;
+switch get(gcf,'SelectionType');
+ case 'normal'
+  udata.poly_h=plot(udata.coords(:,2),udata.coords(:,1),'black',...
+		    'ButtonDownFcn','som_select([],[],''click'')',...
+		    'LineWidth',2);
+  set(udata.fig_h,'UserData',udata);
+ case 'alt'
+  udata.coords=cat(1,udata.coords,udata.coords(1,:));
+  udata.poly_h=plot(udata.coords(:,2),udata.coords(:,1),'black',...
+		    'LineWidth',2);
+  delete(udata.poly_h);
+  if ~isnan(udata.curr_col)
+    tmp=sort(repmat((1:udata.msize(1))',udata.msize(2),1));
+    tmp(:,2)=repmat((1:udata.msize(2))',udata.msize(1),1);
+    tmp2=tmp;
+    if strcmp(udata.type,'planePlot')
+      in=find(inpolygon(tmp(:,2),tmp(:,1),...
+			udata.coords(:,2),udata.coords(:,1)));
+      row=tmp2(in,1);
+      col=tmp2(in,2);
+      in=sub2ind(udata.msize,row,col);
+      colors=reshape(get(udata.patch_h,'FaceVertexCData'),...
+		     [prod(udata.msize) 3]);
+      if ~isnan(udata.curr_col) & ~strcmp(udata.mode,'clear')
+        colors(in,:)=ones(length(in),1)*udata.curr_col;
+        udata.mat(row,col)=udata.class;
+      elseif strcmp(udata.mode,'clear')
+        colors(in,:)=[NaN NaN NaN];
+        udata.mat(row,col)=0;
+      end
+      udata.poly_h=[];
+      udata.coords=[];
+      set(udata.patch_h,'FaceVertexCData',colors);
+      set(udata.fig_h,'UserData',udata);
+      return;
+    end
+    if strcmp(udata.lattice,'hexa');
+      t=find(~rem(tmp(:,1),2));
+      tmp(t,2)=tmp(t,2)+0.5;
+      if any(strcmp(get(udata.patch_h,'Tag'),{'planeC','planeU'}))
+        p=0.7*vis_patch('hexa');
+      else
+        [x,y]=pol2cart(0:0.1:2*pi,0.5);
+        p=[x';0.5]*0.7;
+        p(:,2)=[y';0]*0.7;
+      end
+    else
+      if any(strcmp(get(udata.patch_h,'Tag'),{'planeC','planeU'}))
+        p=0.7*vis_patch('rect');
+      else
+        [x,y]=pol2cart(0:0.1:2*pi,0.5);
+        p=[x';0.5]*0.7;
+        p(:,2)=[y';0]*0.7;
+      end 
+    end
+    in=find(inpolygon(tmp(:,2),tmp(:,1),udata.coords(:,2),udata.coords(:,1)));
+    set(udata.fig_h,'UserData',udata);
+    if strcmp(udata.mode,'select')
+      remove_selpatches;
+      udata=get(udata.fig_h,'UserData');
+      for i=1:length(in)
+	udat.patch_h=udata.patch_h;
+	h=patch(p(:,1)+tmp(in(i),2),p(:,2)+tmp(in(i),1),...
+		udata.curr_col,...
+		'EdgeColor','black',...
+		'ButtonDownFcn','som_select([],[],''click'')', ...
+		'Tag','SEL_PATCH',...
+		'UserData',udat);
+	udata.mat(tmp2(in(i),1),tmp2(in(i),2))=udata.class;
+      end
+    else
+      remove_selpatches;
+      udata=get(udata.fig_h,'UserData');
+      %h=findobj(get(udata.plane_h,'Children'),'Tag','SEL_PATCH');
+      %for i=1:length(h)
+      %    if all(get(h(i),'FaceColor')==udata.curr_col) & ...
+      %       inpolygon(mean(get(h(i),'XData')),mean(get(h(i),'YData')),...
+      %       udata.coords(:,2),udata.coords(:,1))
+      %       coords=[floor(mean(get(h(i),'YData')))...
+      %               floor(mean(get(h(i),'XData')))];
+      %       udata.mat(coords(1),coords(2))=0;
+      %      delete(h(i));
+      %    end
+      %end
+    end
+  end
+  udata.poly_h=[];
+  udata.coords=[];
+  set(udata.fig_h,'UserData',udata);
+end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function remove_selpatches
+
+udata=get(findobj(get(0,'Children'),'Tag','SELECT_GUI'),'UserData');
+h=findobj(get(udata.plane_h,'Children'),'Tag','SEL_PATCH');
+for i=1:length(h)
+  if inpolygon(mean(get(h(i),'XData')),mean(get(h(i),'YData')),...
+               udata.coords(:,2),udata.coords(:,1));
+    coords=[floor(mean(get(h(i),'YData')))...           
+            floor(mean(get(h(i),'XData')))];
+    udata.mat(coords(1),coords(2))=0;
+    delete(h(i));
+  end
+end
+
+set(udata.fig_h,'UserData',udata);
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function [n,names,classes]=class2num(class)
+
+names = {};
+classes = zeros(length(class),1);
+for i=1:length(class)
+  if ~isempty(class{i}), 
+    a = find(strcmp(class{i},names));
+    if isempty(a), 
+      names=cat(1,names,class(i));
+      classes(i) = length(names);
+    else
+      classes(i) = a;
+    end
+  end
+end
+n=length(names);
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function h=find_patch(a_h)
+
+h=[];
+
+tags={'planeC','planeU','planePie','planeBar','planePlot'};
+
+for i=1:5
+  if ~isempty(findobj(get(a_h,'Children'),'Tag',tags{i}))
+    h=findobj(get(gca,'Children'),'Tag',tags{i});
+    if length(h) > 1
+      h=h(1);
+    end
+    return;
+  end
+end
+  
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function draw_classes
+
+udata=get(findobj(get(0,'Children'),'Tag','SELECT_GUI'), ...
+	  'UserData');
+figure(get(udata.plane_h,'Parent'))
+subplot(udata.plane_h);
+
+colors=zeros(prod(udata.msize),3)+NaN;
+c_map=jet(length(udata.c_names));
+inds = find(udata.mat);
+for i=1:length(inds), 
+  colors(inds(i),:) = c_map(udata.mat(inds(i)),:);
+end
+
+if strcmp(udata.type,'planePlot'),
+
+  set(udata.patch_h,'FaceVertexCData',colors);
+  set(udata.fig_h,'UserData',udata);
+
+else
+
+  hold on
+  co = som_vis_coords(udata.lattice,udata.msize);
+  if any(strcmp(get(udata.patch_h,'Tag'),{'planeC','planeU'}))
+    p=0.7*vis_patch(udata.lattice);
+  else
+    [x,y]=pol2cart(0:0.1:2*pi,0.5);
+    p=[x';0.5]*0.7;
+    p(:,2)=[y';0]*0.7;
+  end
+  for i=1:length(inds),
+    udat.patch_h=udata.patch_h;
+    h=patch(p(:,1)+co(inds(i),1),p(:,2)+co(inds(i),2),...
+	    colors(inds(i),:),...
+	    'EdgeColor','black',...
+	    'ButtonDownFcn','som_select([],[],''click'')', ...
+	    'Tag','SEL_PATCH',...
+	    'UserData',udat);
+  end 
+  
+end
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%