{
"cells": [
{
"cell_type": "markdown",
"id": "5cbc8640",
"metadata": {},
"source": [
"## **Enzyme Kinetics** : \n",
"\n",
"#### Our model: `E + S <-> ES` (with kinetic parameters _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",
"Background: please see experiment `enzyme_1_a`"
]
},
{
"cell_type": "markdown",
"id": "604b150b-7812-4fd3-9403-69a06dd7e397",
"metadata": {},
"source": [
"#### THE REACTION: \n",
"the enzyme `Adenosinedeaminase`, \n",
"with the substrate `2,6-Diamino-9-β-D-deoxyribofuranosyl-9-H-purine`.\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 = \"Sep. 10, 2025\"\n",
"LIFE123_VERSION = \"1.0.0rc7\" # 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 numpy as np\n",
"import plotly.express as px\n",
"\n",
"from life123 import check_version, ReactionEnzyme"
]
},
{
"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) # To check compatibility"
]
},
{
"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": [
"# We'll use the following values, taken from experiment `enzyme_1_a`\n",
"kM = 8.27777777777777\n",
"kcat = 49"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "c04db12c-e77f-4b53-8cdb-859194959ca1",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"49"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# k2_forward equals kcat ; not much to say here!\n",
"k2_forward = kcat\n",
"k2_forward"
]
},
{
"cell_type": "markdown",
"id": "57aca1c1-9ea1-4732-ac3b-69c75dc7a1fa",
"metadata": {},
"source": [
"By definition: `kM = (k2_forward + k1_reverse) / k1_forward` \n",
"\n",
"We are given `kM` and `k2_forward` (same as `kcat`), as those are typical quantities measured experimentally, i.e.: \n",
"\n",
"`kM = (kcat + k1_reverse) / k1_forward` \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 explore fixing a guess for `k1_forward`, and then computing the corresponding `k1_reverse` - or vice versa. \n",
"\n",
"The Life123 class `ReactionEnzyme` conveniently provides the necessary transformations."
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "2ea816ee-4bb1-4f36-9a41-281aa4537586",
"metadata": {},
"outputs": [],
"source": [
"enz = ReactionEnzyme(enzyme=\"E\", substrate=\"S\", product=\"P\")"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "7e34a530-7e5e-404b-8cb2-01e7db85557a",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"99.99999999999986"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Example, using the k1_forward=18. from experiment `enzyme_1_a` (together with the kM and kcat we were given), to determine k1_reverse\n",
"\n",
"k1_reverse = enz.compute_k1_reverse(kM=kM, kcat=kcat, k1_forward = 18.)\n",
"k1_reverse"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "48538108-e169-40e7-a041-f58c39c6273a",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"18.000000000000018"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Conversely, using the k1_reverse=100. from experiment `enzyme_1`, to determine k1_forward\n",
"\n",
"k1_forward = enz.compute_k1_forward(kM=kM, kcat=kcat, k1_reverse = 100.)\n",
"k1_forward"
]
},
{
"cell_type": "markdown",
"id": "c738a101-f8dc-449e-a9fb-57b67e890f4f",
"metadata": {},
"source": [
"#### Naturally, we're getting the same values we had in experiment `enzyme_1_a`, \n",
"namely `k1_forward = 18.` and `k1_reverse = 100.` \n",
"#### But what if neither `k1_forward` nor `k1_reverse` are known?"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "d6bfd6e6-a7b0-4e3e-9bfc-8eee1e4bae62",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "d7fabeec-8221-417a-9004-aab569759ecb",
"metadata": {},
"source": [
"### PART 1. Let's try a variety of values for `k1_reverse`, and determine the corresponding values for `k1_forward`"
]
},
{
"cell_type": "markdown",
"id": "bbf75c6a-08b2-4bf0-9aba-8035a36b1d09",
"metadata": {
"tags": []
},
"source": [
"#### `k1_reverse` must be non-negative because it's a reaction rate constant, but in other respects there's no conceptual restriction on its value, as plugged into our equation:\n",
"`kM = (kcat + k1_reverse) / k1_forward`"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "0ec24a33-b30e-48df-9541-a0e7a1f6c575",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([ 0., 150., 300.])"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"k1_reverse_choices = np.linspace(0., 300., 3) # Even grid of values\n",
"k1_reverse_choices"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "a644dfac-84be-41a7-9661-da3362e19727",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([ 5.91946309, 24.04026846, 42.16107383])"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"k1_forward_choices = enz.compute_k1_forward(kM=kM, kcat=kcat, k1_reverse = k1_reverse_choices)\n",
"k1_forward_choices"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "dc26d8a8-9e7a-4e78-924a-6690ad6e3dfc",
"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}