From 3454c3e0d109bc06ae897861f02d0bd1b44ea981 Mon Sep 17 00:00:00 2001 From: hannahbaumann Date: Fri, 6 Nov 2026 15:56:01 +0100 Subject: [PATCH 1/8] Rename cinnabar title to match howto style --- .../PlottingFreeEnergiesUsingCinnabar.ipynb | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/plotting_rbfes_with_cinnabar/PlottingFreeEnergiesUsingCinnabar.ipynb b/plotting_rbfes_with_cinnabar/PlottingFreeEnergiesUsingCinnabar.ipynb index 955cc0d..1069739 100644 --- a/plotting_rbfes_with_cinnabar/PlottingFreeEnergiesUsingCinnabar.ipynb +++ b/plotting_rbfes_with_cinnabar/PlottingFreeEnergiesUsingCinnabar.ipynb @@ -5,9 +5,14 @@ "id": "ddae61fd-fa15-4be9-9160-ba3e195c67dc", "metadata": {}, "source": [ - "# Plotting OpenFE results against experiment using Cinnabar v0.6.0\n", + "# Plot results against experiment with cinnabar\n", "\n", - "This notebook shows how one would go about creating a ``cinnabar`` style plot of OpenFE results against known experimental values. For more information on the ``cinnabar`` API and the available plot styles, see the [tutorials](https://cinnabar.openfree.energy/en/latest/tutorials/index.html)." + "This guide shows how to plot OpenFE relative free energy results against experimental values with\n", + "[cinnabar](https://github.com/OpenFreeEnergy/cinnabar), and how to derive absolute free energies from them.\n", + "\n", + "It uses the table written by `openfe gather --report ddg` and a table of experimental values.\n", + "For more on the `cinnabar` API and the available plot styles, see the\n", + "[cinnabar tutorials](https://cinnabar.openfree.energy/en/latest/tutorials/index.html)." ] }, { @@ -7309,7 +7314,7 @@ ], "metadata": { "kernelspec": { - "display_name": "openfe_dev", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -7323,7 +7328,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.9" + "version": "3.13.14" } }, "nbformat": 4, From b4f4a3e4533a2400f2893adab1840fc823ed13eb Mon Sep 17 00:00:00 2001 From: hannahbaumann Date: Mon, 9 Nov 2026 11:21:32 +0100 Subject: [PATCH 2/8] Merge cinnabar notebooks --- cookbook/assets/calc_dg.tsv | 11 - cookbook/assets/experimental.tsv | 13 - cookbook/cinnabar_absolute.ipynb | 88 +- .../PlottingFreeEnergiesUsingCinnabar.ipynb | 3164 ++++++++++++++--- plotting_rbfes_with_cinnabar/calc_dg.tsv | 11 + 5 files changed, 2819 insertions(+), 468 deletions(-) delete mode 100644 cookbook/assets/calc_dg.tsv delete mode 100644 cookbook/assets/experimental.tsv create mode 100644 plotting_rbfes_with_cinnabar/calc_dg.tsv diff --git a/cookbook/assets/calc_dg.tsv b/cookbook/assets/calc_dg.tsv deleted file mode 100644 index 669d449..0000000 --- a/cookbook/assets/calc_dg.tsv +++ /dev/null @@ -1,11 +0,0 @@ -ligand DG(MLE) (kcal/mol) uncertainty (kcal/mol) -lig_ejm_31 -0.09 0.05 -lig_ejm_42 0.7 0.1 -lig_ejm_46 -0.98 0.05 -lig_ejm_47 -0.1 0.1 -lig_ejm_48 0.53 0.09 -lig_ejm_50 0.91 0.06 -lig_ejm_43 2.0 0.2 -lig_jmc_23 -0.68 0.09 -lig_jmc_27 -1.1 0.1 -lig_jmc_28 -1.25 0.08 diff --git a/cookbook/assets/experimental.tsv b/cookbook/assets/experimental.tsv deleted file mode 100644 index 2f2e07f..0000000 --- a/cookbook/assets/experimental.tsv +++ /dev/null @@ -1,13 +0,0 @@ -ligand estimate (kcal/mol) uncertainty (kcal/mol) -lig_ejm_42 -9.81 0.18 -lig_ejm_43 -8.29 0.18 -lig_ejm_45 -9.59 0.18 -lig_ejm_46 -11.35 0.17 -lig_ejm_47 -9.73 0.18 -lig_ejm_48 -9.03 0.18 -lig_ejm_50 -9.01 0.18 -lig_ejm_54 -10.57 0.18 -lig_ejm_55 -9.24 0.18 -lig_jmc_23 -11.74 0.18 -lig_jmc_27 -11.31 0.17 -lig_jmc_28 -11.01 0.18 diff --git a/cookbook/cinnabar_absolute.ipynb b/cookbook/cinnabar_absolute.ipynb index f3cdbe2..f782636 100644 --- a/cookbook/cinnabar_absolute.ipynb +++ b/cookbook/cinnabar_absolute.ipynb @@ -11,10 +11,11 @@ ] }, { - "metadata": {}, "cell_type": "code", - "outputs": [], "execution_count": null, + "id": "da7a708265bac6d9", + "metadata": {}, + "outputs": [], "source": [ "# First, we import the required libraries\n", "%matplotlib inline\n", @@ -22,12 +23,12 @@ "import pandas as pd\n", "from cinnabar import FEMap, plotting\n", "from openff.units import unit" - ], - "id": "da7a708265bac6d9" + ] }, { - "metadata": {}, "cell_type": "markdown", + "id": "d3b74ffc20c6622", + "metadata": {}, "source": [ "## Loading experimental data\n", "\n", @@ -38,23 +39,23 @@ "```\n", "ligand estimate (kcal/mol) uncertainty (kcal/mol)\n", "```" - ], - "id": "d3b74ffc20c6622" + ] }, { - "metadata": {}, "cell_type": "code", - "outputs": [], "execution_count": null, + "id": "5b402aa460d39cfb", + "metadata": {}, + "outputs": [], "source": [ "experimental_data = pd.read_csv('assets/experimental.tsv', sep=\"\\t\")\n", "experimental_data" - ], - "id": "5b402aa460d39cfb" + ] }, { - "metadata": {}, "cell_type": "markdown", + "id": "a9d25f4c1758b866", + "metadata": {}, "source": [ "## Loading free energy results\n", "\n", @@ -65,23 +66,23 @@ "
\n", "Note: If there is no experimental binding free energy for a ligand, that ligand's calcuated data will be excluded from the plot.\n", "
" - ], - "id": "a9d25f4c1758b866" + ] }, { - "metadata": {}, "cell_type": "code", - "outputs": [], "execution_count": null, + "id": "1d6fb223da1efe00", + "metadata": {}, + "outputs": [], "source": [ "calculated_data = pd.read_csv('assets/calc_dg.tsv', sep=\"\\t\")\n", "calculated_data" - ], - "id": "1d6fb223da1efe00" + ] }, { - "metadata": {}, "cell_type": "markdown", + "id": "8781f5c4ff6493c1", + "metadata": {}, "source": [ "
\n", "Note: When using results from relative binding afinity calculations, the derived absolute binding afinites will be centered around zero rather than the experimental mean. Thus an offset should be applied to the calculated results before comparing them.\n", @@ -90,14 +91,14 @@ "You can read more about absolute estimators in the [cinnabar guide](https://cinnabar.openfree.energy/en/latest/concepts/estimators.html#centering-of-results)\n", "\n", "Next, we will use the ``cinnabar`` API to gather the experimental and calculated results into a single object:" - ], - "id": "8781f5c4ff6493c1" + ] }, { - "metadata": {}, "cell_type": "code", - "outputs": [], "execution_count": null, + "id": "c3a96a00cabbd790", + "metadata": {}, + "outputs": [], "source": [ "# Create FEMap\n", "fe_map = FEMap()\n", @@ -119,34 +120,40 @@ " uncertainty=row[\"uncertainty (kcal/mol)\"] * unit.kilocalories_per_mole,\n", " source=\"openfe\"\n", " )" - ], - "id": "c3a96a00cabbd790" + ] }, { - "metadata": {}, "cell_type": "markdown", - "source": "We can then check that the absolute measurements were added correctly:", - "id": "883ce05e186f631d" + "id": "883ce05e186f631d", + "metadata": {}, + "source": [ + "We can then check that the absolute measurements were added correctly:" + ] }, { - "metadata": {}, "cell_type": "code", - "outputs": [], "execution_count": null, - "source": "fe_map.get_absolute_dataframe()", - "id": "9f5f9ff2b2628be8" + "id": "9f5f9ff2b2628be8", + "metadata": {}, + "outputs": [], + "source": [ + "fe_map.get_absolute_dataframe()" + ] }, { - "metadata": {}, "cell_type": "markdown", - "source": "Finally, we can use ``cinnabar`` to plot the calculated vs. experimental results with some accuracy and ranking metrics:", - "id": "bf9d8fcff63cc1e7" + "id": "bf9d8fcff63cc1e7", + "metadata": {}, + "source": [ + "Finally, we can use ``cinnabar`` to plot the calculated vs. experimental results with some accuracy and ranking metrics:" + ] }, { - "metadata": {}, "cell_type": "code", - "outputs": [], "execution_count": null, + "id": "641c870dbd8a0021", + "metadata": {}, + "outputs": [], "source": [ "plotting.plot_DGs(\n", " fe_map, \n", @@ -155,8 +162,7 @@ " shift=experimental_data[\"estimate (kcal/mol)\"].mean(), # shift the computed values by the mean of the experimental values to put them on a similar scale\n", " xy_lim=[-15, -5]\n", " )" - ], - "id": "641c870dbd8a0021" + ] }, { "cell_type": "code", @@ -169,7 +175,7 @@ ], "metadata": { "kernelspec": { - "display_name": "openfe_dev", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -183,7 +189,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.9" + "version": "3.13.14" } }, "nbformat": 4, diff --git a/plotting_rbfes_with_cinnabar/PlottingFreeEnergiesUsingCinnabar.ipynb b/plotting_rbfes_with_cinnabar/PlottingFreeEnergiesUsingCinnabar.ipynb index 1069739..59227ce 100644 --- a/plotting_rbfes_with_cinnabar/PlottingFreeEnergiesUsingCinnabar.ipynb +++ b/plotting_rbfes_with_cinnabar/PlottingFreeEnergiesUsingCinnabar.ipynb @@ -7,12 +7,14 @@ "source": [ "# Plot results against experiment with cinnabar\n", "\n", - "This guide shows how to plot OpenFE relative free energy results against experimental values with\n", - "[cinnabar](https://github.com/OpenFreeEnergy/cinnabar), and how to derive absolute free energies from them.\n", + "Here, we show how to plot OpenFE free energy results against experimental values with [cinnabar](https://github.com/OpenFreeEnergy/cinnabar). It covers:\n", "\n", - "It uses the table written by `openfe gather --report ddg` and a table of experimental values.\n", - "For more on the `cinnabar` API and the available plot styles, see the\n", - "[cinnabar tutorials](https://cinnabar.openfree.energy/en/latest/tutorials/index.html)." + "1. relative free energies, from the table written by `openfe gather --report ddg`, and the absolute free energies derived from them, and\n", + "2. absolute free energies, from the table written by `openfe gather --report dg`, `openfe gather-abfe --report dg` or `openfe gather-septop --report dg`.\n", + "\n", + "This notebook requires `cinnabar` 0.6 or later, which is installed with openfe. With older versions, the plotting functions fail with errors such as `'FEMap' object has no attribute 'edges'`.\n", + "\n", + "For more on the `cinnabar` API and the available plot styles, see the [cinnabar tutorials](https://cinnabar.openfree.energy/en/latest/tutorials/index.html)." ] }, { @@ -41,7 +43,7 @@ " \n", " !pip install -q condacolab\n", " import condacolab\n", - " condacolab.install_from_url(\"https://github.com/OpenFreeEnergy/openfe/releases/download/v1.7.0/OpenFEforge-1.7.0-Linux-x86_64.sh\")" + " condacolab.install_from_url(\"https://github.com/OpenFreeEnergy/openfe/releases/download/v1.13.0/OpenFEforge-1.13.0-Linux-x86_64.sh\")" ] }, { @@ -95,7 +97,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 1, "id": "6abcaae7-f5fd-483c-972f-5bb5b6d4908a", "metadata": {}, "outputs": [], @@ -110,7 +112,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 2, "id": "8b80f592-f1a3-4c7f-8757-58a88c2e8ee7", "metadata": {}, "outputs": [ @@ -240,7 +242,7 @@ "12 lig_jmc_28 -11.01 0.18" ] }, - "execution_count": 4, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -256,7 +258,9 @@ "id": "aca5ede7-3741-4cc1-97ba-9115d90abd96", "metadata": {}, "source": [ - "## Loading free energy results\n", + "## Plotting relative free energy results\n", + "\n", + "### Loading the results\n", "\n", "Next we load in results from the TSV file created by running `openfe gather --report ddg` on a network of results from [relative binding free energy calculations](https://docs.openfree.energy/en/latest/guide/protocols/relativehybridtopology.html#overview).\n", "\n", @@ -265,7 +269,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 3, "id": "63a920b3-6ef3-4214-b3cc-433319053721", "metadata": {}, "outputs": [ @@ -377,7 +381,7 @@ "8 lig_ejm_46 lig_jmc_28 -0.12 0.04" ] }, - "execution_count": 5, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -393,7 +397,7 @@ "id": "a1daf9cf-5107-4564-a200-b9fe670837cb", "metadata": {}, "source": [ - "## Creating a Cinnabar ``FEMap``\n", + "### Creating a Cinnabar ``FEMap``\n", "\n", "Next we will use the ``cinnabar`` API to gather the experimental and calculated results into a single object which we can use to plot and analyse the network of results.\n", "\n", @@ -402,7 +406,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 4, "id": "16d98240-62b3-469c-a12a-c2b8337caba9", "metadata": {}, "outputs": [], @@ -443,14 +447,14 @@ "id": "7dea03c7-6b6a-4e59-96e7-a94cdc9047e9", "metadata": {}, "source": [ - "## Plotting the results using Cinnabar\n", + "### Plotting the results using Cinnabar\n", "\n", "Once we've created the ``FEMap`` we can inspect the alchemical network:" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 5, "id": "86c004bc-bc58-4a55-92e2-151beb994d65", "metadata": {}, "outputs": [ @@ -465,11 +469,11 @@ " \n", " \n", " \n", - " 2026-06-11T16:46:07.194312\n", + " 2026-11-09T11:10:30.069144\n", " image/svg+xml\n", " \n", " \n", - " Matplotlib v3.10.6, https://matplotlib.org/\n", + " Matplotlib v3.10.9, https://matplotlib.org/\n", " \n", " \n", " \n", @@ -491,96 +495,96 @@ " \n", " \n", + "\" clip-path=\"url(#pe98b7d9fe8)\" style=\"fill: none; stroke: #808080; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#pe98b7d9fe8)\" style=\"fill: #808080; stroke: #808080; stroke-linecap: round\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pe98b7d9fe8)\" style=\"fill: none; stroke: #808080; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#pe98b7d9fe8)\" style=\"fill: #808080; stroke: #808080; stroke-linecap: round\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pe98b7d9fe8)\" style=\"fill: none; stroke: #808080; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#pe98b7d9fe8)\" style=\"fill: #808080; stroke: #808080; stroke-linecap: round\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pe98b7d9fe8)\" style=\"fill: none; stroke: #808080; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#pe98b7d9fe8)\" style=\"fill: #808080; stroke: #808080; stroke-linecap: round\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pe98b7d9fe8)\" style=\"fill: none; stroke: #808080; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#pe98b7d9fe8)\" style=\"fill: #808080; stroke: #808080; stroke-linecap: round\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pe98b7d9fe8)\" style=\"fill: none; stroke: #808080; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#pe98b7d9fe8)\" style=\"fill: #808080; stroke: #808080; stroke-linecap: round\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pe98b7d9fe8)\" style=\"fill: none; stroke: #808080; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#pe98b7d9fe8)\" style=\"fill: #808080; stroke: #808080; stroke-linecap: round\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pe98b7d9fe8)\" style=\"fill: none; stroke: #808080; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#pe98b7d9fe8)\" style=\"fill: #808080; stroke: #808080; stroke-linecap: round\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pe98b7d9fe8)\" style=\"fill: none; stroke: #808080; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#pe98b7d9fe8)\" style=\"fill: #808080; stroke: #808080; stroke-linecap: round\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -806,7 +810,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -868,7 +872,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -917,7 +921,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -946,7 +950,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1004,7 +1008,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1069,7 +1073,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1086,7 +1090,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1126,7 +1130,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1143,7 +1147,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1429,7 +1433,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1459,7 +1463,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 6, "id": "2edeabb9-9c07-49be-a83f-9622ef742046", "metadata": {}, "outputs": [ @@ -1474,11 +1478,11 @@ " \n", " \n", " \n", - " 2026-06-11T16:46:07.934913\n", + " 2026-11-09T11:10:31.704002\n", " image/svg+xml\n", " \n", " \n", - " Matplotlib v3.10.6, https://matplotlib.org/\n", + " Matplotlib v3.10.9, https://matplotlib.org/\n", " \n", " \n", " \n", @@ -1507,7 +1511,7 @@ " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2b4c4d7bff)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p2b4c4d7bff)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p2b4c4d7bff)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p2b4c4d7bff)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p2b4c4d7bff)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p2b4c4d7bff)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p2b4c4d7bff)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p2b4c4d7bff)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p2b4c4d7bff)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2b4c4d7bff)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p2b4c4d7bff)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p2b4c4d7bff)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p2b4c4d7bff)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p2b4c4d7bff)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p2b4c4d7bff)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p2b4c4d7bff)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p2b4c4d7bff)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p2b4c4d7bff)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2b4c4d7bff)\" style=\"fill: none\"/>\n", " \n", " \n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1661,7 +1665,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1691,7 +1695,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1727,7 +1731,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1740,7 +1744,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2131,12 +2135,12 @@ " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2161,7 +2165,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2204,7 +2208,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2220,7 +2224,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2236,7 +2240,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2251,7 +2255,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2266,7 +2270,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2281,7 +2285,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2296,7 +2300,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2414,21 +2418,21 @@ " \n", " \n", + "\" clip-path=\"url(#p2b4c4d7bff)\" style=\"fill: none; stroke: #808080; stroke-width: 1.5; stroke-linecap: square\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2b4c4d7bff)\" style=\"fill: none; stroke: #808080; stroke-width: 1.5; stroke-linecap: square\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p2b4c4d7bff)\" style=\"fill: none; stroke-dasharray: 1.5,2.475; stroke-dashoffset: 0; stroke: #000000; stroke-width: 1.5\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -2489,7 +2493,7 @@ "\" style=\"fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square\"/>\n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2523,7 +2527,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2636,7 +2640,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3102,7 +3120,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3137,7 +3155,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "id": "f39ef3c0-4d74-4c53-83bc-94d820428d47", "metadata": {}, "outputs": [ @@ -3152,11 +3170,11 @@ " \n", " \n", " \n", - " 2026-06-11T16:46:09.054363\n", + " 2026-11-09T11:10:39.985310\n", " image/svg+xml\n", " \n", " \n", - " Matplotlib v3.10.6, https://matplotlib.org/\n", + " Matplotlib v3.10.9, https://matplotlib.org/\n", " \n", " \n", " \n", @@ -3185,7 +3203,7 @@ " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa696ef3a74)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pa696ef3a74)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pa696ef3a74)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pa696ef3a74)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pa696ef3a74)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pa696ef3a74)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pa696ef3a74)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pa696ef3a74)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pa696ef3a74)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pa696ef3a74)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa696ef3a74)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pa696ef3a74)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pa696ef3a74)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pa696ef3a74)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pa696ef3a74)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pa696ef3a74)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pa696ef3a74)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pa696ef3a74)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pa696ef3a74)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pa696ef3a74)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pa696ef3a74)\" style=\"fill: none\"/>\n", " \n", " \n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3346,7 +3364,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3376,7 +3394,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3412,7 +3430,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3425,7 +3443,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3815,12 +3833,12 @@ " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3845,7 +3863,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3888,7 +3906,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3904,7 +3922,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3920,7 +3938,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3935,7 +3953,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3950,7 +3968,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3965,7 +3983,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3980,7 +3998,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4097,11 +4115,11 @@ " \n", " \n", + "\" clip-path=\"url(#pa696ef3a74)\" style=\"fill: none; stroke-dasharray: 1.5,2.475; stroke-dashoffset: 0; stroke: #000000; stroke-width: 1.5\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -4165,7 +4183,7 @@ "\" style=\"fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square\"/>\n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4199,7 +4217,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4328,7 +4346,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4697,7 +4715,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", @@ -4828,7 +4848,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4926,7 +4946,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4960,7 +4980,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 9, "id": "7fed7b2c-076f-4f98-818d-abdbdaf3121b", "metadata": {}, "outputs": [ @@ -4975,11 +4995,11 @@ " \n", " \n", " \n", - " 2026-06-11T16:46:10.193190\n", + " 2026-11-09T11:10:42.660815\n", " image/svg+xml\n", " \n", " \n", - " Matplotlib v3.10.6, https://matplotlib.org/\n", + " Matplotlib v3.10.9, https://matplotlib.org/\n", " \n", " \n", " \n", @@ -5008,7 +5028,7 @@ " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46f696b631)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p46f696b631)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p46f696b631)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p46f696b631)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p46f696b631)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p46f696b631)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p46f696b631)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p46f696b631)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p46f696b631)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p46f696b631)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46f696b631)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p46f696b631)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p46f696b631)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p46f696b631)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p46f696b631)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p46f696b631)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p46f696b631)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p46f696b631)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p46f696b631)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p46f696b631)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p46f696b631)\" style=\"fill: none\"/>\n", " \n", " \n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5184,7 +5204,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5199,7 +5219,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5237,7 +5257,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5283,7 +5303,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5715,12 +5735,12 @@ " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5746,7 +5766,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5790,7 +5810,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5807,7 +5827,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5824,7 +5844,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5841,7 +5861,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5857,7 +5877,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5873,7 +5893,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5889,7 +5909,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -6007,11 +6027,11 @@ " \n", " \n", + "\" clip-path=\"url(#p46f696b631)\" style=\"fill: none; stroke-dasharray: 1.5,2.475; stroke-dashoffset: 0; stroke: #000000; stroke-width: 1.5\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -6075,7 +6095,7 @@ "\" style=\"fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square\"/>\n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -6109,7 +6129,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -6238,7 +6258,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -6607,7 +6627,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -6730,17 +6748,17 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -6838,7 +6856,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -6868,14 +6886,14 @@ "id": "0c1b5935-d11b-4c1b-b092-038b007323ce", "metadata": {}, "source": [ - "## Writing out the MLE derived absolute free energies\n", + "### Writing out the MLE derived absolute free energies\n", "\n", "Finally, we can also extract the MLE derived absolute free energies along with the experimental results into a pandas ``DataFrame``." ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 10, "id": "26b09073-f05f-401c-a10f-95c6c957f4da", "metadata": {}, "outputs": [ @@ -7148,7 +7166,7 @@ "22 True " ] }, - "execution_count": 11, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -7170,7 +7188,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 11, "id": "8069c254", "metadata": {}, "outputs": [ @@ -7301,7 +7319,7 @@ "9 lig_jmc_28 -0.809 0.079335 MLE True" ] }, - "execution_count": 12, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -7310,6 +7328,2346 @@ "mle_df = abs_df[abs_df[\"source\"] == \"MLE\"].reset_index(drop=True)\n", "mle_df" ] + }, + { + "cell_type": "markdown", + "id": "cfca38eb-4928-4f13-9a22-9676c21b28f6", + "metadata": {}, + "source": [ + "## Plotting absolute free energy results\n", + "\n", + "Absolute free energies can also be plotted directly from a table of free energies per ligand. This table can be written by:\n", + "\n", + "* `openfe gather --report dg`, which derives the absolute free energies from a network of relative free energy calculations using the MLE estimator, or\n", + "* `openfe gather-abfe --report dg` or `openfe gather-septop --report dg`, for results from the [Absolute Binding](https://docs.openfree.energy/en/latest/guide/protocols/absolutebinding.html) or [Separated Topologies](https://docs.openfree.energy/en/latest/guide/protocols/septop.html) Protocols.\n", + "\n", + "Here we load the results of `openfe gather --report dg` for a network of relative binding free energy calculations. The free energy column is called `DG(MLE) (kcal/mol)` in this report, and `DG (kcal/mol)` in the `gather-abfe` and `gather-septop` reports.\n", + "\n", + "
\n", + "Note: If there is no experimental binding free energy for a ligand, that ligand's calculated data will be excluded from the plot.\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "4638d997-5252-465c-bd40-aa368c68acd3", + "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", + "
ligandDG(MLE) (kcal/mol)uncertainty (kcal/mol)
0lig_ejm_31-0.090.05
1lig_ejm_420.700.10
2lig_ejm_46-0.980.05
3lig_ejm_47-0.100.10
4lig_ejm_480.530.09
5lig_ejm_500.910.06
6lig_ejm_432.000.20
7lig_jmc_23-0.680.09
8lig_jmc_27-1.100.10
9lig_jmc_28-1.250.08
\n", + "
" + ], + "text/plain": [ + " ligand DG(MLE) (kcal/mol) uncertainty (kcal/mol)\n", + "0 lig_ejm_31 -0.09 0.05\n", + "1 lig_ejm_42 0.70 0.10\n", + "2 lig_ejm_46 -0.98 0.05\n", + "3 lig_ejm_47 -0.10 0.10\n", + "4 lig_ejm_48 0.53 0.09\n", + "5 lig_ejm_50 0.91 0.06\n", + "6 lig_ejm_43 2.00 0.20\n", + "7 lig_jmc_23 -0.68 0.09\n", + "8 lig_jmc_27 -1.10 0.10\n", + "9 lig_jmc_28 -1.25 0.08" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "calculated_dg_data = pd.read_csv('calc_dg.tsv', sep=\"\\t\")\n", + "calculated_dg_data" + ] + }, + { + "cell_type": "markdown", + "id": "c2774fc9-2874-4483-9d72-f402f65eb66b", + "metadata": {}, + "source": [ + "Next, we gather the experimental and calculated results into a new ``FEMap``:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "6cdb7f24-8f9b-424a-ab29-3c4634c63e19", + "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", + "
labelDG (kcal/mol)uncertainty (kcal/mol)sourcecomputational
0lig_ejm_31-9.570.18ExperimentalFalse
1lig_ejm_42-9.810.18ExperimentalFalse
2lig_ejm_43-8.290.18ExperimentalFalse
3lig_ejm_45-9.590.18ExperimentalFalse
4lig_ejm_46-11.350.17ExperimentalFalse
5lig_ejm_47-9.730.18ExperimentalFalse
6lig_ejm_48-9.030.18ExperimentalFalse
7lig_ejm_50-9.010.18ExperimentalFalse
8lig_ejm_54-10.570.18ExperimentalFalse
9lig_ejm_55-9.240.18ExperimentalFalse
10lig_jmc_23-11.740.18ExperimentalFalse
11lig_jmc_27-11.310.17ExperimentalFalse
12lig_jmc_28-11.010.18ExperimentalFalse
13lig_ejm_31-0.090.05openfeTrue
14lig_ejm_420.700.10openfeTrue
15lig_ejm_432.000.20openfeTrue
16lig_ejm_46-0.980.05openfeTrue
17lig_ejm_47-0.100.10openfeTrue
18lig_ejm_480.530.09openfeTrue
19lig_ejm_500.910.06openfeTrue
20lig_jmc_23-0.680.09openfeTrue
21lig_jmc_27-1.100.10openfeTrue
22lig_jmc_28-1.250.08openfeTrue
\n", + "
" + ], + "text/plain": [ + " label DG (kcal/mol) uncertainty (kcal/mol) source \\\n", + "0 lig_ejm_31 -9.57 0.18 Experimental \n", + "1 lig_ejm_42 -9.81 0.18 Experimental \n", + "2 lig_ejm_43 -8.29 0.18 Experimental \n", + "3 lig_ejm_45 -9.59 0.18 Experimental \n", + "4 lig_ejm_46 -11.35 0.17 Experimental \n", + "5 lig_ejm_47 -9.73 0.18 Experimental \n", + "6 lig_ejm_48 -9.03 0.18 Experimental \n", + "7 lig_ejm_50 -9.01 0.18 Experimental \n", + "8 lig_ejm_54 -10.57 0.18 Experimental \n", + "9 lig_ejm_55 -9.24 0.18 Experimental \n", + "10 lig_jmc_23 -11.74 0.18 Experimental \n", + "11 lig_jmc_27 -11.31 0.17 Experimental \n", + "12 lig_jmc_28 -11.01 0.18 Experimental \n", + "13 lig_ejm_31 -0.09 0.05 openfe \n", + "14 lig_ejm_42 0.70 0.10 openfe \n", + "15 lig_ejm_43 2.00 0.20 openfe \n", + "16 lig_ejm_46 -0.98 0.05 openfe \n", + "17 lig_ejm_47 -0.10 0.10 openfe \n", + "18 lig_ejm_48 0.53 0.09 openfe \n", + "19 lig_ejm_50 0.91 0.06 openfe \n", + "20 lig_jmc_23 -0.68 0.09 openfe \n", + "21 lig_jmc_27 -1.10 0.10 openfe \n", + "22 lig_jmc_28 -1.25 0.08 openfe \n", + "\n", + " computational \n", + "0 False \n", + "1 False \n", + "2 False \n", + "3 False \n", + "4 False \n", + "5 False \n", + "6 False \n", + "7 False \n", + "8 False \n", + "9 False \n", + "10 False \n", + "11 False \n", + "12 False \n", + "13 True \n", + "14 True \n", + "15 True \n", + "16 True \n", + "17 True \n", + "18 True \n", + "19 True \n", + "20 True \n", + "21 True \n", + "22 True " + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dg_fe_map = FEMap()\n", + "\n", + "# add the experimental data\n", + "for _, row in experimental_data.iterrows():\n", + " dg_fe_map.add_experimental_measurement(\n", + " label=row['ligand'],\n", + " value=row['estimate (kcal/mol)'] * unit.kilocalories_per_mole,\n", + " uncertainty=row['uncertainty (kcal/mol)'] * unit.kilocalories_per_mole,\n", + " source=\"Experimental\",\n", + " )\n", + "\n", + "# add the calculated data\n", + "for _, row in calculated_dg_data.iterrows():\n", + " dg_fe_map.add_absolute_calculation(\n", + " label=row['ligand'],\n", + " # use row[\"DG (kcal/mol)\"] for gather-abfe and gather-septop reports\n", + " value=row[\"DG(MLE) (kcal/mol)\"] * unit.kilocalories_per_mole,\n", + " uncertainty=row[\"uncertainty (kcal/mol)\"] * unit.kilocalories_per_mole,\n", + " source=\"openfe\",\n", + " )\n", + "\n", + "dg_fe_map.get_absolute_dataframe()" + ] + }, + { + "cell_type": "markdown", + "id": "a9c61065-a716-47be-9da2-3c2d25e44401", + "metadata": {}, + "source": [ + "
\n", + "Note: Absolute free energies derived from relative binding free energy calculations are centred around zero rather than the experimental mean, so we shift them by the mean of the experimental values before comparing them. Results from absolute binding free energy calculations do not need this shift.\n", + "
\n", + "\n", + "You can read more about this in the [cinnabar guide](https://cinnabar.openfree.energy/en/latest/concepts/estimators.html#centering-of-results).\n", + "\n", + "Finally, we plot the calculated against the experimental results, with some accuracy and ranking metrics:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "95eaa8f8-deb0-4671-86fd-b094598cb8ae", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2026-11-09T11:12:19.333995\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.10.9, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plotting.plot_DGs(\n", + " dg_fe_map,\n", + " source=\"openfe\", # the name of the computational source to plot\n", + " figsize=5,\n", + " shift=experimental_data[\"estimate (kcal/mol)\"].mean(), # leave out for ABFE results\n", + " xy_lim=[-15, -5],\n", + ")" + ] } ], "metadata": { diff --git a/plotting_rbfes_with_cinnabar/calc_dg.tsv b/plotting_rbfes_with_cinnabar/calc_dg.tsv new file mode 100644 index 0000000..ba1e75f --- /dev/null +++ b/plotting_rbfes_with_cinnabar/calc_dg.tsv @@ -0,0 +1,11 @@ +ligand DG(MLE) (kcal/mol) uncertainty (kcal/mol) +lig_ejm_31 -0.09 0.05 +lig_ejm_42 0.7 0.1 +lig_ejm_46 -0.98 0.05 +lig_ejm_47 -0.1 0.1 +lig_ejm_48 0.53 0.09 +lig_ejm_50 0.91 0.06 +lig_ejm_43 2.0 0.2 +lig_jmc_23 -0.68 0.09 +lig_jmc_27 -1.1 0.1 +lig_jmc_28 -1.25 0.08 From 6503f2d025cfdc04965156958f7c7f5d169fe033 Mon Sep 17 00:00:00 2001 From: hannahbaumann Date: Mon, 9 Nov 2026 11:22:22 +0100 Subject: [PATCH 3/8] Remove absolute notebook --- cookbook/cinnabar_absolute.ipynb | 197 ------------------------------- 1 file changed, 197 deletions(-) delete mode 100644 cookbook/cinnabar_absolute.ipynb diff --git a/cookbook/cinnabar_absolute.ipynb b/cookbook/cinnabar_absolute.ipynb deleted file mode 100644 index f782636..0000000 --- a/cookbook/cinnabar_absolute.ipynb +++ /dev/null @@ -1,197 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "ddae61fd-fa15-4be9-9160-ba3e195c67dc", - "metadata": {}, - "source": [ - "# Plotting OpenFE DG results against experiment using Cinnabar v0.6.0\n", - "\n", - "This notebook shows how one would go about creating a ``cinnabar`` style plot of OpenFE results against known experimental values. For more information on using the ``cinnabar`` API please see the [tutorials](https://cinnabar.openfree.energy/en/latest/tutorials/index.html)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "da7a708265bac6d9", - "metadata": {}, - "outputs": [], - "source": [ - "# First, we import the required libraries\n", - "%matplotlib inline\n", - "%config InlineBackend.figure_formats = ['svg']\n", - "import pandas as pd\n", - "from cinnabar import FEMap, plotting\n", - "from openff.units import unit" - ] - }, - { - "cell_type": "markdown", - "id": "d3b74ffc20c6622", - "metadata": {}, - "source": [ - "## Loading experimental data\n", - "\n", - "First, we load the experimental data from a tab-separated values (TSV) file\n", - "\n", - "The format of the TSV file is as follows:\n", - "\n", - "```\n", - "ligand estimate (kcal/mol) uncertainty (kcal/mol)\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5b402aa460d39cfb", - "metadata": {}, - "outputs": [], - "source": [ - "experimental_data = pd.read_csv('assets/experimental.tsv', sep=\"\\t\")\n", - "experimental_data" - ] - }, - { - "cell_type": "markdown", - "id": "a9d25f4c1758b866", - "metadata": {}, - "source": [ - "## Loading free energy results\n", - "\n", - "Next we load in results from the TSV file created by running `openfe gather --report dg` on a network of results from [relative binding free energy calculations](https://docs.openfree.energy/en/latest/guide/protocols/relativehybridtopology.html#overview). [Absolute binding free energy estimates](https://docs.openfree.energy/en/latest/guide/protocols/absolutebinding.html) can also be used here, a report in the same format can be generated by running `openfe gather-abfe --report dg`.\n", - "\n", - "Please see the following tutorial for more information on how to run the gather command: https://github.com/OpenFreeEnergy/ExampleNotebooks/blob/main/rbfe_tutorial/cli_tutorial.md\n", - "\n", - "
\n", - "Note: If there is no experimental binding free energy for a ligand, that ligand's calcuated data will be excluded from the plot.\n", - "
" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1d6fb223da1efe00", - "metadata": {}, - "outputs": [], - "source": [ - "calculated_data = pd.read_csv('assets/calc_dg.tsv', sep=\"\\t\")\n", - "calculated_data" - ] - }, - { - "cell_type": "markdown", - "id": "8781f5c4ff6493c1", - "metadata": {}, - "source": [ - "
\n", - "Note: When using results from relative binding afinity calculations, the derived absolute binding afinites will be centered around zero rather than the experimental mean. Thus an offset should be applied to the calculated results before comparing them.\n", - "
\n", - "\n", - "You can read more about absolute estimators in the [cinnabar guide](https://cinnabar.openfree.energy/en/latest/concepts/estimators.html#centering-of-results)\n", - "\n", - "Next, we will use the ``cinnabar`` API to gather the experimental and calculated results into a single object:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c3a96a00cabbd790", - "metadata": {}, - "outputs": [], - "source": [ - "# Create FEMap\n", - "fe_map = FEMap()\n", - "\n", - "# add the experimental data\n", - "for index, row in experimental_data.iterrows():\n", - " fe_map.add_experimental_measurement(\n", - " label=row['ligand'],\n", - " value=row['estimate (kcal/mol)'] * unit.kilocalories_per_mole,\n", - " uncertainty=row['uncertainty (kcal/mol)'] * unit.kilocalories_per_mole,\n", - " source=\"Experimental\"\n", - " )\n", - "\n", - "# add the computed data\n", - "for index, row in calculated_data.iterrows():\n", - " fe_map.add_absolute_calculation(\n", - " label=row['ligand'],\n", - " value=row[\"DG(MLE) (kcal/mol)\"] * unit.kilocalories_per_mole,\n", - " uncertainty=row[\"uncertainty (kcal/mol)\"] * unit.kilocalories_per_mole,\n", - " source=\"openfe\"\n", - " )" - ] - }, - { - "cell_type": "markdown", - "id": "883ce05e186f631d", - "metadata": {}, - "source": [ - "We can then check that the absolute measurements were added correctly:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9f5f9ff2b2628be8", - "metadata": {}, - "outputs": [], - "source": [ - "fe_map.get_absolute_dataframe()" - ] - }, - { - "cell_type": "markdown", - "id": "bf9d8fcff63cc1e7", - "metadata": {}, - "source": [ - "Finally, we can use ``cinnabar`` to plot the calculated vs. experimental results with some accuracy and ranking metrics:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "641c870dbd8a0021", - "metadata": {}, - "outputs": [], - "source": [ - "plotting.plot_DGs(\n", - " fe_map, \n", - " source=\"openfe\", # the name of the computational source to plot\n", - " figsize=5, \n", - " shift=experimental_data[\"estimate (kcal/mol)\"].mean(), # shift the computed values by the mean of the experimental values to put them on a similar scale\n", - " xy_lim=[-15, -5]\n", - " )" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b7a7fa721a373142", - "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.13.14" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} From 378080ee6a66d4cc5d5f9217e0e87fd37ef16dcd Mon Sep 17 00:00:00 2001 From: hannahbaumann Date: Mon, 9 Nov 2026 11:44:17 +0100 Subject: [PATCH 4/8] Update results file --- .../PlottingFreeEnergiesUsingCinnabar.ipynb | 884 +++++++++--------- plotting_rbfes_with_cinnabar/calc_dg.tsv | 22 +- 2 files changed, 446 insertions(+), 460 deletions(-) diff --git a/plotting_rbfes_with_cinnabar/PlottingFreeEnergiesUsingCinnabar.ipynb b/plotting_rbfes_with_cinnabar/PlottingFreeEnergiesUsingCinnabar.ipynb index 59227ce..3c5fb51 100644 --- a/plotting_rbfes_with_cinnabar/PlottingFreeEnergiesUsingCinnabar.ipynb +++ b/plotting_rbfes_with_cinnabar/PlottingFreeEnergiesUsingCinnabar.ipynb @@ -469,7 +469,7 @@ " \n", " \n", " \n", - " 2026-11-09T11:10:30.069144\n", + " 2026-11-09T11:42:01.429293\n", " image/svg+xml\n", " \n", " \n", @@ -495,96 +495,96 @@ " \n", " \n", + "\" clip-path=\"url(#pd05abd198b)\" style=\"fill: none; stroke: #808080; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#pd05abd198b)\" style=\"fill: #808080; stroke: #808080; stroke-linecap: round\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd05abd198b)\" style=\"fill: none; stroke: #808080; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#pd05abd198b)\" style=\"fill: #808080; stroke: #808080; stroke-linecap: round\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd05abd198b)\" style=\"fill: none; stroke: #808080; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#pd05abd198b)\" style=\"fill: #808080; stroke: #808080; stroke-linecap: round\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd05abd198b)\" style=\"fill: none; stroke: #808080; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#pd05abd198b)\" style=\"fill: #808080; stroke: #808080; stroke-linecap: round\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd05abd198b)\" style=\"fill: none; stroke: #808080; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#pd05abd198b)\" style=\"fill: #808080; stroke: #808080; stroke-linecap: round\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd05abd198b)\" style=\"fill: none; stroke: #808080; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#pd05abd198b)\" style=\"fill: #808080; stroke: #808080; stroke-linecap: round\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd05abd198b)\" style=\"fill: none; stroke: #808080; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#pd05abd198b)\" style=\"fill: #808080; stroke: #808080; stroke-linecap: round\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd05abd198b)\" style=\"fill: none; stroke: #808080; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#pd05abd198b)\" style=\"fill: #808080; stroke: #808080; stroke-linecap: round\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pd05abd198b)\" style=\"fill: none; stroke: #808080; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#pd05abd198b)\" style=\"fill: #808080; stroke: #808080; stroke-linecap: round\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -810,7 +810,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -872,7 +872,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -921,7 +921,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -950,7 +950,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1008,7 +1008,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1073,7 +1073,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1090,7 +1090,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1130,7 +1130,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1147,7 +1147,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1433,7 +1433,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1478,7 +1478,7 @@ " \n", " \n", " \n", - " 2026-11-09T11:10:31.704002\n", + " 2026-11-09T11:42:03.019967\n", " image/svg+xml\n", " \n", " \n", @@ -1511,7 +1511,7 @@ " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9b8f96b460)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p9b8f96b460)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p9b8f96b460)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p9b8f96b460)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p9b8f96b460)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p9b8f96b460)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p9b8f96b460)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p9b8f96b460)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p9b8f96b460)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9b8f96b460)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p9b8f96b460)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p9b8f96b460)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p9b8f96b460)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p9b8f96b460)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p9b8f96b460)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p9b8f96b460)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p9b8f96b460)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p9b8f96b460)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9b8f96b460)\" style=\"fill: none\"/>\n", " \n", " \n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1665,7 +1665,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1695,7 +1695,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1731,7 +1731,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1744,7 +1744,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2135,12 +2135,12 @@ " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2165,7 +2165,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2208,7 +2208,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2224,7 +2224,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2240,7 +2240,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2255,7 +2255,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2270,7 +2270,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2285,7 +2285,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2300,7 +2300,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2418,21 +2418,21 @@ " \n", " \n", + "\" clip-path=\"url(#p9b8f96b460)\" style=\"fill: none; stroke: #808080; stroke-width: 1.5; stroke-linecap: square\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9b8f96b460)\" style=\"fill: none; stroke: #808080; stroke-width: 1.5; stroke-linecap: square\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9b8f96b460)\" style=\"fill: none; stroke-dasharray: 1.5,2.475; stroke-dashoffset: 0; stroke: #000000; stroke-width: 1.5\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -2493,7 +2493,7 @@ "\" style=\"fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square\"/>\n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2527,7 +2527,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2640,7 +2640,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", + " \n", " \n", - " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3120,7 +3106,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3155,7 +3141,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "id": "f39ef3c0-4d74-4c53-83bc-94d820428d47", "metadata": {}, "outputs": [ @@ -3170,7 +3156,7 @@ " \n", " \n", " \n", - " 2026-11-09T11:10:39.985310\n", + " 2026-11-09T11:42:04.363090\n", " image/svg+xml\n", " \n", " \n", @@ -3203,7 +3189,7 @@ " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", + "\" clip-path=\"url(#p01399889a7)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p01399889a7)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p01399889a7)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p01399889a7)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p01399889a7)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p01399889a7)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p01399889a7)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p01399889a7)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p01399889a7)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p01399889a7)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p01399889a7)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p01399889a7)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p01399889a7)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p01399889a7)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p01399889a7)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p01399889a7)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p01399889a7)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p01399889a7)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p01399889a7)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p01399889a7)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p01399889a7)\" style=\"fill: none\"/>\n", " \n", " \n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3364,7 +3350,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3394,7 +3380,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3430,7 +3416,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3443,7 +3429,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3833,12 +3819,12 @@ " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3863,7 +3849,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3906,7 +3892,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3922,7 +3908,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3938,7 +3924,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3953,7 +3939,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3968,7 +3954,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3983,7 +3969,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3998,7 +3984,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4115,11 +4101,11 @@ " \n", " \n", + "\" clip-path=\"url(#p01399889a7)\" style=\"fill: none; stroke-dasharray: 1.5,2.475; stroke-dashoffset: 0; stroke: #000000; stroke-width: 1.5\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -4183,7 +4169,7 @@ "\" style=\"fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square\"/>\n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4217,7 +4203,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4715,7 +4701,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -4946,7 +4930,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4980,7 +4964,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "id": "7fed7b2c-076f-4f98-818d-abdbdaf3121b", "metadata": {}, "outputs": [ @@ -4995,7 +4979,7 @@ " \n", " \n", " \n", - " 2026-11-09T11:10:42.660815\n", + " 2026-11-09T11:42:05.928634\n", " image/svg+xml\n", " \n", " \n", @@ -5028,7 +5012,7 @@ " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", + "\" clip-path=\"url(#pcb7f0aaaf7)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pcb7f0aaaf7)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pcb7f0aaaf7)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pcb7f0aaaf7)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pcb7f0aaaf7)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pcb7f0aaaf7)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pcb7f0aaaf7)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pcb7f0aaaf7)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pcb7f0aaaf7)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pcb7f0aaaf7)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pcb7f0aaaf7)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pcb7f0aaaf7)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pcb7f0aaaf7)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pcb7f0aaaf7)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pcb7f0aaaf7)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pcb7f0aaaf7)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pcb7f0aaaf7)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pcb7f0aaaf7)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pcb7f0aaaf7)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pcb7f0aaaf7)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pcb7f0aaaf7)\" style=\"fill: none\"/>\n", " \n", " \n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5204,7 +5188,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5219,7 +5203,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5257,7 +5241,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5303,7 +5287,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5735,12 +5719,12 @@ " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5766,7 +5750,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5810,7 +5794,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5827,7 +5811,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5844,7 +5828,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5861,7 +5845,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5877,7 +5861,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5893,7 +5877,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5909,7 +5893,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -6027,11 +6011,11 @@ " \n", " \n", + "\" clip-path=\"url(#pcb7f0aaaf7)\" style=\"fill: none; stroke-dasharray: 1.5,2.475; stroke-dashoffset: 0; stroke: #000000; stroke-width: 1.5\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -6095,7 +6079,7 @@ "\" style=\"fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square\"/>\n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -6129,7 +6113,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -6258,7 +6242,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", + " \n", " \n", - " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -6627,7 +6611,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", @@ -6748,7 +6734,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -6856,7 +6842,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -6893,7 +6879,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 9, "id": "26b09073-f05f-401c-a10f-95c6c957f4da", "metadata": {}, "outputs": [ @@ -7166,7 +7152,7 @@ "22 True " ] }, - "execution_count": 10, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -7188,7 +7174,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 10, "id": "8069c254", "metadata": {}, "outputs": [ @@ -7319,7 +7305,7 @@ "9 lig_jmc_28 -0.809 0.079335 MLE True" ] }, - "execution_count": 11, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -7813,7 +7799,7 @@ " \n", " \n", " \n", - " 2026-11-09T11:12:19.333995\n", + " 2026-11-09T11:43:48.965120\n", " image/svg+xml\n", " \n", " \n", @@ -7846,7 +7832,7 @@ " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8ca79f96d6)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p8ca79f96d6)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p8ca79f96d6)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p8ca79f96d6)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p8ca79f96d6)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p8ca79f96d6)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p8ca79f96d6)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p8ca79f96d6)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p8ca79f96d6)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p8ca79f96d6)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8ca79f96d6)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p8ca79f96d6)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p8ca79f96d6)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p8ca79f96d6)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p8ca79f96d6)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p8ca79f96d6)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p8ca79f96d6)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p8ca79f96d6)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p8ca79f96d6)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p8ca79f96d6)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p8ca79f96d6)\" style=\"fill: none\"/>\n", " \n", " \n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8017,7 +8003,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8058,7 +8044,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8096,7 +8082,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8151,7 +8137,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8574,12 +8560,12 @@ " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8594,7 +8580,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8609,7 +8595,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8624,7 +8610,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8638,7 +8624,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8754,11 +8740,11 @@ " \n", " \n", + "\" clip-path=\"url(#p8ca79f96d6)\" style=\"fill: none; stroke-dasharray: 1.5,2.475; stroke-dashoffset: 0; stroke: #000000; stroke-width: 1.5\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -8822,7 +8808,7 @@ "\" style=\"fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square\"/>\n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8888,7 +8874,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9392,7 +9378,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9537,13 +9523,13 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9645,7 +9631,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", diff --git a/plotting_rbfes_with_cinnabar/calc_dg.tsv b/plotting_rbfes_with_cinnabar/calc_dg.tsv index ba1e75f..669d449 100644 --- a/plotting_rbfes_with_cinnabar/calc_dg.tsv +++ b/plotting_rbfes_with_cinnabar/calc_dg.tsv @@ -1,11 +1,11 @@ -ligand DG(MLE) (kcal/mol) uncertainty (kcal/mol) -lig_ejm_31 -0.09 0.05 -lig_ejm_42 0.7 0.1 -lig_ejm_46 -0.98 0.05 -lig_ejm_47 -0.1 0.1 -lig_ejm_48 0.53 0.09 -lig_ejm_50 0.91 0.06 -lig_ejm_43 2.0 0.2 -lig_jmc_23 -0.68 0.09 -lig_jmc_27 -1.1 0.1 -lig_jmc_28 -1.25 0.08 +ligand DG(MLE) (kcal/mol) uncertainty (kcal/mol) +lig_ejm_31 -0.09 0.05 +lig_ejm_42 0.7 0.1 +lig_ejm_46 -0.98 0.05 +lig_ejm_47 -0.1 0.1 +lig_ejm_48 0.53 0.09 +lig_ejm_50 0.91 0.06 +lig_ejm_43 2.0 0.2 +lig_jmc_23 -0.68 0.09 +lig_jmc_27 -1.1 0.1 +lig_jmc_28 -1.25 0.08 From 834c0b20712d6ca88ba8e05f33c5ea1005561237 Mon Sep 17 00:00:00 2001 From: hannahbaumann Date: Mon, 9 Nov 2026 14:44:33 +0100 Subject: [PATCH 5/8] Move cinnabar tutorial to cookbooks --- .../assets}/calc_dg.tsv | 0 .../assets}/experimental.tsv | 0 .../plot_results_with_cinnabar.ipynb | 772 +++++++++--------- .../final_results.tsv | 10 - 4 files changed, 408 insertions(+), 374 deletions(-) rename {plotting_rbfes_with_cinnabar => cookbook/assets}/calc_dg.tsv (100%) rename {plotting_rbfes_with_cinnabar => cookbook/assets}/experimental.tsv (100%) rename plotting_rbfes_with_cinnabar/PlottingFreeEnergiesUsingCinnabar.ipynb => cookbook/plot_results_with_cinnabar.ipynb (94%) delete mode 100644 plotting_rbfes_with_cinnabar/final_results.tsv diff --git a/plotting_rbfes_with_cinnabar/calc_dg.tsv b/cookbook/assets/calc_dg.tsv similarity index 100% rename from plotting_rbfes_with_cinnabar/calc_dg.tsv rename to cookbook/assets/calc_dg.tsv diff --git a/plotting_rbfes_with_cinnabar/experimental.tsv b/cookbook/assets/experimental.tsv similarity index 100% rename from plotting_rbfes_with_cinnabar/experimental.tsv rename to cookbook/assets/experimental.tsv diff --git a/plotting_rbfes_with_cinnabar/PlottingFreeEnergiesUsingCinnabar.ipynb b/cookbook/plot_results_with_cinnabar.ipynb similarity index 94% rename from plotting_rbfes_with_cinnabar/PlottingFreeEnergiesUsingCinnabar.ipynb rename to cookbook/plot_results_with_cinnabar.ipynb index 3c5fb51..14d8ccf 100644 --- a/plotting_rbfes_with_cinnabar/PlottingFreeEnergiesUsingCinnabar.ipynb +++ b/cookbook/plot_results_with_cinnabar.ipynb @@ -249,7 +249,7 @@ ], "source": [ "# read in the experimental data\n", - "experimental_data = pd.read_csv('experimental.tsv', sep=\"\\t\")\n", + "experimental_data = pd.read_csv('assets/experimental.tsv', sep=\"\\t\")\n", "experimental_data" ] }, @@ -388,7 +388,7 @@ ], "source": [ "# Read in calculated relative free energy results\n", - "calculated_data = pd.read_csv('final_results.tsv', sep=\"\\t\")\n", + "calculated_data = pd.read_csv('assets/final_results.tsv', sep=\"\\t\")\n", "calculated_data" ] }, @@ -469,7 +469,7 @@ " \n", " \n", " \n", - " 2026-11-09T11:42:01.429293\n", + " 2026-11-09T14:42:54.729942\n", " image/svg+xml\n", " \n", " \n", @@ -495,96 +495,96 @@ " \n", " \n", + "\" clip-path=\"url(#p9a7f1fa945)\" style=\"fill: none; stroke: #808080; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#p9a7f1fa945)\" style=\"fill: #808080; stroke: #808080; stroke-linecap: round\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a7f1fa945)\" style=\"fill: none; stroke: #808080; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#p9a7f1fa945)\" style=\"fill: #808080; stroke: #808080; stroke-linecap: round\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a7f1fa945)\" style=\"fill: none; stroke: #808080; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#p9a7f1fa945)\" style=\"fill: #808080; stroke: #808080; stroke-linecap: round\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a7f1fa945)\" style=\"fill: none; stroke: #808080; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#p9a7f1fa945)\" style=\"fill: #808080; stroke: #808080; stroke-linecap: round\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a7f1fa945)\" style=\"fill: none; stroke: #808080; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#p9a7f1fa945)\" style=\"fill: #808080; stroke: #808080; stroke-linecap: round\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a7f1fa945)\" style=\"fill: none; stroke: #808080; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#p9a7f1fa945)\" style=\"fill: #808080; stroke: #808080; stroke-linecap: round\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a7f1fa945)\" style=\"fill: none; stroke: #808080; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#p9a7f1fa945)\" style=\"fill: #808080; stroke: #808080; stroke-linecap: round\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a7f1fa945)\" style=\"fill: none; stroke: #808080; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#p9a7f1fa945)\" style=\"fill: #808080; stroke: #808080; stroke-linecap: round\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p9a7f1fa945)\" style=\"fill: none; stroke: #808080; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#p9a7f1fa945)\" style=\"fill: #808080; stroke: #808080; stroke-linecap: round\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -810,7 +810,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -872,7 +872,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -921,7 +921,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -950,7 +950,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1008,7 +1008,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1073,7 +1073,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1090,7 +1090,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1130,7 +1130,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1147,7 +1147,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1433,7 +1433,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1478,7 +1478,7 @@ " \n", " \n", " \n", - " 2026-11-09T11:42:03.019967\n", + " 2026-11-09T14:42:56.135355\n", " image/svg+xml\n", " \n", " \n", @@ -1511,7 +1511,7 @@ " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", + "\" clip-path=\"url(#p183e7e790d)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p183e7e790d)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p183e7e790d)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p183e7e790d)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p183e7e790d)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p183e7e790d)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p183e7e790d)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p183e7e790d)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p183e7e790d)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p183e7e790d)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p183e7e790d)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p183e7e790d)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p183e7e790d)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p183e7e790d)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p183e7e790d)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p183e7e790d)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p183e7e790d)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p183e7e790d)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p183e7e790d)\" style=\"fill: none\"/>\n", " \n", " \n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1665,7 +1665,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1695,7 +1695,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1731,7 +1731,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1744,7 +1744,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2135,12 +2135,12 @@ " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2165,7 +2165,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2208,7 +2208,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2224,7 +2224,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2240,7 +2240,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2255,7 +2255,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2270,7 +2270,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2285,7 +2285,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2300,7 +2300,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2418,21 +2418,21 @@ " \n", " \n", + "\" clip-path=\"url(#p183e7e790d)\" style=\"fill: none; stroke: #808080; stroke-width: 1.5; stroke-linecap: square\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p183e7e790d)\" style=\"fill: none; stroke: #808080; stroke-width: 1.5; stroke-linecap: square\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p183e7e790d)\" style=\"fill: none; stroke-dasharray: 1.5,2.475; stroke-dashoffset: 0; stroke: #000000; stroke-width: 1.5\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -2493,7 +2493,7 @@ "\" style=\"fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square\"/>\n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2527,7 +2527,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2640,7 +2640,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3106,7 +3120,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3156,7 +3170,7 @@ " \n", " \n", " \n", - " 2026-11-09T11:42:04.363090\n", + " 2026-11-09T14:42:57.698700\n", " image/svg+xml\n", " \n", " \n", @@ -3189,7 +3203,7 @@ " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", + "\" clip-path=\"url(#p12a3316bc5)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p12a3316bc5)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p12a3316bc5)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p12a3316bc5)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p12a3316bc5)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p12a3316bc5)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p12a3316bc5)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p12a3316bc5)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p12a3316bc5)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p12a3316bc5)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p12a3316bc5)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p12a3316bc5)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p12a3316bc5)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p12a3316bc5)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p12a3316bc5)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p12a3316bc5)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p12a3316bc5)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p12a3316bc5)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p12a3316bc5)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p12a3316bc5)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p12a3316bc5)\" style=\"fill: none\"/>\n", " \n", " \n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3350,7 +3364,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3380,7 +3394,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3416,7 +3430,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3429,7 +3443,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3819,12 +3833,12 @@ " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3849,7 +3863,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3892,7 +3906,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3908,7 +3922,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3924,7 +3938,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3939,7 +3953,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3954,7 +3968,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3969,7 +3983,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3984,7 +3998,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4101,11 +4115,11 @@ " \n", " \n", + "\" clip-path=\"url(#p12a3316bc5)\" style=\"fill: none; stroke-dasharray: 1.5,2.475; stroke-dashoffset: 0; stroke: #000000; stroke-width: 1.5\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -4169,7 +4183,7 @@ "\" style=\"fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square\"/>\n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4203,7 +4217,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4701,7 +4715,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4822,7 +4836,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4832,7 +4846,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4930,7 +4944,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4979,7 +4993,7 @@ " \n", " \n", " \n", - " 2026-11-09T11:42:05.928634\n", + " 2026-11-09T14:42:59.638378\n", " image/svg+xml\n", " \n", " \n", @@ -5012,7 +5026,7 @@ " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", + "\" clip-path=\"url(#p5a48d5f6df)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p5a48d5f6df)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p5a48d5f6df)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p5a48d5f6df)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p5a48d5f6df)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p5a48d5f6df)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p5a48d5f6df)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p5a48d5f6df)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p5a48d5f6df)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p5a48d5f6df)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p5a48d5f6df)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p5a48d5f6df)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p5a48d5f6df)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p5a48d5f6df)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p5a48d5f6df)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p5a48d5f6df)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p5a48d5f6df)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p5a48d5f6df)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p5a48d5f6df)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p5a48d5f6df)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p5a48d5f6df)\" style=\"fill: none\"/>\n", " \n", " \n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5188,7 +5202,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5203,7 +5217,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5241,7 +5255,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5287,7 +5301,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5719,12 +5733,12 @@ " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5750,7 +5764,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5794,7 +5808,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5811,7 +5825,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5828,7 +5842,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5845,7 +5859,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5861,7 +5875,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5877,7 +5891,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5893,7 +5907,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -6011,11 +6025,11 @@ " \n", " \n", + "\" clip-path=\"url(#p5a48d5f6df)\" style=\"fill: none; stroke-dasharray: 1.5,2.475; stroke-dashoffset: 0; stroke: #000000; stroke-width: 1.5\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -6079,7 +6093,7 @@ "\" style=\"fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square\"/>\n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -6113,7 +6127,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -6242,7 +6256,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -6744,7 +6788,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -6842,7 +6886,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7336,7 +7380,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 11, "id": "4638d997-5252-465c-bd40-aa368c68acd3", "metadata": {}, "outputs": [ @@ -7445,13 +7489,13 @@ "9 lig_jmc_28 -1.25 0.08" ] }, - "execution_count": 13, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "calculated_dg_data = pd.read_csv('calc_dg.tsv', sep=\"\\t\")\n", + "calculated_dg_data = pd.read_csv('assets/calc_dg.tsv', sep=\"\\t\")\n", "calculated_dg_data" ] }, @@ -7465,7 +7509,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 12, "id": "6cdb7f24-8f9b-424a-ab29-3c4634c63e19", "metadata": {}, "outputs": [ @@ -7738,7 +7782,7 @@ "22 True " ] }, - "execution_count": 14, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -7784,7 +7828,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 13, "id": "95eaa8f8-deb0-4671-86fd-b094598cb8ae", "metadata": {}, "outputs": [ @@ -7799,7 +7843,7 @@ " \n", " \n", " \n", - " 2026-11-09T11:43:48.965120\n", + " 2026-11-09T14:43:10.836368\n", " image/svg+xml\n", " \n", " \n", @@ -7832,7 +7876,7 @@ " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", + "\" clip-path=\"url(#p4a940e9f10)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p4a940e9f10)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p4a940e9f10)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p4a940e9f10)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p4a940e9f10)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p4a940e9f10)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p4a940e9f10)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p4a940e9f10)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p4a940e9f10)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p4a940e9f10)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p4a940e9f10)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p4a940e9f10)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p4a940e9f10)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p4a940e9f10)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p4a940e9f10)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p4a940e9f10)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p4a940e9f10)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p4a940e9f10)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p4a940e9f10)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p4a940e9f10)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p4a940e9f10)\" style=\"fill: none\"/>\n", " \n", " \n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8003,7 +8047,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8044,7 +8088,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8082,7 +8126,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8137,7 +8181,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8560,12 +8604,12 @@ " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8580,7 +8624,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8595,7 +8639,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8610,7 +8654,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8624,7 +8668,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8740,11 +8784,11 @@ " \n", " \n", + "\" clip-path=\"url(#p4a940e9f10)\" style=\"fill: none; stroke-dasharray: 1.5,2.475; stroke-dashoffset: 0; stroke: #000000; stroke-width: 1.5\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -8808,7 +8852,7 @@ "\" style=\"fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square\"/>\n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8874,7 +8918,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9003,7 +9047,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9378,7 +9422,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9501,7 +9545,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9523,7 +9567,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9631,7 +9675,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", diff --git a/plotting_rbfes_with_cinnabar/final_results.tsv b/plotting_rbfes_with_cinnabar/final_results.tsv deleted file mode 100644 index 284aaef..0000000 --- a/plotting_rbfes_with_cinnabar/final_results.tsv +++ /dev/null @@ -1,10 +0,0 @@ -ligand_i ligand_j DDG(i->j) (kcal/mol) uncertainty (kcal/mol) -lig_ejm_31 lig_ejm_42 0.49 0.09 -lig_ejm_31 lig_ejm_46 -0.73 0.10 -lig_ejm_31 lig_ejm_47 0.0 0.2 -lig_ejm_31 lig_ejm_48 0.5 0.2 -lig_ejm_31 lig_ejm_50 0.94 0.07 -lig_ejm_42 lig_ejm_43 1.2 0.1 -lig_ejm_46 lig_jmc_23 -0.39 0.05 -lig_ejm_46 lig_jmc_27 -0.6 0.1 -lig_ejm_46 lig_jmc_28 -0.12 0.04 From dc757e218a8bdad0fa03e9b79e81dcecc30e8281 Mon Sep 17 00:00:00 2001 From: hannahbaumann Date: Mon, 9 Nov 2026 15:05:55 +0100 Subject: [PATCH 6/8] Add missing file --- cookbook/assets/final_results.tsv | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 cookbook/assets/final_results.tsv diff --git a/cookbook/assets/final_results.tsv b/cookbook/assets/final_results.tsv new file mode 100644 index 0000000..284aaef --- /dev/null +++ b/cookbook/assets/final_results.tsv @@ -0,0 +1,10 @@ +ligand_i ligand_j DDG(i->j) (kcal/mol) uncertainty (kcal/mol) +lig_ejm_31 lig_ejm_42 0.49 0.09 +lig_ejm_31 lig_ejm_46 -0.73 0.10 +lig_ejm_31 lig_ejm_47 0.0 0.2 +lig_ejm_31 lig_ejm_48 0.5 0.2 +lig_ejm_31 lig_ejm_50 0.94 0.07 +lig_ejm_42 lig_ejm_43 1.2 0.1 +lig_ejm_46 lig_jmc_23 -0.39 0.05 +lig_ejm_46 lig_jmc_27 -0.6 0.1 +lig_ejm_46 lig_jmc_28 -0.12 0.04 From 021da7ed351b950bf4b521269bd8a5e3c368f9c2 Mon Sep 17 00:00:00 2001 From: hannahbaumann Date: Mon, 9 Nov 2026 16:41:28 +0100 Subject: [PATCH 7/8] Addres review comments --- cookbook/assets/calc_dg.tsv | 20 ++++++------ cookbook/plot_results_with_cinnabar.ipynb | 38 ++++++++++++----------- 2 files changed, 30 insertions(+), 28 deletions(-) diff --git a/cookbook/assets/calc_dg.tsv b/cookbook/assets/calc_dg.tsv index 669d449..6c4f919 100644 --- a/cookbook/assets/calc_dg.tsv +++ b/cookbook/assets/calc_dg.tsv @@ -1,11 +1,11 @@ ligand DG(MLE) (kcal/mol) uncertainty (kcal/mol) -lig_ejm_31 -0.09 0.05 -lig_ejm_42 0.7 0.1 -lig_ejm_46 -0.98 0.05 -lig_ejm_47 -0.1 0.1 -lig_ejm_48 0.53 0.09 -lig_ejm_50 0.91 0.06 -lig_ejm_43 2.0 0.2 -lig_jmc_23 -0.68 0.09 -lig_jmc_27 -1.1 0.1 -lig_jmc_28 -1.25 0.08 +lig_ejm_31 0.04 0.05 +lig_ejm_42 0.53 0.09 +lig_ejm_43 1.7 0.1 +lig_ejm_46 -0.69 0.07 +lig_ejm_47 0.0 0.2 +lig_ejm_48 0.5 0.2 +lig_ejm_50 0.98 0.08 +lig_jmc_23 -1.08 0.08 +lig_jmc_27 -1.3 0.1 +lig_jmc_28 -0.81 0.08 diff --git a/cookbook/plot_results_with_cinnabar.ipynb b/cookbook/plot_results_with_cinnabar.ipynb index 14d8ccf..6a71862 100644 --- a/cookbook/plot_results_with_cinnabar.ipynb +++ b/cookbook/plot_results_with_cinnabar.ipynb @@ -9,12 +9,16 @@ "\n", "Here, we show how to plot OpenFE free energy results against experimental values with [cinnabar](https://github.com/OpenFreeEnergy/cinnabar). It covers:\n", "\n", - "1. relative free energies, from the table written by `openfe gather --report ddg`, and the absolute free energies derived from them, and\n", - "2. absolute free energies, from the table written by `openfe gather --report dg`, `openfe gather-abfe --report dg` or `openfe gather-septop --report dg`.\n", + "1. **relative free energies**, from the table written by `openfe gather --report ddg`, and the absolute free energies derived from them, and\n", + "2. **absolute free energies**, from the table written by `openfe gather --report dg`, `openfe gather-abfe --report dg` or `openfe gather-septop --report dg`.\n", "\n", - "This notebook requires `cinnabar` 0.6 or later, which is installed with openfe. With older versions, the plotting functions fail with errors such as `'FEMap' object has no attribute 'edges'`.\n", + "For more on the `cinnabar` API and the available plot styles, see the [cinnabar tutorials](https://cinnabar.openfree.energy/en/latest/tutorials/index.html).\n", "\n", - "For more on the `cinnabar` API and the available plot styles, see the [cinnabar tutorials](https://cinnabar.openfree.energy/en/latest/tutorials/index.html)." + "
\n", + "\n", + "**Note:** This notebook requires `cinnabar` 0.6 or later, which is installed with openfe. With older versions, the plotting functions fail with errors such as `'FEMap' object has no attribute 'edges'`.\n", + "\n", + "
" ] }, { @@ -88,11 +92,7 @@ "\n", "```\n", "ligand estimate (kcal/mol) uncertainty (kcal/mol)\n", - "```\n", - "\n", - "**Important note:**\n", - "Please note that for now you must have an experimental entry for every ligand involved in your free energy network.\n", - "In future versions of cinnabar this will no longer be needed." + "```" ] }, { @@ -264,7 +264,11 @@ "\n", "Next we load in results from the TSV file created by running `openfe gather --report ddg` on a network of results from [relative binding free energy calculations](https://docs.openfree.energy/en/latest/guide/protocols/relativehybridtopology.html#overview).\n", "\n", - "Please see the full [RBFE gather command tutorial](https://github.com/OpenFreeEnergy/ExampleNotebooks/blob/main/rbfe_tutorial/cli_tutorial.md) for more information." + "Please see the full [RBFE gather command tutorial](https://github.com/OpenFreeEnergy/ExampleNotebooks/blob/main/rbfe_tutorial/cli_tutorial.md) for more information.\n", + "\n", + "
\n", + "Note: Each openfe gather command only reads the results of one protocol. For networks that combine protocols, for example hybrid topology and Separated Topologies edges, load the results in Python and add them to a single FEMap, as shown in the Mixed Protocol Networks tutorial.\n", + "
" ] }, { @@ -4973,7 +4977,7 @@ "id": "a905416e-11bd-47cb-8002-5ac923b0e95b", "metadata": {}, "source": [ - "We can also shift our free energies by the average experimental value to have DGs on the same scale as experiment." + "The MLE estimates are centred around zero, because relative calculations only determine free energy differences between ligands, not their absolute offset. To compare them with experiment, we shift them by the mean of the experimental values. You can read more about this in the [cinnabar guide](https://cinnabar.openfree.energy/en/latest/concepts/estimators.html#centering-of-results)." ] }, { @@ -7361,17 +7365,17 @@ }, { "cell_type": "markdown", - "id": "cfca38eb-4928-4f13-9a22-9676c21b28f6", + "id": "7df44b07-43d1-40eb-bf45-8f1d5a860d7a", "metadata": {}, "source": [ "## Plotting absolute free energy results\n", "\n", "Absolute free energies can also be plotted directly from a table of free energies per ligand. This table can be written by:\n", "\n", - "* `openfe gather --report dg`, which derives the absolute free energies from a network of relative free energy calculations using the MLE estimator, or\n", - "* `openfe gather-abfe --report dg` or `openfe gather-septop --report dg`, for results from the [Absolute Binding](https://docs.openfree.energy/en/latest/guide/protocols/absolutebinding.html) or [Separated Topologies](https://docs.openfree.energy/en/latest/guide/protocols/septop.html) Protocols.\n", + "* `openfe gather --report dg` or `openfe gather-septop --report dg`, which derive the absolute free energies from a network of relative free energy calculations using the MLE estimator, or\n", + "* `openfe gather-abfe --report dg`, for results from the [Absolute Binding](https://docs.openfree.energy/en/latest/guide/protocols/absolutebinding.html) Protocol.\n", "\n", - "Here we load the results of `openfe gather --report dg` for a network of relative binding free energy calculations. The free energy column is called `DG(MLE) (kcal/mol)` in this report, and `DG (kcal/mol)` in the `gather-abfe` and `gather-septop` reports.\n", + "Here we load the results of `openfe gather --report dg` for a network of relative binding free energy calculations. The free energy column is called `DG(MLE) (kcal/mol)` in this report, and `DG (kcal/mol)` in the `gather-septop` and `gather-abfe` reports.\n", "\n", "
\n", "Note: If there is no experimental binding free energy for a ligand, that ligand's calculated data will be excluded from the plot.\n", @@ -7818,11 +7822,9 @@ "metadata": {}, "source": [ "
\n", - "Note: Absolute free energies derived from relative binding free energy calculations are centred around zero rather than the experimental mean, so we shift them by the mean of the experimental values before comparing them. Results from absolute binding free energy calculations do not need this shift.\n", + "Note: As above, absolute free energies derived from relative calculations (gather --report dg and gather-septop --report dg) are centred around zero, so we shift them by the mean of the experimental values. Results from absolute binding free energy calculations (gather-abfe) do not need this shift.\n", "
\n", "\n", - "You can read more about this in the [cinnabar guide](https://cinnabar.openfree.energy/en/latest/concepts/estimators.html#centering-of-results).\n", - "\n", "Finally, we plot the calculated against the experimental results, with some accuracy and ranking metrics:" ] }, From 9b74a01739a0f1b8f5436c7b0c8562a0154a9943 Mon Sep 17 00:00:00 2001 From: hannahbaumann Date: Mon, 9 Nov 2026 17:08:05 +0100 Subject: [PATCH 8/8] Small fix --- cookbook/plot_results_with_cinnabar.ipynb | 1336 ++++++++++----------- 1 file changed, 648 insertions(+), 688 deletions(-) diff --git a/cookbook/plot_results_with_cinnabar.ipynb b/cookbook/plot_results_with_cinnabar.ipynb index 6a71862..00899ea 100644 --- a/cookbook/plot_results_with_cinnabar.ipynb +++ b/cookbook/plot_results_with_cinnabar.ipynb @@ -473,7 +473,7 @@ " \n", " \n", " \n", - " 2026-11-09T14:42:54.729942\n", + " 2026-11-09T17:07:21.963340\n", " image/svg+xml\n", " \n", " \n", @@ -499,96 +499,96 @@ " \n", " \n", + "\" clip-path=\"url(#p6521fe8fd4)\" style=\"fill: none; stroke: #808080; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#p6521fe8fd4)\" style=\"fill: #808080; stroke: #808080; stroke-linecap: round\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6521fe8fd4)\" style=\"fill: none; stroke: #808080; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#p6521fe8fd4)\" style=\"fill: #808080; stroke: #808080; stroke-linecap: round\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6521fe8fd4)\" style=\"fill: none; stroke: #808080; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#p6521fe8fd4)\" style=\"fill: #808080; stroke: #808080; stroke-linecap: round\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6521fe8fd4)\" style=\"fill: none; stroke: #808080; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#p6521fe8fd4)\" style=\"fill: #808080; stroke: #808080; stroke-linecap: round\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6521fe8fd4)\" style=\"fill: none; stroke: #808080; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#p6521fe8fd4)\" style=\"fill: #808080; stroke: #808080; stroke-linecap: round\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6521fe8fd4)\" style=\"fill: none; stroke: #808080; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#p6521fe8fd4)\" style=\"fill: #808080; stroke: #808080; stroke-linecap: round\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6521fe8fd4)\" style=\"fill: none; stroke: #808080; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#p6521fe8fd4)\" style=\"fill: #808080; stroke: #808080; stroke-linecap: round\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6521fe8fd4)\" style=\"fill: none; stroke: #808080; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#p6521fe8fd4)\" style=\"fill: #808080; stroke: #808080; stroke-linecap: round\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6521fe8fd4)\" style=\"fill: none; stroke: #808080; stroke-linecap: round\"/>\n", " \n", + "\" clip-path=\"url(#p6521fe8fd4)\" style=\"fill: #808080; stroke: #808080; stroke-linecap: round\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -814,7 +814,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -876,7 +876,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -925,7 +925,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -954,7 +954,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1012,7 +1012,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1077,7 +1077,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1094,7 +1094,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1134,7 +1134,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1151,7 +1151,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1437,7 +1437,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1482,7 +1482,7 @@ " \n", " \n", " \n", - " 2026-11-09T14:42:56.135355\n", + " 2026-11-09T17:07:22.924216\n", " image/svg+xml\n", " \n", " \n", @@ -1515,7 +1515,7 @@ " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", + "\" clip-path=\"url(#p698636436a)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p698636436a)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p698636436a)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p698636436a)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p698636436a)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p698636436a)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p698636436a)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p698636436a)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p698636436a)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p698636436a)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p698636436a)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p698636436a)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p698636436a)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p698636436a)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p698636436a)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p698636436a)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p698636436a)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p698636436a)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p698636436a)\" style=\"fill: none\"/>\n", " \n", " \n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1669,7 +1669,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1699,7 +1699,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1735,7 +1735,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1748,7 +1748,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2139,12 +2139,12 @@ " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2169,7 +2169,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2212,7 +2212,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2228,7 +2228,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2244,7 +2244,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2259,7 +2259,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2274,7 +2274,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2289,7 +2289,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2304,7 +2304,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2422,21 +2422,21 @@ " \n", " \n", + "\" clip-path=\"url(#p698636436a)\" style=\"fill: none; stroke: #808080; stroke-width: 1.5; stroke-linecap: square\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p698636436a)\" style=\"fill: none; stroke: #808080; stroke-width: 1.5; stroke-linecap: square\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p698636436a)\" style=\"fill: none; stroke-dasharray: 1.5,2.475; stroke-dashoffset: 0; stroke: #000000; stroke-width: 1.5\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -2497,7 +2497,7 @@ "\" style=\"fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square\"/>\n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2531,7 +2531,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2644,7 +2644,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", - " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3124,7 +3110,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3174,7 +3160,7 @@ " \n", " \n", " \n", - " 2026-11-09T14:42:57.698700\n", + " 2026-11-09T17:07:24.275508\n", " image/svg+xml\n", " \n", " \n", @@ -3207,7 +3193,7 @@ " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6cf072339e)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p6cf072339e)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p6cf072339e)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p6cf072339e)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p6cf072339e)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p6cf072339e)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p6cf072339e)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p6cf072339e)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p6cf072339e)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p6cf072339e)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6cf072339e)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p6cf072339e)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p6cf072339e)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p6cf072339e)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p6cf072339e)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p6cf072339e)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p6cf072339e)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p6cf072339e)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p6cf072339e)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#p6cf072339e)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#p6cf072339e)\" style=\"fill: none\"/>\n", " \n", " \n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3368,7 +3354,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3398,7 +3384,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3434,7 +3420,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3447,7 +3433,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3837,12 +3823,12 @@ " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3867,7 +3853,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3910,7 +3896,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3926,7 +3912,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3942,7 +3928,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3957,7 +3943,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3972,7 +3958,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3987,7 +3973,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4002,7 +3988,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4119,11 +4105,11 @@ " \n", " \n", + "\" clip-path=\"url(#p6cf072339e)\" style=\"fill: none; stroke-dasharray: 1.5,2.475; stroke-dashoffset: 0; stroke: #000000; stroke-width: 1.5\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -4187,7 +4173,7 @@ "\" style=\"fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square\"/>\n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4221,7 +4207,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4719,7 +4705,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", @@ -4840,7 +4828,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4850,7 +4838,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4948,7 +4936,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -4997,7 +4985,7 @@ " \n", " \n", " \n", - " 2026-11-09T14:42:59.638378\n", + " 2026-11-09T17:07:25.598327\n", " image/svg+xml\n", " \n", " \n", @@ -5030,7 +5018,7 @@ " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", + "\" clip-path=\"url(#pce58a87977)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pce58a87977)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pce58a87977)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pce58a87977)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pce58a87977)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pce58a87977)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pce58a87977)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pce58a87977)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pce58a87977)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pce58a87977)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pce58a87977)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pce58a87977)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pce58a87977)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pce58a87977)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pce58a87977)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pce58a87977)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pce58a87977)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pce58a87977)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pce58a87977)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", + "\" clip-path=\"url(#pce58a87977)\" style=\"fill: none; stroke: #808080; stroke-width: 2\"/>\n", " \n", " \n", " \n", + "\" clip-path=\"url(#pce58a87977)\" style=\"fill: none\"/>\n", " \n", " \n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5206,7 +5194,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5221,7 +5209,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5259,7 +5247,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5305,7 +5293,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5737,12 +5725,12 @@ " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5768,7 +5756,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5812,7 +5800,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5829,7 +5817,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5846,7 +5834,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5863,7 +5851,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5879,7 +5867,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5895,7 +5883,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -5911,7 +5899,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -6029,11 +6017,11 @@ " \n", " \n", + "\" clip-path=\"url(#pce58a87977)\" style=\"fill: none; stroke-dasharray: 1.5,2.475; stroke-dashoffset: 0; stroke: #000000; stroke-width: 1.5\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -6097,7 +6085,7 @@ "\" style=\"fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square\"/>\n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -6131,7 +6119,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -6260,7 +6248,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -6890,7 +6848,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -7418,61 +7376,61 @@ " \n", " 0\n", " lig_ejm_31\n", - " -0.09\n", + " 0.04\n", " 0.05\n", " \n", " \n", " 1\n", " lig_ejm_42\n", - " 0.70\n", - " 0.10\n", + " 0.53\n", + " 0.09\n", " \n", " \n", " 2\n", - " lig_ejm_46\n", - " -0.98\n", - " 0.05\n", + " lig_ejm_43\n", + " 1.70\n", + " 0.10\n", " \n", " \n", " 3\n", - " lig_ejm_47\n", - " -0.10\n", - " 0.10\n", + " lig_ejm_46\n", + " -0.69\n", + " 0.07\n", " \n", " \n", " 4\n", - " lig_ejm_48\n", - " 0.53\n", - " 0.09\n", + " lig_ejm_47\n", + " 0.00\n", + " 0.20\n", " \n", " \n", " 5\n", - " lig_ejm_50\n", - " 0.91\n", - " 0.06\n", + " lig_ejm_48\n", + " 0.50\n", + " 0.20\n", " \n", " \n", " 6\n", - " lig_ejm_43\n", - " 2.00\n", - " 0.20\n", + " lig_ejm_50\n", + " 0.98\n", + " 0.08\n", " \n", " \n", " 7\n", " lig_jmc_23\n", - " -0.68\n", - " 0.09\n", + " -1.08\n", + " 0.08\n", " \n", " \n", " 8\n", " lig_jmc_27\n", - " -1.10\n", + " -1.30\n", " 0.10\n", " \n", " \n", " 9\n", " lig_jmc_28\n", - " -1.25\n", + " -0.81\n", " 0.08\n", " \n", " \n", @@ -7481,16 +7439,16 @@ ], "text/plain": [ " ligand DG(MLE) (kcal/mol) uncertainty (kcal/mol)\n", - "0 lig_ejm_31 -0.09 0.05\n", - "1 lig_ejm_42 0.70 0.10\n", - "2 lig_ejm_46 -0.98 0.05\n", - "3 lig_ejm_47 -0.10 0.10\n", - "4 lig_ejm_48 0.53 0.09\n", - "5 lig_ejm_50 0.91 0.06\n", - "6 lig_ejm_43 2.00 0.20\n", - "7 lig_jmc_23 -0.68 0.09\n", - "8 lig_jmc_27 -1.10 0.10\n", - "9 lig_jmc_28 -1.25 0.08" + "0 lig_ejm_31 0.04 0.05\n", + "1 lig_ejm_42 0.53 0.09\n", + "2 lig_ejm_43 1.70 0.10\n", + "3 lig_ejm_46 -0.69 0.07\n", + "4 lig_ejm_47 0.00 0.20\n", + "5 lig_ejm_48 0.50 0.20\n", + "6 lig_ejm_50 0.98 0.08\n", + "7 lig_jmc_23 -1.08 0.08\n", + "8 lig_jmc_27 -1.30 0.10\n", + "9 lig_jmc_28 -0.81 0.08" ] }, "execution_count": 11, @@ -7653,7 +7611,7 @@ " \n", " 13\n", " lig_ejm_31\n", - " -0.09\n", + " 0.04\n", " 0.05\n", " openfe\n", " True\n", @@ -7661,63 +7619,63 @@ " \n", " 14\n", " lig_ejm_42\n", - " 0.70\n", - " 0.10\n", + " 0.53\n", + " 0.09\n", " openfe\n", " True\n", " \n", " \n", " 15\n", " lig_ejm_43\n", - " 2.00\n", - " 0.20\n", + " 1.70\n", + " 0.10\n", " openfe\n", " True\n", " \n", " \n", " 16\n", " lig_ejm_46\n", - " -0.98\n", - " 0.05\n", + " -0.69\n", + " 0.07\n", " openfe\n", " True\n", " \n", " \n", " 17\n", " lig_ejm_47\n", - " -0.10\n", - " 0.10\n", + " 0.00\n", + " 0.20\n", " openfe\n", " True\n", " \n", " \n", " 18\n", " lig_ejm_48\n", - " 0.53\n", - " 0.09\n", + " 0.50\n", + " 0.20\n", " openfe\n", " True\n", " \n", " \n", " 19\n", " lig_ejm_50\n", - " 0.91\n", - " 0.06\n", + " 0.98\n", + " 0.08\n", " openfe\n", " True\n", " \n", " \n", " 20\n", " lig_jmc_23\n", - " -0.68\n", - " 0.09\n", + " -1.08\n", + " 0.08\n", " openfe\n", " True\n", " \n", " \n", " 21\n", " lig_jmc_27\n", - " -1.10\n", + " -1.30\n", " 0.10\n", " openfe\n", " True\n", @@ -7725,7 +7683,7 @@ " \n", " 22\n", " lig_jmc_28\n", - " -1.25\n", + " -0.81\n", " 0.08\n", " openfe\n", " True\n", @@ -7749,16 +7707,16 @@ "10 lig_jmc_23 -11.74 0.18 Experimental \n", "11 lig_jmc_27 -11.31 0.17 Experimental \n", "12 lig_jmc_28 -11.01 0.18 Experimental \n", - "13 lig_ejm_31 -0.09 0.05 openfe \n", - "14 lig_ejm_42 0.70 0.10 openfe \n", - "15 lig_ejm_43 2.00 0.20 openfe \n", - "16 lig_ejm_46 -0.98 0.05 openfe \n", - "17 lig_ejm_47 -0.10 0.10 openfe \n", - "18 lig_ejm_48 0.53 0.09 openfe \n", - "19 lig_ejm_50 0.91 0.06 openfe \n", - "20 lig_jmc_23 -0.68 0.09 openfe \n", - "21 lig_jmc_27 -1.10 0.10 openfe \n", - "22 lig_jmc_28 -1.25 0.08 openfe \n", + "13 lig_ejm_31 0.04 0.05 openfe \n", + "14 lig_ejm_42 0.53 0.09 openfe \n", + "15 lig_ejm_43 1.70 0.10 openfe \n", + "16 lig_ejm_46 -0.69 0.07 openfe \n", + "17 lig_ejm_47 0.00 0.20 openfe \n", + "18 lig_ejm_48 0.50 0.20 openfe \n", + "19 lig_ejm_50 0.98 0.08 openfe \n", + "20 lig_jmc_23 -1.08 0.08 openfe \n", + "21 lig_jmc_27 -1.30 0.10 openfe \n", + "22 lig_jmc_28 -0.81 0.08 openfe \n", "\n", " computational \n", "0 False \n", @@ -7845,7 +7803,7 @@ " \n", " \n", " \n", - " 2026-11-09T14:43:10.836368\n", + " 2026-11-09T17:07:46.131985\n", " image/svg+xml\n", " \n", " \n", @@ -7878,7 +7836,7 @@ " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8049,7 +8007,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8090,7 +8048,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8128,7 +8086,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8183,7 +8141,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8606,12 +8564,12 @@ " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8626,7 +8584,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8641,7 +8599,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8656,7 +8614,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8670,7 +8628,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8786,11 +8744,11 @@ " \n", " \n", + "\" clip-path=\"url(#p9f6daaf19b)\" style=\"fill: none; stroke-dasharray: 1.5,2.475; stroke-dashoffset: 0; stroke: #000000; stroke-width: 1.5\"/>\n", " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -8854,7 +8812,7 @@ "\" style=\"fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square\"/>\n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -8920,7 +8878,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9049,7 +9007,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", " \n", - " \n", - " \n", " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -9413,18 +9424,18 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", " \n", " \n", " \n", @@ -9525,7 +9473,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9536,19 +9484,31 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -9557,8 +9517,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -9568,18 +9528,18 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9660,14 +9620,14 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -9677,7 +9637,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n",