SMARTS表达式
本文为转载文章,来自于https://zhuanlan.zhihu.com/p/477094703, 源英文文章来自于https://www.daylight.com/dayhtml/doc/theory/theory.smarts.html
简介
SMARTS表达式是Daylight公司对SMILES表达式(相信大家都很熟悉,在ChemDraw里也可以直接使用)的一个扩展,其意思为SMiles ARbitrary Target Specification,是一种描述分子模式和性质的语言。所有的SMILES表达式都可以在SMARTS中正常使用,同时在SMARTS体系中加入了逻辑算符和更多的分子描述符,这就使得其在子结构搜索、构建反应模板等方面非常强大,就像正则表达式(部分规则也与正则表达式相同)一样,可以匹配分子中的任意结构。
举个例子,如果想要在分子数据库中搜索含有苯酚的结构,就可以使用SMARTS字符串[OH]c1ccccc1(这同时也是一个正确的SMILES字符串)使用SMARTS就可以实现灵活、高效的子结构搜索。
在SMILES语言中,有两种基本的符号类型:原子和键。使用这些SMILES符号,可以表示一个以节点和边构成的图,通过说明每个节点代表什么类型的原子,每个边代表什么类型的键,就可以完整表达一个分子。
以上的逻辑在SMARTS中同样适用,只不过在SMARTS中增加了逻辑算符和特殊的原子、键的符号,使得结构的表达更加灵活、通用。例如在SMARTS原子符号中,[C,N] 表示这个原子是脂肪族的C原子或是脂肪族的N原子;在键符号中,波浪线”~“可以匹配任意类型的键。
原子基元 Atomic Primitives
SMARTS提供了一系列能够描述原子性质的基元符号。下表列出了SMARTS中特有的符号(所有SMILES中的原子符号在SMARTS中都是正确的)。表格中,<n> 表示一个整数,<c> 表示手性类。
注意,原子基元H有两种含义,一是表示氢元素本身,二是表示性质。例:[H] 表示氢原子,[*H2] 表示任意一个带有两个氢的原子。
符号 | 符号意义 | 原子性质要求 | 默认值(不加参数) |
---|---|---|---|
* | 通配符 | 任何原子 | 无 |
a | 芳香族 | 芳香性原子 | 无 |
A | 脂肪族 | 脂肪族原子 | 无 |
D<n> | 度 | 有<n>个显示键连的原子(与隐式氢相连的不算) | 有1个显示键连的原子 |
H<n> | 总的氢原子数 | 有<n>个相连的氢的原子 | 有1个相连的氢的原子 |
h<n> | 隐式氢原子数 | 有<n>个隐式氢的原子 | 至少有1个隐式氢的原子 |
R<n> | 环的关系 | 在<n>个最小环中的原子 | 任何在环上的原子 |
r<n> | 环的大小 | 在<n>元最小环中的原子 | 任何在环上的原子 |
v<n> | 键价 | 总键价为<n>的原子 (包括隐式氢,双键为2,三键为3) | 总键价为1的原子 |
X | 相连 | 与<n>个原子相连的原子(包括隐式氢) | 与1个原子相连的原子 |
x | 环相连 | 与<n>个环相连的原子 | 至少与1个环相连的原子 |
-<n> | 负电荷 | 有-<n>个电荷的原子 | 有1个负电荷的原子 --表示有2个负电荷,以此类推) |
+<n> | 正电荷 | 有+<n>个电荷的原子 | 有1个正电荷的原子(++表示有2个正电荷,以此类推) |
#n | 原子序数 | 原子序数为的原子 | 无 |
@ | 手性 | 逆时针 | 无 |
@@ | 手性 | 顺时针 | 无 |
@<c><n> | 手性 | 手性类手性(看不懂) | 无 |
@<c><n>? | 手性或未指定 | 手性<c><n>或未指定 | 无 |
<n> | 相对原子质量 | 相对原子质量为的原子 | 未指明原子质量 |
注:
- 隐式氢:正常情况下用SMARTS储存分子不会显示氢原子,其以隐式氢的形式存在,我们可以通过一些操作加上氢原子,使其变成显示氢。
- 最小环:例如萘(两个苯并环)可以看成是一个十元环。但最小环将其看作两个六元环的并环,其中有两个碳同时在两个环上即 [R2]
例:
C | 脂肪族碳原子 |
---|---|
c | 芳香性碳原子 |
a | 芳香性原子 |
[#6] | 原子序数为6的原子,即碳原子 |
[Ca] | 钙原子 |
[++] | 带两个正电荷的原子 |
[R] | 任何一个在环上的原子 |
[X3] | 有3个键连的原子(包括隐式氢) |
[v3] | 总键价为3的原子(包括隐式氢) |
CC@HO | 匹配手性(从C端看H-F-O呈逆时针) |
CC@?HO | 匹配手性(包括未指定手性)即可以匹配到CC@HO,也可以匹配到CCHO,不能匹配到CC@@HO。 |
键基元 Bond Primitives
符号 | 键属性要求 |
---|---|
- | 匹配单键(脂肪族) |
/ | 表示方向"上" |
\ | 表示方向"下" |
/? | 匹配"上"或是未指定 |
\? | 匹配"下"或是未指定 |
= | 双键 |
# | 三键 |
: | 芳香键 |
~ | 任意键(通配符) |
空 | 单键或芳香性键 |
注:双键两侧的结构分别用符号/和\表示,例如,F/C=C/F 表示反二氟乙烯,它的两个氟原子位于双键的两侧。
而F/C=C\F 表示顺二氟乙烯,它的两个氟原子位于双键的同一侧。
例:
C | 任何脂肪族碳原子 |
---|---|
cc | 任何一对相连的芳香碳 |
c:c | 由芳香键连接的芳香碳 |
c-c | 单键连接的芳香族碳(如联苯) |
逻辑算符
原子和键基元可以通过使用逻辑运算符组合成表达式。在下表中,e 表示任何一个原子或键的表达式。逻辑运算符按优先级递减的顺序列出(优先级高的运算符先求值)。
符号 | 表达式 | 意义 |
---|---|---|
感叹号 | !e1 | 非e1 |
与符号 | e1&e2 | e1和e2(高优先级) |
逗号 | e1,e2 | e1或e2 |
分号 | e1;e2 | e1和e2(低优先级) |
所有非基元的原子表达式都必须括在方括号中。默认操作是&(高优先级"and"),也就是说,两个相邻的没有插入逻辑运算符的表达式必须都为真,才能使表达式(或子表达式)为真。
例:
[CH2] | 含两个氢的脂肪族碳(亚甲基碳) |
---|---|
[!C;R] | 非脂肪族碳以及在环上的原子 |
[!C;!R0] | 同上("!R0"表示不在零元环上的原子) |
[n;H1] | 芳香族氮原子连接一个氢,如吡咯氮 |
[n&H1] | 同上 |
[nH1] | 同上 |
[c,n&H1] | 所有芳香族碳或芳香族氮原子连接一个氢 |
[X3&H0] | 总共有三个键连且没有氢的原子 |
[c,n;H1] | (芳香族碳原子或芳香族氮原子)并且只有一个氢 |
[Cl] | 所有氯原子 |
[35*] | 所有相对原子质量为35的原子 |
[35Cl] | 相对原子质量为35的氯同位素 |
[F,Cl,Br,I] | 任意一个卤素 |
递归SMARTS
任何SMARTS表达式都可以用这种形式从我们想要研究的原子开始编写SMARTS来定义原子环境。
S M A R T S SMARTS SMARTS
这样的定义可以被认为是原子性质。这些表达式可以与其他原子基元以相同的方式使用(也可以嵌套)。"$"表示匹配周围具有某种结构的原子,例如:
*C | 连接甲基(或亚甲基)碳的原子 |
---|---|
*CC | 与乙基碳相连的原子 |
[ ( ∗ C ) ; (*C); (∗C);(*CC)] | 同时在上述两种环境的结构(匹配CCC) |
下面的例子说明了这种表达式的作用,它导出了芳环上正对氧和间对氮的甲基碳的表达式。
CaaO | 碳和氧处于邻位 |
---|---|
CaaaN | 碳和氮处于间位 |
Caa(O)aN | 碳和氧处于邻位并且与氮处于间位(但只能匹配到二号位是氧,三号位是氮的情况) |
Ca(aO)aaN | 碳和氧处于邻位并且与氮处于间位(但只能匹配到二号位是氧,五号位是氮的情况) |
C[$(aaO);$(aaaN)] | 碳和氧处于邻位并且与氮处于间位(可以匹配到所有情况) |
组合匹配
SMARTS可能包含圆括号,可用于对点断开连接的片段进行分组。这个分组操作符使得SMARTS能够表达更强大的组件查询。通常,一组括号可以包括任何合法的SMARTS表达式。其中的两个或多个表达式可以组合成更复杂的SMARTS :
一组括号中的所有原子和键表达式必须在目标的单个组件中匹配。
SMARTS | SMILES | 能否使用SMARTS匹配SMILES |
---|---|---|
C.C | CCCC | 可以,"."表示两边的结构无需连接 |
(C.C) | CCCC | 可以,在SMARTS外加圆括号,表示括号内的结构需要在同一组分中出现 |
(C).(C) | CCCC | 不可以,使用多个圆括号,表示需要在不同的组分中进行匹配 |
(C).(C) | CCCC.CCCC | 可以 |
(C).C | CCCC | 可以 |
(C).(C).C | CCCC.CCCC | 可以,前两个碳要在不同的组分中,后一个可以匹配任意一个碳 |
使用圆括号可以帮助我们区别分子内/分子间反应
C(=O)O.OCC>>C(=O)OCC.O | 匹配酯化反应 |
---|---|
(C(=O)O).(OCC)>>C(=O)OCC.O | 匹配分子间酯化反应 |
(C(=O)O.OCC)>>C(=O)OCC.O | 匹配分子内酯化反应 |
反应查询
一个Reaction Query可以由可选的反应物,试剂和产物组成,它们之间用">"隔开。一个Reaction Query的部分与目标反应的对应部分相匹配。注意,用一个Molecule Query去匹配一个反应是合理的。如果这个分子的SMARTS式与目标反应的任意一部分匹配,则可以成功匹配。实际上用一个Molecule Query去匹配一个目标反应就是一个未指明SMARTS作用的匹配。
Query | Target | Matches |
---|---|---|
C>> | CC>>CN | 2 |
>C> | CC>>CN | 0 |
>>C | CC>>CN | 1 |
C | CC>>CN | 3 |
我们可以在原子后面加上":"和数字来标记该原子,如果原子做了标记,就会与对应的被标记的原子匹配,不会匹配到没有标记的原子上。如果在Query中未做标记,那么Target中的标记会被忽略。(原文中接下来举的例子相当晦涩,我们用另一个例子来说明)
SMARTS | 匹配结构 | 备注 |
---|---|---|
[#6]=,:[#6] | 与一个双键或者芳香性键相连的碳 | 分子SMARTS式,即没有">"的SMARTS表达式可以匹配反应SMARTS中的任意部分(反应物、试剂、产物) |
>>[#6]=,:[#6] | 产物中的与一个双键或芳香性键相连的碳 | 反应SMARTS,即有">"的SMARTS表达式不会匹配分子 |
[C:1]>>[C:1] | 对反应的碳原子做标记 | 原子如果做了标记,就会与对应的被标记的原子匹配,不会匹配到没有标记的原子上 |
[C:1]>>C | 反应碳 | 未成对的标记是无效的 |
[C:1][C:1]>>[C:1] | 多次标记反应碳 | SMARTS map classes inter-relate reactants to products but don’t intra-relate reactants or products. (Although query reactants have the same class, they can match target reactants of different classes.) |