Back to the main Index

Changing enzyme concentrations

Analysis of the yeast glycolysis model.

Which enzyme changes result in atp/adp > 3 ?

The model has the Vmax values defines as local parameters on the reactions. In a first step we promote all the local parameters to global parameters and find the parameters which correspond to Vmax values.

In [1]:
%matplotlib inline
from __future__ import print_function
import tellurium as te

# load the model
r = te.loadSBMLModel('yeast_glycolysis.xml')

# promote all the local parameters to global parameters
sbml_str = r.getSBML()
sbmlp_str = r.getParamPromotedSBML(sbml_str)
r = te.loads(sbmlp_str)
print(r.getGlobalParameterIds())
['HXT_Ki', 'HXT_Kglc', 'HXT_Vmax', 'HK_Kadp', 'HK_Kg6p', 'HK_Keq', 'HK_Katp', 'HK_Kglc', 'HK_Vmax', 'PGI_Kf6p', 'PGI_Keq', 'PGI_Kg6p', 'PGI_Vmax', 'PFK_Catp', 'PFK_Kf16', 'PFK_Cf16', 'PFK_Kf26', 'PFK_Cf26', 'PFK_Kamp', 'PFK_Camp', 'PFK_Kiatp', 'PFK_Ciatp', 'PFK_L0', 'PFK_Katp', 'PFK_Kf6p', 'PFK_gR', 'PFK_Vmax', 'ALD_Kigap', 'ALD_Kgap', 'ALD_Kdhap', 'ALD_Keq', 'ALD_Kf16bp', 'ALD_Vmax', 'TPI_k2', 'TPI_k1', 'GAPDH_Knadh', 'GAPDH_Kbpg', 'GAPDH_Vmaxr', 'GAPDH_Knad', 'GAPDH_Kgap', 'GAPDH_Vmaxf', 'GAPDH_C', 'PGK_Kadp', 'PGK_Kbpg', 'PGK_Katp', 'PGK_Kp3g', 'PGK_Keq', 'PGK_Vmax', 'PGM_Kp2g', 'PGM_Keq', 'PGM_Kp3g', 'PGM_Vmax', 'ENO_Kpep', 'ENO_Keq', 'ENO_Kp2g', 'ENO_Vmax', 'PYK_Katp', 'PYK_Kpyr', 'PYK_Keq', 'PYK_Kadp', 'PYK_Kpep', 'PYK_Vmax', 'PDC_nH', 'PDC_Kpyr', 'PDC_Vmax', 'ADH_Kietoh', 'ADH_Kiacald', 'ADH_Kacald', 'ADH_Kinadh', 'ADH_Knadh', 'ADH_Knad', 'ADH_Keq', 'ADH_Kinad', 'ADH_Ketoh', 'ADH_Vmax', 'ATPase_Katpase', 'AK_k2', 'AK_k1', 'G3PDH_Knad', 'G3PDH_Kglycerol', 'G3PDH_Keq', 'G3PDH_Knadh', 'G3PDH_Kdhap', 'G3PDH_Vmax', 'Glycogen_Branch_KGLYCOGEN', 'Trehalose_Branch_Ktrehalose', 'Succinate_Branch_k']
In [2]:
# find Vmax parameters
import re
vmaxs = []
for p in sorted(r.getGlobalParameterIds()):
    if re.match(pattern='^\w+_Vmax\w*$', string=p) is not None:
        print(p, '=', r[p])
        vmaxs.append(p)
ADH_Vmax = 209.5
ALD_Vmax = 94.69
ENO_Vmax = 201.6
G3PDH_Vmax = 47.11
GAPDH_Vmaxf = 1152.0
GAPDH_Vmaxr = 6719.0
HK_Vmax = 236.7
HXT_Vmax = 97.24
PDC_Vmax = 857.8
PFK_Vmax = 110.0
PGI_Vmax = 1056.0
PGK_Vmax = 1288.0
PGM_Vmax = 2585.0
PYK_Vmax = 1000.0

ATP/ADP

Now we look at the ATP/ADP of the model.

In [3]:
r.resetToOrigin()
s = r.simulate(0,1E6,101)
r.plot(s, loc=None)
print('ATP/ADP = {:.2f}'.format(r.ATP/r.ADP))
# model reaches steady state, everything looks good
ATP/ADP = 0.62

