{ "cells": [ { "cell_type": "markdown", "id": "bf739d70-3249-42b3-a352-8a41f8f8c667", "metadata": {}, "source": [ "# Explicitly Defining Ligand Networks" ] }, { "cell_type": "markdown", "id": "f9ad85a0-a3b2-4e95-9784-0a88ba790683", "metadata": {}, "source": [ "OpenFE provides utilities for ingesting networks from ordinary Python datastructures like `list[tuple[str, str]]` and `list[tuple[int, int]]`.\n", "\n", "Each string or integer respectively names or indexes a ligand, and tuples represent edges in the network.\n", "\n", "This explicit definition of networks supports use-cases where the desired edges are known and may be helpful for loading networks from other tools.\n", "\n", "Although this is the most flexible way to define a ``LigandNetwork``, we encourage you to use **openfe** helper functionality when possible for performance, reproducibility, and ease of use:\n", "\n", " - [Loading Ligand Networks Exported by Orion or FEP+](https://docs.openfree.energy/en/stable/cookbook/network_from_orion_fepp.html)\n", " - [Planning a Ligand Network](https://docs.openfree.energy/en/stable/cookbook/generate_ligand_network.html)\n" ] }, { "cell_type": "markdown", "id": "de32be93-e8d7-40dd-a043-4920a6e9c3ef", "metadata": {}, "source": [ "## Load the ligands" ] }, { "cell_type": "markdown", "id": "39e64f74-337e-4a88-b253-ab051820d5e3", "metadata": {}, "source": [ "This cookbook assumes you've already loaded a collection of `SmallMoleculeComponent` objects into an iterable called `ligands`.\n", "\n", "For more information, see [Loading Small Molecules](https://docs.openfree.energy/en/stable/cookbook/loading_molecules.html#loading-small-molecules)." ] }, { "cell_type": "code", "execution_count": 1, "id": "2ef27845-2a17-45fc-ac54-20e75055a7a2", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[SmallMoleculeComponent(name=benzene),\n", " SmallMoleculeComponent(name=toluene),\n", " SmallMoleculeComponent(name=phenol),\n", " SmallMoleculeComponent(name=benzonitrile),\n", " SmallMoleculeComponent(name=anisole),\n", " SmallMoleculeComponent(name=benzaldehyde),\n", " SmallMoleculeComponent(name=styrene)]" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%matplotlib inline\n", "from rdkit import Chem\n", "import openfe\n", "\n", "supplier = Chem.SDMolSupplier(\"assets/somebenzenes.sdf\", removeHs=False)\n", "ligands = [openfe.SmallMoleculeComponent(mol) for mol in supplier]\n", "\n", "ligands" ] }, { "cell_type": "markdown", "id": "12cac638-06bd-456e-b82f-a88e016211fa", "metadata": {}, "source": [ "## Select an atom mapper" ] }, { "cell_type": "markdown", "id": "31872d6f-028f-4974-9724-2f4654a7b914", "metadata": {}, "source": [ "As we will only specify the topology of the network, OpenFE must generate atom mappings for us. For this, it needs an atom mapper; for more information, see [Choose an Atom Mapper]:\n", "\n", "[Choose an Atom Mapper]: https://docs.openfree.energy/en/stable/cookbook/generate_ligand_network.html#Choose-an-atom-mapper" ] }, { "cell_type": "code", "execution_count": 2, "id": "d2de6fcb-9a9b-44c4-8ad3-f98ec3de5638", "metadata": {}, "outputs": [], "source": [ "mapper = openfe.setup.LomapAtomMapper(\n", " threed=True, # Use atom positions to prune symmetric mappings\n", " max3d=1.0, # Forbid mapping between atoms more than 1.0 Å apart\n", " element_change=False, # Forbid mappings that change an atoms element\n", ")" ] }, { "cell_type": "markdown", "id": "d5ede560-0108-479d-9bc0-20d53fbd81af", "metadata": {}, "source": [ "## Define the network" ] }, { "cell_type": "markdown", "id": "36879503-f8ef-4743-9acd-b07910492613", "metadata": {}, "source": [ "We can inspect the ligands to identify what we're working with:" ] }, { "cell_type": "code", "execution_count": 3, "id": "b9372340-327f-4451-9399-21fd01afc967", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(0, SmallMoleculeComponent(name=benzene))\n", "(1, SmallMoleculeComponent(name=toluene))\n", "(2, SmallMoleculeComponent(name=phenol))\n", "(3, SmallMoleculeComponent(name=benzonitrile))\n", "(4, SmallMoleculeComponent(name=anisole))\n", "(5, SmallMoleculeComponent(name=benzaldehyde))\n", "(6, SmallMoleculeComponent(name=styrene))\n" ] } ], "source": [ "print(*enumerate(ligands), sep=\"\\n\")" ] }, { "cell_type": "markdown", "id": "300c7ebf-63e5-46f3-a53c-398dd75c0adb", "metadata": {}, "source": [ "Then, define the network topology by specifying transformations between ligands, either by name or index:" ] }, { "cell_type": "code", "execution_count": 4, "id": "aedd67c5-db74-48c1-afe4-bacfec0b2ca3", "metadata": {}, "outputs": [], "source": [ "topology_by_names = [\n", " (\"styrene\", \"toluene\"),\n", " (\"benzonitrile\", \"toluene\"),\n", " (\"toluene\", \"benzene\"),\n", " (\"benzene\", \"phenol\"),\n", " (\"phenol\", \"anisole\"),\n", " (\"phenol\", \"benzaldehyde\"),\n", "]\n", "\n", "topology_by_indices = [\n", " (6, 1),\n", " (3, 1),\n", " (1, 0),\n", " (0, 2),\n", " (2, 4),\n", " (2, 5),\n", "]" ] }, { "cell_type": "markdown", "id": "3691c205-ce7d-4bc8-8b92-41f535b87249", "metadata": {}, "source": [ "## Create the network" ] }, { "cell_type": "code", "execution_count": 5, "id": "ca2db32b-48e9-4abc-8dd3-f77cce78397e", "metadata": {}, "outputs": [], "source": [ "from openfe.setup import ligand_network_planning" ] }, { "cell_type": "markdown", "id": "9049e97f-0fdb-4196-808a-8c2fdd8e3576", "metadata": {}, "source": [ "Now create the `LigandNetwork` object from the specified edges:" ] }, { "cell_type": "code", "execution_count": 6, "id": "9c3e1d23-3333-4b2c-b687-561f63b3267e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "parallel map scoring\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/Users/atravitz/micromamba/envs/openfe-notebooks/lib/python3.13/site-packages/gufe/components/explicitmoleculecomponent.py:74: UserWarning: RDKit does not preserve Mol properties when pickled by default, which may drop e.g. atom charges; consider setting `Chem.SetDefaultPickleProperties(Chem.PropertyPickleOptions.AllProps)`\n", " warnings.warn(\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "parallel map scoring\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/Users/atravitz/micromamba/envs/openfe-notebooks/lib/python3.13/site-packages/gufe/components/explicitmoleculecomponent.py:74: UserWarning: RDKit does not preserve Mol properties when pickled by default, which may drop e.g. atom charges; consider setting `Chem.SetDefaultPickleProperties(Chem.PropertyPickleOptions.AllProps)`\n", " warnings.warn(\n", "/Users/atravitz/micromamba/envs/openfe-notebooks/lib/python3.13/site-packages/gufe/components/explicitmoleculecomponent.py:74: UserWarning: RDKit does not preserve Mol properties when pickled by default, which may drop e.g. atom charges; consider setting `Chem.SetDefaultPickleProperties(Chem.PropertyPickleOptions.AllProps)`\n", " warnings.warn(\n" ] } ], "source": [ "ligand_network_from_names = ligand_network_planning.generate_network_from_names(\n", " ligands=ligands,\n", " mapper=mapper,\n", " names=topology_by_names,\n", ")\n", "\n", "ligand_network_from_indices = ligand_network_planning.generate_network_from_indices(\n", " ligands=ligands,\n", " mapper=mapper,\n", " indices=topology_by_indices,\n", ")" ] }, { "cell_type": "markdown", "id": "a972611d-9784-4716-a2f3-fbe85cee9e94", "metadata": {}, "source": [ "## Visualise the network" ] }, { "cell_type": "markdown", "id": "43b339d9-e18a-4dab-9a44-395adbb25624", "metadata": {}, "source": [ "For more ways to visualize a `LigandNetwork`, see [Visualizing Ligand Networks].\n", "\n", "[Visualizing Ligand Networks]: https://docs.openfree.energy/en/stable/cookbook/ligandnetwork_vis.html" ] }, { "cell_type": "code", "execution_count": 7, "id": "c7d84328-f3b6-4330-a078-03ddccf60718", "metadata": {}, "outputs": [ { "data": { "image/png": "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YUZ4AZAj7733niZPnqz169dr5cqV9CaAsCO8AMi2ZcuWqYcdViQ5ZaMqdsoiAIQZ4QVAtqSmpuqmm27Szp07Va9ePXW3ExYBIAIILwCypU+fPpoxY4YSExP1wQcfKDbY0w0BIIf42wZAli1YsEC9evVyrvv27atKlSrRiwAihvACIEv27dunTp06OffNmjXTLbfcQg8CiCjCC4AseeaZZ/Trr7+qZMmSGjhwoGJiYuhBABFFeAEQtFmzZh3YjO7dd99VmTJl6D0AEUd4ARCUXbt2OeWitLQ0dejQQS1btqTnAHiC8AIgKA8//LCWLFmik046SW+++Sa9BsAzhBcAx/XVV1/prbfecq7ff/99FS9enF4D4BnCC4Bj2rp164EVRXfddZeuuuoqegyApwgvAI7Jds79+++/ddppp+mVV16htwB4jvAC4KjGjx+vDz/80Nk91+4LFy5MbwHwHOEFwBGtW7dOt99++4HJupdccgk9BcAXCC8ADpOenu4El40bN+rcc8/Vk08+SS8B8A3CC4DDDB06VJ9++qkSEhI0bNgw5c+fn14C4BuEFwAHWbFihTNJN3AUgI28AICfEF4AHGC759qy6OTkZNWuXVsPPvggvQPAdwgvAA6wjei+/fZbFSpUyCkdxcXF0TsAfIfwAsCxePFiZ1WRee2115x9XQDAjwgvAJSSkuIcurhnzx41atRId9xxB70CwLcILwD04osvavbs2SpWrJgGDx6smJgYegWAbxFegDxu7ty5zqoi079/f+fUaADwM8ILkIdZmcjKRVY2atWqldq1a+d1kwDguAgvQB7Wq1cvLVy4UKVLl9Y777xDuQhAVCC8AHnUd999pz59+jjXgwYNUqlSpbxuEgAEhfAC5EHbt2/XTTfd5Jxh1KVLF11zzTVeNwkAgkZ4AfKgHj16aPny5apUqdKB0RcAiBaEFyCP+e9//+uUiWw59AcffKCiRYt63SQAyBLCC5CHbNq0SV27dnWu77//ftWrV8/rJgFAlhFegDzC5rfceeedWrt2rapVq6bnn3/e6yYBQLYQXoA8YuTIkRozZozi4+M1bNgwFShQwOsmAUC2EF6APGD16tXq1q2bc/3444/rggsu8LpJAJBthBcglwssh96yZYtq1qypRx991OsmAUCOEF6AXO7dd9/VlClTnDLRhx9+qISEBK+bBAA5QngBcrGlS5fqgQceOHBytE3UBYBoR3gBcqnU1FTdfPPN2rVrl+rXr697773X6yYBQEgQXoBcqnfv3poxY4YSExOdzehiY/nfHUDuwN9mQC60YMECZ1WReeONN1SxYkWvmwQAIUN4AXKZffv2qWPHjs79tdde65SOACA3IbwAuczTTz+tefPmqVSpUho4cKBzhhEA5CaEFyAXmTlzpl566SXnesCAASpdurTXTQKAkCO8ALnEzp07ddNNNyktLU033nijWrZs6XWTACAsCC9ALvHwww9ryZIlOumkk/Tmm2963RwACBvCC5ALTJ06Vf3793eu33//fRUrVszrJgFA2BBegChnZxbdcsstzrUdvnjVVVd53SQACCvCCxDlbOdcOzW6SpUqevnll71uDgCEHeEFiGLjxo3TRx995Oyea4cuFi5c2OsmAUDYEV6AKLVu3TrdfvvtzvUjjzyiWrVqed0kAIgIwgsQhdLT03Xrrbdq06ZNql69up588kmvmwQAEUN4AaKQHbQ4ceJE5cuXzykX2T0A5BWEFyDKrFixQt27d3eun3nmGZ177rleNwkAIorwAkQR2z3XDlrcvn27ateurZ49e3rdJACIOMILEEX69eunadOmOauKrFwUFxfndZMAIOIIL0CUWLRokR599FHn+rXXXtOpp57qdZMAwBOEFyAK7N+/X506ddKePXvUqFGjA0ukASAvIrwAUeDFF1/UnDlznDOLBg8erJiYGK+bBACeIbwAPjd37lw9++yzzvXbb7/tnBoNAHkZ4QXwsd27d6tjx45KSUlR69atdcMNN3jdJADwHOEF8LFevXo5E3XLlCnjjLpQLgIAwgvgW9OnT9frr7/uXA8aNEilSpXyukkA4AuMvAA+lJyc7GxGZ2cYde3aVU2bNvW6SQDgG4QXwId69Oih5cuXq1KlSurTp4/XzQEAXyG8AD7z+eefH1gOPXToUCUmJnrdJADwFcIL4CMbN250ykSB0Ze6det63SQA8B3CC+ATNr/lzjvv1Lp163TmmWfqueee87pJAOBLhBfAJ0aMGKGxY8cqPj7eOXSxQIECXjcJAHyJ8AL4wOrVq9WtWzfn+vHHH9cFF1zgdZMAwLcIL4APykWdO3fW1q1bdeGFFx44ORoAcGSEF8BjAwYM0JdffumUiaxclJCQ4HWTAMDXCC+Ah5YuXaqePXs61y+9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", "text/plain": [ "
" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from openfe.utils.atommapping_network_plotting import plot_atommapping_network\n", "\n", "plot_atommapping_network(ligand_network_from_names)" ] } ], "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.11" }, "widgets": { "application/vnd.jupyter.widget-state+json": { "state": {}, "version_major": 2, "version_minor": 0 } } }, "nbformat": 4, "nbformat_minor": 5 }