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

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
from pubchempy import get_compounds, Compound

Рисую ибупрофен:

In [2]:
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
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
In [4]:
if ((Lipinksy.NumHDonors(ibu) <= 5)  and (Lipinksy.NumHAcceptors(ibu)<=10) and (Lipinksy.rdMolDescriptors.CalcExactMolWt(ibu)<500)
        and (Lipinksy.rdMolDescriptors.CalcCrippenDescriptors(ibu)[0]<=5)): 
    print('True')
else: 
    print('False') 
True

Список радикалов c азидом для Click Chemistry и их SMILES нотации нашла с помощью PubChem Structure Search по CID и скачала вручную (фильтровала на соблюдение правила Лепински), загрузила скаченные данные, отфильтровала.

In [5]:
for compound in get_compounds('azide', 'name'):
    print (compound.cid)
    print (compound.isomeric_smiles)
33558
[N-]=[N+]=[N-]
In [6]:
strings=np.genfromtxt('pubchem.txt',dtype=np.str)
smiles=[]
for line in strings:
    if len(line[1]) < 30 and not '.' in line[1]:
        smiles.append(line[1])

Дальше необходимо найти формулу ибупрофена и предложить способ изменения его SMILES для эмуляции продукта Click Chemistry. Проверяю на соблюдение правила Лепински:

In [7]:
mod=Chem.MolFromSmiles('N0N=NC=C0C(C)CC1=CC=C(C=C1)C(C)C(=O)O')
AllChem.Compute2DCoords(mod)
display(mod)
In [8]:
if ((Lipinksy.NumHDonors(mod) <= 5)  and (Lipinksy.NumHAcceptors(mod)<=10) and (Lipinksy.rdMolDescriptors.CalcExactMolWt(mod)<500)
        and (Lipinksy.rdMolDescriptors.CalcCrippenDescriptors(mod)[0]<=5)): 
    print('True')
else: 
    print('False') 
True

Строю новые молекулы, заменив в радикалах азидную группу на модифцированный ибупрофен, и фильтрую на соблюдения правила Лепински:

In [9]:
azide = 'N=[N+]=[N-]'
mod = 'N0N=NC=C0C(C)CC1=CC=C(C=C1)C(C)C(=O)O'
list1 = []
for smi in smiles[:1500]:    
    if azide  in smi:
        newsmi=smi.replace(azide, mod)
    else:
        continue
    try:
        newmol=Chem.MolFromSmiles(newsmi)        
        if ((Lipinksy.NumHDonors(newmol)<=5) and (Lipinksy.NumHAcceptors(newmol)<=10) and (Lipinksy.rdMolDescriptors.CalcExactMolWt(newmol)<500)
        and (Lipinksy.rdMolDescriptors.CalcCrippenDescriptors(newmol)[0]<=5)):
            list1.append(newmol)           
    except:
        pass

Изобразим 5 первых структур:

In [10]:
Draw.MolsToGridImage(list1[:5],useSVG=True, molsPerRow=2, subImgSize=(400, 300))
Out[10]:
NH2 O N N N O HO N N N O N N N O OH OH O O O O N N N O OH N O O N N N O OH O OH OH O O O N N N O OH

Строю Similiraty Map ибупрофена с 5 веществом из массива (последним нарисованным):

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

Строю 3D структуру:

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

По идее, нужно еще было загрузить NGL viewer, но он не сработал.