mcpField
P
pubchem-database

pubchem-database

github.com/jackspaceデータ・データベース1636 回インストール12 週間前に更新
リポジトリ

pubchem-database について

pubchem-database は、化学や創薬研究向けの PubChem 検索スキルです。名称、構造、ID から化合物を検索して性質や生物活性を取得でき、類似・部分構造検索、ID 変換、一括分析にも対応します。

主な機能

  1. 01名称、CID、SMILES などで化合物を検索
  2. 02分子特性と注釈の取得
  3. 03類似・部分構造検索
  4. 04生物活性とアッセイ情報の検索
  5. 05化学構造 ID の変換
  6. 06一括検索と構造画像のダウンロード

活用シーン

  1. 01特定の構造モチーフを持つ化合物のスクリーニング
  2. 02候補化合物の分子特性を比較
  3. 03既知薬に類似する化合物を検索
  4. 04生物学的ターゲット別にアッセイ活性を調査

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/jackspace/claudeskillz --skill pubchem-database

インストール後、Claude Code で/pubchem-databaseを入力して読み込まれたか確認します。

同梱ファイルSKILL.json

詳細

PubChem データベース

概要

PubChem は、1.1億以上の化合物と2.7億以上の生物活性データを収録する、世界最大の無償利用可能な化学データベースです。化学構造を名称、CID、または SMILES で検索し、分子特性を取得し、類似性検索や部分構造検索を実行し、PUG-REST API と PubChemPy を使用して生物活性データにアクセスできます。

このスキルを使用するタイミング

このスキルは、次のような場合に使用します。

  • 名称、構造(SMILES/InChI)、または分子式で化合物を検索する場合
  • 分子特性(分子量、LogP、TPSA、水素結合に関する記述子)を取得する場合
  • 構造的に関連する化合物を見つけるために類似性検索を実行する場合
  • 特定の化学モチーフを対象に部分構造検索を実行する場合
  • スクリーニングアッセイからの生物活性データにアクセスする場合
  • 化学識別子の形式(CID、SMILES、InChI)を相互に変換する場合
  • 医薬品様性のスクリーニングや特性分析のために複数の化合物をバッチ処理する場合

主な機能

1. 化学構造検索

複数の識別子の種類を使用して化合物を検索します。

化学名による検索:

import pubchempy as pcp
compounds = pcp.get_compounds('aspirin', 'name')
compound = compounds[0]

CID(化合物 ID)による検索:

compound = pcp.Compound.from_cid(2244)  # Aspirin

SMILES による検索:

compound = pcp.get_compounds('CC(=O)OC1=CC=CC=C1C(=O)O', 'smiles')[0]

InChI による検索:

compound = pcp.get_compounds('InChI=1S/C9H8O4/...', 'inchi')[0]

分子式による検索:

compounds = pcp.get_compounds('C9H8O4', 'formula')
# Returns all compounds matching this formula
2. 特性の取得

高レベルまたは低レベルのいずれかのアプローチを使用して、化合物の分子特性を取得します。

PubChemPy の使用(推奨):

import pubchempy as pcp

# Get compound object with all properties
compound = pcp.get_compounds('caffeine', 'name')[0]

# Access individual properties
molecular_formula = compound.molecular_formula
molecular_weight = compound.molecular_weight
iupac_name = compound.iupac_name
smiles = compound.canonical_smiles
inchi = compound.inchi
xlogp = compound.xlogp  # Partition coefficient
tpsa = compound.tpsa    # Topological polar surface area

特定の特性の取得:

# Request only specific properties
properties = pcp.get_properties(
    ['MolecularFormula', 'MolecularWeight', 'CanonicalSMILES', 'XLogP'],
    'aspirin',
    'name'
)
# Returns list of dictionaries

特性のバッチ取得:

import pandas as pd

compound_names = ['aspirin', 'ibuprofen', 'paracetamol']
all_properties = []

for name in compound_names:
    props = pcp.get_properties(
        ['MolecularFormula', 'MolecularWeight', 'XLogP'],
        name,
        'name'
    )
    all_properties.extend(props)

df = pd.DataFrame(all_properties)

利用可能な特性: MolecularFormula、MolecularWeight、CanonicalSMILES、IsomericSMILES、InChI、InChIKey、IUPACName、XLogP、TPSA、HBondDonorCount、HBondAcceptorCount、RotatableBondCount、Complexity、Charge など多数(完全な一覧は references/api_reference.md を参照してください)。

3. 類似性検索

Tanimoto 類似度を使用して、構造的に類似した化合物を見つけます。

