mcpField
B
brenda-database

brenda-database

github.com/jaechang-hitsデータ・データベース38469 回インストール1 週間前に更新
リポジトリ

brenda-database について

brenda-databaseは、SOAPサービス経由でBRENDAの酵素データを検索するPythonスキルです。生物種や基質で測定値を絞り込み、酵素の比較や速度論モデルの構築に役立ちます。

主な機能

  1. 01Km、kcat、Vmax、Kiの検索
  2. 02基質・生成物・阻害剤の確認
  3. 03生物種による酵素データの絞り込み
  4. 04至適pHと温度の取得
  5. 05EC番号とUniProtの対応付け

活用シーン

  1. 01代謝モデル用のKmとkcatの抽出
  2. 02生物種間での酵素パラメータ比較
  3. 03EC番号に基づく阻害剤の検索

インストール

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

$npx skills add https://github.com/jaechang-hits/sciagent-skills --skill brenda-database

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

詳細

BRENDA 酵素データベース

概要

BRENDA(BRaunschweig ENzyme DAtabase)は、世界で最も包括的な酵素情報システムであり、分類済みのすべての酵素(EC 番号)を網羅する 80,000 件以上の酵素エントリを収録しています。200,000 件以上の文献をもとに、実験で測定された 700 万件以上の速度論的パラメーター(Km、Vmax、kcat、Ki、阻害定数)、基質特異性データ、補因子の要件、組織発現、各生物種に特有の酵素変異体を提供しています。プログラムからのアクセスには、SOAP ベースのウェブサービス(Python の zeep ライブラリ)を使用し、無料の学術登録が必要です。

使用する場面

  • 特定の酵素と基質の組み合わせについて、速度論的パラメーター(Km、kcat、Vmax、Ki)を取得する
  • 酵素の生物種間または変異体間で速度論的パラメーターを比較する
  • EC 番号に対応する天然基質、阻害剤、補因子を調べる
  • ミカエリス・メンテンパラメーターを必要とする代謝シミュレーション用の速度論モデルを構築する
  • 酵素に固有の構造データ(推奨 pH、最適温度)を特定する
  • EC 番号を UniProt アクセッション番号および生物種分類と相互参照する
  • 代謝ネットワークのシミュレーションには cobrapy-metabolic-modeling を、代謝物の構造には hmdb-database を使用してください

前提条件

  • Python パッケージ:zeep(SOAP クライアント)、pandas、requests
  • データ要件:EC 番号(例:1.1.1.1)、酵素名、または生物種名
  • 環境:インターネット接続。https://www.brenda-enzymes.org/register.php での無料の学術登録
  • レート制限:明示的な制限は記載されていません。大量の自動クエリは避け、リクエストの間にスリープを挟んでください
pip install zeep pandas requests
# Register at https://www.brenda-enzymes.org/register.php to obtain API credentials

クイックスタート

from zeep import Client

WSDL = "https://www.brenda-enzymes.org/soap/brenda_zeep.wsdl"
client = Client(WSDL)

EMAIL = "[email protected]"
PASSWORD_SHA256 = "your_sha256_hashed_password"  # Use hashlib.sha256

# Get Km values for lactate dehydrogenase (EC 1.1.1.27) and pyruvate
ec_number = "1.1.1.27"
params = (EMAIL, PASSWORD_SHA256,
          f"ecNumber*{ec_number}", "substrate*pyruvate", "", "", "", "", "")
result = client.service.getKmValue(*params)
print(f"Km values for LDH with pyruvate: {len(result)} records")
for r in result[:3]:
    print(f"  Km={r.kmValue} {r.kmValueMaximum or ''} mM | org: {r.organism} | PMID: {r.literature}")

コア API

クエリ 1:酵素と基質の組み合わせに対する Km 値

特定の酵素と基質について、ミカエリス定数(Km)値を取得します。

from zeep import Client
import hashlib, pandas as pd

WSDL = "https://www.brenda-enzymes.org/soap/brenda_zeep.wsdl"
client = Client(WSDL)

EMAIL = "[email protected]"
PASSWORD = "your_password"
PASSWORD_SHA256 = hashlib.sha256(PASSWORD.encode()).hexdigest()

