第4章:公共数据库使用——UniProt、PDB、ChEMBL
做药物靶点挖掘这事,很多新手上来就直奔PubMed查文献。我的经验是——先别急。真正干活儿的老手都知道,先把几个公共数据库摸透,后面能省80%的力气。
这一章咱们就盯住三个核心库:UniProt(蛋白序列和功能)、PDB(三维结构)、ChEMBL(活性数据)。我习惯叫它们「靶点三件套」。你把这套组合拳打熟了,大多数靶点相关的信息都能快速捞出来。
4.1 UniProt——靶点序列与功能的主源头
UniProt是目前最权威的蛋白序列和功能注释数据库。我个人做靶点调研时,第一站永远是它。
它其实有三个子库,但常用的就两个:
- Swiss-Prot:人工审核的,靠谱但更新慢
- TrEMBL:自动注释的,量大但质量参差
4.1.1 怎么查?怎么用?
假设我们要查人源EGFR靶点。直接在UniProt首页搜「EGFR human」,点进第一个结果(P00533)。你会看到这些关键字段:
| 字段 | 内容示例 | 我的用法 |
|---|---|---|
| Entry | P00533 | 全局唯一ID,后面做关联的钥匙 |
| Protein names | Epidermal growth factor receptor | 确认靶点全名和别名 |
| Gene names | EGFR | 基因名,用于跨库检索 |
| Function | Receptor tyrosine kinase... | 快速了解靶点角色 |
| Subcellular location | Cell membrane | 判断成药性,膜蛋白还是胞内? |
| Sequence | 1210 aa | 长度和FASTA序列,下游对接用 |
我最常做的事——把FASTA序列拉下来,然后直接丢到后续的分析流程里。怎么做?
# Python调用UniProt REST API,批量拉指定靶点序列
import requests
target_id = "P00533"
url = f"https://www.uniprot.org/uniprot/{target_id}.fasta"
response = requests.get(url)
if response.ok:
with open(f"{target_id}.fasta", "w") as f:
f.write(response.text)
print("FASTA下载成功")
else:
print("查不到这个ID,检查一下")
4.1.2 实战——批量下载靶点家族
搞药化的人经常需要检索整个激酶家族的序列。我习惯这么干:
# 用UniProt的REST API,检索人源所有激酶
query = "organism:9606 AND keyword:Kinase"
url = f"https://rest.uniprot.org/uniprotkb/search?query={query}&format=fasta&size=500"
response = requests.get(url)
with open("human_kinases.fasta", "w") as f:
f.write(response.text)
这一步跑完,你就拿到了500条激酶序列。后面做多序列比对、构建系统发育树,底子就有了。
4.2 PDB——三维结构,物化对接的根基
拿到序列后,下一步是看结构。PDB(Protein Data Bank)是全球最大的生物大分子结构库。做分子对接、虚拟筛选的人,天天跟它打交道。
PDB里的结构主要来自X射线、NMR、冷冻电镜。我个人最信任X射线解析的,分辨率2.5Å以上的才好用。
4.2.1 结构查询和下载
搜PDB的结构跟UniProt不太一样。你用基因名或蛋白名搜,有时会出来一堆entry。
| 筛选条件 | 原因 |
|---|---|
| Resolution < 2.5 Å | 分辨率高了,电子密度图清楚 |
| No mutations | 野生型更接近真实生理状态 |
| Has ligand | 带了小分子配体的结构,更值钱 |
| Full-length | 截短的可能缺关键domain |
我在实际项目中通常这样做——先找到目标靶点的PDB ID列表,然后批量下载结构文件。
# 假设我们已经有了PDB ID列表
pdb_ids = ["1M17", "2GS6", "3W2R"]
for pdb_id in pdb_ids:
url = f"https://files.rcsb.org/download/{pdb_id}.pdb"
os.system(f"wget {url}")
print(f"下载{pdb_id}完成")
4.2.2 如何准备结构文件
下载完原始PDB文件,不能直接用。结构里可能含有水分子、缓冲液、无关配体。得先清理。我常用的清洗流程:
# 用pdb4amber自动清理,去掉水和杂原子
pdb4amber -i 1M17.pdb -o 1M17_clean.pdb --dry --reduce
# 或者用pyMOL手工删
# 在pymol里: remove solvent; remove organic
嗯,这里要注意——如果是做对接,共价配体或金属离子要去掉,但结合位点的关键水分子反而要保留,它们参与了氢键网络。
4.3 ChEMBL——活性数据的金矿
有了靶点和结构,还得知道有没有已知的活性分子。ChEMBL就是干这个的——化合物-靶点活性数据库,目前收录了超过2000万个活性数据点。
4.3.1 核心数据字段
| 字段 | 说明 | 筛选建议 |
|---|---|---|
| Molecule ChEMBL ID | 化合物唯一标识 | 关联结构用 |
| Standard Type | 活性类型(IC50/Ki/EC50) | 尽量统一标准 |
| Standard Value | 活性数值(nM) | 过滤掉模糊值 |
| Relation | 等于/小于/大于 | = 和 ~ 比较可靠 |
| Assay Type | 结合/功能/ADME | 明确靶点属性 |
4.3.2 实战——查一个靶点的已知活性分子
还是EGFR这个例子。ChEMBL支持REST API,也可以直接web搜索。我一般优先用web查,确认后再批量用API拉。
# Python调用ChEMBL API,搜EGFR的活性化合物
import requests
url = "https://www.ebi.ac.uk/chembl/api/data/activity.json"
params = {
"target_chembl_id": "CHEMBL203",
"standard_type": "IC50",
"standard_relation": "=",
"limit": 100
}
r = requests.get(url, params=params)
data = r.json()
for act in data['activities']:
print(act['molecule_chembl_id'], act['standard_value'], act['standard_units'])
关键一步:拿到的活性数据不能直接用。要先做标准化——把不同assay、不同单位、不同关系的数据,统一到同一尺度。我习惯的方法是:
- 只保留IC50/Ki类型
- 将值统一转为nM
- 去重,保留活性最好的记录
- 剔除数据量少于3个点的条目
4.3.3 常见错误——「活性」不等于「选择性」
我曾经看到有人把ChEMBL里拉到的数据直接拿去训练模型,结果模型输出的活性很高,但实际在细胞实验里完全无效。为什么?
因为ChEMBL的活性数据主要是生化实验(binding assay),而不是细胞实验(cellular assay)。生化活性不等于细胞渗透性,更不等于体内有效性。数据清洗时一定要标注assay_type,分开用。
4.4 三库联用——一条完整的靶点信息管道
单用一个库是不够的。我搭建的靶点Pipeline里,这三个库是串起来用的。下面这张图展示了我个人实战中的调用流程:
你看,实际流程是单向的:先有序列(UniProt),再找结构(PDB),最后跑活性数据(ChEMBL)。每层数据都要往回对照,防止ID搞混。
4.5 避坑指南——我踩过的三个坑
在实战中,我会遇到几个让新手很崩溃的问题。说说我的血泪史:
- 坑一:ID映射出错。 我曾经把一个UniProt ID直接当成PDB entry用,程序报错查了半天,才发现ID系统完全不一样。正确做法是:UniProt的「Cross-reference」板块里明确标注了对应PDB条目,手动核对一遍再批量。
- 坑二:ChEMBL活性数据里的假阳性。 有些化合物在生化实验里很强,但纯属假阳性(比如聚集剂、荧光干扰)。我的做法是——用PAINS过滤器先扫一遍,扔掉那些可疑的。
- 坑三:PDB里配体坐标乱。 下载的结构里配体位置可能不对,尤其是来自同源建模的。必须看着电子密度图验证一下,否则对接结果全废。
4.6 本章小结
| 数据库 | 核心功能 | 我的常用操作 |
|---|---|---|
| UniProt | 序列、功能、跨库ID | 拉FASTA,批量检索,ID映射 |
| PDB | 三维结构、配体复合物 | 下载结构,清洗,生成对接输入 |
| ChEMBL | 化合物活性数据 | 批量API拉取,标准化,去假阳性 |