Structural bionformatics. Homework №3.

Elen Tevanyan

Insipration source: https://vsb.fbb.msu.ru/projects/hse/wiki/Task3
1) На сайте PubChem найти все радикалы c азидом для Click Chemistry и скачать их SMILES нотации
2) Найти формулу ибупрофена и предложить способ изменения его SMILES для эмуляции реагента Click Chemistry (заменить изопропил на этин он же ацителен)
3) Заменить в найденых радикалах азидную группу на модифцированный ибупрофен.
4) Превратить новые SMILES в объекты-молекулы
5) Отобрать те молекулы, которые удовлетворяют правилу пяти Lipinski </br>

Порядок выполнения заданий немного отличается от указанных в списке ; некоторые комментарии могут быть очень очевидными, но ценные для меня, если я буду пересматривать этот файл.

In [1]:
import rdkit
from rdkit import Chem
from rdkit.Chem import AllChem
from rdkit.Chem import rdMolDescriptors
from rdkit.Chem import Lipinski

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 [2]:
#функция для проверки на соответствие правила пяти Липински (пороговые значения взяты из лекции)
def LipinskiCheck (mol):
    if ((Lipinski.NumHDonors(mol) <=5) & 
        (Lipinski.NumHAcceptors(mol)<=10) &
        (rdMolDescriptors.CalcExactMolWt(mol)<=500) &
        (rdMolDescriptors.CalcCrippenDescriptors(mol)[0]<=5)):
        return True
    else:
        return False

1) Молекула ибупрофена

In [3]:
ibu=Chem.MolFromSmiles('CC(C)CC1=CC=C(C=C1)C(C)C(=O)O')
AllChem.Compute2DCoords(ibu)
display(ibu)

2) Модификация ибупрофена
Заменяем изопропил (тройка углеродов с семью водородами, на рисунке - левая сторона от кольца, CC(C)) на этин=ацетилен (два углерода с тройной связью, C#C), чтобы суметь провести CuAAC (https://ru.wikipedia.org/wiki/%D0%90%D0%B7%D0%B8%D0%B4-%D0%B0%D0%BB%D0%BA%D0%B8%D0%BD%D0%BE%D0%B2%D0%BE%D0%B5_%D1%86%D0%B8%D0%BA%D0%BB%D0%BE%D0%BF%D1%80%D0%B8%D1%81%D0%BE%D0%B5%D0%B4%D0%B8%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5)

In [4]:
ibu_temp=Chem.MolFromSmiles('C#CCC1=CC=C(C=C1)C(C)C(=O)O')
AllChem.Compute2DCoords(ibu_temp)
display(ibu_temp)

Результат CuAAC. Именно такую модификацию будем вставлять в будущем на место азидных радикалов.

In [5]:
mod = 'N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O'
ibu_mod=Chem.MolFromSmiles(mod)
AllChem.Compute2DCoords(ibu_mod)
display(ibu_mod)

3) Радикалов с азидом в PubChem: поиск, загрузка и фильтрация

Азидная группа N=[N+]=[N-] - ее и ищем в Pubchem.
Сохраняем, грузим и фильтруем. Можно быть нормальным человеком и вызывать из ноутбука PubChem.

In [6]:
smiles=[]
strings=np.genfromtxt('/Users/ElenTevanyan/Downloads/aziddata.txt',dtype=np.str)
for line in strings:
    if len(line[1]) < 30 and not '.' in line[1]:
        smiles.append(line[1])
len(smiles)
Out[6]:
12907

4) Замена азидных радикалов на модицифированный ибупрофен
Отдельно сохраняем новые SMILES-объекты для их будущей фильтрации

In [7]:
#mod - SMILES-запись модифицированного ибупрофена 
azid = 'N=[N+]=[N-]'
newsmiles=[]
for smi in smiles[:len(smiles)]:
    if azid in smi:
        newsmi=smi.replace(azid,mod)
        newsmiles.append(newsmi)
    else:
        continue
len(newsmiles)
Out[7]:
9284

5) Превращение новых SMILES в объекты-молекулы и проверка по условиям Липински

In [8]:
CorrectSmiles=[]
for newsmi in newsmiles[:len(newsmiles)]:
    try:
        newmol=Chem.MolFromSmiles(newsmi)
        if (LipinskiCheck(newmol)==True):
            CorrectSmiles.append(newsmi)
            AllChem.Compute2DCoords(newmol)
    except:
        pass