def get_km_values(ec_number, substrate=""):
    """Retrieve Km values for an EC number, optionally filtered by substrate."""
    substrate_param = f"substrate*{substrate}" if substrate else ""
    params = (EMAIL, PASSWORD_SHA256,
              f"ecNumber*{ec_number}", substrate_param, "", "", "", "", "")
    return client.service.getKmValue(*params)

# Km for glucokinase (EC 2.7.1.2) with glucose
results = get_km_values("2.7.1.2", substrate="glucose")
print(f"Km (glucose, glucokinase): {len(results)} measurements")

rows = []
for r in results[:10]:
    rows.append({
        "km_value": r.kmValue,
        "km_max": r.kmValueMaximum,
        "unit": "mM",
        "organism": r.organism,
        "commentary": r.commentary[:80] if r.commentary else "",
        "pmid": r.literature,
    })
df = pd.DataFrame(rows)
print(df.to_string(index=False))
# Get ALL Km values (all substrates) for an EC number
all_km = get_km_values("1.1.1.1")  # Alcohol dehydrogenase
print(f"\nAlcohol dehydrogenase - total Km records: {len(all_km)}")
substrate_counts = {}
for r in all_km:
    sub = r.substrate or "unknown"
    substrate_counts[sub] = substrate_counts.get(sub, 0) + 1
top_substrates = sorted(substrate_counts.items(), key=lambda x: -x[1])[:5]
print("Top substrates by measurement count:")
for sub, cnt in top_substrates:
    print(f"  {sub}: {cnt} measurements")
クエリ 2:kcat(ターンオーバー数)値

酵素の触媒速度定数(kcat)を取得します。

from zeep import Client
import hashlib, pandas as pd

WSDL = "https://www.brenda-enzymes.org/soap/brenda_zeep.wsdl"
client = Client(WSDL)

EMAIL = "[email protected]"
PASSWORD_SHA256 = hashlib.sha256("your_password".encode()).hexdigest()

def get_kcat_values(ec_number, substrate=""):
    substrate_param = f"substrate*{substrate}" if substrate else ""
    params = (EMAIL, PASSWORD_SHA256,
              f"ecNumber*{ec_number}", substrate_param, "", "", "", "", "")
    return client.service.getTurnoverNumber(*params)

results = get_kcat_values("1.1.1.27")  # Lactate dehydrogenase
print(f"kcat records for LDH: {len(results)}")

rows = []
for r in results[:10]:
    rows.append({
        "kcat": r.turnoverNumber,
        "unit": "1/s",
        "substrate": r.substrate,
        "organism": r.organism,
    })
df = pd.DataFrame(rows)
print(df.head())
クエリ 3:基質と生成物

酵素の天然基質と生成物を取得します。

from zeep import Client
import hashlib, pandas as pd

WSDL = "https://www.brenda-enzymes.org/soap/brenda_zeep.wsdl"
client = Client(WSDL)

EMAIL = "[email protected]"
PASSWORD_SHA256 = hashlib.sha256("your_password".encode()).hexdigest()

def get_substrates_products(ec_number):
    params = (EMAIL, PASSWORD_SHA256,
              f"ecNumber*{ec_number}", "", "", "", "", "", "")
    return client.service.getSubstrates(*params)

results = get_substrates_products("4.2.1.1")  # Carbonic anhydrase
print(f"Substrates for carbonic anhydrase (EC 4.2.1.1):")
substrates_seen = set()
for r in results[:10]:
    if r.substrate not in substrates_seen:
        print(f"  {r.substrate} | organism: {r.organism}")
        substrates_seen.add(r.substrate)
# Get inhibitors
def get_inhibitors(ec_number):
    params = (EMAIL, PASSWORD_SHA256,
              f"ecNumber*{ec_number}", "", "", "", "", "", "")
    return client.service.getInhibitors(*params)

inhibitors = get_inhibitors("4.2.1.1")
print(f"\nInhibitors of carbonic anhydrase: {len(inhibitors)} records")
inhib_names = list(set(r.inhibitor for r in inhibitors if r.inhibitor))
print("Sample inhibitors:", inhib_names[:8])
クエリ 4:生物種に特有の酵素データ

生物種で絞り込んだ速度論的パラメーターをクエリします。

from zeep import Client
import hashlib

WSDL = "https://www.brenda-enzymes.org/soap/brenda_zeep.wsdl"
client = Client(WSDL)