Parameter variation

Now we change all the Vmax and see how the ratio changes

In [4]:
import numpy as np
# parameter variation on log scale relative to initial value
factors = np.logspace(-2.5, 2.5, num=25)
Nv = len(vmaxs)
Nf = len(factors)

atp = np.zeros([Nv, Nf])
adp = np.zeros_like(atp)

# simulate
# we have no idea in which parameter areas the model will be unstable
# so we just catch these cases and set the atp and adp values to NaN
for kv, p in enumerate(vmaxs):
    print('***', p, '***')
    p_init = r[p]
    for kf, f in enumerate(factors):
        r.resetToOrigin()
        r[p] = f * p_init
        try:
            s = r.simulate(0,1E6,101)
            # store the ratio
            atp[kv, kf] = r.ATP
            adp[kv, kf] = r.ADP
        except RuntimeError:
            print('unstable: {} = {:.2f}'.format(p, r[p]))
            atp[kv, kf] = np.nan
            adp[kv, kf] = np.nan    
*** ADH_Vmax ***
unstable: ADH_Vmax = 0.66
unstable: ADH_Vmax = 1.07
unstable: ADH_Vmax = 1.73
unstable: ADH_Vmax = 2.79
unstable: ADH_Vmax = 4.51
unstable: ADH_Vmax = 11.78
unstable: ADH_Vmax = 19.03
*** ALD_Vmax ***
unstable: ALD_Vmax = 0.30
unstable: ALD_Vmax = 0.48
unstable: ALD_Vmax = 0.78
unstable: ALD_Vmax = 1.26
unstable: ALD_Vmax = 2.04
unstable: ALD_Vmax = 3.30
unstable: ALD_Vmax = 5.32
unstable: ALD_Vmax = 8.60
unstable: ALD_Vmax = 13.90
*** ENO_Vmax ***
unstable: ENO_Vmax = 0.64
unstable: ENO_Vmax = 1.03
unstable: ENO_Vmax = 1.66
unstable: ENO_Vmax = 2.69
unstable: ENO_Vmax = 4.34
unstable: ENO_Vmax = 11.34
unstable: ENO_Vmax = 18.32
unstable: ENO_Vmax = 29.59
*** G3PDH_Vmax ***
unstable: G3PDH_Vmax = 0.15
unstable: G3PDH_Vmax = 0.24
unstable: G3PDH_Vmax = 0.39
unstable: G3PDH_Vmax = 122.96
unstable: G3PDH_Vmax = 198.66
unstable: G3PDH_Vmax = 320.96
unstable: G3PDH_Vmax = 518.54
unstable: G3PDH_Vmax = 837.75
unstable: G3PDH_Vmax = 1353.46
unstable: G3PDH_Vmax = 2186.65
unstable: G3PDH_Vmax = 3532.75
unstable: G3PDH_Vmax = 5707.51
unstable: G3PDH_Vmax = 9221.04
unstable: G3PDH_Vmax = 14897.49
*** GAPDH_Vmaxf ***
unstable: GAPDH_Vmaxf = 3.64
unstable: GAPDH_Vmaxf = 5.89
unstable: GAPDH_Vmaxf = 9.51
unstable: GAPDH_Vmaxf = 15.36
unstable: GAPDH_Vmaxf = 24.82
unstable: GAPDH_Vmaxf = 40.10
unstable: GAPDH_Vmaxf = 64.78
unstable: GAPDH_Vmaxf = 104.66
*** GAPDH_Vmaxr ***
*** HK_Vmax ***
unstable: HK_Vmax = 5.10
unstable: HK_Vmax = 8.24
unstable: HK_Vmax = 13.31
unstable: HK_Vmax = 21.50
unstable: HK_Vmax = 34.74
unstable: HK_Vmax = 56.13
unstable: HK_Vmax = 90.68
unstable: HK_Vmax = 146.51
*** HXT_Vmax ***
unstable: HXT_Vmax = 0.31
unstable: HXT_Vmax = 0.80
unstable: HXT_Vmax = 8.83
unstable: HXT_Vmax = 14.27
unstable: HXT_Vmax = 23.06
unstable: HXT_Vmax = 37.25
unstable: HXT_Vmax = 60.19
*** PDC_Vmax ***
unstable: PDC_Vmax = 2.71
unstable: PDC_Vmax = 4.38
unstable: PDC_Vmax = 7.08
unstable: PDC_Vmax = 11.44
unstable: PDC_Vmax = 18.48
unstable: PDC_Vmax = 29.86
*** PFK_Vmax ***
unstable: PFK_Vmax = 0.35
unstable: PFK_Vmax = 0.56
unstable: PFK_Vmax = 0.91
unstable: PFK_Vmax = 1.47
unstable: PFK_Vmax = 2.37
unstable: PFK_Vmax = 3.83
unstable: PFK_Vmax = 6.19
unstable: PFK_Vmax = 9.99
unstable: PFK_Vmax = 16.15
unstable: PFK_Vmax = 26.09
*** PGI_Vmax ***
unstable: PGI_Vmax = 3.34
unstable: PGI_Vmax = 5.40
unstable: PGI_Vmax = 8.72
unstable: PGI_Vmax = 14.08
unstable: PGI_Vmax = 22.75
*** PGK_Vmax ***
unstable: PGK_Vmax = 4.07
unstable: PGK_Vmax = 6.58
*** PGM_Vmax ***
unstable: PGM_Vmax = 13.21
unstable: PGM_Vmax = 21.34
unstable: PGM_Vmax = 34.47
*** PYK_Vmax ***
unstable: PYK_Vmax = 3.16
unstable: PYK_Vmax = 8.25
unstable: PYK_Vmax = 21.54
unstable: PYK_Vmax = 34.81
unstable: PYK_Vmax = 56.23

