三种碎片化方法:RECAP, BRICS与eMolFrag

如果有低级的化学错误请戳戳>v<


一、RECAP

Recap可以模仿实验室中的正向合成过程来进行逆向操作,对分子进行一系列的转换与分解,最终得到一组合理的分子片段。

1.1 简介

组合化学:若用一个构建块的n个单元和另一个构建块的n个单元同时反应,就能产生n*n个化合物,效率非常高。
组合化学的重点:找到高质量的构建块。
解决方法:运用RECAP, 基于化学知识将分子划分成构建块,并存入库中。之后就可以直接从这个库中取构建块使用。

1.2 一些不太相关的话

  1. 在这篇论文中motif和fragment是类似的意思。building blocks是要构建的库中的元素,它包含motif/fragment。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

1.3 Introduction

  1. RECAP的主要做法是:通过分割活性分子来获得活性构建块。我们知道有一些常见化学反应会形成的键,所以在分割分子的时候,我们就分割这些键。
  2. RECAP的特点:在11个预定义的键上分割。这11个预定义的键保证了分出来的碎片是适合组合的,是适用于组合化学的。

1.4 Method

1.4.1 Concept of RECAP

在这里插入图片描述
STEP1:收集一系列对特定目标有活性的结构。
STEP2:使用RECAP进行碎片化——只保留最终碎片而不保留中间过程。
STEP3:对碎片进行分析。包括该碎片在原始活性结构中出现频率的分析和集群分析(将类似的片段组合到一个群中)
STEP4:碎片分析好后合并成为构建块,计入库中。
STEP4的原文描述

1.4.2 Cleavage Rules

