Хемоинформатика

In [1]:
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 [2]:
# Draw molecules from SMILES
def chemdraw(smiles):
    mol = Chem.MolFromSmiles(smiles)
    AllChem.Compute2DCoords(mol)
    display(mol)
In [3]:
ibu = 'CC(C)CC1=CC=C(C=C1)C(C)C(=O)O'
chemdraw(ibu)

Посчитаем параметры для "правила Липинского", согласно которому соединение, чтобы «быть похожим» на лекарство, должно:

• Иметь менее 5 атомов-доноров водородной связи;
• Обладать молекулярным весом менее 500;
• Иметь липофильность (log P — коэффициент распределения вещества на границе раздела вода-октанол) менее 5;
• Иметь суммарно не более 10 атомов азота и кислорода (грубая оценка количества акцепторов водородной связи)

В связи с тем, что числа, указанные в вышеперечисленных пунктах, делятся нацело на 5, данное правило также называется "правилом пяти".

In [4]:
import rdkit.Chem.Lipinski as Lipinksy

ibu_mol = Chem.MolFromSmiles(ibu)

print Lipinksy.NumHDonors(ibu_mol)
print Lipinksy.NumHAcceptors(ibu_mol)
print Lipinksy.rdMolDescriptors.CalcExactMolWt(ibu_mol)
print Lipinksy.rdMolDescriptors.CalcCrippenDescriptors(ibu_mol)[0]
1
1
206.130679816
3.0732

Одна из наиболее используемых клик-реакций — азид-алкиновое циклоприсоединение (реакция между азидами и алкинами с образованием 1,2,3-триазолов) с использованием медного катализатора (CuAAC: Cu-catalyzed azide-alkyne cycloaddition). Каталитический вариант реакции не протекает синхронно, а имеет постадийный механизм, который протекает через промежуточное образование ацетиленидов меди. По этой причине высокую реакционную способность в данной реакции демонстрируют лишь терминальные алкины. Поэтому для эмуляции продукта Click Chemistry SMILES ибупрофена нужно изменять так, чтобы в молекуле обязательна присутствовала концевая тройная связь.

In [5]:
# SMILES модифицированного ибупрофена

ibu1 = 'C#CCC1=CC=C(C=C1)C(C)C(=O)O'
ibu2 = 'CC(C)CC1=CC=C(C=C1)C(C#C)C(=O)O'
ibu3 = 'CC(C#C)CC1=CC=C(C=C1)C(C)C(=O)O'

chemdraw(ibu1)
chemdraw(ibu2)
chemdraw(ibu3)

Так как существуют три варианта модификации ибцпрофена (три места присоединения тройной связи), то и рекция азид-алкинового циклоприсоедениение может идти по трем положениям.

In [6]:
# Продукты реакции азид-алкиновое циклоприсоединение 

tr1 = 'N1N=NC(=C1)C1=CC(CC(C)C)=CC=C1(C(C)C(=O)O)'
tr2 = 'N1N=NC(=C1)C(C(C)(C))C1=CC=C(C=C1)C(C)C(=O)O'
tr3 = 'N1N=NC(=C1)CC(C(=O)O)C1=CC=C(C=C1)CC(C)C'

chemdraw(tr1)
chemdraw(tr2)
chemdraw(tr3)

Cписок азидов можно скачать вручную или с помощью https://pubchempy.readthedocs.io/en/latest/:

import pubchempy as pcp azides = [] start = 1 for smile in ['N=[N+]=[N-]', '[N-]=[N+]=[N-]', '[N-][N+]#[N]', '[N]#[N+][N-]', '[N-][N]#[N+]', '[N+]#[N][N-]']: start +=1 try: azides.extend(pcp.get_properties('CanonicalSMILES', smile, 'smiles', searchtype='substructure', RingsNotEmbedded=True, MatchTautomers=True, listkey_count=1000, listkey_start=start)) except: continue
In [7]:
# Загрузим скаченные данные и отфильтруем (SMILES-нотации должны содержать менее 30 символов и не иметь разрывов)

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])

print (len(smiles))
13705

