{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Flux Variability Anlysis (FVA)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Load a few packages and functions." ] }, { "cell_type": "code", "execution_count": 49, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import pandas\n", "pandas.options.display.max_rows = 12\n", "import escher\n", "from cameo import models, flux_variability_analysis, fba" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First we load a model from the [BiGG](http://bigg.ucsd.edu/) database (and make a copy of it)." ] }, { "cell_type": "code", "execution_count": 50, "metadata": { "collapsed": true }, "outputs": [], "source": [ "model = models.bigg.e_coli_core.copy()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Run flux variablity analysis" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Calculate all flux ranges of all reactions in the model." ] }, { "cell_type": "code", "execution_count": 51, "metadata": { "collapsed": false }, "outputs": [], "source": [ "result = flux_variability_analysis(model)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Inspect the result." ] }, { "cell_type": "code", "execution_count": 52, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
upper_boundlower_bound
ACALD-5.892581e-28-2.000000e+01
ACALDt-1.018706e-30-2.000000e+01
ACKr0.000000e+00-2.000000e+01
ACONTa2.000000e+01-4.572994e-31
ACONTb2.000000e+012.832972e-30
ACt2r4.886876e-29-2.000000e+01
.........
SUCOAS0.000000e+00-2.000000e+01
TALA2.000000e+01-1.545362e-01
THD23.332200e+020.000000e+00
TKT12.000000e+01-1.545362e-01
TKT22.000000e+01-4.663728e-01
TPI1.000000e+01-1.000000e+01
\n", "

95 rows × 2 columns

\n", "
" ], "text/plain": [ " upper_bound lower_bound\n", "ACALD -5.892581e-28 -2.000000e+01\n", "ACALDt -1.018706e-30 -2.000000e+01\n", "ACKr 0.000000e+00 -2.000000e+01\n", "ACONTa 2.000000e+01 -4.572994e-31\n", "ACONTb 2.000000e+01 2.832972e-30\n", "ACt2r 4.886876e-29 -2.000000e+01\n", "... ... ...\n", "SUCOAS 0.000000e+00 -2.000000e+01\n", "TALA 2.000000e+01 -1.545362e-01\n", "THD2 3.332200e+02 0.000000e+00\n", "TKT1 2.000000e+01 -1.545362e-01\n", "TKT2 2.000000e+01 -4.663728e-01\n", "TPI 1.000000e+01 -1.000000e+01\n", "\n", "[95 rows x 2 columns]" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result.data_frame" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Get an overview of a few key statistics of the resulting flux ranges." ] }, { "cell_type": "code", "execution_count": 53, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
upper_boundlower_bound
count9.500000e+0195.000000
mean8.625296e+01-7.282128
std1.782831e+0214.716513
min-4.794286e-01-68.305000
25%3.452684e-29-10.000000
50%2.000000e+010.000000
75%9.830500e+010.000000
max1.000000e+038.390000
\n", "
" ], "text/plain": [ " upper_bound lower_bound\n", "count 9.500000e+01 95.000000\n", "mean 8.625296e+01 -7.282128\n", "std 1.782831e+02 14.716513\n", "min -4.794286e-01 -68.305000\n", "25% 3.452684e-29 -10.000000\n", "50% 2.000000e+01 0.000000\n", "75% 9.830500e+01 0.000000\n", "max 1.000000e+03 8.390000" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result.data_frame.describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Visualize the flux ranges." ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "result.plot(index=result.data_frame.index, height=1200)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Visualize the flux ranges on a pathway map of _E. coli's_ central carbon metabolism." ] }, { "cell_type": "code", "execution_count": 55, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", " \n", " \n", "\n", " \n", " \n", " \n", " \n", "\n", "\n", "\n", "
\n", "\n", " \n" ], "text/plain": [ "" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "abs_flux_ranges = abs(result.data_frame.lower_bound - result.data_frame.upper_bound).to_dict()\n", "escher.Builder('e_coli_core.Core metabolism', reaction_data=abs_flux_ranges).display_in_notebook()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Those reactions showing up in red are futile cyles." ] }, { "cell_type": "code", "execution_count": 56, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
upper_boundlower_bound
FORt2666.440.0
FORti666.440.0
FRD71000.000.0
SUCDi1000.000.0
\n", "
" ], "text/plain": [ " upper_bound lower_bound\n", "FORt2 666.44 0.0\n", "FORti 666.44 0.0\n", "FRD7 1000.00 0.0\n", "SUCDi 1000.00 0.0" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result.data_frame[result.data_frame.upper_bound > 500]" ] }, { "cell_type": "code", "execution_count": 57, "metadata": { "collapsed": true }, "outputs": [], "source": [ "result_no_cyles = flux_variability_analysis(model, remove_cycles=True)" ] }, { "cell_type": "code", "execution_count": 58, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", " \n", " \n", "\n", " \n", " \n", " \n", " \n", "\n", "\n", "\n", "
\n", "\n", " \n" ], "text/plain": [ "" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "abs_flux_ranges = abs(result_no_cyles.data_frame.lower_bound - result_no_cyles.data_frame.upper_bound).to_dict()\n", "escher.Builder('e_coli_core.Core metabolism', reaction_data=abs_flux_ranges).display_in_notebook()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Run flux variability analysis for optimally growing _E. coli_" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(Optimal) Flux Balance Analysis solutions are not necessariliy unique. Flux Variablity Analysis is a good tool for estimating the space of alternative optimal solutions." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "objective value: 0.8739215069684307" ], "text/plain": [ "" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fba(model)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": true }, "outputs": [], "source": [ "model_optimal = model.copy()" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": true }, "outputs": [], "source": [ "model_optimal.reactions.BIOMASS_Ecoli_core_w_GAM.lower_bound = 0.8739215069684299" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": true }, "outputs": [], "source": [ "result_max_obj = flux_variability_analysis(model_optimal, remove_cycles=True)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "result_max_obj.plot(index=result_max_obj.data_frame.index, height=1200)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is actually such a common task that `flux_variability_analysis` provides an option for fixing the objective's flux at a certain percentage." ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": true }, "outputs": [], "source": [ "result_max_obj = flux_variability_analysis(model, fraction_of_optimum=1., remove_cycles=True)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "result_max_obj.plot(index=result_max_obj.data_frame.index, height=1200)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Turns out that in this small core metabolic model, the optimal solution is actually unique!" ] }, { "cell_type": "code", "execution_count": 61, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "1.2156704039782733e-12" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sum(abs(result_max_obj.data_frame.lower_bound - result_max_obj.data_frame.upper_bound))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exercises" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Explore how relaxing the constraint on the growth rate affects the solution space:\n", "1. Modify the code to explore flux ranges for $\\mu \\gt 0.7 \\ h^{-1}$ \n", "1. Plot the sum of flux ranges over a range of percentages." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Using FVA, determine all blocked reactions ($v = 0$) in the model." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Solutions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Solution 1" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "80.09872676417456" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "percentage = (0.7 / model.solve().f) * 100\n", "percentage" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "collapsed": true }, "outputs": [], "source": [ "result_80perc_max_obj = flux_variability_analysis(model, fraction_of_optimum=percentage/100, remove_cycles=True)" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "result_80perc_max_obj.plot(index=result_80perc_max_obj.data_frame.index, height=1200)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Solution 2" ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "50%: 3751.40240599\n", "55%: 3424.27160795\n", "60%: 3095.30744285\n", "65%: 2766.01470946\n", "70%: 2435.53815493\n", "75%: 2093.28708667\n", "80%: 1743.33172454\n", "85%: 1390.11135124\n", "90%: 1033.30596455\n", "95%: 634.220801927\n", "100%: 4.43464272321e-13\n" ] } ], "source": [ "flux_sums = []\n", "optimum_percentages = range(50, 105, 5)\n", "for i in optimum_percentages:\n", " df = flux_variability_analysis(model, fraction_of_optimum=i/100, remove_cycles=True).data_frame\n", " flux_sum = sum(abs(df.lower_bound - df.upper_bound))\n", " print(\"{}%: \".format(i), flux_sum)\n", " flux_sums.append(flux_sum)" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(optimum_percentages, flux_sums)\n", "plt.xlabel('Optimum (%)')\n", "plt.ylabel('Flux sum [mmol gDW^-1 h^-1]')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "### Solution 3" ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "collapsed": false }, "outputs": [], "source": [ "result = flux_variability_analysis(model, remove_cycles=True)" ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
upper_boundlower_bound
EX_fru_e0.00.0
EX_fum_e0.00.0
EX_gln__L_e0.00.0
EX_mal__L_e0.00.0
FRD70.00.0
FRUpts20.00.0
FUMt2_20.00.0
GLNabc0.00.0
MALt2_20.00.0
\n", "
" ], "text/plain": [ " upper_bound lower_bound\n", "EX_fru_e 0.0 0.0\n", "EX_fum_e 0.0 0.0\n", "EX_gln__L_e 0.0 0.0\n", "EX_mal__L_e 0.0 0.0\n", "FRD7 0.0 0.0\n", "FRUpts2 0.0 0.0\n", "FUMt2_2 0.0 0.0\n", "GLNabc 0.0 0.0\n", "MALt2_2 0.0 0.0" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result.data_frame[(result.data_frame.lower_bound == 0) & (result.data_frame.upper_bound == 0)]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3.4", "language": "python", "name": "python3.4" }, "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.4.4" }, "widgets": { "state": {}, "version": "1.1.2" } }, "nbformat": 4, "nbformat_minor": 0 }