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

In [1]:
from rdkit import Chem
from rdkit.Chem import AllChem, Draw, Lipinski
from rdkit.Chem.Draw import SimilarityMaps, IPythonConsole
import pubchempy as pcp

import numpy as np
from IPython.display import SVG,Image
In [2]:
#отобразим ибупрофен формулой SMILES
ibu=Chem.MolFromSmiles('CC(C)CC1=CC=C(C=C1)C(C)C(=O)O') 
AllChem.Compute2DCoords(ibu)
display(ibu)
In [3]:
#проверим правило Лепински для ибупрофена
import rdkit.Chem.Lipinski as Lipinksy

def Lipinksy_checker(molecule):
    Lipinksy_check = bool(Lipinksy.NumHDonors(molecule) <= 5 
                    and Lipinksy.NumHAcceptors(molecule) <= 10
                    and Lipinksy.rdMolDescriptors.CalcExactMolWt(molecule) < 500
                    and Lipinksy.rdMolDescriptors.CalcCrippenDescriptors(ibu)[0] <= 5)
    return Lipinksy_check

Lipinksy_checker(ibu)
Out[3]:
True
In [4]:
#вытащим CID азида
pcp.get_compounds('azide', 'name')
Out[4]:
[Compound(33558)]

Отфильтруем полученные в формате SMILES из базы данных pubchem молекулы (список радикалов, содержащих азиды), оставив только содержащие ровно одну молекулярную формулу не длиннее 30, а затем проведем с ними химическую реакцию.

In [5]:
strings=np.genfromtxt('results.txt',dtype=np.str)
smiles_filtered = []

for line in strings:
    if len(line[1]) < 30 and not ('.' in line[1]):
        smiles_filtered.append(line[1])
