{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Standalone network compression\n", "\n", "An effective network compression is essential to any strain design computation. Since it may also be of interest outside the context of strain design, this example may help you using the network compression routine independently. Likewise, StrainDesign also offers the integration of GPR rules into the metabolic networks as a separate function.\n", "\n", "The network compression routine removes blocked reactions, removes conservation relations and then alternately lumps **coupled** reactions (compress_model_coupled, using a sparse integer RREF nullspace algorithm by default) and **parallel** reactions (compress_model_parallel). The compression returns a compressed network and a list of so-called \"compression maps\". Each map consists of a dictionary that contains complete information for reversing the compression steps successively and expand information obtained from the compressed model to the full model. Each entry of each map contains the id of a compressed reaction, associated with the original reaction names and their factor (provided as a rational number) with which they were lumped.\n", "\n", "The default backend is backend='sparse_rref' (pure Python, no extra dependencies). A legacy Java-based backend backend='efmtool_rref' is also available via pip install straindesign[java].\n", "\n", "Furthermore, the user can select reactions that should be exempt from the parallel compression. In the following, we provide the code snippet that can be used to call the compression." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Set parameter Username\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:gurobipy:Set parameter Username\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Academic license - for non-commercial use only - expires 2026-12-09\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:gurobipy:Academic license - for non-commercial use only - expires 2026-12-09\n", "INFO:root:Replacing dummy bounds of +/- 1000 with infinite.\n", "WARNING:straindesign.compression:Removing reaction bounds >= 1000.\n", "INFO:root:The original model contains 2712 reactions.\n", "INFO:straindesign.compression: Removing blocked reactions.\n", "INFO:straindesign.compression: Converting coefficients to rationals.\n", "INFO:straindesign.compression: Removing conservation relations.\n", "INFO:straindesign.compression: Compression 1: Lumping coupled reactions.\n", "INFO:straindesign.compression:Compression complete: 6 iterations, 234 zero-flux, 602 contradicting, 970 coupled, 1250 unused metabolites\n", "INFO:straindesign.compression: Reduced to 1237 reactions.\n", "INFO:straindesign.compression: Compression 2: Lumping parallel reactions.\n", "INFO:straindesign.compression: Reduced to 1217 reactions.\n", "INFO:straindesign.compression: Compression 3: Lumping coupled reactions.\n", "INFO:straindesign.compression:Compression complete: 3 iterations, 0 zero-flux, 0 contradicting, 4 coupled, 2 unused metabolites\n", "INFO:straindesign.compression: Reduced to 1215 reactions.\n", "INFO:straindesign.compression: Compression 4: Lumping parallel reactions.\n", "INFO:straindesign.compression: Reduced to 1213 reactions.\n", "INFO:straindesign.compression: Compression 5: Lumping coupled reactions.\n", "INFO:straindesign.compression:Compression complete: 3 iterations, 0 zero-flux, 0 contradicting, 0 coupled, 0 unused metabolites\n", "INFO:straindesign.compression: No further reduction (1213 reactions).\n", "INFO:straindesign.compression: Compression complete (4 iterations).\n" ] } ], "source": [ "from straindesign import compress_model, remove_dummy_bounds\n", "import cobra\n", "import logging\n", "logging.basicConfig(level=logging.INFO)\n", "\n", "# load model\n", "iml1515 = cobra.io.load_model('iML1515')\n", "# replace dummy bounds with infinite\n", "logging.info(f\"Replacing dummy bounds of +/- 1000 with infinite.\")\n", "remove_dummy_bounds(iml1515)\n", "logging.info(f\"The original model contains {len(iml1515.reactions)} reactions.\")\n", "cmp_map = compress_model(iml1515)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here, the original model of iML1515 was compressed from 2712 to 1213 reactions in 4 steps. The greatest reduction in size is achieved in the first step. Still, the benefit of the parallel compression should not be underestimated since it removes superfluous degrees of freedom in the model that don't add significant information. The resulting compression maps can be used to translate data between the compressed and the original network." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:root:Compression step 1 was linear.\n", "INFO:root:Reaction 'ADK4' was lumped to ADK4*NTP10 with the coefficients {'ADK4': Fraction(1, 1), 'NTP10': Fraction(-1, 1)}.\n", "INFO:root:Compression step 2 was parallel.\n", "INFO:root:Reaction 'ADK4*NTP10' was not affected by this reaction\n", "INFO:root:Compression step 3 was linear.\n", "INFO:root:Reaction 'ADK4*NTP10' was not affected by this reaction\n", "INFO:root:Compression step 4 was parallel.\n", "INFO:root:Reaction 'ADK4*NTP10' was lumped to ADK4*NTP10*NADPHXD*NADPHXE*NADPHHR*NADPHHS*NADHHR*NADHXE*NADHHS*NADHXD with the coefficients {'ADK4*NTP10': 1, 'NADPHXD*NADPHXE*NADPHHR*NADPHHS': 1, 'NADHHR*NADHXE*NADHHS*NADHXD': 1}.\n" ] } ], "source": [ "# Let us track the compression of the ADK4 reaction\n", "orig_reac = 'ADK4'\n", "\n", "for i,c in enumerate(cmp_map):\n", " logging.info(f\"Compression step {i+1} was {['parallel' if c['parallel'] else 'linear'][0]}.\")\n", " lumped_reaction = [k for k,v in c['reac_map_exp'].items() if orig_reac in v][0]\n", " if len(c['reac_map_exp'][lumped_reaction]) == 1:\n", " logging.info(f\"Reaction '{orig_reac}' was not affected by this reaction\")\n", " else:\n", " logging.info(f\"Reaction '{orig_reac}' was lumped to {lumped_reaction} with the coefficients {c['reac_map_exp'][lumped_reaction]}.\")\n", " orig_reac = lumped_reaction" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Standalone GPR-integraton" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "GPR rules can be introduced to the metabolic model in a way that the logical GPR-terms are reflected and the gene presence or absence can be simulated by setting flux bounds. This can be useful to investigate the space of feasible steady-state flux vectors after gene knockouts or be used to investigate the role of genes in different elementary flux modes or vectors." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:root:The first 95 reactions are original reactions from e_coli_core. All other reactions result from the integration of GPR rules.\n", "INFO:root:Here, we only print the last 10 reactions of the model for showcasing.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "R_g_b2276_and_g_b2277_and_g_b2278_and_g_b2279_and_g_b2280_and_g_b2281_and_g_b2282_and_g_b2283_and_g_b2284_and_g_b2285_and_g_b2286_and_g_b2287_and_g_b2288: g_b2276 + g_b2277 + g_b2278 + g_b2279 + g_b2280 + g_b2281 + g_b2282 + g_b2283 + g_b2284 + g_b2285 + g_b2286 + g_b2287 + g_b2288 --> g_b2276_and_g_b2277_and_g_b2278_and_g_b2279_and_g_b2280_and_g_b2281_and_g_b2282_and_g_b2283_and_g_b2284_and_g_b2285_and_g_b2286_and_g_b2287_and_g_b2288\n", "b3962: --> g_b3962\n", "R0_g_b1602_and_g_b1603_or_g_b3962: g_b3962 --> g_b1602_and_g_b1603_or_g_b3962\n", "R1_g_b1602_and_g_b1603_or_g_b3962: g_b1602_and_g_b1603 --> g_b1602_and_g_b1603_or_g_b3962\n", "b0451: --> g_b0451\n", "R0_g_b0451_or_g_s0001: g_s0001 --> g_b0451_or_g_s0001\n", "R1_g_b0451_or_g_s0001: g_b0451 --> g_b0451_or_g_s0001\n", "b0114: --> g_b0114\n", "b0115: --> g_b0115\n", "R_g_b0114_and_g_b0115_and_g_b0116: g_b0114 + g_b0115 + g_b0116 --> g_b0114_and_g_b0115_and_g_b0116\n" ] } ], "source": [ "from straindesign import extend_model_gpr\n", "import cobra\n", "import logging\n", "logging.basicConfig(level=logging.INFO)\n", "# load model\n", "e_coli_core = cobra.io.load_model('e_coli_core')\n", "# extend model with GPR rules using gene-IDs\n", "extend_model_gpr(e_coli_core)\n", "# printing the last 10 reactions (corresponding to genes and GPR rules) of the GPR-extend network\n", "logging.info('The first 95 reactions are original reactions from e_coli_core. All other reactions result from the integration of GPR rules.')\n", "logging.info('Here, we only print the last 10 reactions of the model for showcasing.')\n", "[print(r) for r in e_coli_core.reactions[-10:]];" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Gene perturbation studies\n", "\n", "GPR-extended models can be used to study how single or multiple gene-KOs affect the steady-state flux space. We can therefore integrate the GPR-rules in the model and then plot flux spaces that take into account knockouts. In the plots below, we show how knocking out the gene *lpd* affects bacterial growth and AKG yields." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import straindesign as sd\n", "import cobra\n", "import logging\n", "import matplotlib.pyplot as plt\n", "logging.basicConfig(level=logging.INFO)\n", "# load model\n", "e_coli_core = cobra.io.load_model('e_coli_core')\n", "# extend model with GPR rules using gene-names instead of IDs.\n", "sd.extend_model_gpr(e_coli_core, use_names=True)\n", "\n", "# Wild-type plot\n", "datapoints, triang, plot1 = sd.plot_flux_space(e_coli_core,\n", " ('BIOMASS_Ecoli_core_w_GAM',('EX_akg_e','-EX_glc__D_e')),\n", " show=False);\n", "# plotting designed strain\n", "_, _, plot2 = sd.plot_flux_space(e_coli_core,\n", " ('BIOMASS_Ecoli_core_w_GAM',('EX_akg_e','-EX_glc__D_e')),\n", " constraints=['lpd = 0'],\n", " show=False);\n", "plot2.set_facecolor('#FFC000')\n", "plot2.set_edgecolor('#FFC000')\n", "# adjust axes limits and show plot\n", "plot2.axes.set_xlim(0, 1.05*max([a[0] for a in datapoints]))\n", "plot2.axes.set_ylim(0, 1.05*max([a[1] for a in datapoints]))\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The blue shape represents the wild type and the yellow shape the *lpd* knockout strain flux space. The model predicts that the knockout will not affect the globally attainable α-ketoglutarate yield, but reduces the maximal possible growth rate. At higher growth rates, α-ketoglutarate yield is reduced." ] } ], "metadata": { "kernelspec": { "display_name": "straindesign", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.12" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 }