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
Рисую ибупрофен:
ibu=Chem.MolFromSmiles('CC(C)CC1=CC=C(C=C1)C(C)C(=O)O')
AllChem.Compute2DCoords(ibu)
display(ibu)
Считаю параметры для правила Лепински и проверяю их соблюдение:
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])
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')
Список радикалов c азидом для Click Chemistry и их SMILES нотации нашла с помощью PubChem Structure Search по CID и скачала вручную (фильтровала на соблюдение правила Лепински), загрузила скаченные данные, отфильтровала.
for compound in get_compounds('azide', 'name'):
print (compound.cid)
print (compound.isomeric_smiles)
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. Проверяю на соблюдение правила Лепински:
mod=Chem.MolFromSmiles('N0N=NC=C0C(C)CC1=CC=C(C=C1)C(C)C(=O)O')
AllChem.Compute2DCoords(mod)
display(mod)
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')
Строю новые молекулы, заменив в радикалах азидную группу на модифцированный ибупрофен, и фильтрую на соблюдения правила Лепински:
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 первых структур:
Draw.MolsToGridImage(list1[:5],useSVG=True, molsPerRow=2, subImgSize=(400, 300))
Строю Similiraty Map ибупрофена с 5 веществом из массива (последним нарисованным):
from rdkit.Chem.Draw import SimilarityMaps
fp = SimilarityMaps.GetMorganFingerprint(list1[4], fpType='bv')
fig, maxweight = SimilarityMaps.GetSimilarityMapForFingerprint(ibu, list1[4], SimilarityMaps.GetMorganFingerprint)
Строю 3D структуру:
m3d=Chem.AddHs(list1[4])
Chem.AllChem.EmbedMolecule(m3d)
AllChem.MMFFOptimizeMolecule(m3d,maxIters=500,nonBondedThresh=200 )
m3d
По идее, нужно еще было загрузить NGL viewer, но он не сработал.