name: medchem description: “药物化学过滤器。应用药物相似性规则(Lipinski、Veber)、PAINS 过滤器、结构警报、复杂度指标,用于化合物优先化和库过滤。”
Medchem
概述
Medchem 是一个 Python 库,用于药物发现工作流程中的分子过滤和优先化。应用数百个已建立和新的分子过滤器、结构警报和药物化学规则,以高效地大规模筛选和优先化化合物库。规则和过滤器是上下文特定的—作为指南与领域专业知识结合使用。
何时使用此技能
此技能应在以下情况下使用:
- 应用药物相似性规则(Lipinski、Veber 等)到化合物库
- 通过结构警报或 PAINS 模式过滤分子
- 优先化化合物进行先导优化
- 评估化合物质量和药物化学性质
- 检测反应性或问题功能基团
- 计算分子复杂度指标
安装
通过 conda 或 pip 安装 medchem:
# 通过 conda
micromamba install -c conda-forge medchem
# 通过 pip
pip install medchem
核心功能
1. 药物化学规则
使用 medchem.rules 模块对分子应用已建立的药物相似性规则。
可用规则:
- 五规则(Lipinski)
- Oprea 规则
- CNS 规则
- 先导样规则(软性和严格)
- 三规则
- Reos 规则
- 药物规则
- Veber 规则
- 黄金三角形
- PAINS 过滤器
单规则应用:
import medchem as mc
# 对 SMILES 字符串应用五规则
smiles = "CC(=O)OC1=CC=CC=C1C(=O)O" # 阿司匹林
passes = mc.rules.basic_rules.rule_of_five(smiles)
# 返回:True
# 检查特定规则
passes_oprea = mc.rules.basic_rules.rule_of_oprea(smiles)
passes_cns = mc.rules.basic_rules.rule_of_cns(smiles)
多规则与 RuleFilters:
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, # 使用所有 CPU 核心
progress=True
)
结果格式: 结果以字典形式返回,包含每个规则的通过/失败状态和详细信息。
2. 结构警报过滤器
使用 medchem.structural 模块检测潜在问题结构模式。
可用过滤器:
- 常见警报 - 源自 ChEMBL 管理和文献的一般结构警报
- NIBR 过滤器 - Novartis 生物医学研究所过滤器集
- Lilly 扣分 - Eli Lilly 的扣分系统(275 条规则,扣分 >100 的分子被拒绝)
常见警报:
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 过滤器:
import medchem as mc
# 应用 NIBR 过滤器
nibr_filter = mc.structural.NIBRFilters()
results = nibr_filter(mols=mol_list, n_jobs=-1)
Lilly 扣分:
import medchem as mc
# 计算 Lilly 扣分
lilly = mc.structural.LillyDemeritsFilters()
results = lilly(mols=mol_list, n_jobs=-1)
# 每个结果包括扣分分数和是否通过(≤100 扣分)
3. 功能 API 用于高级操作
medchem.functional 模块提供常见工作流程的便捷函数。
快速过滤:
import medchem as mc
# 对列表应用 NIBR 过滤器
filter_ok = mc.functional.nibr_filter(
mols=mol_list,
n_jobs=-1
)
# 应用常见警报
alert_results = mc.functional.common_alerts_filter(
mols=mol_list,
n_jobs=-1
)
4. 化学基团检测
使用 medchem.groups 识别特定化学基团和功能基团。
可用基团:
- 铰链结合物
- 磷酸盐结合物
- 迈克尔受体
- 反应性基团
- 自定义 SMARTS 模式
使用:
import medchem as mc
# 创建基团检测器
group = mc.groups.ChemicalGroup(groups=["hinge_binders"])
# 检查匹配
has_matches = group.has_match(mol_list)
# 获取详细匹配信息
matches = group.get_matches(mol)
5. 命名目录
通过 medchem.catalogs 访问精选化学结构集合。
可用目录:
- 功能基团
- 保护基团
- 常见试剂
- 标准片段
使用:
import medchem as mc
# 访问命名目录
catalogs = mc.catalogs.NamedCatalogs
# 使用目录进行匹配
catalog = catalogs.get("functional_groups")
matches = catalog.get_matches(mol)
6. 分子复杂度
使用 medchem.complexity 计算近似合成可访问性的复杂度指标。
常见指标:
- Bertz 复杂度
- Whitlock 复杂度
- Barone 复杂度
使用:
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)
7. 约束过滤
使用 medchem.constraints 应用自定义基于属性的约束。
示例约束:
- 分子量范围
- LogP 边界
- TPSA 限制
- 可旋转键计数
使用:
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)
8. Medchem 查询语言
使用专门查询语言进行复杂过滤条件。
查询示例:
# 通过 Ro5 且没有常见警报的分子
"rule_of_five AND NOT common_alerts"
# CNS 样分子且低复杂度
"rule_of_cns AND complexity < 400"
# 先导样分子且无 Lilly 扣分
"rule_of_leadlike AND lilly_demerits == 0"
使用:
import medchem as mc
# 解析和应用查询
query = mc.query.parse("rule_of_five AND NOT common_alerts")
results = query.apply(mols=mol_list, n_jobs=-1)
工作流程模式
模式 1:化合物库的初始筛选
过滤大型化合物集合以识别药物样候选物。
import datamol as dm
import medchem as mc
import pandas as pd
# 加载化合物库
df = pd.read_csv("compounds.csv")
mols = [dm.to_mol(smi) for smi in df["smiles"]]
# 应用主要过滤器
rule_filter = mc.rules.RuleFilters(rule_list=["rule_of_five", "rule_of_veber"])
rule_results = rule_filter(mols=mols, n_jobs=-1, progress=True)
# 应用结构警报
alert_filter = mc.structural.CommonAlertsFilters()
alert_results = alert_filter(mols=mols, n_jobs=-1, progress=True)
# 合并结果
df["passes_rules"] = rule_results["pass"]
df["has_alerts"] = alert_results["has_alerts"]
df["drug_like"] = df["passes_rules"] & ~df["has_alerts"]
# 保存过滤后的化合物
filtered_df = df[df["drug_like"]]
filtered_df.to_csv("filtered_compounds.csv", index=False)
模式 2:先导优化过滤
在先导优化期间应用更严格的标准。
import medchem as mc
# 创建全面过滤器
filters = {
"rules": mc.rules.RuleFilters(rule_list=["rule_of_leadlike_strict"]),
"alerts": mc.structural.NIBRFilters(),
"lilly": mc.structural.LillyDemeritsFilters(),
"complexity": mc.complexity.ComplexityFilter(max_complexity=400)
}
# 应用所有过滤器
results = {}
for name, filt in filters.items():
results[name] = filt(mols=candidate_mols, n_jobs=-1)
# 识别通过所有过滤器的化合物
passes_all = all(r["pass"] for r in results.values())
模式 3:识别特定化学基团
查找包含特定功能基团或支架的分子。
import medchem as mc
# 为多个基团创建基团检测器
group_detector = mc.groups.ChemicalGroup(
groups=["hinge_binders", "phosphate_binders"]
)
# 筛选库
matches = group_detector.get_all_matches(mol_list)
# 过滤具有所需基团的分子
mol_with_groups = [mol for mol, match in zip(mol_list, matches) if match]
最佳实践
- 上下文重要:不要盲目应用过滤器。理解生物靶标和化学空间。
- 组合多个过滤器:使用规则、结构警报和领域知识一起做出更好决策。
- 使用并行化:对于大型数据集(>1000 分子),始终使用
n_jobs=-1进行并行处理。 - 迭代细化:从广泛过滤器(Ro5)开始,然后根据需要应用更具体标准(CNS、先导样)。
- 记录过滤决策:跟踪哪些分子被过滤掉及原因,以实现可重复性。
- 验证结果:记住市售药物常违反标准过滤器—使用这些作为指南,而非绝对规则。
- 考虑前药:设计为前药的分子可能故意违反标准药物化学规则。
资源
references/api_guide.md
涵盖所有 medchem 模块的全面 API 参考,包括详细函数签名、参数和返回类型。
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