-
Notifications
You must be signed in to change notification settings - Fork 75
/
Copy pathsavenirfast.m
143 lines (129 loc) · 4.07 KB
/
savenirfast.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
function savenirfast(v, f, filestub, nodeseg, nodeprop, proptype)
%
% savenirfast(nirfaststruct,filestub)
% or
% savenirfast(v,f,filestub, nodeseg, proptype, proptype)
%
% save a tetrahedral or surface mesh and associated properties to NIRFAST format
%
% author: Qianqian Fang, <q.fang at neu.edu>
%
% input:
% nirfaststruct: a structure storing the NIRFAST mesh data, type
% 'help readnirfast' to read more; alternatively one can use:
% v: input, node list, the first 3 columns are the x/y/z positions,
% the remaining columns are combined with nodeprop as node-based
% (optical) parameters
% f: input, tetrahedral or surface element list, dimension (ne,3)
% filestub: output file stub, output will include multiple files
% filestub.node: node file
% filestub.elem: element file to store the surface or tet mesh
% filestub.param: parameter file
% filestub.region: node label file
% nodeseg: optional, an integer label field to group nodes into
% segmentations, same length as v, number starting from 0; or empty
% nodeprop: optional, additional nodal parameters, typically defined
% as mua (1/mm), musp (1/mm) and refractive index (n)l; row number
% equals to that of v, column number is user-defined
% proptype: optional, the type of the node-property. by default it is
% 'stnd' - for standard properties; one can also define multi-row
% header using a cell-array.
%
% example:
% [node,face,elem]=meshabox([0 0 0],[10 10 10],0.3,1);
% savenirfast(node,elem,'test', [], ones(size(node)), 'user');
% mymesh=readnirfast('test')
% plotmesh([mymesh.nodes mymesh.bndvtx], mymesh.elements,'x>5')
%
% -- this function is part of iso2mesh toolbox (http://iso2mesh.sf.net)
%
if (nargin < 2)
error('you must provide at least 2 inputs');
end
if (nargin == 2)
filestub = f;
node = v.nodes;
f = v.elements;
proptype = v.type;
if (isfield(v, 'region'))
nodeseg = v.region;
end
if (isfield(v, 'mua'))
nodeprop = [v.mua v.mus v.ri];
end
if (isfield(v, 'bndvtx'))
isboundary = v.bndvtx;
end
v = node;
end
if (size(v, 2) > 3)
if (nargin > 4)
nodeprop = [v(:, 4:end) nodeprop];
else
nodeprop = v(:, 4:end);
end
else
if (nargin < 5)
nodeprop = [];
end
end
if (nargin < 6)
proptype = 'stnd';
end
if (nargin < 4 || isempty(nodeseg))
nodeseg = zeros(size(v, 1), 1);
end
if (nargin < 6)
proptype = 'stnd';
end
if (size(f, 2) > 4)
f(:, 5:end) = [];
end
if (size(v, 2) < 3)
error('v must contain at least 3 columns, and f must have at least 4 columns');
end
if (~exist('isboundary', 'var'))
face = surfedge(f);
isboundary = ismember(1:size(v, 1), face(:));
end
fid = fopen([filestub, '.node'], 'wt');
if (fid == -1)
error('Saving node file failed, check permission or disk space.');
end
fprintf(fid, '%d\t%.16f\t%.16f\t%.16f\n', [isboundary(:) v(:, 1:3)]');
fclose(fid);
if (size(f, 2) < 2 || size(f, 2) > 4)
error('element list f must contain 3 or 4 columns');
end
fid = fopen([filestub, '.elem'], 'wt');
if (fid == -1)
error('Saving elem file failed, check permission or disk space.');
end
fprintf(fid, '%6d\t%6d\t%6d\t%6d\t\n', f');
fclose(fid);
if (~isempty(nodeseg))
if (numel(nodeseg) ~= size(v, 1))
error('nodeseg must have the same length as v');
end
fid = fopen([filestub, '.region'], 'wt');
if (fid == -1)
error('Saving regin file failed, check permission or disk space.');
end
fprintf(fid, '%d\n', nodeseg(:));
fclose(fid);
end
if (~isempty(nodeprop))
if (size(nodeprop, 1) ~= size(v, 1))
error('nodeprop must have the same row number as v');
end
fid = fopen([filestub, '.param'], 'wt');
if (fid == -1)
error('Saving param file failed, check permission or disk space.');
end
if (iscell(proptype))
proptype = strjoin(proptype, '\n');
end
fprintf(fid, [proptype '\n']);
fprintf(fid, [repmat('%.16f\t', 1, size(nodeprop, 2)) '\n'], nodeprop');
fclose(fid);
end