mcpField
M
medchem

medchem

github.com/ovachiever数据与数据库5647 次安装48 周前更新
代码仓库

关于 medchem

medchem 是用于药物发现分子筛选与排序的 Python 库,面向药物化学研究者。它整合多类规则、结构警示、基团检测和复杂度指标,用于化合物库分析。

主要功能

  1. 01成药性规则与筛选
  2. 02结构警示筛查
  3. 03化学基团检测
  4. 04分子复杂度指标
  5. 05属性约束与查询语言

适用场景

  1. 01按成药性初筛化合物库
  2. 02标记反应性或问题结构
  3. 03为先导优化筛选候选物

安装

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

$npx skills add https://github.com/ovachiever/droid-tings --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