brenda-database について
brenda-databaseは、SOAPサービス経由でBRENDAの酵素データを検索するPythonスキルです。生物種や基質で測定値を絞り込み、酵素の比較や速度論モデルの構築に役立ちます。
主な機能
- 01Km、kcat、Vmax、Kiの検索
- 02基質・生成物・阻害剤の確認
- 03生物種による酵素データの絞り込み
- 04至適pHと温度の取得
- 05EC番号とUniProtの対応付け
活用シーン
- 01代謝モデル用のKmとkcatの抽出
- 02生物種間での酵素パラメータ比較
- 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) |
ベストプラクティス
-
パスワードを正しくハッシュ化します:BRENDA では、パスワードそのものではなく、プレーンテキストのパスワードの SHA256 ハッシュが必要です。
hashlib.sha256("your_password".encode()).hexdigest()を使用してください。 -
認証情報を環境変数に保存します:認証情報をハードコードしないでください。
os.environ["BRENDA_EMAIL"]とos.environ["BRENDA_PASSWORD"]のパターンを使用してください。 -
クエリの間に
time.sleep()を追加します:BRENDA の SOAP サービスは応答が遅い場合があります。タイムアウトを避けるため、大量のバッチクエリの間隔を 0.5~1 秒空けてください。 -
モデリングでは生物種で絞り込みます:動力学パラメーターは生物種によって大きく異なります。モデルに関連する生物種で常に絞り込んでください(例:
organism*Homo sapiens)。 -
パラメーターの集計には中央値/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 で見つかった酵素のタンパク質配列および構造データ
参考資料
- BRENDA database — BRENDA のメインポータルと手動検索
- BRENDA web service documentation — SOAP API のリファレンスとパラメーターの説明
- zeep Python SOAP client — SOAP ウェブサービス用の Python ライブラリ
- Chang et al. (2021) BRENDA update — BRENDA 2021 データベース更新論文