Now we plot the results

In [5]:
import matplotlib.pyplot as plt

# maximum ignoring nans
max_atp = np.nanmax(np.nanmax(atp))
max_adp = np.nanmax(np.nanmax(adp))

for kv, p in enumerate(vmaxs):
    print('***', p, '***')
    plt.figure(num=None, figsize=(14, 5), dpi=80, facecolor='w', edgecolor='k')
    plt.subplot(1,3,1)
    plt.plot(atp[kv,:], adp[kv,:], '-o', color='black')
    plt.title('ADP ~ ATP ({})'.format(p), fontweight='bold')
    plt.xlabel('ATP', fontweight='bold')
    # plt.xlim([0, max_atp*1.05])
    plt.ylabel('ADP', fontweight='bold')
    # plt.ylim([0, max_adp*1.05])
    
    plt.subplot(1,3,2)
    plt.plot(factors, adp[kv,:], '-o', color='red')
    plt.plot(factors, atp[kv,:], '-o', color='blue')
    plt.plot([1, 1], [0, 3], linestyle='-', color='grey')
    plt.title('ADP, ATP ~ factors ({})'.format(p), fontweight='bold')
    plt.xlabel('Vmax factor', fontweight='bold')
    plt.xlim([min(factors)*0.95, max(factors)*1.05])
    plt.xscale('log')
    plt.ylabel('ATP (blue) & ADP (red)', fontweight='bold')
    plt.ylim([0, max_atp*1.05])
    
    plt.subplot(1,3,3)
    plt.plot(factors, atp[kv,:]/adp[kv,:], '-o', color='red')
    plt.title('ATP/ADP ~ factors ({})'.format(p), fontweight='bold')
    # line for atp/adp of interest
    plt.plot([1, 1], [0, 3], linestyle='-', color='grey')
    plt.plot([min(factors)*0.95, max(factors)*1.05], [3.0, 3.0], linestyle='--', color='grey')
    plt.xlabel('Vmax factor', fontweight='bold')
    plt.xscale('log')
    plt.xlim([min(factors)*0.95, max(factors)*1.05])
    plt.ylabel('ATP/ADP', fontweight='bold')
    
    plt.show()
*** ADH_Vmax ***
*** ALD_Vmax ***
*** ENO_Vmax ***
*** G3PDH_Vmax ***
*** GAPDH_Vmaxf ***
*** GAPDH_Vmaxr ***
*** HK_Vmax ***
*** HXT_Vmax ***
*** PDC_Vmax ***
*** PFK_Vmax ***
*** PGI_Vmax ***
*** PGK_Vmax ***
*** PGM_Vmax ***
*** PYK_Vmax ***
In [ ]: