struct2ANTS.m
author A.M. Thurnherr <ant@ldeo.columbia.edu>
Tue, 21 Feb 2012 14:30:23 -0500
changeset 5 2e9ce6753135
parent 3 5e3caf9c0f2e
child 9 79a432124b57
permissions -rw-r--r--
.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
     1
%======================================================================
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
     2
%                    S T R U C T 2 A N T S . M 
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
     3
%                    doc: Thu Oct 20 11:48:17 2005
5
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 3
diff changeset
     4
%                    dlm: Tue Feb 21 14:30:01 2012
0
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
     5
%                    (c) 2005 A.M. Thurnherr
5
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 3
diff changeset
     6
%                    uE-Info: 93 0 NIL 0 0 72 2 2 4 NIL ofnI
0
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
     7
%======================================================================
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
     8
%
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
     9
% export Matlab structure to ANTS file
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    10
%
3
5e3caf9c0f2e first whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
    11
% USAGE: struct2ANTS(struct,dependencies,outFileName)
0
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    12
%
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    13
% NOTES:
3
5e3caf9c0f2e first whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
    14
%	- <dependencies> can be a string of a cell array of strings
0
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    15
%	- scalar strings & numbers become %PARAMs
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    16
%	- row and column vectors (which can be mixed) become FIELDs
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    17
%	- incompatible vectors, as well as other data types, are skipped
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    18
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    19
% HISTORY:
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    20
%  Oct 20, 2005: - created
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    21
%  Nov 30, 2005: - BUG: string %PARAMs have to be quoted, e.g. if containing +
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    22
%  Apr 19, 2006: - changed output number format according to $# in perlvar(1)
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    23
%  Nov  6, 2006: - made output into doubles for increased precision
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    24
%  Nov 16, 2007: - replaced cell2mat() by char()
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    25
%  Apr 15, 2008: - added vector-compatibility test
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    26
%				 - cosmetics
1
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
    27
%  Oct 12, 2009: - added ifn (ANTS 4.0: deps)
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
    28
%  Oct 13, 2009: - allowed for NULL ifn, ofn
3
5e3caf9c0f2e first whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
    29
%  Oct 13, 2010: - allowed for multiple dependencies
5e3caf9c0f2e first whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
    30
%				 - added usage help
5e3caf9c0f2e first whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
    31
%  Jul 23: 2011: - BUG: empty dep did not work
5e3caf9c0f2e first whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
    32
%  Jul 24, 2011: - BUG: PARAMS with % did not work
5e3caf9c0f2e first whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
    33
%  Jul 25, 2011: - commented out diagnostic message about skipped incompatible vectors
5e3caf9c0f2e first whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
    34
%  Dec 30, 2011: - workaround for Matlab R11b bug: /tmp/foo cannot be written, /../tmp/foo can
5
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 3
diff changeset
    35
%  Feb 20, 2012: - BUG: diagnostic messages did not show field prefices
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 3
diff changeset
    36
%                - BUG: skipped fields ended up in Layout after all
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 3
diff changeset
    37
%  Feb 21, 2012: - removed double quoting of % and $
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 3
diff changeset
    38
%				 - manually merged two versions
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 3
diff changeset
    39
%				 - re-added diagnostic messages about skipped incompatible vectors
0
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    40
3
5e3caf9c0f2e first whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
    41
function [] = struct2ANTS(struct,deps,ofn)
5e3caf9c0f2e first whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
    42
5e3caf9c0f2e first whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
    43
	if nargin ~= 3
5e3caf9c0f2e first whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
    44
		help struct2ANTS
5e3caf9c0f2e first whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
    45
		return
5e3caf9c0f2e first whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
    46
	end
5e3caf9c0f2e first whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
    47
5e3caf9c0f2e first whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
    48
	if iscell(deps)
5e3caf9c0f2e first whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
    49
		dlist = sprintf('%s,',deps{:});
5e3caf9c0f2e first whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
    50
	else
5e3caf9c0f2e first whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
    51
		dlist = sprintf('%s',deps);
5e3caf9c0f2e first whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
    52
	end
5e3caf9c0f2e first whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
    53
	
0
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    54
	[ldef,dta] = parseStruct(struct,'','',[],ofn);
3
5e3caf9c0f2e first whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
    55
	save /../tmp/.struct2ANTS dta -ASCII -DOUBLE;	% ARGH Matlab R11b on Freebsd 8.2 requires this weird path
5e3caf9c0f2e first whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
    56
	
1
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
    57
	if length(ofn) == 0
3
5e3caf9c0f2e first whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
    58
		system(sprintf('list -M%%.15g -d ''%s'' %s /tmp/.struct2ANTS',dlist,ldef));
1
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
    59
	else
3
5e3caf9c0f2e first whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 1
diff changeset
    60
		system(sprintf('list -M%%.15g -d ''%s'' %s /tmp/.struct2ANTS > %s',dlist,ldef,ofn));
1
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 0
diff changeset
    61
	end
0
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    62
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    63
%======================================================================
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    64
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    65
function [ldef,dta] = parseStruct(struct,ldef,fpref,dta,ofn);
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    66
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    67
	fname = fieldnames(struct);
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    68
	for i=1:length(fname)
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    69
		fns = char(fname(i));
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    70
		f = getfield(struct,fns);
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    71
		if isstruct(f)
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    72
			[ldef,dta] = parseStruct(f,ldef,[fns '.'],dta,ofn);
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    73
		elseif ischar(f)
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    74
			ldef = sprintf('%%%s%s="\\"%s\\"" %s',fpref,fns,f,ldef);
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    75
		elseif isnumeric(f)
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    76
			[r c] = size(f);
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    77
			if r+c == 2
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    78
				ldef = sprintf('%%%s%s=%.15g %s',fpref,fns,f,ldef);
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    79
			else
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    80
				if isempty(dta), ndta = max(r,c);
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    81
				else, 			 ndta = size(dta,1);
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    82
				end
5
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 3
diff changeset
    83
				if 	   r==1 && length(f)==ndta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 3
diff changeset
    84
					ldef = sprintf('%s%s%s= ',ldef,fpref,fns);
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 3
diff changeset
    85
					dta = [dta,f'];
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 3
diff changeset
    86
				elseif c==1 && length(f)==ndta
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 3
diff changeset
    87
					ldef = sprintf('%s%s%s= ',ldef,fpref,fns);
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 3
diff changeset
    88
					dta = [dta,f];
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 3
diff changeset
    89
				else
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents: 3
diff changeset
    90
					disp(sprintf('%s: incompatible %d x %d array %s%s skipped',ofn,r,c,fpref,fns));
0
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    91
				end
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    92
			end
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    93
		else
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    94
			disp(sprintf('%s: field %s%s skipped',ofn,fpref,fns));
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    95
		end
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    96
	end
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    97
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    98
				
40938dd7a1f1 created with ANTS 4.0
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    99