mcpField
M
medchem

medchem

github.com/davila7数据与数据库33.0k241 次安装今天更新
代码仓库

关于 medchem

medchem 是用于药物发现中分子筛选和优先级排序的 Python 库。它整合药物化学规则、结构警示、复杂度指标、属性约束和查询筛选,可用于化合物库初筛与先导优化。

主要功能

  1. 01应用类药性和药物化学规则
  2. 02筛查结构警示与扣分项
  3. 03检测化学基团和目录结构
  4. 04计算分子复杂度指标
  5. 05按自定义属性约束筛选
  6. 06使用查询语言组合条件

适用场景

  1. 01初筛化合物库中的类药候选物
  2. 02先导优化阶段的分子排序
  3. 03查找反应性基团或指定骨架
  4. 04组合规则与警示进行筛选

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/davila7/claude-code-templates --skill medchem

安装后在 Claude Code 中输入/medchem确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
api_guide.md
rules_catalog.md
scripts/
filter_molecules.py

详细介绍

Medchem

概述

Medchem 是一个用于药物发现工作流中分子筛选和优先级排序的 Python 库。它提供数百种成熟且新颖的分子过滤器、结构警示和药物化学规则,可高效地对化合物库进行大规模初筛和优先级排序。规则和过滤器因具体情境而异,应结合领域专业知识,将其用作指导。

何时使用此技能

在以下情况下应使用此技能:

  • 对化合物库应用类药性规则(Lipinski、Veber 等)
  • 根据结构警示或 PAINS 模式筛选分子
  • 为先导优化确定化合物优先级
  • 评估化合物质量和药物化学性质
  • 检测反应性或有问题的官能团
  • 计算分子复杂度指标

安装

uv 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 模块检测可能有问题的结构模式。

可用过滤器:

  1. 常见警示 - 根据 ChEMBL 整理结果和文献得出的通用结构警示
  2. NIBR 过滤器 - 诺华生物医学研究所的过滤器集
  3. 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]

最佳实践

  1. 上下文很重要:不要盲目应用筛选条件。了解生物学靶点和化学空间。

  2. 组合多种筛选条件:将规则、结构警示和领域知识结合起来,以便做出更好的决策。

  3. 使用并行处理:对于大型数据集(>1000 个分子),始终使用 n_jobs=-1 进行并行处理。

  4. 迭代优化:从宽泛的筛选条件(Ro5)开始,然后根据需要应用更具体的标准(CNS、leadlike)。

  5. 记录筛选决策:跟踪哪些分子被筛除及原因,以确保结果可复现。

  6. 验证结果:请记住,市售药物往往无法通过标准筛选条件——应将这些条件视为指导原则,而非绝对规则。

  7. 考虑前药:作为前药设计的分子可能会有意违反标准药物化学规则。

资源

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

评论

支持 Markdown