同位素与电荷:同位素标记、形式电荷的表示与标准化
这一章我们聊点实际生产中经常被忽略的东西——同位素标记和形式电荷。说实话,很多新手甚至老手都觉得只要把原子连对就行,同位素和电荷嘛,后面再补。但我在项目里吃过亏,有一次化合物注册库因为同位素写法不统一,导致一批含氘分子被下游工具当作普通氢处理,整整浪费了两天时间排查。从那以后,我把这部分单独拎出来做了标准化规则。
4.1 同位素标记的表示与标准化
SMILES 里规定,同位素用方括号括起,质量数写在元素符号前面。比如碳‑13 写 [13C],氘写 [2H]。看起来简单对吧?但实际数据里你会看到各种变体,比如 [C13]、[13C@@H] 甚至 H 直接写 [2H] 和 [D] 混用。标准化就是要把这些全部统一成一种形式。
[1H] 不要写成 [H])。我个人习惯用 RDKit 的 Chem.MolFromSmiles 解析后再通过 Chem.MolToSmiles 输出,RDKit 会自动规范化同位素位置。不过要注意,RDKit 会把氘写成 [2H],如果你内部要求保留 [D],那就得自己写转换。
from rdkit import Chem
smiles_list = [
"C[13C](=O)O", # 正确形式
"C[13C](=O)O", # 已标准
"[C13](=O)C", # 错误顺序
]
for smi in smiles_list:
mol = Chem.MolFromSmiles(smi)
print(Chem.MolToSmiles(mol))
# 输出统一为 C[13C](=O)O
4.2 形式电荷的表示与标准化
形式电荷在 SMILES 里用加号/减号跟在原子符号后面,比如铵根写 [NH4+],氧负离子写 [O-]。问题在于,电荷数量多时容易写重复,比如 [N+] 和 [N+1] 等价,但工具可能不认。标准化做法是:只写符号,不写数字 1;如果是多电荷,必须写数字,比如 [N+2] 而不是 [N++]。
| 原始写法 | 标准化结果 | 说明 |
|---|---|---|
[N+] | [N+] | 单电荷不写 1 |
[N+1] | [N+] | 去掉数字 1 |
[O--] | [O-2] | 双电荷写数字 |
[Fe+3] | [Fe+3] | 三价铁正确 |
[N+](=O)[O-],这个是对的。但如果写 N(=O)O 不带电荷,那就跟中性亚硝酸酯混淆了。标准化时必须显式标出形式电荷。4.3 标准化实战流程
整体流程我一般分三步走:解析 → 修正 → 重写。下面这张图可以帮你看清脉络。
具体到代码,我推荐在标准化管道里同时处理这两者:
def standardize_smiles(smi):
mol = Chem.MolFromSmiles(smi)
if mol is None:
raise ValueError("无法解析SMILES")
# RDKit 会自动处理同位素顺序和电荷格式
return Chem.MolToSmiles(mol, canonical=True)
# 测试
test_cases = [
"[13C]C", # 应当变为 C[13C]
"[2H]C(=O)O", # 应当保持
"[N+](=O)[O-]", # 保持
"[Fe+2]", # 保持
]
for s in test_cases:
print(f"{s:20} -> {standardize_smiles(s)}")
[13CH3] 变成 [13CH3],但如果你要显式写出所有氢,就得关掉 implicit valence。这在批处理中容易忽略,我建议在标准化前统一设置 Chem.SetDefaultMolProperties 参数。4.4 常见坑与避坑指南
坑一:同位素和手性同时存在时,比如 [13C@@H](C)O,标准化后可能变成 [13C@@H](C)O 没问题,但有些人忘记把质量数写在最前面导致解析出错。
坑二:电荷符号与数值重复,比如 [N+1] 在某些工具里会读成两个加号。我曾经在对接 PubChem 数据时发现近 3% 的分子存在这类错误。
坑三:硝基一定要写形式电荷。标准写法 [N+](=O)[O-],如果写成 N(=O)O 就失去硝基的特征了。标准化规则里必须强制加方括号。
[2H] 和 D 在可视化时没区别,直接替换。结果下游对接软件不认 D 元素符号,导致全部失败。从此以后我严格规定:任何同位素必须用方括号加质量数表示,禁止使用元素符号简写(如 D、T)。最后给个总结性的表格,方便对照:
| 项目 | 错误示例 | 正确标准化 |
|---|---|---|
| 同位素顺序 | [C13] | [13C] |
| 氘标记 | D 或 [D] | [2H] |
| 单电荷 | [N+1] 或 [N++] | [N+] |
| 多电荷 | [O--] 或 [O-2] | [O-2](数字不可省略) |
| 硝基 | N(=O)O | [N+](=O)[O-] |
这一章的内容就到这里。记住:同位素和电荷的标准化不是可选项,它是批次一致性检查的硬门槛。