EMAIL = "[email protected]"
PASSWORD_SHA256 = hashlib.sha256("your_password".encode()).hexdigest()

def get_km_by_organism(ec_number, organism):
    params = (EMAIL, PASSWORD_SHA256,
              f"ecNumber*{ec_number}", "", f"organism*{organism}", "", "", "", "")
    return client.service.getKmValue(*params)

# Human GAPDH Km values
human_km = get_km_by_organism("1.2.1.12", "Homo sapiens")
print(f"Human GAPDH (EC 1.2.1.12) Km values: {len(human_km)} records")
for r in human_km[:5]:
    print(f"  Substrate: {r.substrate:30s} Km={r.kmValue} mM")
クエリ 5:最適 pH と温度

酵素の最適 pH と温度のデータを取得します。

from zeep import Client
import hashlib

WSDL = "https://www.brenda-enzymes.org/soap/brenda_zeep.wsdl"
client = Client(WSDL)

EMAIL = "[email protected]"
PASSWORD_SHA256 = hashlib.sha256("your_password".encode()).hexdigest()

def get_ph_optimum(ec_number):
    params = (EMAIL, PASSWORD_SHA256,
              f"ecNumber*{ec_number}", "", "", "", "", "", "")
    return client.service.getPhOptimum(*params)

def get_temp_optimum(ec_number):
    params = (EMAIL, PASSWORD_SHA256,
              f"ecNumber*{ec_number}", "", "", "", "", "", "")
    return client.service.getTemperatureOptimum(*params)

ec = "3.4.21.4"  # Trypsin
ph_data = get_ph_optimum(ec)
temp_data = get_temp_optimum(ec)

print(f"Trypsin (EC {ec}):")
ph_values = [r.phOptimum for r in ph_data[:10] if r.phOptimum]
temp_values = [r.temperatureOptimum for r in temp_data[:10] if r.temperatureOptimum]
if ph_values:
    print(f"  pH optima: {sorted(ph_values)}")
if temp_values:
    print(f"  Temperature optima (°C): {sorted(temp_values)}")
クエリ 6:EC 番号と UniProt の相互参照

EC 番号を UniProt アクセッション番号に対応付けます。

from zeep import Client
import hashlib

WSDL = "https://www.brenda-enzymes.org/soap/brenda_zeep.wsdl"
client = Client(WSDL)

EMAIL = "[email protected]"
PASSWORD_SHA256 = hashlib.sha256("your_password".encode()).hexdigest()

def get_uniprot_accessions(ec_number):
    params = (EMAIL, PASSWORD_SHA256,
              f"ecNumber*{ec_number}", "", "", "", "", "", "")
    return client.service.getUniprotAccession(*params)

results = get_uniprot_accessions("1.1.1.27")  # LDH
print(f"UniProt accessions for LDH (EC 1.1.1.27):")
seen = set()
for r in results[:10]:
    acc = r.uniprotAccessionNumber
    org = r.organism
    if acc and acc not in seen:
        print(f"  {acc:12s} ({org})")
        seen.add(acc)

主な概念

SOAP インターフェースと認証

BRENDA は WSDL 定義を介して SOAP(REST ではありません)を使用します。Python の zeep ライブラリが WSDL を解析し、型付きのメソッド呼び出しを生成します。認証には SHA256 でハッシュ化したパスワード(プレーンテキストではありません)が必要です。各サービスメソッドは、パイプ区切りのフィールドフィルターを含む (email, password_sha256, param1, param2, ..., "") 引数を受け取ります。

EC 番号の分類

酵素委員会(EC)番号は X.X.X.X の形式で、各階層が反応の分類を示します(酸化還元酵素=1、転移酵素=2、加水分解酵素=3、リアーゼ=4、異性化酵素=5、リガーゼ=6、トランスロカーゼ=7)。BRENDA はすべてのデータを EC 番号で整理しています。

一般的なワークフロー

ワークフロー 1:代謝モデリング用の速度論的パラメーター抽出

目標:代謝経路に含まれる一連の酵素について Km 値と kcat 値を抽出し、速度論モデルのパラメーターを設定します。

from zeep import Client
import hashlib, pandas as pd, time

WSDL = "https://www.brenda-enzymes.org/soap/brenda_zeep.wsdl"
client = Client(WSDL)

