From 079ae8ba0c4e0de4fc7ec5402f775065ed890ae0 Mon Sep 17 00:00:00 2001 From: Eduard Kerkhoven Date: Thu, 1 Aug 2024 00:40:34 +0200 Subject: [PATCH] feat: keep track of kcat curations (#385) * doc: README.md MATLAB badge * fix: setKcatForReactions correct source field * feat: sensitivityTuning note of preTuneKcat * doc: adapterTemplate set reviewed to false by default allow for more uniprot protein matches * fix: update tutorial ecYeastGEM.yml * doc: clarify params.enzyme_comp in model adapter --- README.md | 10 +- .../change_model/applyKcatConstraints.html | 3 +- .../change_model/setKcatForReactions.html | 2 +- .../sensitivityTuning.html | 263 ++++++++++-------- .../model_adapter/adapterTemplate.html | 2 +- .../change_model/applyKcatConstraints.m | 1 - .../change_model/setKcatForReactions.m | 2 +- .../sensitivityTuning.m | 15 +- src/geckomat/model_adapter/adapterTemplate.m | 7 +- .../manual_tests/TestYeastGEMSimpleWorkflow.m | 4 +- tutorials/full_ecModel/YeastGEMAdapter.m | 4 + tutorials/full_ecModel/models/ecYeastGEM.yml | 23 +- tutorials/light_ecModel/HumanGEMAdapter.m | 4 + 13 files changed, 192 insertions(+), 148 deletions(-) diff --git a/README.md b/README.md index d7c451e7f..62fdeaa83 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,16 @@ -![Current version](https://badge.fury.io/gh/sysbiochalmers%2Fgecko.svg) +[![Current release](https://img.shields.io/github/release/SysBioChalmers/GECKO/all.svg)](https://GitHub.com/SysBioChalmers/GECKO/releases/) [![GitHub Discussions](https://img.shields.io/github/discussions-search?query=repo%3Asysbiochalmers%2Fgecko&label=GitHub%20Discussions)](https://github.com/SysBioChalmers/GECKO/discussions) [![Zenodo](https://zenodo.org/badge/DOI/10.5281/zenodo.7699818.svg)](https://doi.org/10.5281/zenodo.7699818) +[![MATLAB File Exchange](https://www.mathworks.com/matlabcentral/images/matlab-file-exchange.svg)](https://se.mathworks.com/matlabcentral/fileexchange/125960-gecko-toolbox) -## About GECKO 3.0 + +## About GECKO 3 The **GECKO** toolbox enhances a **G**enome-scale model to account for **E**nzyme **C**onstraints, using **K**inetics and **O**mics. The resulting enzyme-constrained model (**ecModel**) can be used to perform simulations where enzyme allocation is either drawn from a total protein pool, or constrained by measured protein levels from proteomics data. -💡 In the [`GECKO/tutorials`](https://github.com/SysBioChalmers/GECKO/tree/main/tutorials) folder there are examples of how GECKO can be applied to GEMs, in either of its _full_ or _light_ forms. Each `protocol.m` contains instructions on how to reconstruct and analyze an ecModel, demonstrating how different fuctions in GECKO can be used. These two scripts complement the [protocols paper](#citation). +💡 In the [`GECKO/tutorials`](https://github.com/SysBioChalmers/GECKO/tree/main/tutorials) folder there are examples of how GECKO can be applied to GEMs, in either of its _full_ or _light_ forms. Each `protocol.m` contains instructions on how to reconstruct and analyze an ecModel, demonstrating how different fuctions in GECKO can be used. These two scripts complement the [Nature Protocols](https://doi.org/10.1038/s41596-023-00931-7) paper ([**PDF**](https://drive.google.com/file/d/1_AGz6GmQPOyshfUZ6K-L2myzU43rQ6tu/view)). ### Significant changes since protocol publication - GECKO **3.2.0**: all protein usage reactions draw from the protein pool, even if they are constrained by proteomics data. This affects **Step 58** in the protocol, changing behaviour of `constrainEnzConcs` and making `updateProtPool` obsolete, `tutorials/full_ecModel/protocol.m` is updated to reflect this change. See [#357](https://github.com/SysBioChalmers/GECKO/issues/375) for more details. @@ -19,7 +21,7 @@ _**Note:** Regarding code and model compatibility with earlier GECKO versions, s If you have used GECKO in your work, please cite: -> Chen Y, Gustafsson J, Tafur Rangel A, Anton M, Domenzain I, Kittikunapong C, Li F, Yuan L, Nielsen J, Kerkhoven EJ. Reconstruction, simulation and analysis of enzyme-constrained metabolic models using GECKO Toolbox 3.0. Nature Protocols. 2024 Jan 18:1-39. doi: [10.1038/s41596-023-00931-7](https://doi.org/10.1038/s41596-023-00931-7) +> Chen Y, Gustafsson J, Tafur Rangel A, Anton M, Domenzain I, Kittikunapong C, Li F, Yuan L, Nielsen J & Kerkhoven EJ. Reconstruction, simulation and analysis of enzyme-constrained metabolic models using GECKO Toolbox 3.0. *Nature Protocols* **19**, 629-667 (2024). doi:[10.1038/s41596-023-00931-7](https://doi.org/10.1038/s41596-023-00931-7). ## Documentation **Installation instructions** and other information is available in the **[Wiki](https://github.com/SysBioChalmers/GECKO/wiki)**. The source code documentation is also available diff --git a/doc/src/geckomat/change_model/applyKcatConstraints.html b/doc/src/geckomat/change_model/applyKcatConstraints.html index 5f6114c79..f87a2f1e3 100644 --- a/doc/src/geckomat/change_model/applyKcatConstraints.html +++ b/doc/src/geckomat/change_model/applyKcatConstraints.html @@ -177,8 +177,7 @@

SOURCE CODE ^end 0117 end -0118 end -0119 +0118 end
Generated by m2html © 2005
\ No newline at end of file diff --git a/doc/src/geckomat/change_model/setKcatForReactions.html b/doc/src/geckomat/change_model/setKcatForReactions.html index 114a9f0bd..cdcb9ea1e 100644 --- a/doc/src/geckomat/change_model/setKcatForReactions.html +++ b/doc/src/geckomat/change_model/setKcatForReactions.html @@ -113,7 +113,7 @@

SOURCE CODE ^end 0048 end 0049 ecModel.ec.kcat(rxnsToChange) = kcat; -0050 ecModel.ec.source(rxnsToChange) = {'from setKcatForReactions'}; +0050 ecModel.ec.source(rxnsToChange) = {'setKcatForReactions'}; 0051 end
Generated by m2html © 2005
diff --git a/doc/src/geckomat/kcat_sensitivity_analysis/sensitivityTuning.html b/doc/src/geckomat/kcat_sensitivity_analysis/sensitivityTuning.html index 7d71baf63..411721bc7 100644 --- a/doc/src/geckomat/kcat_sensitivity_analysis/sensitivityTuning.html +++ b/doc/src/geckomat/kcat_sensitivity_analysis/sensitivityTuning.html @@ -55,6 +55,10 @@

DESCRIPTION ^SOURCE CODE ^% oldKcat kcat values in the input model 0028 % newKcat kcat values in the output model, after tuning 0029 % -0030 % Usage: -0031 % [model, tunedKcats] = sensitivityTuning(model, desiredGrowthRate, modelAdapter, foldChange, protToIgnore, verbose) -0032 -0033 if nargin < 6 || isempty(verbose) -0034 verbose = true; -0035 end -0036 if nargin < 5 || isempty(protToIgnore) -0037 protToIgnore = {}; -0038 end -0039 if nargin < 4 || isempty(foldChange) -0040 foldChange = 10; -0041 end -0042 if nargin < 3 || isempty(modelAdapter) -0043 modelAdapter = ModelAdapterManager.getDefault(); -0044 if isempty(modelAdapter) -0045 error('Either send in a modelAdapter or set the default model adapter in the ModelAdapterManager.') -0046 end -0047 end -0048 params = modelAdapter.params; -0049 if nargin < 2 || isempty(desiredGrowthRate) -0050 desiredGrowthRate = params.gR_exp; +0030 % Note: The model.ec.notes field will contain the original kcat value and +0031 % source, unless the kcat has previously been set by sensitivityTuning, in +0032 % which case the notes field remains unchanged. +0033 % +0034 % Usage: +0035 % [model, tunedKcats] = sensitivityTuning(model, desiredGrowthRate, modelAdapter, foldChange, protToIgnore, verbose) +0036 +0037 if nargin < 6 || isempty(verbose) +0038 verbose = true; +0039 end +0040 if nargin < 5 || isempty(protToIgnore) +0041 protToIgnore = {}; +0042 end +0043 if nargin < 4 || isempty(foldChange) +0044 foldChange = 10; +0045 end +0046 if nargin < 3 || isempty(modelAdapter) +0047 modelAdapter = ModelAdapterManager.getDefault(); +0048 if isempty(modelAdapter) +0049 error('Either send in a modelAdapter or set the default model adapter in the ModelAdapterManager.') +0050 end 0051 end -0052 -0053 kcatList = []; -0054 m = model; -0055 m.c = double(strcmp(m.rxns, params.bioRxn));% Make sure that growth is maximized +0052 params = modelAdapter.params; +0053 if nargin < 2 || isempty(desiredGrowthRate) +0054 desiredGrowthRate = params.gR_exp; +0055 end 0056 -0057 [res,hs] = solveLP(m); -0058 if isempty(res.x) -0059 error('FBA of input model gives no valid result. Reduce protein pool constraint with setProtPoolSize and/or check if exchange constraints are correctly defined.') -0060 end -0061 lastGrowth = 0; -0062 if ~m.ec.geckoLight -0063 %for the full model, we first find the draw reaction with the most flux -0064 drawRxns = startsWith(m.rxns, 'usage_prot_'); -0065 idxToIgnore = cellfun(@(x) find(strcmpi(model.rxns, ['usage_prot_' x])), protToIgnore); -0066 iteration = 1; -0067 while true -0068 [res,hs] = solveLP(m,0,[],hs); %skip parsimonius, only takes time -0069 if (lastGrowth == res.f) -0070 printOrange('WARNING: No growth increase from increased kcats - check if the constraints on the uptake reactions are too tight.\n') -0071 break; -0072 end -0073 lastGrowth = res.f; -0074 if verbose; disp(['Iteration ' num2str(iteration) ': Growth: ' num2str(lastGrowth)]); end -0075 if (lastGrowth >= desiredGrowthRate) -0076 break; -0077 end -0078 %If you get an error here, it is likely due to numerical issues in the solver -0079 %The trick where we don't allow low kcats is to fix that, but maybe -0080 %it is not enough. -0081 iteration = iteration + 1; -0082 %find the highest draw_prot rxn flux -0083 drawFluxes = zeros(length(drawRxns),1); -0084 drawFluxes(drawRxns) = res.x(drawRxns); -0085 % Remove from the list user defined proteins -0086 drawFluxes(idxToIgnore) = 0; -0087 [~,sel] = min(drawFluxes); % since bounds -1000 to 0 -0088 %Now get the metabolite -0089 metSel = m.S(:,sel) < 0; % negative coeff -0090 %now find the reaction with the largest consumption of this protein -0091 protFluxes = m.S(metSel,:).' .* res.x; %negative -0092 [~,rxnSel] = min(protFluxes); -0093 kcatList = [kcatList, rxnSel]; -0094 rxn = m.rxns(rxnSel); -0095 targetSubRxn = strcmp(m.ec.rxns, rxn); -0096 m.ec.kcat(targetSubRxn) = m.ec.kcat(targetSubRxn) .* foldChange; -0097 m = applyKcatConstraints(m,targetSubRxn); -0098 end -0099 -0100 else -0101 origRxns = extractAfter(m.ec.rxns,4); -0102 %find the reactions involved in proteins to be ignored -0103 idxToIgnore = cellfun(@(x) find(m.ec.rxnEnzMat(:, strcmpi(m.ec.enzymes, x))), protToIgnore, 'UniformOutput', false); -0104 %create an unique vector -0105 idxToIgnore = unique(cat(1, idxToIgnore{:})); -0106 %get the correct idx in model.rxns -0107 idxToIgnore = cellfun(@(x) find(strcmpi(m.rxns, x)), origRxns(idxToIgnore)); -0108 iteration = 1; -0109 while true -0110 res = solveLP(m,0); %skip parsimonius, only takes time -0111 if (lastGrowth == res.f) -0112 printOrange('No growth increase from increased kcats - check if the constraints on the uptake reactions are too tight.\n') -0113 break; -0114 end -0115 lastGrowth = res.f; -0116 if (lastGrowth >= desiredGrowthRate) -0117 break; -0118 end -0119 %If you get an error here, it is likely due to numerical issues in the solver -0120 %The trick where we don't allow low kcats is to fix that, but maybe -0121 %it is not enough. -0122 if verbose; disp(['Iteration ' num2str(iteration) ': Growth: ' num2str(lastGrowth)]); end -0123 iteration = iteration + 1; -0124 %find the highest protein usage flux -0125 protPoolStoich = m.S(strcmp(m.mets, 'prot_pool'),:).'; -0126 protPoolStoich(idxToIgnore) = 0; -0127 [~,sel] = min(res.x .* protPoolStoich); %max consumption -0128 kcatList = [kcatList, sel]; -0129 rxn = m.rxns(sel.'); -0130 targetSubRxns = strcmp(origRxns, rxn); -0131 m.ec.kcat(targetSubRxns) = m.ec.kcat(targetSubRxns) .* foldChange; -0132 m = applyKcatConstraints(m,rxn); -0133 end -0134 end -0135 -0136 kcatList = unique(kcatList); -0137 tunedKcats.rxns = m.rxns(kcatList); -0138 tunedKcats.rxnNames = m.rxnNames(kcatList); -0139 if ~model.ec.geckoLight -0140 [~, rxnIdx] = ismember(tunedKcats.rxns,m.ec.rxns); -0141 else -0142 [~, rxnIdx] = ismember(tunedKcats.rxns,origRxns); -0143 end -0144 tunedKcats.enzymes = cell(numel(kcatList),1); -0145 for i=1:numel(rxnIdx) -0146 [~, metIdx] = find(m.ec.rxnEnzMat(rxnIdx(i),:)); -0147 tunedKcats.enzymes{i} = strjoin(m.ec.enzymes(metIdx),';'); -0148 end -0149 tunedKcats.oldKcat = model.ec.kcat(rxnIdx); -0150 tunedKcats.newKcat = m.ec.kcat(rxnIdx); -0151 tunedKcats.source = model.ec.source(rxnIdx); -0152 -0153 model = m; -0154 end +0057 kcatList = []; +0058 m = model; +0059 m.c = double(strcmp(m.rxns, params.bioRxn));% Make sure that growth is maximized +0060 +0061 [res,hs] = solveLP(m); +0062 if isempty(res.x) +0063 error('FBA of input model gives no valid result. Reduce protein pool constraint with setProtPoolSize and/or check if exchange constraints are correctly defined.') +0064 end +0065 lastGrowth = 0; +0066 if ~m.ec.geckoLight +0067 %for the full model, we first find the draw reaction with the most flux +0068 drawRxns = startsWith(m.rxns, 'usage_prot_'); +0069 idxToIgnore = cellfun(@(x) find(strcmpi(model.rxns, ['usage_prot_' x])), protToIgnore); +0070 iteration = 1; +0071 while true +0072 [res,hs] = solveLP(m,0,[],hs); %skip parsimonius, only takes time +0073 if (lastGrowth == res.f) +0074 printOrange('WARNING: No growth increase from increased kcats - check if the constraints on the uptake reactions are too tight.\n') +0075 break; +0076 end +0077 lastGrowth = res.f; +0078 if verbose; disp(['Iteration ' num2str(iteration) ': Growth: ' num2str(lastGrowth)]); end +0079 if (lastGrowth >= desiredGrowthRate) +0080 break; +0081 end +0082 %If you get an error here, it is likely due to numerical issues in the solver +0083 %The trick where we don't allow low kcats is to fix that, but maybe +0084 %it is not enough. +0085 iteration = iteration + 1; +0086 %find the highest draw_prot rxn flux +0087 drawFluxes = zeros(length(drawRxns),1); +0088 drawFluxes(drawRxns) = res.x(drawRxns); +0089 % Remove from the list user defined proteins +0090 drawFluxes(idxToIgnore) = 0; +0091 [~,sel] = min(drawFluxes); % since bounds -1000 to 0 +0092 %Now get the metabolite +0093 metSel = m.S(:,sel) < 0; % negative coeff +0094 %now find the reaction with the largest consumption of this protein +0095 protFluxes = m.S(metSel,:).' .* res.x; %negative +0096 [~,rxnSel] = min(protFluxes); +0097 kcatList = [kcatList, rxnSel]; +0098 rxn = m.rxns(rxnSel); +0099 targetSubRxn = strcmp(m.ec.rxns, rxn); +0100 if ~strcmp(m.ec.source(targetSubRxn),'sensitivityTuning') +0101 oldNote = m.ec.notes{targetSubRxn}; +0102 newNote = ['preTuneKcat=' num2str(m.ec.kcat(targetSubRxn)) ' | source:' m.ec.source{targetSubRxn}]; +0103 if ~isempty(oldNote) +0104 newNote = [oldNote '; ' newNote]; +0105 end +0106 m.ec.notes{targetSubRxn} = newNote; +0107 end +0108 m.ec.kcat(targetSubRxn) = m.ec.kcat(targetSubRxn) .* foldChange; +0109 m.ec.source(targetSubRxn) = {'sensitivityTuning'}; +0110 m = applyKcatConstraints(m,targetSubRxn); +0111 end +0112 +0113 else +0114 origRxns = extractAfter(m.ec.rxns,4); +0115 %find the reactions involved in proteins to be ignored +0116 idxToIgnore = cellfun(@(x) find(m.ec.rxnEnzMat(:, strcmpi(m.ec.enzymes, x))), protToIgnore, 'UniformOutput', false); +0117 %create an unique vector +0118 idxToIgnore = unique(cat(1, idxToIgnore{:})); +0119 %get the correct idx in model.rxns +0120 idxToIgnore = cellfun(@(x) find(strcmpi(m.rxns, x)), origRxns(idxToIgnore)); +0121 iteration = 1; +0122 while true +0123 res = solveLP(m,0); %skip parsimonius, only takes time +0124 if (lastGrowth == res.f) +0125 printOrange('No growth increase from increased kcats - check if the constraints on the uptake reactions are too tight.\n') +0126 break; +0127 end +0128 lastGrowth = res.f; +0129 if (lastGrowth >= desiredGrowthRate) +0130 break; +0131 end +0132 %If you get an error here, it is likely due to numerical issues in the solver +0133 %The trick where we don't allow low kcats is to fix that, but maybe +0134 %it is not enough. +0135 if verbose; disp(['Iteration ' num2str(iteration) ': Growth: ' num2str(lastGrowth)]); end +0136 iteration = iteration + 1; +0137 %find the highest protein usage flux +0138 protPoolStoich = m.S(strcmp(m.mets, 'prot_pool'),:).'; +0139 protPoolStoich(idxToIgnore) = 0; +0140 [~,sel] = min(res.x .* protPoolStoich); %max consumption +0141 kcatList = [kcatList, sel]; +0142 rxn = m.rxns(sel.'); +0143 targetSubRxns = strcmp(origRxns, rxn); +0144 m.ec.kcat(targetSubRxns) = m.ec.kcat(targetSubRxns) .* foldChange; +0145 m = applyKcatConstraints(m,rxn); +0146 end +0147 end +0148 +0149 kcatList = unique(kcatList); +0150 tunedKcats.rxns = m.rxns(kcatList); +0151 tunedKcats.rxnNames = m.rxnNames(kcatList); +0152 if ~model.ec.geckoLight +0153 [~, rxnIdx] = ismember(tunedKcats.rxns,m.ec.rxns); +0154 else +0155 [~, rxnIdx] = ismember(tunedKcats.rxns,origRxns); +0156 end +0157 tunedKcats.enzymes = cell(numel(kcatList),1); +0158 for i=1:numel(rxnIdx) +0159 [~, metIdx] = find(m.ec.rxnEnzMat(rxnIdx(i),:)); +0160 tunedKcats.enzymes{i} = strjoin(m.ec.enzymes(metIdx),';'); +0161 end +0162 tunedKcats.oldKcat = model.ec.kcat(rxnIdx); +0163 tunedKcats.newKcat = m.ec.kcat(rxnIdx); +0164 tunedKcats.source = model.ec.source(rxnIdx); +0165 +0166 model = m; +0167 end
Generated by m2html © 2005
\ No newline at end of file diff --git a/doc/src/geckomat/model_adapter/adapterTemplate.html b/doc/src/geckomat/model_adapter/adapterTemplate.html index a331e49e4..f045cb472 100644 --- a/doc/src/geckomat/model_adapter/adapterTemplate.html +++ b/doc/src/geckomat/model_adapter/adapterTemplate.html @@ -100,7 +100,7 @@

SOURCE CODE ^% Whether only reviewed data from UniProt should be considered. 0055 % Reviewed data has highest confidence, but coverage might be (very) 0056 % low for non-model organisms -0057 obj.params.uniprot.reviewed = true; +0057 obj.params.uniprot.reviewed = false; 0058 0059 % Reaction ID for glucose exchange reaction (or other preferred carbon source) 0060 obj.params.c_source = 'r_1714'; diff --git a/src/geckomat/change_model/applyKcatConstraints.m b/src/geckomat/change_model/applyKcatConstraints.m index 947fd431b..648a1ed17 100644 --- a/src/geckomat/change_model/applyKcatConstraints.m +++ b/src/geckomat/change_model/applyKcatConstraints.m @@ -116,4 +116,3 @@ end end end - diff --git a/src/geckomat/change_model/setKcatForReactions.m b/src/geckomat/change_model/setKcatForReactions.m index f5804cc0c..ca62f315d 100644 --- a/src/geckomat/change_model/setKcatForReactions.m +++ b/src/geckomat/change_model/setKcatForReactions.m @@ -47,5 +47,5 @@ end end ecModel.ec.kcat(rxnsToChange) = kcat; -ecModel.ec.source(rxnsToChange) = {'from setKcatForReactions'}; +ecModel.ec.source(rxnsToChange) = {'setKcatForReactions'}; end diff --git a/src/geckomat/kcat_sensitivity_analysis/sensitivityTuning.m b/src/geckomat/kcat_sensitivity_analysis/sensitivityTuning.m index 169ae74a6..f595f1457 100644 --- a/src/geckomat/kcat_sensitivity_analysis/sensitivityTuning.m +++ b/src/geckomat/kcat_sensitivity_analysis/sensitivityTuning.m @@ -27,6 +27,10 @@ % oldKcat kcat values in the input model % newKcat kcat values in the output model, after tuning % +% Note: The model.ec.notes field will contain the original kcat value and +% source, unless the kcat has previously been set by sensitivityTuning, in +% which case the notes field remains unchanged. +% % Usage: % [model, tunedKcats] = sensitivityTuning(model, desiredGrowthRate, modelAdapter, foldChange, protToIgnore, verbose) @@ -93,7 +97,16 @@ kcatList = [kcatList, rxnSel]; rxn = m.rxns(rxnSel); targetSubRxn = strcmp(m.ec.rxns, rxn); - m.ec.kcat(targetSubRxn) = m.ec.kcat(targetSubRxn) .* foldChange; + if ~strcmp(m.ec.source(targetSubRxn),'sensitivityTuning') + oldNote = m.ec.notes{targetSubRxn}; + newNote = ['preTuneKcat=' num2str(m.ec.kcat(targetSubRxn)) ' | source:' m.ec.source{targetSubRxn}]; + if ~isempty(oldNote) + newNote = [oldNote '; ' newNote]; + end + m.ec.notes{targetSubRxn} = newNote; + end + m.ec.kcat(targetSubRxn) = m.ec.kcat(targetSubRxn) .* foldChange; + m.ec.source(targetSubRxn) = {'sensitivityTuning'}; m = applyKcatConstraints(m,targetSubRxn); end diff --git a/src/geckomat/model_adapter/adapterTemplate.m b/src/geckomat/model_adapter/adapterTemplate.m index 0405e94a9..ff7ed4c09 100644 --- a/src/geckomat/model_adapter/adapterTemplate.m +++ b/src/geckomat/model_adapter/adapterTemplate.m @@ -54,7 +54,7 @@ % Whether only reviewed data from UniProt should be considered. % Reviewed data has highest confidence, but coverage might be (very) % low for non-model organisms - obj.params.uniprot.reviewed = true; + obj.params.uniprot.reviewed = false; % Reaction ID for glucose exchange reaction (or other preferred carbon source) obj.params.c_source = 'r_1714'; @@ -62,7 +62,10 @@ % Reaction ID for biomass pseudoreaction obj.params.bioRxn = 'r_4041'; - % Compartment name in which the added enzymes should be located + % Name of the compartment where the protein pseudometabolites + % should be located (all be located in the same compartment, + % this does not interfere with them catalyzing reactions in + % different compartments). Typically, cytoplasm is chosen. obj.params.enzyme_comp = 'cytoplasm'; end diff --git a/test/manual_tests/TestYeastGEMSimpleWorkflow.m b/test/manual_tests/TestYeastGEMSimpleWorkflow.m index 3e3bfc461..7ebcf9f5c 100644 --- a/test/manual_tests/TestYeastGEMSimpleWorkflow.m +++ b/test/manual_tests/TestYeastGEMSimpleWorkflow.m @@ -2,8 +2,8 @@ GECKORoot = findGECKOroot(); -yeastAdapter = ModelAdapterManager.getAdapter(fullfile(GECKORoot, 'tutorials', 'tutorial_yeast-GEM', 'YeastGEMAdapter.m')); -yeastGEM = importModel(fullfile(yeastAdapter.getParameters().path,'models','yeast-GEM.yml')); +yeastAdapter = ModelAdapterManager.getAdapter(fullfile(GECKORoot, 'tutorials', 'full_ecModel', 'YeastGEMAdapter.m')); +yeastGEM = readYAMLmodel(fullfile(yeastAdapter.getParameters().path,'models','yeast-GEM.yml')); %Full model %%%%%%%%%%%% diff --git a/tutorials/full_ecModel/YeastGEMAdapter.m b/tutorials/full_ecModel/YeastGEMAdapter.m index e7ae4a58a..aa6a7d44c 100644 --- a/tutorials/full_ecModel/YeastGEMAdapter.m +++ b/tutorials/full_ecModel/YeastGEMAdapter.m @@ -33,6 +33,10 @@ obj.params.bioRxn = 'r_4041'; + % Name of the compartment where the protein pseudometabolites + % should be located (all be located in the same compartment, + % this does not interfere with them catalyzing reactions in + % different compartments). Typically, cytoplasm is chosen. obj.params.enzyme_comp = 'cytoplasm'; end diff --git a/tutorials/full_ecModel/models/ecYeastGEM.yml b/tutorials/full_ecModel/models/ecYeastGEM.yml index 1c25dcfd4..092bfadf9 100644 --- a/tutorials/full_ecModel/models/ecYeastGEM.yml +++ b/tutorials/full_ecModel/models/ecYeastGEM.yml @@ -4,7 +4,7 @@ id: "yeastGEM_v8.6.2" name: "The Consensus Genome-Scale Metabolic Model of Yeast" version: "" - date: "2024-06-06" + date: "2024-07-17" defaultLB: "-1000" defaultUB: "1000" givenName: "Eduard" @@ -40877,7 +40877,6 @@ - id: "prot_pool" - name: "prot_pool" - compartment: "c" - - charge: 0 - notes: "Enzyme-usage protein pool" - !!omap - id: "prot_standard" @@ -197765,7 +197764,8 @@ - !!omap - id: "r_0079" - kcat: 5.3357625 - - source: "from setKcatForReactions" + - source: "setKcatForReactions" + - notes: "preTuneKcat=0.05 | source:brenda" - eccodes: "6.3.5.3" - enzymes: !!omap - P38972: 1 @@ -198077,7 +198077,8 @@ - !!omap - id: "r_0109" - kcat: 12.3 - - source: "brenda" + - source: "sensitivityTuning" + - notes: "preTuneKcat=1.23 | source:brenda" - eccodes: "6.3.4.14" - enzymes: !!omap - P48445: 1 @@ -201233,8 +201234,8 @@ - !!omap - id: "r_0450" - kcat: 325 - - source: "custom" - - notes: "GECKO v2 manual_data.txt" + - source: "sensitivityTuning" + - notes: "GECKO v2 manual_data.txt; preTuneKcat=32.5 | source:custom" - eccodes: "4.1.2.13" - enzymes: !!omap - P14540: 1 @@ -201625,8 +201626,8 @@ - !!omap - id: "r_0486_EXP_2" - kcat: 290 - - source: "custom" - - notes: "GECKO v2 manualModifications.m growth limiting" + - source: "sensitivityTuning" + - notes: "GECKO v2 manualModifications.m growth limiting; preTuneKcat=29 | source:custom" - eccodes: "1.2.1.12" - enzymes: !!omap - P00360: 1 @@ -203466,7 +203467,8 @@ - !!omap - id: "r_0698" - kcat: 0.193666666666667 - - source: "brenda" + - source: "sensitivityTuning" + - notes: "preTuneKcat=0.0019367 | source:brenda" - eccodes: "5.4.99.7" - enzymes: !!omap - P38604: 1 @@ -207794,7 +207796,8 @@ - !!omap - id: "r_1166_EXP_11" - kcat: 192.645 - - source: "DLKcat" + - source: "sensitivityTuning" + - notes: "preTuneKcat=19.2645 | source:DLKcat" - enzymes: !!omap - P38695: 1 - !!omap diff --git a/tutorials/light_ecModel/HumanGEMAdapter.m b/tutorials/light_ecModel/HumanGEMAdapter.m index 4a9ae97ba..13756b806 100644 --- a/tutorials/light_ecModel/HumanGEMAdapter.m +++ b/tutorials/light_ecModel/HumanGEMAdapter.m @@ -47,6 +47,10 @@ obj.params.bioRxn = 'MAR13082'; + % Name of the compartment where the protein pseudometabolites + % should be located (all be located in the same compartment, + % this does not interfere with them catalyzing reactions in + % different compartments). Typically, cytoplasm is chosen. obj.params.enzyme_comp = 'Cytosol'; end