{ "cells": [ { "cell_type": "markdown", "id": "3bbe8002-bdf3-490c-bde0-80dd3713a3d0", "metadata": {}, "source": [ "## Association/Dissociation reaction `A + B <-> C`\n", "#### with 1st-order kinetics for each species, taken to equilibrium.\n", "#### Exploration of debugging and diagnostics options\n", "(Adaptive variable time substeps are used)\n", "\n", "_See also the experiment \"1D/reactions/reaction_4\"_ \n", "\n", " # For the 0-th reaction (the only reaction in our case)" ] }, { "cell_type": "code", "execution_count": 1, "id": "13e55c1d-609f-4bf0-a004-6c45bcfcbc99", "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": "bdad128a-9214-46f5-aeb9-a7b77c81aa3e", "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": "83c3cc5f-de21-4f66-9988-2806fbf0666d", "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "-> Output will be LOGGED into the file 'react_3.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": "9329208b-070f-4902-8f37-0f11ddf75ed6", "metadata": {}, "source": [ "# Initialize the System\n", "Specify the chemicals and the reactions" ] }, { "cell_type": "code", "execution_count": 4, "id": "72b4245c-de4e-480d-a501-3495b7ed8bc4", "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\", \"C\"])\n", "\n", "# Reaction A + B <-> C , with 1st-order kinetics for each species\n", "chem_data.add_reaction(reactants=[\"A\" , \"B\"], products=[\"C\"],\n", " forward_rate=5., reverse_rate=2.)\n", "\n", "print(\"Number of reactions: \", chem_data.number_of_reactions())" ] }, { "cell_type": "code", "execution_count": 5, "id": "00ea560d-9a49-4041-b119-6de11bfcc7af", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of reactions: 1 (at temp. 25 C)\n", "0: A + B <-> C (kF = 5 / kR = 2 / Delta_G = -2,271.45 / K = 2.5) | 1st order in all reactants & products\n" ] } ], "source": [ "chem_data.describe_reactions()" ] }, { "cell_type": "code", "execution_count": 6, "id": "cb582868-431c-4022-aa0e-a2f554f80d6c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[GRAPHIC ELEMENT SENT TO LOG FILE `react_3.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": "98a9fbe5-2090-4d38-9c5f-94fbf7c3eae2", "metadata": {}, "source": [ "# Start the simulation" ] }, { "cell_type": "code", "execution_count": 7, "id": "c2f4a554-807b-49f9-8ca2-8d929fe6eeef", "metadata": {}, "outputs": [], "source": [ "dynamics = ReactionDynamics(reaction_data=chem_data)" ] }, { "cell_type": "code", "execution_count": 8, "id": "ae304704-c8d9-4cef-9e0b-2587bb3909ef", "metadata": {}, "outputs": [], "source": [ "# Initial concentrations of all the chemicals, in index order\n", "dynamics.set_conc([10., 50., 20.], snapshot=True)" ] }, { "cell_type": "code", "execution_count": 9, "id": "a605dacf-2c67-403e-9aa9-5be25fc9f481", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "SYSTEM STATE at Time t = 0:\n", "3 species:\n", " Species 0 (A). Conc: 10.0\n", " Species 1 (B). Conc: 50.0\n", " Species 2 (C). Conc: 20.0\n" ] } ], "source": [ "dynamics.describe_state()" ] }, { "cell_type": "code", "execution_count": 10, "id": "0ff2c242-a15b-456d-ad56-0ba1041c0b4c", "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", "
SYSTEM TIMEABCcaption
00.010.050.020.0Initial state
\n", "
" ], "text/plain": [ " SYSTEM TIME A B C caption\n", "0 0.0 10.0 50.0 20.0 Initial state" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dynamics.get_history()" ] }, { "cell_type": "markdown", "id": "fc516ca2-e62d-4784-b826-5372ff7f4c75", "metadata": { "tags": [] }, "source": [ "## Run the reaction" ] }, { "cell_type": "code", "execution_count": 11, "id": "2502cd11-0df9-4303-8895-98401a1df7b8", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "single_compartment_react(): setting abs_fast_threshold to 2.5\n", "15 total step(s) taken\n" ] } ], "source": [ "dynamics.set_diagnostics() # To save diagnostic information about the call to single_compartment_react()\n", "#dynamics.verbose_list = [1] # Uncomment for detailed run information (meant for debugging the adaptive variable time step)\n", "\n", "dynamics.single_compartment_react(time_step=0.004, reaction_duration=0.06,\n", " snapshots={\"initial_caption\": \"1st reaction step\",\n", " \"final_caption\": \"last reaction step\"},\n", " dynamic_substeps=2, rel_fast_threshold=1)" ] }, { "cell_type": "markdown", "id": "99a9a4b2-a588-4ba5-85c9-0a5a5d1dbaad", "metadata": {}, "source": [ "### Note: the argument _dynamic_step=2_ splits the time steps in 2 whenever the reaction is \"fast\" (as determined using the given value of _fast_threshold_ )" ] }, { "cell_type": "code", "execution_count": 12, "id": "80fbaee3-bd6f-4197-9270-23374d46a4a7", "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", "
SYSTEM TIMEABCcaption
00.00010.00000050.00000020.000000Initial state
10.0025.08000045.08000024.920000Interm. step, due to the fast rxns: [0]
20.0042.88961642.88961627.1103841st reaction step
30.0061.75871241.75871228.241288Interm. step, due to the fast rxns: [0]
40.0081.13726241.13726228.862738
50.0100.78487440.78487429.215126Interm. step, due to the fast rxns: [0]
60.0120.58162540.58162529.418375
70.0140.46326640.46326629.536734Interm. step, due to the fast rxns: [0]
80.0160.39396040.39396029.606040
90.0180.35324840.35324829.646752Interm. step, due to the fast rxns: [0]
100.0200.32928840.32928829.670712
110.0220.31517140.31517129.684829Interm. step, due to the fast rxns: [0]
120.0240.30684940.30684929.693151
130.0260.30194040.30194029.698060Interm. step, due to the fast rxns: [0]
140.0280.29904540.29904529.700955
150.0320.29562840.29562829.704372
160.0360.29501340.29501329.704987
170.0400.29490240.29490229.705098
180.0440.29488240.29488229.705118
190.0480.29487840.29487829.705122
200.0520.29487840.29487829.705122
210.0560.29487740.29487729.705123
220.0600.29487740.29487729.705123last reaction step
\n", "
" ], "text/plain": [ " SYSTEM TIME A B C \\\n", "0 0.000 10.000000 50.000000 20.000000 \n", "1 0.002 5.080000 45.080000 24.920000 \n", "2 0.004 2.889616 42.889616 27.110384 \n", "3 0.006 1.758712 41.758712 28.241288 \n", "4 0.008 1.137262 41.137262 28.862738 \n", "5 0.010 0.784874 40.784874 29.215126 \n", "6 0.012 0.581625 40.581625 29.418375 \n", "7 0.014 0.463266 40.463266 29.536734 \n", "8 0.016 0.393960 40.393960 29.606040 \n", "9 0.018 0.353248 40.353248 29.646752 \n", "10 0.020 0.329288 40.329288 29.670712 \n", "11 0.022 0.315171 40.315171 29.684829 \n", "12 0.024 0.306849 40.306849 29.693151 \n", "13 0.026 0.301940 40.301940 29.698060 \n", "14 0.028 0.299045 40.299045 29.700955 \n", "15 0.032 0.295628 40.295628 29.704372 \n", "16 0.036 0.295013 40.295013 29.704987 \n", "17 0.040 0.294902 40.294902 29.705098 \n", "18 0.044 0.294882 40.294882 29.705118 \n", "19 0.048 0.294878 40.294878 29.705122 \n", "20 0.052 0.294878 40.294878 29.705122 \n", "21 0.056 0.294877 40.294877 29.705123 \n", "22 0.060 0.294877 40.294877 29.705123 \n", "\n", " caption \n", "0 Initial state \n", "1 Interm. step, due to the fast rxns: [0] \n", "2 1st reaction step \n", "3 Interm. step, due to the fast rxns: [0] \n", "4 \n", "5 Interm. step, due to the fast rxns: [0] \n", "6 \n", "7 Interm. step, due to the fast rxns: [0] \n", "8 \n", "9 Interm. step, due to the fast rxns: [0] \n", "10 \n", "11 Interm. step, due to the fast rxns: [0] \n", "12 \n", "13 Interm. step, due to the fast rxns: [0] \n", "14 \n", "15 \n", "16 \n", "17 \n", "18 \n", "19 \n", "20 \n", "21 \n", "22 last reaction step " ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = dynamics.get_history()\n", "df" ] }, { "cell_type": "code", "execution_count": 13, "id": "1598a75b-0322-45ac-bf2c-21fd09049966", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "From time 0 to 0.028, in 14 substeps of 0.002 (each 1/2 of full step)\n", "From time 0.028 to 0.06, in 8 FULL steps of 0.004\n" ] } ], "source": [ "dynamics.explain_time_advance()" ] }, { "cell_type": "markdown", "id": "9fb5f6b8-dde3-415d-9e90-b8d102bfd748", "metadata": {}, "source": [ "### Notice how the reaction proceeds in smaller steps in the early times, when the concentrations are changing much more rapidly" ] }, { "cell_type": "markdown", "id": "b1366038-2dea-4d69-a655-ae464ca22922", "metadata": {}, "source": [ "## Note: \"A\" (now largely depleted) is the limiting reagent" ] }, { "cell_type": "markdown", "id": "c02a8f55-a671-4771-86c9-fc4d1b126bf8", "metadata": {}, "source": [ "### Check the final equilibrium" ] }, { "cell_type": "code", "execution_count": 14, "id": "b139f5e4-625f-4a5e-8f57-8f00244dced4", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 0.29487741, 40.29487741, 29.70512259])" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dynamics.get_system_conc()" ] }, { "cell_type": "markdown", "id": "d25eedf3-89f8-4f8c-a49a-d2689103528b", "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] = 0.29487741 , [B] = 40.29487741 , [C] = 29.70512259\n" ] }, { "cell_type": "code", "execution_count": 15, "id": "765f6f39-4b2e-4a86-b6a9-ace9d1941663", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "A + B <-> C\n", "Final concentrations: [C] = 29.71 ; [A] = 0.2949 ; [B] = 40.29\n", "1. Ratio of reactant/product concentrations, adjusted for reaction orders: 2.5\n", " Formula used: [C] / ([A][B])\n", "2. Ratio of forward/reverse reaction rates: 2.5\n", "Discrepancy between the two values: 1.598e-06 %\n", "Reaction IS in equilibrium (within 1% tolerance)\n", "\n" ] }, { "data": { "text/plain": [ "True" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Verify that the reaction has reached equilibrium\n", "dynamics.is_in_equilibrium()" ] }, { "cell_type": "markdown", "id": "6ac3dd4e-9dd0-4d3a-aa83-76102bd79524", "metadata": { "tags": [] }, "source": [ "## Plots of changes of concentration with time" ] }, { "cell_type": "code", "execution_count": 16, "id": "5f73e330-2d43-4cef-b2a0-c6eb379eea2e", "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": "red", "dash": "solid" }, "marker": { "symbol": "circle" }, "mode": "lines", "name": "A", "orientation": "v", "showlegend": true, "type": "scatter", "x": [ 0, 0.002, 0.004, 0.006, 0.008, 0.01, 0.012, 0.014, 0.016, 0.018000000000000002, 0.02, 0.022, 0.024, 0.026000000000000002, 0.028, 0.032, 0.036000000000000004, 0.04000000000000001, 0.04400000000000001, 0.048000000000000015, 0.05200000000000002, 0.05600000000000002, 0.060000000000000026 ], "xaxis": "x", "y": [ 10, 5.08, 2.889616, 1.75871232972544, 1.1372618579290792, 0.7848744219907281, 0.5816248769235212, 0.46326555167185557, 0.3939601190827676, 0.3532481852190524, 0.3292880755869497, 0.3151713866825845, 0.30684881643298606, 0.3019403326325964, 0.2990447586043246, 0.29562803829905593, 0.2950126646128477, 0.29490178216002727, 0.294881800952302, 0.2948782002521845, 0.2948775513887401, 0.2948774344603777, 0.2948774133893138 ], "yaxis": "y" }, { "hovertemplate": "Chemical=B
SYSTEM TIME=%{x}
concentration=%{y}", "legendgroup": "B", "line": { "color": "violet", "dash": "solid" }, "marker": { "symbol": "circle" }, "mode": "lines", "name": "B", "orientation": "v", "showlegend": true, "type": "scatter", "x": [ 0, 0.002, 0.004, 0.006, 0.008, 0.01, 0.012, 0.014, 0.016, 0.018000000000000002, 0.02, 0.022, 0.024, 0.026000000000000002, 0.028, 0.032, 0.036000000000000004, 0.04000000000000001, 0.04400000000000001, 0.048000000000000015, 0.05200000000000002, 0.05600000000000002, 0.060000000000000026 ], "xaxis": "x", "y": [ 50, 45.08, 42.889616000000004, 41.75871232972544, 41.13726185792908, 40.78487442199073, 40.58162487692353, 40.46326555167186, 40.39396011908278, 40.35324818521906, 40.32928807558696, 40.31517138668259, 40.306848816432996, 40.301940332632604, 40.29904475860433, 40.295628038299064, 40.295012664612855, 40.29490178216003, 40.294881800952304, 40.294878200252185, 40.294877551388744, 40.29487743446038, 40.294877413389315 ], "yaxis": "y" }, { "hovertemplate": "Chemical=C
SYSTEM TIME=%{x}
concentration=%{y}", "legendgroup": "C", "line": { "color": "green", "dash": "solid" }, "marker": { "symbol": "circle" }, "mode": "lines", "name": "C", "orientation": "v", "showlegend": true, "type": "scatter", "x": [ 0, 0.002, 0.004, 0.006, 0.008, 0.01, 0.012, 0.014, 0.016, 0.018000000000000002, 0.02, 0.022, 0.024, 0.026000000000000002, 0.028, 0.032, 0.036000000000000004, 0.04000000000000001, 0.04400000000000001, 0.048000000000000015, 0.05200000000000002, 0.05600000000000002, 0.060000000000000026 ], "xaxis": "x", "y": [ 20, 24.92, 27.110384, 28.24128767027456, 28.86273814207092, 29.21512557800927, 29.41837512307648, 29.536734448328147, 29.606039880917233, 29.64675181478095, 29.67071192441305, 29.684828613317418, 29.693151183567014, 29.698059667367403, 29.700955241395675, 29.704371961700943, 29.704987335387152, 29.70509821783997, 29.705118199047696, 29.705121799747815, 29.70512244861126, 29.70512256553962, 29.705122586610685 ], "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 <-> C . Changes in concentrations with time" }, "xaxis": { "anchor": "y", "autorange": true, "domain": [ 0, 1 ], "range": [ 0, 0.060000000000000026 ], "title": { "text": "SYSTEM TIME" }, "type": "linear" }, "yaxis": { "anchor": "x", "autorange": true, "domain": [ 0, 1 ], "range": [ -2.466518285866835, 52.76139569925615 ], "title": { "text": "concentration" }, "type": "linear" } } }, "image/png": "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EEDauAYgAAEIQAACEIAABCAAAQgYJoC0GS4OqUEAAhCAAAQgAAEIQAACEEDauAYgAAEIQAACEIAABCAAAQgYJoC0GS4OqUEAAhCAAAQgAAEIQAACEEDauAYgAAEIQAACEIAABCAAAQgYJoC0GS4OqUEAAhCAAAQgAAEIQAACEEDauAYgAAEIQAACEIAABCAAAQgYJoC0GS4OqUEAAhCAAAQgAAEIQAACEEDauAYgAAEIQAACEIAABCAAAQgYJoC0GS4OqUEAAhCAAAQgAAEIQAACEEDauAYgAAEIQAACEIAABCAAAQgYJoC0GS4OqUEAAhCAAAQgAAEIQAACEEDauAYgAAEIQAACEIAABCAAAQgYJoC0GS4OqUEAAhCAAAQgAAEIQAACEEDauAYgAAEIQAACEIAABCAAAQgYJoC0GS4OqUEAAhCAAAQgAAEIQAACEEDauAYgAAEIQAACEIAABCAAAQgYJoC0GS4OqUEAAhCAAAQgAAEIQAACEEDauAYgAAEIQAACEIAABCAAAQgYJoC0GS4OqUEAAhCAAAQgAAEIQAACEEDauAYgAAEIQAACEIAABCAAAQgYJoC0GS4OqUEAAhCAAAQgAAEIQAACEEDauAYgAAEIQAACEIAABCAAAQgYJoC0GS4OqUEAAhCAAAQgAAEIQAACEEDauAYgAAEIQAACEIAABCAAAQgYJoC0GS4OqUEAAhCAAAQgAAEIQAACEEDauAYgAAEIQAACEIAABCAAAQgYJoC0GS4OqUEAAhCAAAQgAAEIQAACEEDauAYgAAEIQAACEIAABCAAAQgYJoC0GS4OqUEAAhCAAAQgAAEIQAACEEDauAYgAAEIQAACEIAABCAAAQgYJoC0GS4OqUEAAhCAAAQgAAEIQAACEEDauAYgAAEIQAACEIAABCAAAQgYJoC0GS4OqUEAAhCAAAQgAAEIQAACEEDauAYgAAEIQAACEIAABCAAAQgYJoC0GS4OqUEAAhCAAAQgAAEIQAACEEDauAYgAAEIQAACEIAABCAAAQgYJoC0GS4OqUEAAhCAAAQgAAEIQAACEEDauAYgAAEIQAACEIAABCAAAQgYJoC0GS4OqUEAAhCAAAQgAAEIQAACEEDauAYgAAEIQAACEIAABCAAAQgYJoC0GS4OqUEAAhCAAAQgAAEIQAACEEDauAYgAAEIQAACEIAABCAA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", "text/html": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "dynamics.plot_curves(colors=['red', 'violet', 'green'])" ] }, { "cell_type": "code", "execution_count": null, "id": "226c1b6e-6838-46f3-aab1-9cb20c409724", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "5c747824-a170-439e-96a5-dd35bc81e08b", "metadata": {}, "source": [ "# Everthing below is just for diagnostic insight \n", "## into the adaptive variable time steps" ] }, { "cell_type": "markdown", "id": "205c421b-e126-48be-aac6-b44899edf2ea", "metadata": {}, "source": [ "## WARNING: The explanations below are based on an older system of using RELATIVE concentration changes, and no longer applicable to the newer approach; it'll be corrected in future versions (COMMENTED OUT FOR NOW)" ] }, { "cell_type": "code", "execution_count": 17, "id": "1af5a2a3-4dc7-49f1-82b8-40e374b9f282", "metadata": {}, "outputs": [], "source": [ "# This approach, from the run data, is only usable with single-reaction runs\n", "#dynamics.examine_run(df=df, time_step=0.004, rel_fast_threshold=1)\n", "# The arguments step MUST match the value used in call to single_compartment_react()" ] }, { "cell_type": "markdown", "id": "7425390e-197f-4aeb-a6b9-d9d2fb9b422e", "metadata": {}, "source": [ "# Take a peek at internal diagnostic data from the reactions" ] }, { "cell_type": "code", "execution_count": 18, "id": "178211ae-e413-40e6-8684-47ad1d6e5e80", "metadata": {}, "outputs": [], "source": [ "# This approach, from internal diagnostic data, \n", "# is more generally applicable also to runs with multiple reactions\n", "#dynamics.diagnose_variable_time_steps()" ] }, { "cell_type": "markdown", "id": "6311059b-af68-4dea-bfb1-d032d817ffd6", "metadata": {}, "source": [ "### The above diagnostics are based on the following diagnostic data:" ] }, { "cell_type": "code", "execution_count": 19, "id": "4e3012c6-c870-411c-bb80-7e1076233ca3", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Reaction: A + B <-> C\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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 BDelta Creactionsubsteptime_subdivisiondelta_timecaption
00.000-4.920000e+00-4.920000e+004.920000e+000020.002
10.002-2.190384e+00-2.190384e+002.190384e+000120.002
20.004-1.130904e+00-1.130904e+001.130904e+000020.002
30.006-6.214505e-01-6.214505e-016.214505e-010120.002
40.008-3.523874e-01-3.523874e-013.523874e-010020.002
50.010-2.032495e-01-2.032495e-012.032495e-010120.002
60.012-1.183593e-01-1.183593e-011.183593e-010020.002
70.014-6.930543e-02-6.930543e-026.930543e-020120.002
80.016-4.071193e-02-4.071193e-024.071193e-020020.002
90.018-2.396011e-02-2.396011e-022.396011e-020120.002
100.020-1.411669e-02-1.411669e-021.411669e-020020.002
110.022-8.322570e-03-8.322570e-038.322570e-030120.002
120.024-4.908484e-03-4.908484e-034.908484e-030020.002
130.026-2.895574e-03-2.895574e-032.895574e-030120.002
140.028-3.416720e-03-3.416720e-033.416720e-030010.004
150.032-6.153737e-04-6.153737e-046.153737e-040010.004
160.036-1.108825e-04-1.108825e-041.108825e-040010.004
170.040-1.998121e-05-1.998121e-051.998121e-050010.004
180.044-3.600700e-06-3.600700e-063.600700e-060010.004
190.048-6.488634e-07-6.488634e-076.488634e-070010.004
200.052-1.169284e-07-1.169284e-071.169284e-070010.004
210.056-2.107106e-08-2.107106e-082.107106e-080010.004
\n", "
" ], "text/plain": [ " TIME Delta A Delta B Delta C reaction substep \\\n", "0 0.000 -4.920000e+00 -4.920000e+00 4.920000e+00 0 0 \n", "1 0.002 -2.190384e+00 -2.190384e+00 2.190384e+00 0 1 \n", "2 0.004 -1.130904e+00 -1.130904e+00 1.130904e+00 0 0 \n", "3 0.006 -6.214505e-01 -6.214505e-01 6.214505e-01 0 1 \n", "4 0.008 -3.523874e-01 -3.523874e-01 3.523874e-01 0 0 \n", "5 0.010 -2.032495e-01 -2.032495e-01 2.032495e-01 0 1 \n", "6 0.012 -1.183593e-01 -1.183593e-01 1.183593e-01 0 0 \n", "7 0.014 -6.930543e-02 -6.930543e-02 6.930543e-02 0 1 \n", "8 0.016 -4.071193e-02 -4.071193e-02 4.071193e-02 0 0 \n", "9 0.018 -2.396011e-02 -2.396011e-02 2.396011e-02 0 1 \n", "10 0.020 -1.411669e-02 -1.411669e-02 1.411669e-02 0 0 \n", "11 0.022 -8.322570e-03 -8.322570e-03 8.322570e-03 0 1 \n", "12 0.024 -4.908484e-03 -4.908484e-03 4.908484e-03 0 0 \n", "13 0.026 -2.895574e-03 -2.895574e-03 2.895574e-03 0 1 \n", "14 0.028 -3.416720e-03 -3.416720e-03 3.416720e-03 0 0 \n", "15 0.032 -6.153737e-04 -6.153737e-04 6.153737e-04 0 0 \n", "16 0.036 -1.108825e-04 -1.108825e-04 1.108825e-04 0 0 \n", "17 0.040 -1.998121e-05 -1.998121e-05 1.998121e-05 0 0 \n", "18 0.044 -3.600700e-06 -3.600700e-06 3.600700e-06 0 0 \n", "19 0.048 -6.488634e-07 -6.488634e-07 6.488634e-07 0 0 \n", "20 0.052 -1.169284e-07 -1.169284e-07 1.169284e-07 0 0 \n", "21 0.056 -2.107106e-08 -2.107106e-08 2.107106e-08 0 0 \n", "\n", " time_subdivision delta_time caption \n", "0 2 0.002 \n", "1 2 0.002 \n", "2 2 0.002 \n", "3 2 0.002 \n", "4 2 0.002 \n", "5 2 0.002 \n", "6 2 0.002 \n", "7 2 0.002 \n", "8 2 0.002 \n", "9 2 0.002 \n", "10 2 0.002 \n", "11 2 0.002 \n", "12 2 0.002 \n", "13 2 0.002 \n", "14 1 0.004 \n", "15 1 0.004 \n", "16 1 0.004 \n", "17 1 0.004 \n", "18 1 0.004 \n", "19 1 0.004 \n", "20 1 0.004 \n", "21 1 0.004 " ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dynamics.get_diagnostic_data(rxn_index=0)" ] }, { "cell_type": "code", "execution_count": null, "id": "f48bc0d4-2ab7-41dc-a80a-c8870dd732bb", "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 }