{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# RDKit Interface\n", "\n", "In this tutorial we will demonstrate how `molli` `Molecule` objects can be efficiently converted into RDKit objects. Let's discuss some of their functionality.\n", "\n", "Note: `rdkit` and `openbabel` are necessary dependencies for this interface that are not natively installed within `molli`, but these can be added through conda using the lines:\n", "`conda install rdkit` and `conda install openbabel` respectively" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "#Imports molli\n", "import molli as ml\n", "\n", "#Configures molli visualizer\n", "ml.visual.configure(bg_color='white')\n", "\n", "#Imports rdkit\n", "from rdkit import Chem\n", "\n", "#Imports the rdkit interface in molli\n", "from molli.external import rdkit as mrd\n", "\n", "#Imports numpy\n", "import numpy as np" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Object creation\n", "\n", "Existing `Molecule` objects can be utilized to create an RDKit molecule using the `to_rdmol` function. Since there is different behavior upon creation of RDKit molecules based on the format utilzied when reading structures, multiple native RDKit readers were made available, including `MOL2`, `PDB`, `SDF`, and `SMI`. This implementation detects problems upon parsing and will raise erros if they occur upon creation of the RDKit molecule." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# This creates a molecule object\n", "ml_mol = ml.load(ml.files.dendrobine_mol2)\n", "\n", "# This creates an RDKit molecule object using the SDF reader so\n", "rd_mol = mrd.to_rdmol(ml_mol, via='sdf', remove_hs=True, raise_kekulize=True)\n", "\n", "rd_mol" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the above example, all hydrogens were removed from the `rd_mol`, DESPITE THE IMAGE DEPICTING IT WITH HYDROGENS. The element labels are not a 1:1 mapping between `ml_mol` and `rd_mol`. This can be shown by printing the symbols of the atoms in both objects.\n", "\n", "If the `ml_mol` is reduced to only heavy atoms, it maintains the same order as the `rd_mol`." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "All Molli Element Labels:\n", "['N', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'O', 'C', 'C', 'O', 'C', 'C', 'H', 'H', 'H', 'H', 'C', 'C', 'C', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H']\n", "All RDKit Element Labels:\n", "['N', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'O', 'C', 'C', 'O', 'C', 'C', 'C', 'C', 'C']\n", "Molli Heavy Element Labels Only:\n", "['N', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'O', 'C', 'C', 'O', 'C', 'C', 'C', 'C', 'C']\n" ] } ], "source": [ "#This retrieves the rdkit atom symbols\n", "rd_labels = [x.GetSymbol() for x in rd_mol.GetAtoms()]\n", "\n", "#This retrieves the molli atom labels\n", "ml_labels = [x.label for x in ml_mol.atoms]\n", "\n", "#This retrieves all non-hydrogen atom labels based on the current order of the list\n", "ml_heavy_labels = [ml_mol.get_atom(x).label for x in ml_mol.heavy.parent_atom_indices]\n", "\n", "print(f'All Molli Element Labels:\\n{ml_labels}')\n", "print(f'All RDKit Element Labels:\\n{rd_labels}')\n", "print(f'Molli Heavy Element Labels Only:\\n{ml_heavy_labels}')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Hydrogens can also be maintained for the purpose of mapping the indices of atoms from the RDKit molecule object `rd_mol` back to the full 3D structure in the `ml_mol`. " ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# This creates a molecule object\n", "ml_mol = ml.load(ml.files.dendrobine_mol2)\n", "\n", "# This creates an RDKit molecule object using the SDF reader so\n", "rd_mol = mrd.to_rdmol(ml_mol, via='sdf', remove_hs=False, raise_kekulize=True)\n", "\n", "rd_mol" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this example, since the Hydrogens were not removed, the order of element labels has not been changed between the `ml_mol` and `rd_mol` It is recommended that you work with `rd_mol` without removing the hydrogens to allow for direct mapping." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "All Molli Element Labels:\n", "['N', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'O', 'C', 'C', 'O', 'C', 'C', 'H', 'H', 'H', 'H', 'C', 'C', 'C', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H']\n", "All RDKit Element Labels:\n", "['N', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'O', 'C', 'C', 'O', 'C', 'C', 'H', 'H', 'H', 'H', 'C', 'C', 'C', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H']\n" ] } ], "source": [ "rd_atoms = [x.GetSymbol() for x in rd_mol.GetAtoms()]\n", "ml_elements = [x.label for x in ml_mol.atoms]\n", "print(f'All Molli Element Labels:\\n{ml_elements}')\n", "print(f'All RDKit Element Labels:\\n{rd_atoms}')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Canonicalization of 2D and 3D objects\n", "\n", "A common method utilized within RDKit is \"canonicalization\" of SMILES strings, which reorders the order of atoms in the SMILES string such that any permutation of a SMILES input will always be represented in the same way.\n", "\n", "This allows direct comparison of structures solely by strings, which is a much less intensive operation than comparing individual atom and bond properties between molecule objects." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "SMILES 1\n", "Original SMILES:c1ccccc1(Br)\n", "Canonical SMILES:Brc1ccccc1\n", "\n", "SMILES 2\n", "Original SMILES:c1ccc(Br)cc1\n", "Canonical SMILES:Brc1ccccc1\n" ] } ], "source": [ "#Bromobenzene 1\n", "smi1 = 'c1ccccc1(Br)'\n", "rdmol1 = Chem.MolFromSmiles(smi1)\n", "can_smi1 = Chem.MolToSmiles(rdmol1, canonical=True)\n", "\n", "#Bromobenzene 2\n", "smi2 = 'c1ccc(Br)cc1'\n", "rdmol2 = Chem.MolFromSmiles(smi2)\n", "can_smi2 = Chem.MolToSmiles(rdmol2, canonical=True)\n", "\n", "print(f'SMILES 1\\nOriginal SMILES:{smi1}\\nCanonical SMILES:{can_smi1}\\n')\n", "print(f'SMILES 2\\nOriginal SMILES:{smi2}\\nCanonical SMILES:{can_smi2}')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Molli has an implementation that can take the `rd_mol` and `ml_mol` and map the two structures to a canonicalized version of the `rd_mol` \n", "\n", "This will not change the actual coordinates of the `ml_mol` but rather just the order of the coordinates. This will allow for integration into RDKit workflows without accidental loss of information.\n", "\n", "Note: The current implementation will modify the `ml_mol` atom, bond, and coordinate order in place." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Molli Element Labels:\n", "['H', 'C', 'H', 'H', 'N', 'C', 'H', 'H', 'C', 'H', 'C', 'H', 'H', 'C', 'H', 'H', 'C', 'H', 'C', 'H', 'C', 'O', 'O', 'C', 'H', 'C', 'H', 'C', 'C', 'H', 'H', 'H', 'C', 'H', 'C', 'H', 'C', 'H', 'H', 'H', 'C', 'H', 'H', 'H']\n", "RDKit Element Labels:\n", "['H', 'C', 'H', 'H', 'N', 'C', 'H', 'H', 'C', 'H', 'C', 'H', 'H', 'C', 'H', 'H', 'C', 'H', 'C', 'H', 'C', 'O', 'O', 'C', 'H', 'C', 'H', 'C', 'C', 'H', 'H', 'H', 'C', 'H', 'C', 'H', 'C', 'H', 'H', 'H', 'C', 'H', 'H', 'H']\n" ] } ], "source": [ "can_rdmol, atom_reorder, bond_reorder = mrd.can_mol_order(rd_mol)\n", "\n", "can_ml_rd_dict = mrd.reorder_molecule(ml_mol, can_rdmol, atom_reorder, bond_reorder)\n", "\n", "new_rd_labels = [x.GetSymbol() for x in can_rdmol.GetAtoms()]\n", "new_ml_labels = [x.label for x in ml_mol.atoms]\n", "print(f'Molli Element Labels:\\n{new_rd_labels}')\n", "print(f'RDKit Element Labels:\\n{new_ml_labels}')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The Atom Filter Class\n", "\n", "There is also an implementation of an interface with RDKit's `rdQueries` module that allows for quick querying of atom properties. \n", "\n", "The `atom_filter` class offers quick querying of rdkit mols, returning an array of `True` or `False` based on the position of atoms in an ordered array. \n", "\n", "An example use case is given below:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "This is the canonicalized SMILES: Br/C=C/c1ccccc1\n", "This is the boolean array of atoms in the same order marking whether atoms are aromatic or not:\n", "[False False False True True True True True True]\n" ] } ], "source": [ "#(E)-β-Bromostyrene instantiation\n", "rdmol = Chem.MolFromSmiles('Br\\C=C\\c1ccccc1')\n", "\n", "#(E)-β-Bromostyrene instantiation canonicalization using RDKit\n", "rdmol = mrd.canonicalize_rdmol(rdmol, remove_hs=True)\n", "\n", "#This creates an atom filter object from the rdkit mol\n", "ac_rdmol = mrd.atom_filter(rdmol)\n", "\n", "#This queries the atoms to detect aromatic atoms as defined by RDKit, and creates a boolean array out of them.\n", "aromatic_bool = ac_rdmol.aromatic_type()\n", "\n", "print(f'This is the canonicalized SMILES: {Chem.MolToSmiles(rdmol)}')\n", "print(f'This is the boolean array of atoms in the same order marking whether atoms are aromatic or not:\\n{aromatic_bool}')\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Within the SMILES string, the property of atoms being `aromatic` is only `True` for the atoms associated with the benzene ring, so the resulting array will be `False` for the first 3 atoms, while the last 6 atoms in that array will be `True`. This logic can now undergo basic boolean operations to allow for complex querying very easily." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "This is the canonicalized SMILES: Br/C=C/c1ccccc1\n", "This is the boolean array of atoms in the same order identifying sp2 atoms that are NOT aromatic:\n", "[False False False True True True True True True]\n" ] } ], "source": [ "#Identifies atoms that are both sp2 and NOT aromatic\n", "alkene_bool = ac_rdmol.sp2_type() & ~ac_rdmol.aromatic_type()\n", "\n", "print(f'This is the canonicalized SMILES: {Chem.MolToSmiles(rdmol)}')\n", "print(f'This is the boolean array of atoms in the same order identifying sp2 atoms that are NOT aromatic:\\n{aromatic_bool}')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Smarts Querying Example 1: Halogen Detection\n", "\n", "This has also been extended to allow Smarts querying and to allow more general purpose binning of atoms. An example is shown below with how 4 different rdkit mol objects could be binned into different lists just by querying molecules that may contain either a `Cl`, `Br`, or `I`." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "#(1-chloro-3-[(E)-2-chloroethenyl]benzene instantiation\n", "di_cl_rdmol = Chem.MolFromSmiles('Cl\\C=C\\c1cccc(Cl)c1')\n", "#(1-chloro-3-[(E)-2-chloroethenyl]benzene canonicalization\n", "di_cl_rdmol = mrd.canonicalize_rdmol(di_cl_rdmol)\n", "#Sets name for RDKit molecule\n", "di_cl_rdmol.SetProp(\"_Name\", '2cl_mol')\n", "\n", "\n", "#(E)-β-Bromostyrene instantiation\n", "br_rdmol = Chem.MolFromSmiles('Br\\C=C\\c1ccccc1')\n", "#(E)-β-Bromostyrene canonicalization\n", "br_rdmol = Chem.MolFromSmiles(Chem.MolToSmiles(br_rdmol, canonical=True))\n", "#Sets name for RDKit molecule\n", "br_rdmol.SetProp(\"_Name\", 'br_mol')\n", "\n", "\n", "#(E)-β-Iodostyrene canonicalization\n", "i_rdmol = Chem.MolFromSmiles('I\\C=C\\c1ccccc1')\n", "#(E)-β-Iodostyrene canonicalization\n", "i_rdmol = Chem.MolFromSmiles(Chem.MolToSmiles(i_rdmol, canonical=True))\n", "#Sets name for RDKit molecule\n", "i_rdmol.SetProp(\"_Name\", 'i_rdmol')\n", "\n", "\n", "#(E)-β-Methylstyrene initialization\n", "c_rdmol = Chem.MolFromSmiles('C\\C=C\\c1ccccc1')\n", "#(E)-β-Methylstyrene canonicalization\n", "c_rdmol = Chem.MolFromSmiles(Chem.MolToSmiles(c_rdmol, canonical=True))\n", "#Sets name for RDKit molecule\n", "c_rdmol.SetProp(\"_Name\", 'c_rdmol')\n", "\n", "rdmol_list = [di_cl_rdmol, br_rdmol, i_rdmol, c_rdmol]\n" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Multiple Halogen Mols:\n", "['2cl_mol']\n", "\n", "Single Halogen Mols:\n", "['br_mol', 'i_rdmol']\n", "\n", "No Halogen Mols\n", "['c_rdmol']\n", "\n" ] } ], "source": [ "#Creates example bins\n", "no_halogen_mols = list()\n", "single_halogen_mols = list()\n", "multi_halogen_mols = list()\n", "\n", "#Iterates throught the list containing all 4 RDKit Mols\n", "for rdmol in rdmol_list:\n", "\n", " #Instantiates atom filter object\n", " ac_rdmol = mrd.atom_filter(rdmol)\n", "\n", " #Defines a boolean looking for the following halogens based off of SMARTS\n", " halogen_bool = ac_rdmol.smarts_query('[Cl,Br,I]')\n", "\n", " #Counts the True values\n", " true_count = np.count_nonzero(halogen_bool)\n", "\n", " #Bins names/results based on number of halogens\n", " if true_count > 1:\n", " multi_halogen_mols.append(rdmol.GetProp(\"_Name\"))\n", "\n", " elif true_count == 1:\n", " single_halogen_mols.append(rdmol.GetProp(\"_Name\"))\n", " \n", " else:\n", " no_halogen_mols.append(rdmol.GetProp(\"_Name\"))\n", "\n", "print(f'Multiple Halogen Mols:\\n{multi_halogen_mols}\\n')\n", "print(f'Single Halogen Mols:\\n{single_halogen_mols}\\n')\n", "print(f'No Halogen Mols\\n{no_halogen_mols}\\n')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Smarts Querying Example 2: Complex Substructure Assignment\n", "\n", "This can also be linked to the original 3D `molli` object, enabling flexible substructure querying methods that would be otherwise unavailable without hard-encoded rules of branching on the 3D structure. An example is shown below how SMARTS enable the querying of specific carbon atoms associated with the 2 5-membered rings of the of pyrrolidine and methyl group the 3D object utilizing RDKit's substructure querying." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# This creates a molecule object\n", "ml_mol = ml.load(ml.files.dendrobine_mol2)\n", "\n", "# This creates an RDKit molecule object using the SDF reader so\n", "rd_mol = mrd.to_rdmol(ml_mol, via='sdf', remove_hs=False, raise_kekulize=True)\n", "\n", "rd_mol" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "N1(C([H])([H])[H])C([H])([H])[C@]2([H])[C@]3(C([H])([H])[H])[C@]1([H])[C@]1([H])OC(=O)[C@]([H])([C@@]3([H])C([H])([H])C2([H])[H])[C@@]1(C(C([H])([H])[H])(C([H])([H])[H])[H])[H]\n", "[ True True True True True True True True True False False False\n", " False False False False False False False False False False False False\n", " False False False False False False False False False False False False\n", " False False False False False False False False]\n" ] } ], "source": [ "#This creates an atom filter instance from the RDKit mol\n", "ac_mol = mrd.atom_filter(rd_mol)\n", "\n", "# This finds the two five-membered rings associated with the pyrrolidine, the full methyl group on the pyrrolidine, and avoiding the lactone\n", "substruct_bool = ac_mol.ring_size5() & ~ac_mol.smarts_query(\"O=C1CCCO1\") | ac_mol.smarts_query(\"CN\") \n", "\n", "#This is the \n", "print(Chem.MolToSmiles(rd_mol, canonical=False))\n", "print(substruct_bool)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This can then be assigned to the original 3D molecule since the atom orders are maintained between `rd_mol` and `ml_mol`." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[Atom(element=N, isotope=None, label='N', formal_charge=0, formal_spin=0)\n", " Atom(element=C, isotope=None, label='C', formal_charge=0, formal_spin=0)\n", " Atom(element=C, isotope=None, label='C', formal_charge=0, formal_spin=0)\n", " Atom(element=C, isotope=None, label='C', formal_charge=0, formal_spin=0)\n", " Atom(element=C, isotope=None, label='C', formal_charge=0, formal_spin=0)\n", " Atom(element=C, isotope=None, label='C', formal_charge=0, formal_spin=0)\n", " Atom(element=C, isotope=None, label='C', formal_charge=0, formal_spin=0)\n", " Atom(element=C, isotope=None, label='C', formal_charge=0, formal_spin=0)\n", " Atom(element=C, isotope=None, label='C', formal_charge=0, formal_spin=0)]\n" ] } ], "source": [ "#This creates an array of atoms of interest\n", "atoms_of_interest = np.array(ml_mol.atoms)[substruct_bool]\n", "print(atoms_of_interest)\n", "\n", "#This assigns the attribute \"Query\" to atoms and bonds that we've considered of interest.\n", "for atom in atoms_of_interest:\n", " atom: ml.Atom\n", " #Finds atoms of interest\n", " atom.attrib[\"Query\"] = True\n", "\n", " #Finds bonds connected to this atom\n", " bonds = ml_mol.bonds_with_atom(atom)\n", "\n", " #Iterates through bonds to determine which ones are associated with atoms of interest\n", " for bond in bonds:\n", " if (bond.a1 in atoms_of_interest) and (bond.a2 in atoms_of_interest):\n", " bond.attrib[\"Query\"] = True" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Visualization of Molecules\n", "\n", "`molli` has one last feature in the RDKit interface, which is the ability to visualize either existing `molli` `Molecule` objects or RDKit molecule objects. This can be done with either the `ml_rd_visualize`" ] }, { "attachments": { "dendrobine.PNG": { "image/png": "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e3exWLNmYtasWbLQzMyZM12mCt18882ylBBSS2iqhNQYJ5LX0XHHHSdLvOnfv79rna5du8oSQkgtoakSUmMuuugil0E2bdpUzJkzR5aamTp1qmsd6FH00RJCagpNlZAa8/vvv4vFFlvMZZDnnXeeLPWmV69ernX69OkjSwghtYKmSkgOOPHEE10GucIKK8gSbx544AHXOtCMGTNkKSGkFtBUCckBn3zySYVB3hhi3tSOHTu61jkA08QRQmoGTZWQnLD//vu7DLJTp06yxJvrr7/etQ706aefylJCSNbQVAnJCS+99FKFQT700EOy1Jvll1/etQ6akgkhtYGmSkiO6N27t8sgt9tuO1niDYKa1HUQ9ITgJ0JI9tBUCckRjzzyiMsgoWnTpslSM7/88os9DEdd58ILL5SlhJAsoakSkjM6d+7sMsj//e9/ssQbJIxQ11lppZVkCSEkS2iqhOSMMWPGuAwS+uijj2SpmQ8//LBiHWyHEJItNFVCckj79u1dBnn88cfLEm9Qo1XXQY2XEJItNFVCcsgFF1zgMshFF11U/Prrr7LUDPpe1XWghx9+WJYSQrKApkpIDvntt99Es2bNXAYJow1i++23d62zww47yBJCSBbQVAnJKUOGDHEZ5IorrihLvEHNVF0HevHFF2UpIaTa0FQJySkITtIN8qabbpKl3sSJHiaEpANNlZAcEyf4yBQ9jOhgQkj1oakSkmPQdKsbZJjgIz16OMzE54SQ5NBUCck5cYKPkFFJXWeRRRYJnPicEJIcmiohOccUfDR9+nRZOq/vtWXLlqJFixbiwAMPFJdffnlF6sIwE583OJBUA3rqqbr/EpIQmiohBWCjjTZyGeR+++0nS4TYZJNNXGVeQm319NNPF7fffrt4+eWXA8e9lhIY52mnCbH55tbbz3r9mYQJ4hHcFWI+W0J0rDuIEJJ3MGG5bpIff/yxMeFDFGHauK233loMGjRIXHrppWLixInlDWqCmVrHHEkwWJoriYB11xBCisAK1gteNcQTTjhBdO3a1fW3tNS4cWOxzjrriF133VUMGzbMjih+4YUXxI8//ij3pmAE1UwhU5kjGDIhIbDuFkJIETj//POt9/s849P7TKHVVlvNzhPcp08f+/8bNWpUsUxStWnTRnTr1k0cdNBBdpan+++/X7z77rviv//+k3uaM0yGiuZd9KOqOP2rqJmaTJbGSkJg3SmEkCKA6F30i5qMDoKBIr2hDgzvgQcesCOCYYTdu3cXSy+9tHEbSXTLZpsJy8mF2HFHzEUnxOjRQkyeLMSXX8o9qQGmJt8wzblO36u6HoxWN2JCNKw7hRBSFPR5U1VtjhpZBGbPnm036Y4dO1acfPLJdlPvuuuuK5o0aWLcfpBessza+h+zmjdHqich9tlHiDPOEOL224V45RUkOZZ7UwVggPp+RI3wNRkrIT5YdwkhpCiY5k2F0Af6888/y6WSg2E6CFq67LLLxOGHH24HMyGoyfTbjr7u1MltQGFlbdf6ASEGDRLi0kuFmDBBiFmz5J4kAE286u/Ebb7Vm49ZWyU+WHcIIaRI7LXXXta73W1oqGlmAZqXX7FqmBiWc4ZV4+zfv7/oZJnp4osvLuYGBftE1cILC7H22kLssosQJ51U12w7ZYoQ330n9yYAfXtx0Wu8EVsESMMiwZ1GCKkF6BdVDRW11B9++EGW1pDPP68zoFGjhDjmGCGQ+WnVVd2GlJZatRKia1chMF73nHOEGD9eiDfflDtiAQNWl08aZKTWVtkETHyw7hBCSFH4/fffRfPmza13+zxTPfHEE2VpTvnnHyHefluI++5DCLMQBx4oRLduQrRpM8+o0hBM1kE31TDBSX7oTclsAiYeWHcHIaQojBgxwnqnzzPUBRZYQHzzzTeytIBg3OsLLwgxdqwQaMLebTch1ltPiKZN3SYWRkqWqQoTjBqgpKMHLNFUiQfW3UEIKQJz584VrVq1st7p80wVY1JLy8cfCzFpkhBXXCHEkUcK0auXEJio3TE2XWgGdkjbVNOu+ZLSYt0dhJAigIT4qqFCX9ZyDGit+PNPIV5/XYi77xbi7LOF2HdfJEAW4p575AIWesRuUvRgpaR9tKS0pHC3EUKqzb///mtnMlINdfDgwbKUVJB2YBFqus72IJoq8cC6Owgheeeiiy6y3uXuWuqnn34qS0kFaZsqm39JSKy7gxCSd9q2bWu9y+cZ6hFHHCFLiBG9+Zd9qiQjrLuDEJJnLrnkEus97q6llnZ6trRIO1qX0b8kJNbdQQjJM/qUb4ceeqgsIZ7ogUVJTVCPJibEA94dhOSYK664wnqHu2up77//viwlnuiBRTDFJKgpGNG0TIgH1h1CCMkrK6+8svUen2eoBx98sCwhgejBSnFrq3p/KiN/iQ/WHUIIySOjRo2y3uHuWurbSPdHwqGbYdzaqlpLhZIGPZFSY90hhJA80qFDB+sdPs9Q999/f1lCQqE3AcMco0bt6n2pSZuRSemx7hJCSN647rrrrHe4u5b6xhtvyFISGr22CoVpvoUh68NyYMqEBGDdKYSQvLHmmmta7/F5hjpgwABZQiKjD4eBnFor+lmd5lz8F38zLQ9xGA0JgXWnEELyxI3Wi101VAgTg5OYwCy9jDKMkgQ5kQaHdccQQvLEuuuua73L5xnqXnvtJUtIIlAL1YOOgsRIXxIR664hhOSFcePGWe9ydy11+vTpspQkBrVW1DoRcKT3mUIwXQhm6jQLExIBmiohOaJjx462kTrafffdZQkhpAjQVAnJCbfddpvLUKHnn39elhJCigBNlWTCRx995FIc0thGntloo41chrrLLrvIElJ1/vlHiJkzhZg0SYhrrhHixBNlASHRoKmSTNh8883rzQIJ4uNw2mmnJd5GXrnrrrvqj83Rc889J0tJ1Rkzpq5P1dG228oCQqJBUyWZQFP1p0uXLvXHBvXp00eWkEx45hm3qa62miwgJBo0VZIJNFVvxo8fX39cjiZPnixLSSZ89pnbVBdeWBYUh6eeesp+RhzFAd0q6jbK2M1SbWiqJBNoqt5069at/rig7bffXpaQTIGRWue/XjDaAqE+H1AcYMzqNvBvEg2aKskEmqqZBx54oP6YHD3++OOylGQKmnyt818vNAkXCJpqPqCpkkygqZrp0aNH/TFBPXv2lCUkcxCcZF2DeiF4qUDQVPMBTZVkAk21kkceeaT+eBxNnDhRlpLMOewwt6la91uRoKnmA5oqyQSaaiVbb711/fFAW221lSwhNeGCC9ymuu++sqAY0FTzAU2VZAJN1c2kSZPqj8XRQw89JEtJTbj7brepdusmC4oBTTUf0FRJJtBU3Wy77bb1xwLh/JAaM2OG21SXW04WFAOaaj6gqZJMoKnO48knn6w/Dkf333+/LM03GLeo7jfmfo2Kvg1c11zw449uU4XmzpWF+Yemmg/inXlCIqKaahoqsqn27t3bdSybbrqpLMk/pTZVsOSSblN9911ZkH9oqvmApkoygaZax9NPP11xLPfcc48szT+lN9WOHd2mOmGCLMg/NNV8QFMlmUBTraNv376u49h4441lSTEovan26+c21auukgX5RzdVnOeowvVUt0FTjQ5NlWSCbqqmBzpI6kujiKY6ZcoU1zmA7rjjDllaDHAd1P0vnakef7zbVPHvgqCbahqiqUaHpkoygYFKqAT1q99/qFOnTrKkOJTeVFEztfapXqi5FgSaaj6gqSYAN9z//ve/esW5AfGCSbqNItDQTXXatGn1++7olltukaXFofSmij5Ua5/qhT7WgqCbKp6ROFK3QVONDk01AfpNHOcGxDrqNuK8pIpAQzfVPfbYo37fofXXX1+WFIvSmyqifa19qheigQuC/j6Kg/4+oqlGh6aaAJpqeBqyqc6YMaN+vx2NHTtWlhaL0psqxqVa++QSxq8WAJpqPoh35okNTTU8DdlU+/fvX7/f0Nprry1LikfpTRUgk5K1X/VCpqUCQFPNBzTVBNBUw9NQTfW1116r32dHN9xwgywtHg3CVJHz19qveiEncAGgqeYDmmoCaKrhaaimiuAzZ5+h1VdfXZYUE90QcV3VQLswUu8FKHemitlprP2qF2avKQA01XxAU00ATTU8DdFU33zzzfr9dTR69GhZWkx0U01DuTNV7I+1X/XCPKsFgKaaD2iqCaCphqchmuqBBx5Yv7/QqquuKkuKS4Mw1TFj3Ka67bayIN/QVPMBTTUBNNXwNDRTfffdd+v31dFVBUp554VuqmjOxT0bVeo2cmeqzzzjNtXVVpMF+Yammg9oqgmgqYanoZnqIYccUr+vUPv27WVJsdFNNc79qm8jd6b62WduU114YVmQb2iq+YCmmgCaanhwXDhfUNxjxLlKuo0s+OCDD1zXFLrssstkabFpEKYKYKTWvtULRptzcB7V8xoHmmpyaKoJ0G9iNIU5L/2wwjrqNspqqg2JQYMGua5pu3btZEnxaTCmiiZfa9/qhSbhnIPzqJ7XONBUk0NTTYB+E6chmmqx+fjjjyuu6ciRI2Vp8WkwporgJGvf6oXgpZxDU80HNNUE0FSJzlFHHeW6nssss4wsKQcNxlQxjMbat3rlcR81cF5VxSGNbTR0aKoJ0E2Vzb/BPP300+L1118Xn332mfj111/lX8vB559/7rqW0AUFSRwQFrxo1eMrraniuln7Vi8khCAkBDTVBOBloL4c4jSV6M0tZTfVV155RSy22GKiadOmYoEFFhDzzz+//W/U6JBtqEuXLqJ3797igAMOEMOGDRMXXXSRuP7668UXX3wht5Bfjj32WNe1bN26tfj7779laTloMKaK1ITWvtULqQtLxL///ivefvttce+994pzzz1X3HXXXbKEJIWmmgCaanRQQ4Whqsfsp4UXXlgsWYDpt7766ivRqFEj176fc845srQ8NBhTRRJ9a9/qhST7JWL//fevP//QWWedJUtIUmiqCaCpRuePP/6oMJ8gbbHFFnLt/DJkyBDXPrdo0cI+1iAw3tYRugLigDHAzjbw/9WkwZgqpnuz9s0lTAtXEs477zz73DsaMGCALCFJSWyqeKjwMnAUBxiLuo045lQLaKrxQO1TPWY/oYn4jDPOkGvmk++++04stNBCrv0+88wzZak3urnEfX5gps42aKopghYSa//qhQnMSwKafdVr0LlzZ1lCkpLYVPEiUC9OHPBgqtugqZabVq1auY7ZT4svvrh4+OGH5Zr5ZOjQoRX7HCYIi6Zap9yaaseOblOdMEEWFB/0p6rXYIkllpAlJCk01QTQVOOBxPLqMfupcePGdn9lXpk9e3ZFH3FYkyiqqWI/HcW559PYRib062eb6R/WPfhW+/bi4YLMVhMGBCrNN9989fcNVIRgwCJAU00ATTUeiPBVj9lP6JvMM6eccoprfxdZZBHx008/yVJ/imiqDYnj99xTLLfMMvXn9rjjjpMl5WC11VarPzboySeflCUkCTTVBNBU49G3b1/XMfupR48ecq38MWfOHNGsWTPX/p588smyNBiaar65+uqrXddn5513liXloE+fPq7jw/GS5NBUE0BTjcdhhx3mOmYvIUgpTMBPrUAAlbq/CMD6/vvvZWkwNNU6wkRJ14JJkya5rs96660nS8qBHrE+ePBgWUKSQFNNAE01HhgTh6QP6nGbhOCJvAYpwQiaN2/u2t8TTzxRloajoZrqhx9+KG699VYxcOBA0aFDB3H55ZfLknyhzzaEVokygaQq6vFtt912soQkgaaaAJpqPEaNGmX3ParHbRJqfl9//bVcK1+cffbZrn1FrTrqvjYEU0VAzJQpU+zMWD179rQTeSCwCxHSzj6jXzqP/PfffxXBPHm9H+Pw7LPPuo5tpZVWkiUkCTTVBGC/8UJzFNdU1W0U2VTxkeHI71zcfffddmpC9ZqbhJdvHvnrr78qhgXFCWIpo6kiYxauLyYWWGuttexEHzDQJk2auI5V1X777SfXzh8wGnVfp06dKkuKz7fffus6NujPP/+UpSQuNFWSGurL3c8gJk+ebDftqtfcJLyI84iejQaKMxyhjKY6ceLEUK0QqlCDzStbb721a19vvvlmWVIO9I/D1157TZaQuNBUSWqENdU333yzImrWJPRZ5g00CS699NKu/Tz66KNlaTR0U8X5U2v7YZUnUwV6X3OQ1l9/fblm/kC/r7qvec/uFZVNN93UdXx33nmnLCFxSd1UYYhRhReDvo0ycNBBB9nNgohgveyyy8TPP/8sS8pJWFNFv5Rfc6CjpZZaSq6RH9A3qO/nJ598IkujoZtqGsqDqepGFKR27drJNfPH+eef79rXuK0JeQWzQanHx8T6yUndVNNQGUx17ty5Fcf1+++/y9JyEtZU//nnH9d58dJyOZwZpG3btq59POKII2RJdMpqqgiACdNn7gjL5hX0D6v7utlmm8mScqB/NOyzzz6yhMSFplol9CAAJFwvO2FNFYSZ/g3byxOXXnppxT7OmjVLlkZHN1UYot60G0b6NvKA3kTuJwQz5ZWXX37Zta/LLrusLCkH9913n+v4NtpoI1lC4pK6qeKhjir1ZQyVwVT1MW4ICCg7UUy1TZs2rvNjUt5MVb9PDz30UFkSjzIGKjlgzO6CCy7oOj4vRU2akSVIOanvb5lanN555x3XsSFSmyQjdVONQxkDlWbMmOE6ppVXXlmWlJcoprr66qu7zo9JeTLVK6+8smL/3nvvPVkajzKb6iuvvCIWXXRR1/F5CUFreLnHBecR585R3PeHug11aFvr1q1d+4tAu7KAwDt9fuPPP/9clpI40FSrBJJTq8fUEdNIlZwoptqtWzfX+THJZKrDhg0Tq6yyij2sJUvwUaTuG4LQklJmUwXt27d3HZ+XUDt65pln5FrRwftC3Z5qiFFQt6Fei4033thV9sADD8iScqB/4DKxfjJoqlVCnwQ4z4nh0yKKqe62226u82OSyVSPPfZYuwwZjXR++OGHqgxev+aaayr27a233pKl8Sm7qY4YMSJUlDcClcaPHy/Xik61TXWvvfZylV1yySWypBzstNNOruNjYv1k0FSrxE033eQ6JszMUnaimCrGdqrnxySTqTrJ+C+++GL5l3nsvffedhlymqaJPkVWWhmAym6q77//fihTRdAaPlziUm1TxcxDalmSiO88csIJJ7iOL+64a1IHTbVK6JGicV+Y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oamSWNBUvbnkkkvsL/PrrrvOrtEhoKaaATtpgGuoXosHH3xQlri55ZZbXMs5Ouqoo+QS+QS1mjDJJDCvLJJJkGAwTGzPPfc0nsdhw4bJpRoeNFUSC9VU0xKpHVtssYXrWqB/TAcfCeoyjk488US5RP4Jm0xiqaWWspvomUzCDDJe6cFtjq655hq5VMOEbzISC5pquejRo4frWtx3332ypA70E6vljk4//XS5RPFArVsP0DJp4MCBTCahgPzVyy23XMV5QtBamAC3ssM3GYmFbqr4d1Sp60Okdmy55Zaua4Fp2RzOO+88V5mjCy64QC5RbJCSERHLpmNU1bdv3wafTMKr+X/dddeNlYayjPBNRmKhmiL7VMPz119/2U1nzz//fK5e0Jj1Rb0WCEYC6BtW/+4I0Z5l44033giVTAKJMsaOHSvXajgg/abpfPTu3ZsTySvQVEksaKrewJBgOgjW2G+//eyhHfiSR9J39Xi32247uUbtQfSrum+IhPWK6rz++uvlWuXESSaBCRBMx+8IQ6VQW28IySQOO+ww4znA34kbmiqJBU3VmyuvvNJ1XLpatWplmyzMNi9ss802rn2E4av/dnTbbbfJNRoGCLpZb731jOfCEZJJHHfccaVMJvHzzz+LHXbYwXjc5557rlyKqNBUSSxoqt6gprr//vvbNVXUWPFvNPei2RfNv3kEY2fVa2GSHrzUkMCxh0kmgbGZU6ZMkWsVGzSHY4iRfozzzTefPWMQMUNTJbGgqZYL06Tijpo2bcrZXiRRkkk4/dJFBBm1llhiiYrjateunR39S7zhm4zEgqZaLryae1u0aCGeeeYZuRRxQDIJpKLUc93qQk3v6quvlmsVA8wFbDoWDD/65JNP5FLEC77JSCxoquXhzz//tPt51WsBtW3bVrz00ktyKWLi999/FxdddJFx6jtVSCaBSOqvv/5arplPhg4datx/5LEm4eCbjMSCppoMZPZBH+u0adPkX2rD7NmzK/L+Qoh8feutt+RSJAw333xz6GQSr732mlwrP6A/2LS/RcqYlQdoqiQWNFVvYJRI83fttdeKs846SxxxxBFit912s82rQ4cOrr4q1BBrxZdffik6derkugaOkL+YxCNKMolJkybJtWrH559/bvywghDJTqJBUyWxoKl6g0hf9bi8hCZB9Ln9888/cs3swPCPtdZay7hf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" } }, "cell_type": "markdown", "metadata": {}, "source": [ "### Example 1: Visualization of Query for `Molecule` object\n", "\n", "`ml_rd_visualize` creates a new rdkit object for rendering using whatever format reader is available. It can utilize a `Molecule`, `MoleculeLibrary`, or `list` of `Molecule` objects. \n", "\n", "If a subset of `Atom` or `Bond` objects within a `Molecule` have a particular property, and the atom order is maintained upon creation of the RDKit object, it will highlight the atoms with that have this property. An example of how to use `ml_rd_visualize` is below\n", "\n", "```python\n", "# This can visualize a molli Molecule using RDKit's Renderer\n", "mrd.ml_rd_visualize(\n", " file_path='dendrobine.svg', #File Path to write \n", " obj=ml_mol, #Object of interest\n", " via='sdf', #Format for conversion\n", " remove_hs=False, #Keeps hydrogens\n", " legend_prop=\"_Name\", #Label to use in the legend\n", " highlight_atom_prop=\"Query\", #Highlights atoms with this property\n", " highlight_bond_prop=\"Query\", #Highlights bonds with this property\n", " )\n", "```\n", "\n", "This code gives the following result\n", "\n", "![dendrobine.PNG](attachment:dendrobine.PNG)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Example 2: Visualization of Query for RDKit Object\n", "\n", "RDKit's visualization tool has also been made available for general rdkit objects as well using the `rd_visualize` function. Here is an example of how to highlight atoms and bonds associated with aromatic rings in two example RDKit objects.\n", "\n", "Starting with creation of the objects" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "#(1-chloro-3-[(E)-2-chloroethenyl]benzene instantiation\n", "di_cl_rdmol = Chem.MolFromSmiles('Cl\\C=C\\c1cccc(Cl)c1')\n", "#(1-chloro-3-[(E)-2-chloroethenyl]benzene canonicalization\n", "di_cl_rdmol = mrd.canonicalize_rdmol(di_cl_rdmol)\n", "#Sets name for RDKit molecule\n", "di_cl_rdmol.SetProp(\"_Name\", '2cl_mol')\n", "\n", "\n", "#(E)-β-Bromostyrene instantiation\n", "br_rdmol = Chem.MolFromSmiles('Br\\C=C\\c1ccccc1')\n", "#(E)-β-Bromostyrene canonicalization\n", "br_rdmol = Chem.MolFromSmiles(Chem.MolToSmiles(br_rdmol, canonical=True))\n", "#Sets name for RDKit molecule\n", "br_rdmol.SetProp(\"_Name\", 'br_mol')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next is using the `atom_filter` to find aromatic rings in these 2 RDKit objects." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "#Places rdkit mols in a list\n", "rdkit_mols = [di_cl_rdmol, br_rdmol]\n", "\n", "#Iterates throught the list containing both RDKit mols\n", "for rdmol in rdkit_mols:\n", " rdmol: Chem.Mol\n", " #Instantiates atom filter object\n", " ac_rdmol = mrd.atom_filter(rdmol)\n", "\n", " #Defines a boolean looking for the following halogens based off of SMARTS\n", " arom_bool = ac_rdmol.aromatic_type()\n", "\n", " #Finds the indices of atoms that are aromatic\n", " sub_atoms_idx = np.where(arom_bool)[0].tolist()\n", "\n", " #Iterates through atom indices where substructure is aromatic\n", " for idx in sub_atoms_idx:\n", " \n", " #Finds RDKit atoms where values are True and Sets Property: Query\n", " atom = rdmol.GetAtomWithIdx(idx)\n", " atom.SetProp(\"Query\", \"1\")\n", "\n", " #Iterates through bonds and finds bonds where both atoms are in the aromatic substructure\n", " for bond in rdmol.GetBonds():\n", " a1 = bond.GetBeginAtomIdx()\n", " a2 = bond.GetEndAtomIdx()\n", "\n", " if (a1 in sub_atoms_idx) and (a2 in sub_atoms_idx):\n", " bond.SetProp(\"Query\", \"1\")" ] }, { "attachments": { "image.png": { "image/png": "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" } }, "cell_type": "markdown", "metadata": {}, "source": [ "The final code for visualization is shown below\n", "\n", "```python\n", "# This visualizes an existing list of RDKit molecules\n", "mrd.rd_visualize(\n", " file_path='rdkit_mols.svg', #File Path to write \n", " rd_list=rdkit_mols, #Object of interest\n", " legend_prop=\"_Name\", #Label to use in the legend\n", " highlight_atom_prop=\"Query\", #Highlights atoms with this property\n", " highlight_bond_prop=\"Query\", #Highlights bonds with this property\n", " )\n", "```\n", "\n", "This code gives the following result\n", "\n", "![image.png](attachment:image.png)" ] } ], "metadata": { "kernelspec": { "display_name": "dev-blake", "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" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 }