{ "cells": [ { "cell_type": "markdown", "id": "5cbc8640", "metadata": {}, "source": [ "### Adaptive time substeps (variable time resolution) for reaction `A <-> B`,\n", "with 1st-order kinetics in both directions, taken to equilibrium\n", "\n", "Same as the experiment _\"react_1\"_ , but with adaptive time substeps\n", "\n", "LAST REVISED: Feb. 5, 2023" ] }, { "cell_type": "code", "execution_count": 1, "id": "b01eafc2", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Added 'D:\\Docs\\- MY CODE\\BioSimulations\\life123-Win7' to sys.path\n" ] } ], "source": [ "# Extend the sys.path variable, to contain the project's root directory\n", "import set_path\n", "set_path.add_ancestor_dir_to_syspath(2) # The number of levels to go up \n", " # to reach the project's home, from the folder containing this notebook" ] }, { "cell_type": "code", "execution_count": 2, "id": "85b2f63e", "metadata": { "tags": [] }, "outputs": [], "source": [ "from experiments.get_notebook_info import get_notebook_basename\n", "\n", "from src.modules.reactions.reaction_data import ReactionData as chem\n", "from src.modules.reactions.reaction_dynamics import ReactionDynamics\n", "\n", "import numpy as np\n", "import plotly.express as px\n", "from src.modules.visualization.graphic_log import GraphicLog" ] }, { "cell_type": "code", "execution_count": 3, "id": "121fdfdd", "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "-> Output will be LOGGED into the file 'react_2.log.htm'\n" ] } ], "source": [ "# Initialize the HTML logging (for the graphics)\n", "log_file = get_notebook_basename() + \".log.htm\" # Use the notebook base filename for the log file\n", "\n", "# Set up the use of some specified graphic (Vue) components\n", "GraphicLog.config(filename=log_file,\n", " components=[\"vue_cytoscape_1\"],\n", " extra_js=\"https://cdnjs.cloudflare.com/ajax/libs/cytoscape/3.21.2/cytoscape.umd.js\")" ] }, { "cell_type": "markdown", "id": "10c710ac", "metadata": {}, "source": [ "# Initialize the System\n", "Specify the chemicals and the reactions" ] }, { "cell_type": "code", "execution_count": 4, "id": "78077d8c", "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of reactions: 1\n" ] } ], "source": [ "# Specify the chemicals\n", "chem_data = chem(names=[\"A\", \"B\"])\n", "\n", "# Reaction A <-> B , with 1st-order kinetics in both directions\n", "chem_data.add_reaction(reactants=[\"A\"], products=[\"B\"], forward_rate=3., reverse_rate=2.)\n", "\n", "print(\"Number of reactions: \", chem_data.number_of_reactions())" ] }, { "cell_type": "code", "execution_count": 5, "id": "58433072", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of reactions: 1 (at temp. 25 C)\n", "0: A <-> B (kF = 3 / kR = 2 / Delta_G = -1,005.13 / K = 1.5) | 1st order in all reactants & products\n" ] } ], "source": [ "chem_data.describe_reactions()" ] }, { "cell_type": "code", "execution_count": 6, "id": "373afeb1", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[GRAPHIC ELEMENT SENT TO LOG FILE `react_2.log.htm`]\n" ] } ], "source": [ "# Send a plot of the network of reactions to the HTML log file\n", "graph_data = chem_data.prepare_graph_network()\n", "GraphicLog.export_plot(graph_data, \"vue_cytoscape_1\")" ] }, { "cell_type": "markdown", "id": "e0529a0c", "metadata": {}, "source": [ "# Start the simulation" ] }, { "cell_type": "code", "execution_count": 7, "id": "f9736433", "metadata": {}, "outputs": [], "source": [ "dynamics = ReactionDynamics(reaction_data=chem_data)" ] }, { "cell_type": "code", "execution_count": 8, "id": "9fc3948d", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "SYSTEM STATE at Time t = 0:\n", "2 species:\n", " Species 0 (A). Conc: 10.0\n", " Species 1 (B). Conc: 50.0\n" ] } ], "source": [ "# Initial concentrations of all the chemicals, in index order\n", "dynamics.set_conc([10., 50.], snapshot=True)\n", "\n", "dynamics.describe_state()" ] }, { "cell_type": "code", "execution_count": 9, "id": "0cc938cc", "metadata": {}, "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", "
SYSTEM TIMEABcaption
00.010.050.0Initial state
\n", "
" ], "text/plain": [ " SYSTEM TIME A B caption\n", "0 0.0 10.0 50.0 Initial state" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dynamics.history.get()" ] }, { "cell_type": "markdown", "id": "987af2c5", "metadata": { "tags": [] }, "source": [ "## Run the reaction" ] }, { "cell_type": "code", "execution_count": 10, "id": "ad665050", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "single_compartment_react(): setting abs_fast_threshold to 10.0\n", "12 total step(s) taken\n" ] } ], "source": [ "dynamics.set_diagnostics() # To save diagnostic information about the call to single_compartment_react()\n", "\n", "dynamics.single_compartment_react(time_step=0.1, n_steps=11,\n", " snapshots={\"initial_caption\": \"1st reaction step\",\n", " \"final_caption\": \"last reaction step\"},\n", " dynamic_substeps=2, rel_fast_threshold=100)" ] }, { "cell_type": "markdown", "id": "2169c3b3", "metadata": {}, "source": [ "## The argument _dynamic_step=2_ splits the time steps in 2 whenever the reaction is \"fast\" (as determined using the specified value of _fast_threshold_ )" ] }, { "cell_type": "code", "execution_count": 11, "id": "2d5df59c", "metadata": {}, "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", " \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", "
SYSTEM TIMEABcaption
00.0010.00000050.000000Initial state
10.0513.50000046.500000Interm. step, due to the fast rxns: [0]
20.1016.12500043.8750001st reaction step
30.1518.09375041.906250Interm. step, due to the fast rxns: [0]
40.2019.57031240.429688
50.2520.67773439.322266Interm. step, due to the fast rxns: [0]
60.3021.50830138.491699
70.3522.13122637.868774Interm. step, due to the fast rxns: [0]
80.4022.59841937.401581
90.5023.29921036.700790
100.6023.64960536.350395
110.7023.82480236.175198
120.8023.91240136.087599
130.9023.95620136.043799
141.0023.97810036.021900
151.1023.98905036.010950
161.2023.99452536.005475last reaction step
\n", "
" ], "text/plain": [ " SYSTEM TIME A B caption\n", "0 0.00 10.000000 50.000000 Initial state\n", "1 0.05 13.500000 46.500000 Interm. step, due to the fast rxns: [0]\n", "2 0.10 16.125000 43.875000 1st reaction step\n", "3 0.15 18.093750 41.906250 Interm. step, due to the fast rxns: [0]\n", "4 0.20 19.570312 40.429688 \n", "5 0.25 20.677734 39.322266 Interm. step, due to the fast rxns: [0]\n", "6 0.30 21.508301 38.491699 \n", "7 0.35 22.131226 37.868774 Interm. step, due to the fast rxns: [0]\n", "8 0.40 22.598419 37.401581 \n", "9 0.50 23.299210 36.700790 \n", "10 0.60 23.649605 36.350395 \n", "11 0.70 23.824802 36.175198 \n", "12 0.80 23.912401 36.087599 \n", "13 0.90 23.956201 36.043799 \n", "14 1.00 23.978100 36.021900 \n", "15 1.10 23.989050 36.010950 \n", "16 1.20 23.994525 36.005475 last reaction step" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = dynamics.get_history() # The system's history, saved during the run of single_compartment_react()\n", "df" ] }, { "cell_type": "code", "execution_count": 12, "id": "1092029f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "From time 0 to 0.4, in 8 substeps of 0.05 (each 1/2 of full step)\n", "From time 0.4 to 1.2, in 8 FULL steps of 0.1\n" ] } ], "source": [ "dynamics.explain_time_advance()" ] }, { "cell_type": "markdown", "id": "edb7c015", "metadata": {}, "source": [ "## Notice how the reaction proceeds in smaller steps (half steps) in the early times, when [A] and [B] are changing much more rapidly\n", "### That resulted from passing the argument _dynamic_steps=2_ to single_compartment_react()\n", "\n", "* For example, upon completing the half step to t=0.30, i.e. **going from 0.25 to 0.30**, the last change in [A] was (21.508301 - 20.677734) = 0.830567 \n", "The threshold we specified for a reaction to be considered fast is 100% per full step, for any of the involved chemicals. For a half step, that corresponds to 50%, i.e. 0.5 \n", "Since abs(0.830567) > 0.5 , the reaction is therefore marked \"FAST\" (as it has been so far), and the simulation then proceeds in a half step, to t=0.35" ] }, { "cell_type": "markdown", "id": "d6e85fb4", "metadata": {}, "source": [ "* (Note: at t=0, in the absence of any simulation data, ALL reactions are _assumed_ to be fast)" ] }, { "cell_type": "markdown", "id": "6047485b", "metadata": {}, "source": [ "* By contrast, upon completing the half step to t=0.40, i.e. **going from 0.35 to 0.40**, the following changes occur in [A] and [B]: " ] }, { "cell_type": "code", "execution_count": 13, "id": "63f23745", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "SYSTEM TIME 0.35\n", "A 22.131226\n", "B 37.868774\n", "caption Interm. step, due to the fast rxns: [0]\n", "Name: 7, dtype: object" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.iloc[7]" ] }, { "cell_type": "code", "execution_count": 14, "id": "6b5bce14", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "SYSTEM TIME 0.4\n", "A 22.598419\n", "B 37.401581\n", "caption \n", "Name: 8, dtype: object" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.iloc[8]" ] }, { "cell_type": "code", "execution_count": 15, "id": "1d98fa27", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([22.1312255859375, 37.8687744140625], dtype=object)" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s_0_35 = df.iloc[7][['A', 'B']].to_numpy()\n", "s_0_35 # Concentrations of A and B at t=0.35" ] }, { "cell_type": "code", "execution_count": 16, "id": "22612d84", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([22.598419189453125, 37.401580810546875], dtype=object)" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s_0_40 = df.iloc[8][['A', 'B']].to_numpy()\n", "s_0_40 # Concentrations of A and B at t=0.40" ] }, { "cell_type": "code", "execution_count": 17, "id": "d194328b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0.467193603515625, -0.467193603515625], dtype=object)" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(s_0_40 - s_0_35)" ] }, { "cell_type": "markdown", "id": "2127ef7d", "metadata": {}, "source": [ "Again, the threshold we specified for a reaction to be considered fast is 100% per full step, for any of the involved chemicals. \n", "For a half step, that corresponds to 50%, i.e. 0.5 \n", "BOTH A's change of abs(0.46) AND B's change of abs(-0.46) are SMALLER than that. \n", "The reaction is therefore marked \"SLOW\", and the simulation then proceeds in a _full time step_ of 0.1 (i.e. a more relaxed time resolution), to t=0.50" ] }, { "cell_type": "markdown", "id": "6deca814", "metadata": {}, "source": [ "### Check the final equilibrium" ] }, { "cell_type": "code", "execution_count": 18, "id": "95c56197", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([23.99452507, 36.00547493])" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dynamics.get_system_conc()" ] }, { "cell_type": "markdown", "id": "2437b566", "metadata": {}, "source": [ "NOTE: Consistent with the 3/2 ratio of forward/reverse rates (and the 1st order reactions),\n", " the systems settles in the following equilibrium:\n", "\n", "[A] = 23.99316406\n", " \n", "[B] = 36.00683594\n", "\n", "The presence of equilibrium may be automatically checked withe the following handy function:\n" ] }, { "cell_type": "code", "execution_count": 19, "id": "23c4b3ba", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "A <-> B\n", "Final concentrations: [B] = 36.01 ; [A] = 23.99\n", "1. Ratio of reactant/product concentrations, adjusted for reaction orders: 1.50057\n", " Formula used: [B] / [A]\n", "2. Ratio of forward/reverse reaction rates: 1.5\n", "Discrepancy between the two values: 0.03803 %\n", "Reaction IS in equilibrium (within 1% tolerance)\n", "\n" ] }, { "data": { "text/plain": [ "True" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Verify that the reaction has reached equilibrium\n", "dynamics.is_in_equilibrium()" ] }, { "cell_type": "markdown", "id": "03866901", "metadata": { "tags": [] }, "source": [ "## Plots of changes of concentration with time" ] }, { "cell_type": "code", "execution_count": 20, "id": "baf7c0f4", "metadata": {}, "outputs": [ { "data": { "text/html": [ " \n", " " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "hovertemplate": "Chemical=A
SYSTEM TIME=%{x}
concentration=%{y}", "legendgroup": "A", "line": { "color": "navy", "dash": "solid" }, "marker": { "symbol": "circle" }, "mode": "lines", "name": "A", "orientation": "v", "showlegend": true, "type": "scatter", "x": [ 0, 0.05, 0.1, 0.15000000000000002, 0.2, 0.25, 0.30000000000000004, 0.35000000000000003, 0.4, 0.5, 0.6, 0.7, 0.7999999999999999, 0.8999999999999999, 0.9999999999999999, 1.0999999999999999, 1.2 ], "xaxis": "x", "y": [ 10, 13.5, 16.125, 18.09375, 19.5703125, 20.677734375, 21.50830078125, 22.1312255859375, 22.598419189453125, 23.299209594726562, 23.64960479736328, 23.82480239868164, 23.91240119934082, 23.95620059967041, 23.978100299835205, 23.989050149917603, 23.9945250749588 ], "yaxis": "y" }, { "hovertemplate": "Chemical=B
SYSTEM TIME=%{x}
concentration=%{y}", "legendgroup": "B", "line": { "color": "darkorange", "dash": "solid" }, "marker": { "symbol": "circle" }, "mode": "lines", "name": "B", "orientation": "v", "showlegend": true, "type": "scatter", "x": [ 0, 0.05, 0.1, 0.15000000000000002, 0.2, 0.25, 0.30000000000000004, 0.35000000000000003, 0.4, 0.5, 0.6, 0.7, 0.7999999999999999, 0.8999999999999999, 0.9999999999999999, 1.0999999999999999, 1.2 ], "xaxis": "x", "y": [ 50, 46.5, 43.875, 41.90625, 40.4296875, 39.322265625, 38.49169921875, 37.8687744140625, 37.401580810546875, 36.70079040527344, 36.35039520263672, 36.17519760131836, 36.08759880065918, 36.04379940032959, 36.021899700164795, 36.0109498500824, 36.0054749250412 ], "yaxis": "y" } ], "layout": { "autosize": true, "legend": { "title": { "text": "Chemical" }, "tracegroupgap": 0 }, "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "fillpattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "autotypenumbers": "strict", "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "#E5ECF6", "showlakes": true, "showland": true, "subunitcolor": "white" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "#E5ECF6", "polar": { "angularaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "radialaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "yaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "zaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "baxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "caxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 } } }, "title": { "text": "Reaction A <-> B . Changes in concentrations with time" }, "xaxis": { "anchor": "y", "autorange": true, "domain": [ 0, 1 ], "range": [ 0, 1.2 ], "title": { "text": "SYSTEM TIME" }, "type": "linear" }, "yaxis": { "anchor": "x", "autorange": true, "domain": [ 0, 1 ], "range": [ 7.777777777777778, 52.22222222222222 ], "title": { "text": "concentration" }, "type": "linear" } } }, "image/png": "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", "text/html": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = px.line(data_frame=dynamics.get_history(), x=\"SYSTEM TIME\", y=[\"A\", \"B\"], \n", " title=\"Reaction A <-> B . Changes in concentrations with time\",\n", " color_discrete_sequence = ['navy', 'darkorange'],\n", " labels={\"value\":\"concentration\", \"variable\":\"Chemical\"})\n", "fig.show()" ] }, { "cell_type": "markdown", "id": "306e3db7", "metadata": {}, "source": [ "## Note how the left-hand side of this plot is much smoother than it was in experiment \"react_1\", where no adaptive time substeps were used!" ] }, { "cell_type": "code", "execution_count": null, "id": "0c40429d", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "317b8747", "metadata": {}, "source": [ "# Diagnostics of the run may be investigated as follows:" ] }, { "cell_type": "code", "execution_count": 21, "id": "04c04327", "metadata": {}, "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", " \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", " \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", "
TIMEABis_primaryprimary_timestepn_substepssubstep_numbercaption
00.0010.00000050.000000True0.120
10.0513.50000046.500000False0.121
20.1016.12500043.875000True0.120
30.1518.09375041.906250False0.121
40.2019.57031240.429688True0.120
50.2520.67773439.322266False0.121
60.3021.50830138.491699True0.120
70.3522.13122637.868774False0.121
80.4022.59841937.401581True0.120
90.5023.29921036.700790True0.120
100.6023.64960536.350395True0.120
110.7023.82480236.175198True0.120
120.8023.91240136.087599True0.120
130.9023.95620136.043799True0.120
141.0023.97810036.021900True0.120
151.1023.98905036.010950True0.120
161.2023.99452536.005475True0.120
\n", "
" ], "text/plain": [ " TIME A B is_primary primary_timestep n_substeps \\\n", "0 0.00 10.000000 50.000000 True 0.1 2 \n", "1 0.05 13.500000 46.500000 False 0.1 2 \n", "2 0.10 16.125000 43.875000 True 0.1 2 \n", "3 0.15 18.093750 41.906250 False 0.1 2 \n", "4 0.20 19.570312 40.429688 True 0.1 2 \n", "5 0.25 20.677734 39.322266 False 0.1 2 \n", "6 0.30 21.508301 38.491699 True 0.1 2 \n", "7 0.35 22.131226 37.868774 False 0.1 2 \n", "8 0.40 22.598419 37.401581 True 0.1 2 \n", "9 0.50 23.299210 36.700790 True 0.1 2 \n", "10 0.60 23.649605 36.350395 True 0.1 2 \n", "11 0.70 23.824802 36.175198 True 0.1 2 \n", "12 0.80 23.912401 36.087599 True 0.1 2 \n", "13 0.90 23.956201 36.043799 True 0.1 2 \n", "14 1.00 23.978100 36.021900 True 0.1 2 \n", "15 1.10 23.989050 36.010950 True 0.1 2 \n", "16 1.20 23.994525 36.005475 True 0.1 2 \n", "\n", " substep_number caption \n", "0 0 \n", "1 1 \n", "2 0 \n", "3 1 \n", "4 0 \n", "5 1 \n", "6 0 \n", "7 1 \n", "8 0 \n", "9 0 \n", "10 0 \n", "11 0 \n", "12 0 \n", "13 0 \n", "14 0 \n", "15 0 \n", "16 0 " ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dynamics.diagnostic_data_baselines.get()" ] }, { "cell_type": "code", "execution_count": 22, "id": "2144da8f-498a-4954-8a51-a0e606055979", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Reaction: A <-> B\n" ] }, { "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", " \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", " \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", "
TIMEDelta ADelta Breactionsubsteptime_subdivisiondelta_timecaption
00.003.500000-3.5000000020.05
10.052.625000-2.6250000120.05
20.101.968750-1.9687500020.05
30.151.476562-1.4765620120.05
40.201.107422-1.1074220020.05
50.250.830566-0.8305660120.05
60.300.622925-0.6229250020.05
70.350.467194-0.4671940120.05
80.400.700790-0.7007900010.10
90.500.350395-0.3503950010.10
100.600.175198-0.1751980010.10
110.700.087599-0.0875990010.10
120.800.043799-0.0437990010.10
130.900.021900-0.0219000010.10
141.000.010950-0.0109500010.10
151.100.005475-0.0054750010.10
\n", "
" ], "text/plain": [ " TIME Delta A Delta B reaction substep time_subdivision delta_time \\\n", "0 0.00 3.500000 -3.500000 0 0 2 0.05 \n", "1 0.05 2.625000 -2.625000 0 1 2 0.05 \n", "2 0.10 1.968750 -1.968750 0 0 2 0.05 \n", "3 0.15 1.476562 -1.476562 0 1 2 0.05 \n", "4 0.20 1.107422 -1.107422 0 0 2 0.05 \n", "5 0.25 0.830566 -0.830566 0 1 2 0.05 \n", "6 0.30 0.622925 -0.622925 0 0 2 0.05 \n", "7 0.35 0.467194 -0.467194 0 1 2 0.05 \n", "8 0.40 0.700790 -0.700790 0 0 1 0.10 \n", "9 0.50 0.350395 -0.350395 0 0 1 0.10 \n", "10 0.60 0.175198 -0.175198 0 0 1 0.10 \n", "11 0.70 0.087599 -0.087599 0 0 1 0.10 \n", "12 0.80 0.043799 -0.043799 0 0 1 0.10 \n", "13 0.90 0.021900 -0.021900 0 0 1 0.10 \n", "14 1.00 0.010950 -0.010950 0 0 1 0.10 \n", "15 1.10 0.005475 -0.005475 0 0 1 0.10 \n", "\n", " caption \n", "0 \n", "1 \n", "2 \n", "3 \n", "4 \n", "5 \n", "6 \n", "7 \n", "8 \n", "9 \n", "10 \n", "11 \n", "12 \n", "13 \n", "14 \n", "15 " ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dynamics.get_diagnostic_data(rxn_index=0) # For the 0-th reaction (the only reaction in our case)" ] }, { "cell_type": "code", "execution_count": null, "id": "98515b8d", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.8.10" } }, "nbformat": 4, "nbformat_minor": 5 }