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)