Коэффициент распределения в системе октанол-вода (logP) характеризует способность транспорта лекарственных веществ через клеточные мембраны, определяя их абсорбцию и распределение в различных системах организма. Отрицательное значение logP означает, что соединение имеет более высокую близость к водной фазе (более гидрофильно); когда logP = 0, то соединение одинаково распределено между липидной и водной фазами; положительное значение logP означает более высокую концентрацию соединения в липидной фазе (более липофильно). Поэтому отфильтруем модификации по logP (более водорастворимые соединения будут лучше выводиться из организма) и покажем в конце лучшую.

In [8]:
# Пстроим новые молекулы, заменив в отфильтрованных радикалах азидную группу на модифцированный ибупрофен, для первых 1500 соединений


new_smi = [] 
N = 0
all_mol = 1500 
templates = (tr1, tr2, tr3)

min_mol = Lipinksy.rdMolDescriptors.CalcCrippenDescriptors(ibu_mol)[0]
min_ind = 0


# Новую молекулу лучше создавать в try из-за битых Smiles

for smi in smiles[:all_mol]:    
    if 'N=[N+]=[N-]' in smi:
        for t in range(3):
            template = templates[t]
            #new_smi.append(smi.replace('N=[N+]=[N-]', template))
            newsmi = smi.replace('N=[N+]=[N-]', template)
    else:
        continue

# Если новая молекула удолтворяет правилу пяти Липинского, сохраним в массив и покажем

#for n_smi in new_smi:

    try:
        new_mol=Chem.MolFromSmiles(newsmi)
        if (Lipinksy.NumHDonors(new_mol) <= 5 and 
            Lipinksy.NumHAcceptors(new_mol) <= 10 and 
            Lipinksy.rdMolDescriptors.CalcExactMolWt(new_mol) <=500 and 
            Lipinksy.rdMolDescriptors.CalcCrippenDescriptors(new_mol)[0] <= min_mol):
            
            new_smi.append(new_mol)
           
            # Display all molecules       
            #AllChem.Compute2DCoords(new_mol)
            #display(new_mol)
            
            # Display index of each molecule
            #print N
            
            N = N + 1
            if Lipinksy.rdMolDescriptors.CalcCrippenDescriptors(new_mol)[0] < min_mol: 
                min = Lipinksy.rdMolDescriptors.CalcCrippenDescriptors(new_mol)[0]
                min_ind = N - 1

    except:
        pass   

print(' ')
print ('The amount of good structures: %s' % (len(new_smi)))   
print ('The best hit is number %i with the minimal value of logP %i' % (min_ind, min_mol))
display(new_smi[min_ind])
 
The amount of good structures: 494
The best hit is number 493 with the minimal value of logP 3
RDKit ERROR: [11:52:40] SMILES Parse Error: extra open parentheses for input: 'CC(C)(CC(CN1N=NC(=C1)CC(C(=O)O)C1=CC=C(C=C1)CC(C)C)C'
RDKit ERROR: [11:52:40] SMILES Parse Error: extra open parentheses for input: 'C(/C=C(/CN1N=NC(=C1)CC(C(=O)O)C1=CC=C(C=C1)CC(C)C)\C'
RDKit ERROR: [11:52:40] SMILES Parse Error: extra open parentheses for input: 'C1=CC2=C(C=C1N(CN1N=NC(=C1)CC(C(=O)O)C1=CC=C(C=C1)CC(C)C)C'
RDKit ERROR: [11:52:40] SMILES Parse Error: extra open parentheses for input: 'CC(CCC(=O)NCCCN1N=NC(=C1)CC(C(=O)O)C1=CC=C(C=C1)CC(C)C)(C'
RDKit ERROR: [11:52:40] SMILES Parse Error: extra open parentheses for input: 'CC(CCC(=O)NCCCN1N=NC(=C1)CC(C(=O)O)C1=CC=C(C=C1)CC(C)C)(C'
RDKit ERROR: [11:52:40] SMILES Parse Error: extra open parentheses for input: 'C/C=C/CC(CCCN1N=NC(=C1)CC(C(=O)O)C1=CC=C(C=C1)CC(C)C)(C'
RDKit ERROR: [11:52:40] SMILES Parse Error: extra open parentheses for input: 'C=CCC(CCN1N=NC(=C1)CC(C(=O)O)C1=CC=C(C=C1)CC(C)C)(C'
RDKit ERROR: [11:52:41] SMILES Parse Error: extra open parentheses for input: 'C1CCC(C(C1)N1N=NC(=C1)CC(C(=O)O)C1=CC=C(C=C1)CC(C)C)(C'
In [9]:
from IPython.display import SVG