EMAIL = "[email protected]"
PASSWORD_SHA256 = hashlib.sha256("your_password".encode()).hexdigest()

# Glycolysis enzymes
enzymes = {
    "Hexokinase": "2.7.1.1",
    "Phosphoglucose isomerase": "5.3.1.9",
    "Phosphofructokinase": "2.7.1.11",
    "Aldolase": "4.1.2.13",
}

rows = []
for name, ec in enzymes.items():
    params = (EMAIL, PASSWORD_SHA256, f"ecNumber*{ec}", "", "organism*Homo sapiens", "", "", "", "")
    try:
        km_results = client.service.getKmValue(*params)
        kcat_results = client.service.getTurnoverNumber(*params)
        km_vals = [r.kmValue for r in km_results if r.kmValue]
        kcat_vals = [r.turnoverNumber for r in kcat_results if r.turnoverNumber]
        rows.append({
            "enzyme": name,
            "ec": ec,
            "n_km_records": len(km_vals),
            "km_median_mM": pd.Series(km_vals).median() if km_vals else None,
            "n_kcat_records": len(kcat_vals),
            "kcat_median_1_s": pd.Series(kcat_vals).median() if kcat_vals else None,
        })
    except Exception as e:
        rows.append({"enzyme": name, "ec": ec, "error": str(e)})
    time.sleep(0.5)

df = pd.DataFrame(rows)
df.to_csv("glycolysis_kinetics.csv", index=False)
print(df.to_string(index=False))
ワークフロー 2:酵素ファミリー間での阻害剤の比較

目標:創薬の優先順位付けに向けて、関連酵素群における阻害剤の全体像を比較します。

from zeep import Client
import hashlib, pandas as pd, time
from collections import Counter

WSDL = "https://www.brenda-enzymes.org/soap/brenda_zeep.wsdl"
client = Client(WSDL)

EMAIL = "[email protected]"
PASSWORD_SHA256 = hashlib.sha256("your_password".encode()).hexdigest()

# Carbonic anhydrase isoforms
ca_ecs = ["4.2.1.1"]  # All carbonic anhydrases share this EC

rows = []
for ec in ca_ecs:
    params = (EMAIL, PASSWORD_SHA256, f"ecNumber*{ec}", "", "", "", "", "", "")
    try:
        inhib_results = client.service.getInhibitors(*params)
        for r in inhib_results[:30]:
            rows.append({
                "ec": ec,
                "inhibitor": r.inhibitor,
                "organism": r.organism,
                "ic50": r.ic50Value if hasattr(r, "ic50Value") else None,
            })
    except Exception as e:
        print(f"Error for {ec}: {e}")
    time.sleep(0.5)

df = pd.DataFrame(rows)
print(f"Total inhibitor records: {len(df)}")
top_inhib = Counter(df["inhibitor"]).most_common(10)
print("\nMost reported inhibitors:")
for inhib, count in top_inhib:
    print(f"  {inhib}: {count} records")

主なパラメーター

パラメーターモジュールデフォルト範囲/オプション効果
ecNumber*すべてのクエリ必須EC 番号の文字列酵素クラスで絞り込みます
substrate*Km、kcat—基質名基質で絞り込みます
organism*すべてのクエリ—種名生物種で絞り込みます(例:"Homo sapiens")
commentary*すべてのクエリ—テキストの部分文字列コメントのテキストで絞り込みます
ligandStructureId*化合物ベース—BRENDA 構造 IDリガンド ID で絞り込みます
パスワード認証必須SHA256 ハッシュ認証(hashlib.sha256)

ベストプラクティス

  1. パスワードを正しくハッシュ化します:BRENDA では、パスワードそのものではなく、プレーンテキストのパスワードの SHA256 ハッシュが必要です。hashlib.sha256("your_password".encode()).hexdigest() を使用してください。

  2. 認証情報を環境変数に保存します:認証情報をハードコードしないでください。os.environ["BRENDA_EMAIL"] と os.environ["BRENDA_PASSWORD"] のパターンを使用してください。

  3. クエリの間に time.sleep() を追加します:BRENDA の SOAP サービスは応答が遅い場合があります。タイムアウトを避けるため、大量のバッチクエリの間隔を 0.5~1 秒空けてください。

  4. モデリングでは生物種で絞り込みます:動力学パラメーターは生物種によって大きく異なります。モデルに関連する生物種で常に絞り込んでください(例:organism*Homo sapiens)。

  5. パラメーターの集計には中央値/IQR を使用します:同じ基質に関する複数の文献測定値は、しばしば桁違いの差があります。分布の要約には平均ではなく、中央値と IQR を使用してください。

