7. Non-linear dynamic simulationsΒΆ
Dynamic simulations can directly be perform by importing a model that contains parameter values. For large-scale kinetic models though it is recommended to parametrize the initial-conditions to a known / assumed reference steady-state as high dimensional non-linear often exhibit multiple steady-states.
from pytfa.io.json import load_json_model
from skimpy.io.yaml import load_yaml_model
from skimpy.analysis.oracle.load_pytfa_solution import load_concentrations, load_fluxes
from skimpy.core.parameters import ParameterValues
from skimpy.utils.namespace import *
# Units of the parameters are muM and hr
CONCENTRATION_SCALING = 1e6
TIME_SCALING = 1 # 1hr to 1min
DENSITY = 1200 # g/L
GDW_GWW_RATIO = 0.3 # Assumes 70% Water
kmodel = load_yaml_model('./../../models/varma_strain_1.yml')
tmodel = load_json_model('./../../models/tfa_varma.json')
# Reference steady-state data
ref_solution = pd.read_csv('./../../data/tfa_reference_strains.csv',
index_col=0).loc['strain_1',:]
ref_concentrations = load_concentrations(ref_solution, tmodel, kmodel,
concentration_scaling=CONCENTRATION_SCALING)
To run dynamic simulations the model need to contain compiled ODE expressions, by calling kmodel.prepare()
and kmodel.compile_ode(). To compute fluxes at specific time points it can be useful
to build a FluxFunction using the make_flux_fun(kmodel, QSSA) function.
kmodel.compile_ode(sim_type=QSSA,ncpu=8)
# make function to calculate the fluxes
flux_fun = make_flux_fun(kmodel, QSSA)
for k in kmodel.initial_conditions:
kmodel.initial_conditions[k] = ref_concentrations[k]
desings = {'vmax_forward_LDH_D': 2.0,
'vmax_forward_GAPD': 2.0}
fluxes = []
for p,v in desings.items():
kmodel.parameters = parameter_values
# Implement parameter desing
kmodel.parameters[p].value = kmodel.parameters[p].value*v
sol = kmodel.solve_ode(np.logspace(-9,0, 1000),
solver_type='cvode')
# Calculate fluxes:
this_fluxes = []
for i, concentrations in sol.concentrations.iterrows():
t_fluxes = flux_fun(concentrations, parameters=parameter_values)
this_fluxes.append(t_fluxes)
# Make it a DataFrame
this_fluxes = pd.DataFrame(this_fluxes)/ref_fluxes
this_fluxes.index = sol.time
fluxes.append(this_fluxes)
ldh_fluxes = np.array([fluxes[0]['LDH_D'].values, fluxes[1]['LDH_D'].values ]).T
timetrace_plot(sol.time,ldh_fluxes ,
filename='ldh_flux.html',
legend=['2 x [LDH]','2 x [GAPD]'],
backend='svg'
)