img = Chem.Draw.MolsToGridImage(new_smi[-15:], molsPerRow=3, subImgSize=(300, 300))
img
Out[9]:
O S N N N O HO O O O N N N O OH N N N O HO O OH F F NH S NH N N N O OH NH O NH N N N O OH O HO N N N O HO F O N N N O HO OH O N N N N O HO N N N N O HO N HN N N N O HO Cl O NH N N N O HO S O O O N N N O HO N N N O HO OH N N N O HO O S O O N N O N N N O HO NH2

Similiraty Map

Построим Similiraty Map ибупрофена с пятым веществом из массива

In [15]:
from rdkit.Chem.Draw import SimilarityMaps

somemol = new_smi[4]

fp = SimilarityMaps.GetMorganFingerprint(somemol, fpType='bv')
fig, maxweight = SimilarityMaps.GetSimilarityMapForFingerprint(ibu_mol, somemol, SimilarityMaps.GetMorganFingerprint)

3D-структура

In [11]:
m3d = Chem.AddHs(somemol)
Chem.AllChem.EmbedMolecule(m3d)
AllChem.MMFFOptimizeMolecule(m3d, maxIters=500, nonBondedThresh=200)
m3d
Out[11]:
In [12]:
# К сожалению, данная команда не сохраняет изображение в html-странице

import nglview as nv

view = nv.show_rdkit(m3d)
view

Создадим pdb-файл молекулы

