Цель занятия - используя пакет модулей RDkit предложить аналоги ибупрофена, полученные с помощью Click Chemistry (реакции азид-алкинового циклоприсоединения).

Загрузим модули RDkit

In [24]:
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
import random

Нарисуем ибупрофен и его производные для Click Chemistry

In [2]:
ibu=Chem.MolFromSmiles('CC(C)CC1=CC=C(C=C1)C(C)C(=O)O')
AllChem.Compute2DCoords(ibu)
display(ibu)
In [9]:
#замена изопропила этинилом
ibu_c3 = Chem.MolFromSmiles('C#CC1=CC=C(C=C1)C(C)C(=O)O')
AllChem.Compute2DCoords(ibu_c3)
display(ibu_c3)
#продукт реакции с азидом, будем использовать в качестве шаблона для получения производных
ibu_template = Chem.MolFromSmiles('N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O')
AllChem.Compute2DCoords(ibu_template)
display(ibu_template)

Посчитаем параметры для правила Лепински

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.0732

Загрузим скаченные SMILES азидов и отфильтруем

In [7]:
strings=np.genfromtxt('4196987328760784555.txt',dtype=np.str)

smiles = []

for line in strings:
    if len(line[1]) < 30 and not '.' in line[1]:
        smiles = smiles + [line[1]]
In [10]:
print len(smiles)
779

Функция проверки новых молекул на соотвествие правилу Лепински

In [11]:
def lipinksy_rule_check(moleq):
    if Lipinksy.NumHDonors(moleq) <= 5 and Lipinksy.NumHAcceptors(moleq) <= 10 and Lipinksy.rdMolDescriptors.CalcExactMolWt(moleq) <= 500 and Lipinksy.rdMolDescriptors.CalcCrippenDescriptors(moleq)[0] <= 5 :
        return 1
    else:
        return 0

Построим новые молекулы, заменив азид на ибупрофен, и отфильтруем их

In [23]:
azid = 'N=[N+]=[N-]'
ibu_template_smi = 'N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O'

drugs = []

for smi in smiles:
    if azid in smi:
        newsmi=smi.replace(azid,ibu_template_smi)
        try:
            newmol=Chem.MolFromSmiles(newsmi)
            if lipinksy_rule_check(newmol) == 1:
                drugs = drugs + [newsmi]  
        except:
            pass
RDKit ERROR: [20:38:10] SMILES Parse Error: extra open parentheses for input: 'C1=CC(=C(C=C1CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C'

Всего получилось 555 новых соединеий. 10 из них приведены на рисунке ниже

In [30]:
choice = random.sample(drugs,10)
for random_smi in choice:
    moli = Chem.MolFromSmiles(random_smi)
    AllChem.Compute2DCoords(moli)
    display(moli)