- 一鳞仙、骨架分解
- 1.Murcko Scaffold
- 2.Generic Framework
- 二、側(cè)鏈分離
- 1.rdRGroupDecomposition
- 2.ReplaceCore
一横腿、骨架分解
1.Murcko Scaffold
Murcko骨架由Murcko等人設(shè)計并用藥物的形狀、結(jié)構(gòu)分析斤寂。他們將藥物分子拆解成四種單元:環(huán)系結(jié)構(gòu)(ring system)耿焊、接頭(linker)、骨架(scaffold)遍搞、側(cè)鏈(side chain)罗侯,其中scaffold又由ring system和linker組成;scaffold和side chain又組成了藥物分子溪猿。這么分解可以提供以下幾點好處:
- Scaffold可以為藥物的整體設(shè)計提供參考
- Ring system和linker可以為藥化提供合成單元
- 可以通過形狀的分析钩杰,評價分子庫的類藥程度
Rdkit中也提供了一些用于骨架和側(cè)鏈分析的工具
- 獲取Murcko骨架:GetScaffoldForMol()
>>> from rdkit import Chem
>>> from rdkit.Chem import Draw
>>> from rdkit.Chem.Scaffolds import MurckoScaffold
>>> m = Chem.MolFromSmiles('O=C(NCc1cc(OC)c(O)cc1)Cc1cocc1CC')
>>> core = MurckoScaffold.GetScaffoldForMol(m)
>>> m_core = [m, core]
>>> Draw.MolsToGridImage(m_core, subImgSize=(250, 250))
1
- 直接獲取smiles的murcko骨架,并輸出smiles:MurckoScaffoldSmilesFromSmiles(smiles, mol, includeChirality)
- 同MurckoScaffoldSmiles()
>>> MurckoScaffold.MurckoScaffoldSmilesFromSmiles('O=C(NCc1cc(OC)c(O)cc1)Cc1cocc1CC')
'O=C(Cc1ccoc1)NCc1ccccc1'
2.Generic Framework
將分子以圖的形式表示诊县,對結(jié)構(gòu)進(jìn)行抽象讲弄,即所有的原子作為頂點,所有的鍵作為邊依痊,主要反映了原子間的連接屬性避除。
- 產(chǎn)生generic骨架:MakeScaffoldGeneric()
所有重原子都以碳來代替,所有的鍵都以單鍵代替
gen_mcore = map(MurckoScaffold.MakeScaffoldGeneric, m_core)
Draw.MolsToGridImage(list(gen_mcore), subImgSize=(250, 250))
2
二、側(cè)鏈分離
1.rdRGroupDecomposition
- 先讀進(jìn)來一組分子
- 定義一個母核驹饺,并指定側(cè)鏈位置钳枕。
- 也可以不標(biāo)注側(cè)鏈的序號,系統(tǒng)會自動生成序號
>>> from rdkit.Chem import rdRGroupDecomposition as rdRGD
>>> suppl = Chem.SmilesMolSupplier('F:\\Anaconda3_2019_10\\Library\\share\\RDKit\\Docs\\Book\\data\\s1p_chembldoc89753.txt', delimiter=",", smilesColumn=9, nameColumn=10)
>>> ms = [x for x in suppl if x]
>>> core = Chem.MolFromSmarts('[*:1]c1nc([*:2])on1')
>>> core
3
- 分離側(cè)鏈:rdRGD.RGroupDecompose(cores, mols, asSmiles , ...)
cores:母核
mols:要拆解的分子
asSmiles:返回smiles還是mol對象 - 變量unmatched用來存放沒有匹配上母核的分子
- 變量res是一個字典的列表赏壹,每個字典對應(yīng)一個分子匹配上的母核和的側(cè)鏈鱼炒。
>>> res, unmatched = rdRGD.RGroupDecompose([core], ms, asSmiles=True)
>>> print(len(res), len(unmatched))
>>> res[0]
40 0
{'Core': 'n1oc([*:2])nc1[*:1]',
'R1': 'O=C(O)CCCC1NCCOc2c1cccc2[*:1]',
'R2': 'CC(C)Oc1ccc([*:2])cc1Cl'}
- 查看結(jié)果
>>> Chem.Draw.MolsToGridImage([ms[0], Chem.MolFromSmiles(res[0]['R1']), Chem.MolFromSmiles(res[0]['R2'])], molsPerRow=3, subImgSize=(300, 300))
4
- 還可以直接將res結(jié)果轉(zhuǎn)換成dataframe
>>> import pandas as pd
>>> df = pd.DataFrame(res)
>>> df.head()
Core R1 R2
0 n1oc([*:2])nc1[*:1] O=C(O)CCCC1NCCOc2c1cccc2[*:1] CC(C)Oc1ccc([*:2])cc1Cl
1 n1oc([*:2])nc1[*:1] O=C(O)CCC1NCCOc2c1cccc2[*:1] CC(C)Oc1ccc([*:2])cc1Cl
2 n1oc([*:2])nc1[*:1] O=C(O)CCC1COc2ccc([*:1])cc2CN1 CC(C)Oc1ccc([*:2])cc1Cl
3 n1oc([*:2])nc1[*:1] O=C(O)CCCC1NCCOc2c1cccc2[*:1] CC(C)Oc1ncc([*:2])cc1Cl
4 n1oc([*:2])nc1[*:1] O=C(O)CCCC1NCCOc2c1cccc2[*:1] CC(C)Oc1ncc([*:2])cc1Cl
2.ReplaceCore
除了上述方法,還可以通過Chem.ReplaceCore分離側(cè)鏈
- 先定義一個母核
- 查看分子是否包含母核:HasSubstructMatch(core)
core = Chem.MolFromSmiles('n1cnoc1')
ms[0].HasSubstructMatch(core)
True
- 去除母核蝌借,得到側(cè)鏈:Chem.ReplaceCore()
rs = Chem.ReplaceCore(ms[0], core)
Chem.MolToSmiles(rs)
'[1*]c1cccc2c1OCCNC2CCCC(=O)O.[2*]c1ccc(OC(C)C)c(Cl)c1'
- 根據(jù)分子中原子序號對側(cè)鏈進(jìn)行編號
rs = Chem.ReplaceCore(ms[0], core, labelByIndex=True)
Chem.MolToSmiles(rs)
'[1*]c1cccc2c1OCCNC2CCCC(=O)O.[4*]c1ccc(OC(C)C)c(Cl)c1'
- 獲取分離的側(cè)鏈:Chem.GetMolFrags()
res = Chem.GetMolFrags(rs, asMols=True)
Chem.MolToSmiles(res[0])
'[4*]c1ccc(OC(C)C)c(Cl)c1'
- 更多關(guān)于側(cè)鏈替換昔瞧、刪除操作,可以參考這篇文章