function sMap=sompak_sammon(sMap,ft,cout,ct,rlen)

%SOMPAK_SAMMON Call SOM_PAK Sammon's mapping program from Matlab.
%
%  P = sompak_sammon(sMap,ft,cout,ct,rlen)
%
% ARGUMENTS ([]'s are optional and can be given as empty: [] or '')
%  sMap   (struct) map struct
%         (string) filename
%  [ft]   (string) 'pak' or 'box'. Argument must be defined, if
%                  input file is used.
%  [cout] (string) output file name. If argument is not defined 
%                  (i.e argument is '[]') temporary file '__abcdef' is
%                  used in operations and *it_is_removed* after 
%                  operations!!!
%  [ct]   (string) 'pak' or 'box'. Argument must be defined, if
%                  output file is used.
%  rlen   (scalar) running length
%
% RETURNS: 
%  P      (matrix) the mapping coordinates
%
% Calls SOM_PAK Sammon's mapping program (sammon) from Matlab. Notice
% that to use this function, the SOM_PAK programs must be in your
% search path, or the variable 'SOM_PAKDIR' which is a string
% containing the program path, must be defined in the workspace.
% SOM_PAK programs can be found from:
% http://www.cis.hut.fi/research/som_lvq_pak.shtml
%
% See also SOMPAK_INIT, SOMPAK_SAMMON, SOMPAK_SAMMON_GUI,
%          SOMPAK_GUI, SAMMON.

% 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

NO_FILE = 0;

nargchk(5,5,nargin);

if ~(isstruct(sMap) | isstr(sMap))
  error('Argument ''sMap'' must be a struct or filename.');
end

if isstr(sMap)
 if isempty(ft) | ~isstr(ft) | ~(strcmp(ft,'pak') | strcmp(ft,'box'))
   error('Argument ''ft'' must be string ''pak'' or ''box''.');
 end
 if strcmp(ft,'pak')
   sMap=som_read_cod(sMap);
 else
   new_var=diff_varname;
   varnames=evalin('base','who');
   loadname=eval(cat(2,'who(''-file'',''',sMap,''')'));
   if any(strcmp(loadname{1},evalin('base','who')))
     assignin('base',new_var,evalin('base',loadname{1}));
     evalin('base',cat(2,'load(''',sMap,''');'));
     new_var2=diff_varname;

     assignin('base',new_var2,evalin('base',loadname{1}));
     assignin('base',loadname{1},evalin('base',new_var));
     evalin('base',cat(2,'clear ',new_var));
     sMap=evalin('base',new_var2);
     evalin('base',cat(2,'clear ',new_var2));
   else
     evalin('base',cat(2,'load(''',sMap,''');'));
     sMap=evalin('base',loadname{1});
     evalin('base',cat(2,'clear ',loadname{1}));
   end   
 end
end

if ~isstr(cout) & isempty(cout)
  NO_FILE = 1;
  cout = '__abcdef';
elseif ~isstr(cout) | isempty(cout)
  error('Argument ''cout'' must be a string or ''[]''.');
end

if ~NO_FILE & (isempty(ct) | ~(strcmp(ct,'pak') | strcmp(ct,'box')))
  error('Argument ''ct'' must be string ''pak'' or ''box''.');
end

som_write_cod(sMap,cout);

if ~is_positive_integer(rlen)
  error('Argument ''rlen'' must be a positive integer.');
end

if any(strcmp('SOM_PAKDIR',evalin('base','who')))
  command=cat(2,evalin('base','SOM_PAKDIR'),'sammon ');
else
  command='sammon ';
end

str = sprintf('%s -cin %s -cout %s -rlen %d',command,cout,cout,rlen);

if isunix
  unix(str);
else
  dos(str);
end

sMap=som_read_cod(cout);

if ~NO_FILE
  if isunix
    unix(cat(2,'/bin/rm ',cout));
  else
    dos(cat(2,'del ',cout));
  end
  if strcmp(ct,'box');
    sMap=sMap.codebook;
    eval(cat(2,'save ',cout,' sMap'));
    disp(cat(2,'Output is saved to the file ',sprintf('''%s.mat''.',cout)));
  else
    som_write_cod(sMap,cout);
    sMap=sMap.codebook;
    disp(cat(2,'Output is saved to the file ',cout,'.'));
  end
else
  if isunix
    unix('/bin/rm __abcdef');
  else
    dos('del __abcdef');
  end
end


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function bool = is_positive_integer(x)

bool = ~isempty(x) & isreal(x) & all(size(x) == 1) & x > 0;
if ~isempty(bool)
  if bool & x~=round(x)
    bool = 0;
  end
else
  bool = 0;
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function str = diff_varname();

array=evalin('base','who');

if isempty(array)
  str='a';
  return;
end

for i=1:length(array)
  lens(i)=length(array{i});
end


ind=max(lens);

str(1:ind+1)='a';

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%