Skip to content

Instantly share code, notes, and snippets.

@iwatobipen
Created August 8, 2021 13:27
Show Gist options
  • Save iwatobipen/6d8708d8c77c615cfffbb89409be730d to your computer and use it in GitHub Desktop.
Save iwatobipen/6d8708d8c77c615cfffbb89409be730d to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "smoking-highland",
"metadata": {},
"outputs": [],
"source": [
"from rdkit import Chem\n",
"from rdkit.Chem import Draw\n",
"from rdkit.Chem.Draw import IPythonConsole\n",
"from rdkit.Chem import rdMMPA\n",
"from rdkit.Chem import rdFMCS\n",
"from rdkit.Chem.Draw import rdDepictor\n",
"rdDepictor.SetPreferCoordGen(True)\n",
"IPythonConsole.drawOptions.comicMode=True\n",
"IPythonConsole.drawOptions.minFontSize=20"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "central-structure",
"metadata": {},
"outputs": [],
"source": [
"smi1 = 'FC1=CC=C2C(=C1)C=NN2'\n",
"smi2 = 'ClC1=CC=C2C(=C1)C=NN2'"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "acceptable-shakespeare",
"metadata": {},
"outputs": [],
"source": [
"mol1 = Chem.MolFromSmiles(smi1)\n",
"mol2 = Chem.MolFromSmiles(smi2)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "pretty-parallel",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<IPython.core.display.Image object>"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"Draw.MolsToGridImage([mol1, mol2])"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "bearing-nicaragua",
"metadata": {},
"outputs": [],
"source": [
"def view_difference(mol1, mol2):\n",
" mcs = rdFMCS.FindMCS([mol1,mol2])\n",
" mcs_mol = Chem.MolFromSmarts(mcs.smartsString)\n",
" match1 = mol1.GetSubstructMatch(mcs_mol)\n",
" target_atm1 = []\n",
" for atom in mol1.GetAtoms():\n",
" if atom.GetIdx() not in match1:\n",
" target_atm1.append(atom.GetIdx())\n",
" match2 = mol2.GetSubstructMatch(mcs_mol)\n",
" target_atm2 = []\n",
" for atom in mol2.GetAtoms(): \n",
" if atom.GetIdx() not in match2:\n",
" target_atm2.append(atom.GetIdx())\n",
" return Draw.MolsToGridImage([mol1, mol2],highlightAtomLists=[target_atm1, target_atm2])"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "downtown-dictionary",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<IPython.core.display.Image object>"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"view_difference(mol1,mol2)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "forbidden-preparation",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "technical-wallet",
"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.7.9"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
@ale94mleon
Copy link

Hi I was wondering about this example:

smi1 = 'CCCOCC'
smi2 = 'CCCC(=O)CC'

In this case I was expecting that the ether oxygen and the carbonyl group are the difference . But it is not the result

@TSAndrews
Copy link

Hi I was wondering about this example:

smi1 = 'CCCOCC'
smi2 = 'CCCC(=O)CC'

In this case I was expecting that the ether oxygen and the carbonyl group are the difference . But it is not the result

Unfortunately, rdFMCS.FindMCS finds the maximum common substructure and not the differences between two molecules and so this code can only highlight what is not in the maximum common substructure. Since the ether oxygen does not match the carbonyl carbon the maximal substructure can only include a single proyl chain as the mismatching ether/carbonyl breaks the molecule in half and so the other propyl chain is not in the same substructure.

If you want to extend this code to allow it to identify differences such as the one you describe, what you would have to do is iteratively split the molecules along the bonds that connect the matched/unmatched subgroups, followed by repeating the matching step between the unmatched subgroups until rdFMCS.FindMCS cannot find anymore.

The connecting bonds can be found with a function like:

def find_connecting_bonds(mol:Chem.rdchem.Mol,atomIds:list[int]):
        target_atoms=set(atomIds)
        bonds=[]
        for atomA in atomIds:
            atom_bonds=mol.GetAtomWithIdx(atomA).GetBonds()
            for b in atom_bonds:
                atomB=b.GetEndAtomIdx() if b.GetEndAtomIdx()!=atomA else b.GetBeginAtomIdx()
                if (atomB not in target_atoms): 
                    bonds.append(b.GetIdx())
        return bonds

Where atomIds is the list of atom Ids that were highlighted as mismatching by view_differences (i.e. target_atm1/target_atm2).
You could then use something like this for each iteration:

    target_atm1,target_atm2=difference(mol1, mol2)
    excess1=find_connecting_bonds(mol1,target_atm1)
    if excess1:
            atom_map=[]         #List to contain a map so we can track atoms through split
            split=Chem.FragmentOnBonds(mol, tuple(excess1))
            mol1_frags=Chem.GetMolFrags(split, asMols=True, frags= atom_map)

            unaccounted_frags1=set()
            for atom in target_atm1:
                unaccounted_frags1.add(atom_map[atom])

            if len(unaccounted_frags)==1:
                mol1_unnacounted = mol_frags[unaccounted_frags.pop()]

You can then compare mol1_unnacounted to mol2_unnacounted in the same way as you did mol1 to mol2! Rinse and repeat until you're left with your carbonyl and ether and (if you've tracked atom IDs properly) highlight them in your original molecule.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment