原子与键的表示:原子符号、键的类型、分支与环的表示法
SMILES 编码说白了就是用一串字符把分子结构讲清楚。怎么讲?靠三样东西:原子符号、键的类型,再加上分支和环的表示法。这一章我们就掰开揉碎了聊这些规则。我刚开始学 SMILES 的时候,觉得规则挺简单,后来踩了几个坑才明白,细节里全是门道。
1. 原子符号:从简写到方括号
SMILES 里表示原子,分两种情况。
有机元素可以直接写符号。B、C、N、O、P、S、F、Cl、Br、I 这些,直接写大写字母就行。氢原子通常省略,由软件自动补全。你想想看,乙醇写 CCO 而不是 C2H6O,省了多少事。
有机元素简写表
| 元素 | SMILES 写法 | 示例 |
|---|---|---|
| 碳 | C | 甲烷 CH₄ → C |
| 氧 | O | 水 H₂O → O |
| 氮 | N | 氨 NH₃ → N |
| 硫 | S | 硫化氢 H₂S → S |
| 氯 | Cl | 氯甲烷 CH₃Cl → CCl |
其他元素要用方括号括起来。比如钠写 [Na],铁写 [Fe],溴写 [Br]。为什么有的元素不用括号?我个人的理解是:有机化学里常见的那些元素出现频率太高,省掉括号能大幅缩短 SMILES 字符串。但碰到金属、稀有气体,或者需要标明同位素、价态、手性的时候,方括号就绕不开了。
方括号内还能加附加信息:
[13C] — 同位素标记的碳-13
[OH-] — 带负电的羟基
[C@@H] — 手性碳,指定立体构型
我在项目中遇到过新手把乙酸钠写成 CC(=O)[ONa],结果解析器报错。实际上钠必须写成 [Na],阳离子和阴离子也要分开。正确的写法是 CC(=O)[O-].[Na+]。
2. 键的类型:连接原子的桥梁
SMILES 用符号表示原子之间的化学键。一共四种类型,嗯,这里要注意省略规则。
| 键型 | 符号 | 示例 | 说明 |
|---|---|---|---|
| 单键 | - | C-C | 通常省略 |
| 双键 | = | C=C | 不可省略 |
| 三键 | # | C#C | 不可省略 |
| 芳香键 | : | c1ccccc1 | 芳香环中用 |
单键可以省略,这是 SMILES 最常用的简化手段。CC 就是乙烷,CCO 就是乙醇。你想想看,如果每个单键都写上,字符串得长一倍。
双键和三键不能省。我建议你养成习惯,写双键时一定加等号,写三键时一定加井号。否则解析器会把它当成两个原子直接相连的单键,结构就错了。
常见错误:把乙烯写成 CC。这是乙烷,不是乙烯。双键必须写出来:C=C。
我记得有一次处理一个天然产物的数据库,里面有一批分子死活匹配不上。查了半天,发现是双键位置写错了,等号放在了碳链的末端而不是中间。一个等号的位置,差之毫厘谬以千里。
3. 分支结构:圆括号的妙用
分子不是一条直线。怎么表示侧链和支链?用圆括号。
括号里的内容表示从当前原子分出去的支链。比如异丁烷 (CH₃)₂CHCH₃,SMILES 写成 CC(C)C。括号里的 (C) 表示从第二个碳分出去一个甲基。
括号可以嵌套。更复杂的分子,比如带有多个侧链的氨基酸,用括号一层套一层。
# 异丁烷:主链 C-C-C,第二个碳上连一个甲基
CC(C)C
# 叔丁醇:主链 C-O,碳上连三个甲基
CC(C)(C)O
# 更复杂的分支:2-甲基丁烷
CCC(C)C
我个人习惯:写复杂分支时,把每个括号内的原子数算清楚,然后数一下括号是否成对。我曾经在一次自动化脚本里生成 SMILES,少写了一个右括号,结果解析器把整个分子结构都读歪了,那个 bug 我调了整整一个下午。
检查括号是否匹配的小技巧:从左到右数,左括号加1,右括号减1,最终回到0。如果中间出现负数或结尾不是0,括号一定有问题。
4. 环结构:数字标签
环状结构怎么表示?SMILES 用数字标签来标记环的起点和终点。
简单说,在环开始和结束的原子后面标上同一个数字。环己烷 C₁-C₂-C₃-C₄-C₅-C₆ 首尾相连,写成 C1CCCCC1。第一个碳标1,第六个碳也标1,表示它们之间连了一条键。
# 环己烷
C1CCCCC1
# 苯(用芳香写法)
c1ccccc1
# 环戊烷
C1CCCC1
多个环用不同的数字。第1个环标1,第2个环标2,以此类推。一个分子里最多可以有上百个环,数字可以重复使用吗?可以,只要不同时出现就行。
多环化合物示例:十氢化萘
SMILES: C1CCCC2C1CCCC2
第1个环用数字1标记,第2个环用数字2标记,两个环共用两个碳原子。
我在项目中遇到过最头疼的事,就是处理一个带有15个环的天然产物。数字标签从1到15,我得一个一个数,生怕哪个数字标重复了或者漏标了。后来我写了个小脚本自动校验环的闭合性,才从这种苦力活里解脱出来。
避坑指南:我曾经在处理一个多环甾体化合物时,把两个环的数字标签写反了。环A用了2,环B用了1,结果解析出来的结构完全不是我要的分子。记住:每一对数字标签只能用于一个环,不能交叉使用。
5. 综合示例:从简单到复杂
来看看几个完整的 SMILES 编码,从简单到复杂,把刚才讲的规则串起来。
# 乙醇 — 最简单的含氧有机物
CCO
# 乙酸 — 含双键和羟基
CC(=O)O
# 2-丁醇 — 带分支的醇
CCC(C)O
# 环己烷 — 六元环
C1CCCCC1
# 甲苯 — 苯环上连甲基
Cc1ccccc1
拿乙酸 CC(=O)O 举个例子。从左往右读:C(碳1),C(碳2),(=O)(碳2上连一个双键氧),O(碳2上连一个羟基)。第二个碳上连了两个分支:一个双键氧,一个羟基。这就是 SMILES 的优雅之处——用简单的字符,精确描述三维结构。
下面这张图总结了本章的核心知识体系,我把原子符号、键的类型、分支表示和环表示放在一起,方便你对照记忆。
6. 常见错误与避坑
最后总结几个我实际工作中遇到的坑,你写 SMILES 的时候留个心眼。
- 括号不匹配:左括号和右括号数量不一致。写完后数一遍。
- 环的数字标签重复:同一个分子里,两个不同的环用了相同的数字。解析器会报错或生成错误结构。
- 双键位置错误:把双键放在不能存在的位置(比如环内的角张力过大处),或者漏写了双键。
- 方括号遗漏:金属离子、同位素、带电原子忘记加方括号。
- 芳香环误用大写:芳香族原子用小写字母(c, o, n),不是大写。写成 C1CCCCC1 是环己烷,不是苯。
一个小习惯:写完 SMILES 后,用 RDKit 或 OpenBabel 解析一下,看看生成的结构是不是你要的。可视化检查比肉眼看字符串可靠一百倍。