RDKit ERROR: [00:15:23] SMILES Parse Error: extra open parentheses for input: 'C1CCC(C(C1)N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(C'
RDKit ERROR: [00:15:24] SMILES Parse Error: extra open parentheses for input: 'C1=CC(=C(C=C1N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C'
RDKit ERROR: [00:15:25] SMILES Parse Error: extra open parentheses for input: 'C1=C(OC(=C1)N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C=C(C'
RDKit ERROR: [00:15:25] SMILES Parse Error: extra open parentheses for input: 'C(CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C(C'
RDKit ERROR: [00:15:25] SMILES Parse Error: extra open parentheses for input: 'C1=C(C(=C(N1)N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C'
RDKit ERROR: [00:15:25] Explicit valence for atom # 4 Cl, 3, is greater than permitted
RDKit ERROR: [00:15:27] SMILES Parse Error: extra open parentheses for input: 'CC1=C(C=CC(=C1CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C'
RDKit ERROR: [00:15:27] SMILES Parse Error: extra open parentheses for input: 'CC(CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(COC(=O)CCCC'
RDKit ERROR: [00:15:27] SMILES Parse Error: extra open parentheses for input: 'C1=CC(=C(C=C1N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C'
RDKit ERROR: [00:15:27] SMILES Parse Error: extra open parentheses for input: 'CC1C=C(C=CC1OCN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C(C'
RDKit ERROR: [00:15:27] SMILES Parse Error: extra open parentheses for input: 'C1=CC(=C(C=C1N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C'
RDKit ERROR: [00:15:28] SMILES Parse Error: extra open parentheses for input: 'CC1=NC(=C(C(=C1)N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C'
RDKit ERROR: [00:15:28] SMILES Parse Error: extra open parentheses for input: 'C1=CC(=CC=C1C(CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C'
RDKit ERROR: [00:15:28] SMILES Parse Error: extra open parentheses for input: 'C1=CC(=CC=C1C(CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C'
RDKit ERROR: [00:15:28] SMILES Parse Error: extra open parentheses for input: 'CCOC(=O)C(CCN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(C'
RDKit ERROR: [00:15:29] SMILES Parse Error: extra open parentheses for input: 'CCOC(=O)C(CCCN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(CC'
RDKit ERROR: [00:15:29] SMILES Parse Error: extra open parentheses for input: 'C1=C(C=C(C=C1N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C'
RDKit ERROR: [00:15:29] SMILES Parse Error: extra open parentheses for input: 'CC(CCC(=O)OCCN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(C'
RDKit ERROR: [00:15:29] SMILES Parse Error: extra open parentheses for input: 'CC1=C(C(C(C(C1N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(C'
RDKit ERROR: [00:15:29] SMILES Parse Error: extra open parentheses for input: 'C1=CC(C(C(C1N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(C'
RDKit ERROR: [00:15:29] SMILES Parse Error: extra open parentheses for input: '[B](N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)[P+](CS'
RDKit ERROR: [00:15:29] SMILES Parse Error: extra open parentheses for input: 'C1CC([C@@H](CC1CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C'
RDKit ERROR: [00:15:30] SMILES Parse Error: extra open parentheses for input: 'CC(CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(C'
RDKit ERROR: [00:15:30] SMILES Parse Error: extra open parentheses for input: 'C1=C(N(C(=N1)CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C'
RDKit ERROR: [00:15:30] SMILES Parse Error: extra open parentheses for input: 'CC(CCC(=O)OCCCN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(C'
RDKit ERROR: [00:15:30] SMILES Parse Error: extra open parentheses for input: 'CCC(CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(/C(=C/C'
RDKit ERROR: [00:15:30] SMILES Parse Error: extra open parentheses for input: 'CC(CCCCCN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(C'
RDKit ERROR: [00:15:30] SMILES Parse Error: extra open parentheses for input: 'CC(CCCCCN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(C'
RDKit ERROR: [00:15:30] SMILES Parse Error: extra open parentheses for input: 'CC1=C(C=CC(=C1N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C'
RDKit ERROR: [00:15:30] SMILES Parse Error: extra open parentheses for input: 'C1CC(CCC1N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(CC'
RDKit ERROR: [00:15:30] SMILES Parse Error: extra open parentheses for input: 'CC(CCC(=O)OCCCN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(C'
RDKit ERROR: [00:15:31] SMILES Parse Error: extra open parentheses for input: 'C1=CC(=C(C=C1N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C'
RDKit ERROR: [00:15:31] SMILES Parse Error: extra open parentheses for input: 'CC1=NC(=C(C(=C1)N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C'
RDKit ERROR: [00:15:32] SMILES Parse Error: extra open parentheses for input: 'CC=CC(CCN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(C'
RDKit ERROR: [00:15:32] SMILES Parse Error: extra open parentheses for input: 'CCC=CC(CCN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(C'
RDKit ERROR: [00:15:32] SMILES Parse Error: extra open parentheses for input: 'CCC=CC(CCCN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(C'
RDKit ERROR: [00:15:32] SMILES Parse Error: extra open parentheses for input: 'C(CNC(CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C'
RDKit ERROR: [00:15:32] SMILES Parse Error: extra open parentheses for input: 'C1=CC(=CC=C1NC(CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C'
RDKit ERROR: [00:15:32] SMILES Parse Error: extra open parentheses for input: 'C1=CC(=CC=C1NC(CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C'
RDKit ERROR: [00:15:32] SMILES Parse Error: extra open parentheses for input: 'C(CNC(CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C'
RDKit ERROR: [00:15:32] SMILES Parse Error: extra open parentheses for input: 'C1=CC(=CC=C1NC(CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C'
RDKit ERROR: [00:15:34] SMILES Parse Error: extra open parentheses for input: 'C(CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)CN(CC'
RDKit ERROR: [00:15:35] Explicit valence for atom # 1 Cl, 2, is greater than permitted
RDKit ERROR: [00:15:36] SMILES Parse Error: extra open parentheses for input: 'CC1=CC(=C(C(=C1)N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C'
RDKit ERROR: [00:15:36] 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'
RDKit ERROR: [00:15:37] SMILES Parse Error: extra open parentheses for input: 'CC(CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)CN1CCC(CC1)(C'
RDKit ERROR: [00:15:37] SMILES Parse Error: extra open parentheses for input: 'C1=C(N=C(C(=N1)N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C'
RDKit ERROR: [00:15:38] 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'
RDKit ERROR: [00:15:39] SMILES Parse Error: extra open parentheses for input: 'CC(CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(C'
RDKit ERROR: [00:15:39] SMILES Parse Error: extra open parentheses for input: 'CC/C=C/CCC(CCN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(C'
RDKit ERROR: [00:15:39] SMILES Parse Error: extra open parentheses for input: 'CC(=CCC(CCN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(C'
RDKit ERROR: [00:15:39] SMILES Parse Error: extra open parentheses for input: 'C/C=C/CC(CCN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(C'
RDKit ERROR: [00:15:39] SMILES Parse Error: extra open parentheses for input: 'CCC(CCCN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(C'
RDKit ERROR: [00:15:39] SMILES Parse Error: extra open parentheses for input: 'CCC(CCN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(C'
RDKit ERROR: [00:15:39] SMILES Parse Error: extra open parentheses for input: 'C[Si](C)(C)OC(CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(C'
RDKit ERROR: [00:15:39] SMILES Parse Error: extra open parentheses for input: 'CC/C=C\CCC(CCN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(C'
RDKit ERROR: [00:15:39] SMILES Parse Error: extra open parentheses for input: 'CC(=CCC(CCCN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(C'
RDKit ERROR: [00:15:39] SMILES Parse Error: extra open parentheses for input: 'C(CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)[C@@H](C'
RDKit ERROR: [00:15:40] SMILES Parse Error: extra open parentheses for input: 'COC[C@@](CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)(C'
RDKit ERROR: [00:15:40] SMILES Parse Error: extra open parentheses for input: 'C(CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)CO/C(=C/[N+]'
RDKit ERROR: [00:15:40] SMILES Parse Error: extra open parentheses for input: 'C(CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)CO/C(=C/[N+]'
RDKit ERROR: [00:15:40] SMILES Parse Error: extra open parentheses for input: 'C1=C(C=NC(=C1N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C'
RDKit ERROR: [00:15:40] SMILES Parse Error: extra open parentheses for input: 'C(CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)COC(=C[N+]'
RDKit ERROR: [00:15:40] SMILES Parse Error: extra open parentheses for input: 'C(CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)COC(=C[N+]'