よく使うレシピ

レシピ:EC 番号に対応するすべての基質を取得する

使用する場面:経路解析のために、酵素の基質範囲を把握します。

from zeep import Client
import hashlib

WSDL = "https://www.brenda-enzymes.org/soap/brenda_zeep.wsdl"
client = Client(WSDL)

EMAIL = "[email protected]"
PASSWORD_SHA256 = hashlib.sha256("your_password".encode()).hexdigest()

ec = "1.1.1.1"  # Alcohol dehydrogenase
params = (EMAIL, PASSWORD_SHA256, f"ecNumber*{ec}", "", "", "", "", "", "")
results = client.service.getSubstrates(*params)
substrates = list(set(r.substrate for r in results if r.substrate))
print(f"Substrates of EC {ec} ({len(substrates)} unique): {substrates[:10]}")
レシピ:kcat/Km 効率比

使用する場面:BRENDA のデータから触媒効率(kcat/Km)を計算します。

import pandas as pd

# After fetching km_results and kcat_results for same ec + substrate
# km_values = [r.kmValue for r in km_results if r.kmValue]  # mM
# kcat_values = [r.turnoverNumber for r in kcat_results if r.turnoverNumber]  # 1/s

km_median = 0.1   # mM (example)
kcat_median = 500  # s^-1 (example)

efficiency = kcat_median / (km_median * 1e-3)  # Convert Km to M
print(f"Catalytic efficiency (kcat/Km): {efficiency:.2e} M^-1 s^-1")
# Diffusion limit ≈ 10^8-10^9 M^-1 s^-1
レシピ:酵素名から EC 番号を検索する

使用する場面:BRENDA のクエリ用に、酵素の一般名を EC 番号に対応付けます。

from zeep import Client
import hashlib

WSDL = "https://www.brenda-enzymes.org/soap/brenda_zeep.wsdl"
client = Client(WSDL)

EMAIL = "[email protected]"
PASSWORD_SHA256 = hashlib.sha256("your_password".encode()).hexdigest()

# Search enzymes by name
params = (EMAIL, PASSWORD_SHA256, "recommendedName*lactate dehydrogenase", "", "", "", "", "", "")
results = client.service.getEcNumber(*params)
print(f"EC numbers for 'lactate dehydrogenase':")
for r in results[:5]:
    print(f"  EC {r.ecNumber}: {r.recommendedName}")

トラブルシューティング

問題原因解決策
zeep.exceptions.Fault: Authentication failedパスワードまたは SHA256 形式が正しくありませんhashlib.sha256(password.encode()).hexdigest() を使用してください。digest ではなく hexdigest です
結果リストが空ですEC 番号または基質が見つかりませんEC 形式(ドットで区切られた X.X.X.X)を確認してください。まず基質フィルターなしで試してください
SOAP タイムアウトクエリが大きい、または接続が遅い生物種フィルターを使用して結果を減らし、zeep のトランスポートタイムアウトを設定してください
結果フィールドでの AttributeErrorこのクエリではフィールドを利用できませんgetattr(r, "field", None) を使用して、オプションのフィールドに安全にアクセスしてください
よく知られた酵素の応答が遅いデータセットが大きい(TP53 は 10K 件以上のレコード)生物種と基質で絞り込み、データ転送量を減らしてください
zeep.exceptions.TransportErrorネットワーク接続の問題VPN を確認し、30 秒後に再試行してください

関連スキル

  • cobrapy-metabolic-modeling — BRENDA の Km/Vmax を動力学的制約として使用する、制約ベースの代謝モデリング
  • hmdb-database — BRENDA の基質に関する代謝物の構造と生物学的背景
  • kegg-database — EC 番号の相互参照を介した、BRENDA の酵素に関する経路の背景情報
  • uniprot-protein-database — BRENDA で見つかった酵素のタンパク質配列および構造データ

参考資料

コメント