print(len(smiles_filtered))
print(smiles_filtered)
109
['C1=CC2=NNN=C2C=C1', 'N=[N+]=[N-]', 'C1CCC2=NN=NN2CC1', 'C12=NNN=C1N=C(NC2=O)N', 'CC1=CC2=C(C=C1CN(CC', 'C1=CC2=NNN=C2C=C1[N+](=O)[O-]', 'C1CC2=C(C1)NN=C2C3=NNN=N3', 'C1=CC=C2C(=C1)N=NN2O', 'C1=CC=C2C(=C1)N=NN2CCC(=O)O', 'C1=NC2=NNN=C2C(=N1)N', 'C1=CC=C(C=C1)N2C(=NN=N2)N', 'C1=CC=C2C(=C1)N=NN2N', 'C1=NC2=NNN=C2C(=O)N1', 'C12=NNN=C1NC(=O)NC2=O', 'CC(=O)NC1=CC=CC(=C1)C2=NNN=N2', 'C1=CC(=CC=C1C2=NNN=N2)Br', 'C1=CC=C(C=C1)C2=NNN=C2', 'C1=CC=C(C=C1)C2=NNN=N2', 'C1=NNN=C1', 'C1=CC=C(C=C1)CN=[N+]=[N-]', 'CC1=CC2=NNN=C2C=C1', 'CC1=CC(=CC=C1)C2=NNN=C2', 'C1=CC=C(C=C1)C2=NNN=C2C(=O)O', 'CC1=NN(N=C1C(=O)N)C2=CC=CC=C2', 'CCN1C2=C(C=C(C=C2)C(=O)O)N=N1', 'C1=CC=C(C(=C1)C2=NNN=N2)Cl', 'CCOC(=O)CC1=NNN=N1', 'C1=NN=NN1CC(=O)O', 'C1=CC=C(C=C1)CN2C(=C(N=N2)C', 'C1=CC=C2C(=C1)N=NN2CC(=O)O', 'C1(=NNN=C1C(=O)O)C(=O)O', 'CCN1N=C(N=N1)C2=CCCN(C2)C', 'C1(=NNN=N1)C(C(=O)O)N', 'C(CO)N=[N+]=[N-]', 'C1=CC=C(C=C1)N2C(=NN=N2)Cl', 'C[Si](C)(C)N=[N+]=[N-]', 'C1=CC2=NNN=C2C=C1N', 'C1=CC2=NNN=C2C=C1C(=O)O', 'C1=NNN=N1', 'C1=CC2=NNN=C2C=C1Cl', '[N-]=[N+]=[N-]', 'CN1C2=CC=CC=C2N=N1', 'CCCCCCN=[N+]=[N-]', 'C1(=NNN=N1)N', 'C1=C(C=C(C2=NNN=C21)Cl)Cl', 'C1=CC(=CC(=C1)C2=NNN=C2)C', 'C1=CC(=CC=C1C2=NNN=C2)Br', 'COC(=O)C1=NNN=C1', 'C1=C(C=NC=C1Br)C2=NNN=N2', 'C1=CC(=CC=C1OCC2=NNN=N2)Cl', 'CC(CN1C2=CC=CC=C2N=N1)C(=O)O', 'C1=CC(=CC=C1N2C=C(N=N2)CO)Cl', 'CC(=O)NC1=CC=C(C=C1)C2=NNN=N2', 'C1=CC=C2C(=C1)N=NN2CC', 'C1=CC(=CC=C1CC2=NNN=N2)Cl', 'C1=CC=C(C=C1)N2C=C(N=N2)CO', 'CC1=CC=C(C=C1)C2=NNN=C2', 'CC(CC(=O)O)N1C2=CC=CC=C2N=N1', 'C1=CC(=CC=C1N2C=NN=N2)O', 'C1=C(C(=CC2=NNN=C21)Cl)Cl', 'C1=CC=C2C(=C1)N3C(=NN=N3)S2', 'C(CO)N1C(=NN=N1)N', 'C1=CC=NC(=C1)C2=NNN=N2', 'C1=CC2=NN(N=C2C=C1)N', 'CC1=CC=C(C=C1)C2=NNN=N2', 'C1=CC(=CC=C1N2C=NN=N2)Cl', 'CC1=CC(=NC2=NN=NN12)C', 'C1=CC=C2C(=C1)N=NN2CO', 'C1=CC2=CN=NN2C=C1', 'C1=CC(=CC(=C1)OC2=NNN=N2)O', 'C(CN=[N+]=[N-])C(=O)O', 'C[Si](C)(C)CN=[N+]=[N-]', 'C1=CC=C(C=C1)CCN=[N+]=[N-]', 'C1=CC=C(C=C1)NC2=NNN=N2', 'C1=NNN=C1C(=O)O', 'CN1C=CN=N1', 'CN1N=C(N=N1)N', 'CN1C(=NN=N1)N', 'C1=CC=C(C=C1)CN2C=CN=N2', 'CC1=NNN=N1', 'C1=CC(=CC=C1C', 'CC1=CC=CC2=NNN=C12', 'CC1=C(N=NN1C2=CC=CC=C2)C(=O)O', 'C(C(CO)O)N=[N+]=[N-]', 'C1=CC(=CC(=C1)N)C2=NNN=N2', 'CN1C2=NNN=C2C(=O)N(C1=O)C', 'C1=CC=C2C(=C1)N=NN2Cl', 'CC(=O)N1C2=CC=CC=C2N=N1', 'C[Si](C)(C)N1C=CN=N1', 'C1COCCN1CN2C3=CC=CC=C3N=N2', 'C1=CC(=CC=C1N=[N+]=[N-])Br', 'CCOC(=O)CN=[N+]=[N-]', 'C1=CC=C(C=C1)N=[N+]=[N-]', '[N-]=[N+]=N[Pb]N=[N+]=[N-]', 'C1CCN(C1)CN2C3=CC=CC=C3N=N2', 'C1CC(CCC1CC', 'C1=CC(=C(C=C1Cl)C2=NNN=C2)O', 'C1=CC=C(C(=C1)C2=NNN=C2)O', 'C12=NNN=C1NC(=S)N=C2N', 'CC1=NC2=C(C=C3C(CCC3=C2)N(CC', 'CC1=NC2=C(C=C3C(CCC3=C2)N(CC', 'C12=NNN=C1NC(=S)NC2=O', 'C', 'C1=CC=C(C(=C1)C2=CC=CC=C2OCC', 'CC(C)(C)OC(=O)N1CCC(CC1)(CC', 'C1CN(CCC1(CC', 'C[C@H](C', 'CN1C2=CC(=NC(=C2N=N1)C', 'C1=CC=C(C=C1)C2=NNN=C2Br']
In [10]:
#изменим ибупрофен для построения новых молекул и напишем новый смайлз
new_ibu = 'N1N=NC(=C1)C(C)CC1=CC=C(C=C1)C(C)C(=O)O'
new_ibu_vis = Chem.MolFromSmiles('N1N=NC(=C1)C(C)CC1=CC=C(C=C1)C(C)C(=O)O')
AllChem.Compute2DCoords(new_ibu_vis)
display(new_ibu_vis)
In [11]:
putative_drugs = []

