{
"cells": [
{
"cell_type": "markdown",
"id": "5cbc8640",
"metadata": {},
"source": [
"# IN-PROGRESS\n",
"\n",
"## **Enzyme Kinetics** : \n",
"\n",
"#### Our model: `E + S <-> ES` (with kinetic pars _k1_forward_ and _k1_reverse_), and `ES -> E + P` (_k2_forward_) \n",
"\n",
"#### In experiment `enzyme_1_a`, we were given _k1_forward_, _k1_reverse_ and _k2_forward_... But what to do if we're **just given kM and kcat** \n",
"\n",
"In Part 1, we'll \"cheat\" and use the actual value of _k1_forward_ \n",
"In Part 2, we'll explore what happens if, lacking an actual value, we **under-estimate** _k1_forward_ \n",
"In Part 3, we'll explore what happens if we **over-estimate** _k1_forward_\n",
"\n",
"Background: please see experiment `enzyme_1_a`"
]
},
{
"cell_type": "markdown",
"id": "604b150b-7812-4fd3-9403-69a06dd7e397",
"metadata": {},
"source": [
"#### THE REACTION: \n",
"the enzyme `Adenosinedeaminase` with the substrate `2,6-Diamino-9-β-D-deoxyribofuranosyl-9-H-purine`, \n",
"and the initial concentration values choosen below, all satisfy the customary Michaelis-Menten assumptions that \n",
"`[E] << [S]` and that the reaction rate constants satisfy `k1_reverse >> k2_forward`\n",
"\n",
"Source of kinetic parameters: *page 16 of \"Analysis of Enzyme Reaction Kinetics, Vol. 1\", by F. Xavier Malcata, Wiley, 2023*"
]
},
{
"cell_type": "markdown",
"id": "c123db4f-c802-47f0-a3d3-0b857314d8e5",
"metadata": {},
"source": [
"### TAGS : \"uniform compartment\", \"chemistry\", \"numerical\", \"enzymes\""
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "6e9d0902-6fc9-4692-ac39-0651d08902ca",
"metadata": {},
"outputs": [],
"source": [
"LAST_REVISED = \"Nov. 4, 2024\"\n",
"LIFE123_VERSION = \"1.0.0.rc.0\" # Library version this experiment is based on"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "1e0ae9a9-9d0c-4edf-a5f2-1c589419e6cf",
"metadata": {},
"outputs": [],
"source": [
"#import set_path # Using MyBinder? Uncomment this before running the next cell!"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "a29db1c7",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"#import sys\n",
"#sys.path.append(\"C:/some_path/my_env_or_install\") # CHANGE to the folder containing your venv or libraries installation!\n",
"# NOTE: If any of the imports below can't find a module, uncomment the lines above, or try: import set_path \n",
"\n",
"import ipynbname\n",
"import pandas as pd\n",
"\n",
"from life123 import check_version, ChemData, UniformCompartment, ReactionEnz, GraphicLog, PlotlyHelper"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "af15ecf0-e083-4fef-b68e-abe794dcc86e",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"OK\n"
]
}
],
"source": [
"check_version(LIFE123_VERSION)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "3713fa4d-e9bb-4e33-8734-c1d4d23cf177",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "34d1cefc-f644-410a-9fe4-5204964742ac",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "8b71b0b0-f867-48a5-beaf-7f992b0d7c46",
"metadata": {},
"source": [
"## Assume we're only given values for kM and kcat\n",
"What values of k1_forward, k1_reverse and k2_forward are compatible with them?"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "80320572-3ea6-49a2-97cd-487e068e2514",
"metadata": {},
"outputs": [],
"source": [
"# The following values are taken from experiment `enzyme_1`\n",
"kM = 8.27777777777777\n",
"kcat = 49"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "c04db12c-e77f-4b53-8cdb-859194959ca1",
"metadata": {},
"outputs": [],
"source": [
"# k2_forward equals kcat ; not much to say here\n",
"k2_forward = kcat"
]
},