{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Automated Ligand Design Pipeline\n", "\n", "> ### In this tutorial we will cover:\n", "> - how we can use BuildAMol to randomly assemble fragments from a library into larger molecules\n", "> - how we can use BuildAMol in an automated ligand design framework" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Automated design for protein ligands is a very active field of research. Many dedicated software solutions exist, leveraging machine learning, deep learning, fragment-based assembly, graph-based, SMILES-based, diffusion-based, and all kinds of techniques in order to produce structures of small molecules that hopefully bind a specific protein target. \n", "\n", "BuildAmol can be used in automated setups to generate molecules. However, it is not designed to perform any kind of analysis on proteins and alike. In this tutorial we will develop a pipeline that will use BuildAmol to generate molecular candidate structures and then forwards these to the library `dockstring`[https://github.com/dockstring/dockstring/tree/main] which will evaluate the docking potential of a given candidate.\n", "Using these two primary tools we will make a simple ligand-design system.\n", "\n", "As a disclaimer at the start, this tutorial does **not** produce a fully-fledged production ready ligand-design tool! It merely provides some insight and inspiration of how one might use BuildAMol in such a context! Nothing that we will be developing in this tutorial is extensively tested or optimized for performance, so keep this in mind while following along. Actually, since dockstring only works with SMILES the whole code will technically perform a bunch of conversions back-and-forth that would be totally unnecessary, but that's just a side note..." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import buildamol as bam\n", "import numpy as np" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Getting a fragment library\n", "Ligands are assembled from fragments such as individual benzene rings or ethanol in hopes of finding a combination of fragments that will suite the requirements. In this tutorial we will load a fragment library that was prepared in BuildAMol before. If you are curious how that was done, check out the \"Fragment Library\" tutorial in the documentation! " ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "201" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "library = bam.read_compounds(\"./files/fragments.json\")\n", "len(library)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Great! So we have loaded a small fragment library of 96 fragments. Let's look at one of them:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "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r169kiVLfnyZ3MbGpk6dOitWrEhOTtbkBQMCAkqWLElEpqama9asye36AQqtlStXlitXTiTvp0+f2tnZnT17VjzUrl27ESNGiOMtW7a4u7tHRkYyc2hoqIODw7Fjx8RD3bt3HzJkiDjevn17iRIl3r17l8FXFF8rLi7OwsJCvAW3Z88eX19f8ejBgwffvHmT498mAEgCwR0gv3jw4MGcOXPatWtXo0YNZ2fnT97EVKFQlChRon379teuXcvq6797965nz57idTp37hweHp4L3wRAIfX69WtxBZ2Ze/bs+d1334nj/fv3u7i4vH37lpnfvn1brFixvXv3iof69ev39ddfi+ODBw86OzuLt87Cw8Pd3Nx27dolHvr222+7dOmSaQHR0dFbtmwRx3379l2wYAEzJyUlWVtb//fff8x84cKFdevW5dC3CwDSQHAHkExMTMzJkydHjRrVrFmzD3pgPmZkZOTp6TlixIgvDNyrV682MTEhIldX13///TeHvhWAwu7IkSPOzs6vXr1i5qioqFKlSu3cuVM8NHjw4E6dOonjU6dO2dvbP3/+nJmjo6M9PDzWr18vHvrxxx/bt28vji9cuGBjYyMCd1xcXMWKFVevXq15Md26dROtMocOHfL29hYnBw4cOHPmTGZOSUlp2rSpuNiflJT0hd84AOQlBHeAPPXy5ctNmzb169fPx8enePHimmwVtbW19fHx2bhxo1KpzJEa7ty54+npSUQ6Ojrjx49PSUnJkZcFKJxEAmbmkSNHtmjRQvx3GhAQYGNj8+jRI2aOj4+vVKnSihUrxLJffvmlSZMm4r+7a9eu2draPnz4kJkTExNr1KixePFisWzSpEn16tUTvXA3btywtra+c+dOVmsbNGjQrFmzmDklJcXe3j44OJiZT58+XbFiRbFg+PDh8+bNE8fZeH0AyGMI7gC57sGDB/PmzevcubPogdHS0mgMq5aWVsmSJbt37y7+Uc9ZiYmJ48ePF5U0bNjw2bNnOf4lAAqDt2/fOjo63r9/n5kTExO9vb1FjwozT5s2rU6dOiJ537x509ra+vbt28yclJTk4+Mze/Zssey3336rVq1aYmIiMwcHB1tbW1+5coUz3NuquaioKNEf/88//1SuXFmcHDZs2MSJE8Vx8eLFRd/d5cuX3dzcxMnjx48/fvw4uz8SAMhFCO4AOS8xMfHC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YatWrYiof//+CoVixYoVRHTo0KEBAwYEBQUVLVo0JiZGX18f02MACqFy5ejWLapYka5elboUmcCVJACA93ww6L1y5coHDx6Uuqj8LjY2NjAwkIhatGjRunVrcXNTCwuLtWvX+vn5vXjxgogWLFjw77//iu2/TZs27dKlizg2NjZGagcohJKT6cEDIqISJaQuRT5wxR0A4NOePn3aq1evf/75R6FQ/PDDD7Nnz9bT05O6qHwqMDCwVatWFy9edHZ2TkhIqFGjxpAhQ/r3709Ev/7664ULF/z9/bW0tK5fv964ceNz5865ubkplUq0IQEUZlu2UNeuRERLl5Kfn9TVyASCOwDAZzHz/PnzR44cmZSUVK1atQ0bNpQsWVLqovKXmJgYY2NjIpoxY8aBAwdOnDihra1969YtX1/fU6dOeXh4JCcn+/r6tmvXTnSxL1iwwMzMrG/fvlIXDgBSSk6mGjXo8mWytqaQEDI2lrogmUBwBwDIREBAQPfu3R8+fGhmZrZ48eKePXtKXVF+kZCQULZs2R07dlSqVEmpVDZr1szHx2f8+PFEtHTp0kWLFgUEBBgYGDx58qRatWq7d++uUaOG1CUDQL4wejTNmkVEtGoV9esncTEyguAOAJC5yMjIgQMHbty4kYh69+69ePFiEw2nrxV0W7ZsGTdu3OXLl01MTEJDQ728vNatW1e/fn0i6t69u52d3dy5c4lo586durq6YpcqABRya9ZQv37ETN27E+56lyUI7gAAmlqzZs13330XExNTunTpjRs3enp6Sl2RZCZOnFirVq3GjRsTUd++ffX19f/66y8iOnjwoJ+fnxgXExER4enpOW/evDZt2khdLwDkF6tXU//+pFSSry8dPEj6+lIXJCvYGAQAoKk+ffoEBgZWrlz57t27NWrUmDBhglKplLooadSvX79v374vX74kosWLF586dUq8HdGsWbOOHTuKqTLm5uYbN260t7eXuFYAyDfmzVOl9nr1aO9epPYswxV3AICsST/ovXHjxmvWrCk8g94fPXp08+bNli1bEtHPP/98+fLlAwcOKBSKS5cutWjR4sKFC66urgkJCTVr1vzuu++++eYbqesFgPwiPp6+/lrVGPPVV7R48Yc3UgVNILgDAGTH4cOH+/TpExoaamNj8/fffzdv3lzqivLCzZs369evf/r06dKlSycnJ9er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Lebm5tu2bfP09Dx79qx46Nq1axs2bCAiQ0NDpHYAgIIKV9wBAGQmODi4R48egYGBurq6s2fPHjp0KDMrFAqp6wIAgNyFCzMAADLj7u5+7ty58ePHp6SkWFpaEhFSOwBAYYAr7gAAcnX16tVKlSpJXQUAAOQRBHcAAAAAABlAqwwAAAAAgAwguAMAAAAAyACCOwAAAACADCC4AwAAAADIAII7AAAAAIAMILgDAAAAAMgAgjsAAAAAgAwguAMAAAAAyACCOwAAAACADCC4AwAAAADIAII7AAAAAIAMILgDAAAAAMgAgjsAAAAAgAwguAMAAAAAyACCOwAAAACADCC4AwAAAADIAII7AAAAAIAMILgDAAAAAMgAgjsAAAAAgAwguAMAAAAAyACCOwAAAACADCC4AwAAAADIAII7AAAAAIAMILgDAAAAAMgAgjsAAAAAgAwguAMAAAAAyACCOwAAAACADCC4AwAAAADIAII7AAAAAIAMILgDAAAAAMgAgjsAAAAAgAwguAMAAAAAyACCOwAAAACADCC4AwAAAADIAII7AAAAAIAMILgDAAAAAMgAgjsAAAAAgAwguAMAAAAAyACCOwAAAACADCC4AwAAAADIAII7AAAAAIAMILgDAAAAAMgAgjsAAAAAgAwguAMAAAAAyACCOwAAAACADCC4AwAAAADIAII7AAAAAIAMILgDAAAAAMgAgjsAAAAAgAwguAMAAAAAyACCOwAAAACADCC4AwAAAADIAII7AAAAAIAMILgDAAAAAMgAgjsAAAAAgAwguAMAAAAAyACCOwAAAACADCC4AwAAAADIAII7AAAAAIAMILgDAAAAAMgAgjsAAAAAgAwguAMAAAAAyACCOwAAAACADCC4AwAAAADIAII7AAAAAIAMILgDAAAAAMgAgjsAAAAAgAwguAMAAAAAyACCOwAAAACADCC4AwAAAADIAII7AAAAAIAMILgDAAAAAMgAgjsAAAAAgAwguAMAAAAAyACCOwAAAACADCC4AwAAAADIAII7AAAAAIAMILgDAAAAAMgAgjsAAAAAgAwguAMAAAAAyACCOwAAAACADCC4AwAAAADIAII7AAAAAIAMILgDAAAAAMgAgjsAAAAAgAwguAMAAAAAyMD/AQyLYuhaoO5/AAAAAElFTkSuQmCC", "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "library.get(list(library.ids)[20]).chem2dview().draw()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Making molecules from fragments\n", "\n", "Now that we have a bunch of fragments to work with we can start thinking about how to combine them into ligands. For this purpose, let's define a class called the `MoleculeSampler`. This class will keep track of the fragment database and will be able to assemble a molecule from a numerical array input. Why do we need an array input? Well, machine learning works with numerical data. If we want to use any kind of automated optimization algorithm we will need to find a way of \"encoding\" our ligand molecules into an array with some numbers.\n", "\n", "### Encoding \"instructions\" to build a molecule in numpy\n", "The most important first decision we need to make is how to encode our molecules of interest into numpy arrays. We cannot directly use atom coordinates because we don't know what atoms the ligands will include or how many atoms are in each fragment. What we can know, however, is which fragments to attach to each other. We can also know which atoms to use when attaching different fragments. How do we \"encode\" this kind of data? Here's one possibility:\n", "\n", "```\n", "[incoming_fragment_global_index, incoming_atom_index, target_fragment_atom]\n", "```\n", "\n", "We can use the indices of fragments within our database to identify fragments and we can use indices for each fragment to identify the atoms that should be used for connecting different fragments. In this case we make the simple assumption that each fragment will always be connected to the previous fragment. So the second fragment attaches to the first, the third to the second, and so on... \n", "\n", "Let's look at an example:\n", "```\n", "array([[159, -1, -1],\n", " [128, 4, 5],\n", " [195, 1, 1]])\n", "```\n", "The matrix above states the following: \"Start with the fragment nr. 159 in the database (first line, the rest of the line can be ignored). Then get the next fragment, which is nr. 128 in the database, and connect it via its fifth atom to the first fragment in the molecule via its sixth atom (remember that indices start at 0, so index 4 = entry 5). Finally, get the last fragment, which is nr. 195 in the database, and connect it via its second atom to the second fragment again via its second atom.\"\n", "Sounds bulky, right? Maybe it will be a bit clearer when we implement the whole system in code..." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "class MoleculeSampler:\n", " def __init__(self, fragments: list):\n", "\n", " # we need to maintain a per-fragment database of possible atom-sites where another fragment can be attached\n", " # we also need to maintain a per-fragment database of atom-ids to make linkages\n", " attachment_points = []\n", " atom_ids = []\n", "\n", " # let's browse through all fragments and identify the attachment points\n", " # also, filter out any fragments without any attachment points (good practice)\n", " to_drop = []\n", " for fdx, fragment in enumerate(fragments):\n", " \n", " # we define all non-Hydrogen atoms as potential attachment points\n", " # but only those that have a hydrogen neighbor that can be removed\n", " # will be considered as attachment points\n", " n_atoms = sum(1 for i in fragment.get_atoms() if i.element != \"H\")\n", " a = []\n", " for adx, atom in enumerate(fragment.get_atoms()):\n", " if atom.element == \"H\":\n", " continue\n", " if fragment.get_hydrogen(atom):\n", " a.append(adx)\n", " if len(a) == 0:\n", " to_drop.append(fdx)\n", " continue\n", " attachment_points.append(a)\n", " atom_ids.append([atom.id for atom in fragment.get_atoms()])\n", " \n", " for fragment in to_drop:\n", " del fragments[fragment]\n", "\n", " self.fragments = fragments\n", " self.attachment_points = attachment_points\n", " self.atom_ids = atom_ids\n", "\n", "\n", " def random(self, n_fragments: int):\n", " \"\"\"\n", " Make a random matrix encoding for a molecule assembled from fragments.\n", " \"\"\"\n", " # we could literally just use a single line here of np.random here, but then we run the risk of \n", " # making invalid matrices where attachment_points are referenced more than once so we make a more intricate \n", " # method here to ensure our \"random\" matrices are valid\n", "\n", " matrix = np.full((n_fragments, 3), -1, dtype=int)\n", " matrix[0, 0] = np.random.choice(len(self.fragments))\n", "\n", " # we maintain a chache to keep track over which attachment points have been used already\n", " # on which fragments\n", " _used_atoms = {i : set() for i in range(n_fragments)}\n", " for i in range(1, n_fragments):\n", "\n", " # choose an incoming fragment from the database\n", " matrix[i, 0] = np.random.choice(len(self.fragments))\n", "\n", " # choose an attachment point on the incoming fragment that was not used already\n", " while matrix[i, 1] == -1:\n", " atom = np.random.choice(self.attachment_points[matrix[i, 0]])\n", " if atom not in _used_atoms[i]:\n", " matrix[i, 1] = atom \n", " _used_atoms[i].add(atom)\n", " \n", " # choose a target fragment in the molecule\n", " # and choose an attachment point in the target that was not used already\n", " target = i-1\n", " while matrix[i, 2] == -1:\n", " available = [i for i in self.attachment_points[matrix[target, 0]] if i not in _used_atoms[target]]\n", " if len(available) > 0:\n", " matrix[i, 2] = np.random.choice(available)\n", " _used_atoms[target].add(matrix[i, 2])\n", " \n", " return matrix\n", " \n", " def make_molecule(self, matrix):\n", " \"\"\"\n", " Assemble a molecule based on an instruction matrix\n", " \"\"\"\n", " _used_atoms = {i : set() for i in range(len(matrix))}\n", "\n", " # we start by copying the first fragment\n", " mol = self.fragments[matrix[0, 0]].copy()\n", "\n", " # we then attach all other fragments \n", " for i in range(1, len(matrix)):\n", " source, source_atom, target_atom = matrix[i, :]\n", " target = i-1\n", " # sanity checking to ensure we are not trying to attach to the same atom twice\n", " if target_atom in _used_atoms[target]:\n", " raise ValueError(\"Target atom already used\")\n", " if source_atom in _used_atoms[i]:\n", " raise ValueError(\"Source atom already used\")\n", "\n", " # make a linkage and attach the fragment\n", " link = bam.linkage(self.atom_ids[matrix[target, 0]][target_atom], self.atom_ids[source][source_atom])\n", " mol.attach(self.fragments[source], link, at_residue=int(target+1))\n", "\n", " _used_atoms[target].add(target_atom)\n", " _used_atoms[i].add(source_atom)\n", "\n", " return mol" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Okey, so that's done. It is a bit of a clunk but it should do the trick. Let's test out what our example array from above actually yields:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "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jtQug457GduwYUO5cuUuXLjw999/c10L5EhPT3/27BkR1atX7/r16/3792/Tps2CBQuwuTUAyAPBnYho586dEomkZ8+elpaWXNeiBrp06UIYLQPFx64qg8mpZcbKyopdvHXGjBkvXrzguhwgIrp//76bmxub1Pl8/oQJE+7fvx8bG4tPvwFAHgjuRF/Xk5Et3w6FY4e5nzx5kutCQM2g4172evXq1b9//9TU1OHDh0vZAWPAqZYtWz58+PDly5d169ZlF4KsWLHiunXr9PT0uC4NANQAgjs9ePAgNDTU0tKSbSRDkRo3bmxjY/P69Wv2A18AOSG4c2L9+vXlypW7fv26bLcH4MrHjx+JqEKFCjt27Fi5cuWoUaNGjRqVlZXFdV0AoDYQ3HPa7T///LM8S+dev3798feb7GgZPp/fsWNHwmgZKCas484JKysrdjawt7f38+fPuS5He2VnZ7dr12706NFxcXFE1KtXr8ePH7u6uopEIq5LAwC1oe3BXSKR7N69m+QeJzN16lRnZ2cEViwKCSWAnVO50rNnz59//jktLW348OESiYTrcrSUUCi8e/eulZWVg4MDu76+sbHxyJEjua4LANSJtgf3s2fPfvz4sVatWk2aNCny4mfPnoWEhJiamrZp00b5pam0zp078/n8y5cvs1EMQB7ouHNo/fr1FStWvHHjxrp167iuRRvJ/vH7+/ufPHkyICBAtls2AID8tD24s+Nkhg0bJs/F27dvJ6IBAwagZWhlZdW4cWOxWKxOi0IC19Bx55CZmRm7KOScOXMwO6XsLVq0qFOnTi9fviSixo0b37p1a86cOVwXBQDqR6uDe1JS0r///svj8X7++eciL5ZKpf/73/8Ii898hUUhobjQcedW9+7dhw4digEznFi8eHHfvn1btmzp5+eXkZEhFAqbNm3KdVEAoH60OrgfOHAgLS2tbdu2dnZ2RV586dKld+/e2dnZubq6Kr80NcAOcz9x4gTXhYDaQMedc3/88UflypVv3rz5+++/c12LFmEYhs/ne3p63r59++7du/379+e6IgBQV1od3Iu1fLtsUA12Dmc1bdrU2tr61atX2NgF5ISOO+dMTU23bNnC4/Hmzp0bFhbGdTlaITw8vEGDBjdv3iSiqlWrHjt2bPPmzVwXBQDqSnuD+5s3b65cuaKvr//DDz8UeXFaWtrBgweJ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", "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# make a sampler with our fragment library\n", "sampler = MoleculeSampler([library.get(i) for i in library.ids])\n", "\n", "# make the matrix from the example above\n", "matrix = np.array([\n", " [159, -1, -1],\n", " [128, 4, 5],\n", " [195, 1, 1]])\n", "\n", "# and make the molecule\n", "mol = sampler.make_molecule(matrix)\n", "mol.chem2dview().draw() " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Cool! So apparently we can make molecules from numpy arrays now! With that taken care of we can start thinking about or actual goal of finding \n", "ligand generation. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The docking procedure\n", "\n", "We will use *dockstring* which is a library that works with RDKit, Openbabel, and Autodock Vina to dock a molecule onto a protein. The system is relatively simple. One loads a protein target and then passes SMILES for the possible ligand to the `Target.dock` method, which will return a docking score. Regrettably, we cannot directly pass an RDKit molecule to dockstring so there will be a lot of back-and-forth computation going on but that can't be helped right now... " ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "import dockstring as ds\n", "\n", "# we will work with the exact same setup that the authors of dockstring have used in their basic tutorial\n", "# which was to use the DRD2 (dopamine receptor D2) target protein from the PDB\n", "target_id = \"DRD2\"\n", "target = ds.load_target(target_id)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we can test our example molecule's docking score:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/noahhk/anaconda3/envs/glyco2/lib/python3.11/site-packages/dockstring/utils.py:77: DockstringWarning: Although Mac use is supported, docking scores on Mac do not always perfectly match scores from Linux. Therefore, extra care should be taken when comparing results to other platforms. In particular, the baselines in the DOCKSTRING paper were computed on Linux, so please do not directly compare your docking scores to the scores reported on the paper.\n", " warnings.warn(\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "-7.4\n" ] } ], "source": [ "score, aux = target.dock(mol.to_smiles())\n", "print(score)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In fact, dockstring even provides us with an RDKit molecule for the algined ligand which can be found in the `aux` dictionary. It actually contains 10 conformers that were evaluated, we are only interested in the best one (which is the first one):" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

\n
\n", "text/html": [ "
\n", "

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", " jupyter labextension install jupyterlab_3dmol

\n", "
\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def get_ligand(rdkit_ligand):\n", " # remove the other conformers (since we cannot import multi-conformer RDKit molecules directly into BuildAMol)\n", " conf = rdkit_ligand.GetConformer(0)\n", " for i in range(1, 10):\n", " rdkit_ligand.RemoveConformer(i)\n", "\n", " ligand = bam.Molecule.from_rdkit(rdkit_ligand)\n", " return ligand\n", "\n", "aligned = get_ligand(aux[\"ligand\"]) \n", "aligned.py3dmol().show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Making a pipeline \n", "\n", "Okey, now that we know that everything works we can start to actually design a pipeline that will actually put all the pieces together in order to generate some possible ligands. Since this tutorial should illustrate the general workflow and provide some inspiration rather than present a full-fledged finished product, we will not be implementing anything overly fancy. We will simply write a scoring function to make and dock a molecule using *dockstring* and then pass that to `scipy.optimize.minimize` and see what happens... Ideally we would like to have multiple candidate ligands, so we will run our pipeline a few times to get some hits..." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "from warnings import filterwarnings\n", "filterwarnings(\"ignore\")\n", "ds.setup_logger(level=\"ERROR\")\n", "\n", "# let's try to find a ligand from 4 fragments\n", "n_fragments = 4\n", "starting = sampler.random(n_fragments)\n", "\n", "# we will set up a dictionary that allows us to store a few more of the \"best\" ligands along the way...\n", "metadata = {\"best_score\" : np.inf, \"ligand\" : None}\n", "\n", "# we define our scoring function that will evaluate the ligand\n", "def score(matrix):\n", " # we need to reshape since the matrix is 2D but the optimizer will pass it as a 1D array\n", " matrix = matrix.reshape(starting.shape).astype(int)\n", " \n", " # we use try-except since we cannot be sure that the matrix will be valid at all times\n", " try:\n", " smiles = sampler.make_molecule(matrix).to_smiles()\n", " score, aux = target.dock(smiles)\n", " new_best = min(metadata[\"best_score\"], score)\n", " if score == new_best:\n", " metadata[\"best_score\"] = score\n", " metadata[\"ligand\"] = aux[\"ligand\"] \n", " return score\n", " except:\n", " return np.inf" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can now test out if we can \"optimize\" for a ligand here with our scoring function. Let's see if we get an output..." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "-11.6\n" ] }, { "data": { "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

\n
\n", "text/html": [ "
\n", "

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", " jupyter labextension install jupyterlab_3dmol

\n", "
\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from scipy import optimize\n", "# we will use the Nelder-Mead method since it is simple and does not require gradients\n", "# and we will do only a small test-run with 5 iterations\n", "out = optimize.minimize(score, starting.flatten(), method=\"Nelder-Mead\", options={\"maxiter\" : 5})\n", "\n", "# the results should be stored in the metadata dictionary now\n", "print(metadata[\"best_score\"])\n", "ligand = get_ligand(metadata[\"ligand\"])\n", "ligand.to_pdb(\"./files/DRD2_ligand.pdb\")\n", "ligand.py3dmol().show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And let's also check out the ligand and protein together:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

\n
\n", "text/html": [ "
\n", "

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", " jupyter labextension install jupyterlab_3dmol

\n", "
\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# we will use Py3DMol to visualize the protein and ligand together\n", "import py3Dmol as p3d\n", "\n", "def show_ligand_and_protein(ligand):\n", " view = p3d.view(width=800, height=600)\n", "\n", " # add the protein\n", " view.addModels(open(\"./files/DRD2.pdb\").read(), \"pdb\")\n", " view.setStyle({\"model\": 0}, {\"cartoon\": {}})\n", " view.addSurface(None, {\"opacity\" : 1, \"color\": \"lightgray\"})\n", "\n", " # add the ligand\n", " # (we have to get the PDB-text for Py3DMol)\n", " pdb = bam.utils.pdb.encode_pdb(ligand)\n", " view.addModels(pdb, \"pdb\")\n", " view.setStyle({\"model\": 1}, {\"stick\": {\"color\" : \"cyan\"}})\n", " view.zoomTo()\n", " view.show()\n", "\n", "show_ligand_and_protein(ligand)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Okey, cool, there is a molecule in the pocket where Risperidone is supposed to bind! Now that we have a system that appears to be working we can think of turning it into a simple \"screening\" tool of sorts, by for instance, simply repeatedly running the procedure above from random starting ligands. Below is some example code that would do the trick. The code is super inefficient though since we are running each optimization sequentially, any real application of this kind should definitely use a parallel approach here!" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Run 1 done with score -8.9\n", "Run 2 done with score -8.3\n" ] } ], "source": [ "# how many times we will run the procedure\n", "n_runs = 2\n", "\n", "# define a function that will run the optimization\n", "# (this is super down-scaled of course, so we don't have to wait so long...)\n", "def _run(i):\n", " starting = sampler.random(n_fragments)\n", " metadata[\"best_score\"] = np.inf \n", " metadata[\"ligand\"] = None\n", " \n", " out = optimize.minimize(score, starting.flatten(), method=\"Nelder-Mead\", options={\"maxiter\" : 1})\n", "\n", " print(f\"Run {i+1} done with score {out.fun}\")\n", " results.append(dict(metadata))\n", " return results[-1]\n", "\n", "results = [_run(i) for i in range(n_runs)]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can inspect the ligands that were produces:" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "image/png": "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x33++ecKUL/++usltz377LPKzc3NfrlTp07Kx8fnkvvdfffd9p7t5b6aN29+zc9nwIABhb5HTEyMUkqf1IyMjLzkE4RSSj311FPK19dXnTt37pqPd/bsWVW6dGnVunVr+3W9evVSwGVP6IaFhanHH3/8mo8jbh2XnsES4l+4u7szYMAAxo4da6/d2k7gHTt2jHLlyl32caGhoQAkJydfcltSUhJhYWGFrjMM45L7hYWFERoayo8//njZY/j7+1/9E/nLCy+8QKtWreyXPT09ATh58iTJycm8+OKLlzymYcOGfPbZZxw6dIgaNWpc0/H8/f2Ji4tj37599utstfEdO3aQkJBgv/7EiROkpKQQHx9/TccQtxYJcnFFycnJREZGXnK9bZRJVFQUAPfeey9ms5kPPviAxMTEy36vxMREvL29+eKLL3j44Yft1x87doyff/6Z9u3b/2t7WrVqxVdffYXFYikUeDciKirK/jwuFhwcjJeXF2vXrr3ktjVr1mAymS77s/k3KSkp7Nixg6ZNm9qva9myJV5eXsyYMaPQ87KdsG3btu01H0fcQhz9kUA4t5o1a6r77rtPTZ48Wf38889q2bJlatSoUSoyMlL5+fmp7du32+/br18/Baj27dur7777Ti1btkxNmDBB9e/f336fd999VwHqySefVIsWLVKff/65qlSpkgoMDFT79u2z369Tp07K19f3kvYUFBSo++67T4WEhKiBAweqxYsXq2XLlqkZM2aoTp06qTlz5tjvWxQnO9988017excsWKAWL16sXnzxRQWoZ599ttB9Y2NjVWxsrP1yenq6atiwoRo7dqxasGCBWr58ufrggw9UXFyc8vHxURs2bCj0+CFDhijDMFSfPn3UihUr1MiRI5Wnp6d6/vnnr7v94tYgQS6u6Ouvv1YdOnRQlStXVn5+fsrd3V1FR0erJ5988pKRF0op9dlnn6mGDRsqLy8v5efnp+rWraumT59e6D4ff/yxqlWrlvLw8FCBgYGqTZs2l0x4+acgV0qp/Px8NWrUKFW7dm37ceLi4tSLL76o9u/fb7/f9OnTFXDJ8a+FxWJRH330kWrQoIEKCgpSAQEBqm7dumrSpEkqLy+v0H1jYmLs9XWllMrJyVHPPfecqlatmvLz81Nubm6qbNmy6oknnvjHCT7jx49XVapUUR4eHio6OloNGDDg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j23btlGxYkVmzJiBu7s7t912m0tNZAI4deoUoaGhLtduIa6VywW5m5sbZrOZnJwcRzfFTinFwYMHWb16NePHj7+q4DAMg1q1ajFq1CjGjBnDzp07ef311wkMDCzRurlSiuzsbDZs2MDcuXPJycnh/vvv57nnniMwMJBDhw4xYsQIdu3axdNPP21fddIV6OUFXHdWqhBXy+W6KoZhEBAQQEZGhqObYldQUMCHH35Ip06dCLyGXe8NwyA0NJQBAwZQqVIlunXrxt69e4u91KKUQinFyZMn+fzzz3nllVdYvnw5nTp1YsKECfz3v/+1b0xdvnx5RowYQVZWFr179yY5OdnpSkGXo5SyB7kQNzuX65EbhkFISAipqamObgqgA2PlypUYhsHtt99+zb0/wzDw9PSkQ4cOxMXFMXz4cB588EEeeOCBIl9YSylFQUEBe/fuZd68efz555/cfvvtDBkyhMjIyEJLAtvC2jAM/P39ef3111m6dCk9e/bk5ZdfJiEhwelLFidPnqRGjRr2y/n5+WRlZZX4px4hipvLBTngVEGenp7OF198wYABA24oeE0mE/Xr1+e9995j9OjR7Nmzh5dffhl/f/8bDh3bnqarVq1iwYIFmM1mWrduzRtvvIGvr2+h729bX2XlypU0a9bMPmrFzc2Nli1bUqlSJUaOHMmePXvo0KGDUy/Fe+rUKUpftMdbSkoK/fv358knn6Rp06ZFthm3EI5mKFf4nPw3c+bMISMjg6efftqhIWK1Wpk8eTLe3t4888wzRdaWnJwcZs6cyfr16+nevTuVKlW6ru9tsVg4duwYCxcuZP369VSrVo02bdoQGxtb6MSqbdelvXv3MnfuXA4ePMgdd9zBQw89RMDfFvK2vSm8//77pKWl0a1bN0qXLu1UYW61WklKSuLVV19l8uTJ9vKKUopDhw4xcuRI4uPjefrpp116VI4QNi4Z5MuXL2f79u28/vrrDgsQ244/7733HuPHj8ff379Iv7/VamXdunVMnjyZDh06cM8991xVj18pRW5uLtu2bWPevHmcOnWKu+++m3vuuYfQ0FCAQuWTs2fPsmrVKhYuXGjvqScmJuLj43PFn21BQQELFy5kzpw5dOnShXr16jm01KKUIi8vj927dzN37lyOHDlCVFQUaWlp9OjRgwoVKmAYBkopsrKy+PDDDzl+/Dg9evSw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ObwtV+PYsWMMGzaM8ePH4+bmxvnz53nttdcYOXKk0+9un5+fz/fff8+CBQt47bXXqFWr1j9+KrRNwPrhhx/Yvn07devW5b///S8xMTHF0mPWr+kcPv20gF27/OneHWJiSj7MLRYLR48eZeHChWzYsIHq1avbV9g8e/YsEyZMwGKx8NprrxV6M7TV/MPCwnj55Zed4nyPxQLZ2eDtDbZfWUEB5OXp63JywM1NfxkGKAW5ufr/jt4W1umCPDc3l1GjRuHn58fLL79c5JMhLj7xmZqayr59+9i2bRt79uzh/PnzREREULduXZo3b05YWBiA/QSYbclaRxo/fjzVq1fnnnvucWg7rtb27dv56quvGDJkCCaTibS0NLp3787kyZNdYlNkpRQ7d+5kzJgxtGjRggcffNDeu7R1EDZs2MD8+fM5f/489913H3fccUeJ1YCtVli5EqZNg2eegWbNLoRQcbHV620rbKakpHDPPfdw9913F1oqwVZmmTNnDj/++KN9GKftttzcXD7//HOnqfnv2gWdO0P37vDwwzqg162DSZPg44+hWzdo3hzatdO3Wa0wZAiEh8OLLzqs2YCTbSyRn5/P+++/j8lk+sed6G+U7YXi7u5OeHg44eHh3HbbbVitVtLT0zl8+DBbt24lLS3NHuTBwcEEBQVx6NAhqlWrVuRtulq2k2Z33323w9pwrU6ePEmpUqXsP/eMjAx8fHyKZBhfSTAMg/j4eEaPHs3YsWPZvn07Xbt2JT8/n19++YVffvmFsmXL8sQTTxAfH1/iQ0BNJrjzTqhYEUaMgN27dRh5exdt71wpW9kolWXLlrFkyRJKlSpFu3btqFOnzmVXvTQMvdH4I488QlxcHKNHj6Z169a0bt0aNzc3PD09efbZZ6levTrvvjuPxx57jebN3Yr9jeif5OTAkSP659ikCZQpA+fPw6FD+vkfPw5/32HyxInif+O8Gk4T5AUFBUybNo2MjAx69epVor01wzAwm82EhoYSGhpK3bp1C91uMplITEzk119/JS4uzmG9BovFQnp6un21Qldw7Ngx+wJVACdOnCAiIsLBrbo2hmEQHBxMv379mD59Oo8//ji+vr60adOGoUOHEhER4dAJWIYB0dE6gKZOhV694K23dBDdaJOU0iWHP/+EH36wsHfvVOrVC6R///6ULVv2qtbtMYzCG43v2rWLrl272gcfNGnShJiYxowcaWLnTnjhBfDxcUzNPyYGataEceNg+PBLb7fVL/QbW4k27YqcIsgtFgtffvklBw4coF+/fg4vX1yuZ9GoUSOGDx+OxWJx2MmZ3NxcLBaLw4dAXi2lFMeOHbOXgWxzAlwtyEG/Bjw8PHj++edp2bIlQUFBhVaadDTDAF9f6NoVli+H3r3hpZcgMVH32q+VUro3um4dzJ+va8H//a+ZF17ojr//tY8DNwyDUqVK8c477zB79mzefPNN3nrrLfts1TJlzAwbpktEb72lv6KjSz7M3dz0z/CZZ2DNmktv/+472LdP/18pWLsWHnqoZNt4OQ4PcqvVypw5c9i4cSODBw/Gz8/P0U26rKioKKxWK8nJyZQrV84hbcjOzkYp5TJBbrVaSU1NpVSpUvbrkpOTKV++vOMadYNMJlOJLV18PcxmuOceiI2FkSN1qeXJJ+HMGR3MsbEXgv3IEd3zDQ29cPIOdLngxx/hf//TPdRnnoFq1cDd3cAwbqzc6enpSceOHalatSrvvjucxx7rxb33xmE267b83//p4/btq497xx3X90Z0Lf7esy5fHp5/HoYOhZdfLnxb2bK6x2573ObNxdu2q+XQILdarSxevJjly5czdOhQpzhz/U/c3d2pU6cOGzZsoGzZsg7piaWmphIYGOhU44avpKCggKysrEK/1xMnTtC4cWOn6cnejAzjQs188mSYORP274evvtK961q19H2GDIGGDeG55/TIjD17YO5cOHxY193ffVefyCvqIDWZTDRs2JCRI8cwbpwn27frwPT3129EJVHzt8nP1z+btWuhShV9nWFAhw7w/ffw7beFg75xY32b7WTn6tVF36br4bAFl5VS/PLLL8ydO5eBAwcSEhLi1H/chmFw2223sXr1aqxWq0PakJycbN/V3hXk5+eTk5NjD3KlFKdOnSI8PNzBLbv5GQYEBOgRGI8+emEI3bBheogd6HJJXh788gu8/jrMmKF7wJMmwVNPQWRk8fWGDcOgdOkQBgzwpVQp6NFD1+GVulDzf+893b4+ffSJxqKqSSsFmZmwZAm88YZ+sytXDi4eW+Hnp8tTS5bocwRX8z1tn2Q2bNDDFkuSQ4JcKcXatWv5/PPPeeedd1xmR5ZKlSqRkpJCxt9PXZcApRQnTpxwqSBPS0vDz8/Pfk4hNzeX/Px8py2f3Yzc3HTtHKBNG0hJ0b3ui0PR3V0H2qhRujdcUpOLDAO8vHSPu1MnGDQIfvpJB6dh6DDt2hXuv1+H6urVuhd8PWwnbY8f10MJu3SB9et1KWfsWLj7bv1GV7q0PrZh6N53584XrgsLu/CztAkO1m+YeXm6vp+RoU84r1p14z+fa1HipRWlFNu2beODDz5gwIAB9nWgXYG3tzfx8Q+zZ08BTZuW/PGTk5OJj493mZ9XSkpKobW8z58/j9lsxsvLy8EtuzUFBuqeb79+erw56IC67bYL/3cEk0mflI2J0eWUXbv0uGxf3ws1/4oVYd48qF9fh//VUkqH7M6d+g0sKUmPBR8xAmynbmzPu1o1HfK2U1BmM/Tvr88teHjox1w8mM4woGdP3X4PDz3O3MMDzp3T5x9KUon2yC9ex6Jnz54OnwBwPRIS7ufnn0s5ZOiRq5VWTp06VWgMeWZmJp6eni4zhvxm1Lw51KmjyycXlwwc/WdoGBAVpYf8eXvrUSuHD18otcTGwptvXt0MStvQwLQ0fU6ga1d9nuDee/Xz7tixcM/bxt1dn/i1lZMMQ7fFdjI4OLjwsEhb+crPT//fw0N/4lm//sKbY0kpsR65Uoq9e/fSv39/evXqddU7xjgTwzCoUQM++US/S//9Y1ZxutwIEGd3/PjxQp+4bEMPXe33fjNxc9Mh+fjjuo7bpImjW3SBLThffBF++02PXHn2Wbj9djh5UgflX3P0sFohOVmHrK2HrpS+/vBhHeBbt+o3rbfe0r19s7n43rCU0r3wiRPhiSf08UpSiQV5QUEB/fv356mnnqJevXr2P2allEv9YQcF6RfTH39A7dold1zb0ENHj7G/WrYx5LZdjGwLPdk2wxCOYevdduqke7jOyGzWpZ/y5fUQSotF/5uTo8srQUG6I9Wpkx4i2KiRvm3TJn372bPQsiU8/bS+b0nES1aWfsNQChYt0uWc//yn+I9rU2JBbhgG/v7+hIeH24M7KyuLQ4cOuVTv3DB0L2b16gvDuErC+fPnMZlMLrE+CehPECkpKfadfkD3yCtXruzAVt26qlbVNXLQr9knn4Tt2/VoDWdkG7kycqQeZZOfD6dPw0cf6ZE4Sunrc3P1sMrly3Vp5rHHID5el2BKMlJ8fHTbbCXXkv4zLbEaudls5r///S/r16+3L1yVnZ3N2LFjyc3NLalm3DDD0D2ALVv0u25JSU9Px8/Pz2V2VP/70ENAhh46iFK6JlyhwoXrAgLgwQd1fddZ2UotttUIX3pJh/bOnRfuo5R+Lu+8o78aNNCllpLuF5pMuh2BgfqrpM/nl1iQG4ZBw4YN2b59O/n5+QAEBQXh6+vLoUOHSqoZRSIiQv/ikpNL7phJSUn2/RxdQV5eHnl5efahhrYx5Bf30EXJUEqP2Fi//sJ1hqGH+v3yi+Pada2qVYP27fVEJdtYeA8PPTyxbNninwHqzEr0qUdERGA2mzl+/Dige+mJiYn89ttvONlquldkNuthUBf/YRQn26qHZcqUKXSd1Wp12p9bRkYG3t7e9hEqubm55ObmOvXsXeHcTCa9oNbx47Bw4YXrXaRvU6xKNMjNZjP16tWzl1dsi1Ft2rQJy9VMn3Iit92m6+Ql1eyjR48WKktkZmby3nvvcfToUacM87/3vs+dO4enp6fLlIZuRidO6Cnvtq/UVEe36NqFhuqTipMm6eGFQivRIDcMg9tvv501a9bYp7mXKVOGgoICTp48WZJNuSGGoc+onz1bci+mXbt2FRqx4ufnR0JCAm+//TYrV6502LIB/+TkyZOFgjwzMxMvLy8ZQ+4gSukhebaVBd96C3791dGtunaGoceD16hR8pNunFmJz+wsX748GRkZ9jHRHh4e1KpVi40bNxIVFeUyNWAvLz0SYNs2PcmiuJtdtmxZvv32W2rUqEFAQAAmk4m77rqLihUrMmLECPbs2cPTTz9dZPtC3qikpKRCQw1PnDjhMksx3IwMQ4/Jvng1vx49HNeea2EyQd26ekIO6Lr422/rOrltJM6trsRPD3h6elKtWjW2bt0KXOilr1q1yul6lf+mbVv9Ua8kvP3221SoUIGePXty4MABe2kqJiaGESNGkJ2dTZ8+fUhOTnaKUostyG3BfezYMYetGik0Nzc9LM725SKLaOLhoVdqrFNHXzYMvVLhzJkQF+fQpjkNh5znvf322wud4KxcuTKnTp3i7NmzjmjOdVmzBiZMuDDTDPQogGnTrn9hn39iGAa+vr688sorPPHEEwwcOJAlS5ZgsVgwDAM/Pz9ee+01WrZsSc+ePQuVrhzBarVy8uRJ+3IClztZK8TVsk1/v3hUyuWuu5WV+I/BMAyqV6/OkSNHOHfuHKAXo6pYsSK7du0q6eZctwMHYPp0vWKc7YTnnj2X31WkqJhMJpo2bcqwYcNYvHgxEyZM4Ny5cyilMJvN3HvvvQwYMIBPP/2UadOmkZOT47De+cMPP2zf81QpxenTp11qeYGbiWHoTRqaNy98/SOP6BURhetzyPtZQEAAERER7Nu3z14iaNasGStXrnSKssDVatRID0H89deS27/PMAyioqJ499138fDw4K233uLw4cP2n2NsbCwjR47k9OnT9O3bl5MnT5b4z9RkMnHHHXfYT84qpUhJSbEHuyhZtg2a/1otwS4xUQ+jlWqX63PYB5OmTZuy6q9Few3DoGbNmvzxxx9k20b6u4DwcL3Az7vvXrq7dnEyDAMfHx9eeuklHnnkEfr168eKFSvsQzj9/f3p0aMHd9xxB2+99RYbN24s8VKLbTNipRTnzp3j5MmTMoZciGLikCA3DIP69euzfft28v6a5x4cHExISAgHDhxwRJOuyLYs5t87toahpzn7+OgyS0l/mDCbzdxxxx0MGTKEb7/9lg8//JCcnBwA3NzcaNWqFb1792bKlCnMnDmTvLy8EuudK6XIyspi6dKlvPjii0RHR8s65EIUE4f1yEuVKoWnpyfHjh0DdLg3btyYVatWOVV5xbYt1IIFl5/84+urt6L6/HM4eLDk22cYBtHR0bz33nvk5ubSq1cvkpKS7KWWuLg4Ro4cycGDBxk4cCBnzpwptp+vbbZpcnIy06ZN45VXXmHNmjV069aNkSNH2ncKEkIULYcFuZubG40aNWLNmjX20ElISGDz5s32tVgcTSm9XOawYZCefvkz5Iah64wtW+oFfRzBNnKla9eu3H///fTq1cs+csUwDIKDg+nduzd16tShR48ebNu2rUjDXClFXl4eW7duZeDAgbz99tu4ubkxfPhw+vXrR8OGDfH09JShh0IUE4d2kRITE5k4cSKPP/44ZrPZPoHkxIkTREdHO7JpgF7jeORIvUj844/rILeVWEwmPS4X9L9duuh1iB05NtfNzY17772XSpUqMXLkSHbu3MmTTz6Jt7c37u7utG/fnri4OMaMGUOLFi148MEHb2impVKKjIwMVq5cyeLFi/Hx8aF169Y0bNgQHx8fCW4hSoihHFjHyMnJ4ZVXXuHdd98lPDwcpRRTp04lNDSU9u3bO6pZgF7neOxYvf1Tly56zKpSeiunOXOgRQt9gtO2JrlSevih1apHBzgyw2wnGCdPnsypU6fo3r27fWcepRSpqamMHTsWs9lM165dCQkJuerQtZVPDh8+zA8//MCWLVuoWbMmrVu3pmLFiphMJglwIUqYQ4NcKcWYMWOoXr06LVu2BGD37t188sknjBo1CpODRvvn58MHH+ig7tFDT8dXSpdX+vbVm8G2bu3ckxGUUlgsFn788Udmz57Nq6++SoMGDTCZTCilyM/P57vvvmPp0qX06tWLypUrXzGAlVLk5OSwZcsW5s6dS3p6Oi1atKB58+YE/zV3WgJcCMdwaGnFNj3/+++/p0WLFphMJipUqEB6ejppaWmEltT894sUFMBnn+mV4vr2vRDi587B4MF6d6D//te5Qxz0z9bNzY0HHniAypUrM3LkSPbs2cPjjz+Ou7s7Hh4ePProo1SrVo2MK4ydtFqtnDlzhmXLlrFs2TJKly7Nww8/TO3atfHw8JDwFsIJOLRHDnD27Fm6dOnCxIkTCQgIQCnF8OHDady4MXfeeWeJBoXFopg9G9avNxg06MLu2OfP670By5eHzp0v1MZdha2WPWHCBLKzs3nzzTcJCwuzl1qgcG/a1pv/448/mDNnDnv37qVJkyY88MADREVFSflECCfj8H6ln58fZcuWZe/evfZQue222/jtt99KtB1Wq5XFi7exenU2/ftfCPHcXBgzRm+V9fTTrhfioEM6KCiI3r1706BBA7p3787WrVvto4VsgW6rrS9btoxu3boxceJE6taty6RJk3jxxRcpV64cZrNZQlwIJ+PwWDKZTDRr1oz//e9/NGzYEMMwiI+PZ9q0aZw/fx5fX99ib4NSimXLlvH993N4990R9p238/Nh8mQd3i+9pE98ujJ3d3cefPBBqlSpwtixY7nnnnt46KGHcHNzIzk5mcWLF/Pbb78RGxvLc889R9WqVWX9cCFcgMNLK6A3IejduzeTJ0/Gy8sLq9XK+++/z8MPP0xERESxHlspxW+//cb06dMZMmSIfV/MggL4+GO9L2evXnoD2JuFUoq0tDTGjRtHbm4uHh4eJCUlcccdd9CiRQtKlSrlsBPNQohr5xRBbrFYeOONN3jllVeoWrWq/brirsUqpdi0aRMTJ05k4MCBxMTEYBgGFoti5kzYtcugf389Bf9mqybYRq688MILtG3blhYtWtin0EvpRAjX4hTdLpPJRKNGjQqtUV7ctVilFLt372bc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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "ligands = [get_ligand(i[\"ligand\"]) for i in results]\n", "fig, axs = plt.subplots(2, len(ligands) // 2, figsize=(8, 5))\n", "\n", "# draw all ligands\n", "for idx, l in enumerate(ligands):\n", " if l is not None:\n", " ax = axs.flat[idx]\n", " ax.imshow(l.chem2dview().draw())\n", " ax.axis(\"off\")\n", " ax.set_title(f\"Score: {results[idx]['best_score']:.2f}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Okey, cool! And just like this we have got some new candidate ligands! Of course, this entire example is not a fully developed ligand screening pipeline, it's just a toy example, but it's still quite nice to see that it works and with a relatively moderate amount of code too!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's end this tutorial by visualizing the two other ligands that we just made also with the protein:" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

\n
\n", "text/html": [ "
\n", "

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", " jupyter labextension install jupyterlab_3dmol

\n", "
\n", "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/3dmoljs_load.v0": "
\n

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n jupyter labextension install jupyterlab_3dmol

\n
\n", "text/html": [ "
\n", "

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
\n", " jupyter labextension install jupyterlab_3dmol

\n", "
\n", "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_ligand_and_protein(ligands[0])\n", "show_ligand_and_protein(ligands[1])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Alrighty, that seems interesting all ligands are binding at the same pocket, which is nice since this is also the place where a drug named Risperidone is known to bind. The molecules are, of course, not Risperidone, however, which actually looks like this:" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "[12:56:50] SMILES Parse Error: syntax error while parsing: Risperidone\n", "[12:56:50] SMILES Parse Error: Failed parsing SMILES 'Risperidone' for input: 'Risperidone'\n" ] }, { "data": { "image/png": "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", "text/plain": [ "" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "risperidone = bam.molecule(\"Risperidone\")\n", "risperidone.chem2dview().draw()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Still, our ligands do at least share some common structural features with Risperidone, which is encouraging given how incredibly simple our pipeline actually was and how small-scale the optimization was!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And with that we have reached the end of this tutorial. Hopefully you now feel a little inspired for making your own molecule design pipeline with the help of BuildAMol! Thanks for checking out this tutorial and good luck with your research!" ] } ], "metadata": { "kernelspec": { "display_name": "glyco2", "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.0" } }, "nbformat": 4, "nbformat_minor": 2 }