for smi in smiles_filtered:
    if 'N=[N+]=[N-]' in smi:
        newsmi=smi.replace('N=[N+]=[N-]',new_ibu)
    else:
        continue
    try:
        newmol=Chem.MolFromSmiles(newsmi) 
        if Lipinksy_checker(newmol) == True:
            putative_drugs.append(newmol)
    except:
        pass
len(putative_drugs)
Out[11]:
12

Получилось всего 12 подходящих соединений Визуализируем эти молекулы

In [12]:
for drug in putative_drugs:
    print(drug)
    AllChem.Compute2DCoords(drug)
pil = Draw.MolsToGridImage(putative_drugs, useSVG=True, molsPerRow=3, maxMols=12, subImgSize=(350, 350))
display (pil)
<rdkit.Chem.rdchem.Mol object at 0x0000024878D3B670>
<rdkit.Chem.rdchem.Mol object at 0x0000024878D3BDF0>
<rdkit.Chem.rdchem.Mol object at 0x0000024878D59EE0>
<rdkit.Chem.rdchem.Mol object at 0x0000024878D59F30>
<rdkit.Chem.rdchem.Mol object at 0x0000024878D59F80>
<rdkit.Chem.rdchem.Mol object at 0x0000024878D90260>
<rdkit.Chem.rdchem.Mol object at 0x0000024878D90030>
<rdkit.Chem.rdchem.Mol object at 0x0000024878D90080>
<rdkit.Chem.rdchem.Mol object at 0x0000024878D900D0>
<rdkit.Chem.rdchem.Mol object at 0x0000024878D90120>
<rdkit.Chem.rdchem.Mol object at 0x0000024878D90170>
<rdkit.Chem.rdchem.Mol object at 0x0000024878D901C0>
NH N N O OH N N N O OH OH N N N O OH Si N N N O OH N N N O HO N N N O OH O OH Si N N N O OH N N N O OH HO HO N N N O OH N N N O OH Br O O N N N O OH N N N O OH

Посмотрим на схожесть ибупрофена с его производным (пятый в массиве), построив карту сходства.

In [13]:
fig, maxweight = SimilarityMaps.GetSimilarityMapForFingerprint(ibu, \
   putative_drugs[4], SimilarityMaps.GetMorganFingerprint)
maxweight
Out[13]:
0.20036347114947745

Сходство небольшое, вес маленький.

Визуализируем в 3D

In [32]:
m3d = Chem.AddHs(putative_drugs[4])
Chem.AllChem.EmbedMolecule(m3d)
AllChem.MMFFOptimizeMolecule(m3d, maxIters=500, nonBondedThresh=200)
m3d
Out[32]:

загрузим NGL viewer

In [38]:
import nglview as nv

nv.show_rdkit(m3d)

Установить модуль удалось, но никакой реакции на команду не последовало

In [26]:
view = nv.show_rdkit(m3d)
view

Впрочем, как и на пример из гитхаба

In [39]:
view = nv.show_pdbid("3pqr")  # load "3pqr" from RCSB PDB and display viewer widget
view
In [ ]: