Predict gene knockout strategies ================================ In cameo we have two ways of predicting gene knockout targets: using evolutionary algorithms (OptGene) or linear programming (OptKnock) .. container:: alert alert-warning 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. .. code:: ipython3 from cameo import models from cameo.visualization.plotting.with_plotly import PlotlyPlotter .. code:: ipython3 model = models.bigg.iJO1366 plotter = PlotlyPlotter() .. code:: ipython3 wt_solution = model.optimize() growth = wt_solution.fluxes["BIOMASS_Ec_iJO1366_core_53p95M"] acetate_production = wt_solution.fluxes["EX_ac_e"] .. code:: ipython3 from cameo import phenotypic_phase_plane .. code:: ipython3 p = phenotypic_phase_plane(model, variables=['BIOMASS_Ec_iJO1366_core_53p95M'], objective='EX_ac_e') p.plot(plotter, points=[(growth, acetate_production)]) .. raw:: html .. raw:: html
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. .. code:: ipython3 from cameo.strain_design import OptGene .. code:: ipython3 optgene = OptGene(model) .. code:: ipython3 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) .. parsed-literal:: Starting optimization at Mon, 01 Mar 2021 16:38:37 .. parsed-literal:: HBox() .. parsed-literal:: Finished after 00:45:58 .. code:: ipython3 result .. parsed-literal:: HBox() .. raw:: html

OptGene Result

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
.. code:: ipython3 result.plot(plotter, 0) .. raw:: html
.. code:: ipython3 result.display_on_map(0, "iJO1366.Central metabolism") .. parsed-literal:: Downloading Map from https://escher.github.io/1-0-0/6/maps/Escherichia%20coli/iJO1366.Central%20metabolism.json .. parsed-literal:: 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]: .. math:: \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} .. code:: ipython3 from cameo.strain_design import OptKnock .. code:: ipython3 optknock = OptKnock(model, fraction_of_optimum=0.1) Running multiple knockouts with OptKnock can take a few hours or days… .. code:: ipython3 result = optknock.run(max_knockouts=1, target="EX_ac_e", biomass="BIOMASS_Ec_iJO1366_core_53p95M") .. raw:: html .. parsed-literal:: .. code:: ipython3 result .. parsed-literal:: HBox() .. raw:: html

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
.. code:: ipython3 result.plot(plotter, 0) .. raw:: html
.. code:: ipython3 result.display_on_map(0, "iJO1366.Central metabolism") .. parsed-literal:: Downloading Map from https://escher.github.io/1-0-0/6/maps/Escherichia%20coli/iJO1366.Central%20metabolism.json .. parsed-literal:: 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.