关于 medchem
面向药物发现研究的 Python 分子筛选库,可按药物相似性规则、结构警示和自定义约束筛选化合物。还提供化学基团识别、分子复杂度评估及查询语言,供化合物库分流与优先级排序使用。
主要功能
- 01应用药物化学规则
- 02筛查结构警示
- 03检测化学基团
- 04计算分子复杂度
- 05组合约束与查询条件
适用场景
- 01初筛化合物库
- 02筛选先导优化候选物
- 03查找含特定官能团的分子
- 04按复杂度和属性约束筛选
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ jackspace/ claudeskillz --skill medchem安装后在 Claude Code 中输入/medchem确认已加载。
附带文件SKILL.json
详细介绍
Medchem
概述
Medchem 是一个用于药物发现工作流中分子筛选和优先级排序的 Python 库。它提供数百种成熟和新颖的分子过滤器、结构警示及药物化学规则,可高效地对化合物库进行分类并大规模确定优先级。规则和过滤器因具体情境而异,应结合领域专业知识作为指导。
何时使用此技能
在以下情况下应使用此技能:
- 对化合物库应用类药性规则(Lipinski、Veber 等)
- 根据结构警示或 PAINS 模式筛选分子
- 为先导优化确定化合物的优先级
- 评估化合物质量和药物化学性质
- 检测具有反应性或存在问题的官能团
- 计算分子复杂度指标
安装
通过 conda 或 pip 安装 medchem:
# Via conda
micromamba install -c conda-forge medchem
# Via pip
pip install medchem
核心能力
1. 药物化学规则
使用 medchem.rules 模块对分子应用成熟的类药性规则。
可用规则:
- 五规则(Lipinski)
- Oprea 规则
- CNS 规则
- 先导样规则(宽松和严格)
- 三规则
- Reos 规则
- 药物规则
- Veber 规则
- 黄金三角
- PAINS 过滤器
应用单条规则:
import medchem as mc
# Apply Rule of Five to a SMILES string
smiles = "CC(=O)OC1=CC=CC=C1C(=O)O" # Aspirin
passes = mc.rules.basic_rules.rule_of_five(smiles)
# Returns: True
# Check specific rules
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
# Load molecules
mols = [dm.to_mol(smiles) for smiles in smiles_list]
# Create filter with multiple rules
rfilter = mc.rules.RuleFilters(
rule_list=[
"rule_of_five",
"rule_of_oprea",
"rule_of_cns",
"rule_of_leadlike_soft"
]
)
# Apply filters with parallelization
results = rfilter(
mols=mols,
n_jobs=-1, # Use all CPU cores
progress=True
)
结果格式: 结果以字典形式返回,其中包含通过/未通过状态以及每条规则的详细信息。
2. 结构警示过滤器
使用 medchem.structural 模块检测潜在的问题结构模式。
可用过滤器:
- 常见警示 - 源自 ChEMBL 整理数据和文献的一般结构警示
- NIBR 过滤器 - Novartis 生物医学研究所过滤器集
- Lilly 扣分项 - Eli Lilly 基于扣分的系统(275 条规则,分值超过 100 时拒绝分子)
常见警示:
import medchem as mc
# Create filter
alert_filter = mc.structural.CommonAlertsFilters()
# Check single molecule
mol = dm.to_mol("c1ccccc1")
has_alerts, details = alert_filter.check_mol(mol)
# Batch filtering with parallelization
results = alert_filter(
mols=mol_list,
n_jobs=-1,
progress=True
)
NIBR 过滤器:
import medchem as mc
# Apply NIBR filters
nibr_filter = mc.structural.NIBRFilters()
results = nibr_filter(mols=mol_list, n_jobs=-1)
Lilly 扣分项:
import medchem as mc
# Calculate Lilly demerits
lilly = mc.structural.LillyDemeritsFilters()
results = lilly(mols=mol_list, n_jobs=-1)
# Each result includes demerit score and whether it passes (≤100 demerits)
3. 用于高级操作的函数式 API
medchem.functional 模块为常见工作流提供便捷函数。
快速筛选:
import medchem as mc
# Apply NIBR filters to a list
filter_ok = mc.functional.nibr_filter(
mols=mol_list,
n_jobs=-1
)
# Apply common alerts
alert_results = mc.functional.common_alerts_filter(
mols=mol_list,
n_jobs=-1
)
4. 化学基团检测
使用 medchem.groups 识别特定化学基团和官能团。
可用基团:
- 铰链结合基团
- 磷酸基结合基团
- Michael 受体
- 反应性基团
- 自定义 SMARTS 模式
用法:
import medchem as mc
# Create group detector
group = mc.groups.ChemicalGroup(groups=["hinge_binders"])
# Check for matches
has_matches = group.has_match(mol_list)
# Get detailed match information
matches = group.get_matches(mol)
5. 命名目录
通过 medchem.catalogs 访问经过整理的化学结构集合。
可用目录:
- 官能团
- 保护基
- 常用试剂
- 标准片段
用法:
import medchem as mc
# Access named catalogs
catalogs = mc.catalogs.NamedCatalogs
# Use catalog for matching
catalog = catalogs.get("functional_groups")
matches = catalog.get_matches(mol)
6. 分子复杂度
使用 medchem.complexity 计算可近似表示合成可及性的复杂度指标。
常见指标:
- Bertz 复杂度
- Whitlock 复杂度
- Barone 复杂度
用法:
import medchem as mc
# Calculate complexity
complexity_score = mc.complexity.calculate_complexity(mol)
# Filter by complexity threshold
complex_filter = mc.complexity.ComplexityFilter(max_complexity=500)
results = complex_filter(mols=mol_list)
7. 约束筛选
使用 medchem.constraints 应用基于自定义属性的约束。
约束示例:
- 分子量范围
- LogP 界限
- TPSA 限制
- 可旋转键数量
用法:
import medchem as mc
# Define constraints
constraints = mc.constraints.Constraints(
mw_range=(200, 500),
logp_range=(-2, 5),
tpsa_max=140,
rotatable_bonds_max=10
)
# Apply constraints
results = constraints(mols=mol_list, n_jobs=-1)
8. Medchem 查询语言
使用专用查询语言设置复杂的筛选条件。
查询示例:
# Molecules passing Ro5 AND not having common alerts
"rule_of_five AND NOT common_alerts"
# CNS-like molecules with low complexity
"rule_of_cns AND complexity < 400"
# Leadlike molecules without Lilly demerits
"rule_of_leadlike AND lilly_demerits == 0"
用法:
import medchem as mc
# Parse and apply query
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
# Load compound library
df = pd.read_csv("compounds.csv")
mols = [dm.to_mol(smi) for smi in df["smiles"]]
# Apply primary filters
rule_filter = mc.rules.RuleFilters(rule_list=["rule_of_five", "rule_of_veber"])
rule_results = rule_filter(mols=mols, n_jobs=-1, progress=True)
# Apply structural alerts
alert_filter = mc.structural.CommonAlertsFilters()
alert_results = alert_filter(mols=mols, n_jobs=-1, progress=True)
# Combine results
df["passes_rules"] = rule_results["pass"]
df["has_alerts"] = alert_results["has_alerts"]
df["drug_like"] = df["passes_rules"] & ~df["has_alerts"]
# Save filtered compounds
filtered_df = df[df["drug_like"]]
filtered_df.to_csv("filtered_compounds.csv", index=False)
模式 2:先导优化筛选
在先导优化期间应用更严格的标准。
import medchem as mc
# Create comprehensive filter
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)
}
# Apply all filters
results = {}
for name, filt in filters.items():
results[name] = filt(mols=candidate_mols, n_jobs=-1)
# Identify compounds passing all filters
passes_all = all(r["pass"] for r in results.values())
模式 3:识别特定化学基团
查找含有特定官能团或骨架的分子。
import medchem as mc
# Create group detector for multiple groups
group_detector = mc.groups.ChemicalGroup(
groups=["hinge_binders", "phosphate_binders"]
)
# Screen library
matches = group_detector.get_all_matches(mol_list)
# Filter molecules with desired groups
mol_with_groups = [mol for mol, match in zip(mol_list, matches) if match]
最佳实践
-
上下文很重要:不要盲目应用筛选条件。了解生物学靶点和化学空间。
-
组合多种筛选条件:将规则、结构警示和领域知识结合起来,以便做出更好的决策。
-
使用并行处理:对于大型数据集(>1000 个分子),始终使用
n_jobs=-1进行并行处理。 -
迭代优化:从宽泛的筛选条件(Ro5)开始,然后根据需要应用更具体的标准(CNS、leadlike)。
-
记录筛选决策:跟踪哪些分子被筛除及原因,以确保结果可复现。
-
验证结果:请记住,市售药物往往无法通过标准筛选条件——应将这些条件视为指导原则,而非绝对规则。
-
考虑前药:作为前药设计的分子可能会有意违反标准药物化学规则。
资源
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