import pubchempy as pcp

# Start with a query compound
query_compound = pcp.get_compounds('gefitinib', 'name')[0]
query_smiles = query_compound.canonical_smiles

# Perform similarity search
similar_compounds = pcp.get_compounds(
    query_smiles,
    'smiles',
    searchtype='similarity',
    Threshold=85,  # Similarity threshold (0-100)
    MaxRecords=50
)

# Process results
for compound in similar_compounds[:10]:
    print(f"CID {compound.cid}: {compound.iupac_name}")
    print(f"  MW: {compound.molecular_weight}")

注: 大規模なクエリの類似性検索は非同期で実行され、完了までに 15〜30 秒かかる場合があります。PubChemPy は非同期処理のパターンを自動的に処理します。

4. 部分構造検索

特定の構造モチーフを含む化合物を見つけます。

import pubchempy as pcp

# Search for compounds containing pyridine ring
pyridine_smiles = 'c1ccncc1'

matches = pcp.get_compounds(
    pyridine_smiles,
    'smiles',
    searchtype='substructure',
    MaxRecords=100
)

print(f"Found {len(matches)} compounds containing pyridine")

一般的な部分構造:

  • ベンゼン環: c1ccccc1
  • ピリジン: c1ccncc1
  • フェノール: c1ccc(O)cc1
  • カルボン酸: C(=O)O
5. 形式変換

異なる化学構造形式の間で変換します。

import pubchempy as pcp

compound = pcp.get_compounds('aspirin', 'name')[0]

# Convert to different formats
smiles = compound.canonical_smiles
inchi = compound.inchi
inchikey = compound.inchikey
cid = compound.cid

# Download structure files
pcp.download('SDF', 'aspirin', 'name', 'aspirin.sdf', overwrite=True)
pcp.download('JSON', '2244', 'cid', 'aspirin.json', overwrite=True)
6. 構造の可視化

2D 構造画像を生成します。

import pubchempy as pcp

# Download compound structure as PNG
pcp.download('PNG', 'caffeine', 'name', 'caffeine.png', overwrite=True)

# Using direct URL (via requests)
import requests

cid = 2244  # Aspirin
url = f"https://pubchem.ncbi.nlm.nih.gov/rest/pug/compound/cid/{cid}/PNG?image_size=large"
response = requests.get(url)

with open('structure.png', 'wb') as f:
    f.write(response.content)
7. 同義語の取得

化合物に関する既知の名称と同義語をすべて取得します。

import pubchempy as pcp

synonyms_data = pcp.get_synonyms('aspirin', 'name')

if synonyms_data:
    cid = synonyms_data[0]['CID']
    synonyms = synonyms_data[0]['Synonym']

    print(f"CID {cid} has {len(synonyms)} synonyms:")
    for syn in synonyms[:10]:  # First 10
        print(f"  - {syn}")
8. 生物活性データへのアクセス

アッセイから生物活性データを取得します。

import requests
import json

# Get bioassay summary for a compound
cid = 2244  # Aspirin
url = f"https://pubchem.ncbi.nlm.nih.gov/rest/pug/compound/cid/{cid}/assaysummary/JSON"

response = requests.get(url)
if response.status_code == 200:
    data = response.json()
    # Process bioassay information
    table = data.get('Table', {})
    rows = table.get('Row', [])
    print(f"Found {len(rows)} bioassay records")

より複雑な生物活性のクエリには、scripts/bioactivity_query.py ヘルパースクリプトを使用してください。このスクリプトは次の機能を提供します。

  • 活性結果によるフィルタリングを伴うバイオアッセイの概要
  • アッセイのターゲットの特定
  • 生物学的ターゲットによる化合物の検索
  • 特定のアッセイにおける活性化合物の一覧
9. 包括的な化合物アノテーション

PUG-View を通じて詳細な化合物情報にアクセスします。

import requests

cid = 2244
url = f"https://pubchem.ncbi.nlm.nih.gov/rest/pug_view/data/compound/{cid}/JSON"

response = requests.get(url)
if response.status_code == 200:
    annotations = response.json()
    # Contains extensive data including:
    # - Chemical and Physical Properties
    # - Drug and Medication Information
    # - Pharmacology and Biochemistry
    # - Safety and Hazards
    # - Toxicity
    # - Literature references
    # - Patents

特定のセクションの取得:

# Get only drug information
url = f"https://pubchem.ncbi.nlm.nih.gov/rest/pug_view/data/compound/{cid}/JSON?heading=Drug and Medication Information"

インストール要件

Python ベースのアクセスには PubChemPy をインストールします。

