Хемоинформатика

Загрузили модули RDkit

In [1]:
from rdkit import Chem
from rdkit.Chem import AllChem
from rdkit import RDConfig
from rdkit.Chem.Draw import IPythonConsole 
from rdkit.Chem import Draw
import numpy as np
from IPython.display import display,Image
In [2]:
import rdkit.Chem.Lipinski as Lipinksy

Нарисовали ибупрофен

In [3]:
ibu=Chem.MolFromSmiles('CC(C)CC1=CC=C(C=C1)C(C)C(=O)O')
AllChem.Compute2DCoords(ibu)
display(ibu)

Посчитали параметры для правила Лепински

In [4]:
import rdkit.Chem.Lipinski as Lipinksy
print(Lipinksy.NumHDonors(ibu))
print(Lipinksy.NumHAcceptors(ibu))
print(Lipinksy.rdMolDescriptors.CalcExactMolWt(ibu))
print(Lipinksy.rdMolDescriptors.CalcCrippenDescriptors(ibu)[0])
1
1
206.130679816
3.073200000000001

Построим новый ибупрофен, написав новый SMILES

In [4]:
ne_ibu_smiles = 'N1C=NC=C1C(C(O)=O)C(C=C1)=CC=C1CC(C)C'
ne_ibu = Chem.MolFromSmiles(ne_ibu_smiles)
AllChem.Compute2DCoords(ne_ibu)
display(ne_ibu)

Загрузили скаченные данные - список азидов и отфильтровали

In [5]:
strings=np.genfromtxt('1931431637611612961.txt',dtype=np.str)
smiles = []
for line in strings:
    if (len(line[1]) < 30) and (len(line[1]) > 1) and not ( '.' in line[1]):
        smiles.append(line[1])
In [7]:
len(smiles)
Out[7]:
995

Проверили правило Липински

In [6]:
import rdkit.Chem.Lipinski as Lipinski
def check_Lipinski(mol): 
    is_Lipinsky = bool((Lipinski.NumHDonors(mol) <= 5) \
    and (Lipinski.NumHAcceptors(mol) <= 10) \
    and (Lipinski.rdMolDescriptors.CalcExactMolWt(mol) < 500) \
    and(Lipinski.rdMolDescriptors.CalcCrippenDescriptors(mol)[0]) <= 5)
    return is_Lipinsky
print (check_Lipinski(ibu))
True

Построили новые молекулы и отфильтровали

In [7]:
products = []
for smi in smiles:
    if "N=[N+]=[N-]" in smi:
        newsmi = smi.replace("N=[C+]=[N-]", ne_ibu_smiles)
    else:
        continue
    try:
        newmol = Chem.MolFromSmiles(newsmi)
        oldmol = Chem.MolFromSmiles(smi)
        if check_Lipinski(newmol):
            products.append((newmol, oldmol))
    except Exception:
        pass
    
len(products)
RDKit ERROR: [22:41:01] SMILES Parse Error: extra open parentheses for input: 'C1=CC(=C(C=C1CN=[N+]=[N-])C'
RDKit ERROR: [22:41:01] SMILES Parse Error: extra open parentheses for input: 'C1=CC(=C(C=C1CN=[N+]=[N-])C'
Out[7]:
800

Вывели на большую картинку случайно выбранные молекулы ( справа от каждой молекулы показана её предковая форма)

In [8]:
from random import sample
In [26]:
import random
random.seed(70)
mols = []
for n, o in random.sample(products, 7):
    AllChem.Compute2DCoords(n)
    AllChem.Compute2DCoords(o)
    mols.append(n)
    mols.append(o)
Chem.Draw.MolsToGridImage(mols, molsPerRow = 7, subImgSize = (700, 400))
Out[26]:

Построить Similiraty Map ибупрофена с веществом из моего массива не удалось. Kernel отключается при попытках.

In [ ]:
from rdkit.Chem.Draw import SimilarityMaps
fp = SimilarityMaps.GetMorganFingerprint(mols[0], fpType='bv')
fig, maxweight = SimilarityMaps.GetSimilarityMapForFingerprint(ibu, \
                                                               mols[0], SimilarityMaps.GetMorganFingerprint)

Сделаем конформацию лиганда

In [14]:
ne_ibu = Chem.AddHs(mols[0])
AllChem.EmbedMolecule(ne_ibu)
AllChem.MMFFOptimizeMolecule(ne_ibu, maxIters = 1000, nonBondedThresh = 100)
ne_ibu
Out[14]:

Загрузим NGL viewer

In [15]:
import nglview as nv
nv.show_rdkit(ne_ibu)

Виджет не работает(