diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/toolboxes/MIRtoolbox1.3.2/somtoolbox/vis_trajgui.m	Tue Feb 10 15:05:51 2015 +0000
@@ -0,0 +1,1647 @@
+function vis_trajgui(trajStruct,arg)
+
+% VIS_TRAJGUI subfuntion for SOM_TRAJECTORY
+%
+% This function is the actual GUI called by SOM_TRAJECTORY
+% function. 
+%
+% See also SOM_TRAJECTORY.
+
+% Contributed code to SOM Toolbox 2.0, February 11th, 2000 by Juha Parhankangas
+% Copyright (c) by Juha Parhankangas.
+% http://www.cis.hut.fi/projects/somtoolbox/        
+
+% Version 2.0beta juha 180699
+
+if nargin == 1
+
+  sM_h=trajStruct.figure;
+
+  if size(trajStruct.bmus,1) ~= 1 & size(trajStruct.bmus,2) ~= 1
+    fuzzy_traj(trajStruct,[]);
+    return;
+  end
+  
+  
+  if size(trajStruct.bmus,1) == 1 | size(trajStruct.bmus,2) == 1
+
+    udata.bmus = trajStruct.bmus;
+    udata.a_h=[findobj(get(sM_h,'Children'),'Tag','Uplane');...
+	       findobj(get(sM_h,'Children'),'Tag','Cplane')];
+    udata.sM_h=trajStruct.figure;
+    udata.traj=[];
+    data1 = trajStruct.primary_data;
+    if ~isempty(trajStruct.primary_names)
+      names=trajStruct.primary_names;
+    else
+      for i=1:size(data1,2)
+	names{i,1}=sprintf('Var%d',i);
+      end
+    end
+
+    udata.lattice=trajStruct.lattice;
+    form = 0.7*vis_patch(udata.lattice);
+    udata.msize = trajStruct.msize;
+
+
+    %%%%%%%%%%%%%%%%%%%%%%%%
+    %
+    % forming a patch object, which is placed above every component plane
+    %
+    
+    
+    l = size(form,1);
+    
+    nx = repmat(form(:,1),1,prod(udata.msize));
+    ny = repmat(form(:,2),1,prod(udata.msize));
+    
+    x=reshape(repmat(1:udata.msize(2),l*udata.msize(1),1),l,prod(udata.msize));
+    y=repmat(repmat(1:udata.msize(1),l,1),1,udata.msize(2));
+    
+    if strcmp(udata.lattice,'hexa')
+      t = find(~rem(y(1,:),2));
+      x(:,t)=x(:,t)+.5;
+    end
+    x=x+nx;
+    y=y+ny;
+    
+    colors=reshape(ones(prod(udata.msize),1)*[NaN NaN NaN],...
+		   [1 prod(udata.msize) 3]);
+    
+    set(0,'CurrentFigure',udata.sM_h);
+    
+    %%%%%%%%%%%%%%%%%%%%%%
+    %
+    % drawing patch
+    %
+    % caxis -commands keep the colormap of the original patch unchanged.
+    %
+    
+    for i=1:length(udata.a_h)
+      udata.real_patch(i)=get(udata.a_h(i),'Children');
+      set(udata.real_patch(i),'ButtonDownFcn',...
+			'vis_trajgui([],''click'')');
+      subplot(udata.a_h(i));
+      v=caxis;
+      udata.tmp_patch(i)=patch(x,y,colors,'EdgeColor','none',...
+			       'ButtonDownFcn',...
+			       'vis_trajgui([],''click'')',...
+			       'Tag','TmpPatch');
+      caxis(v);
+    end
+    
+    %%%%%%%%%%%%%%%%%%%%
+    
+    
+    
+    udata.length_of_traj=length(trajStruct.size);
+    udata.size=trajStruct.size;
+    udata.color=trajStruct.color;
+    udata.poly.x=[];
+    udata.poly.y=[];
+    udata.poly.h=[];
+    udata.new_marks=[];
+    udata.all_marks=[];
+    udata.d_mark2=[];
+    udata.fig1 = figure;
+    set(udata.fig1,'KeyPressFcn','vis_trajgui([],''key'')',...
+		   'Name','Primary Data');
+    
+    
+    %%%%%%%%%%%%%%%%%%%%
+    %
+    % making the 'Tools' -menu
+    %
+    
+    udata.m_i=uimenu(udata.fig1,'Label','Trajectoy T&ools');
+    udata.m_i(2)=uimenu(udata.m_i,'Label','&Remove Trajectory',...
+			'Callback',...
+			'vis_trajgui([],''remove_traj'')');
+    udata.m_i(3)=uimenu(udata.m_i(1),'Label','&Dye Nodes',...
+			'Callback',...
+			'vis_trajgui([],''dye_gui'')');
+    udata.m_i(4)=uimenu(udata.m_i(1),'Label','&Clear Markers',...
+			'Callback',...
+			'vis_trajgui([],''clear'')');
+    udata.m_i(5)=uimenu(udata.m_i(1),'Label','&Save',...
+			'Callback',...
+			'vis_trajgui([],''save'')');
+    udata.m_i(6)=uimenu(udata.m_i(1),'Label','&Load',...
+			'Callback',...
+			'vis_trajgui([],''load'')');
+
+    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+    %
+    % drawing data components to the figure ....
+    %
+    % 
+    
+    if nargin < 5 | isempty(comps) | (isstr(comps) & strcmp(comps,'all'))
+      comps = 1:size(data1,2);
+    end
+    
+    x=1:size(data1,1);
+    
+    for i=1:length(comps)
+      subplot(length(comps),1,i);
+      udata.h(i)=gca;
+      udata.d_mark(i).h=[];
+      
+      udata.d(i)=plot(x,data1(:,comps(i)),...
+		      'ButtonDownFcn',...
+		      'vis_trajgui([],''line_down'')');        
+      set(gca,'XLim',[1 size(data1,1)],...
+	      'XTick',[],...	      
+	      'ButtonDownFcn','vis_trajgui([],''line_down'')'); %,...
+	      %'YLim',[min(data1(:,comps(i))) max(data1(:,comps(i)))]);
+	      
+      ylabel(names{comps(i)});
+      hold on;
+      ymin=get(udata.h(i),'YLim');
+      pos=mean(get(udata.h(i),'XLim'));
+      udata.l(i) = line([pos pos],[ymin(1) ymin(2)],...
+			'Color','red',...
+			'ButtonDownFcn',...
+			'vis_trajgui([],''down'')');
+    end
+    udata.text1=[];
+    
+    udata.fig2=[];
+    udata.h2=[];
+    udata.l2=[];
+    udata.text2=[];
+    
+    %%%%%%%%%%%%%%%%%%%%%%%%%%%
+    %
+    % ... and to the figure 2.
+    %
+    
+    
+    if ~isempty(trajStruct.secondary_data)
+      data2=trajStruct.secondary_data;
+      if isempty(trajStruct.secondary_names)
+	for i=1:size(data1,2)
+	  names2{i,1}=sprintf('Var%d',i);
+	end
+      else
+	names2=trajStruct.secondary_names;
+      end
+      
+      udata.fig2 = figure;
+      set(udata.fig2,'Name','Secondary Data');
+      set(udata.fig2,'KeyPressFcn',...
+		     'vis_trajgui([],''key'')');
+      for i=1:size(data2,2)
+	subplot(size(data2,2),1,i);
+	udata.h2(i) = gca;
+	udata.d_mark2(i).h=[];
+	udata.d2(i) = plot(x,data2(:,i),...
+			   'ButtonDownFcn',...
+			   'vis_trajgui([],''line_down'')');
+	set(gca,'XLim',[1 size(data1,1)],'XTick',[],'ButtonDownFcn',...
+		'vis_trajgui([],[],[],[],[],[],''line_down'')');
+	ylabel(names2{i});
+	hold on;
+	ymin = get(udata.h2(i),'YLim');
+	pos = mean(get(udata.h2(i),'XLim'));
+	udata.l2(i) = line([pos pos],ymin,'Color','red',...
+			   'ButtonDownFcn','vis_trajgui([],''down'')');
+      end
+    end  
+    
+    %%%%%%%%%%%%%%%%%%%%%%%%%%
+    
+    set(udata.fig1,'UserData',udata);
+    if ~isempty(udata.fig2);
+      tmp.fig1=udata.fig1;
+      set(udata.fig2,'UserData',tmp);
+    end
+    tmp=get(udata.sM_h,'UserData');
+    tmp.fig1=udata.fig1;
+    set(udata.sM_h,'UserData',tmp);  
+    set_numbers(round(pos)); 
+    return;
+  end
+  
+end
+
+%%%%%%%%%%%%%%%%%
+%
+% if figures have been drawn, the only function calls that may exist
+% are the ones that change the state of the application.
+%
+udata=get(gcf,'UserData');
+udata=get(udata.fig1,'UserData');
+
+switch arg
+ case 'fuzzy'
+  fuzzy_traj(tS,[]);
+  return;
+ case 'move_fuzzy'
+  fuzzy_traj([],'move');
+  return;
+ case 'remove_traj'
+  remove_traj;
+  return;
+ case 'line_down'
+  line_bdf('down');
+  return;
+ case 'line_drag'
+  line_bdf('drag');
+  return;
+ case 'line_up'
+  line_bdf('up');
+  return;
+ case 'dye_gui';
+  color_gui(udata.fig1);
+  return;
+ case {'dye','cyan','magenta','yellow','red','green','blue','white','grey'}
+  dye_nodes(arg);
+  return;
+ case 'clear'
+  clear_markers;
+  return;
+ case 'key'
+  key_bdf;
+  return;   
+ case 'click'
+  click;
+  return;
+ case 'save'
+  save_data;
+  return;
+ case 'load'
+  load_data;
+  return;
+end
+
+
+%%%%%%%%%%
+%
+% lines in the data figure(s) are dragged ...
+%
+
+udata=get(gcf,'UserData');
+udata=get(udata.fig1,'UserData');
+
+
+lims=get(gca,'XLim');
+x = getfield(get(gca,'CurrentPoint'),{1});  % the location of the line
+
+if x < lims(1)
+  x=lims(1);
+elseif x > lims(2)
+  x=lims(2);
+end
+
+old = gcf;
+
+switch arg
+ case 'down',...
+      
+  % mouse button is pressed down above the line
+  
+  set(gcf,'WindowButtonMotionFcn','vis_trajgui([],''drag'')');
+  set(gcf,'WindowButtonUpFcn','vis_trajgui([],''up'')');
+  set(udata.l,'EraseMode','xor');
+  delete(udata.text1);
+  if ~isempty(udata.l2);
+    set(udata.l2,'EraseMode','xor');
+    delete(udata.text2);
+  end
+  set(gcf,'Pointer','crosshair');
+  
+ case 'drag'
+  % change the location of the lines
+  
+  set(0,'CurrentFigure',udata.fig1);
+  set(udata.l,'XData',[x x]);
+  if ~isempty(udata.fig2)
+    set(0,'CurrentFigure',udata.fig2);
+    set(udata.l2,'XData',[x x]);
+  end
+  draw_traj(round(x));
+  set(0,'CurrentFigure',old);
+ case 'up'
+  
+  % draw trajectory and set figure to the normal state.
+  
+  set(udata.l,'EraseMode','normal');
+  set(gcf,'Pointer','arrow','WindowButtonMotionFcn','',...
+	  'WindowButtonUpFcn','');
+  draw_traj(round(x));
+  set_numbers(round(x));
+end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function draw_traj(point)
+
+udata=get(gcf,'UserData');
+udata=get(udata.fig1,'UserData');
+color=udata.color;
+eMode='normal';
+if isstr(udata.color) & strcmp(udata.color,'xor')
+  eMode='xor';
+  color='black';
+end
+ind=udata.bmus(point);
+[i j] = ind2sub(udata.msize,ind);
+if ~mod(i,2)
+  j=j+0.5;
+end
+old = gcf;
+set(0,'CurrentFigure',udata.sM_h);
+hold on;
+if isempty(udata.traj) | length(udata.traj.h) ~= length(udata.a_h)
+  
+  % trajectory does not exist
+  
+  for i=1:length(udata.a_h)
+    subplot(udata.a_h(i));
+    hold on;
+    new.h = plot(j,i,'Color',color,'EraseMode',eMode,'LineStyle','none');
+    udata.traj.h(i)=new;
+    udata.traj.j=j;
+    udata.traj.i=i;
+  end
+else
+  if length(udata.traj.j) == udata.length_of_traj
+    % if the length of trajectory == ..., 
+    udata.traj.j(1) = [];         % the first (the oldest) coordinate pair
+    udata.traj.i(1) = [];         % is removed.
+  end
+  udata.traj.j=[udata.traj.j;j]; % the new point is added to the
+  udata.traj.i=[udata.traj.i;i]; % end of coordinate vectors (i and j)
+  for i=1:length(udata.a_h)
+    subplot(udata.a_h(i));            % remove the existing trajectory
+    delete(udata.traj.h(i).h);          % and plot the new one.
+    for j=1:length(udata.traj.j)
+      udata.traj.h(i).h(j)=plot(udata.traj.j(j),udata.traj.i(j),...
+				'Color',color,...
+				'EraseMode',eMode,'Marker','o','LineWidth',2,...
+				'MarkerSize',udata.size(udata.length_of_traj-j+1),...
+				'LineStyle','none');
+    end
+  end
+end 
+set(0,'CurrentFigure',udata.fig1);
+set(udata.fig1,'UserData',udata);
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function set_numbers(x);
+
+% This function writes the numbers beside of the pointer lines
+
+
+udata=get(gcf,'UserData');
+udata=get(udata.fig1,'UserData');
+
+xlim = get(gca,'XLim');
+ylim = get(gca,'YLim');
+p = ylim(1) + 0.9*(ylim(2)-ylim(1));
+
+old = gcf;
+set(0,'CurrentFigure',udata.fig1);
+
+
+for i=1:length(udata.h)
+  subplot(udata.h(i));
+  
+  % check if the text is placed to the left side of the line...
+  
+  if abs(x-xlim(1)) > (abs(x-xlim(2)))
+    udata.text1(i)=text(x-1,p,sprintf('%d ->',x),...
+                        'VerticalAlignment','top',...
+                        'HorizontalAlignment','right',...
+                        'FontWeight','demi');
+  else
+    
+    %  or to the right side.
+    
+    udata.text1(i)=text(x+1,p,sprintf('<- %d',x),...
+			'VerticalAlignment','top',...
+			'FontWeight','demi');
+  end
+end
+
+if ~isempty(udata.fig2)
+  set(0,'CurrentFigure',udata.fig2);
+  
+  for i=1:length(udata.h2)
+    subplot(udata.h2(i));
+    
+    if abs(x-xlim(1)) > (abs(x-xlim(2)))
+      udata.text2(i)=text(x-1,p,sprintf('%d ->',x),...
+			  'VerticalAlignment','top',...
+			  'HorizontalAlignment','right',...
+			  'FontWeight','demi');
+    else
+      udata.text2(i)=text(x+1,p,sprintf('<- %d',x),...
+			  'VerticalAlignment','top',...
+			  'FontWeight','demi');
+    end
+  end
+end
+
+set(0,'CurrentFigure',old);
+set(udata.fig1,'UserData',udata);
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function remove_traj()
+
+% delete trajectory -object from every component plane.
+
+udata=get(gcf,'UserData');
+udata=get(udata.fig1,'UserData');
+
+if isempty(udata.traj)
+  return;
+end
+
+
+for i=1:length(udata.traj.h)
+  delete(udata.traj.h(i).h);
+end
+
+udata.traj=[];
+set(udata.fig1,'UserData',udata);
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function line_bdf(arg)
+
+% this function takes care of action when region is selected in the
+% data figure.
+
+
+udata=get(gcf,'UserData');
+udata=get(udata.fig1,'UserData');
+xlim=get(gca,'XLim');
+
+if ~(any(strcmp('THIS',fieldnames(udata))))
+  p = getfield(get(gca,'CurrentPoint'),{1});
+else
+  p = getfield(get(udata.THIS,'CurrentPoint'),{1});
+end
+
+if p < xlim(1)
+  p = xlim(1);
+elseif p > xlim(2)
+  p = xlim(2);
+end
+
+
+
+switch arg
+ case 'down'
+  
+  % the mouse button is pressed down, the pointer lines are drawn.
+  % and the state of the figure is changed.
+  
+  udata.THIS=gca;
+  set(gcf,'WindowButtonMotionFcn',...
+	  'vis_trajgui([],''line_drag'')',...
+	  'WindowButtonUpFcn','vis_trajgui([],''line_up'')');
+  udata.start_p=p;
+  
+  old = gcf;
+  set(0,'CurrentFigure',udata.fig1);
+  
+  for i=1:length(udata.h)
+    subplot(udata.h(i));
+    udata.t_line.h(i)=line([p p],get(gca,'YLim'),'Color','red');
+    udata.t_line.h2(i)=line([p p],get(gca,'YLim'),'Color','red',...
+			    'EraseMode','xor');
+  end
+  if ~isempty(udata.h2)
+    set(0,'CurrentFigure',udata.fig2);
+    for i=1:length(udata.h2)
+      subplot(udata.h2(i));
+      udata.t_line2.h(i)=line([p p],get(gca,'YLim'),'Color','red');
+      udata.t_line2.h2(i)=line([p p],get(gca,'YLim'),'Color','red',...
+			       'EraseMode','xor');
+    end
+  end
+  
+ case 'drag'
+  
+  % change the position of the pointer lines
+  
+  old = gcf;
+  set(0,'CurrentFigure',udata.fig1);
+  set(udata.t_line.h2,'XData',[p p]);
+  if ~isempty(udata.fig2)
+    set(0,'CurrentFigure',udata.fig2);
+    set(udata.t_line2.h2,'XData',[p p]);
+  end
+  set(0,'CurrentFigure',old);
+ case 'up'
+  
+  
+  % sort the 'points' -vector and draw the markers to the data and nodes
+  
+  points=sort([round(udata.start_p) round(p)]);
+  draw_markers(points(1):points(2));
+  udata=get(udata.fig1,'UserData');
+  udata.new_marks=unique([udata.new_marks ;(points(1):points(2))']);
+  delete([udata.t_line.h2 udata.t_line.h]);
+  if ~isempty(udata.fig2)
+    delete([udata.t_line2.h2 udata.t_line2.h]);
+  end
+  set(get(udata.THIS,'Parent'),'WindowButtonMotionFcn','',...
+		    'WindowButtonUpFcn','');
+  udata=rmfield(udata,'THIS');
+end
+
+set(udata.fig1,'UserData',udata);
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function draw_markers(x);
+
+plot2data(x);
+plot2plane(x);
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function plot2data(x);
+
+% plot black markers to the data figure(s)
+
+udata=get(gcf,'UserData');
+udata=get(udata.fig1,'UserData');
+
+old = gcf;
+
+set(0,'CurrentFigure',udata.fig1);
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% if there already exist points in the positions that are members
+% of the set x, then the old points are removed from data figures...
+
+for i=1:length(udata.d_mark(1).h)
+  tmp1 = get(udata.d_mark(1).h(i),'XData');
+  tmp2 = setdiff(tmp1,x);
+  if length(tmp1) ~= length(tmp2)
+    inds=[];
+    for j=1:length(tmp2);
+      inds=[inds find(tmp2(j)==tmp1)];
+    end
+    for j=1:length(udata.d_mark)
+      ydata=getfield(get(udata.d_mark(j).h(i),'YData'),{inds});
+      set(udata.d_mark(j).h(i),'XData',tmp2,'YData',ydata);
+    end
+    if ~isempty(udata.fig2)
+      for j=1:length(udata.d_mark2)
+        ydata=getfield(get(udata.d_mark2(j).h(i),'YData'),{inds});
+        set(udata.d_mark2(j).h(i),'XData',tmp2,'YData',ydata);
+      end
+    end
+  end
+end
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% ... and the new ones are plotted.
+
+for i=1:length(udata.h)
+  subplot(udata.h(i));
+  h=plot(x,getfield(get(udata.d(i),'YData'),{x}),'oblack',...
+	 'ButtonDownFcn',...
+	 'vis_trajgui([],''line_down'')');
+  udata.d_mark(i).h=[udata.d_mark(i).h;h];
+end
+
+if ~isempty(udata.h2)
+  set(0,'CurrentFigure',udata.fig2);
+  
+  for i=1:length(udata.h2)
+    subplot(udata.h2(i));
+    h=plot(x,getfield(get(udata.d2(i),'YData'),{x}),'oblack',...
+	   'ButtonDownFcn',...
+	   'vis_trajgui([],''line_down'')');
+    udata.d_mark2(i).h=[udata.d_mark2(i).h;h];
+  end
+end
+
+set(0,'CurrentFigure',old);
+set(udata.fig1,'UserData',udata);
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function plot2plane(x);
+
+% sets markers to the component planes.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% actually new markers are never plotted, but the color of the patch
+% lying above the original component plane patch is changed black in
+% the right positions.
+
+udata=get(gcf,'UserData');
+udata=get(udata.fig1,'UserData');
+
+udata.new_marks=unique([udata.new_marks ;x']);
+
+for i=1:length(udata.a_h)
+  col=get(udata.tmp_patch(i),'FaceVertexCData');
+  if length(size(col)) == 3
+    col = reshape(col,[size(col,1) 3]);
+  end
+  for j=1:length(udata.new_marks)
+    col(udata.bmus(udata.new_marks(j)),:)=[0 0 0];
+  end
+  set(udata.tmp_patch(i),'FaceVertexCData',col);
+end
+
+set(udata.fig1,'UserData',udata);
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function color_gui(fig1)
+
+% construct the graphical user interface for changing the color of the
+% black (marked) nodes.
+
+
+udata=get(fig1,'UserData');
+
+a = figure('Color',[0.8 0.8 0.8], ...
+	   'Name','Colors', ...
+	   'PaperType','a4letter', ...
+	   'Position',[518 456 120 311], ...
+	   'Tag','Fig1');
+
+udata.c_struct.fig=a;
+
+b = uicontrol('Parent',a, ...
+	      'Units','normalized', ...
+	      'BackgroundColor',[0.701961 0.701961 0.701961], ...
+	      'Position',[0.0700415 0.28956 0.830492 0.594566], ...
+	      'Style','frame', ...
+	      'Tag','Frame1');
+b = uicontrol('Parent',a, ...
+	      'Units','normalized', ...
+	      'BackgroundColor',[0.8 0.8 0.8], ...
+	      'Position',[0.100059 0.301143 0.770456 0.571399], ...
+	      'Style','frame', ...
+	      'Tag','Frame2');
+
+b = uicontrol('Parent',a, ...
+	      'Units','normalized', ...
+	      'Callback','vis_trajgui([],''cyan'')', ...
+	      'Position',[0.130077 0.795326 0.170101 0.0617729], ...
+	      'Style','radiobutton', ...
+	      'Tag','cyan', ...
+	      'Value',1);
+
+
+b = uicontrol('Parent',a, ...
+	      'Units','normalized', ...
+	      'Callback','vis_trajgui([],''magenta'')', ...
+	      'Position',[0.130077 0.733553 0.170101 0.057912], ...
+	      'Style','radiobutton', ...
+	      'Tag','magenta');
+
+
+b = uicontrol('Parent',a, ...
+	      'Units','normalized', ...
+	      'Callback','vis_trajgui([],''yellow'')', ...
+	      'Position',[0.130077 0.664059 0.170101 0.0617729], ...
+	      'Style','radiobutton', ...
+	      'Tag','yellow');
+
+
+b = uicontrol('Parent',a, ...
+	      'Units','normalized', ...
+	      'Callback','vis_trajgui([],''red'')', ...
+	      'Position',[0.130077 0.590703 0.170101 0.0617729], ...
+	      'Style','radiobutton', ...
+	      'Tag','red');
+
+
+b = uicontrol('Parent',a, ...
+	      'Units','normalized', ...
+	      'Callback','vis_trajgui([],''green'')', ...
+	      'Position',[0.130077 0.525068 0.170101 0.057912], ...
+	      'Style','radiobutton', ...
+	      'Tag','green');
+
+
+b = uicontrol('Parent',a, ...
+	      'Units','normalized', ...
+	      'Callback','vis_trajgui([],''blue'')', ...
+	      'Position',[0.130077 0.455575 0.170101 0.0617729], ...
+	      'Style','radiobutton', ...
+	      'Tag','blue');
+
+
+b = uicontrol('Parent',a, ...
+	      'Units','normalized', ...
+	      'Callback','vis_trajgui([],''white'')', ...
+	      'Position',[0.130077 0.38608 0.170101 0.0617729], ...
+	      'Style','radiobutton', ...
+	      'Tag','white');
+
+
+b = uicontrol('Parent',a, ...
+	      'Units','normalized', ...
+	      'Callback','vis_trajgui([],''grey'')', ...
+	      'Position',[0.130077 0.320447 0.170101 0.057912], ...
+	      'Style','radiobutton', ...
+	      'Tag','grey');
+
+
+b = uicontrol('Parent',a, ...
+	      'Units','normalized', ...
+	      'BackgroundColor',[0.8 0.8 0.8], ...
+	      'FontWeight','demi', ...
+	      'HorizontalAlignment','left', ...
+	      'Position',[0.32019 0.795326 0.470278 0.0501905], ...
+	      'String','Cyan', ...
+	      'Style','text', ...
+	      'Tag','StaticText1');
+b = uicontrol('Parent',a, ...
+	      'Units','normalized', ...
+	      'BackgroundColor',[0.8 0.8 0.8], ...
+	      'FontWeight','demi', ...
+	      'HorizontalAlignment','left', ...
+	      'Position',[0.32019 0.733553 0.520308 0.0463296], ...
+	      'String','Magenta', ...
+	      'Style','text', ...
+	      'Tag','StaticText2');
+b = uicontrol('Parent',a, ...
+	      'Units','normalized', ...
+	      'BackgroundColor',[0.8 0.8 0.8], ...
+	      'FontWeight','demi', ...
+	      'HorizontalAlignment','left', ...
+	      'Position',[0.32019 0.664059 0.470278 0.0501905], ...
+	      'String','Yellow', ...
+	      'Style','text', ...
+	      'Tag','StaticText3');
+b = uicontrol('Parent',a, ...
+	      'Units','normalized', ...
+	      'BackgroundColor',[0.8 0.8 0.8], ...
+	      'FontWeight','demi', ...
+	      'HorizontalAlignment','left', ...
+	      'Position',[0.32019 0.590703 0.470278 0.0501905], ...
+	      'String','Red', ...
+	      'Style','text', ...
+	      'Tag','StaticText4');
+b = uicontrol('Parent',a, ...
+	      'Units','normalized', ...
+	      'BackgroundColor',[0.8 0.8 0.8], ...
+	      'FontWeight','demi', ...
+	      'HorizontalAlignment','left', ...
+	      'Position',[0.32019 0.525068 0.470278 0.0463296], ...
+	      'String','Green', ...
+	      'Style','text', ...
+	      'Tag','StaticText5');
+b = uicontrol('Parent',a, ...
+	      'Units','normalized', ...
+	      'BackgroundColor',[0.8 0.8 0.8], ...
+	      'FontWeight','demi', ...
+	      'HorizontalAlignment','left', ...
+	      'Position',[0.32019 0.455575 0.470278 0.0463296], ...
+	      'String','Blue', ...
+	      'Style','text', ...
+	      'Tag','StaticText6');
+b = uicontrol('Parent',a, ...
+	      'Units','normalized', ...
+	      'BackgroundColor',[0.8 0.8 0.8], ...
+	      'FontWeight','demi', ...
+	      'HorizontalAlignment','left', ...
+	      'Position',[0.32019 0.38608 0.470278 0.0501905], ...
+	      'String','White', ...
+	      'Style','text', ...
+	      'Tag','StaticText7');
+b = uicontrol('Parent',a, ...
+	      'Units','normalized', ...
+	      'BackgroundColor',[0.8 0.8 0.8], ...
+	      'FontWeight','demi', ...
+	      'HorizontalAlignment','left', ...
+	      'Position',[0.32019 0.320447 0.470278 0.0463296], ...
+	      'String','Grey', ...
+	      'Style','text', ...
+	      'Tag','StaticText8');
+b = uicontrol('Parent',a, ...
+	      'Units','normalized', ...
+	      'Position',[0.0700415 0.146711 0.830492 0.135128], ...
+	      'Style','frame', ...
+	      'Tag','Frame3');
+b = uicontrol('Parent',a, ...
+	      'Units','normalized', ...
+	      'BackgroundColor',[0.8 0.8 0.8], ...
+	      'Position',[0.100059 0.158293 0.770456 0.111963], ...
+	      'Style','frame', ...
+	      'Tag','Frame4');
+b = uicontrol('Parent',a, ...
+	      'Units','normalized', ...
+	      'BackgroundColor',[0.8 0.8 0.8], ...
+	      'FontWeight','demi', ...
+	      'HorizontalAlignment','left', ...
+	      'Position',[0.130077 0.177597 0.270833 0.0617729], ...
+	      'String','RGB', ...
+	      'Style','text', ...
+	      'Tag','StaticText9');
+b = uicontrol('Parent',a, ...
+	      'Units','normalized', ...
+	      'BackgroundColor',[1 1 1], ...
+	      'Position',[0.410243 0.173736 0.420249 0.0810768], ...
+	      'Style','edit', ...
+	      'Tag','EditText1');
+
+udata.c_struct.RGB=b;
+
+b = uicontrol('Parent',a, ...
+	      'Units','normalized', ...
+	      'Callback','vis_trajgui([],''dye'')', ...
+	      'FontWeight','demi', ...
+	      'Position',[0.0700415 0.0270256 0.360214 0.0772162], ...
+	      'String','OK', ...
+	      'Tag','Pushbutton1');
+b = uicontrol('Parent',a, ...
+	      'Units','normalized', ...
+	      'Callback','close gcf', ...
+	      'FontWeight','demi', ...
+	      'Position',[0.54032 0.0270256 0.360214 0.0772162], ...
+	      'String','Close', ...
+	      'Tag','Pushbutton2');
+
+udata.c_struct.color=[0 1 1];
+
+tmp.fig1=fig1;
+set(a,'UserData',tmp);
+set(udata.fig1,'UserData',udata);
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function dye_nodes(arg)
+
+% takes care of the action, when radiobuttons are pressed 
+% (or the RGB value is set) in the color_gui -figure.
+% It also handles the starting of dying nodes and plots.
+
+udata=get(gcf,'UserData');
+udata=get(udata.fig1,'UserData');
+
+
+switch arg
+ case {'cyan','magenta','yellow','red','green','blue','white','grey'}
+  h=findobj(get(gcf,'Children'),'Style','radiobutton');
+  set(h,'Value',0);
+  set(gcbo,'Value',1);
+end
+
+
+switch arg
+ case 'cyan'
+  RGB = [0 1 1];
+ case 'magenta'
+  RGB = [1 0 1];
+ case 'yellow'
+  RGB = [1 1 0];
+ case 'red'
+  RGB = [1 0 0];
+ case 'green'
+  RGB = [0 1 0];
+ case 'blue'
+  RGB = [0 0 1];
+ case 'white'
+  RGB = [1 1 1];
+ case 'grey'
+  RGB = [0.4 0.4 0.4];
+ case 'dye'
+  
+  RGB = get(udata.c_struct.RGB,'String');
+  if isempty(RGB)
+    dye;
+    return;
+  else
+    str1='The value of RGB must be vector containing three scalars';
+    str2='between 0 and 1.';
+    color = str2num(RGB);
+    set(udata.c_struct.RGB,'String','');
+    if isempty(color)
+      close gcf;
+      udata=rmfield(udata,'c_struct');
+      set(udata.fig1,'UserData',udata);
+      errordlg([{str1};{str2}]);
+      return;
+    end
+    if ~all([1 3] == size(color)) & ~all([3 1] == size(color))
+      close gcf;
+      errordlg([{str1};{str2}]);
+      udata=rmfield(udata,'c_struct',udata);
+      set(udata.fig1,'UserData',udata);
+      return;
+    end
+    if ~isempty(cat(2,find(color>1),find(color<0)))
+      close gcf
+      errordlg([{str1};{str2}]);
+      udata=rmfield(udata,'c_struct',udata);
+      set(udata.fig1,'UserData',udata);
+      return;
+    end
+    udata.c_struct.color=color;
+    set(udata.fig1,'UserData',udata);
+    dye;
+    return;
+  end
+end
+
+udata.c_struct.color=RGB;
+set(udata.fig1,'UserData',udata);
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function dye()
+
+% dyes black markers in the component planes and in the data figures
+
+udata=get(gcf,'UserData');
+udata=get(udata.fig1,'UserData');
+
+inds=unique([udata.all_marks ; udata.new_marks]);
+
+
+for i=1:length(udata.d_mark);
+  for j=1:length(udata.d_mark(i).h)
+    if all(get(udata.d_mark(i).h(j),'Color') == [0 0 0])
+      set(udata.d_mark(i).h(j),'Color',udata.c_struct.color);
+    end
+  end
+end
+
+if ~isempty(udata.fig2);
+  for i=1:length(udata.d_mark2)
+    for j=1:length(udata.d_mark2(i).h)
+      if all(get(udata.d_mark2(i).h(j),'Color') == [0 0 0])
+        set(udata.d_mark2(i).h(j),'Color',udata.c_struct.color);
+      end
+    end
+  end
+end
+
+
+for i=1:length(udata.a_h)
+  col=get(udata.tmp_patch(i),'FaceVertexCData');
+  for j=1:length(udata.new_marks)
+    col(udata.bmus(udata.new_marks(j)),:)=udata.c_struct.color;
+  end
+  set(udata.tmp_patch(i),'FaceVertexCData',col);
+end
+
+
+udata.all_marks=unique([udata.all_marks;udata.new_marks]);
+udata.new_marks=[];
+close gcf;
+udata=rmfield(udata,'c_struct');
+set(udata.fig1,'UserData',udata);
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function clear_markers()
+
+% removes markers from the componentplanes and the data figure(s).
+
+udata=get(gcf,'UserData');
+udata=get(udata.fig1,'UserData');
+
+for i=1:length(udata.d_mark)
+  delete(udata.d_mark(i).h);
+  udata.d_mark(i).h=[];
+end
+
+for i=1:length(udata.d_mark2)
+  delete(udata.d_mark2(i).h);
+  udata.d_mark2(i).h=[];
+end
+
+col=NaN*get(udata.tmp_patch(1),'FaceVertexCData');
+col=reshape(col,[size(col,1) 3]);
+
+for i=1:length(udata.tmp_patch)
+  set(udata.tmp_patch(i),'FaceVertexCData',col);
+end
+
+udata.new_marks=[];
+udata.all_marks=[];
+
+
+if any(strcmp('c_struct',fieldnames(udata)))
+  udata=rmfield(udata,'c_struct');
+end
+
+set(udata.fig1,'UserData',udata);
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function key_bdf
+
+% moves trajectory and pointer lines, when either of 
+% the keys '>' or '<' is pressed.
+
+udata=get(gcf,'UserData');
+udata=get(udata.fig1,'UserData');
+
+key=get(gcbo,'CurrentCharacter');
+
+% The easiest way to get a new coordinates is to get them from the texts...
+% The texts are either '<- x' or 'x ->' 
+
+x=get(udata.text1(1),'String');
+x=str2num(x(4:length(x)));
+
+if isempty(x)
+  x=get(udata.text1(1),'String');
+  x=str2num(x(1:length(x)-3));
+end
+
+switch(key)
+ case '<'
+  if x ~= 1
+    x= x-1;
+  end
+ case '>'
+  if x ~= getfield(get(get(udata.text1(1),'Parent'),'XLim'),{2}) 
+    x = x+1;
+  end
+ otherwise
+  return;
+end
+
+set(udata.l,'XData',[x x]);
+if ~isempty(udata.fig2)
+  set(udata.l2,'XData',[x x]);
+end
+
+delete(udata.text1);
+delete(udata.text2);
+
+set_numbers(x);
+draw_traj(x);
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function click()
+
+
+switch get(gcf,'SelectionType')
+ case 'open'
+  return;
+ case {'normal','alt'}
+  draw_poly;
+ case 'extend'
+  click_node;
+end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function click_node()
+
+% takes care of the action, when the middle mouse button is
+% pressed (mouse pointer is above some component plane).
+
+udata=get(gcf,'UserData');
+udata=get(udata.fig1,'UserData');
+new_marks=[];
+
+old=gcf;
+
+NEW=0;
+AGAIN = 0;
+
+
+coords=get(gca,'CurrentPoint');
+row=round(coords(1,2));
+
+if strcmp(udata.lattice,'hexa') & ~mod(row,2)
+  col = round(coords(1,1) - 0.5);
+else
+  col = round(coords(1,1));
+end
+
+ind = sub2ind(udata.msize,row,col);
+new_marks=find(udata.bmus==ind);
+
+if strcmp(get(gcbo,'Tag'),'TmpPatch');
+  
+  % if the callback is made via temporary patch object, node is marked
+  % (node is black) => the mark is to be removed 
+  
+  node_color = getfield(get(gcbo,'FaceVertexCData'),{ind,[1:3]});
+  AGAIN = 1;
+end
+
+
+
+for i=1:length(udata.tmp_patch)
+  color = get(udata.tmp_patch(i),'FaceVertexCData');
+  if length(size(color)) ~= 2
+    color = reshape(color,[size(color,1) 3]);
+  end
+  if all(isnan(color(ind,:)))
+    NEW=1;
+    color(ind,:)=[0 0 0];
+  else
+    color(ind,:)=[NaN NaN NaN];
+  end
+  set(udata.tmp_patch(i),'FaceVertexCData',color);
+end
+
+set(0,'CurrentFigure',udata.fig1);
+
+for j=1:length(udata.h)
+  subplot(udata.h(j));
+  if NEW
+    y=getfield(get(udata.d(j),'YData'),{new_marks});
+    udata.d_mark(j).h=[udata.d_mark(j).h;plot(new_marks,y,'Color',[0 0 0],...
+                                              'LineStyle','none',...
+                                              'Marker','o')];
+  end
+end
+
+
+if ~isempty(udata.fig2)
+  set(0,'CurrentFigure',udata.fig2);
+  for j=1:length(udata.h2);
+    subplot(udata.h2(j));
+    if NEW
+      y=getfield(get(udata.d2(j),'YData'),{new_marks});
+      udata.d_mark2(j).h=[udata.d_mark2(j).h;plot(new_marks,y,...
+						  'LineStyle','none',...
+						  'Color','black',...
+						  'Marker','o')];
+    end
+  end
+end
+
+if NEW
+  udata.new_marks=[udata.new_marks; new_marks];
+end
+
+if AGAIN
+  
+  % find marks from the data that map to the clicked node. if the color
+  % of the mark(s) is the same as the node's color, remove mark(s), else
+  % let mark be unchanged.
+  
+  for i=1:length(udata.d_mark(1).h)
+    if all(node_color==get(udata.d_mark(1).h(i),'Color'))
+      tmp1 = get(udata.d_mark(1).h(i),'XData');
+      tmp2 = setdiff(tmp1,new_marks);
+      if length(tmp1) ~= length(tmp2)
+        inds=[];
+        for j=1:length(tmp2);
+          inds=[inds find(tmp2(j)==tmp1)];
+        end
+        for j=1:length(udata.d_mark)
+          ydata=getfield(get(udata.d_mark(j).h(i),'YData'),{inds});
+          set(udata.d_mark(j).h(i),'XData',tmp2,'YData',ydata);
+        end
+        if ~isempty(udata.fig2)
+          for j=1:length(udata.d_mark2)
+            ydata=getfield(get(udata.d_mark2(j).h(i),'YData'),{inds});
+            set(udata.d_mark2(j).h(i),'XData',tmp2,'YData',ydata);
+          end
+        end
+      end  
+    end
+  end
+  udata.new_marks=setdiff(udata.new_marks, new_marks);
+  udata.all_marks=setdiff(udata.all_marks,new_marks);
+end
+
+set(udata.fig1,'UserData',udata);
+set(0,'CurrentFigure',old);
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function draw_poly()
+
+udata=get(gcf,'UserData');
+udata=get(udata.fig1,'UserData');
+
+if isempty(udata.poly.x)
+  if strcmp(get(gcf,'SelectionType'),'alt')
+    return;
+  end
+  udata.poly.THIS = gca;
+end
+
+% 'THIS' indicates what was the axes where the polygon was meant to
+% drawn. It is not possible to add points, that lie in another axes, to the
+% polygon.
+
+
+if gca ~= udata.poly.THIS
+  return;
+end
+
+coords(1,1) = getfield(get(gca,'CurrentPoint'),{3});
+coords(1,2) = getfield(get(gca,'CurrentPoint'),{1});
+
+udata.poly.x=cat(1,udata.poly.x,coords(2));
+udata.poly.y=cat(1,udata.poly.y,coords(1));
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% remove old 'polygon' from axis
+
+delete(udata.poly.h);
+
+
+switch get(gcf,'SelectionType')
+ case 'normal'
+  
+  % add point to the 'polygon' and draw it
+  
+  for i=1:length(udata.a_h)
+    subplot(udata.a_h(i));
+    hold on;
+    udata.poly.h(i) = plot(udata.poly.x,udata.poly.y,'black',...
+			   'EraseMode','xor',...
+			   'ButtonDownFcn',...
+			   'vis_trajgui([],''click'')',...
+			   'LineWidth',2);
+  end
+ case 'alt'
+  
+  % The polygon is ready.
+  
+  
+  udata.poly.x=cat(1,udata.poly.x,udata.poly.x(1));
+  udata.poly.y=cat(1,udata.poly.y,udata.poly.y(1));
+  
+  for i=1:length(udata.a_h)
+    subplot(udata.a_h(i));
+    udata.poly.h(i) = plot(udata.poly.x,udata.poly.y,'black',...
+			   'EraseMode','xor',...
+			   'ButtonDownFcn',...
+			   'vis_trajgui([],''click'')',...
+			   'LineWidth',2);
+  end
+  
+  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.lattice,'hexa');
+    t=find(~rem(tmp(:,1),2));
+    tmp(t,2)=tmp(t,2)+0.5;
+  end
+  
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  % find the nodes that lie inside polygon and change coordinates to
+  % linear indices.
+  
+  in = find(inpolygon(tmp(:,2),tmp(:,1),udata.poly.x,udata.poly.y));
+  in = sub2ind(udata.msize,tmp2(in,1),tmp2(in,2));
+  
+  colors=get(udata.tmp_patch(1),'FaceVertexCData');
+  colors=reshape(colors,[size(colors,1) 3]);
+  tmp=ones(length(in),1);
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%   
+  % set the color of the nodes just selected, black.
+  
+  colors(in,:)=tmp*[0 0 0];
+  set(udata.tmp_patch,'FaceVertexCData',colors);
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  % find the points mapping to the nodes from data 
+  
+  inds = [];
+  for i=1:length(in)
+    inds=[inds;find(in(i) == udata.bmus)];
+  end
+  
+  %%%%%%%%%%%%%%%%%%%  
+  % plot marks to data
+  
+  set(udata.fig1,'UserData',udata);
+  plot2data(inds);
+  udata=get(udata.fig1,'UserData');
+  udata.new_marks=union(udata.new_marks,inds);
+  delete(udata.poly.h);
+  udata.poly.h=[];
+  udata.poly.x=[];
+  udata.poly.y=[];
+  udata.poly.THIS=[];
+end
+
+set(udata.fig1,'UserData',udata);
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function save_data()
+
+udata=get(gcf,'UserData');
+udata=get(udata.fig1,'UserData');
+
+data.points=[];
+data.nodes=[];
+k=1;
+
+for i=1:length(udata.d_mark(1).h)
+  data.points(i).inds=get(udata.d_mark(1).h(i),'XData');
+  data.points(i).color=get(udata.d_mark(1).h(i),'Color');
+end
+
+color=get(udata.tmp_patch(1),'FaceVertexCData');
+color=reshape(color,[size(color,1) 3]);
+
+for i=1:size(color,1)
+  if all(~isnan(color(i,:)))
+    tmp.ind=i;
+    tmp.color=color(i,:);
+    data.nodes(k)=tmp;
+    k=k+1;
+  end
+end
+
+answer=inputdlg('Enter the name of the output variable:','',1);
+
+if isempty(answer) | isempty(answer{1})
+  msgbox('Output is not set to workspace.');
+  return;
+else
+  assignin('base',answer{1},data);
+  disp(sprintf('Struct is set to the workspace as ''%s''.',answer{1}));
+end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function load_data()
+
+answer = inputdlg('Enter the name of the struct to be loaded:','',1);
+
+if isempty(answer) | isempty(answer{1})
+  msgbox('Data is not loaded.');
+  return;
+end
+
+data=evalin('base',answer{1});
+
+if ~isstruct(data)  
+  errordlg('Input variable must be a struct.');
+  return;
+end
+
+tmp1 = fieldnames(data);
+tmp2 = {'nodes','points'};
+
+for i=1:length(tmp1)
+  for j=1:length(tmp2);
+    if ~any(strcmp(tmp2{j},tmp1))
+      errordlg('Wrong type of struct.');
+      return;
+    end
+  end
+end
+
+if ~isempty(data.points)
+  tmp1=fieldnames(data.points(1));
+end
+if ~isempty(data.nodes)
+  tmp2=fieldnames(data.nodes(1));
+end
+
+for i=1:length(tmp1)
+  if ~any(strcmp(tmp1{i},{'inds','color'}))
+    errordlg('Wrong type of struct.');
+    return;
+  end
+end
+
+for i=1:length(tmp2)
+  if ~any(strcmp(tmp2{i},{'ind','color'}))
+    errordlg('Wrong type of struct.');
+    return;
+  end
+end
+
+udata=get(gcf,'UserData');
+udata=get(udata.fig1,'UserData');
+
+clear_markers;
+remove_traj;
+
+old = gcf;
+
+for i=1:length(data.points)
+  for j=1:length(udata.h);
+    set(0,'CurrentFigure',udata.fig1);
+    subplot(udata.h(j));
+    ydata=getfield(get(udata.d(j),'YData'),{data.points(i).inds});
+    udata.d_mark(j).h=[udata.d_mark(j).h;...
+                       plot(data.points(i).inds,ydata,...
+			    'Color',data.points(i).color,...
+			    'LineStyle','none',...
+			    'Marker','o',...
+			    'ButtonDownFcn',...
+			    'vis_trajgui([],''line_down'')')];  
+    if all(data.points(i).color == [0 0 0])
+      udata.new_marks=unique([udata.new_marks; (data.points(i).inds)']);
+    else
+      udata.all_marks=unique([udata.all_marks; (data.points(i).inds)']);
+    end
+  end
+  if ~isempty(udata.fig2)
+    set(0,'CurrentFigure',udata.fig2);
+    for j=1:length(udata.h2)
+      subplot(udata.h2(j));
+      ydata=getfield(get(udata.d2(j),'YData'),{data.points(i).inds});
+      udata.d_mark2(j).h=[udata.d_mark2(j).h;...
+                          plot(data.points(i).inds,ydata,...
+			       'Color',data.points(i).color,...
+			       'LineStyle','none',...
+			       'Marker','o',...
+			       'ButtonDownFcn',...
+			       'vis_trajgui([],''line_down'')')];
+    end
+  end
+end     
+
+
+set(0,'CurrentFigure',udata.sM_h);
+color=get(udata.tmp_patch(1),'FaceVertexCData');
+color=reshape(color,[size(color,1) 3]);
+for i=1:length(data.nodes)
+  color(data.nodes(i).ind,:)=data.nodes(i).color;
+end
+for i=1:length(udata.tmp_patch);
+  set(udata.tmp_patch(i),'FaceVertexCData',color);
+end
+
+set(0,'CurrentFigure',old);
+set(udata.fig1,'UserData',udata);
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function fuzzy_traj(trajStruct,arg); 
+%function fuzzy_traj(sM_h,sM,sD,interval,arg)
+
+
+if isempty(arg)
+  
+  if strcmp(trajStruct.lattice,'hexa')
+    udata.lattice='hexa';
+    udata.form=vis_patch('hexa');
+  else
+    data.lattice='rect';
+    udata.form=vis_patch('rect');
+  end
+  
+  % interval=[1 size(trajStruct.primary_data,1)];
+  
+  l=size(udata.form,1);
+  dim = size(trajStruct.primary_data,2);
+  udata.a_h=[findobj(get(trajStruct.figure,'Children'),'Tag','Uplane');...
+             findobj(get(trajStruct.figure,'Children'),'Tag','Cplane')];
+  
+  udata.sM_h=trajStruct.figure;
+  udata.msize=trajStruct.msize;
+  
+  %%%%%%%%%%%%%%%
+  %
+  % constructing patch that is drawn above every plane in map
+  %
+  
+  nx = repmat(udata.form(:,1),1,prod(udata.msize));
+  ny = repmat(udata.form(:,2),1,prod(udata.msize));
+  
+  x_c=reshape(repmat(1:udata.msize(2),l*udata.msize(1),1),l,prod(udata.msize));
+  y_c=repmat(repmat(1:udata.msize(1),l,1),1,udata.msize(2));
+  
+  if strcmp(udata.lattice,'hexa')
+    t = find(~rem(y_c(1,:),2));
+    x_c(:,t)=x_c(:,t)+.5;
+  end
+  
+  x_c=x_c+nx;
+  y_c=y_c+ny;
+  
+  udata.orig_c=ones(prod(udata.msize),1)*[NaN NaN NaN];
+  colors=reshape(udata.orig_c,[1 size(udata.orig_c,1) 3]);
+  set(0,'CurrentFigure',trajStruct.figure);
+  
+  %%%%%%%%%
+  % drawing 
+  
+  for i=1:length(udata.a_h);
+    subplot(udata.a_h(i));
+    v=caxis;
+    udata.patch_h(i) =patch(x_c,y_c,colors,'EdgeColor','none');
+    caxis(v);
+  end
+  
+  
+  udata.orig_x=get(udata.patch_h(1),'XData');
+  udata.orig_y=get(udata.patch_h(1),'YData');
+  
+  %  if interval(1) < 1 | interval(2) > size(trajStruct.primary_data,1)
+  %    error('Invalid argument ''interval''.');
+  %  end
+  
+  x=1:size(trajStruct.primary_data,1);
+  udata.fig1=figure;
+  set(udata.fig1,'KeyPressFcn',...
+                 'vis_trajgui([],''move_fuzzy'')');
+  for i=1:size(trajStruct.primary_data,2)
+    subplot(size(trajStruct.primary_data,2),1,i);
+    udata.h(i)=gca;
+    set(udata.h(1),'XTick',[]);
+    udata.d(i)=plot(x,trajStruct.primary_data(:,i));
+    l_x=1;
+    lims(1) = round(min(trajStruct.primary_data(:,i)));
+    lims(2) = round(max(trajStruct.primary_data(:,i)));
+    udata.l(i) = line([l_x l_x],lims,'Color','red','EraseMode','xor');
+  end
+  
+  udata.l_x = l_x;  
+  udata.interval=[1 size(trajStruct.bmus,2)];
+  
+  tmp.fig1=udata.fig1;
+  %  [K,P] = estimate_kernels(sM,sD);
+  %  udata.K=K;
+  %  udata.P=P;
+  %  udata.codebook=sM.codebook;
+  %  udata.data=sD.data;
+  udata.bmus=trajStruct.bmus;
+  set(udata.fig1,'UserData',udata);
+  set(trajStruct.figure,'UserData',tmp);  
+  draw_fuzzy(l_x);
+  return;
+end
+
+move_fuzzy;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function draw_fuzzy(x)
+
+udata=get(gcf,'UserData');
+udata=get(udata.fig1,'UserData');
+
+inds = find(udata.bmus(:,x));
+[row col] = ind2sub(udata.msize,inds);
+if strcmp(udata.lattice,'hexa')
+  t=find(~mod(row,2));
+  col(t)=col(t)+0.5;
+end
+
+color=udata.orig_c;
+color=reshape(color,[size(color,1) 3]);
+xdata=udata.orig_x;
+ydata=udata.orig_y;
+tmp= ones(size(xdata(:,1),1),1)*udata.bmus(inds,x)';
+color(inds,:) = ones(length(inds),1)*[0 0 0];
+xdata(:,inds) = udata.form(:,1)*ones(1,length(inds)).*tmp+ones(6,1)*col';
+ydata(:,inds) = udata.form(:,2)*ones(1,length(inds)).*tmp+ones(6,1)*row';
+
+set(udata.patch_h,'FaceVertexCData',color,'XData',xdata,'YData',ydata);
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function move_fuzzy
+
+% moves pointer lines and draws fuzzy response.
+
+udata=get(gcf,'UserData');
+udata=get(udata.fig1,'UserData');
+
+switch get(gcf,'CurrentCharacter');
+ case {'<','>'}
+  key = get(gcf,'CurrentCharacter');
+  if key == '>'
+    if udata.l_x + 1 > udata.interval(2) 
+      return;
+    end
+    l_x = udata.l_x + 1;
+  else
+    if udata.l_x - 1 < udata.interval(1)
+      return;
+    end
+    l_x = udata.l_x - 1;
+  end
+  draw_fuzzy(l_x);
+  set(udata.l,'XData',[l_x l_x]);
+  udata.l_x=l_x;
+  set(udata.fig1,'UserData',udata);
+ otherwise
+  return;
+end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+