{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import os\n", "import numpy as np\n", "import pandas as pd\n", "from rdkit import Chem\n", "from rdkit.Chem import rdFMCS\n", "from rdkit.Chem import rdFingerprintGenerator\n", "from rdkit.Chem import AllChem\n", "from rdkit.Chem import DataStructs\n", "from rdkit.Chem import rdRGroupDecomposition\n", "from rdkit.Chem import rdmolops\n", "from rdkit.Chem import RDConfig\n", "from rdkit.Chem import PandasTools\n", "from rdkit.Chem.Draw import IPythonConsole\n", "from rdkit.Chem.Scaffolds import MurckoScaffold\n", "\n", "from collections import defaultdict\n", "from itertools import product\n", "import igraph\n", "from rdkit.Chem import Draw\n", "from rdkit.Chem.Draw import IPythonConsole\n", "import re\n", "IPythonConsole.ipython_useSVG = True" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "def gengraph(mols,fpgen , threshold=0.7):\n", " fps = [fpgen.GetFingerprint(m) for m in mols]\n", " num_v = len(mols)\n", " graph = igraph.Graph()\n", " graph.add_vertices(num_v)\n", " for i in range(num_v):\n", " for j in range(i):\n", " if DataStructs.TanimotoSimilarity(fps[i], fps[j]) >= threshold:\n", " graph.add_edge(i, j)\n", " return graph" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "def makebond(target, chain):\n", " newmol = Chem.RWMol(rdmolops.CombineMols(target, chain))\n", " atoms = newmol.GetAtoms()\n", " mapper = defaultdict(list)\n", " for idx, atm in enumerate(atoms):\n", " atom_map_num = atm.GetAtomMapNum()\n", " mapper[atom_map_num].append(idx)\n", " for idx, a_list in mapper.items():\n", " if len(a_list) == 2:\n", " atm1, atm2 = a_list\n", " rm_atoms = [newmol.GetAtomWithIdx(atm1),newmol.GetAtomWithIdx(atm2)]\n", " nbr1 = [x.GetOtherAtom(newmol.GetAtomWithIdx(atm1)) for x in newmol.GetAtomWithIdx(atm1).GetBonds()][0]\n", " nbr1.SetAtomMapNum(idx)\n", " nbr2 = [x.GetOtherAtom(newmol.GetAtomWithIdx(atm2)) for x in newmol.GetAtomWithIdx(atm2).GetBonds()][0]\n", " nbr2.SetAtomMapNum(idx)\n", " newmol.AddBond(nbr1.GetIdx(), nbr2.GetIdx(), order=Chem.rdchem.BondType.SINGLE)\n", " nbr1.SetAtomMapNum(0)\n", " nbr2.SetAtomMapNum(0)\n", " newmol.RemoveAtom(rm_atoms[0].GetIdx())\n", " newmol.RemoveAtom(rm_atoms[1].GetIdx())\n", " newmol = newmol.GetMol()\n", " return newmol" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "def enumeratemol(core,rg, maxmol=10000):\n", " dataset = rg.GetRGroupsAsColumns()\n", " labels = list(dataset.keys())\n", " pat = re.compile(\"R\\d+\")\n", " labels = [label for label in labels if pat.match(label)]\n", " rgs = np.asarray([dataset[label] for label in labels])\n", " i, j = rgs.shape\n", " combs = [k for k in product(range(j), repeat=i)]\n", " res = []\n", " for i in combs:\n", " mol = core\n", " for idx,j in enumerate(i):\n", " mol = makebond(mol, rgs[idx][j])\n", " AllChem.Compute2DCoords(mol)\n", " mol = Chem.RemoveHs(mol)\n", " res.append(mol)\n", " return res" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "fpgen = rdFingerprintGenerator.GetMorganGenerator(2)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "mols = [m for m in Chem.SDMolSupplier(os.path.join(RDConfig.RDDocsDir,'Book/data/cdk2.sdf'))]\n", "for mol in mols:\n", " AllChem.Compute2DCoords(mol)\n", "fps = [fpgen.GetFingerprint(m) for m in mols]" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "graph = gengraph(mols, fpgen, 0.4)\n", "blks=graph.blocks()\n", "simmols_idx = sorted(list(blks), key=lambda x: len(x), reverse=True)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "simmols = [mols[i] for i in simmols_idx[0]]\n", "scaff = [MurckoScaffold.GetScaffoldForMol(m) for m in simmols]" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "mcs1 = rdFMCS.FindMCS(scaff, threshold=0.7)\n", "mcs2 = rdFMCS.FindMCS(scaff, threshold=0.7, \n", " completeRingsOnly=True,\n", " matchValences=True,\n", " bondCompare=rdFMCS.BondCompare.CompareOrderExact,\n", " atomCompare=rdFMCS.AtomCompare.CompareElements,\n", " )\n", "mcs3 = rdFMCS.FindMCS(scaff, threshold=0.7,\n", " ringMatchesRingOnly=True,\n", " completeRingsOnly=True,\n", " atomCompare=rdFMCS.AtomCompare.CompareAny)\n" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "image/svg+xml": [ "\n", "\n", " \n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "N\n", "N\n", "N\n", "O\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Chem.MolFromSmarts(mcs1.smartsString)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "image/svg+xml": [ "\n", "\n", " \n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\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": [ "" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Chem.MolFromSmarts(mcs2.smartsString)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "image/svg+xml": [ "\n", "\n", " \n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "N\n", "N\n", "NH\n", "N\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mols_has_core = []\n", "core = Chem.MolFromSmarts(mcs2.smartsString)\n", "for mol in mols:\n", " if mol.HasSubstructMatch(core):\n", " AllChem.Compute2DCoords(mol)\n", " mols_has_core.append(mol)\n", "def getMCSSmiles(mol, mcs):\n", " mcsp = Chem.MolFromSmarts(mcs.smartsString)\n", " match = mol.GetSubstructMatch(mcsp)\n", " smi = Chem.MolFragmentToSmiles(mol, atomsToUse=match)\n", " return smi\n", "mcs_smi = getMCSSmiles(mols_has_core[0], mcs2)\n", "core = Chem.MolFromSmiles(mcs_smi)\n", "core" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "rgp = rdRGroupDecomposition.RGroupDecompositionParameters()\n", "rgp.removeHydrogensPostMatch = True\n", "rgp.alignment =True\n", "rgp.removeAllHydrogenRGroups=True\n", "rg = rdRGroupDecomposition.RGroupDecomposition(core, rgp)\n", "for mol in mols_has_core:\n", " rg.Add(mol)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rg.Process()" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "frame = pd.DataFrame(rg.GetRGroupsAsColumns())\n", "frame[\"Smiles\"] = [Chem.MolToSmiles(mol) for mol in mols_has_core]\n", "PandasTools.AddMoleculeColumnToFrame(frame)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "scrolled": false }, "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", "
ROMolSmilesCoreR1R2R3
0\"Mol\"/CC(C)C(=O)COc1nc(N)nc2[nH]cnc12\"Mol\"/\"Mol\"/\"Mol\"/\"Mol\"/
1\"Mol\"/Nc1nc(OCC2CCCO2)c2nc[nH]c2n1\"Mol\"/\"Mol\"/\"Mol\"/\"Mol\"/
" ], "text/plain": [ " ROMol Smiles Core R1 R2 R3\n", "0 \"Mol\"/ CC(C)C(=O)COc1nc(N)nc2[nH]cnc12 \"Mol\"/ \"Mol\"/ \"Mol\"/ \"Mol\"/\n", "1 \"Mol\"/ Nc1nc(OCC2CCCO2)c2nc[nH]c2n1 \"Mol\"/ \"Mol\"/ \"Mol\"/ \"Mol\"/" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "frame = frame[[\"ROMol\", \"Smiles\", \"Core\", \"R1\", \"R2\", \"R3\"]]\n", "frame['Core']=frame['Core'].apply(Chem.RemoveHs)\n", "frame.head(2)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "dataset = rg.GetRGroupsAsColumns()\n", "core = Chem.RemoveHs(dataset[\"Core\"][0])" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "image/svg+xml": [ "\n", "\n", " \n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "N\n", "N\n", "N\n", "N\n", "R1:1\n", "R2:2\n", "R3:3\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "core" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [], "source": [ "res = enumeratemol(core,rg)" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", " \n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "N\n", "N\n", "NH\n", "N\n", "O\n", "O\n", "NH2\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "N\n", "N\n", "NH\n", "N\n", "O\n", "O\n", "NH2\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "N\n", "N\n", "NH\n", "N\n", "O\n", "O\n", "NH2\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "N\n", "N\n", "NH\n", "N\n", "O\n", "O\n", "NH2\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "N\n", "N\n", "NH\n", "N\n", "O\n", "O\n", "NH2\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "N\n", "N\n", "NH\n", "N\n", "O\n", "O\n", "NH\n", "OH\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "N\n", "N\n", "NH\n", "N\n", "O\n", "O\n", "OH\n", "NH\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "N\n", "N\n", "NH\n", "N\n", "O\n", "O\n", "N\n", "OH\n", "HO\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "N\n", "N\n", "NH\n", "N\n", "O\n", "O\n", "NH\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "N\n", "N\n", "NH\n", "N\n", "O\n", "O\n", "NH\n", "S\n", "O\n", "O\n", "NH2\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "N\n", "N\n", "NH\n", "N\n", "O\n", "O\n", "OH\n", "NH\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "N\n", "N\n", "NH\n", "N\n", "O\n", "O\n", "OH\n", "NH\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "N\n", "N\n", "NH\n", "N\n", "O\n", "O\n", "NH\n", "NH3+\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "N\n", "N\n", "NH\n", "N\n", "O\n", "O\n", "NH\n", "NH3+\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "N\n", "N\n", "NH\n", "N\n", "O\n", "O\n", "NH2\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "N\n", "N\n", "NH\n", "N\n", "O\n", "O\n", "NH2\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "N\n", "N\n", "NH\n", "N\n", "O\n", "O\n", "NH2\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "N\n", "N\n", "NH\n", "N\n", "O\n", "O\n", "NH2\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "N\n", "N\n", "NH\n", "N\n", "O\n", "O\n", "NH2\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "N\n", "N\n", "NH\n", "N\n", "O\n", "O\n", "NH\n", "OH\n", "" ], "text/plain": [ "" ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Draw.MolsToGridImage(res[:20])" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2744 2744\n" ] } ], "source": [ "print(14**3, len(res))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.6.6" } }, "nbformat": 4, "nbformat_minor": 2 }