In [54]:
# Загрузим необходимые пакеты
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 [55]:
# Построим молекулу ибупрофена
ibu=Chem.MolFromSmiles('CC(C)CC1=CC=C(C=C1)C(C)C(=O)O')
AllChem.Compute2DCoords(ibu)
display(ibu)
In [63]:
# Построим модифицированную молекулу ибупрофена
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)
In [56]:
# Применим правила Липински для молекулы ибупрофена
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 [123]:
# Загрузим и отсортируем молекулы по размеру
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 тысяч соединений.
In [124]:
len(smiles)
Out[124]:
51217
In [125]:
#Создаем правило, по которому будем выявлять "хорошие молекулы"
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)
In [126]:
# Находим молекулы с азидной группой и заменяем её на модифицированный ибупрофен. 
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
In [127]:
#В итоге получилчось около двух тысяч соединений 
len(good_m)
Out[127]:
2221
In [128]:
#Выведем 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
Out[128]: