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 图把这些关系串起来了。你盯着看一遍,基本就记住了 @ 和 @@ 的含义。

手性 SMILES 标记逻辑 四面体中心 @(逆时针) @@(顺时针) CIP优先级 + 书写顺序 R/S 绝对构型 核心判断流程 1. 找到手性中心,确认4个不同基团 2. 写出SMILES字符串,用 @ 或 @@ 标记四面体方向 3. RDKit解析时结合CIP优先级得到R/S标签

避坑总结

  • 不要混淆 @ 与 R/S。它们不直接对应。
  • 写手性 SMILES 时,务必用括号明确连接关系。
  • 多个手性中心时,每个独立标记,相互不影响。
  • 代码验证胜于肉眼检查——RDKit 的 GetChiralTag 是你的好帮手。

好了,现在你应该能看懂手性 SMILES 里的 @ 和 @@ 了。下个内容我们讲顺反异构的 / 和 \,那是处理双键立体化学的利器。