本说明介绍如何使用本仓库内的可购性检查工具,基于两部分:
scripts/check_accessible.py:单个 SMILES 可购性检查(本地库存优先,其次 PubChem)。inference.py:命令行工具(CLI)。可对模型预测得到的合成路径(paths)进行筛选:若存在“全可购”路径优先保留;若不存在,则保留“不可购节点最少”的路径集合。也可先调用模型生成 paths 再筛选。
适用场景:你已有模型输出的 path_string 列表,想快速过滤出所有节点都可购的路线;或希望一步生成+筛选。
目录定位(默认):
- 可购库存清单:
data/compounds/buyables-stock.txt - 可视化/模型配置:
data/configs/dms_dictionary.yaml - 模型权重目录:
data/checkpoints/
注意:仅“检查模式”(只用 --paths-file)不需要安装 torch;只有选择“先生成再检查”时才会加载模型相关依赖。输入 paths 支持两种形式:
- JSON 字符串 path_string(如 "{'smiles':'...','children':[...]}")
- 已解析的字典对象路径(形如
{smiles, children}的树)
一、快速开始(仅检查已有 paths)
- 文件格式支持:
- JSON 数组:元素可以是
path_string字符串,或已解析好的路径字典对象 - 行分隔文本:每行一个
path_string字符串
- JSON 数组:元素可以是
示例:
- 只检查 children(起始物料),不要求根节点(产物)可购:
python3 inference.py --paths-file my_paths.txt --children-only --output filtered.json
- 要求路径中包含根节点在内所有节点都可购:
python3 inference.py --paths-file my_paths.txt --include-root --output filtered.json
可选参数:
--stock-file data/compounds/buyables-stock.txt覆盖默认库存清单--sleep 0.2PubChem 查询限速(秒),默认 0.2
二、生成 + 检查(需要模型与 checkpoint) 示例:
python3 inference.py --target "CNCc1cc(-c2ccccc2F)n(S(=O)(=O)c2cccnc2)c1" --model explorer --beam-size 32 --children-only --output filtered.json- 可选:
--n-steps,--starting-material,--ckpt-dir data/checkpoints,--config data/configs/dms_dictionary.yaml
提示:脚本会在运行时自动将 ./src 加入 sys.path,可直接以源码方式调用模块;若使用自定义安装环境,确保 directmultistep 模块可被导入。
三、筛选策略与输出说明(JSON)
- 筛选策略:
- 若存在“整条路径所有被检查节点都可购”的路径,优先保留这些(all_access)。
- 若不存在全可购路径,则保留“不可购节点数最少”的路径集合(min_inaccessible)。若并列,全部保留。
- 输出字段:
total: 候选路径数量accessible: 全可购路径数量(仅统计 all_access)include_root: 是否要求根节点一并检查selection:all_access或min_inaccessiblemin_not_accessible: 若为min_inaccessible策略,给出最小不可购节点数;否则为 nullpaths: 选中的路径列表(JSON 结构:每条路径为{smiles, children}的字典树,不是字符串)statuses: 每个出现过的 SMILES 的判定结果,形如{"status": "purchasable" | "no_vendors" | "not_found" | "error", "detail": "..."}path_reports: 每条候选路径的诊断:{"path": <JSON路径>, "not_accessible": <数量>, "not_accessible_smiles": [..]}
四、判定逻辑与来源
- 先查本地清单(精确匹配):
data/compounds/buyables-stock.txt - 不在本地清单时,调用 PubChem PUG/PUG View:
- SMILES → CID;若 CID == 0 或未找到,判为
not_found - CID → Chemical Vendors;若存在并为真,判为
purchasable;否则no_vendors
- SMILES → CID;若 CID == 0 或未找到,判为
- 为减少对 PubChem 的压力,在网络查询间加入
--sleep延迟。
五、返回码(exit code)
- 0:至少有一条路径被选中(全可购或“最少不可购”)
- 3:没有路径被选中
- 2:输入错误或文件不存在等问题
六、常见用法小抄
- 检查 children-only(最常用):
python3 inference.py --paths-file my_paths.txt --children-only --output filtered.json
- 使用自定义库存清单:
python3 inference.py --paths-file my_paths.txt --children-only --stock-file path/to/stock.txt
- 生成+检查(含根节点):
python3 inference.py --target "<SMILES>" --model explorer --include-root --output filtered.json- 若不存在全可购路径,输出会自动切换到
min_inaccessible策略并保留不可购最少的路径集合。
七、局限与建议
- PubChem 作为可购性代理指标对常见试剂较准,但对盐型/互变异构体/异常表示可能返回
not_found或no_vendors。 - 本地清单为精确字符串匹配;若需 SMILES 规范化后匹配,可扩展脚本进行标准化。
- 批量大规模查询时适当增大
--sleep,避免过快触发限速。
相关脚本
inference.py:CLI 主脚本scripts/check_accessible.py:单个 SMILES 判定逻辑(可独立运行)
问题反馈或扩展(建议)
- 需要导出“不可购/未知”路径及不可购节点详细清单(CSV/JSON)?
- 需要只检查叶子节点(起始原料)/只检查 children/包含根节点的不同策略?目前已支持
--children-only与--include-root。