rdkit 化學轉換

RDKit包含許多用於修飾分子的功能。注意,這些變換功能旨在提供一種簡單的方法,可以對分子進行簡單的修飾。

一、引入所需庫

#! /usr/bin/python
# coding: utf-8
# rdkit 化學轉換

from rdkit import Chem
from rdkit.Chem import AllChem
from rdkit.Chem import Draw
from rdkit.Chem.Scaffolds import MurckoScaffold
from rdkit.Chem import rdFMCS

二、基於子結構的轉換

使用RDKit的子結構匹配機器進行快速分子轉化的功能多種多樣

2.1 刪除子結構

m = Chem.MolFromSmiles('CC(=O)O')
patt = Chem.MolFromSmiles('C(=O)[OH]')
rm = AllChem.DeleteSubstructs(m, patt)
smi = Chem.MolToSmiles(rm)
print(smi)  # C
mols = [m, rm]
img = Draw.MolsToGridImage(
    mols,
    molsPerRow=2,
    subImgSize=(200,200),
    legends=['' for x in mols]
)
img.save('/Users/zeoy/st/drug_development/st_rdcit/img/mol12.jpg')

在這裏插入圖片描述

2.2 取代基替換

m = Chem.MolFromSmiles('COc1c(Br)cccc1OC')
patt = Chem.MolFromSmarts('OC')
repsmis = ['F','Cl','Br','O']

mols = []
mols.append(m)
for r in repsmis:
    rep = Chem.MolFromSmarts(r)
    res = AllChem.ReplaceSubstructs(m, patt, rep)
    mols.extend(res)

print(mols)
smis = [ Chem.MolToSmiles(mol) for mol in mols]  
print(smis)  # ['COC(C)=O']
mols = [Chem.MolFromSmiles(smi) for smi in smis]
print(mols)
img = Draw.MolsToGridImage(mols, molsPerRow=3,subImgSize=(200,200),legends=['' for x in mols])
img.save('/Users/zeoy/st/drug_development/st_rdcit/img/mol13.jpg')

在這裏插入圖片描述

注:ReplaceSubstructs()替換操作返回的是分子對象操作列表,如果分子只有一個地方匹配到,則返回一個分子的列表。

如果分子中有2個地方匹配到,則返回2個分子的列表。爲了標準化smiles,可以將得到的分子mol化->smiles->mol,然後在進行可視化

2.3 SAR分析-core可視化

# Chem.ReplaceSidechains(m1,core) : 我們需要定義分子對象,骨架分子; 然後執行ReplaceSidechains函數,刪除側鏈就能得到骨架可視化。
# 定義嘧啶爲核心結構,對其骨架進行可視化
m1 = Chem.MolFromSmiles('BrCCc1cncnc1C(=O)O')
core = Chem.MolFromSmiles('c1cncnc1')
tmp = Chem.ReplaceSidechains(m1, core)
Chem.MolToSmiles(tmp)

Draw.MolToImageFile(tmp, '/Users/zeoy/st/drug_development/st_rdcit/img/mol14.jpg')

在這裏插入圖片描述

2.4 SAR分析-sidechain可視化

m1 = Chem.MolFromSmiles('BrCCc1cncnc1C(=O)O')
core = Chem.MolFromSmiles('c1cncnc1')
tmp = Chem.ReplaceCore(m1, core)
Draw.MolToImageFile(tmp, '/Users/zeoy/st/drug_development/st_rdcit/img/mol15.jpg')

側鏈

注:側鏈的編號默認是從1開始的,這取決於算法找到側鏈的先後順序。

也可以根據側鏈連接到骨架上的原子進行編號tmp=CHem.ReqlaceCore(m1, core)

tmp = Chem.ReplaceCore(m1, core, labelByIndex=True)
Draw.MolToImageFile(tmp, '/Users/zeoy/st/drug_development/st_rdcit/img/mol16.jpg')

在這裏插入圖片描述

2.5 拆分手段

rs = Chem.GetMolFrags(tmp, asMols=True)
print(len(rs))  # 2
smi0 = Chem.MolToSmiles(rs[0])
print(smi0)  # *CCBr
smi1 = Chem.MolToSmiles(rs[1])
print(smi1)  # [5*]C(=O)O

三、Murcho分解

把分子中環結構提取出來,然後保留連接環結構的最少的鍵,如果該結構上的原子是雙鍵連接,則保留雙鍵,得到的結構稱爲Murcho骨架

3.1 獲取分子骨架Murcho

m1 = Chem.MolFromSmiles('C=CC(=O)N1CCC(CC1)C2CCNC3=C(C(=NN23)C4=CC=C(C=C4)OC5=CC=CC=C5)C(=O)N')
m2 = Chem.MolFromSmiles('CCC(CC)COC(=O)C(C)NP(=O)(OCC1C(C(C(O1)(C#N)C2=CC=C3N2N=CN=C3N)O)O)OC4=CC=CC=C4')
m3 = Chem.MolFromSmiles('CNC1(CCCCC1=O)C1=CC=CC=C1Cl')

core_1 = MurckoScaffold.GetScaffoldForMol(m1)
core_2 = MurckoScaffold.GetScaffoldForMol(m2)
core_3 = MurckoScaffold.GetScaffoldForMol(m3)

core_mols = [core_1, core_2, core_3]
img = Draw.MolsToGridImage(
    core_mols,
    molsPerRow=3,
    subImgSize=(300,300),
    legends=['' for x in core_mols]
)
img.save('/Users/zeoy/st/drug_development/st_rdcit/img/mol17.jpg')

在這裏插入圖片描述

四、最大公共分子

RDKit內置了計算最大公共子結構的函數FindMCS