Немного визуализации

In [9]:
for smi in CorrectSmiles[:15]:
    print(smi)
    mol = Chem.MolFromSmiles(smi)
    AllChem.Compute2DCoords(mol)
    display(mol)
C(CCC(=O)NCCCl)CCN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O
C1CC(SC1)C(=O)N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O
CC1(CC(OC1)CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C
C1COCCC12CC(OC2)CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O
C1COC(O1)C(CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)N
C1C(OCC12CNC2)CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O
C1CNCCC12CC(OC2)CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O
C(CCS(=O)(=O)Cl)CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O
C1C(C(CO1)N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)N
C1=CSC(=C1N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)CN
CCNC(=O)C1CC(CN1)N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O
COC(=O)/C=C/C(=O)N1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O
C[Si](C)(C)O/N=C\CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O
COC=N[C@@H](CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C
C(CN1C=C(N=N1)C1=CC=C(C=C1)C(C)C(=O)O)C
In [20]:
molecula = Chem.MolFromSmiles(CorrectSmiles[20])
Chem.AllChem.EmbedMolecule(molecula )
AllChem.MMFFOptimizeMolecule(molecula ,maxIters=500,nonBondedThresh=200 )
Chem.MolToPDBFile(molecula, 'molecula.pdb')
In [13]:
import nglview as nv
view = nv.show_rdkit (molecula)
view

#Не работает по неизвестным причинам. Все попытки гуглинга вели к нашим работам, а не к возможности решения проблемы :
In [16]:
#Поэтому сохраняем в файл, который сможет прочесть PyMol, уходим в PyMol и формируем картинку
Chem.MolToPDBFile(molecula, 'molecula.pdb')
In [22]:
from IPython.display import Image
Image('molImage.png')
Out[22]:
In [ ]: