RDKit|骨架分解与侧链分离

  • 一、骨架分解
    • 1.Murcko Scaffold
    • 2.Generic Framework
  • 二、侧链分离
    • 1.rdRGroupDecomposition
    • 2.ReplaceCore

一、骨架分解

1.Murcko Scaffold

Murcko骨架由Murcko等人设计并用药物的形状、结构分析。他们将药物分子拆解成四种单元:环系结构(ring system)、接头(linker)、骨架(scaffold)、侧链(side chain),其中scaffold又由ring system和linker组成;scaffold和side chain又组成了药物分子。这么分解可以提供以下几点好处:

  1. Scaffold可以为药物的整体设计提供参考
  2. Ring system和linker可以为药化提供合成单元
  3. 可以通过形状的分析,评价分子库的类药程度

Rdkit中也提供了一些用于骨架和侧链分析的工具

  • 获取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

将分子以图的形式表示,对结构进行抽象,即所有的原子作为顶点,所有的键作为边,主要反映了原子间的连接属性。

  • 产生generic骨架:MakeScaffoldGeneric()
    所有重原子都以碳来代替,所有的键都以单键代替
gen_mcore = map(MurckoScaffold.MakeScaffoldGeneric, m_core)
Draw.MolsToGridImage(list(gen_mcore), subImgSize=(250, 250))
2

二、侧链分离

1.rdRGroupDecomposition

  • 先读进来一组分子
  • 定义一个母核,并指定侧链位置。
  • 也可以不标注侧链的序号,系统会自动生成序号
>>> 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
  • 分离侧链:rdRGD.RGroupDecompose(cores, mols, asSmiles , ...)
    cores:母核
    mols:要拆解的分子
    asSmiles:返回smiles还是mol对象
  • 变量unmatched用来存放没有匹配上母核的分子
  • 变量res是一个字典的列表,每个字典对应一个分子匹配上的母核和的侧链。
>>> 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'}
  • 查看结果
>>> Chem.Draw.MolsToGridImage([ms[0], Chem.MolFromSmiles(res[0]['R1']), Chem.MolFromSmiles(res[0]['R2'])], molsPerRow=3, subImgSize=(300, 300))
4
  • 还可以直接将res结果转换成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分离侧链

  • 先定义一个母核
  • 查看分子是否包含母核:HasSubstructMatch(core)
core = Chem.MolFromSmiles('n1cnoc1')
ms[0].HasSubstructMatch(core)
True
  • 去除母核,得到侧链:Chem.ReplaceCore()
rs = Chem.ReplaceCore(ms[0], core)
Chem.MolToSmiles(rs)
'[1*]c1cccc2c1OCCNC2CCCC(=O)O.[2*]c1ccc(OC(C)C)c(Cl)c1'
  • 根据分子中原子序号对侧链进行编号
rs = Chem.ReplaceCore(ms[0], core, labelByIndex=True)
Chem.MolToSmiles(rs)
'[1*]c1cccc2c1OCCNC2CCCC(=O)O.[4*]c1ccc(OC(C)C)c(Cl)c1'
  • 获取分离的侧链:Chem.GetMolFrags()
res = Chem.GetMolFrags(rs, asMols=True)
Chem.MolToSmiles(res[0])
'[4*]c1ccc(OC(C)C)c(Cl)c1'

本文参考自rdkit官方文档
代码及源文件在这里

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RDKit是一种常用的分子仿真、分析和可视化工具,它可以对化学分子进行多种操作和计算。其中包括基于片段的分子生成,这也是RDKit在药物发现和化学合成中的一个重要应用。 基于片段的分子生成是指根据已知的分子结构中所包含的骨架a和骨架b,生成与之相似但不完全相同的化合物。这种方法可以用于研究药物分子结构的多样性、发现药物活性的结构相关性,以及优化化合物的代谢性质、药效学性质等。 具体来说,基于片段的分子生成一般分为两个步骤。首先,需要对已知的骨架a和骨架b进行分段,得到不同的化学片段。然后,根据这些片段的性质和结构,结合组成分子的其他原子和键,利用相应的算法和软件程序生成相似的化合物。这些化合物可以通过计算化学性质、分析构效关系等方法进行进一步的研究和优化。 RDKit提供了一系列用于基于片段的分子生成的工具和函数,如MolFragmenter,MolStandardize,MolInterchange等。这些工具可以高效地对分子进行分段、生成相似分子、处理化学反应等操作,加速药物发现和化学研究的过程。同时,RDKit还支持多种化学文件格式、API接口、可视化效果等,方便用户使用和操作。 总之,基于片段的分子生成是RDKit在药物发现和化学合成领域中的重要应用之一。它为研究药物结构、优化化合物性质、设计新的药物分子等方面提供了有效的工具和方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值