4.1 最大公共子結構FindMCS函數解析

FindMCS(
    (AtomPairsParameters)mols   # mol對象
    [,(bool)maximizeBonds = True 
    [,(float)threshold = 1.0 
    [,(int)timeout = 3600 
    [,(bool)verbose = False 
    [,(bool)matchValences = False 
    [,(bool)ringMatchesRingOnly = False 
    [,(bool)completeRingsOnly = False 
    [,(bool)matchChiralTag = False 
    [,(AtomCompare) atomCompare = rdkit.Chem.rdFMCS.AtomCompare.CompareElements 
    [,(BondCompare) bondCompare = rdkit.Chem.rd.FMCS.BondCompare.CompareOrder 
    [,(RingCompare) ringCompare = rdkit.Chem.rdFMCS.RingCompare.IgnoreRingFusion 
    [,(str) seedSmarts ='' 
    ] ] ] ] ] ] ] ] ] ] ]
)

該函數返回一個MCSResult實例,其中包含有關MCS中的原子數和鍵數,與所標識的MCS匹配的SMARTS字符串以及有關的算法是否超時的標誌信息。

如果未找到MCS,則將原子和鍵數設置爲0,SMARTS設置爲’’。

默認atomCompare和bondCompare採用(AtomCompare)AtomCompare=rdkit.Chem.rdFMCS.AtomCompare.CompareElements 要求他們元素相同和 (BondCompare)bondCompare=rdkit.Chem.rdFMCS.BondCompare.CompareOrder 有相同的鍵的類型。

4.1.1 atomCompare也有其他的內置函數如:

rdkit.Chem.rdFMCS.AtomCompare.CompareElements
CompareAny = rdkit.Chem.rdFMCS.AtomCompare.CompareAny
CompareAnyHeavyAtom = rdkit.Chem.rdFMCS.AtomCompare.CompareAnyHeavyAtom
CompareElements = rdkit.Chem.rdFMCS.AtomCompare.CompareElements
CompareIsotopes = rdkit.Chem.rdFMCS.AtomCompare.CompareIsotopes

4.1.2 bondCompare也有其他的內置函數如:

CompareAny = rdkit.Chem.rdFMCS.BondCompare.CompareAny
CompareOrder = rdkit.Chem.rdFMCS.BondCompare.CompareOrder
CompareOrderExact = rdkit.Chem.rdFMCS.BondCompare.CompareOrderExac

MCS算法搜索公共子結構的通常花費幾秒鐘的時間,如果遇到複雜結構,通常需要幾分鐘甚至更長時間。 默認timeout=3600秒。如果超過默認時間,則這個res.canceled屬性會被設置成True。

4.2 最大公共分子結構FindMCS

以下三個分子爲例,計算它們的最大公共分子

mol1 = Chem.MolFromSmiles("O=C(NCc1cc(OC)c(O)cc1)CCCC/C=C/C(C)C")
mol2 = Chem.MolFromSmiles("CC(C)CCCCCC(=O)NCC1=CC(=C(C=C1)O)OC")
mol3 = Chem.MolFromSmiles("c1(C=O)cc(OC)c(O)cc1")
mols = [mol1, mol2, mol3]

img = Draw.MolsToGridImage(
    mols,
    molsPerRow=3,
    subImgSize=(300,300),
    legends=['' for x in mols]
)
img.save('/Users/zeoy/st/drug_development/st_rdcit/img/mol18.jpg')

在這裏插入圖片描述

res = rdFMCS.FindMCS(mols)
print('原子個數=', res.numAtoms)  # 原子個數= 10
print('鍵個數=', res.numBonds)  # 鍵個數= 10

common_mol = Chem.MolFromSmarts(res.smartsString)  

Draw.MolToImageFile(common_mol, '/Users/zeoy/st/drug_development/st_rdcit/img/mol19.jpg')

默認情況下,如果兩個原子是相同的元素,則匹配;如果兩個原子具有相同的鍵類型,則鍵匹配。指定atomCompare和bondCompare使用不同的比較功能。

mols = (
    Chem.MolFromSmiles('NCC'),
    Chem.MolFromSmiles('OC=C')
)
res1 = rdFMCS.FindMCS(mols, atomCompare=rdFMCS.AtomCompare.CompareAny).smartsString
print(res1)  # [#7,#8]-[#6]
res2 = rdFMCS.FindMCS(mols, bondCompare=rdFMCS.BondCompare.CompareAny).smartsString
print(res2)   # [#6]-,=[#6]

atomCompare參數的選項爲:CompareAny表示任何原子都與任何其他原子匹配,

CompareElements按元素類型進行比較,Comparelsotopes根據同位素標籤進行匹配。同位素標記可用於實現用戶定義的原子類型。

CompareAny的bondCompare表示任何鍵都與任何其他鍵匹配,CompareOrderExact表示,當且僅當鍵具有相同的鍵類型時,它們纔是等價的,並且CompareOrder允許單個鍵和芳族鍵相互匹配,但要求精確的順序匹配:

mols = (
    Chem.MolFromSmiles('c1ccccc1'),
    Chem.MolFromSmiles('C1CCCC=C1')
)
res_bond_any = rdFMCS.FindMCS(mols,bondCompare=rdFMCS.BondCompare.CompareAny).smartsString
print(res_bond_any)
res_bond_order_exact = rdFMCS.FindMCS(mols,bondCompare=rdFMCS.BondCompare.CompareOrderExact).smartsString
print(res_bond_order_exact)
res_bond_order = rdFMCS.FindMCS(mols,bondCompare=rdFMCS.BondCompare.CompareOrder).smartsString
print(res_bond_order)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章