用途
Medchem 是一个用于药物发现工作流中分子过滤与优先级排序的 Python 库。它提供数百种成熟的分子过滤器、结构警报和药物化学规则,可对化合物库进行高效的大规模筛选与优先级排序。规则和过滤器具有上下文特异性,应作为指南并结合领域专业知识使用。
主要能力
1. 药物化学规则
通过 medchem.rules 模块应用成熟的类药性规则,可用规则包括:
- 五规则(Lipinski)
- Oprea 规则
- CNS 规则
- 类先导化合物规则(soft 和 strict)
- 三规则
- Reos 规则
- 药物规则
- Veber 规则
- 黄金三角
- PAINS 过滤器
可应用单条规则,也可通过 RuleFilters 组合多条规则并并行处理。结果以字典形式返回,包含每条规则的通过/失败状态及详细信息。
2. 结构警报过滤器
通过 medchem.structural 模块检测潜在有问题的结构模式,可用过滤器包括:
- Common Alerts:源自 ChEMBL 策展和文献的通用结构警报
- NIBR Filters:诺华生物医学研究所过滤器集
- Lilly Demerits:礼来基于扣分的系统(275 条规则,超过 100 分则拒绝)
支持单分子检查和批量并行过滤。
3. 函数式 API
medchem.functional 模块为常见工作流提供便捷函数,如 nibr_filter、common_alerts_filter 等。
4. 化学基团检测
通过 medchem.groups 识别特定化学基团和官能团,可用基团包括:铰链结合基团、磷酸结合基团、Michael 受体、反应性基团、自定义 SMARTS 模式。
5. 命名目录
通过 medchem.catalogs 访问策展的化学结构集合,包括官能团、保护基、常用试剂、标准片段。
6. 分子复杂度
通过 medchem.complexity 计算近似合成可及性的复杂度指标,包括 Bertz 复杂度、Whitlock 复杂度、Barone 复杂度。可按复杂度阈值过滤。
7. 约束过滤
通过 medchem.constraints 应用自定义属性约束,例如分子量范围、LogP 边界、TPSA 限制、可旋转键数量。
8. Medchem 查询语言
使用专用查询语言表达复杂过滤条件,例如:
- "rule_of_five AND NOT common_alerts"
- "rule_of_cns AND complexity < 400"
- "rule_of_leadlike AND lilly_demerits == 0"
使用方式
安装
uv pip install medchem
单条规则应用
import medchem as mc
smiles = "CC(=O)OC1=CC=CC=C1C(=O)O" # Aspirin
passes = mc.rules.basic_rules.rule_of_five(smiles)
passes_oprea = mc.rules.basic_rules.rule_of_oprea(smiles)
passes_cns = mc.rules.basic_rules.rule_of_cns(smiles)
多规则组合
import datamol as dm
import medchem as mc
mols = [dm.to_mol(smiles) for smiles in smiles_list]
rfilter = mc.rules.RuleFilters(
rule_list=[
"rule_of_five",
"rule_of_oprea",
"rule_of_cns",
"rule_of_leadlike_soft"
]
)
results = rfilter(
mols=mols,
n_jobs=-1,
progress=True
)
结构警报
import medchem as mc
alert_filter = mc.structural.CommonAlertsFilters()
mol = dm.to_mol("c1ccccc1")
has_alerts, details = alert_filter.check_mol(mol)
results = alert_filter(
mols=mol_list,
n_jobs=-1,
progress=True
)
NIBR 过滤器与 Lilly Demerits
import medchem as mc
nibr_filter = mc.structural.NIBRFilters()
results = nibr_filter(mols=mol_list, n_jobs=-1)
lilly = mc.structural.LillyDemeritsFilters()
results = lilly(mols=mol_list, n_jobs=-1)
化学基团检测
import medchem as mc
group = mc.groups.ChemicalGroup(groups=["hinge_binders"])
has_matches = group.has_match(mol_list)
matches = group.get_matches(mol)
命名目录
import medchem as mc
catalogs = mc.catalogs.NamedCatalogs
catalog = catalogs.get("functional_groups")
matches = catalog.get_matches(mol)
分子复杂度
import medchem as mc
complexity_score = mc.complexity.calculate_complexity(mol)
complex_filter = mc.complexity.ComplexityFilter(max_complexity=500)
results = complex_filter(mols=mol_list)
约束过滤
import medchem as mc
constraints = mc.constraints.Constraints(
mw_range=(200, 500),
logp_range=(-2, 5),
tpsa_max=140,
rotatable_bonds_max=10
)
results = constraints(mols=mol_list, n_jobs=-1)
查询语言
import medchem as mc
query = mc.query.parse("rule_of_five AND NOT common_alerts")
results = query.apply(mols=mol_list, n_jobs=-1)
适用场景
场景一:化合物库初筛
过滤大型化合物集合以识别类药候选物。加载化合物库后,应用主要规则(如 rule_of_five、rule_of_veber)和结构警报,合并结果并保存过滤后的化合物。
场景二:先导化合物优化过滤
在先导化合物优化阶段应用更严格的标准,组合规则、警报、Lilly Demerits 和复杂度过滤器,识别通过所有过滤器的化合物。
场景三:识别特定化学基团
查找含有特定官能团或骨架的分子,例如使用 ChemicalGroup 检测铰链结合基团和磷酸结合基团,筛选含有目标基团的分子。
最佳实践
- 上下文很重要:不要盲目应用过滤器,需理解生物靶点和化学空间。
- 组合多种过滤器:结合规则、结构警报和领域知识以做出更好决策。
- 使用并行化:对于大型数据集(超过 1000 个分子),始终使用 n_jobs=-1 进行并行处理。
- 迭代优化:从宽泛过滤器(Ro5)开始,然后根据需要应用更具体的标准(CNS、类先导化合物)。
- 记录过滤决策:跟踪哪些分子被过滤掉及原因,以保证可复现性。
- 验证结果:已上市药物常常无法通过标准过滤器——将这些作为指南而非绝对规则。
- 考虑前药:设计为前药的分子可能有意违反标准药物化学规则。
资源
- references/api_guide.md:全面的 API 参考,涵盖所有 medchem 模块的详细函数签名、参数和返回类型。
- references/rules_catalog.md:可用规则、过滤器和警报的完整目录,包含描述、阈值和文献引用。
- scripts/filter_molecules.py:生产就绪的批量过滤脚本,支持多种输入格式(CSV、SDF、SMILES)、可配置的过滤器组合和详细报告。用法:
python scripts/filter_molecules.py input.csv --rules rule_of_five,rule_of_cns --alerts nibr --output filtered.csv
文档
- 官方文档:https://medchem-docs.datamol.io/
- GitHub 仓库:https://github.com/datamol-io/medchem
限制
资料中未提供关于收费、价格、平台支持范围、性能基准或具体效果保证的信息。规则和过滤器具有上下文特异性,应作为指南并结合领域专业知识使用,不应视为绝对规则。