-
Notifications
You must be signed in to change notification settings - Fork 1
/
elementalMatrixToFormulae.m
71 lines (71 loc) · 2.35 KB
/
elementalMatrixToFormulae.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
function metForm = elementalMatrixToFormulae(Ematrix, elements, dMax)
% Convert the elemental composition matrix into chemical formulae
%
% USAGE:
% metForm = elementalMatrixToFormulae(elements, Ematrix, dMax)
%
% INPUTS:
% Ematrix: elemental composition (`M` x `E` matrix) for `M` metabolites and `E` elements
% elements: cell array of elements corresponding to the columns of Ematrix
%
% OPTIONAL INPUT:
% dMax: the maximum number of decimal places for the stoichiometry (default 12)
%
% Siu Hung Joshua Chan Nov 2016
if nargin < 3
dMax = 12;
end
%combine duplicate elements
[eleUni,ia,ib] = unique(elements);
if numel(eleUni) < numel(elements)
for j = 1:numel(eleUni)
Ematrix(:,ia(j)) = sum(Ematrix(:,ib == j),2);
end
elements = eleUni;
Ematrix = Ematrix(:,ia);
end
%prioritize elements
[~,id] = ismember({'C';'H';'N';'O';'P';'S'}, elements);
id2 = setdiff(1:numel(elements), id);
elements = elements([id(id~=0); id2(:)]);
Ematrix = Ematrix(:, [id(id~=0); id2(:)]);
elements = elements(:);
%charge put at the end if exist
id = strcmp(elements,'Charge');
if any(id)
elements = [elements(~id); elements(id)];
Ematrix = Ematrix(:,[find(~id); find(id)]);
end
metForm = repmat({''}, size(Ematrix,1),1);
for j = 1:size(Ematrix,1)
if ~any(isnan(Ematrix(j,:)))
if ~any(Ematrix(j,:))
metJ = 'Mass0'; %allow mets with no mass (e.g. photon)
else
metJ = '';
for k = 1:numel(elements)
if abs(Ematrix(j,k)) > 10^(-dMax)
n = full(Ematrix(j,k));
d = 0;
while abs(round(n,d) - n) > 1e-10 && d < dMax
d = d + 1;
end
n = round(n,d);
if n == 1 && ~strcmp(elements{k},'Charge')
metJ = strcat(metJ, elements{k});
else
str = sprintf(['%.' num2str(dMax) 'f'],n);
str = regexp(fliplr(str),'0*+(\d*\.\d*\-?)|(.*)','tokens');
str = fliplr(str{1}{1});
if str(end) == '.'
str(end) = '';
end
metJ = strcat(metJ, elements{k}, str);
end
end
end
end
metForm{j} = metJ;
end
end
end