# Загрузим необходимые пакеты
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
# Построим молекулу ибупрофена
ibu=Chem.MolFromSmiles('CC(C)CC1=CC=C(C=C1)C(C)C(=O)O')
AllChem.Compute2DCoords(ibu)
display(ibu)
# Построим модифицированную молекулу ибупрофена
template = "N1C=C(C2=CC=C(C=C2)C(C)C(=O)O)N=N1"
ibu_cycle=Chem.MolFromSmiles(template)
AllChem.Compute2DCoords(ibu_cycle)
display(ibu_cycle)
# Применим правила Липински для молекулы ибупрофена
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])
# Загрузим и отсортируем молекулы по размеру
smiles={}
with open("C:/Users/Татьяна/Documents/школа_биоинформатики/3_семестр/2692050043616355653_1.txt") as f:
for line_terminated in f:
line = line_terminated.rstrip('\n')
line = line.rsplit('\t')
#print(line)
if len(line[1]) < 30 and not '.' in line[1]:
smiles[line[0]]=line[1]
#Осталось около 50 тысяч соединений.
len(smiles)
#Создаем правило, по которому будем выявлять "хорошие молекулы"
def lepinsky_rulez(mol):
hdonor = Lipinksy.NumHDonors(mol) <= 5
hacceptor = Lipinksy.NumHAcceptors(mol) <=10
MW = Lipinksy.rdMolDescriptors.CalcExactMolWt(mol) < 500
okt_water = Lipinksy.rdMolDescriptors.CalcCrippenDescriptors(mol)[0] <=5
return (hdonor * hacceptor * MW * okt_water)
# Находим молекулы с азидной группой и заменяем её на модифицированный ибупрофен.
good_m = []
for smi in smiles.items():
smi_id = smi[0]
smi_mol = str(smi[1])
if "N=[N+]=[N-]" in smi_mol:
newsmi=smi_mol.replace('N=[N+]=[N-]', template)
else:
continue
try:
res_mol=Chem.MolFromSmiles(newsmi)
if lepinsky_rulez(res_mol):
good_m.append([smi_id,res_mol,newsmi])
AllChem.Compute2DCoords(res_mol)
except Exception as exp:
pass
#В итоге получилчось около двух тысяч соединений
len(good_m)
#Выведем 20 соединений на экран
import random
choice = random.sample(good_m,20)
good_mol = [x[1] for x in choice]
good_names = [n[0] for n in choice]
p = Chem.MolFromSmiles(template)
subms = [x for x in good_mol if x.HasSubstructMatch(p)]
AllChem.Compute2DCoords(p)
for m in subms: AllChem.GenerateDepictionMatching2DStructure(m,p)
img=Draw.MolsToGridImage(subms,molsPerRow=4,subImgSize=(200,200),legends=good_names)
img