You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RDKit代码异常:输入数据集里的Picéatannol未出现在对比结果中

RDKit代码异常:输入数据集里的Picéatannol未出现在对比结果中

我仔细看了你的代码和问题描述,Picéatannol没出现在结果里的核心原因是子结构匹配的定义错误,加上过滤逻辑把它误判为不符合条件的分子,咱们一步步拆解解决:

1. 为什么Picéatannol被过滤掉?

你的代码里有个关键过滤逻辑:

if not (has_dimethoxybenzene or has_catechol):
    continue  # 不符合就跳过

问题出在catechol_pattern的创建方式上:你用了Chem.MolFromSmiles()来定义邻苯二酚的子结构,但这个方法生成的是完整的邻苯二酚分子(苯环上四个位置都是氢原子),而你的Picéatannol的苯环上除了两个羟基,还连有一个乙烯基取代基——RDKit的子结构匹配会严格对比原子的连接情况,所以带有取代基的苯环无法匹配“纯邻苯二酚”的完整分子结构,导致has_catechol返回False,最终Picéatannol被过滤掉。

2. 修复子结构匹配问题

把catechol_pattern的创建方式从MolFromSmiles改成MolFromSmarts,Smarts是RDKit专门用于子结构查询的语法,允许匹配带有其他取代基的结构:

# 用Smarts定义邻苯二酚子结构(只要求苯环上有两个邻位羟基,允许其他位置有取代基)
catechol_pattern = Chem.MolFromSmarts("Oc1c(O)cccc1")

修改后,RDKit会只检查苯环上是否存在两个相邻的羟基,不管其他位置有没有取代基,Picéatannol的苯环就能正常匹配了。

你可以在代码里加个调试语句验证匹配情况:

# 调试:检查Picéatannol是否匹配catechol_pattern
test_piceatannol = Chem.MolFromSmiles(molecules["Picéatannol"])
print(test_piceatannol.HasSubstructMatch(catechol_pattern))  # 现在应该返回True

3. 确保Picéatannol始终被包含的额外方案

如果想彻底避免过滤逻辑误删目标分子,还可以在循环里单独做特殊处理:

for name, smiles in molecules.items():
    mol = Chem.MolFromSmiles(smiles)
    if mol is None:
        print(f"❌ Erreur avec la molécule : {name}")
        continue

    # 特殊处理:Picéatannol直接保留,不参与过滤
    if name == "Picéatannol":
        has_required_substruct = True
    else:
        has_dimethoxybenzene = mol.HasSubstructMatch(dimethoxybenzene_pattern)
        has_catechol = mol.HasSubstructMatch(catechol_pattern)
        has_required_substruct = has_dimethoxybenzene or has_catechol

    if not has_required_substruct:
        continue

    # 后面的指纹生成、属性计算逻辑不变...

这样不管子结构匹配有没有问题,Picéatannol都会被保留到最终结果里。

4. 额外小提示

你代码里初始定义的piceatannol_smiles和molecules字典里的Picéatannol SMILES不一样,建议统一成同一个正确的SMILES(比如用你已经验证过能正确生成分子的初始版本),避免结构不一致导致的其他潜在问题。

备注:内容来源于stack exchange,提问作者amelya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 11:33:13