mcpField
M
medchem

medchem

github.com/jackspace数据与数据库1635 次安装12 周前更新
代码仓库

关于 medchem

面向药物发现研究的 Python 分子筛选库,可按药物相似性规则、结构警示和自定义约束筛选化合物。还提供化学基团识别、分子复杂度评估及查询语言,供化合物库分流与优先级排序使用。

主要功能

  1. 01应用药物化学规则
  2. 02筛查结构警示
  3. 03检测化学基团
  4. 04计算分子复杂度
  5. 05组合约束与查询条件

适用场景

  1. 01初筛化合物库
  2. 02筛选先导优化候选物
  3. 03查找含特定官能团的分子
  4. 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 模块检测潜在的问题结构模式。

可用过滤器:

  1. 常见警示 - 源自 ChEMBL 整理数据和文献的一般结构警示
  2. NIBR 过滤器 - Novartis 生物医学研究所过滤器集
  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