Predict gene knockout strategies

In cameo we have two ways of predicting gene knockout targets: using evolutionary algorithms (OptGene) or linear programming (OptKnock)

If you’re running this notebook on try.cameo.bio, things might run very slow due to our inability to provide access to the proprietary CPLEX solver on a public webserver. Furthermore, Jupyter kernels might crash and restart due to memory limitations on the server.

from cameo import models
from cameo.visualization.plotting.with_plotly import PlotlyPlotter
model = models.bigg.iJO1366
plotter = PlotlyPlotter()
wt_solution = model.optimize()
growth = wt_solution.fluxes["BIOMASS_Ec_iJO1366_core_53p95M"]
acetate_production = wt_solution.fluxes["EX_ac_e"]
from cameo import phenotypic_phase_plane
p = phenotypic_phase_plane(model, variables=['BIOMASS_Ec_iJO1366_core_53p95M'], objective='EX_ac_e')
p.plot(plotter, points=[(growth, acetate_production)])

OptGene

OptGene is an approach to search for gene or reaction knockouts that relies on evolutionary algorithms[1]. The following image from the authors summarizes OptGene workflow.

At every iteration, we keep the best 50 individuals found overall so we can generate a library of targets.

from cameo.strain_design import OptGene
optgene = OptGene(model)
result = optgene.run(target=model.reactions.EX_ac_e,
                     biomass=model.reactions.BIOMASS_Ec_iJO1366_core_53p95M,
                     substrate=model.metabolites.glc__D_e,
                     max_evaluations=5000,
                     plot=False)
Starting optimization at Mon, 01 Mar 2021 16:38:37
HBox()
Finished after 00:45:58
result
HBox()

OptGene Result

  • Simulation: fba
  • Objective Function: $$bpcy = \frac{(BIOMASS\_Ec\_iJO1366\_core\_53p95M * EX\_ac\_e)}{EX\_glc\_\_D\_e}$$
reactions genes size fva_min fva_max target_flux biomass_flux yield fitness
0 (ATPS4rpp,) ((b3732,), (b3738,), (b3734,), (b3733,), (b373... 1 0.0 14.187819 13.942932 0.402478 1.394293 0.561172
1 (3HPPPNH, 3HCINNMH, ATPS4rpp) ((b3735, b0347),) 2 0.0 14.187819 13.942932 0.402478 1.394293 0.561172
2 (ATPS4rpp,) ((b3735, b3942), (b3735, b2683)) 2 0.0 14.187817 13.297966 0.402477 1.329797 0.535213
3 (G3PD7, G3PD6, ATPS4rpp) ((b3735, b2241),) 2 0.0 14.187819 0.234472 0.402478 0.023447 0.009437
4 (NADH16pp, NADH17pp, NADH18pp, ATPS4rpp) ((b3735, b2286),) 2 0.0 14.187817 13.709215 0.402477 1.370922 0.551764
5 (PGCD, ATPS4rpp) ((b2913, b3738),) 2 0.0 14.976296 8.512895 0.388364 0.851289 0.330610
6 (ATPS4rpp,) ((b3735, b2095, b2486),) 3 0.0 14.187819 13.942932 0.402478 1.394293 0.561172
result.plot(plotter, 0)
result.display_on_map(0, "iJO1366.Central metabolism")
Downloading Map from https://escher.github.io/1-0-0/6/maps/Escherichia%20coli/iJO1366.Central%20metabolism.json
Builder(reaction_data={'EX_co2_e': 15.638742, 'EX_cobalt2_e': -1e-05, 'DM_4crsol_c': 9e-05, 'DM_5drib_c': 9e-0…

OptKnock

OptKnock uses a bi-level mixed integer linear programming approach to identify reaction knockouts[2]:

\[\begin{split}\begin{matrix} maximize & \mathit{v_{chemical}} & & (\mathbf{OptKnock}) \\ \mathit{y_j} & & & \\ subject~to & maximize & \mathit{v_{biomass}} & (\mathbf{Primal}) \\ & \mathit{v_j} & & & & \\ \end{matrix}\\ \begin{bmatrix} subject~to & \sum_{j=1}^{M}S_{ij}v_{j} = 0,\\ & v_{carbon\_uptake} = v_{carbon~target}\\ & v_{apt} \ge v_{apt\_main}\\ & v_{biomass} \ge v_{target\_biomass}\\ & v_{j}^{min} \cdot y_j \le v_j \le v_{j}^{max} \cdot y_j, \forall j \in \boldsymbol{M} \\ \end{bmatrix}\\ \begin{align} & y_j = {0, 1}, & & \forall j \in \boldsymbol{M} & \\ & \sum_{j \in M} (1 - y_j) \le K& & & \\ \end{align}\end{split}\]
from cameo.strain_design import OptKnock
optknock = OptKnock(model, fraction_of_optimum=0.1)

Running multiple knockouts with OptKnock can take a few hours or days…

result = optknock.run(max_knockouts=1, target="EX_ac_e", biomass="BIOMASS_Ec_iJO1366_core_53p95M")
<IPython.core.display.Javascript object>
result
HBox()

OptKnock:

  • Target: EX_ac_e
reactions size EX_ac_e biomass fva_min fva_max
0 {EX_o2_e} 1 8.207632 0.241502 7.613753 8.662553
1 {O2tex} 1 8.207632 0.241502 7.613756 8.662556
result.plot(plotter, 0)
result.display_on_map(0, "iJO1366.Central metabolism")
Downloading Map from https://escher.github.io/1-0-0/6/maps/Escherichia%20coli/iJO1366.Central%20metabolism.json
Builder(reaction_data={'EX_co2_e': -0.088228, 'EX_cobalt2_e': -6e-06, 'DM_4crsol_c': 5.4e-05, 'DM_5drib_c': 0.…

References

[1]Patil, K. R., Rocha, I., Förster, J., & Nielsen, J. (2005). Evolutionary programming as a platform for in silico metabolic engineering. BMC Bioinformatics, 6, 308. doi:10.1186/1471-2105-6-308

[2]Burgard, A.P., Pharkya, P., Maranas, C.D. (2003), “OptKnock: A Bilevel Programming Framework for Identifying Gene Knockout Strategies for Microbial Strain Optimization,” Biotechnology and Bioengineering, 84(6), 647-657.