4. 立体化学与手性SMILES:@标记详解
SMILES 这东西,一开始是线性记原子的。但现实中的分子是有立体结构的——有的化合物明明原子序列一样,却像左手和右手,互成镜像但没法重叠。你要是用普通 SMILES 去描述这种分子,信息就丢了。
所以就有了手性标记 @。别看就一个符号,它定义了四面体中心的绝对构型。我刚开始接触那会儿,总搞不清 @ 和 @@ 的区别,后来亲手写了几条 SMILES 用 RDKit 转成 3D,才彻底搞明白。说白了,它就是个“指向规则”,告诉电脑哪个基团在你面前、哪个在后面。
4.1 四面体手性中心与 CIP 规则
手性中心最常见的场景是个 SP³ 碳,连着四个不同的基团。我们常说的 R/S 构型,是通过 Cahn-Ingold-Prelog (CIP) 优先级规则判定的。但 SMILES 里怎么表示?
它不用标签,而是用 @ 和 @@,配合原子在 SMILES 里的书写顺序,隐含地定义了构型。
关键概念:SMILES 中的手性标记不直接存储 R/S,而是存储了“从某个方向看过去,四个基团是顺时针还是逆时针排列”。RDKit 在读取时会自动转成 R/S。
举个例子,溴氯碘甲烷的 CHBrClI 有两种对映体:
Br
|
I--C--Cl
|
H
若将 C 写在第一位,四个基团按 H、Cl、Br、I 排列,一种写法是 IC(Cl)(Br)@@H,另一种是 IC(Cl)(Br)@H。
4.2 @ 和 @@ 的“视线方向”规则
你需要把 SMILES 字符串的手性中心想象成一个球,箭头从原子指向你。规则是这样的:
@:从第一个连接的基团开始,按照字符串顺序,前三个基团是逆时针排列(从你的视角看)。@@:前三个基团是顺时针排列。
等等,这好像和通常说的 R/S 是反的?对,它只是方向约定,不是绝对构型。R/S 需要结合 CIP 优先级才能判断。我遇到过新同事写 SMILES 时,直接把 R 构型写成 @,结果 RDKit 读出来是 S——因为他没理解 CIP 优先级对 @ 的影响。
我的习惯:写手性 SMILES 前,先用 ChemDraw 画出绝对构型,导出 SMILES,再对着结构检查一遍 @ 符号。这样可以避免手动写错。
4.3 书写格式:括号与连接
手性官能团必须用括号括起来,并且紧跟在手性原子后面。比如乳酸:
C[C@](O)(C(=O)O)H
注意这里 C 是手性碳,它连着四个基团:CH₃(在左边)、OH(在括号内)、COOH(也在括号内)、H(在最外)。括号里的基团顺序就是 CIP 排序?不,顺序无所谓,重要的是 SMILES 的书写顺序与 @ 的组合。
一个常见误区:
C[C@@](O)(C(=O)O)H # L-乳酸
C[C@](O)(C(=O)O)H # D-乳酸
我贴个表格帮你对比:
| SMILES | 手性标记 | 绝对构型(CIP) | 典型分子 |
|---|---|---|---|
C[C@](O)(C(=O)O)H |
@ | S(按 CIP) | D-乳酸 |
C[C@@](O)(C(=O)O)H |
@@ | R | L-乳酸 |
[C@@H](Cl)(Br)I |
@@ | R(以 H 为第四优先级) | 溴氯碘甲烷的一种对映体 |
你看,其实没有统一的“@ 等于 R”的说法,必须配合基团优先级。
4.4 多个手性中心与相对构型
一个分子可以有多个手性中心。SMILES 里每个中心独立标记。例如酒石酸有两个手性碳:
O=C(O)[C@@H](O)[C@@H](O)C(=O)O # (R,R)-酒石酸
O=C(O)[C@H](O)[C@H](O)C(=O)O # (S,S)-酒石酸
O=C(O)[C@@H](O)[C@H](O)C(=O)O # (R,S)-酒石酸(内消旋)
我踩过的坑:内消旋化合物虽然分子内有手性中心,但整体没有旋光性。SMILES 依然要写两个 @,但 RDKit 转成 3D 后你会看到两个 chiral tag,实际整体是对称的。
我曾经写过一套手性 SMILES 做虚拟筛选,没注意内消旋体的两个手性标记方向写反了,导致 RDKit 生成的 3D 构象全部是唯一对映体。后来调试了三天才发现是把 (R,S) 写成 (R,R) 了。血的教训:写完后一定要跑 RDKit 的 Chem.AssignAtomChiralTagsFromStructure 验证。
4.5 手性原子类型与标记规范
除了常见的 SP³ 碳,SMILES 也支持其他手性原子(如手性硫、手性磷),但必须用 @ 或 @@ 标记。注意:
- 手性原子必须有一个氢或一个键连接到外部(至少四个不同的基团)。
- 双键的顺反异构不使用
@,而是用/和\(下章讲)。 - 有些 SMILES 变体(如 Daylight SMILES)支持
@和@@后跟数字来表示“视线方向”的原子顺序,但通用标准还是简单的 @ 和 @@。
4.6 用 RDKit 验证手性标记
写 SMILES 不放心?直接扔给 RDKit 看看。
from rdkit import Chem
smiles = "C[C@](O)(C(=O)O)H"
mol = Chem.MolFromSmiles(smiles)
if mol:
for atom in mol.GetAtoms():
if atom.GetChiralTag() != Chem.rdchem.ChiralType.CHI_UNSPECIFIED:
print(atom.GetSymbol(), atom.GetIdx(), atom.GetChiralTag())
输出会告诉你每个手性原子是 CHI_TETRAHEDRAL_CW(顺时针,即 @@)还是 CHI_TETRAHEDRAL_CCW(逆时针,即 @)。然后用 Chem.AssignAtomCIPLabels(mol) 获得 R/S 标签。
我通常在 Notebook 里写个循环,批量校验几百条手性 SMILES。检查到冲突时就停下来手动看结构——这样可以避免库里的手性数据出现镜像错误。
4.7 手性 SMILES 的立体化学信息图
下面这个 SVG 图把这些关系串起来了。你盯着看一遍,基本就记住了 @ 和 @@ 的含义。
避坑总结
- 不要混淆
@与 R/S。它们不直接对应。 - 写手性 SMILES 时,务必用括号明确连接关系。
- 多个手性中心时,每个独立标记,相互不影响。
- 代码验证胜于肉眼检查——RDKit 的
GetChiralTag是你的好帮手。
好了,现在你应该能看懂手性 SMILES 里的 @ 和 @@ 了。下个内容我们讲顺反异构的 / 和 \,那是处理双键立体化学的利器。