medchem について
medchemは、創薬で分子をフィルタリングし優先順位付けするPythonライブラリです。医薬品化学の研究者向けに、各種ルールや構造アラート、複雑度指標を備えています。
主な機能
- 01ドラッグライクネス規則とフィルター
- 02構造アラートのスクリーニング
- 03化学基の検出
- 04分子複雑度指標
- 05物性制約とクエリ言語
活用シーン
- 01ドラッグライクネスによる化合物ライブラリの一次選別
- 02反応性または問題のある構造の特定
- 03リード最適化候補の優先順位付け
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ ovachiever/ droid-tings --skill medchemインストール後、Claude Code で/medchemを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/api_guide.mdrules_catalog.mdscripts/filter_molecules.py詳細
Medchem
概要
Medchem は、創薬ワークフローにおける分子のフィルタリングと優先順位付けのための Python ライブラリです。確立された新規の分子フィルター、構造アラート、医薬化学ルールを数百種類適用し、化合物ライブラリを大規模に効率よくトリアージおよび優先順位付けできます。ルールとフィルターは文脈に依存するため、ガイドラインとして使用し、ドメインの専門知識と組み合わせてください。
このスキルを使用するタイミング
このスキルは次の場合に使用してください:
- 化合物ライブラリにドラッグライクネスのルール(Lipinski、Veber など)を適用する場合
- 構造アラートや PAINS パターンで分子をフィルタリングする場合
- リード最適化のために化合物を優先順位付けする場合
- 化合物の品質と医薬化学的特性を評価する場合
- 反応性または問題のある官能基を検出する場合
- 分子複雑度の指標を計算する場合
インストール
uv pip install medchem
主要機能
1. 医薬化学ルール
medchem.rules モジュールを使用して、確立されたドラッグライクネスのルールを分子に適用します。
利用可能なルール:
- Rule of Five (Lipinski)
- Rule of Oprea
- Rule of CNS
- Rule of leadlike (soft and strict)
- Rule of three
- Rule of Reos
- Rule of drug
- Rule of Veber
- Golden triangle
- PAINS filters
単一ルールの適用:
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 モジュールを使用して、問題となる可能性のある構造パターンを検出します。
利用可能なフィルター:
- Common Alerts - ChEMBL のキュレーションと文献に基づく一般的な構造アラート
- NIBR Filters - Novartis Institutes for BioMedical Research のフィルターセット
- Lilly Demerits - Eli Lilly のデメリットポイント方式のシステム(275 ルール、デメリットポイントが 100 を超えた分子は除外)
Common Alerts:
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 Filters:
import medchem as mc
# Apply NIBR filters
nibr_filter = mc.structural.NIBRFilters()
results = nibr_filter(mols=mol_list, n_jobs=-1)
Lilly Demerits:
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 を使用して、特定の化学基や官能基を特定します。
利用可能な基:
- Hinge binders
- Phosphate binders
- Michael acceptors
- Reactive groups
- Custom SMARTS patterns
使用方法:
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 を通じて、厳選された化学構造のコレクションにアクセスします。
利用可能なカタログ:
- Functional groups
- Protecting groups
- Common reagents
- Standard fragments
使用方法:
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 complexity
- Whitlock complexity
- Barone complexity
使用方法:
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、リードライク)を適用してください。
-
フィルタリングの判断を文書化する: 再現性のために、どの分子をどの理由で除外したかを記録してください。
-
結果を検証する: 市販薬は標準的なフィルターに不合格となることが多いことに留意し、これらは絶対的なルールではなくガイドラインとして使用してください。
-
プロドラッグを考慮する: プロドラッグとして設計された分子は、意図的に標準的な医薬化学のルールから外れている場合があります。
リソース
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