diff --git a/abfe_tutorial/abfe_analysis.ipynb b/abfe_tutorial/abfe_analysis.ipynb index d4bccee..9809a20 100644 --- a/abfe_tutorial/abfe_analysis.ipynb +++ b/abfe_tutorial/abfe_analysis.ipynb @@ -35,7 +35,7 @@ "text": [ " % Total % Received % Xferd Average Speed Time Time Time Current\n", " Dload Upload Total Spent Left Speed\n", - "100 3092k 100 3092k 0 0 432k 0 0:00:07 0:00:07 --:--:-- 501k\n", + "100 3092k 100 3092k 0 0 1588k 0 0:00:01 0:00:01 --:--:-- 1587k\n", "Archive: abfe_results.zip\n", " inflating: abfe_results/README.md \n", " inflating: abfe_results/abfe_results_single_unit/results_2/1.json \n", @@ -53,6 +53,92 @@ "!unzip -o abfe_results.zip" ] }, + { + "cell_type": "markdown", + "id": "0e15f538-1471-440f-b590-866a2258f0c7", + "metadata": {}, + "source": [ + "## Analysing results from the command line\n", + "\n", + "The quickest way to get free energies out of your `openfe quickrun` results is\n", + "`openfe gather-abfe`, which reads the result JSON files and prints a report\n", + "directly. The default `--report dg` gives the overall binding free energy per\n", + "ligand; `--report raw` gives the per-leg (complex and solvent) values. Add\n", + "`-o out.tsv` to write a tab-separated file instead of printing, and\n", + "`--allow-partial` to skip incomplete edges with a warning.\n", + "\n", + "*Note: `openfe gather-abfe` is currently experimental and may change in a future\n", + "openfe release. It will also print an experimental-feature warning to stderr.*" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "7bb3c09c-4aff-4e6a-9b39-4d0318b2a71b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[33mWARNING! Gathering of ABFE results with `openfe gather-abfe` is an experimental feature and is subject to change in a future release of openfe.\u001b[0m\n", + "┌────────┬───────────────┬────────────────────────────────┐\n", + "│\u001b[1m \u001b[0m\u001b[1mligand\u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1mDG (kcal/mol)\u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1mstd dev uncertainty (kcal/mol)\u001b[0m\u001b[1m \u001b[0m│\n", + "├────────┼───────────────┼────────────────────────────────┤\n", + "│ 1 │ -20.87 │ 0.58 │\n", + "└────────┴───────────────┴────────────────────────────────┘\n" + ] + } + ], + "source": [ + "# overall binding free energy (DG) per ligand\n", + "!openfe gather-abfe abfe_results/abfe_results_multiple_units --report dg" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "89f51d9d-1ea8-4d12-8d7c-7bce2dd6666a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[33mWARNING! Gathering of ABFE results with `openfe gather-abfe` is an experimental feature and is subject to change in a future release of openfe.\u001b[0m\n", + "┌──────────────────────────┬────────┬───────────────┬──────────────────────────┐\n", + "│\u001b[1m \u001b[0m│\u001b[1m \u001b[0m│\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1mMBAR uncertainty \u001b[0m\u001b[1m \u001b[0m│\n", + "│\u001b[1m \u001b[0m\u001b[1mleg \u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1mligand\u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1mDG (kcal/mol)\u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1m(kcal/mol) \u001b[0m\u001b[1m \u001b[0m│\n", + "├──────────────────────────┼────────┼───────────────┼──────────────────────────┤\n", + "│ complex │ 1 │ 36.34 │ 0.91 │\n", + "│ complex │ 1 │ 36.17 │ 0.80 │\n", + "│ complex │ 1 │ 34.77 │ 0.81 │\n", + "│ solvent │ 1 │ 6.5 │ 1.4 │\n", + "│ solvent │ 1 │ 5.4 │ 1.4 │\n", + "│ solvent │ 1 │ 5.5 │ 1.4 │\n", + "│ standard_state_correcti… │ 1 │ -8.9 │ 0.0 │\n", + "│ standard_state_correcti… │ 1 │ -9.3 │ 0.0 │\n", + "│ standard_state_correcti… │ 1 │ -9.0 │ 0.0 │\n", + "└──────────────────────────┴────────┴───────────────┴──────────────────────────┘\n" + ] + } + ], + "source": [ + "# raw per-leg (complex, solvent, and Boresch-restraint analytical correction) values\n", + "!openfe gather-abfe abfe_results/abfe_results_multiple_units --report raw" + ] + }, + { + "cell_type": "markdown", + "id": "7e0ce0ab-0777-44b2-b865-7eaedaba57d9", + "metadata": {}, + "source": [ + "## Analysing results with the Python API\n", + "\n", + "For more control over how results are combined and analysed, you can work with\n", + "the result JSONs directly in Python, as shown in the rest of this notebook." + ] + }, { "cell_type": "markdown", "id": "f2cff1e7-cf62-4839-b53d-62b59b7189b6", @@ -64,7 +150,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 4, "id": "7fbf1482-25ca-427b-a881-af88a983461c", "metadata": {}, "outputs": [], @@ -95,7 +181,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 5, "id": "08afcbcf-34a8-4450-a967-eb4ed5800ee1", "metadata": {}, "outputs": [], @@ -127,7 +213,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 6, "id": "04ccdedd-84e3-4ccc-ae42-4f3772acb115", "metadata": {}, "outputs": [], @@ -173,7 +259,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 7, "id": "3733c540-de62-45a0-ba66-268397a38b49", "metadata": {}, "outputs": [], @@ -241,7 +327,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 8, "id": "0621e3a2-7906-4661-a640-c414456f8869", "metadata": {}, "outputs": [], @@ -279,7 +365,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 9, "id": "5821b7f7-6aed-4138-9502-44df3af52647", "metadata": {}, "outputs": [], @@ -311,7 +397,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 10, "id": "e021b2ea-db13-4e47-a6d1-cf5229b5b494", "metadata": {}, "outputs": [], @@ -352,7 +438,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 11, "id": "b077c4e2-373a-4314-a527-186bb4683262", "metadata": {}, "outputs": [], @@ -407,7 +493,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 12, "id": "7bc49c0e-6fec-409c-a01c-42c35f57dcc6", "metadata": {}, "outputs": [], @@ -430,7 +516,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 13, "id": "46996a74-709c-41f2-ac39-0f77fb33371e", "metadata": {}, "outputs": [], @@ -441,7 +527,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 14, "id": "d1a6ad61-1e5a-4d8a-9067-9ed428ef145c", "metadata": {}, "outputs": [ @@ -487,7 +573,7 @@ "0 1 -20.87 0.47" ] }, - "execution_count": 12, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -507,7 +593,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 15, "id": "8b2c1dd8-ffa3-4585-94a7-4a1ed1454f30", "metadata": {}, "outputs": [], @@ -518,7 +604,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 16, "id": "08b72901-9c71-460b-b5da-9fb4a35e07f7", "metadata": {}, "outputs": [ @@ -630,7 +716,7 @@ "8 standard_state_correction 1 -9.0 0.0" ] }, - "execution_count": 14, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -638,14 +724,6 @@ "source": [ "df_raw" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "bf160a28-3aa1-4661-8f06-3a4a71d34ff2", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { @@ -664,7 +742,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.13" + "version": "3.13.11" }, "widgets": { "application/vnd.jupyter.widget-state+json": { diff --git a/openmm_septop/septop_analysis.ipynb b/openmm_septop/septop_analysis.ipynb index 72894e7..ba2845e 100644 --- a/openmm_septop/septop_analysis.ipynb +++ b/openmm_septop/septop_analysis.ipynb @@ -37,7 +37,7 @@ "text": [ " % Total % Received % Xferd Average Speed Time Time Time Current\n", " Dload Upload Total Spent Left Speed\n", - "100 12.7M 100 12.7M 0 0 2951k 0 0:00:04 0:00:04 --:--:-- 2951k\n", + "100 12.7M 100 12.7M 0 0 2713k 0 0:00:04 0:00:04 --:--:-- 2870k\n", "Archive: septop_results.zip\n", " inflating: septop_results/pre_openfe_v1.11/results_2/rbfe_1_7b.json \n", " inflating: septop_results/pre_openfe_v1.11/results_2/rbfe_7a_7b.json \n", @@ -65,6 +65,149 @@ "!unzip -o septop_results.zip" ] }, + { + "cell_type": "markdown", + "id": "c96197a4-4d92-449a-b2b6-2ce312ff89c3", + "metadata": {}, + "source": [ + "## Analysing results from the command line\n", + "\n", + "The quickest way to get free energies out of your `openfe quickrun` results is\n", + "`openfe gather-septop`, which reads the result JSON files and prints a report\n", + "directly. The default `--report dg` gives the overall binding free energy per\n", + "ligand; `--report ddg` gives the relative free energy difference of that leg, and `--report raw` gives the per-leg (complex and solvent) values. Add\n", + "`-o out.tsv` to write a tab-separated file instead of printing, and\n", + "`--allow-partial` to skip incomplete edges with a warning.\n", + "\n", + "*Note: `openfe gather-septop` is currently experimental and may change in a future\n", + "openfe release. It will also print an experimental-feature warning to stderr.*" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "5025f433-c193-4c72-a7e4-7c56114e1f0f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[33mWARNING! Gathering of SepTop results with `openfe gather-septop` is an experimental feature and is subject to change in a future release of openfe.\u001b[0m\n", + "┌────────┬───────────────┬─────────────────────────────┐\n", + "│\u001b[1m \u001b[0m\u001b[1mligand\u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1mDG (kcal/mol)\u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1mMBAR uncertainty (kcal/mol)\u001b[0m\u001b[1m \u001b[0m│\n", + "├────────┼───────────────┼─────────────────────────────┤\n", + "│ 1 │ -0.78 │ 0.67 │\n", + "│ 25 │ -0.6 │ 1.2 │\n", + "│ 7a │ 0.04 │ 0.93 │\n", + "│ 7b │ 1.34 │ 0.92 │\n", + "└────────┴───────────────┴─────────────────────────────┘\n" + ] + } + ], + "source": [ + "# overall binding free energy (DG) per ligand\n", + "!openfe gather-septop septop_results/current --report dg" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "bbf90782-383a-4c56-be36-a1da3d4fd140", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[33mWARNING! Gathering of SepTop results with `openfe gather-septop` is an experimental feature and is subject to change in a future release of openfe.\u001b[0m\n", + "┌──────────┬──────────┬──────────────────────┬─────────────────────────────┐\n", + "│\u001b[1m \u001b[0m\u001b[1mligand_i\u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1mligand_j\u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1mDDG(i->j) (kcal/mol)\u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1mMBAR uncertainty (kcal/mol)\u001b[0m\u001b[1m \u001b[0m│\n", + "├──────────┼──────────┼──────────────────────┼─────────────────────────────┤\n", + "│ 1 │ 25 │ 0.2 │ 1.4 │\n", + "│ 1 │ 7a │ 1.3 │ 1.6 │\n", + "│ 1 │ 7b │ 1.7 │ 1.6 │\n", + "│ 7a │ 7b │ 1.8 │ 1.6 │\n", + "└────────���─┴──────────┴──────────────────────┴─────────────────────────────┘\n" + ] + } + ], + "source": [ + "# Difference in binding free energy (DDG) between the two ligands\n", + "!openfe gather-septop septop_results/current --report ddg" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "60577004-8076-4d7a-8369-03f8b100a514", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[33mWARNING! Gathering of SepTop results with `openfe gather-septop` is an experimental feature and is subject to change in a future release of openfe.\u001b[0m\n", + "┌──────────────────┬──────────┬──────────┬──────────────────┬──────────────────┐\n", + "│\u001b[1m \u001b[0m│\u001b[1m \u001b[0m│\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1mDG(i->j) \u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1mMBAR uncertainty\u001b[0m\u001b[1m \u001b[0m│\n", + "│\u001b[1m \u001b[0m\u001b[1mleg \u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1mligand_i\u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1mligand_j\u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1m(kcal/mol) \u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1m(kcal/mol) \u001b[0m\u001b[1m \u001b[0m│\n", + "├──────────────────┼──────────┼──────────┼──────────────────┼──────────────────┤\n", + "│ complex │ 1 │ 25 │ 42.66 │ 0.73 │\n", + "│ solvent │ 1 │ 25 │ 42.4 │ 1.2 │\n", + "│ standard_state_… │ 1 │ 25 │ -9.2 │ 0.0 │\n", + "│ standard_state_… │ 1 │ 25 │ 9.0 │ 0.0 │\n", + "│ complex │ 1 │ 7a │ 0.82 │ 0.84 │\n", + "│ complex │ 1 │ 7a │ 0.32 │ 0.89 │\n", + "│ complex │ 1 │ 7a │ 0.59 │ 0.69 │\n", + "│ solvent │ 1 │ 7a │ -1.1 │ 1.4 │\n", + "│ solvent │ 1 │ 7a │ -0.7 │ 1.4 │\n", + "│ solvent │ 1 │ 7a │ -0.8 │ 1.4 │\n", + "│ standard_state_… │ 1 │ 7a │ -9.1 │ 0.0 │\n", + "│ standard_state_… │ 1 │ 7a │ -9.2 │ 0.0 │\n", + "│ standard_state_… │ 1 │ 7a │ -9.1 │ 0.0 │\n", + "│ standard_state_… │ 1 │ 7a │ 9.0 │ 0.0 │\n", + "│ standard_state_… │ 1 │ 7a │ 9.0 │ 0.0 │\n", + "│ standard_state_… │ 1 │ 7a │ 9.0 │ 0.0 │\n", + "│ complex │ 1 │ 7b │ 0.39 │ 0.73 │\n", + "│ complex │ 1 │ 7b │ 0.82 │ 0.78 │\n", + "│ solvent │ 1 │ 7b │ -1.3 │ 1.3 │\n", + "│ solvent │ 1 │ 7b │ -0.8 │ 1.4 │\n", + "│ standard_state_… │ 1 │ 7b │ -9.3 │ 0.0 │\n", + "│ standard_state_… │ 1 │ 7b │ -9.3 │ 0.0 │\n", + "│ standard_state_… │ 1 │ 7b │ 9.4 │ 0.0 │\n", + "│ standard_state_… │ 1 │ 7b │ 9.3 │ 0.0 │\n", + "│ complex │ 7a │ 7b │ -0.64 │ 0.53 │\n", + "│ complex │ 7a │ 7b │ -1.53 │ 0.78 │\n", + "│ complex │ 7a │ 7b │ 3.74 │ 0.63 │\n", + "│ solvent │ 7a │ 7b │ -1.0 │ 1.4 │\n", + "│ solvent │ 7a │ 7b │ -1.3 │ 1.5 │\n", + "│ solvent │ 7a │ 7b │ -1.2 │ 1.4 │\n", + "│ standard_state_… │ 7a │ 7b │ -9.0 │ 0.0 │\n", + "│ standard_state_… │ 7a │ 7b │ -9.1 │ 0.0 │\n", + "│ standard_state_… │ 7a │ 7b │ -9.2 │ 0.0 │\n", + "│ standard_state_… │ 7a │ 7b │ 9.4 │ 0.0 │\n", + "│ standard_state_… │ 7a │ 7b │ 8.9 │ 0.0 │\n", + "│ standard_state_… │ 7a │ 7b │ 9.2 │ 0.0 │\n", + "└──────────────────┴──────────┴──────────┴──────────────────┴──────────────────┘\n" + ] + } + ], + "source": [ + "# raw per-leg (complex, solvent, and Boresch-restraint analytical correction) values\n", + "!openfe gather-septop septop_results/current --report raw" + ] + }, + { + "cell_type": "markdown", + "id": "199bca00-5fa2-4430-9d07-e30cf9995aac", + "metadata": {}, + "source": [ + "## Analysing results with the Python API\n", + "\n", + "For more control over how results are combined and analysed, you can work with\n", + "the result JSONs directly in Python, as shown in the rest of this notebook." + ] + }, { "cell_type": "markdown", "id": "7797cad5-08c2-404b-b5c4-cffd0df12d46", @@ -77,7 +220,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 5, "id": "7fbf1482-25ca-427b-a881-af88a983461c", "metadata": {}, "outputs": [], @@ -110,7 +253,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 6, "id": "768e3c9a-a09d-4817-aa25-21c8809b263e", "metadata": {}, "outputs": [], @@ -144,7 +287,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 7, "id": "c185164a-f1c6-483b-b013-f4d499889570", "metadata": {}, "outputs": [], @@ -190,7 +333,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 8, "id": "3733c540-de62-45a0-ba66-268397a38b49", "metadata": {}, "outputs": [], @@ -264,7 +407,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 9, "id": "cf88e4e4-7565-4248-8213-cdb4a3856385", "metadata": {}, "outputs": [], @@ -304,7 +447,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 10, "id": "e025eb3c-dc67-4170-afbe-0923b2cff0b4", "metadata": {}, "outputs": [], @@ -335,7 +478,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 11, "id": "411fe035-2ae2-4f98-9bab-19764af724ce", "metadata": {}, "outputs": [], @@ -377,7 +520,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 12, "id": "213f1c7b-185f-403b-a98c-22d31a5e60e5", "metadata": {}, "outputs": [], @@ -425,7 +568,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 13, "id": "76ced921-9d12-40c1-b95e-57430ea84778", "metadata": {}, "outputs": [], @@ -489,28 +632,10 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 14, "id": "3b81c26b-4e3d-4bca-bfb1-4f72c75ec1bf", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/joshua/mambaforge/envs/openfe_dev/lib/python3.12/site-packages/openmoltools/utils.py:9: UserWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html. The pkg_resources package is slated for removal as early as 2025-11-30. Refrain from using this package or pin to Setuptools<81.\n", - " from pkg_resources import resource_filename\n", - "/Users/joshua/mambaforge/envs/openfe_dev/lib/python3.12/site-packages/Bio/Application/__init__.py:39: BiopythonDeprecationWarning: The Bio.Application modules and modules relying on it have been deprecated.\n", - "\n", - "Due to the on going maintenance burden of keeping command line application\n", - "wrappers up to date, we have decided to deprecate and eventually remove these\n", - "modules.\n", - "\n", - "We instead now recommend building your command line and invoking it directly\n", - "with the subprocess module.\n", - " warnings.warn(\n" - ] - } - ], + "outputs": [], "source": [ "# Specify paths to result directories\n", "results_dir = [pathlib.Path(\"septop_results/current/\")]\n", @@ -531,7 +656,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 15, "id": "46996a74-709c-41f2-ac39-0f77fb33371e", "metadata": {}, "outputs": [], @@ -542,7 +667,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 16, "id": "b2b6fdf0", "metadata": {}, "outputs": [ @@ -614,7 +739,7 @@ "3 7a 7b 1.8 1.6" ] }, - "execution_count": 13, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -637,7 +762,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 17, "id": "22e25226-0073-40a4-9cbc-da802a29fc25", "metadata": {}, "outputs": [], @@ -648,7 +773,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 18, "id": "cda55931", "metadata": {}, "outputs": [ @@ -715,7 +840,7 @@ "3 7b 1.366667 0.932291" ] }, - "execution_count": 15, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -737,7 +862,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 19, "id": "8b2c1dd8-ffa3-4585-94a7-4a1ed1454f30", "metadata": {}, "outputs": [], @@ -748,7 +873,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 20, "id": "08b72901-9c71-460b-b5da-9fb4a35e07f7", "metadata": {}, "outputs": [ @@ -1151,7 +1276,7 @@ "35 0.0 " ] }, - "execution_count": 17, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } @@ -1163,7 +1288,7 @@ ], "metadata": { "kernelspec": { - "display_name": "openfe_dev", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -1177,7 +1302,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.9" + "version": "3.13.11" }, "widgets": { "application/vnd.jupyter.widget-state+json": {