{
"cells": [
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"# Quick start\n",
"The INCA parser introduce a python wrapper to the Matlab application INCA. INCA can apply multiple 13C-MFA great algorithms. Unfortunately, it is meant to be used through a GUI and therefore it is laborious to handle many samples and measurements and is hard in incorporate into high throughput pipelines. The INCA parser operates on both sides of INCA it helps input model and data into INCA, it can run INCA algorithms and finally provides a workflow to export the results from INCA after execution of algorithms. This will be a very quick walk through of how to use the INCA Parser to give interested users an overview of the capabilities."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import pathlib\n",
"import incawrapper\n",
"from incawrapper import run_inca\n",
"import ast\n"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"The input data to the INCA parser is given as pandas dataframes. These has to comply to specified dataschemas (See :ref:`input_data.ipynb` for a thorough walk through of the requirements). The minimum inputs to run MFA in INCA is \n",
"\n",
"- Reaction data\n",
"- Tracer data\n",
"\n",
"For stationary 13C-MFA least one of\n",
"\n",
"- Flux measurements\n",
"- MS measurements\n",
"\n",
"For Isotopically Non-stationary 13C-MFA additionally measurements of the metabolite pool are can be used.\n",
"\n",
"Let's load some data to see the format of the input. All input data is validated for column name and data types, thus it will raise an error if either of those are incorrect."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"data_folder = pathlib.Path(\"./examples/Literature data/simple model\")\n",
"tracers_data = pd.read_csv(data_folder / \"tracers.csv\", \n",
" converters={'atom_mdv':ast.literal_eval, 'atom_ids':ast.literal_eval} # a trick to read lists from csv\n",
")\n",
"reactions_data = pd.read_csv(data_folder / \"reactions.csv\")\n",
"flux_data = pd.read_csv(data_folder / \"flux_measurements.csv\")\n",
"ms_data = pd.read_csv(data_folder / \"ms_measurements.csv\", \n",
" converters={'labelled_atom_ids': ast.literal_eval} # a trick to read lists from csv\n",
")"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"We use a simple toy model with 5 reactions [1,2]. In this data set we have two experiments exp1 and exp2. They were conducted with different tracers. For exp1 we have both flux and MS measurements, while for exp2 the data set only contains MS measurements. "
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" model \n",
" rxn_id \n",
" rxn_eqn \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" simple_model \n",
" R1 \n",
" A (abc) -> B (abc) \n",
" \n",
" \n",
" 1 \n",
" simple_model \n",
" R2 \n",
" B (abc) <-> D (abc) \n",
" \n",
" \n",
" 2 \n",
" simple_model \n",
" R3 \n",
" B (abc) -> C (bc) + E (a) \n",
" \n",
" \n",
" 3 \n",
" simple_model \n",
" R4 \n",
" B (abc) + C (de) -> D (bcd) + E (a) + E (e) \n",
" \n",
" \n",
" 4 \n",
" simple_model \n",
" R5 \n",
" D (abc) -> F (abc) \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" model rxn_id rxn_eqn\n",
"0 simple_model R1 A (abc) -> B (abc)\n",
"1 simple_model R2 B (abc) <-> D (abc)\n",
"2 simple_model R3 B (abc) -> C (bc) + E (a)\n",
"3 simple_model R4 B (abc) + C (de) -> D (bcd) + E (a) + E (e)\n",
"4 simple_model R5 D (abc) -> F (abc)"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"reactions_data.head()"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" experiment_id \n",
" met_id \n",
" tracer_id \n",
" atom_ids \n",
" ratio \n",
" atom_mdv \n",
" enrichment \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" exp1 \n",
" A \n",
" [2-13C]A \n",
" [2] \n",
" 1.0 \n",
" [0, 1] \n",
" 1 \n",
" \n",
" \n",
" 1 \n",
" exp2 \n",
" A \n",
" [1,2-13C]A \n",
" [1, 2] \n",
" 0.5 \n",
" [0.05, 0.95] \n",
" 1 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" experiment_id met_id tracer_id atom_ids ratio atom_mdv enrichment\n",
"0 exp1 A [2-13C]A [2] 1.0 [0, 1] 1\n",
"1 exp2 A [1,2-13C]A [1, 2] 0.5 [0.05, 0.95] 1"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"tracers_data.head()"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" experiment_id \n",
" rxn_id \n",
" flux \n",
" flux_std_error \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" exp1 \n",
" R1 \n",
" 10.0 \n",
" 0.00001 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" experiment_id rxn_id flux flux_std_error\n",
"0 exp1 R1 10.0 0.00001"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"flux_data.head()"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" experiment_id \n",
" met_id \n",
" ms_id \n",
" measurement_replicate \n",
" labelled_atom_ids \n",
" unlabelled_atoms \n",
" mass_isotope \n",
" intensity \n",
" intensity_std_error \n",
" time \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" exp1 \n",
" F \n",
" F1 \n",
" 1 \n",
" [1, 2, 3] \n",
" NaN \n",
" 0 \n",
" 0.0001 \n",
" 0.000002 \n",
" 0 \n",
" \n",
" \n",
" 1 \n",
" exp1 \n",
" F \n",
" F1 \n",
" 1 \n",
" [1, 2, 3] \n",
" NaN \n",
" 1 \n",
" 0.8008 \n",
" 0.016016 \n",
" 0 \n",
" \n",
" \n",
" 2 \n",
" exp1 \n",
" F \n",
" F1 \n",
" 1 \n",
" [1, 2, 3] \n",
" NaN \n",
" 2 \n",
" 0.1983 \n",
" 0.003966 \n",
" 0 \n",
" \n",
" \n",
" 3 \n",
" exp1 \n",
" F \n",
" F1 \n",
" 1 \n",
" [1, 2, 3] \n",
" NaN \n",
" 3 \n",
" 0.0009 \n",
" 0.000018 \n",
" 0 \n",
" \n",
" \n",
" 4 \n",
" exp2 \n",
" F \n",
" F1 \n",
" 1 \n",
" [1, 2, 3] \n",
" NaN \n",
" 0 \n",
" 0.0002 \n",
" 0.000002 \n",
" 0 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" experiment_id met_id ms_id measurement_replicate labelled_atom_ids \\\n",
"0 exp1 F F1 1 [1, 2, 3] \n",
"1 exp1 F F1 1 [1, 2, 3] \n",
"2 exp1 F F1 1 [1, 2, 3] \n",
"3 exp1 F F1 1 [1, 2, 3] \n",
"4 exp2 F F1 1 [1, 2, 3] \n",
"\n",
" unlabelled_atoms mass_isotope intensity intensity_std_error time \n",
"0 NaN 0 0.0001 0.000002 0 \n",
"1 NaN 1 0.8008 0.016016 0 \n",
"2 NaN 2 0.1983 0.003966 0 \n",
"3 NaN 3 0.0009 0.000018 0 \n",
"4 NaN 0 0.0002 0.000002 0 "
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ms_data.head()"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"With the data loaded we are ready to create the INCA script that specifies the model, data and algorithms that we wish to apply. We will specify that the estimation algorithm should do 5 restarts and that INCA should not do naturel abundance correction. Finally, specify that we wish to run three of INCA's algorithms: estimate, simulate and continuate and that the model including the results should be saved in a file called simple_model_quickstart.mat in the current working directory."
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [],
"source": [
"output_file = pathlib.Path(\"./examples/Literature data/simple model/simple_model_quikstart.mat\")\n",
"script = incawrapper.create_inca_script_from_data(reactions_data, tracers_data, flux_data, ms_data, experiment_ids=[\"exp1\"])\n",
"script.add_to_block(\"options\", incawrapper.define_options(fit_starts=5,sim_na=False))\n",
"script.add_to_block(\"runner\", incawrapper.define_runner(output_file, run_estimate=True, run_simulation=True, run_continuation=True))"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"Now the script is ready to run in matlab."
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"INCA script saved to /var/folders/z6/mxpxh4k56tv0h0ff41vmx7gdwtlpvp/T/tmpkga0p7fp/inca_script.m.\n",
"Starting MATLAB engine...\n",
" \n",
"ms_exp1 = 1x1 msdata object\n",
" \n",
"fields: atoms id [idvs] more on state \n",
" \n",
"F1\n",
" \n",
" \n",
"m = 1x1 model object\n",
" \n",
"fields: [expts] [mets] notes [options] [rates] [states] \n",
" \n",
"\t5 reactions (6 fluxes) \n",
"\t6 states (3 balanced, 1 source, 2 sink and 0 unbalanced)\n",
"\t6 metabolites \n",
"\t1 experiments \n",
" \n",
"\n",
" Directional \n",
" Iteration Residual Step-size derivative Lambda\n",
" 0 9.99596e+11\n",
" 1 8.14509e+11 0.0973 -9.02e+11 1.51438\n",
" 2 1471.59 1 -311 1.51438\n",
" 3 1686.79 1 2.43e+03 0.504795\n",
" 4 1647.49 1 2.35e+03 1.00959\n",
" 5 1451.25 1 1.97e+03 4.03836\n",
" 6 219.371 1 517 7.70091\n",
" 7 136.921 1 -3.99 2.56697\n",
" 8 136.494 1 -0.0262 0.855657\n",
" \n",
" Optimization terminated: Unconstrained optimum found.\n",
" Parameters converged to within tolerance. \n",
"\n",
" Directional \n",
" Iteration Residual Step-size derivative Lambda\n",
" 0 9.99432e+11\n",
" 1 9.87336e+11 0.00607 -9.93e+11 20.194\n",
" 2 683304 1 -1.48e+06 20.194\n",
" 3 38384 1 -8.04e+04 6.73132\n",
" 4 2747.89 1 -4.53e+03 2.24377\n",
" 5 1582.96 1 2.13e+03 0.747925\n",
" 6 3023.3 1 2.74e+03 0.701643\n",
" 7 3007.12 1 2.73e+03 1.40329\n",
" 8 2912.05 1 2.66e+03 5.61314\n",
" 9 2176.43 1 1.99e+03 44.9051\n",
" 10 522.602 1 -45 359.241\n",
" 11 159.881 1 -49.3 265.304\n",
" 12 139.894 1 -3.49 88.4348\n",
" 13 136.623 1 -0.485 29.4783\n",
" 14 136.493 1 -0.0147 9.82609\n",
" \n",
" Optimization terminated: Unconstrained optimum found.\n",
" Parameters converged to within tolerance. \n",
"\n",
" Directional \n",
" Iteration Residual Step-size derivative Lambda\n",
" 0 9.98988e+11\n",
" 1 9.95521e+11 0.0017 -1.02e+12 893.792\n",
" 2 4.36045e+07 1 -3.46e+08 893.792\n",
" 3 1.184e+07 1 -5.95e+06 297.931\n",
" 4 2.18909e+06 1 -2.04e+06 269.491\n",
" 5 121069 1 -2.74e+05 201.915\n",
" 6 7335.28 1 -1.46e+04 67.305\n",
" 7 1853.89 1 -530 22.435\n",
" 8 2196.53 1 2.68e+03 7.47833\n",
" 9 1958.04 1 2.05e+03 14.9567\n",
" 10 1908.05 1 1.96e+03 59.8266\n",
" 11 1510.62 1 1.31e+03 478.613\n",
" 12 703.253 1 291 517.658\n",
" 13 651.681 1 -1.66 209.579\n",
" 14 638.339 1 -8.07 69.8595\n",
" 15 640.145 1 344 23.2865\n",
" 16 603.87 1 -22 46.573\n",
" 17 5106.12 0.704 -2.4e+03 15.5243\n",
" 18 894.548 1 1.78e+03 31.0487\n",
" 19 575.861 1 -16 124.195\n",
" 20 721.113 1 986 41.3982\n",
" 21 517.689 1 -28.1 82.7965\n",
" 22 5029.28 0.824 -688 27.5988\n",
" 23 905.256 1 1.79e+03 55.1976\n",
" 24 465.752 1 -26.7 220.791\n",
" 25 605.331 1 821 73.5968\n",
" 26 389.228 1 -23.5 147.194\n",
" 27 2317.9 1 5.68e+03 49.0646\n",
" 28 421.563 1 413 98.1291\n",
" 29 324.497 1 -28.2 392.517\n",
" 30 279.9 1 123 130.839\n",
" 31 158.307 1 -19.3 130.84\n",
" 32 137.439 1 -2.4 43.6134\n",
" 33 136.491 1 -0.0161 14.5378\n",
" \n",
" Optimization terminated: Unconstrained optimum found.\n",
" Parameters converged to within tolerance. \n",
"\n",
" Directional \n",
" Iteration Residual Step-size derivative Lambda\n",
" 0 9.99884e+11\n",
" 1 9.99022e+11 0.000451 -9.78e+11 3225.6\n",
" 2 5.96824e+08 1 -2.24e+10 3225.6\n",
" 3 2.88806e+07 1 -6.28e+06 1075.2\n",
" 4 1.18299e+07 1 -4.05e+06 358.4\n",
" 5 762453 1 -1.69e+06 356.277\n",
" 6 37981.6 1 -8.99e+04 118.759\n",
" 7 3140.34 1 -4.27e+03 39.5863\n",
" 8 1806.13 1 -89.6 13.1954\n",
" 9 1946.85 1 1.85e+03 4.39848\n",
" 10 1935.65 1 1.82e+03 8.79696\n",
" 11 1904.62 1 1.78e+03 35.1879\n",
" 12 1635.79 1 1.36e+03 281.503\n",
" 13 758.985 1 364 378.714\n",
" 14 695.907 1 -0.197 181.23\n",
" 15 695.248 1 -0.338 60.4099\n",
" 16 693.002 1 -1.32 20.1366\n",
" 17 675.123 1 -16.8 6.71222\n",
" 18 5193.72 0.277 -2.19e+04 2.23741\n",
" 19 5191.48 0.561 -1.08e+04 4.47481\n",
" 20 645.678 1 -22.3 17.8992\n",
" 21 5155.13 0.433 -7.08e+03 5.96641\n",
" 22 5151.7 0.8 -3.81e+03 11.9328\n",
" 23 613.431 1 -20.9 47.7313\n",
" 24 5116.55 0.772 -2.5e+03 15.9104\n",
" 25 644.567 1 491 31.8209\n",
" 26 592.081 1 -12.2 127.283\n",
" 27 573.034 1 249 42.4278\n",
" 28 3501.03 1 8.75e+03 45.2624\n",
" 29 438.403 1 215 90.5249\n",
" 30 272.772 1 134 90.3291\n",
" 31 136.779 1 -2.94 89.3289\n",
" 32 136.495 1 -0.0259 29.7763\n",
" \n",
" Optimization terminated: Unconstrained optimum found.\n",
" Parameters converged to within tolerance. \n",
"\n",
" Directional \n",
" Iteration Residual Step-size derivative Lambda\n",
" 0 9.9856e+11\n",
" 1 9.2428e+11 0.0379 -9.61e+11 31.4564\n",
" 2 1.21036e+06 1 -4.17e+04 31.4564\n",
" 3 83632.7 1 -1.51e+05 10.4855\n",
" 4 4187.54 1 -9.23e+03 3.71603\n",
" 5 1108.73 1 673 1.23868\n",
" 6 2761.68 1 2.94e+03 0.412892\n",
" 7 2750.64 1 2.93e+03 0.825784\n",
" 8 2685.62 1 2.87e+03 3.30313\n",
" 9 2167.77 1 2.39e+03 26.4251\n",
" 10 711.742 1 536 211.401\n",
" 11 147.484 1 73.4 211.682\n",
" 12 136.832 1 0.35 70.5608\n",
" 13 136.5 1 -0.0441 23.5203\n",
" \n",
" Optimization terminated: Unconstrained optimum found.\n",
" Parameters converged to within tolerance. \n",
"\n",
" Directional \n",
" Iteration Residual Step-size derivative Lambda\n",
" 0 136.491\n",
" 1 136.491 1 -2.81e-05 0.000358365\n",
" \n",
" Optimization terminated: Unconstrained optimum found.\n",
" Parameters converged to within tolerance. \n",
"\n",
"\tEstimation completed in 10.6800 seconds.\n",
"\n",
"\tPreprocessing time: 7.1800 s\n",
"\n",
"\tComputation time: 3.3500 s\n",
"\n",
"\tPostprocessing time: 0.1500 s\n",
"\n",
"\n",
" ========== Varying R1 upward from 10 ==========\n",
"\n",
" Delta Delta Predictor Corrector Corrector Failed\n",
" Iteration residual parameter Step-size error adjustment iterations steps h/hopt Lambda\n",
" 1 0.768292 8.76523e-06 8.76523e-06 0.000000 0.000000 0 0 1 0.000358423\n",
" 2 1.536584 1.23959e-05 3.63068e-06 -0.000000 0.000000 0 0 1 0.000119474\n",
" 3 2.304875 1.51818e-05 2.78592e-06 0.000000 0.000000 0 0 1 3.98247e-05\n",
" 4 3.073167 1.75305e-05 2.34864e-06 -0.000000 0.000000 0 0 1 1.32749e-05\n",
" 5 3.841459 1.95996e-05 2.06919e-06 -0.000000 0.000000 0 0 1 4.42497e-06\n",
" 6 4.609751 2.14703e-05 1.87069e-06 0.000000 0.000000 0 0 1 1.47499e-06\n",
"\n",
" ========== Varying R1 downward from 10 ==========\n",
"\n",
" Delta Delta Predictor Corrector Corrector Failed\n",
" Iteration residual parameter Step-size error adjustment iterations steps h/hopt Lambda\n",
" 1 0.768292 8.76523e-06 8.76523e-06 0.000000 0.000000 0 0 1 0.000358423\n",
" 2 1.536584 1.23959e-05 3.63068e-06 -0.000000 0.000000 0 0 1 0.000119474\n",
" 3 2.304875 1.51818e-05 2.78592e-06 0.000000 0.000000 0 0 1 3.98247e-05\n",
" 4 3.073167 1.75305e-05 2.34864e-06 0.000000 0.000000 0 0 1 1.32749e-05\n",
" 5 3.841459 1.95996e-05 2.06919e-06 -0.000000 0.000000 0 0 1 4.42497e-06\n",
" 6 4.609751 2.14703e-05 1.87069e-06 -0.000000 0.000000 0 0 1 1.47499e-06\n",
"\n",
" ========== Varying R2 net upward from 6.084 ==========\n",
"\n",
" Delta Delta Predictor Corrector Corrector Failed\n",
" Iteration residual parameter Step-size error adjustment iterations steps h/hopt Lambda\n",
" 1 0.753210 0.0596636 0.0596636 0.004243 0.019324 1 0 1 0.000358423\n",
" 2 1.518555 0.0845453 0.0248817 -0.000791 0.002156 1 0 1 0.000119474\n",
" 3 2.285424 0.103567 0.0190212 -0.000535 0.000887 1 0 1 3.98247e-05\n",
" 4 3.052810 0.119555 0.0159886 -0.000338 0.000568 1 0 1 1.32749e-05\n",
" 5 3.820457 0.133608 0.0140525 -0.000218 0.000427 1 0 1 4.42497e-06\n",
" 6 4.588261 0.146286 0.0126785 -0.000141 0.000347 1 0 1 1.47499e-06\n",
"\n",
" ========== Varying R2 net downward from 6.084 ==========\n",
"\n",
" Delta Delta Predictor Corrector Corrector Failed\n",
" Iteration residual parameter Step-size error adjustment iterations steps h/hopt Lambda\n",
" 1 0.740402 0.0595483 0.0595483 -0.021366 0.006522 1 0 1 0.000358423\n",
" 2 1.503313 0.0850441 0.0254958 -0.005295 0.000086 1 0 1 0.000119474\n",
" 3 2.268190 0.104634 0.0195899 -0.003403 0.000012 1 0 1 3.98247e-05\n",
" 4 3.033916 0.121179 0.0165447 -0.002561 0.000005 1 0 1 1.32749e-05\n",
" 5 3.800120 0.135782 0.014603 -0.002084 0.000003 1 0 1 4.42497e-06\n",
" 6 4.566633 0.149007 0.0132258 -0.001776 0.000003 1 0 1 1.47499e-06\n",
"\n",
" ========== Varying R2 exch upward from 6.621 ==========\n",
"\n",
" Delta Delta Predictor Corrector Corrector Failed\n",
" Iteration residual parameter Step-size error adjustment iterations steps h/hopt Lambda\n",
" 1 0.667767 0.290301 0.290301 -0.079498 0.021026 1 0 1 0.000358423\n",
" 2 1.410871 0.42865 0.138349 -0.023158 0.002030 1 0 1 0.000119474\n",
" 3 2.162448 0.537269 0.10862 -0.015854 0.000861 1 0 1 3.98247e-05\n",
" 4 2.917636 0.630696 0.0934262 -0.012564 0.000539 1 0 1 1.32749e-05\n",
" 5 3.674891 0.714516 0.08382 -0.010646 0.000392 1 0 1 4.42497e-06\n",
" 6 4.433503 0.791576 0.0770601 -0.009371 0.000308 1 0 1 1.47499e-06\n",
"\n",
" ========== Varying R2 exch downward from 6.621 ==========\n",
"\n",
" Delta Delta Predictor Corrector Corrector Failed\n",
" Iteration residual parameter Step-size error adjustment iterations steps h/hopt Lambda\n",
" 1 0.770310 0.289411 0.289411 0.008753 0.006733 1 0 1 0.000358423\n",
" 2 1.542661 0.403807 0.114396 0.004146 0.000088 1 0 1 0.000119474\n",
" 3 2.314956 0.48932 0.0855128 0.004042 0.000038 1 0 1 3.98247e-05\n",
" 4 3.087059 0.559935 0.0706148 0.003839 0.000028 1 0 1 1.32749e-05\n",
" 5 3.858960 0.621063 0.0611278 0.003633 0.000024 1 0 1 4.42497e-06\n",
"\n",
" ========== Varying R4 upward from 1.958 ==========\n",
"\n",
" Delta Delta Predictor Corrector Corrector Failed\n",
" Iteration residual parameter Step-size error adjustment iterations steps h/hopt Lambda\n",
" 1 0.740402 0.0297741 0.0297741 -0.021366 0.006522 1 0 1 0.000358423\n",
" 2 1.503313 0.0425221 0.0127479 -0.005295 0.000086 1 0 1 0.000119474\n",
" 3 2.268190 0.052317 0.00979493 -0.003403 0.000012 1 0 1 3.98247e-05\n",
" 4 3.033916 0.0605893 0.00827235 -0.002561 0.000005 1 0 1 1.32749e-05\n",
" 5 3.800120 0.0678908 0.00730148 -0.002084 0.000003 1 0 1 4.42497e-06\n",
" 6 4.566633 0.0745037 0.0066129 -0.001776 0.000003 1 0 1 1.47499e-06\n",
"\n",
" ========== Varying R4 downward from 1.958 ==========\n",
"\n",
" Delta Delta Predictor Corrector Corrector Failed\n",
" Iteration residual parameter Step-size error adjustment iterations steps h/hopt Lambda\n",
" 1 0.753210 0.0298318 0.0298318 0.004243 0.019324 1 0 1 0.000358423\n",
" 2 1.518555 0.0422727 0.0124409 -0.000791 0.002156 1 0 1 0.000119474\n",
" 3 2.285424 0.0517833 0.00951062 -0.000535 0.000887 1 0 1 3.98247e-05\n",
" 4 3.052810 0.0597776 0.00799428 -0.000338 0.000568 1 0 1 1.32749e-05\n",
" 5 3.820457 0.0668038 0.00702625 -0.000218 0.000427 1 0 1 4.42497e-06\n",
" 6 4.588261 0.0731431 0.00633925 -0.000141 0.000347 1 0 1 1.47499e-06\n",
"\n",
" ========== Varying R5 upward from 8.042 ==========\n",
"\n",
" Delta Delta Predictor Corrector Corrector Failed\n",
" Iteration residual parameter Step-size error adjustment iterations steps h/hopt Lambda\n",
" 1 0.753210 0.0298318 0.0298318 0.004243 0.019324 1 0 1 0.000358423\n",
" 2 1.518555 0.0422727 0.0124409 -0.000791 0.002156 1 0 1 0.000119474\n",
" 3 2.285424 0.0517833 0.00951062 -0.000535 0.000887 1 0 1 3.98247e-05\n",
" 4 3.052810 0.0597776 0.00799428 -0.000338 0.000568 1 0 1 1.32749e-05\n",
" 5 3.820457 0.0668038 0.00702625 -0.000218 0.000427 1 0 1 4.42497e-06\n",
" 6 4.588261 0.0731431 0.00633925 -0.000141 0.000347 1 0 1 1.47499e-06\n",
"\n",
" ========== Varying R5 downward from 8.042 ==========\n",
"\n",
" Delta Delta Predictor Corrector Corrector Failed\n",
" Iteration residual parameter Step-size error adjustment iterations steps h/hopt Lambda\n",
" 1 0.740402 0.0297741 0.0297741 -0.021366 0.006522 1 0 1 0.000358423\n",
" 2 1.503313 0.0425221 0.0127479 -0.005295 0.000086 1 0 1 0.000119474\n",
" 3 2.268190 0.052317 0.00979493 -0.003403 0.000012 1 0 1 3.98247e-05\n",
" 4 3.033916 0.0605893 0.00827235 -0.002561 0.000005 1 0 1 1.32749e-05\n",
" 5 3.800120 0.0678908 0.00730148 -0.002084 0.000003 1 0 1 4.42497e-06\n",
" 6 4.566633 0.0745037 0.0066129 -0.001776 0.000003 1 0 1 1.47499e-06\n",
"\n",
"\tContinuation completed in 1.5000 seconds.\n",
"\n",
"\tPreprocessing time: 0.3300 s\n",
"\n",
"\tComputation time: 1.1700 s\n",
"Warning: Network is ill-conditioned.\n",
"\n",
"\tSimulation completed in 0.0700 seconds.\n",
"\n",
"\tPreprocessing time: 0.0600 s\n",
"\n",
"\tComputation time: 0.0100 s\n",
"\n",
"\tPostprocessing time: 0.0000 s\n",
"\n",
"--- 23.097320795059204 seconds -\n"
]
}
],
"source": [
"import dotenv\n",
"inca_directory = pathlib.Path(dotenv.get_key(dotenv.find_dotenv(), \"INCA_base_directory\"))\n",
"incawrapper.run_inca(script, INCA_base_directory=inca_directory)"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"We can now read the results from INCA using the `INCAResults` object."
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [],
"source": [
"res = incawrapper.INCAResults(output_file)"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"Typically, the first thing we want to inspect is the fitted fluxes. They can be displayed as a Pandas dataframe."
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" type \n",
" id \n",
" eqn \n",
" val \n",
" std \n",
" lb \n",
" ub \n",
" unit \n",
" free \n",
" alf \n",
" chi2s \n",
" cont \n",
" cor \n",
" cov \n",
" vals \n",
" base \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" Net flux \n",
" R1 \n",
" A -> B \n",
" 10.000000 \n",
" 0.000010 \n",
" 9.99998 \n",
" 10.00002 \n",
" [] \n",
" 0 \n",
" 0.05 \n",
" [141.10066093755805, 140.33236917370687, 139.5... \n",
" 0 \n",
" [1.0, 8.94704371251548e-05, 2.002130779029279e... \n",
" [9.999999786569624e-11, 6.084217157864558e-11,... \n",
" [9.999978529670276, 9.999980400360155, 9.99998... \n",
" {'id': []} \n",
" \n",
" \n",
" 1 \n",
" Net flux \n",
" R2 net \n",
" B <-> D \n",
" 6.084230 \n",
" 0.068003 \n",
" 5.947702 \n",
" 6.218202 \n",
" [] \n",
" 1 \n",
" 0.05 \n",
" [141.0575435245828, 140.2910305858517, 139.524... \n",
" 0 \n",
" [8.947043202321765e-05, 1.0, 0.928424443085881... \n",
" [6.084216810919862e-11, 0.004624345816403641, ... \n",
" [5.935222845778996, 5.948448640360109, 5.96305... \n",
" {'id': []} \n",
" \n",
" \n",
" 2 \n",
" Exch flux \n",
" R2 exch \n",
" B <-> D \n",
" 6.620853 \n",
" 0.330687 \n",
" 6.001071 \n",
" 7.352861 \n",
" [] \n",
" 1 \n",
" 0.05 \n",
" [140.34987009287295, 139.5779692296173, 138.80... \n",
" 0 \n",
" [2.0021303593639435e-05, 0.9284244520811099, 0... \n",
" [6.620785170108334e-11, 0.020877998964188516, ... \n",
" [5.999789999353027, 6.060917783460922, 6.13153... \n",
" {'id': []} \n",
" \n",
" \n",
" 3 \n",
" Net flux \n",
" R3 \n",
" B -> C + E \n",
" 1.957885 \n",
" 0.034001 \n",
" 1.890899 \n",
" 2.026149 \n",
" [] \n",
" 1 \n",
" 0.05 \n",
" [141.07917098749863, 140.31136692375648, 139.5... \n",
" 0 \n",
" [5.758289131530709e-05, -0.9999999891876596, -... \n",
" [1.957891487824881e-11, -0.0023121728777807347... \n",
" [1.8847417919539917, 1.8910810441689598, 1.898... \n",
" {'id': []} \n",
" \n",
" \n",
" 4 \n",
" Net flux \n",
" R4 \n",
" B + C -> D + E + E \n",
" 1.957885 \n",
" 0.034001 \n",
" 1.890899 \n",
" 2.026149 \n",
" [] \n",
" 0 \n",
" 0.05 \n",
" [141.07917098749863, 140.31136692375648, 139.5... \n",
" 0 \n",
" [5.758289131530709e-05, -0.9999999891876596, -... \n",
" [1.957891487824881e-11, -0.0023121728777807347... \n",
" [1.8847417919539917, 1.8910810441689598, 1.898... \n",
" {'id': []} \n",
" \n",
" \n",
" 5 \n",
" Net flux \n",
" R5 \n",
" D -> F \n",
" 8.042115 \n",
" 0.034001 \n",
" 7.973851 \n",
" 8.109101 \n",
" [] \n",
" 0 \n",
" 0.05 \n",
" [141.05754359730764, 140.2910306695598, 139.52... \n",
" 0 \n",
" [0.00023652374955743415, 0.9999999891876609, 0... \n",
" [8.042108298744743e-11, 0.0023121729386229063,... \n",
" [7.967611420633636, 7.974224317908821, 7.98152... \n",
" {'id': []} \n",
" \n",
" \n",
" 6 \n",
" Norm \n",
" exp1 F1 exp1_F1_0_0_1 norm \n",
" [] \n",
" 0.985739 \n",
" 0.016453 \n",
" [] \n",
" [] \n",
" [] \n",
" 1 \n",
" 0.05 \n",
" [] \n",
" 0 \n",
" [-7.775915103023788e-11, 0.5822932413163197, 0... \n",
" [-1.2793585635328952e-17, 0.000651489883093479... \n",
" [] \n",
" {'id': []} \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" type id eqn val \\\n",
"0 Net flux R1 A -> B 10.000000 \n",
"1 Net flux R2 net B <-> D 6.084230 \n",
"2 Exch flux R2 exch B <-> D 6.620853 \n",
"3 Net flux R3 B -> C + E 1.957885 \n",
"4 Net flux R4 B + C -> D + E + E 1.957885 \n",
"5 Net flux R5 D -> F 8.042115 \n",
"6 Norm exp1 F1 exp1_F1_0_0_1 norm [] 0.985739 \n",
"\n",
" std lb ub unit free alf \\\n",
"0 0.000010 9.99998 10.00002 [] 0 0.05 \n",
"1 0.068003 5.947702 6.218202 [] 1 0.05 \n",
"2 0.330687 6.001071 7.352861 [] 1 0.05 \n",
"3 0.034001 1.890899 2.026149 [] 1 0.05 \n",
"4 0.034001 1.890899 2.026149 [] 0 0.05 \n",
"5 0.034001 7.973851 8.109101 [] 0 0.05 \n",
"6 0.016453 [] [] [] 1 0.05 \n",
"\n",
" chi2s cont \\\n",
"0 [141.10066093755805, 140.33236917370687, 139.5... 0 \n",
"1 [141.0575435245828, 140.2910305858517, 139.524... 0 \n",
"2 [140.34987009287295, 139.5779692296173, 138.80... 0 \n",
"3 [141.07917098749863, 140.31136692375648, 139.5... 0 \n",
"4 [141.07917098749863, 140.31136692375648, 139.5... 0 \n",
"5 [141.05754359730764, 140.2910306695598, 139.52... 0 \n",
"6 [] 0 \n",
"\n",
" cor \\\n",
"0 [1.0, 8.94704371251548e-05, 2.002130779029279e... \n",
"1 [8.947043202321765e-05, 1.0, 0.928424443085881... \n",
"2 [2.0021303593639435e-05, 0.9284244520811099, 0... \n",
"3 [5.758289131530709e-05, -0.9999999891876596, -... \n",
"4 [5.758289131530709e-05, -0.9999999891876596, -... \n",
"5 [0.00023652374955743415, 0.9999999891876609, 0... \n",
"6 [-7.775915103023788e-11, 0.5822932413163197, 0... \n",
"\n",
" cov \\\n",
"0 [9.999999786569624e-11, 6.084217157864558e-11,... \n",
"1 [6.084216810919862e-11, 0.004624345816403641, ... \n",
"2 [6.620785170108334e-11, 0.020877998964188516, ... \n",
"3 [1.957891487824881e-11, -0.0023121728777807347... \n",
"4 [1.957891487824881e-11, -0.0023121728777807347... \n",
"5 [8.042108298744743e-11, 0.0023121729386229063,... \n",
"6 [-1.2793585635328952e-17, 0.000651489883093479... \n",
"\n",
" vals base \n",
"0 [9.999978529670276, 9.999980400360155, 9.99998... {'id': []} \n",
"1 [5.935222845778996, 5.948448640360109, 5.96305... {'id': []} \n",
"2 [5.999789999353027, 6.060917783460922, 6.13153... {'id': []} \n",
"3 [1.8847417919539917, 1.8910810441689598, 1.898... {'id': []} \n",
"4 [1.8847417919539917, 1.8910810441689598, 1.898... {'id': []} \n",
"5 [7.967611420633636, 7.974224317908821, 7.98152... {'id': []} \n",
"6 [] {'id': []} "
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"res.fitdata.fitted_parameters"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Fit accepted: False\n",
"Confidence level: 0.05\n",
"Chi-square value (SSR): 136.49091035304212\n",
"Expected chi-square range: [9.82069117e-04 5.02388619e+00]\n"
]
}
],
"source": [
"res.fitdata.get_goodness_of_fit()"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(,\n",
" )"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import incawrapper.visualization as incaviz\n",
"incaviz.plot_norm_prob(res)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## References\n",
"[1] M. R. Antoniewicz, J. K. Kelleher, and G. Stephanopoulos, “Determination of confidence intervals of metabolic fluxes estimated from stable isotope measurements,” Metabolic Engineering, vol. 8, no. 4, pp. 324–337, Jul. 2006, doi: 10.1016/j.ymben.2006.01.004.\n",
"\n",
"[2] M. R. Antoniewicz, J. K. Kelleher, and G. Stephanopoulos, “Elementary metabolite units (EMU): A novel framework for modeling isotopic distributions,” Metabolic Engineering, vol. 9, no. 1, pp. 68–86, Jan. 2007, doi: 10.1016/j.ymben.2006.09.001.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "bfair-testing",
"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.10.8"
},
"orig_nbformat": 4,
"vscode": {
"interpreter": {
"hash": "820c70ec08a0eb018d8ec3c5d089748cbb2d1e243fbedf0a7cbeb7c8948c3b84"
}
}
},
"nbformat": 4,
"nbformat_minor": 2
}