
{
"cell_type": "markdown",
"id": "57aca1c1-9ea1-4732-ac3b-69c75dc7a1fa",
"metadata": {},
"source": [
"By contrast kM = (k2_forward + k1_reverse) / k1_forward \n",
"\n",
"We are given kM and k2_forward, which is the same value as the given kcat. \n",
"\n",
"But how to solve for k1_forward and k1_reverse?? We have just 1 equation and 2 variables! The system of equations is \"underdetermined\" : what can we do? \n",
"\n",
"We'll venture some guesses for k1_forward, and compute the corresponding k1_reverse that will satisfy the above equation. \n",
"\n",
"**k1_reverse = kM * k1_forward - kcat** (kcat has same value as k2_forward)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "7e34a530-7e5e-404b-8cb2-01e7db85557a",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"99.99999999999986"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Example, using the k1_forward=18. from experiment `enzyme_1`\n",
"k1_forward = 18.\n",
"k1_reverse = kM * k1_forward - kcat \n",
"k1_reverse"
]
},
{
"cell_type": "markdown",
"id": "c738a101-f8dc-449e-a9fb-57b67e890f4f",
"metadata": {},
"source": [
"Naturally, we're getting the same value we had for k1_reverse in that experiment. But what if k1_forward is quite different?"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "51e52128-286b-44ca-bd8a-0680007ef9bb",
"metadata": {},
"outputs": [],
"source": [
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "eae12ea5-687a-4b62-b4a7-c264df3c3e61",
"metadata": {},
"outputs": [],
"source": [
"def compute_k1_reverse(kM, kcat, k1_forward, verbose=True):\n",
" k1_reverse = kM * k1_forward - kcat \n",
" if verbose:\n",
" if np.allclose(k1_reverse, 0):\n",
" print (f\"k1_reverse: {k1_reverse} , K = INFINITE\")\n",
" else:\n",
" K = k1_forward / k1_reverse\n",
" print(f\"k1_reverse: {k1_reverse} , K = {K}\")\n",
" \n",
" return k1_reverse"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "86419426-af7c-4a3a-8f8a-9fb10cfb65d9",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"k1_reverse: 99.99999999999986 , K = 0.18000000000000024\n"
]
},
{
"data": {
"text/plain": [
"99.99999999999986"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"compute_k1_reverse(kM, kcat, k1_forward=18.)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "746c07cc-a2d8-4192-b948-167d38a27a7e",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"k1_reverse: -48.172222222222224 , K = -0.002075885134355899\n"
]
},
{
"data": {
"text/plain": [
"-48.172222222222224"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"compute_k1_reverse(kM, kcat, k1_forward=0.1)"
]
},
{
"cell_type": "markdown",
"id": "244cfe71-dce0-4b28-b393-734d657602ec",
"metadata": {},
"source": [
"#### The negative values aren't good! We must add a constraint that: \n",
"kM * k1_forward - kcat > 0 \n",
"i.e. k1_forward > kcat/kM\n",
"\n",
"In other words, `k1_forward_min = kcat/kM`"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "2ce6dd36-3c9b-4ddc-89a4-c3fb9aa62e15",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"5.919463087248328"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"k1_forward_min = kcat / kM\n",
"k1_forward_min"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "59718c54-fc15-40b9-87c1-1e308998fad2",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"k1_reverse: 0.0 , K = INFINITE\n"
]
},
{
"data": {
"text/plain": [
"0.0"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"compute_k1_reverse(kM, kcat, k1_forward=k1_forward_min)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "aede8259-9590-4fdb-b2d5-4aea4477e885",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"k1_reverse: 0.6666666666666146 , K = 9.000000000000703\n"
]
},
{
"data": {
"text/plain": [
"0.6666666666666146"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"compute_k1_reverse(kM, kcat, k1_forward=6.)"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "597b8664-5980-430b-8fb7-532f98dac673",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"k1_reverse: 33.7777777777777 , K = 0.29605263157894807\n"
]
},
{
"data": {
"text/plain": [
"33.7777777777777"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"compute_k1_reverse(kM, kcat, k1_forward=10.)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "670e6976-e0a1-495e-aa26-746ca0766baf",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"k1_reverse: 282.1111111111108 , K = 0.14178810555336763\n"
]
},
{
"data": {
"text/plain": [
"282.1111111111108"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"compute_k1_reverse(kM, kcat, k1_forward=40.)"
]
},