Skip to content

Commit 3aa5af0

Browse files
authored
fix: getStandardKcat use modelAdapter enzyme_comp (#402)
solves #400
1 parent 5e2ef53 commit 3aa5af0

2 files changed

Lines changed: 141 additions & 127 deletions

File tree

doc/src/geckomat/gather_kcats/getStandardKcat.html

Lines changed: 133 additions & 126 deletions
Original file line numberDiff line numberDiff line change
@@ -279,134 +279,141 @@ <h2><a name="_source"></a>SOURCE CODE <a href="#_top"><img alt="^" border="0" sr
279279
0177 <span class="comment">% Add a new metabolite named prot_standard</span>
280280
0178 proteinStdMets.mets = <span class="string">'prot_standard'</span>;
281281
0179 proteinStdMets.metNames = proteinStdMets.mets;
282-
0180 proteinStdMets.compartments = <span class="string">'c'</span>;
283-
0181 <span class="keyword">if</span> isfield(model,<span class="string">'metNotes'</span>)
284-
0182 proteinStdMets.metNotes = <span class="string">'Standard enzyme-usage pseudometabolite'</span>;
285-
0183 <span class="keyword">end</span>
286-
0184 model = addMets(model, proteinStdMets);
287-
0185
288-
0186 <span class="comment">% Add a protein usage reaction if not a light version</span>
289-
0187 proteinStdUsageRxn.rxns = {<span class="string">'usage_prot_standard'</span>};
290-
0188 proteinStdUsageRxn.rxnNames = proteinStdUsageRxn.rxns;
291-
0189 proteinStdUsageRxn.mets = {proteinStdMets.mets, <span class="string">'prot_pool'</span>};
292-
0190 proteinStdUsageRxn.stoichCoeffs = [-1, 1];
293-
0191 proteinStdUsageRxn.lb = -1000;
294-
0192 proteinStdUsageRxn.ub = 0;
295-
0193 proteinStdUsageRxn.grRules = proteinStdGenes.genes;
296-
0194
297-
0195 model = addRxns(model, proteinStdUsageRxn);
298-
0196 <span class="keyword">end</span>
299-
0197 <span class="comment">% Update .ec structure in model</span>
300-
0198 model.ec.genes(end+1) = {<span class="string">'standard'</span>};
301-
0199 model.ec.enzymes(end+1) = {<span class="string">'standard'</span>};
302-
0200 model.ec.mw(end+1) = standardMW;
303-
0201 model.ec.sequence(end+1) = {<span class="string">''</span>};
304-
0202 <span class="comment">% Additional info</span>
305-
0203 <span class="keyword">if</span> isfield(model.ec,<span class="string">'concs'</span>)
306-
0204 model.ec.concs(end+1) = nan();
307-
0205 <span class="keyword">end</span>
308-
0206
309-
0207 <span class="comment">% Expand the enzyme rxns matrix</span>
310-
0208 model.ec.rxnEnzMat = [model.ec.rxnEnzMat, zeros(length(model.ec.rxns), 1)]; <span class="comment">% 1 new enzyme</span>
311-
0209 model.ec.rxnEnzMat = [model.ec.rxnEnzMat; zeros(length(rxnsMissingGPR), length(model.ec.enzymes))]; <span class="comment">% new rxns</span>
312-
0210 <span class="keyword">end</span>
313-
0211 stdMetIdx = find(strcmpi(model.ec.enzymes, <span class="string">'standard'</span>));
314-
0212
315-
0213 <span class="comment">% Remove previous standard kcat assignment</span>
316-
0214 oldStandardEnz = find(strcmp(model.ec.source,<span class="string">'standard'</span>));
317-
0215 <span class="keyword">if</span> ~isempty(oldStandardEnz)
318-
0216 oldStandardProt = logical(model.ec.rxnEnzMat(oldStandardEnz,stdMetIdx));
319-
0217 <span class="comment">% If annotated with real enzyme =&gt; set kcat to zero</span>
320-
0218 model.ec.kcat(oldStandardEnz(~oldStandardProt)) = 0;
321-
0219 model.ec.source(oldStandardEnz(~oldStandardProt)) = {<span class="string">''</span>};
322-
0220 <span class="comment">% If annotated with standard protein =&gt; remove entry</span>
323-
0221 model.ec.rxns(oldStandardEnz(oldStandardProt)) = [];
324-
0222 model.ec.kcat(oldStandardEnz(oldStandardProt)) = [];
325-
0223 model.ec.source(oldStandardEnz(oldStandardProt)) = [];
326-
0224 model.ec.notes(oldStandardEnz(oldStandardProt)) = [];
327-
0225 model.ec.eccodes(oldStandardEnz(oldStandardProt)) = [];
328-
0226 model.ec.rxnEnzMat(oldStandardEnz(oldStandardProt),:) = [];
329-
0227 <span class="keyword">end</span>
330-
0228
331-
0229 numRxns = length(model.ec.rxns);
332-
0230 <span class="keyword">for</span> i = 1:numel(rxnsMissingGPR)
333-
0231 rxnIdx = rxnsMissingGPR(i);
334-
0232
335-
0233 <span class="comment">% Update .ec structure in model</span>
336-
0234 <span class="keyword">if</span> ~model.ec.geckoLight
337-
0235 model.ec.rxns(end+1) = model.rxns(rxnIdx);
338-
0236 <span class="comment">% Add prefix in case is light version</span>
339-
0237 <span class="keyword">else</span>
340-
0238 model.ec.rxns{end+1} = [<span class="string">'001_'</span> model.rxns{rxnIdx}];
341-
0239 <span class="keyword">end</span>
342-
0240
343-
0241 <span class="keyword">if</span> ~standard
344-
0242 kcatSubSystemIdx = strcmpi(enzSubSystem_names, model.subSystems{rxnIdx}(1));
345-
0243 <span class="keyword">if</span> all(kcatSubSystemIdx)
346-
0244 model.ec.kcat(end+1) = kcatSubSystem(kcatSubSystemIdx);
347-
0245 <span class="keyword">else</span>
348-
0246 model.ec.kcat(end+1) = standardKcat;
349-
0247 <span class="keyword">end</span>
350-
0248 <span class="keyword">else</span>
351-
0249 model.ec.kcat(end+1) = standardKcat;
352-
0250 <span class="keyword">end</span>
353-
0251
354-
0252 model.ec.source(end+1) = {<span class="string">'standard'</span>};
355-
0253 model.ec.notes(end+1) = {<span class="string">''</span>};
356-
0254 model.ec.eccodes(end+1) = {<span class="string">''</span>};
357-
0255
358-
0256 <span class="comment">% Update the enzyme rxns matrix</span>
359-
0257 model.ec.rxnEnzMat(numRxns+i, stdMetIdx) = 1;
360-
0258 <span class="keyword">end</span>
361-
0259 <span class="comment">% Get the rxns identifiers of the updated rxns</span>
362-
0260 rxnsMissingGPR = model.rxns(rxnsMissingGPR);
363-
0261
364-
0262 <span class="keyword">if</span> fillZeroKcat
365-
0263 zeroKcat = model.ec.kcat == 0 | isnan(model.ec.kcat);
366-
0264 model.ec.kcat(zeroKcat) = standardKcat;
367-
0265 model.ec.source(zeroKcat) = {<span class="string">'standard'</span>};
368-
0266 rxnsNoKcat = model.ec.rxns(zeroKcat);
369-
0267 <span class="keyword">else</span>
370-
0268 rxnsNoKcat = [];
371-
0269 <span class="keyword">end</span>
372-
0270 <span class="keyword">end</span>
373-
0271
374-
0272 <a name="_sub1" href="#_subfunctions" class="code">function Cflat = flattenCell(C,strFlag)</a>
375-
0273 <span class="comment">%FLATTENCELL Flatten a nested column cell array into a matrix cell array.</span>
376-
0274 <span class="comment">%</span>
377-
0275 <span class="comment">% CFLAT = FLATTENCELL(C) takes a column cell array in which one or more</span>
378-
0276 <span class="comment">% entries is a nested cell array, and flattens it into a 2D matrix cell</span>
379-
0277 <span class="comment">% array, where the nested entries are spread across new columns.</span>
380-
0278 <span class="comment">%</span>
381-
0279 <span class="comment">% CFLAT = FLATTENCELL(C,STRFLAG) if STRFLAG is TRUE, empty entries in the</span>
382-
0280 <span class="comment">% resulting CFLAT will be replaced with empty strings {''}. Default = FALSE</span>
383-
0281 <span class="keyword">if</span> nargin &lt; 2
384-
0282 strFlag = false;
385-
0283 <span class="keyword">end</span>
386-
0284
387-
0285 <span class="comment">% determine which entries are cells</span>
388-
0286 cells = cellfun(@iscell,C);
389-
0287
390-
0288 <span class="comment">% determine number of elements in each nested cell</span>
391-
0289 cellsizes = cellfun(@numel,C);
392-
0290 cellsizes(~cells) = 1; <span class="comment">% ignore non-cell entries</span>
282+
0180 <span class="comment">% Validate compartment</span>
283+
0181 proteinStdMets.compartments = strcmp(model.compNames,params.enzyme_comp);
284+
0182 <span class="keyword">if</span> ~any(proteinStdMets.compartments)
285+
0183 error([<span class="string">'Compartment '</span> params.enzyme_comp <span class="string">' (specified in params.enzyme_comp) '</span><span class="keyword">...</span>
286+
0184 <span class="string">'cannot be found in model.compNames'</span>])
287+
0185 <span class="keyword">end</span>
288+
0186 proteinStdMets.compartments = model.comps(compartmentID);
289+
0187
290+
0188 <span class="keyword">if</span> isfield(model,<span class="string">'metNotes'</span>)
291+
0189 proteinStdMets.metNotes = <span class="string">'Standard enzyme-usage pseudometabolite'</span>;
292+
0190 <span class="keyword">end</span>
293+
0191 model = addMets(model, proteinStdMets);
294+
0192
295+
0193 <span class="comment">% Add a protein usage reaction if not a light version</span>
296+
0194 proteinStdUsageRxn.rxns = {<span class="string">'usage_prot_standard'</span>};
297+
0195 proteinStdUsageRxn.rxnNames = proteinStdUsageRxn.rxns;
298+
0196 proteinStdUsageRxn.mets = {proteinStdMets.mets, <span class="string">'prot_pool'</span>};
299+
0197 proteinStdUsageRxn.stoichCoeffs = [-1, 1];
300+
0198 proteinStdUsageRxn.lb = -1000;
301+
0199 proteinStdUsageRxn.ub = 0;
302+
0200 proteinStdUsageRxn.grRules = proteinStdGenes.genes;
303+
0201
304+
0202 model = addRxns(model, proteinStdUsageRxn);
305+
0203 <span class="keyword">end</span>
306+
0204 <span class="comment">% Update .ec structure in model</span>
307+
0205 model.ec.genes(end+1) = {<span class="string">'standard'</span>};
308+
0206 model.ec.enzymes(end+1) = {<span class="string">'standard'</span>};
309+
0207 model.ec.mw(end+1) = standardMW;
310+
0208 model.ec.sequence(end+1) = {<span class="string">''</span>};
311+
0209 <span class="comment">% Additional info</span>
312+
0210 <span class="keyword">if</span> isfield(model.ec,<span class="string">'concs'</span>)
313+
0211 model.ec.concs(end+1) = nan();
314+
0212 <span class="keyword">end</span>
315+
0213
316+
0214 <span class="comment">% Expand the enzyme rxns matrix</span>
317+
0215 model.ec.rxnEnzMat = [model.ec.rxnEnzMat, zeros(length(model.ec.rxns), 1)]; <span class="comment">% 1 new enzyme</span>
318+
0216 model.ec.rxnEnzMat = [model.ec.rxnEnzMat; zeros(length(rxnsMissingGPR), length(model.ec.enzymes))]; <span class="comment">% new rxns</span>
319+
0217 <span class="keyword">end</span>
320+
0218 stdMetIdx = find(strcmpi(model.ec.enzymes, <span class="string">'standard'</span>));
321+
0219
322+
0220 <span class="comment">% Remove previous standard kcat assignment</span>
323+
0221 oldStandardEnz = find(strcmp(model.ec.source,<span class="string">'standard'</span>));
324+
0222 <span class="keyword">if</span> ~isempty(oldStandardEnz)
325+
0223 oldStandardProt = logical(model.ec.rxnEnzMat(oldStandardEnz,stdMetIdx));
326+
0224 <span class="comment">% If annotated with real enzyme =&gt; set kcat to zero</span>
327+
0225 model.ec.kcat(oldStandardEnz(~oldStandardProt)) = 0;
328+
0226 model.ec.source(oldStandardEnz(~oldStandardProt)) = {<span class="string">''</span>};
329+
0227 <span class="comment">% If annotated with standard protein =&gt; remove entry</span>
330+
0228 model.ec.rxns(oldStandardEnz(oldStandardProt)) = [];
331+
0229 model.ec.kcat(oldStandardEnz(oldStandardProt)) = [];
332+
0230 model.ec.source(oldStandardEnz(oldStandardProt)) = [];
333+
0231 model.ec.notes(oldStandardEnz(oldStandardProt)) = [];
334+
0232 model.ec.eccodes(oldStandardEnz(oldStandardProt)) = [];
335+
0233 model.ec.rxnEnzMat(oldStandardEnz(oldStandardProt),:) = [];
336+
0234 <span class="keyword">end</span>
337+
0235
338+
0236 numRxns = length(model.ec.rxns);
339+
0237 <span class="keyword">for</span> i = 1:numel(rxnsMissingGPR)
340+
0238 rxnIdx = rxnsMissingGPR(i);
341+
0239
342+
0240 <span class="comment">% Update .ec structure in model</span>
343+
0241 <span class="keyword">if</span> ~model.ec.geckoLight
344+
0242 model.ec.rxns(end+1) = model.rxns(rxnIdx);
345+
0243 <span class="comment">% Add prefix in case is light version</span>
346+
0244 <span class="keyword">else</span>
347+
0245 model.ec.rxns{end+1} = [<span class="string">'001_'</span> model.rxns{rxnIdx}];
348+
0246 <span class="keyword">end</span>
349+
0247
350+
0248 <span class="keyword">if</span> ~standard
351+
0249 kcatSubSystemIdx = strcmpi(enzSubSystem_names, model.subSystems{rxnIdx}(1));
352+
0250 <span class="keyword">if</span> all(kcatSubSystemIdx)
353+
0251 model.ec.kcat(end+1) = kcatSubSystem(kcatSubSystemIdx);
354+
0252 <span class="keyword">else</span>
355+
0253 model.ec.kcat(end+1) = standardKcat;
356+
0254 <span class="keyword">end</span>
357+
0255 <span class="keyword">else</span>
358+
0256 model.ec.kcat(end+1) = standardKcat;
359+
0257 <span class="keyword">end</span>
360+
0258
361+
0259 model.ec.source(end+1) = {<span class="string">'standard'</span>};
362+
0260 model.ec.notes(end+1) = {<span class="string">''</span>};
363+
0261 model.ec.eccodes(end+1) = {<span class="string">''</span>};
364+
0262
365+
0263 <span class="comment">% Update the enzyme rxns matrix</span>
366+
0264 model.ec.rxnEnzMat(numRxns+i, stdMetIdx) = 1;
367+
0265 <span class="keyword">end</span>
368+
0266 <span class="comment">% Get the rxns identifiers of the updated rxns</span>
369+
0267 rxnsMissingGPR = model.rxns(rxnsMissingGPR);
370+
0268
371+
0269 <span class="keyword">if</span> fillZeroKcat
372+
0270 zeroKcat = model.ec.kcat == 0 | isnan(model.ec.kcat);
373+
0271 model.ec.kcat(zeroKcat) = standardKcat;
374+
0272 model.ec.source(zeroKcat) = {<span class="string">'standard'</span>};
375+
0273 rxnsNoKcat = model.ec.rxns(zeroKcat);
376+
0274 <span class="keyword">else</span>
377+
0275 rxnsNoKcat = [];
378+
0276 <span class="keyword">end</span>
379+
0277 <span class="keyword">end</span>
380+
0278
381+
0279 <a name="_sub1" href="#_subfunctions" class="code">function Cflat = flattenCell(C,strFlag)</a>
382+
0280 <span class="comment">%FLATTENCELL Flatten a nested column cell array into a matrix cell array.</span>
383+
0281 <span class="comment">%</span>
384+
0282 <span class="comment">% CFLAT = FLATTENCELL(C) takes a column cell array in which one or more</span>
385+
0283 <span class="comment">% entries is a nested cell array, and flattens it into a 2D matrix cell</span>
386+
0284 <span class="comment">% array, where the nested entries are spread across new columns.</span>
387+
0285 <span class="comment">%</span>
388+
0286 <span class="comment">% CFLAT = FLATTENCELL(C,STRFLAG) if STRFLAG is TRUE, empty entries in the</span>
389+
0287 <span class="comment">% resulting CFLAT will be replaced with empty strings {''}. Default = FALSE</span>
390+
0288 <span class="keyword">if</span> nargin &lt; 2
391+
0289 strFlag = false;
392+
0290 <span class="keyword">end</span>
393393
0291
394-
0292 <span class="comment">% flatten single-entry cells</span>
395-
0293 Cflat = C;
396-
0294 Cflat(cells &amp; (cellsizes == 1)) = cellfun(@(x) x{1},Cflat(cells &amp; (cellsizes == 1)),<span class="string">'UniformOutput'</span>,false);
397-
0295
398-
0296 <span class="comment">% iterate through multi-entry cells</span>
399-
0297 multiCells = find(cellsizes &gt; 1);
400-
0298 <span class="keyword">for</span> i = 1:length(multiCells)
401-
0299 cellContents = Cflat{multiCells(i)};
402-
0300 Cflat(multiCells(i),1:length(cellContents)) = cellContents;
403-
0301 <span class="keyword">end</span>
394+
0292 <span class="comment">% determine which entries are cells</span>
395+
0293 cells = cellfun(@iscell,C);
396+
0294
397+
0295 <span class="comment">% determine number of elements in each nested cell</span>
398+
0296 cellsizes = cellfun(@numel,C);
399+
0297 cellsizes(~cells) = 1; <span class="comment">% ignore non-cell entries</span>
400+
0298
401+
0299 <span class="comment">% flatten single-entry cells</span>
402+
0300 Cflat = C;
403+
0301 Cflat(cells &amp; (cellsizes == 1)) = cellfun(@(x) x{1},Cflat(cells &amp; (cellsizes == 1)),<span class="string">'UniformOutput'</span>,false);
404404
0302
405-
0303 <span class="comment">% change empty elements to strings, if specified</span>
406-
0304 <span class="keyword">if</span> ( strFlag )
407-
0305 Cflat(cellfun(@isempty,Cflat)) = {<span class="string">''</span>};
408-
0306 <span class="keyword">end</span>
409-
0307 <span class="keyword">end</span></pre></div>
405+
0303 <span class="comment">% iterate through multi-entry cells</span>
406+
0304 multiCells = find(cellsizes &gt; 1);
407+
0305 <span class="keyword">for</span> i = 1:length(multiCells)
408+
0306 cellContents = Cflat{multiCells(i)};
409+
0307 Cflat(multiCells(i),1:length(cellContents)) = cellContents;
410+
0308 <span class="keyword">end</span>
411+
0309
412+
0310 <span class="comment">% change empty elements to strings, if specified</span>
413+
0311 <span class="keyword">if</span> ( strFlag )
414+
0312 Cflat(cellfun(@isempty,Cflat)) = {<span class="string">''</span>};
415+
0313 <span class="keyword">end</span>
416+
0314 <span class="keyword">end</span></pre></div>
410417
<hr><address>Generated by <strong><a href="http://www.artefact.tk/software/matlab/m2html/" title="Matlab Documentation in HTML">m2html</a></strong> &copy; 2005</address>
411418
</body>
412419
</html>

src/geckomat/gather_kcats/getStandardKcat.m

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,14 @@
177177
% Add a new metabolite named prot_standard
178178
proteinStdMets.mets = 'prot_standard';
179179
proteinStdMets.metNames = proteinStdMets.mets;
180-
proteinStdMets.compartments = 'c';
180+
% Validate compartment
181+
proteinStdMets.compartments = strcmp(model.compNames,params.enzyme_comp);
182+
if ~any(proteinStdMets.compartments)
183+
error(['Compartment ' params.enzyme_comp ' (specified in params.enzyme_comp) '...
184+
'cannot be found in model.compNames'])
185+
end
186+
proteinStdMets.compartments = model.comps(compartmentID);
187+
181188
if isfield(model,'metNotes')
182189
proteinStdMets.metNotes = 'Standard enzyme-usage pseudometabolite';
183190
end

0 commit comments

Comments
 (0)