cobrapy icon indicating copy to clipboard operation
cobrapy copied to clipboard

Cannot swap co-factor pairs of a model reaction within a context

Open Midnighter opened this issue 5 years ago • 0 comments

Problem description

I would like to reversibly (within a context) swap co-factors. This unexpectedly results in a KeyError.

Code Sample

import cobra
from cobra.test import create_test_model

config = cobra.Configuration()
config.solver = "glpk"
model = create_test_model("textbook")

nad = model.metabolites.nad_c
nadh = model.metabolites.nadh_c
nadp = model.metabolites.nadp_c
nadph = model.metabolites.nadph_c
with model:
    rxn: cobra.Reaction = model.reactions.PDH
    metabolites = rxn.metabolites
    # Swap from source to target co-factors.
    if nad in rxn.metabolites:
        metabolites[nadp] = metabolites[nad]
        metabolites[nadph] = metabolites[nadh]
        metabolites[nad] = 0
        metabolites[nadh] = 0
    elif nadp in rxn.metabolites:
        metabolites[nad] = metabolites[nadp]
        metabolites[nadh] = metabolites[nadph]
        metabolites[nadp] = 0
        metabolites[nadph] = 0
    else:
        raise KeyError(
            f"Neither co-factor swap partner present in "
            f"predicted target reaction '{rxn.id}'."
        )
    rxn.add_metabolites(metabolites, combine=False)

Actual Output

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-8-7459538646d8> in <module>
     22             f"predicted target reaction '{rxn.id}'."
     23         )
---> 24     rxn.add_metabolites(metabolites, combine=False, reversibly=True)
python3.6/site-packages/cobra/core/reaction.py in add_metabolites(self, metabolites_to_add, combine, reversibly)
    861                 mets_to_reset = {
    862                     key: old_coefficients[model.metabolites.get_by_any(key)[0]]
--> 863                     for key in iterkeys(metabolites_to_add)}
    864 
    865                 context(partial(
python3.6/site-packages/cobra/core/reaction.py in <dictcomp>(.0)
    861                 mets_to_reset = {
    862                     key: old_coefficients[model.metabolites.get_by_any(key)[0]]
--> 863                     for key in iterkeys(metabolites_to_add)}
    864 
    865                 context(partial(

KeyError: <Metabolite nad_c at 0x7f2704150ac8>

Expected Output

Should just work as it does when not in a context.

Dependency Information

System Information

OS Linux OS-release 4.15.0-50-generic Python 3.6.7

Package Versions

cobra 0.15.3 depinfo 1.5.1 future 0.17.1 numpy 1.16.3 optlang 1.4.4 pandas 0.24.2 pbr 5.1.3 pip 19.1.1 python-libsbml-experimental 5.18.0 ruamel.yaml 0.15.96 setuptools 41.0.1 six 1.12.0 swiglpk 4.65.0 tabulate 0.8.3 wheel 0.33.4

Midnighter avatar May 28 '19 00:05 Midnighter