In [13]:
pdb_mol = Chem.MolToPDBBlock(m3d)
print(pdb_mol)
HETATM    1  C1  UNL     1       7.236   0.774   0.858  1.00  0.00           C  
HETATM    2  C2  UNL     1       6.646  -0.602   0.551  1.00  0.00           C  
HETATM    3  C3  UNL     1       5.841  -0.332  -0.723  1.00  0.00           C  
HETATM    4  C4  UNL     1       6.687   0.734  -1.409  1.00  0.00           C  
HETATM    5  O1  UNL     1       7.477   1.405  -0.409  1.00  0.00           O  
HETATM    6  N1  UNL     1       4.474   0.117  -0.544  1.00  0.00           N  
HETATM    7  N2  UNL     1       4.108   0.920   0.474  1.00  0.00           N  
HETATM    8  N3  UNL     1       2.805   1.134   0.372  1.00  0.00           N  
HETATM    9  C5  UNL     1       2.347   0.463  -0.731  1.00  0.00           C  
HETATM   10  C6  UNL     1       3.401  -0.189  -1.329  1.00  0.00           C  
HETATM   11  C7  UNL     1       0.907   0.497  -1.100  1.00  0.00           C  
HETATM   12  C8  UNL     1       0.068  -0.473  -0.251  1.00  0.00           C  
HETATM   13  C9  UNL     1       0.242  -1.919  -0.719  1.00  0.00           C  
HETATM   14  O2  UNL     1       0.943  -2.279  -1.654  1.00  0.00           O  
HETATM   15  O3  UNL     1      -0.467  -2.812   0.017  1.00  0.00           O  
HETATM   16  C10 UNL     1      -1.395  -0.051  -0.248  1.00  0.00           C  
HETATM   17  C11 UNL     1      -1.943   0.555   0.891  1.00  0.00           C  
HETATM   18  C12 UNL     1      -3.283   0.946   0.912  1.00  0.00           C  
HETATM   19  C13 UNL     1      -4.101   0.744  -0.206  1.00  0.00           C  
HETATM   20  C14 UNL     1      -3.551   0.151  -1.349  1.00  0.00           C  
HETATM   21  C15 UNL     1      -2.211  -0.240  -1.373  1.00  0.00           C  
HETATM   22  C16 UNL     1      -5.552   1.164  -0.183  1.00  0.00           C  
HETATM   23  C17 UNL     1      -6.540  -0.017  -0.109  1.00  0.00           C  
HETATM   24  C18 UNL     1      -7.969   0.490  -0.313  1.00  0.00           C  
HETATM   25  C19 UNL     1      -6.442  -0.763   1.224  1.00  0.00           C  
HETATM   26  N4  UNL     1       5.951  -1.262   1.659  1.00  0.00           N  
HETATM   27  H1  UNL     1       8.178   0.705   1.412  1.00  0.00           H  
HETATM   28  H2  UNL     1       6.554   1.411   1.431  1.00  0.00           H  
HETATM   29  H3  UNL     1       7.483  -1.254   0.268  1.00  0.00           H  
HETATM   30  H4  UNL     1       5.778  -1.236  -1.341  1.00  0.00           H  
HETATM   31  H5  UNL     1       6.106   1.480  -1.961  1.00  0.00           H  
HETATM   32  H6  UNL     1       7.393   0.271  -2.107  1.00  0.00           H  
HETATM   33  H7  UNL     1       3.463  -0.833  -2.195  1.00  0.00           H  
HETATM   34  H8  UNL     1       0.555   1.527  -0.955  1.00  0.00           H  
HETATM   35  H9  UNL     1       0.792   0.286  -2.171  1.00  0.00           H  
HETATM   36  H10 UNL     1       0.442  -0.455   0.783  1.00  0.00           H  
HETATM   37  H11 UNL     1      -1.034  -2.394   0.696  1.00  0.00           H  
HETATM   38  H12 UNL     1      -1.330   0.739   1.772  1.00  0.00           H  
HETATM   39  H13 UNL     1      -3.685   1.415   1.808  1.00  0.00           H  
HETATM   40  H14 UNL     1      -4.167  -0.008  -2.232  1.00  0.00           H  
HETATM   41  H15 UNL     1      -1.817  -0.695  -2.281  1.00  0.00           H  
HETATM   42  H16 UNL     1      -5.743   1.752  -1.091  1.00  0.00           H  
HETATM   43  H17 UNL     1      -5.728   1.851   0.655  1.00  0.00           H  
HETATM   44  H18 UNL     1      -6.320  -0.729  -0.914  1.00  0.00           H  
HETATM   45  H19 UNL     1      -8.254   1.203   0.468  1.00  0.00           H  
HETATM   46  H20 UNL     1      -8.684  -0.340  -0.290  1.00  0.00           H  
HETATM   47  H21 UNL     1      -8.071   0.989  -1.282  1.00  0.00           H  
HETATM   48  H22 UNL     1      -5.456  -1.220   1.354  1.00  0.00           H  
HETATM   49  H23 UNL     1      -6.621  -0.091   2.070  1.00  0.00           H  
HETATM   50  H24 UNL     1      -7.183  -1.569   1.272  1.00  0.00           H  
HETATM   51  H25 UNL     1       5.126  -0.704   1.910  1.00  0.00           H  
HETATM   52  H26 UNL     1       6.541  -1.253   2.492  1.00  0.00           H  
CONECT    1    2    5   27   28
CONECT    2    3   26   29
CONECT    3    4    6   30
CONECT    4    5   31   32
CONECT    6    7   10
CONECT    7    8    8
CONECT    8    9
CONECT    9   10   10   11
CONECT   10   33
CONECT   11   12   34   35
CONECT   12   13   16   36
CONECT   13   14   14   15
CONECT   15   37
CONECT   16   17   17   21
CONECT   17   18   38
CONECT   18   19   19   39
CONECT   19   20   22
CONECT   20   21   21   40
CONECT   21   41
CONECT   22   23   42   43
CONECT   23   24   25   44
CONECT   24   45   46   47
CONECT   25   48   49   50
CONECT   26   51   52
END

In [14]:
Image(filename='pdb_mol.png')
Out[14]:

Ссылки

In [ ]: