{ "metadata": { "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.7.8-final" }, "orig_nbformat": 2, "kernelspec": { "name": "Python 3.7.8 64-bit ('rdkit-env': conda)", "display_name": "Python 3.7.8 64-bit ('rdkit-env': conda)", "metadata": { "interpreter": { "hash": "ff61d13abe230febdcf9f05a768048a47be2ac8377dcb96e6daf2ab6fcfbf665" } } } }, "nbformat": 4, "nbformat_minor": 2, "cells": [ { "source": [ "# pdbeccdutils\n", "\n", "This exercise demonstrates the use of the [pdbeccdutils](https://github.com/PDBeurope/ccdutils) - a set of python tools for working with small molecule components in the Protein Data Bank archive. \n", "\n", "You can use two main resources as input data for the package. [wwPDB CCD](http://www.wwpdb.org/data/ccd) contains models of all the ligands e.g. drug molecules, cofactors etc. commonly found in the PDB archive, whereas [wwPDB BIRD](http://www.wwpdb.org/data/bird) is composed of biologically interesting polymeric molecules such as peptides or oligosaccharides.\n", "\n", "CCD components can be downloaded as a bundle either from [wwPDB FTP area](ftp://ftp.wwpdb.org/pub/pdb/data/monomers/components.cif.gz), or from [PDBe FTP area](http://ftp.ebi.ac.uk/pub/databases/msd/pdbechem_v2/components.cif). The components from the PDBe area are enriched with information about common fragments found in the molecules, their molecular scaffolds as well as links to popular small molecule chemistry databases. You can also use PDBeChem to download individual components from the following link using proper CCD id substitution: .\n", "\n", "'BIRD' molecules can be downloaded in the *.tar.gz format from the following location: \n" ], "cell_type": "markdown", "metadata": {} }, { "source": [ "pdbeccdutils relies on [RDKit](https://www.rdkit.org/) for the most of its functionality and as such it is best to be used along with [conda environment](https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html)\n", "\n", "Install and activate conda environment with rdkit using the following command:\n", "\n", "```bash\n", "conda create -c conda-forge -n rdkit-env rdkit python=3.7\n", "conda activate rdkit-env\n", "```" ], "cell_type": "markdown", "metadata": {} }, { "source": [ "You can then install the pdbeccdutils either from [PYPi](https://pypi.org/project/pdbeccdutils/) or directly from the [repository](https://github.com/PDBeurope/ccdutils) using one of the following commands:\n", "\n", "```bash\n", "pip install pdbeccdutils\n", "pip install git+https://github.com/PDBeurope/ccdutils.git@master#egg=pdbeccdutils\n", "```" ], "cell_type": "markdown", "metadata": {} }, { "source": [ "The pdbeccdutils API contains a number of different modules stored in namespaces with respect to their functionality. All off the modules along with useful tips are documented in the [documentation](https://pdbeurope.github.io/ccdutils/). In this exercise we will go through some of the use cases." ], "cell_type": "markdown", "metadata": {} }, { "source": [ "The structure of the package looks roughly like this:\n", "\n", "```text\n", "pdbeccdutils\n", " computations\n", " parity_method.py\n", " core\n", " ccd_reader.py\n", " ccd_writer.py\n", " component.py\n", " depictions.py\n", " fragment_library.py\n", " scripts\n", " process_components_cif_cli.py\n", " setup_pubchem_library.py\n", " utils\n", " pubchem_downloader.py\n", " web_services.py\n", "```" ], "cell_type": "markdown", "metadata": {} }, { "source": [ "Before we start we need to download a CCD component for demonstaration purposes. We are going to use Heme (CCD ID: [HEM](https://www.ebi.ac.uk/pdbe-srv/pdbechem/chemicalCompound/show/HEM))." ], "cell_type": "markdown", "metadata": {} }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import requests\n", "\n", "def download_component(ccd_id):\n", " response = requests.get(f'http://ftp.ebi.ac.uk/pub/databases/msd/pdbechem_v2/{ccd_id[0]}/{ccd_id}/{ccd_id}.cif')\n", " cif_path = f'{ccd_id}.cif'\n", "\n", " with open(cif_path, 'wb') as fp:\n", " fp.write(response.content)\n", " \n", " return cif_path\n", "\n", "hem_path = download_component('HEM')" ] }, { "source": [ "## Structure reading\n", "\n", "Structure reading can be done using `ccd_reader.py` module located in the `pdbeccdutils.core` module. By default, the molecules comes [sanitized](https://www.rdkit.org/docs/RDKit_Book.html#molecular-sanitization) using RDKit sanitization procedure and our internal process. However, this option can be turned off by specifying optional parameter `sanitize=False` to the function.\n" ], "cell_type": "markdown", "metadata": {} }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "CCDReaderResult(warnings=[], errors=[], component=)" ] }, "metadata": {}, "execution_count": 2 } ], "source": [ "from pdbeccdutils.core import ccd_reader\n", "\n", "ccd_reader_result = ccd_reader.read_pdb_cif_file(hem_path)\n", "ccd_reader_result" ] }, { "source": [ "CCDReaderResult contains a list of possible warnings and errors that were encountered during the structure parsing. There is also a convenience method that allows reading in multiple chemical components provided they are listed in different data blocks in a single mmCIF file at the same time." ], "cell_type": "markdown", "metadata": {} }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "{'HEM': CCDReaderResult(warnings=[], errors=[], component=)}" ] }, "metadata": {}, "execution_count": 3 } ], "source": [ "components_result = ccd_reader.read_pdb_components_file('HEM.cif', sanitize=False)\n", "components_result" ] }, { "source": [ "## Component object\n", "\n", "The component object contains a list of usefull properties retrieved directly from the CCD file as well as shorthand functions to the RDKit functionality in the following excercise we will go through some of them." ], "cell_type": "markdown", "metadata": {} }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "" ] }, "metadata": {}, "execution_count": 4 } ], "source": [ "component = ccd_reader_result.component\n", "component" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "'C34 H32 Fe N4 O4'" ] }, "metadata": {}, "execution_count": 5 } ], "source": [ "component.formula\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "'KABFMIBPWCXCRK-RGGAHWMASA-L'" ] }, "metadata": {}, "execution_count": 6 } ], "source": [ "component.inchikey" ] }, { "source": [ "### Scaffolds\n", "\n", "One of the shorthand function allows you to calculate molecular scaffolds using [get_scaffolds()](https://pdbeurope.github.io/ccdutils/pdbeccdutils.core.html#pdbeccdutils.core.component.Component.get_scaffolds) method. You can choose a number of different scaffolds to compute, if you don't provide any parameter [Murcko scaffold](https://www.rdkit.org/docs/source/rdkit.Chem.Scaffolds.MurckoScaffold.html) is computed by default.\n" ], "cell_type": "markdown", "metadata": {} }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "[]" ] }, "metadata": {}, "execution_count": 7 } ], "source": [ "# at first scaffolds property is empty\n", "component.scaffolds\n", "[]\n", "\n", "# returns an array of rdkit Mol objects with scaffolds found.\n", "component.get_scaffolds()" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "SubstructureMapping(name='MurckoScaffold', smiles='C1=CC2=[N+]3C1=Cc1ccc4n1[Fe-2]31n3c(ccc3=CC3=[N+]1C(=C4)C=C3)=C2', source='RDKit scaffolds', mappings=[['CHA', 'CHB', 'CHC', 'CHD', 'C1A', 'C2A', 'C3A', 'C4A', 'C1B', 'C2B', 'C3B', 'C4B', 'C1C', 'C2C', 'C3C', 'C4C', 'C1D', 'C2D', 'C3D', 'C4D', 'NA', 'NB', 'NC', 'ND', 'FE']])" ] }, "metadata": {}, "execution_count": 8 } ], "source": [ "scaffold_details = component.scaffolds[0]\n", "scaffold_details" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "[['CHA',\n", " 'CHB',\n", " 'CHC',\n", " 'CHD',\n", " 'C1A',\n", " 'C2A',\n", " 'C3A',\n", " 'C4A',\n", " 'C1B',\n", " 'C2B',\n", " 'C3B',\n", " 'C4B',\n", " 'C1C',\n", " 'C2C',\n", " 'C3C',\n", " 'C4C',\n", " 'C1D',\n", " 'C2D',\n", " 'C3D',\n", " 'C4D',\n", " 'NA',\n", " 'NB',\n", " 'NC',\n", " 'ND',\n", " 'FE']]" ] }, "metadata": {}, "execution_count": 9 } ], "source": [ "# list of lists of atom names with atoms that are part of the scaffold.\n", "scaffold_details.mappings" ] }, { "source": [ "### Fragments\n", "\n", "pdbeccdutils package contains also a shorthand functions to enable searching through fragment libraries. By default the code is supplied with a hand-curated library that is internally used by the PDBe as well as collaborating resources ENAMINE and DSI. You can read more about the molecular fragments the built-in library contains in the [documentation](https://pdbeurope.github.io/ccdutils/guide/fragments.html) as well as about an input file format in case you want to supply your own fragment library." ], "cell_type": "markdown", "metadata": {} }, { "source": [ "from pdbeccdutils.core.fragment_library import FragmentLibrary\n", "\n", "# if you dont provide any parameter to the FragmentLibrary constructor\n", "# supplied fragment library is used\n", "library = FragmentLibrary()\n", "fragments = component.library_search(library)\n", "len(fragments)\n" ], "cell_type": "code", "metadata": {}, "execution_count": 10, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "2" ] }, "metadata": {}, "execution_count": 10 } ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "SubstructureMapping(name='pyrrole', smiles='c1cc[nH]c1', source='PDBe', mappings=((4, 5, 6, 7, 38), (21, 22, 23, 24, 40)))" ] }, "metadata": {}, "execution_count": 11 } ], "source": [ "fragments[1]" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "1 instance(s) of the fragment porphin-like found. SMILES:C1~C~C2~C~C3~C~C~C(~C~C4~C~C~C(~C~C5~C~C~C(~C~C~1~N~2)~N~5)~N~4)~N~3\n2 instance(s) of the fragment pyrrole found. SMILES:c1cc[nH]c1\n" ] } ], "source": [ "for f in component.fragments:\n", " print(f'{len(f.mappings)} instance(s) of the fragment {f.name} found. SMILES:{f.smiles}')" ] }, { "source": [ "### Molecular depictions\n", "\n", "component object exposes method [compute_2d()](https://pdbeurope.github.io/ccdutils/pdbeccdutils.core.html#pdbeccdutils.core.component.Component.compute_2d) that takes [DepictionManager](https://pdbeurope.github.io/ccdutils/pdbeccdutils.core.html#pdbeccdutils.core.depictions.DepictionManager) object as an argument. This enables you to take advantage of depiction templates supplied with the package. Alternativelly, you can provide paths to your own depiction templates and templates from PubChem. You build a library of pubchem templates using the following [script](https://pdbeurope.github.io/ccdutils/pdbeccdutils.scripts.html#module-pdbeccdutils.scripts.setup_pubchem_library_cli).\n" ], "cell_type": "markdown", "metadata": {} }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "from rdkit.Chem.Draw import IPythonConsole # this import allows you to display images directly in the jupyter notebook\n", "from IPython.core.display import SVG # allows to display SVG images" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "DepictionResult(source=, template_name='hem', mol=, score=0.0)" ] }, "metadata": {}, "execution_count": 14 } ], "source": [ "from pdbeccdutils.core.depictions import DepictionManager\n", "\n", "# create an instance of the depiction manager\n", "d = DepictionManager()\n", "result_2d = component.compute_2d(d)\n", "result_2d" ] }, { "source": [ "We can use the score that is part of the result to find out the quality of the depiction. Generally, the lower the better. Higher values indicate bonds crossings and crowded atoms." ], "cell_type": "markdown", "metadata": {} }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "0.0" ] }, "metadata": {}, "execution_count": 15 } ], "source": [ "# depiction score\n", "result_2d.score" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "" ], "image/png": "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\n" }, "metadata": {}, "execution_count": 16 } ], "source": [ "# and the depiction itself\n", "result_2d.mol" ] }, { "source": [ "Let's have a look at the example where molecular depiction cannot be drawn as collision free. We are going to use [Adamantone](https://www.ebi.ac.uk/pdbe-srv/pdbechem/chemicalCompound/show/ADO) as an example." ], "cell_type": "markdown", "metadata": {} }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Depiction score is: 1.0\n" ] }, { "output_type": "execute_result", "data": { "text/plain": [ "" ], "image/png": "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\n" }, "metadata": {}, "execution_count": 17 } ], "source": [ "ado_path = download_component('ADO')\n", "ado = ccd_reader.read_pdb_cif_file(ado_path).component\n", "ado_depiction_result = ado.compute_2d(d)\n", "\n", "print(f'Depiction score is: {ado_depiction_result.score}')\n", "ado_depiction_result.mol\n" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "" ], "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\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nCHA\nCHB\nCHC\nCHD\nC1A\nC2A\nC3A\nC4A\nCMA\nCAA\nCBA\nCGA\nO1A\nO2A\nC1B\nC2B\nC3B\nC4B\nCMB\nCAB\nCBB\nC1C\nC2C\nC3C\nC4C\nCMC\nCAC\nCBC\nC1D\nC2D\nC3D\nC4D\nCMD\nCAD\nCBD\nCGD\nO1D\nO2D\nNA\nNB\nNC\nND\nFE\n" }, "metadata": {}, "execution_count": 18 } ], "source": [ "# we can also use convenient functions to store the depiction as an svg image:\n", "component.export_2d_svg('HEM.svg')\n", "\n", "# including atom names\n", "component.export_2d_svg('HEM_with_names.svg', names=True)\n", "SVG('HEM_with_names.svg')" ] }, { "source": [ "We can also export the svg image and highlight atoms and bonds. Let's highlight the molecular scaffold we calculated earlier." ], "cell_type": "markdown", "metadata": {} }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "" ], "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\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nO\nHO\nO\nHO\nN\nN+\nN\nN+\nFe2-\n" }, "metadata": {}, "execution_count": 19 } ], "source": [ "# retrieve list of atom names that are part of the scaffold \n", "# and color them in green. RGB: (0.2, 0.5, 0.2). \n", "# Scale 0-1 is used instead of the common 0-255\n", "scaffold = component.scaffolds[0]\n", "atom_names = scaffold.mappings[0]\n", "atom_color_mapping = {x: (0.2, 0.5, 0.2) for x in atom_names}\n", "\n", "# find out all the bonds that are formed among the scaffold atoms and color them in green as well.\n", "bond_color_highlight = {}\n", "bonds = component.mol_no_h.GetBonds()\n", "for bond in bonds:\n", " begin = bond.GetBeginAtom().GetProp('name')\n", " end = bond.GetEndAtom().GetProp('name')\n", "\n", " if begin in atom_names and end in atom_names:\n", " bond_color_highlight[(begin, end)] = ((0.2, 0.5, 0.2))\n", "\n", "# draw the final image\n", "component.export_2d_svg('HEM_with_scaffold.svg', \n", " atom_highlight=atom_color_mapping,\n", " bond_highlight=bond_color_highlight)\n", "SVG('HEM_with_scaffold.svg')" ] }, { "source": [ "The exactly same operations can be done by using input data from wwPDB BIRD dictionary. For the following example we are going to use [Vancomycin](https://en.wikipedia.org/wiki/Vancomycin), an antibiotic used for bacterial infection treatment. Just download `PRDCC_000204` wwPDB BIRD entry from the [FTP directory](ftp://ftp.wwpdb.org/pub/pdb/data/bird/prd/)." ], "cell_type": "markdown", "metadata": {} }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "" ], "image/png": "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\n" }, "metadata": {}, "execution_count": 20 } ], "source": [ "c = ccd_reader.read_pdb_cif_file('PRDCC_000204.cif').component\n", "c.compute_2d(d).mol" ] }, { "source": [ "## Structure writing\n", "\n", "Structure writing can be done using `ccd_writer.py` module located in the `pdbeccdutils.core` module. This module exposes [write_molecule()](https://pdbeurope.github.io/ccdutils/pdbeccdutils.core.html#pdbeccdutils.core.ccd_writer.write_molecule) method that enables writing out conformers of chemical components in a number of different formats. See example below:" ], "cell_type": "markdown", "metadata": {} }, { "source": [ "from pdbeccdutils.core import ccd_writer\n", "from pdbeccdutils.core.models import ConformerType\n", "\n", "# write out ideal conformer in the PDB format\n", "ccd_writer.write_molecule('HEM_ideal.pdb', component, conf_type=ConformerType.Ideal)\n", "\n", "# write out model conformer in the SDF format without hydrogens\n", "ccd_writer.write_molecule('HEM_model_no_h.sdf',\n", " component, remove_hs=True, conf_type=ConformerType.Model)\n", "\n", "# write out metadata information in CML format\n", "ccd_writer.write_molecule('HEM_in_cif.cml', component)" ], "cell_type": "code", "metadata": {}, "execution_count": 21, "outputs": [] }, { "source": [ "## Parity method\n", "\n", "There is a number of chemical similarity methods that can estimate a degree of similarity between the two molecules. pdbeccdutils implements one of such methods that takes advantage of maximum common sub-structures. This method is called PARITY and was developed by Jon Tyzack while working at EBI. You can read the description of the method in the [published paper](https://doi.org/10.1016/j.str.2018.02.009).\n", "\n", "In the following example we are going to examine molecular similarity of two heme variants [HEME A](http://pdbe.org/chem/HEA) and [HEME D](http://pdbe.org/chem/DHE)" ], "cell_type": "markdown", "metadata": {} }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "# download the structures first\n", "hem_a_path = download_component('HEA')\n", "hem_d_path = download_component('DHE')" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "ParityResult(mapping={0: 0, 5: 5, 6: 6, 1: 1, 35: 42, 31: 38, 32: 39, 4: 4, 27: 37, 23: 27, 24: 28, 3: 3, 21: 26, 17: 16, 18: 17, 2: 2, 9: 9, 8: 8, 7: 7, 12: 11, 13: 12, 14: 13, 15: 14, 16: 15, 10: 10, 19: 18, 20: 20, 42: 22, 44: 23, 45: 25, 22: 19, 25: 29, 26: 31, 29: 33, 30: 34, 28: 30, 33: 40, 34: 41, 37: 44, 38: 45, 39: 46, 40: 47, 41: 48, 36: 43}, similarity_score=0.6029411764705882)" ] }, "metadata": {}, "execution_count": 23 } ], "source": [ "from pdbeccdutils.computations.parity_method import compare_molecules\n", "\n", "hem_a = ccd_reader.read_pdb_cif_file(hem_a_path).component\n", "hem_d = ccd_reader.read_pdb_cif_file(hem_d_path).component\n", "\n", "result = compare_molecules(hem_a.mol_no_h, hem_d.mol_no_h)\n", "result\n" ] }, { "source": [ "`ParityResult.mapping` contains left to right atom equivalency." ], "cell_type": "markdown", "metadata": {} }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Similarity between heme A and heme D is: 0.603.\n" ] } ], "source": [ "print(f'Similarity between heme A and heme D is: {result.similarity_score:.3f}.')" ] }, { "source": [ "## Scripts\n", "\n", "pdbeccdutils package implements also [scripts](https://pdbeurope.github.io/ccdutils/guide/pipelines.html) that we internally use for chemistry related processes in the PDBe. Directly from the package you can try out the PDBeChem that generates content of the [FTP area](http://ftp.ebi.ac.uk/pub/databases/msd/pdbechem_v2) and provides all the data that are consumed by the [service](http://pdbe.org/chem)." ], "cell_type": "markdown", "metadata": {} } ] }