-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathloadAndSaveCommModelPyCommunityModel.m
93 lines (77 loc) · 3.42 KB
/
loadAndSaveCommModelPyCommunityModel.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
function [cnap] = loadAndSaveCommModelPyCommunityModel(sbmlFilePath, dG0FilePath, savePath, defaultMinConcentration, defaultMaxConcentration, nondefaultConcentrationsMat, exchangeMinConcentration, exchangeMaxConcentration)
ext_comparts = {};
% Load metabolic model SBML file
[cnap, ~] = CNAsbmlModel2MFNetwork(sbmlFilePath, ext_comparts);
% Load dG0 JSON file
text = fileread(dG0FilePath);
jsondata = jsondecode(text);
jsonReactionKeys = fieldnames(jsondata);
% Set up result matrices
numReactions = numel(cnap.reacID(:,1));
dG0s = cell(1, numReactions);
uncertainties = cell(1, numReactions);
for currentReaction = 1:numReactions
reactionName = cnap.reacID(currentReaction,:);
% reverse = contains(string(reactionName), "_TG_reverse");
reactionNameTemp = "\b"+ string(reactionName);
reactionNameAsKey = strrep(reactionNameTemp, '\bR_', '');
reactionNameAsKey = strtrim(reactionNameAsKey);
if numel(reactionNameAsKey{1}) >= 1
isXToAdd = isstrprop(reactionNameAsKey, "digit");
if isXToAdd(1)
reactionNameAsKey = "x"+string(reactionNameAsKey);
end
end
isJsonKey = 0;
for j = 1:numel(jsonReactionKeys)
jsonReactionKey = jsonReactionKeys{j};
if reactionNameAsKey == jsonReactionKey
isJsonKey = 1;
break
end
end
if isJsonKey
thermodynamicReactionData = eval("jsondata."+reactionNameAsKey);
dG0 = thermodynamicReactionData.dG0;
uncertainty = thermodynamicReactionData.uncertainty;
dG0s{currentReaction} = dG0;
uncertainties{currentReaction} = uncertainty;
else
dG0s{currentReaction} = NaN;
uncertainties{currentReaction} = NaN;
end
end
% METABOLITES
numMetabolites = numel(cnap.specID(:,1));
minConcentrations = cell(1, numMetabolites);
maxConcentrations = cell(1, numMetabolites);
% Set default concentration ranges
for currentMetabolite = 1:length(minConcentrations)
metaboliteId = strtrim(convertCharsToStrings(cnap.specID(currentMetabolite, :)));
metaboliteIdSplit = strsplit(metaboliteId, "_");
metaboliteSpecies = metaboliteIdSplit(end);
if metaboliteSpecies == "exchg"
minConcentrations{currentMetabolite} = exchangeMinConcentration;
maxConcentrations{currentMetabolite} = exchangeMaxConcentration;
else
minConcentrations{currentMetabolite} = defaultMinConcentration;
maxConcentrations{currentMetabolite} = defaultMaxConcentration;
end
end
% Set non-default concentration ranges
nondefaultMatSize = size(nondefaultConcentrationsMat);
numNondefaultConcentrations = nondefaultMatSize(1);
for currentNondefault = 1:numNondefaultConcentrations
metaboliteIndex = PSBCNAFindMetabolite(nondefaultConcentrationsMat(currentNondefault, 1), cnap);
nondefaultMinConcentration = str2double(nondefaultConcentrationsMat(currentNondefault, 2));
nondefaultMaxConcentration = str2double(nondefaultConcentrationsMat(currentNondefault, 3));
minConcentrations{metaboliteIndex} = nondefaultMinConcentration;
maxConcentrations{metaboliteIndex} = nondefaultMaxConcentration;
end
% ADD GENERIC DATA
[cnap, ~] = CNAsetGenericReactionData_with_array(cnap, 'dG0', dG0s);
[cnap, ~] = CNAsetGenericReactionData_with_array(cnap, 'uncertainty', uncertainties);
[cnap, ~] = CNAsetGenericSpeciesData_with_array(cnap, 'minConcentration', minConcentrations);
[cnap, ~] = CNAsetGenericSpeciesData_with_array(cnap, 'maxConcentration', maxConcentrations);
save(savePath, 'cnap')
end