pip install pubchempy

直接的な API アクセスと生物活性のクエリには、次をインストールします。

pip install requests

データ分析を行う場合は、オプションで次をインストールします。

pip install pandas

ヘルパースクリプト

このスキルには、一般的な PubChem のタスク向けの Python スクリプトが含まれています。

scripts/compound_search.py

化合物情報の検索と取得を行うユーティリティ関数を提供します:

主要な関数:

  • search_by_name(name, max_results=10): 名前で化合物を検索
  • search_by_smiles(smiles): SMILES 文字列で検索
  • get_compound_by_cid(cid): CID で化合物を取得
  • get_compound_properties(identifier, namespace, properties): 特定のプロパティを取得
  • similarity_search(smiles, threshold, max_records): 類似性検索を実行
  • substructure_search(smiles, max_records): 部分構造検索を実行
  • get_synonyms(identifier, namespace): すべての同義語を取得
  • batch_search(identifiers, namespace, properties): 複数の化合物を一括検索
  • download_structure(identifier, namespace, format, filename): 構造データをダウンロード
  • print_compound_info(compound): 整形された化合物情報を出力

使用方法:

from scripts.compound_search import search_by_name, get_compound_properties

# Search for a compound
compounds = search_by_name('ibuprofen')

# Get specific properties
props = get_compound_properties('aspirin', 'name', ['MolecularWeight', 'XLogP'])
scripts/bioactivity_query.py

生物活性データを取得する関数を提供します:

主要な関数:

  • get_bioassay_summary(cid): 化合物のバイオアッセイ概要を取得
  • get_compound_bioactivities(cid, activity_outcome): 絞り込んだ生物活性を取得
  • get_assay_description(aid): アッセイの詳細情報を取得
  • get_assay_targets(aid): アッセイの生物学的ターゲットを取得
  • search_assays_by_target(target_name, max_results): ターゲットでアッセイを検索
  • get_active_compounds_in_assay(aid, max_results): 活性化合物を取得
  • get_compound_annotations(cid, section): PUG-View のアノテーションを取得
  • summarize_bioactivities(cid): 生物活性の要約統計を生成
  • find_compounds_by_bioactivity(target, threshold, max_compounds): ターゲットで化合物を検索

使用方法:

from scripts.bioactivity_query import get_bioassay_summary, summarize_bioactivities

# Get bioactivity summary
summary = summarize_bioactivities(2244)  # Aspirin
print(f"Total assays: {summary['total_assays']}")
print(f"Active: {summary['active']}, Inactive: {summary['inactive']}")

API のレート制限とベストプラクティス

レート制限:

  • 1 秒あたり最大 5 リクエスト
  • 1 分あたり最大 400 リクエスト
  • 1 分あたり最大 300 秒の実行時間

ベストプラクティス:

  1. 繰り返しのクエリには CID を使用する: CID は名前や構造よりも効率的です
  2. 結果をローカルにキャッシュする: 頻繁にアクセスするデータを保存します
  3. リクエストをまとめる: 可能な場合は複数のクエリを組み合わせます
  4. 遅延を入れる: リクエストの間に 0.2〜0.3 秒の遅延を追加します
  5. エラーを適切に処理する: HTTP エラーとデータの欠落を確認します
  6. PubChemPy を使用する: 高レベルの抽象化により、多くのエッジケースを処理できます
  7. 非同期パターンを活用する: 大規模な類似性・部分構造検索に有効です
  8. MaxRecords を指定する: タイムアウトを避けるため結果を制限します

エラー処理:

from pubchempy import BadRequestError, NotFoundError, TimeoutError

try:
    compound = pcp.get_compounds('query', 'name')[0]
except NotFoundError:
    print("Compound not found")
except BadRequestError:
    print("Invalid request format")
except TimeoutError:
    print("Request timed out - try reducing scope")
except IndexError:
    print("No results returned")

よくあるワークフロー

ワークフロー 1: 化学識別子の変換パイプライン

異なる化学識別子の間で変換を行います:

import pubchempy as pcp

# Start with any identifier type
compound = pcp.get_compounds('caffeine', 'name')[0]

# Extract all identifier formats
identifiers = {
    'CID': compound.cid,
    'Name': compound.iupac_name,
    'SMILES': compound.canonical_smiles,
    'InChI': compound.inchi,
    'InChIKey': compound.inchikey,
    'Formula': compound.molecular_formula
}
ワークフロー 2: 創薬的性質のスクリーニング

Lipinski の Rule of Five を用いて化合物をスクリーニングします:

import pubchempy as pcp

