rdkit | 药物分子进行片段分解

rdkit | 药物分子进行片段分解

化学信息学家在某些药物研发应用场景里,不仅仅关注整体药物分子,有时也需要将所谓的类药性好的片段单独提取出来,提取出类药性质分子片段的共性,用于数据库的建设或者AI训练。
例如阿司匹林,可以被分解为苯环,羧基、乙醛以及一个单独的氧原子,共四个常见类药片段的组合。

接下来的代码采用了rdkit的BRICS算法,BRICS基于常见的反应,选择片段断键的位点,提供了化学合成意义上的可行性。

方案一

目前rdkit 有更简洁的方案一,更新如下,相比于方案二更加简洁:

from rdkit.Chem import BRICS
aspirin= Chem.MolFromSmiles('CC(=O)OC1=CC=CC=C1C(O)=O')
fragments=BRICS.BRICSDecompose(aspirin,allNodes=None, minFragmentSize=1, 
onlyUseReactions=None, silent=True, keepNonLeafNodes=False, singlePass=False, returnMols=False)
print (sorted['fragments'])
output: ['[1*]C(C)=O', '[16*]c1ccccc1[16*]', '[3*]O[3*]', '[6*]C(=O)O']


Arguments说明

  • allNodes 需要指明需要包含的节点分子,相对复杂,一般不会使用;
  • minFragmentSize,指明最小的片段至少需要包含的重原子个数,该例中定义为2时,'[3*]O[3*]'这个醚片段不会被拆分,而是与 ‘[16*]c1ccccc1[16*]‘的苯环合并成为’[3*]Oc1ccccc1[16*]’;
  • onlyUseReactions, BRICS是基于反应的方式决定拆分位点,这里可以定义仅用什么反应拆分,使用情况较少;
  • silent,若不关闭,会打印具体使用了什么反应进行拆分的相关信息;
  • keepNonLeafNodes,设定为True时,会一同返回未被完全拆分的中间较大片段;
  • singlePass,设定为True时返回片段仅最多包括一个断裂位点的结果,例如 ‘[16*]c1ccccc1[16*]‘结果会变为’[16*]c1ccccc1C(=O)O’与’[3*]OC©=O’,避开同一片段被多次反应断键;
  • returnMols,设定为True时返回的片段不是SMILES的形式,而是rdkit.Mol的形式。

方案二

相对方案一更加复杂,但可以了解并操作更多细节,

from rdkit import Chem
from rdkit.Chem import BRICS

def fragment_recursive(mol, frags):
    try:
        bonds = list(BRICS.FindBRICSBonds(mol))
        if len(bonds) == 0:
            frags.append(mol_to_smiles(mol))
            return frags
        idxs, labs = list(zip(*bonds))
        bond_idxs = []
        for a1, a2 in idxs:
            bond = mol.GetBondBetweenAtoms(a1, a2)
            bond_idxs.append(bond.GetIdx())
        order = np.argsort(bond_idxs).tolist()
        bond_idxs = [bond_idxs[i] for i in order]
        broken = Chem.FragmentOnBonds(mol,
                                      bondIndices=[bond_idxs[0]],
                                      dummyLabels=[(0, 0)])
        head, tail = Chem.GetMolFrags(broken, asMols=True)
        #print(mol_to_smiles(head), mol_to_smiles(tail))
        frags.append(mol_to_smiles(head))
        return fragment_recursive(tail, frags)
    except Exception as e:
        print (e)
        pass

aspirin= Chem.MolFromSmiles('CC(=O)OC1=CC=CC=C1C(O)=O')
fragments=fragment_recursive(aspirin, [])
print (fragments)

# > output: ['*C(C)=O', '*O*', '*c1ccccc1*', '*C(=O)O']

可以看到,输出的片段保留了阿司匹林被切断的位点,用通配原子符号*表示,可视化出来的效果是。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值