所谓的断裂规则指的就是:

  1. 预定义了11种bond,遇见这种bond就切一刀。
  2. 如果裂解完的碎片只包含小的官能团(氢、甲基、乙基、丙基和丁基),则这个碎片不裂解。目的:1.避免产生无用小片段。2.处于类药性考虑。
  3. 保留环结构(这一点可以并入第一点吗?或者说这11种bond的预定义确保了这一点吗?
    在这里插入图片描述
    这些键选择了常见的化学反应会产生的键,之所以要这么选择,是为了使这些碎片易于合成。(没道理啊?应该是说基于这些碎片易于合成更大单位的构建块还差不多
    ↑上面这句的原文描述
    另外,用户也可以自定义可切割的键。
1.4.3 A Cleavage Example

在这里插入图片描述
上图中一个分子有3条可断的键,形成4个碎片。碎片上有标记。文献中这个标记命名为“同位素标记”(Isotopic labels),但实际上它就是指:这条可断的键在11种可断键中的序号。
作者认为,这个标记表示了裂解点(/碎片)所处的原子环境(/化学环境)。
这个标记表示了【裂解点所处的原子环境】的原文描述
做标记记录下化学环境的意义:

  1. 用于综合规划。在合成的时候可以依据这类信息选取部分碎片。
  2. 可以得到一个碎片有几个裂解点,这个信息也是很重要的。据此可以将碎片划分成terminal monomer(一个裂解点)和 core template(多个裂解点)。上图中(2)(5)属于terminal monomer,(3)(4)属于core template

1.5 代码实现

rdkit封装了RECAP的过程。可以用Chem.Recap.RecapDecompose()将分子碎片化,输入为mol类型,输出为RecapHierarchyNode类型。这个类型可以理解为:分子树。

from rdkit import rdBase, Chem
from rdkit.Chem import AllChem, Draw
from rdkit.Chem import Recap
import pubchempy as pcp

celecoxib = pcp.get_compounds('celecoxib', 'name')
celecoxib = celecoxib[0]
sm = celecoxib.canonical_smiles#转换成smiles
celecoxib = Chem.MolFromSmiles(sm)#转换成mol
decomp = Chem.Recap.RecapDecompose(celecoxib)#碎片化
print(type(decomp))#碎片化后是一个特殊的数据类型

在这里插入图片描述
RecapHierarchyNode类型有children属性和parents属性,得到的都是一个字典。以children为例,得到的字典的键是【一个分子二分后所有可能的碎片】的字符串表示(是SMILES吗?好像不太像),值是其RecapHierarchyNode类型。

RecapHierarchyNode类型还有mol方法和smiles方法,它可以把RecapHierarchyNode类型转换成mol形式和smiles形式。
下面的第一行代码把一个分子树分了一次,得到的first_gen为所有可能的碎片的列表(mol形式)。

first_gen = [node.mol for node in decomp.children.values()]
print(first_gen)
node_type = [node for node in decomp.children.values()]
print(node_type)

在这里插入图片描述
可以看到,first_gen枚举了所有二分后的可能性。

Draw.MolsToGridImage(first_gen, molsPerRow=4, legends=[Chem.MolToSmiles(m) for m in first_gen])

这一行在pycharm中运行显示不出来,但是可以在jupyternotebook中看到。这里应该有3条可断边,所以它断成了2*2=4种。所谓的可断边是确定的,就是11种可能性。
在这里插入图片描述
下面这段代码递归生成一棵分子-碎片树,描述了一个分子是怎样被一步步断开的(的所有可能性)。

def get_leaves(recap_decomp, n=1):
    for child in recap_decomp.children.values():
        print('\t'*n+child.smiles)
        if child.children: ##さらなるフラグメント化のチェック
            get_leaves(child, n=n+1)
 
def get_recap_tree(mol):
    recap = Chem.Recap.RecapDecompose(mol)
    print(Chem.MolToSmiles(mol))
    get_leaves(recap)
 
get_recap_tree(celecoxib)

在这里插入图片描述
除此之外,RecapHierarchyNode类型还有以下一些方法:
hierarch.GetLeaves():输出一个字典,键是所有叶子节点,即最终产生的最简单的化合物)的字符串表示;值是它们的RecapHierarchyNode类型。
在这里插入图片描述
hierarch.GetAllChildren():输出一个字典,是所有的非根节点,其他与hierarch.GetLeaves()一致。
在这里插入图片描述
hierarch.getUltimateParents():返回一个只有一个元素的列表,这个就是根节点的RecapHierarchyNode类型。
在这里插入图片描述

二、BRICS

天惹这是一篇没有小标题的文献(ಥ_ಥ)

2.1 一些不相关的话

  1. 这篇文献对RECAP有一些描述:

In this context, the “fragment space” concept was introduced. In contrast to a fragment library, such a space consists not only of a set of fragments, but also of a set of rules that specifies how to recombine fragments by fusing the respective chemical motifs.

作者认为,RECAP产生了“碎片空间”的概念。这个碎片空间和碎片库(为什么是碎片库?不应该是碎片构成的building blocks即构建块库吗?)的区别是:它还包含了碎片融合的规则,即如何融合motifs以重组片段。(所以motifs和fragment还是不一样的?可能motif是一种种类的概念,而片段指的是具体的某个碎片?

motif是在许多蛋白质分子中,由几个具有二级结构的肽段在空间上相互接近、相互作用,所形成的折bai叠模样称为超二级结构,又称为模体。

但是看起来和划分没有关系的话那就和我没有关系吧^^

  1. 现有的问题是:“类药”的碎片空间是啥样的,碎片类药性是否取决于【该碎片是否来自于药物分子】。因此,有必要衡量当前模型和方法表示化学空间的程度和准确性。

2.2 文献

BRICS做的事:

  1. 给出了一套更好的碎片化的rules
  2. 给出一套重组模体(motif)的rules,以形成碎片空间。——正如前文所说,碎片空间除了碎片外,还需要重组模体/碎片的规则。
  3. 获得了一个高质量、高性能、公开可用的碎片集。

意义:
更好的碎片集、更高性能的碎片空间。

特点:

  1. 同时切所有可断的键,以避免产生冗余碎片。这与RECAP是一致的。但是在rdkit中RECAP是一层一层二分的?
    ↑原文描述

下图描述了一个BRICS划分的过程。它好像和RECAP没啥区别,但是又有区别:

  1. RECAP直接在划分后注上“同位素标签”即可断键的id。但BRICS划分后先注上“同位素标签”,再用link atoms取代这些同位素标签——但这些link atoms看起来正是可断键的id。(在eMolFrag中解释,所谓的link )
  2. 每个键断裂之后会产生两个断裂点,对RECAP来说两个断裂点打的同位素标签对应的可断键id是相同的;而BRICS是不同的。
    当然还有一些简单的事情,例如它也会丢弃/不划分很细枝末节的碎片。
    在这里插入图片描述

下图是16种片段。只列出了断裂点的化学环境,由于R基的多样性,碎片也具有多样性。L1L6&L8L4出现了两次,它们的区分为:是否“appeared as cyclic or acyclic substituents or linkers”。

在这里插入图片描述
我认为这里的16个rules和RECAP的11个rules形式上不同,RECAP列出的是可断键,而BRICS列出的是碎片结构
BRICS同样实现了用户自定义功能。

2.3 代码实现

2.3.1 拆解

参考资料:RDKit|通过Recap和BRICS对分子拆解与合成

与recap不同,该算法是根据键是否能够合成来进行拆解

由BRICS分解后的mol不再是一个用于表示分子树的新类型了,而是一个【一步到位的划分好的无冗余的碎片字符串】组成的列表

from rdkit.Chem import BRICS
m = Chem.MolFromSmiles('c1ccccc1OCCOC(=O)CC')
BRICS.BRICSDecompose(m)

在这里插入图片描述
可以由一组分子生成片段

import os
from rdkit.Chem import RDConfig
cdk_file = os.path.join(RDConfig.RDDocsDir, 'Book\data\cdk2.sdf')
cdk2mols = Chem.SDMolSupplier(cdk_file)
allfrags = set()
for m in cdk2mols:
    pieces = BRICS.BRICSDecompose(m)
    allfrags.update(pieces)
print(len(allfrags))
print(sorted(allfrags)[:3])

在这里插入图片描述

2.3.2 合成

BRICS.BRICSBuild的输入是由mol组成的列表,输出是一个generator类型的生成器。generator类型有next方法,在返回一个mol类型的合成分子的同时,计数器+1。

fragms = [Chem.MolFromSmiles(x) for x in sorted(allfrags)]
ms = BRICS.BRICSBuild(fragms)
print(type(ms))
prods = [next(ms) for x in range(4)]
Chem.Draw.MolsToGridImage(prods, molsPerRow=4, subImgSize=(200, 200))

在这里插入图片描述
在这里插入图片描述

三、eMolFrag

这是一个软件,可以把分子分成bricks和linkers两种类型的碎片,它们都属于构建块(building blocks)。

3.1一些不相关的话

文献中对BRICS进行了阐述:

BRICS expands the bond type criteria used by RECAP from 11 to 16 taking into account the chemical environment of each bond type and the surrounding substructures.

BRICS考虑了每种断裂键的化学环境和周围的子结构。言下之意是否是RECAP没有考虑这些?我觉得RECAP应该是属于考虑了化学环境但没有考虑周围子结构。

3.2 Introduction

在基于碎片的药物设计中,如果能够得到【带有碎片的连接信息】的构建块,效果会很好。
但是众多碎片化工具在提取构建块时,并不会储存碎片的连接信息,所以这篇文章提出eMolFrag,在提取构建块的同时储存了碎片的连接信息。

3.3 Methods

eMolFrag将分子划分成碎片集经过两个步骤:
在这里插入图片描述

3.3.1 Part I: Fragmentation

这一步使用BRICS算法将分子划分成碎片。其中含有至少4个非氢原子的碎片被归类为bricks,移除所有bricks后剩下的是linkers.
bricks储存完整的信息。下图为某bricks储存的信息。额外信息包括:

  1. ATOMTYPES:碎片中每个原子的类型
  2. BRANCH @atom-number eligible-atmtype-to-connect:所有的断裂键。每个断裂键是一个二维数组,第一维是碎片中的连着断裂键的原子的id,第二维是不在碎片中的、断裂键应连接的原子的类型。例如图中的6 C.3,指的是该碎片的第六个原子连着断裂键,断裂键的另一侧应该是一个类型为C.3的原子。
  3. fragments similar:被删除的类似片段。

在这里插入图片描述

下图为某linker储存的信息,额外信息只有:

  1. MAX-NUMBER-Of-CONTACTS ATOMTYPES:每个位置所能连接的最大键数和键另一端的原子类型,每个位置表示为一个二维数组。例如这个linker这栏信息的第二行为1 C.3, 标示这个linker的第二个位置最多可以连1个键,键的另一边连接的原子类型应为C.3。
    在这里插入图片描述
3.3.2 Part II: Mitigation of Fragment Redundancy

如果两种碎片满足xxxx(略),则认为它们是等价的,会被合并到同一类碎片中。这就是为什么BRICKS碎片中会有fragments similar信息。注意:虽然只有BRICKS碎片注释了这个信息,但BRICKS和linkers都从Part II中得到了size的缩减。

  • 22
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值