def check_drug_likeness(compound_name):
    compound = pcp.get_compounds(compound_name, 'name')[0]

    # Lipinski's Rule of Five
    rules = {
        'MW <= 500': compound.molecular_weight <= 500,
        'LogP <= 5': compound.xlogp <= 5 if compound.xlogp else None,
        'HBD <= 5': compound.h_bond_donor_count <= 5,
        'HBA <= 10': compound.h_bond_acceptor_count <= 10
    }

    violations = sum(1 for v in rules.values() if v is False)
    return rules, violations

rules, violations = check_drug_likeness('aspirin')
print(f"Lipinski violations: {violations}")
ワークフロー 3: 類似した創薬候補の探索

既知の医薬品と構造的に類似した化合物を特定します:

import pubchempy as pcp

# Start with known drug
reference_drug = pcp.get_compounds('imatinib', 'name')[0]
reference_smiles = reference_drug.canonical_smiles

# Find similar compounds
similar = pcp.get_compounds(
    reference_smiles,
    'smiles',
    searchtype='similarity',
    Threshold=85,
    MaxRecords=20
)

# Filter by drug-like properties
candidates = []
for comp in similar:
    if comp.molecular_weight and 200 <= comp.molecular_weight <= 600:
        if comp.xlogp and -1 <= comp.xlogp <= 5:
            candidates.append(comp)

print(f"Found {len(candidates)} drug-like candidates")
ワークフロー 4: 化合物の一括プロパティ比較

複数の化合物にわたってプロパティを比較します:

import pubchempy as pcp
import pandas as pd

compound_list = ['aspirin', 'ibuprofen', 'naproxen', 'celecoxib']

properties_list = []
for name in compound_list:
    try:
        compound = pcp.get_compounds(name, 'name')[0]
        properties_list.append({
            'Name': name,
            'CID': compound.cid,
            'Formula': compound.molecular_formula,
            'MW': compound.molecular_weight,
            'LogP': compound.xlogp,
            'TPSA': compound.tpsa,
            'HBD': compound.h_bond_donor_count,
            'HBA': compound.h_bond_acceptor_count
        })
    except Exception as e:
        print(f"Error processing {name}: {e}")

df = pd.DataFrame(properties_list)
print(df.to_string(index=False))
ワークフロー 5: 部分構造に基づく仮想スクリーニング

特定のファーマコフォアを含む化合物をスクリーニングします:

import pubchempy as pcp

# Define pharmacophore (e.g., sulfonamide group)
pharmacophore_smiles = 'S(=O)(=O)N'

# Search for compounds containing this substructure
hits = pcp.get_compounds(
    pharmacophore_smiles,
    'smiles',
    searchtype='substructure',
    MaxRecords=100
)

# Further filter by properties
filtered_hits = [
    comp for comp in hits
    if comp.molecular_weight and comp.molecular_weight < 500
]

print(f"Found {len(filtered_hits)} compounds with desired substructure")

リファレンスドキュメント

詳細な API ドキュメント(完全なプロパティ一覧、URL パターン、高度なクエリオプション、その他の例を含む)については、references/api_reference.md を参照してください。この包括的なリファレンスには以下が含まれます:

  • PUG-REST API エンドポイントの完全なドキュメント
  • 利用可能な分子プロパティの完全な一覧
  • 非同期リクエストの処理パターン
  • PubChemPy API リファレンス
  • アノテーション用の PUG-View API
  • よくあるワークフローとユースケース
  • 公式 PubChem ドキュメントへのリンク

トラブルシューティング

化合物が見つからない:

  • 別の名称や同義語を試す
  • 既知の場合は CID を使用する
  • スペルと化学名の形式を確認する

タイムアウトエラー:

  • MaxRecords パラメータを小さくする
  • リクエストの間に遅延を追加する
  • 高速化のため、名称ではなく CID を使用する

プロパティ値が空:

  • すべての化合物で利用可能なプロパティがあるわけではありません
  • アクセスする前にプロパティが存在するか確認する: if compound.xlogp:
  • 一部のプロパティは特定の種類の化合物でのみ利用可能です

レート制限を超過:

  • リクエストの間に遅延(0.2〜0.3 秒)を入れる
  • 可能な場合はバッチ処理を使用する
  • 結果をローカルにキャッシュすることを検討する

類似性/部分構造検索がハングする:

  • これらは非同期操作であり、15〜30 秒かかる場合があります
  • PubChemPy がポーリングを自動的に処理します
  • タイムアウトする場合は MaxRecords を小さくしてください

追加リソース

コメント