{ "cells": [ { "cell_type": "markdown", "id": "035c0099-6892-4ed2-b0d6-80b1c247c1e7", "metadata": {}, "source": [ "# Planning a Ligand Network" ] }, { "cell_type": "markdown", "id": "5da95fa6-c9a7-48a2-9d8e-e35b3b6818f6", "metadata": {}, "source": [ "A [Ligand Network] is a graph of transformations between small molecules, typically such that every small molecule can reach every other small molecule via a series of transformations. This eventually forms the graph of the free energy campaign. A `LigandNetwork` can be generated from a collection of `SmallMoleculeComponent` instances by optimising over possible networks according to some criteria; in OpenFE, this involves combining a network generating strategy with a scoring function for individual mappings.\n", "\n", "[Ligand Network]: https://docs.openfree.energy/en/stable/reference/api/generated/openfe.setup.LigandNetwork.html" ] }, { "cell_type": "markdown", "id": "27106bff-dbcf-49ee-b119-2c0f15305618", "metadata": {}, "source": [ "## Setup" ] }, { "cell_type": "code", "execution_count": 1, "id": "f8f4ce1e-98e9-4c9b-98d3-aea1d21e0c12", "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "\n", "from rdkit import Chem\n", "from openmm import unit\n", "\n", "import openfe" ] }, { "cell_type": "markdown", "id": "7f1a272a-ffe7-4397-a8a6-c590d3a210bc", "metadata": {}, "source": [ "This cookbook assumes you've already loaded a collection of `SmallMoleculeComponent` objects into an iterable called `ligands`. For more information, see [Loading Small Molecules]:\n", "\n", "[Loading Small Molecules]: https://docs.openfree.energy/en/stable/cookbook/loading_molecules.html#loading-small-molecules" ] }, { "cell_type": "code", "execution_count": 2, "id": "80072b52-ded4-4b38-a5c2-72b87d483f53", "metadata": {}, "outputs": [], "source": [ "ligands = [\n", " openfe.SmallMoleculeComponent(mol) \n", " for mol in Chem.SDMolSupplier(\n", " \"assets/somebenzenes.sdf\", \n", " removeHs=False,\n", " )\n", "]" ] }, { "cell_type": "markdown", "id": "7096ed4e-1f5a-4df1-8566-e73fe8b81c00", "metadata": {}, "source": [ "## Choose an atom mapper" ] }, { "cell_type": "markdown", "id": "020cf05c-7bcc-4b10-9ba5-f4ded80d2d66", "metadata": {}, "source": [ "An atom mapper produces mappings between two given ligands. Atom mapper classes inherit from [LigandAtomMapper]. Each atom mapper suggests one or more mappings, which can be scored seperately. As a result, multiple atom mappers can be used to generate additional mappings for network planning.\n", "\n", "[LigandAtomMapper]: https://docs.openfree.energy/en/stable/reference/api/generated/openfe.setup.atom_mapping.LigandAtomMapper.html" ] }, { "cell_type": "code", "execution_count": 3, "id": "5019c471-a173-4097-b6c8-b42bfb701e03", "metadata": {}, "outputs": [], "source": [ "mappers = [\n", " openfe.setup.LomapAtomMapper(\n", " time=20, # Time out if MCS algorithm takes 20 seconds\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=True, # Allow mappings that change an atoms element\n", " seed='', # Empty SMARTS string causes MCS search to start from scratch\n", " shift=False, # Keep pre-aligned atom positions for 3D position checks\n", " ),\n", " # openfe.setup.PersesAtomMapper(\n", " # allow_ring_breaking=True, # Propose mappings that break cyclic systems\n", " # preserve_chirality=True, # Forbid mappings that change stereochemistry\n", " # use_positions=True, # Use atom positions rather than MCS to choose mappings\n", " # coordinate_tolerance=0.25 * unit.angstrom, # Forbid mappings between distant atoms\n", " # ),\n", "]" ] }, { "cell_type": "markdown", "id": "409a3866-a5ac-4295-b91f-3101dd646dc9", "metadata": {}, "source": [ "## Choose a scoring function" ] }, { "cell_type": "markdown", "id": "5998c002-4d39-42c0-b37f-bd0357f27fe6", "metadata": {}, "source": [ "Many ligand network planners require some way to score each possible network so that the optimal network can be identified. OpenFE scores networks by the quality of the mappings between ligands - transformations that are expected to converge quickly without introducing artifacts are scored highly, and more drastic or risky alchemy is penalised. A scoring function is a function that takes an atom mapping and returns a float between 0.0 and 1.0, with higher numbers representing better maps." ] }, { "cell_type": "code", "execution_count": 4, "id": "3bbf3f5b-9e29-467f-aff8-07e8dad7fd4c", "metadata": {}, "outputs": [], "source": [ "# The product of other LOMAP scorers\n", "scorer = openfe.lomap_scorers.default_lomap_score \n", "\n", "# # The default PERSES scoring function\n", "# scorer = openfe.perses_scorers.default_perses_score \n", "\n", "# # Or define your own scoring function\n", "# scorer = lambda m: (\n", "# openfe.lomap_scorers.default_lomap_score(m) \n", "# * openfe.perses_scorers.default_perses_scorer(m)\n", "# )" ] }, { "cell_type": "markdown", "id": "c8c40d49-9657-4691-b6b3-d3c133e215d2", "metadata": {}, "source": [ "## Plan the network" ] }, { "cell_type": "markdown", "id": "10232f7b-7aac-4773-8c39-15f672a654b5", "metadata": {}, "source": [ "Finally, pass the ligands, mapper and scorer to a planner to generate the network. A planner takes these three arguments (and perhaps some more) and returns a `LigandNetwork`. Each planner implements a particular strategy for structuring a network. Different strategies may balance the precision-performance trade-off differently, provide edge redundancy for troubleshooting, or be more or less appropriate for a given set of ligands:" ] }, { "cell_type": "code", "execution_count": 5, "id": "9492e2e7-33df-449e-9bd1-847ff52d2029", "metadata": {}, "outputs": [], "source": [ "# Choose the network that minimises the sum of scores\n", "ligand_network = openfe.ligand_network_planning.generate_minimal_spanning_network(\n", " ligands=ligands,\n", " mappers=mappers,\n", " scorer=scorer,\n", ")\n", "\n", "# # Choose the lomap network that adds some closed ligand cycles\n", "# ligand_network = openfe.ligand_network_planning.generate_lomap_network(\n", "# molecules=ligands,\n", "# mappers=mappers,\n", "# scorer=scorer,\n", "# )\n", "\n", "# # Connect each ligand to a central ligand\n", "# ligand_network = openfe.ligand_network_planning.generate_radial_network(\n", "# ligands=ligands[1:],\n", "# central_ligand=ligands[0],\n", "# mappers=mappers,\n", "# scorer=scorer,\n", "# )" ] }, { "cell_type": "markdown", "id": "6c2f585e-d609-440a-9498-2affc2badc5c", "metadata": {}, "source": [ "## Visualize" ] }, { "cell_type": "markdown", "id": "59727251-0644-4768-9d68-50edc37f501d", "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": 6, "id": "92e0b934-8494-41f4-a0ad-0d0b01b3a8f9", "metadata": {}, "outputs": [ { "data": { "image/png": "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gAAAZLIZM2bo2rVrqlKlipo3b251HLggCiAAAJnoypUrmjVrliRG/2AdCiAAAJlo1qxZCgsL00MPPaTAwECr48BFUQABAMgkoaGhev/99yWZ0T83N34Nwxr8lwcAQCaZPXu2/v33X1WsWFGtW7e2Og5cGAUQAIBMEBYWpunTp0uSxowZw+gfLMV/fQAAZIK5c+fqypUrKl++vNq2bWt1HLg4CiAAABns2rVrmjZtmiRp9OjRcnd3tzgRXB0FEACADPbBBx/o8uXLKlOmjNq3b291HIACCABARrp+/bree+89SWb0z8PDw+JEAAUQAIAMNX/+fF26dEmlSpXSCy+8YHUcQBIFEACADBMeHq4pU6ZIkkaNGsXoH5wGBRAAgAyyYMEChYSE6IEHHlDnzp2tjgPcRgEEACADREREaPLkyZKkN954Q56enhYnAuJQAAEAyAAff/yxLl68qBIlSqhr165WxwESoAACAJDObty4oXfffVeSNHLkSHl5eVmcCEiIAggAQDr75JNPdP78ed13333q3r271XGAu1AAAQBIRzdv3tSkSZMkSa+//rpy5MhhcSLgbhRAAADS0eLFi3X27FkVLVpUL730ktVxgERRAAEASCeRkZGaOHGiJGnEiBHKmTOnxYmAxFEAAQBIJ0uXLtXp06dVpEgR9erVy+o4QJIogAAApINbt27dHv177bXXlCtXLosTAUmjAAIAkA6WL1+ukydPqlChQnr55ZetjgMkiwIIAMA9ioqK0oQJEyRJw4cPl7e3t8WJgORRAAEAuEcrV67U77//rgIFCqhv375WxwFSRAEEAOAeREdHa/z48ZKkYcOGycfHx+JEQMoogAAA3INVq1bpxIkTyp8/v1555RWr4wAOoQACAJBG8Uf/hg4dKl9fX4sTAY6hAAIAkEafffaZjh07prx586p///5WxwEcRgEEACANYmJiNG7cOEnSkCFD5OfnZ3EiwHEUQAAA0mDdunU6evSo/P39NXDgQKvjAKlCAQQAIJXij/4NHjxY/v7+FicCUocCCABAKgUFBenIkSPy8/PToEGDrI4DpBoFEACAVLDb7Ro7dqwkaeDAgcqbN6/FiYDUowACAJAKX3zxhX7++Wf5+vpq8ODBVscB0oQCCACAg+x2u9555x1J0oABA5Q/f36LEwFpQwEEAMBBmzZt0qFDh+Tj46OhQ4da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w4ctTgQ4L6cugJcvm1G50aPNodkKFaRUnM0kSWXLSkOGSFu3mhPALlpkHq9YUfrPfxI+97vvzPMTm05Svbp08aKZa1i6dMJbgQL3nhMAkDrvvvuuGjVqpPDwcAUGBury5ctWRwKcklMXwLx5zeHVBQvMnL4dO8wh3LSKiDCXkdq1S/rzT2nPHmn/flMsJbPaNzhYGjfOLOJYssRcSmrYsMT317ChWW0cGCht2WJWJX/3nSmsBw6kPScAIG08PDy0atUqPfjggzp58qQ6dOiQYVe0AbIypy6Abm7SqlVmrt1DD5lRu6lT074/d3czqti1qxnVa9dOevZZs3BEMiN6a9aY93zoIbPieOzYpC/3ZbOZ1b9160o9eph9duhgimDhwmnPCQBIu3z58ikoKEje3t7avn27Xn/9dasjAU4n218KDgDgmtauXau2bdtKkpYvX65OnTpZnAjIWKnpa049AggAQFq1adNGo0aNkiT17NlTBw8etDgR4DwogACAbOudd95Rs2bNdOPGDbVs2VIhISFWRwKcAgUQAJBtubu7a8WKFSpbtqzOnDmjtm3b6tatW1bHAixHAQQAZGv+/v7auHGjcufOrd27d2vIkCFWRwIsRwEEAGR75cuX14oVKyRJc+fO1cKFCy1OBFiLAggAcAnPP/+8xo4dK0nq16+f9u7da3EiwDoUQACAyxg1apRatWqlyMhItW7dWufPn7c6EmAJCiAAwGW4ublp8eLFqlSpki5cuKDWrVvr5s2bVscCMh0FEADgUnLnzq2NGzcqT5482rdvn/r16ycHrokAZCsUQACAyylVqpRWrVolNzc3ffLJJ5o3b57VkYBMRQEEALikxo0b691335UkDRo0SLt377Y4EZB5KIAAAJc1bNgwdezYUVFRUWrTpo1Onz5tdSQgU1AAAQAuy2az6eOPP1bVqlV16dIltWzZUhEREVbHAjIcBRAA4NK8vb0VFBSkAgUK6NChQ+rVqxeLQpDtUQABAC7v/vvv12effXb72sEzZsywOhKQoSiAAABIqlev3u3iN3z4cG3bts3iREDGoQACAPA//fv3V/fu3RUTE6P27dvrjz/+sDoSkCEogAAA/I/NZtMHH3ygmjVr6sqVKwoMDNS1a9esjgWkOwogAADx5MyZU+vXr1eRIkV05MgRde/enUUhyHYogAAA3KFYsWJat26d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", "text/plain": [ "
" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from openfe.utils.atommapping_network_plotting import plot_atommapping_network\n", "\n", "plot_atommapping_network(ligand_network)" ] } ], "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.11.6" }, "widgets": { "application/vnd.jupyter.widget-state+json": { "state": {}, "version_major": 2, "version_minor": 0 } } }, "nbformat": 4, "nbformat_minor": 5 }