_MolFileChiralFlag 是 RDKit 在读取 Molfile(V2000/V3000)时自动添加的一个私有分子属性(private property),它对应的是 Molfile 中的 Chiral Flag,主要作用是保留文件中的原始信息,而不是直接参与 RDKit 的立体化学计算。
很多人容易误解这一点,以为它决定了分子的手性,其实并不是。
1. Molfile 中的 Chiral Flag
在 MDL Molfile 中,有一个 Chiral Flag。
例如 V2000 的 counts line:
12 12 0 0 1 0 999 V2000
^
Chiral Flag = 1
其中:
0:未声明分子具有特定手性意义1:声明该结构具有手性意义(“structure is chiral”)
注意,它不是说"这个分子有手性中心"。
而是说:
如果图中画出了立体信息,那么这些立体信息应该被认为是有意义的,而不是未知的。
2. RDKit 如何保存
读取 Molfile 后:
from rdkit import Chem
mol = Chem.MolFromMolFile("a.mol")
mol.GetProp("_MolFileChiralFlag")
可能得到
'1'
或者
'0'
这是一个字符串属性。
查看所有属性:
mol.GetPropsAsDict(includePrivate=True)
例如
{
"_MolFileChiralFlag": 1
}
3. 它不会决定 CIP 或立体中心
例如
OH
|
CH3 — C — Cl
|
H
如果楔键已经画出来:
RDKit 会根据:
- bond direction
- tetrahedral stereo
识别
Chem.FindMolChiralCenters(mol)
得到
[(1,'R')]
无论 Chiral Flag 是 0 还是 1。
也就是说:
Stereo Assignment
↑
wedge bond
atom stereo
bond stereo
而不是
_MolFileChiralFlag
4. 为什么 Molfile 还需要 Chiral Flag?
原因来自 MDL 的历史设计。
例如画一个楔键:
OH
▲
CH3 — C — Cl
|
H
存在两种可能:
情况 A
作者想表达
就是这个 R 构型
那么应该:
Chiral Flag = 1
情况 B
作者只是随便画了一个构象
并没有声明
R
还是
S
那么
Chiral Flag = 0
因此:
同样一个楔键
可能代表:
- 确定构型
- 只是画法
Chiral Flag 就是帮助区分这两种情况。
5. RDKit 会利用它吗?
大多数算法:
不会。
例如:
MolToSmiles()
AssignStereochemistry()
FindMolChiralCenters()
MolToInchi()
基本都不读取 _MolFileChiralFlag。
它更多是:
为了再次写回 Molfile 时能够恢复原始文件。
例如
Chem.MolToMolBlock(mol)
如果
_MolFileChiralFlag = 1
生成的 counts line 会保持:
...
1
...
而不是变成
...
0
...
所以它属于一种**格式保真(round-trip fidelity)**信息。
6. 可以修改
例如
mol.SetIntProp("_MolFileChiralFlag",1)
或者
mol.ClearProp("_MolFileChiralFlag")
写回:
Chem.MolToMolBlock(mol)
即可看到 counts line 改变。
7. 与 Enhanced Stereo 的关系
不要混淆:
_MolFileChiralFlag- StereoGroup(AND/OR/ABS)
例如
V3000
BEGIN COLLECTION
MDLV30/STEABS
MDLV30/STERAC
MDLV30/STEREL
END COLLECTION
这些对应的是:
mol.GetStereoGroups()
是真正影响:
- ABS
- OR
- AND
立体关系的数据。
而
_MolFileChiralFlag
只是:
“这个 Molfile 的 chiral flag 是多少”
两者完全不是一个层面的信息。
8. 总结
| 项目 | _MolFileChiralFlag |
|---|---|
| 来源 | Molfile V2000/V3000 的 Chiral Flag |
| 类型 | RDKit 私有分子属性(private property) |
| 是否决定 R/S | ❌ 否 |
| 是否决定楔键解析 | ❌ 否 |
是否影响 AssignStereochemistry() |
❌ 通常不影响 |
是否影响 GetStereoGroups() |
❌ 否 |
| 是否用于写回 Molfile 保留原始 Chiral Flag | ✅ 是 |
| 主要用途 | 保留 Molfile 原始语义和实现无损 round-trip |
需要注意的一点:虽然 RDKit 大多数核心立体化学算法不会依赖 _MolFileChiralFlag,但在 Molfile 导入/导出、与其他遵循 MDL 规范的软件交换数据时,它仍然有意义,因为有些软件会根据 Chiral Flag 来解释楔键所表达的是绝对构型还是仅作为示意绘制。
评论区