mcpField
B
brenda-database

brenda-database

github.com/jaechang-hits数据与数据库38469 次安装1 周前更新
代码仓库

关于 brenda-database

brenda-database 是一个通过 SOAP 服务查询 BRENDA 酶数据的 Python 技能,适用于研究人员按生物体和底物筛选测量值,用于酶比较与动力学模型构建。

主要功能

  1. 01查询 Km、kcat、Vmax 和 Ki
  2. 02查找底物、产物与抑制剂
  3. 03按生物体筛选酶数据
  4. 04获取 pH 与温度最适值
  5. 05关联 EC 编号与 UniProt

适用场景

  1. 01为代谢模型提取 Km 和 kcat
  2. 02比较不同生物体中的酶参数
  3. 03查找特定 EC 编号的抑制剂

安装

复制下面的命令,在终端中运行。

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

安装后在 Claude Code 中输入/brenda-database确认已加载。

详细介绍

BRENDA 酶数据库

概述

BRENDA(BRaunschweig ENzyme DAtabase,布伦瑞克酶数据库)是全球最全面的酶信息系统,包含 80,000 多条酶条目,涵盖所有已分类的酶(EC 编号)。数据库收录了来自 200,000 多篇文献的 700 多万个实验测定动力学参数(Km、Vmax、kcat、Ki、抑制常数)、底物特异性数据、辅因子需求、组织表达信息,以及特定生物的酶变体。可通过基于 SOAP 的 Web 服务(Python zeep 库)以编程方式访问,学术用途可免费注册。

适用场景

  • 获取特定酶与底物组合的动力学参数(Km、kcat、Vmax、Ki)
  • 比较不同生物或酶突变体的动力学参数
  • 查找某个 EC 编号对应的天然底物、抑制剂和辅因子
  • 构建需要 Michaelis-Menten 参数的代谢模拟动力学模型
  • 查找特定酶的结构数据(推荐 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 值

获取特定酶和底物的 Michaelis 常数(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 筛选
Password身份验证必填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 编号

适用场景:将酶的常用名称解析为 EC 编号,以便查询 BRENDA。

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()——必须用 hexdigest,而不是 digest
结果列表为空未找到 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 中酶的蛋白质序列和结构数据

参考资料

评论

支持 Markdown