AgentSkillsCN

scientific-compound-screening

化合物筛选技能。利用ZINC数据库进行可购化合物检索,基于SMILES或化合物名称开展相似性搜索,实施目录筛选与虚拟筛选前处理流程。

SKILL.md
--- frontmatter
name: scientific-compound-screening
description: |
  化合物スクリーニングスキル。ZINC データベースを活用した購入可能化合物検索、
  SMILES/名前ベースの類似性検索、カタログフィルタリング、
  バーチャルスクリーニング前処理パイプライン。

Scientific Compound Screening

ZINC データベースを活用した化合物ライブラリ検索・ バーチャルスクリーニング前処理パイプラインを提供する。

When to Use

  • 購入可能な化合物ライブラリを検索するとき
  • SMILES 構造式から類似化合物を探すとき
  • 化合物名からデータベースレコードを取得するとき
  • ベンダーカタログの絞り込みを行うとき
  • バーチャルスクリーニング用の化合物セットを準備するとき

Quick Start

1. ZINC 化合物名検索

python
import requests
import pandas as pd

ZINC_API = "https://zinc15.docking.org"


def zinc_search_by_name(name, max_results=20):
    """
    ZINC データベースで化合物名による検索。

    Parameters:
        name: str — compound name (e.g., "aspirin")
        max_results: int — maximum results

    ToolUniverse:
        ZINC_search_by_name(name=name)
    """
    url = f"{ZINC_API}/substances/search"
    params = {"q": name, "count": max_results}
    resp = requests.get(url, params=params)
    resp.raise_for_status()
    data = resp.json()

    results = []
    for item in data:
        results.append({
            "zinc_id": item.get("zinc_id", ""),
            "name": item.get("name", ""),
            "smiles": item.get("smiles", ""),
            "mwt": item.get("mwt", ""),
            "logp": item.get("logp", ""),
            "purchasable": item.get("purchasability", ""),
        })

    df = pd.DataFrame(results)
    print(f"ZINC search '{name}': {len(df)} compounds")
    return df

2. ZINC SMILES 類似性検索

python
def zinc_search_by_smiles(smiles, similarity=0.7, max_results=20):
    """
    ZINC で SMILES 構造式による類似性検索。

    Parameters:
        smiles: str — SMILES string
        similarity: float — Tanimoto similarity threshold (0-1)

    ToolUniverse:
        ZINC_search_by_smiles(smiles=smiles)
    """
    url = f"{ZINC_API}/substances/search"
    params = {
        "smiles": smiles,
        "similarity": similarity,
        "count": max_results,
    }
    resp = requests.get(url, params=params)
    resp.raise_for_status()
    data = resp.json()

    results = []
    for item in data:
        results.append({
            "zinc_id": item.get("zinc_id", ""),
            "smiles": item.get("smiles", ""),
            "similarity": item.get("similarity", ""),
            "mwt": item.get("mwt", ""),
            "logp": item.get("logp", ""),
            "purchasable": item.get("purchasability", ""),
        })

    df = pd.DataFrame(results)
    print(f"ZINC SMILES search: {len(df)} similar compounds "
          f"(threshold={similarity})")
    return df

3. ZINC 化合物詳細取得

python
def zinc_get_substance(zinc_id):
    """
    ZINC ID から化合物の完全情報を取得。

    Parameters:
        zinc_id: str — ZINC ID (e.g., "ZINC000000000001")

    ToolUniverse:
        ZINC_get_substance(zinc_id=zinc_id)
    """
    url = f"{ZINC_API}/substances/{zinc_id}.json"
    resp = requests.get(url)
    resp.raise_for_status()
    data = resp.json()

    info = {
        "zinc_id": data.get("zinc_id", ""),
        "name": data.get("name", ""),
        "smiles": data.get("smiles", ""),
        "inchikey": data.get("inchikey", ""),
        "mwt": data.get("mwt", ""),
        "logp": data.get("logp", ""),
        "num_rotatable_bonds": data.get("num_rotatable_bonds", ""),
        "num_hba": data.get("num_hba", ""),
        "num_hbd": data.get("num_hbd", ""),
        "tpsa": data.get("tpsa", ""),
        "purchasable": data.get("purchasability", ""),
    }

    print(f"ZINC {zinc_id}: {info['name']} (MW={info['mwt']})")
    return info, data

4. ZINC カタログ一覧

python
def zinc_get_catalogs():
    """
    ZINC の利用可能カタログ (ベンダー) 一覧を取得。

    ToolUniverse:
        ZINC_get_catalogs()
    """
    url = f"{ZINC_API}/catalogs.json"
    resp = requests.get(url)
    resp.raise_for_status()
    data = resp.json()

    results = []
    for cat in data:
        results.append({
            "catalog_name": cat.get("name", ""),
            "short_name": cat.get("short_name", ""),
            "num_substances": cat.get("num_substances", 0),
            "url": cat.get("url", ""),
        })

    df = pd.DataFrame(results)
    print(f"ZINC catalogs: {len(df)} vendors")
    return df

5. バーチャルスクリーニング前処理パイプライン

python
def virtual_screening_prep(query_smiles, lipinski=True, max_compounds=100):
    """
    バーチャルスクリーニング用の化合物セット準備。
    Lipinski's Rule of Five フィルタリング含む。

    ToolUniverse (横断):
        ZINC_search_by_smiles(smiles=query_smiles) → ZINC_get_substance(zinc_id)
    """
    # Step 1: Similar compound search
    df = zinc_search_by_smiles(query_smiles, similarity=0.6,
                               max_results=max_compounds)

    if df.empty:
        print("No similar compounds found")
        return df

    # Step 2: Lipinski filter
    if lipinski:
        df["mwt"] = pd.to_numeric(df["mwt"], errors="coerce")
        df["logp"] = pd.to_numeric(df["logp"], errors="coerce")
        before = len(df)
        df = df[
            (df["mwt"] <= 500)
            & (df["logp"] <= 5)
        ]
        print(f"Lipinski filter: {before} → {len(df)} compounds")

    # Step 3: Sort by similarity
    df["similarity"] = pd.to_numeric(df["similarity"], errors="coerce")
    df = df.sort_values("similarity", ascending=False)

    print(f"VS prep: {len(df)} compounds ready for screening")
    return df

References

Output Files

ファイル形式
results/zinc_search.csvCSV
results/zinc_similar.csvCSV
results/zinc_substance.jsonJSON
results/zinc_catalogs.csvCSV
results/vs_library.csvCSV

利用可能ツール

カテゴリ主要ツール用途
ZINCZINC_search_by_name化合物名検索
ZINCZINC_search_by_smilesSMILES 類似性検索
ZINCZINC_get_substance化合物詳細
ZINCZINC_get_catalogsカタログ一覧

参照スキル

スキル関連
scientific-compound-similarity化合物類似性
scientific-pharmacology-targets薬理学ターゲット
scientific-molecular-docking分子ドッキング
scientific-drug-target-interactionDTI 解析
scientific-admet-toxicityADMET 毒性

依存パッケージ

requests, pandas