2.3 三维构象与立体化学表征 本节摘要:二维图抹掉了两类关键事实——原子的空间排布(手性、顺反)与键旋转产生的构象系综。本节讲清 R/S 与 E/Z 如何在 SMILES 中标注、构象系综如何生成与优化,并用"一对对映体 + 一个柔性药物"的完整代码案例,划出"何时必须上三维"的实用边界。 编目柜台的最后一课,补回被字符串和图牺牲掉的空间信息。它直接服务于第7章的分子对接(受体口袋是三维的)和第6章的三维定量构效关系;如果你的项目只做相似性检索与二维建模,本节知识则是你判断"能不能省"的依据。 立体化学:一只手性中心的两种命运 分子的化学式与连接关系完全相同、空间排布互为镜像的一对分子,叫对映体。
本节摘要:二维图抹掉了两类关键事实——原子的空间排布(手性、顺反)与键旋转产生的构象系综。本节讲清 R/S 与 E/Z 如何在 SMILES 中标注、构象系综如何生成与优化,并用"一对对映体 + 一个柔性药物"的完整代码案例,划出"何时必须上三维"的实用边界。
编目柜台的最后一课,补回被字符串和图牺牲掉的空间信息。它直接服务于第7章的分子对接(受体口袋是三维的)和第6章的三维定量构效关系;如果你的项目只做相似性检索与二维建模,本节知识则是你判断"能不能省"的依据。
分子的化学式与连接关系完全相同、空间排布互为镜像的一对分子,叫对映体。它们的熔点、谱图几乎一样,在普通储藏条件下能量也相同——但在手性环境里(酶、受体、另一只手性分子面前)行为可以天差地别:一个是药,另一个可能无效甚至有害。反应停(沙利度胺)事件让全行业为这一课付出了代价,此后单一构型成了小分子药物的基本要求。
SMILES 用 @ 与 @@ 标注手性中心,含义是"从该原子看去,邻居原子按书写顺序呈顺时针还是逆时针排列"。L-丙氨酸与 D-丙氨酸只差一个符号:
from rdkit import Chem from rdkit.Chem import rdCIPLabeler # CIP 规则打 R S 标签 ala_L = Chem.MolFromSmiles("C[C@H](N)C(=O)O") ala_D = Chem.MolFromSmiles("C[C@@H](N)C(=O)O") for m, tag in [(ala_L, "L 型"), (ala_D, "D 型")]: rdCIPLabeler.AssignCIPLabels(m) center = Chem.FindMolChiralCenters(m, includeUnassigned=True) print(tag, center) # L 型 [(1, 'S')];D 型 [(1, 'R')] from rdkit.Chem import inchi print(inchi.MolToInchiKey(ala_L)) # 两个 Key 首段相同 print(inchi.MolToInchiKey(ala_D)) # 次段不同:立体差异写进了身份
两件事值得停一下。其一,@ 与 @@ 的具体意义取决于原子在字符串中的书写顺序——同一个分子换个写法,标记可能要从 @ 改成 @@,所以永远不要手工"修正"立体标记,交给规范化流程。其二,标准 InChIKey 把立体信息编入次段之前的首段之后区域,R 型与 S 型会得到不同的 Key:立体差异是身份差异,对账系统里绝不能把对映体混成一条记录。
双键的顺反异构用斜杠标记:F/C=C/F 是反式(两个氟在双键两侧),F/C=C\F 是顺式。规律与手性同理——几何信息写进字符串,身份随之分裂。
可旋转的单键让同一张分子图拥有大量空间形态(构象)。构象之间能量不同:跨过旋转势垒互相转化,常温下柔性分子是一束构象的动态混合物。药物设计关心的是这束混合物里哪些构象能摆出与靶点结合的姿态——二维表征对此完全失明。
计算化学信息学处理构象的标准流程是:生成(距离几何或系统搜索,产出多样化构象集)、优化(力场弛豫,消除原子重叠与键角畸变)、聚类去冗余(按骨架重原子均方根偏差截断)。RDKit 的 ETKDG 加 MMFF 组合就是这条流水线的现成实现。

构象生成的目标不是"找到唯一正确构象",而是用尽量少的构象覆盖结合姿态可能出现的那片地形——受体结合会诱导分子变形,所以与最低能量构象相差几 kcal 且骨架形状不同的构象,都值得留进候选。
背景。布洛芬是典型的柔性药物:丙酸链加异丁基苯环,可旋转键让它在溶液里呈多种姿态。假设它要进分子对接(第 7.2 节),对接程序需要一批三维构象当输入。这件事在二维表征看来毫无难度——毕竟只是一张图——而三维流程的每一步都有讲究。
操作。生成、优化、按均方根偏差去冗余,一套走完:
from rdkit import Chem from rdkit.Chem import AllChem ibp = Chem.AddHs(Chem.MolFromSmiles("CC(C)Cc1ccc(cc1)C(C)C(=O)O")) # 生成最多 200 个构象,骨架重原子 RMSD 小于 0.5 埃的视为重复 cids = AllChem.EmbedMultipleConfs( ibp, numConfs=200, pruneRmsThresh=0.5, params=AllChem.ETKDGv3()) print("去冗余后构象数:", len(cids)) # 典型输出:10 上下 # MMFF 力场批量优化并按能量排序 res = AllChem.MMFFOptimizeMoleculeConfs(ibp) res.sort(key=lambda r: r[1]) # r 为(是否收敛,能量)元组 best_e, worst_e = res[0][1], res[-1][1] print("最低能量:%.1f;最高:%.1f kcal/mol" % (best_e, worst_e)) conf0 = ibp.GetConformer(cids[0]) # 取最低能构象的三维坐标 print(tuple(round(v, 2) for v in conf0.GetPositions()[0]))
结果。两百次尝试经去冗余收敛到十余个彼此偏离超过 0.5 埃的构象;能量优化后,系综的能量跨度通常在几 kcal/mol 之内,最低能构象的酸链多朝向远离苯环的一侧。把这套构象交给对接程序,就是柔性配体的标准出厂设置。
解读。三处工程判断藏在参数里。pruneRmsThresh 越小保留越多——构象多则覆盖广,但对接耗时线性上涨,常规做法是零点五到一埃之间取值;先加氢再优化(AddHs)不可省,力场没有氢会把几何优化成灾难;能量最低不等于结合构象——受体诱导契合完全可能选中能量高两三个千卡的构象,这正是要保留系综而不是只留最低能的理由。
变式。若目的从对接换成三维描述符计算(第 6 章的 3D-QSAR),构象处理策略要反过来:需要把所有分子对齐到共同参照系,构象选择偏保守(最低能或药效团匹配构象),否则描述符的方差被构象噪声污染。同一套工具,两个用途,参数哲学相反——本节给出的判断框架,比任何固定参数都耐用。
@ 与 @@、/ 与 \ 写进字符串,R/S、顺反差异让 InChIKey 分道扬镳。