
{
"cell_type": "markdown",
"id": "3e578024-d229-4bbd-a7da-8df0d3afeb85",
"metadata": {},
"source": [
"The fixed point k1_forward = k1_reverse occurs when k1_forward = kM * k1_forward - kcat , i.e. \n",
"kM * k1_forward - k1_forward = kcat \n",
"k1_forward * (kM - 1) = kcat \n",
"k1_forward = kcat / (kM - 1)\n",
"Notice that the above makes sense only if kM > 1"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "32eb3d00-62ce-4743-bf4e-0f02c0179b62",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"6.7328244274809235"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Our kM is indeed > 1, so all good:\n",
"\n",
"k1_forward_fixed_pnt = kcat / (kM - 1)\n",
"k1_forward_fixed_pnt"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "488b98ef-9a13-4d8f-a17f-9d880e317848",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"k1_reverse: 6.732824427480921 , K = 1.0000000000000004\n"
]
},
{
"data": {
"text/plain": [
"6.732824427480921"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"compute_k1_reverse(kM, kcat, k1_forward=6.7328244274809235)"
]
},
{
"cell_type": "markdown",
"id": "bb739d11-4d13-4bac-b0cb-59bee63155aa",
"metadata": {},
"source": [
"Indeed, a fixed point"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "9551adb3-bf16-4c10-a3ab-0420553a2e37",
"metadata": {},
"outputs": [],
"source": [
"k1_forward_choices = np.linspace(5.92, 40., 2000) # Grid creation"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "da0cd43d-8c53-47ae-8652-9a739b5de496",
"metadata": {},
"outputs": [],
"source": [
"k1_reverse_choices = compute_k1_reverse(kM, kcat, k1_forward=k1_forward_choices, verbose=False)"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "2671b7bc-81f8-4740-bd26-f0e6213b31f3",
"metadata": {},
"outputs": [],
"source": [
"import plotly.express as px"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "21368201-a259-4a5b-8f54-f42ed83f8c60",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
" \n",
" "
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.plotly.v1+json": {
"config": {
"plotlyServerURL": "https://plot.ly"
},
"data": [
{
"hovertemplate": "x=%{x}
y=%{y}
| \n", " | name | \n", "label | \n", "
|---|---|---|
| 0 | \n", "P | \n", "P | \n", "
| 1 | \n", "ES | \n", "ES | \n", "
| 2 | \n", "Adenosinedeaminase | \n", "E | \n", "
| 3 | \n", "2,6-Diamino-9-β-D-deoxyribofuranosyl-9-H-purine | \n", "S | \n", "
| \n", " | TIME | \n", "P | \n", "ES | \n", "E | \n", "S | \n", "caption | \n", "rate | \n", "
|---|---|---|---|---|---|---|---|
| 0 | \n", "0.000000 | \n", "0.000000 | \n", "0.000000 | \n", "1.000000 | \n", "20.000000 | \n", "\n", " | 0.000000 | \n", "
| 1 | \n", "0.000500 | \n", "0.000000 | \n", "0.180000 | \n", "0.820000 | \n", "19.820000 | \n", "\n", " | 8.820000 | \n", "
| 2 | \n", "0.000750 | \n", "0.002205 | \n", "0.246431 | \n", "0.753569 | \n", "19.751364 | \n", "\n", " | 12.075109 | \n", "
| 3 | \n", "0.000763 | \n", "0.002356 | \n", "0.249321 | \n", "0.750679 | \n", "19.748323 | \n", "\n", " | 12.216716 | \n", "
| 4 | \n", "0.000769 | \n", "0.002432 | \n", "0.250756 | \n", "0.749244 | \n", "19.746811 | \n", "\n", " | 12.287060 | \n", "
| ... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "
| 779 | \n", "1.166644 | \n", "19.724207 | \n", "0.029857 | \n", "0.970143 | \n", "0.245936 | \n", "\n", " | 1.462999 | \n", "
| 780 | \n", "1.173671 | \n", "19.734488 | \n", "0.028775 | \n", "0.971225 | \n", "0.236738 | \n", "\n", " | 1.409959 | \n", "
| 781 | \n", "1.180698 | \n", "19.744395 | \n", "0.027729 | \n", "0.972271 | \n", "0.227875 | \n", "\n", " | 1.358736 | \n", "
| 782 | \n", "1.187725 | \n", "19.753943 | \n", "0.026720 | \n", "0.973280 | \n", "0.219337 | \n", "\n", " | 1.309274 | \n", "
| 783 | \n", "1.194752 | \n", "19.763144 | \n", "0.025745 | \n", "0.974255 | \n", "0.211111 | \n", "\n", " | 1.261520 | \n", "
784 rows × 7 columns
\n", "| \n", " | TIME | \n", "P | \n", "ES | \n", "E | \n", "S | \n", "caption | \n", "rate | \n", "
|---|---|---|---|---|---|---|---|
| 0 | \n", "0.000000 | \n", "0.000000 | \n", "0.000000 | \n", "1.000000 | \n", "20.000000 | \n", "\n", " | 0.000000 | \n", "
| 1 | \n", "0.000500 | \n", "0.000000 | \n", "0.065000 | \n", "0.935000 | \n", "19.935000 | \n", "\n", " | 3.185000 | \n", "
| 2 | \n", "0.000750 | \n", "0.000796 | \n", "0.094414 | \n", "0.905586 | \n", "19.904789 | \n", "\n", " | 4.626306 | \n", "
| 3 | \n", "0.000763 | \n", "0.000854 | \n", "0.095815 | \n", "0.904185 | \n", "19.903330 | \n", "\n", " | 4.694958 | \n", "
| 4 | \n", "0.000769 | \n", "0.000883 | \n", "0.096514 | \n", "0.903486 | \n", "19.902602 | \n", "\n", " | 4.729203 | \n", "
| ... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "
| 783 | \n", "1.171227 | \n", "19.767701 | \n", "0.026902 | \n", "0.973098 | \n", "0.205396 | \n", "\n", " | 1.318201 | \n", "
| 784 | \n", "1.178115 | \n", "19.776782 | \n", "0.025880 | \n", "0.974120 | \n", "0.197338 | \n", "\n", " | 1.268138 | \n", "
| 785 | \n", "1.185004 | \n", "19.785518 | \n", "0.024895 | \n", "0.975105 | \n", "0.189587 | \n", "\n", " | 1.219867 | \n", "
| 786 | \n", "1.191892 | \n", "19.793921 | \n", "0.023946 | \n", "0.976054 | \n", "0.182134 | \n", "\n", " | 1.173332 | \n", "
| 787 | \n", "1.198781 | \n", "19.802003 | \n", "0.023030 | \n", "0.976970 | \n", "0.174967 | \n", "\n", " | 1.128479 | \n", "
788 rows × 7 columns
\n", "| \n", " | TIME | \n", "P | \n", "ES | \n", "E | \n", "S | \n", "caption | \n", "rate | \n", "
|---|---|---|---|---|---|---|---|
| 0 | \n", "0.000000 | \n", "0.000000 | \n", "0.000000 | \n", "1.000000 | \n", "20.000000 | \n", "\n", " | 0.000000 | \n", "
| 1 | \n", "0.000500 | \n", "0.000000 | \n", "0.400000 | \n", "0.600000 | \n", "19.600000 | \n", "\n", " | 19.600000 | \n", "
| 2 | \n", "0.000750 | \n", "0.004900 | \n", "0.484489 | \n", "0.515511 | \n", "19.510611 | \n", "\n", " | 23.739956 | \n", "
| 3 | \n", "0.000763 | \n", "0.005197 | \n", "0.487513 | \n", "0.512487 | \n", "19.507291 | \n", "\n", " | 23.888118 | \n", "
| 4 | \n", "0.000769 | \n", "0.005346 | \n", "0.489003 | \n", "0.510997 | \n", "19.505651 | \n", "\n", " | 23.961149 | \n", "
| ... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "
| 859 | \n", "1.170211 | \n", "19.713808 | \n", "0.030426 | \n", "0.969574 | \n", "0.255766 | \n", "\n", " | 1.490884 | \n", "
| 860 | \n", "1.176184 | \n", "19.722714 | \n", "0.029500 | \n", "0.970500 | \n", "0.247787 | \n", "\n", " | 1.445487 | \n", "
| 861 | \n", "1.182158 | \n", "19.731349 | \n", "0.028612 | \n", "0.971388 | \n", "0.240039 | \n", "\n", " | 1.401986 | \n", "
| 862 | \n", "1.188131 | \n", "19.739724 | \n", "0.027735 | \n", "0.972265 | \n", "0.232542 | \n", "\n", " | 1.358993 | \n", "
| 863 | \n", "1.194105 | \n", "19.747842 | \n", "0.026901 | \n", "0.973099 | \n", "0.225257 | \n", "\n", " | 1.318155 | \n", "
864 rows × 7 columns
\n", "