跳转至

蛋白质域注释InterPro

一句话概述:InterPro是蛋白质"身份证系统"——把蛋白质按功能域(domain)分类,告诉你这个蛋白质有哪些功能模块,就像看一把瑞士军刀上有哪些工具。

核心知识点表

知识点白话解释重要程度
蛋白质域(Domain)蛋白质上的独立功能单元,像积木块一样⭐⭐⭐⭐⭐
InterPro整合了多个蛋白质域数据库的"超级数据库"⭐⭐⭐⭐⭐
InterProScan用序列搜索InterPro数据库的工具⭐⭐⭐⭐⭐
Pfam蛋白质家族数据库,基于HMM模型⭐⭐⭐⭐
PROSITE用模式(pattern)描述蛋白质功能位点⭐⭐⭐
GO注释InterPro自带的Gene Ontology功能注释⭐⭐⭐⭐
信号肽/跨膜域InterProScan还能预测蛋白质的信号肽和跨膜区⭐⭐⭐

一、InterPro是什么?(白话解释)

蛋白质 = 一把瑞士军刀
蛋白质域 = 瑞士军刀上的每个工具(刀片、剪刀、开瓶器...)

InterPro的工作:
1. 你给它一个蛋白质序列
2. 它告诉你这个蛋白质上有哪些"工具"(功能域)
3. 每个工具在序列的哪个位置
4. 这些工具有什么功能

InterPro整合了这些数据库:
  Pfam        → 蛋白质家族(HMM模型,最常用)
  PROSITE     → 功能位点模式
  PRINTS      → 蛋白质指纹
  PANTHER     → 蛋白质进化分类
  CDD         → 保守域数据库
  SMART       → 简单模块化架构
  SUPERFAMILY → 蛋白质超家族
  Gene3D      → 基因组3D结构域
  HAMAP       → 微生物蛋白注释
  ...等13+个数据库

二、InterProScan安装

2.1 本地安装

# ========== 下载InterProScan ==========
# 官网:https://www.ebi.ac.uk/interpro/download/
wget https://ftp.ebi.ac.uk/pub/software/unix/iprscan/5/5.71-102.0/interproscan-5.71-102.0-64-bit.tar.gz  # 下载最新版
tar -xzf interproscan-5.71-102.0-64-bit.tar.gz  # 解压
cd interproscan-5.71-102.0  # 进入目录

# ========== 安装依赖 ==========
# 需要Java 11+
java -version  # 检查Java版本

# 如果没有Java
conda install -c conda-forge openjdk=17  # 用conda安装Java 17

# ========== 测试安装 ==========
./interproscan.sh -i test_all_appl.fasta -f tsv  # 运行测试
# 如果正常输出结果表格,说明安装成功

# ========== 添加到PATH ==========
echo 'export PATH=$PATH:/path/to/interproscan-5.71-102.0' >> ~/.bashrc  # 添加到环境变量
source ~/.bashrc  # 刷新环境变量

2.2 conda安装(简化版)

# conda安装InterProScan
conda create -n interpro python=3.10  # 创建环境
conda activate interpro  # 激活环境
conda install -c bioconda interproscan  # 安装(可能需要较长时间下载数据库)

三、InterProScan使用

3.1 基本命令行使用

# ========== 基本用法 ==========

# 对单个蛋白质序列注释
interproscan.sh \
    -i protein.fasta \          # 输入:蛋白质FASTA文件
    -o protein_interpro.tsv \   # 输出:TSV格式结果
    -f tsv,gff3,json \          # 输出格式:TSV + GFF3 + JSON
    -goterms \                  # 包含GO注释
    -iprlookup \                # 包含InterPro注释
    -pa \                       # 包含通路注释
    -t p \                      # 序列类型:p=蛋白质, n=核酸
    -cpu 8                      # 使用8个CPU核心

# ========== 批量注释 ==========
# 对基因组预测的所有蛋白质进行注释
interproscan.sh \
    -i all_proteins.fasta \     # 输入:所有蛋白质序列
    -o all_proteins_interpro \  # 输出文件前缀
    -f tsv,gff3 \               # 输出格式
    -goterms \                  # GO注释
    -iprlookup \                # InterPro注释
    -pa \                       # 通路注释
    -dp \                       # 禁用预计算匹配查找(本地运行必须加)
    -t p \                      # 蛋白质类型
    -cpu 16                     # 16核并行

# ========== 只运行特定分析 ==========
# 只用Pfam和PANTHER分析(更快)
interproscan.sh \
    -i protein.fasta \
    -appl Pfam,PANTHER \        # 只用Pfam和PANTHER两个数据库
    -o protein_pfam.tsv \
    -f tsv \
    -goterms                    # 还是要GO注释

3.2 输出文件解读

# ========== TSV输出列说明 ==========
# 用head命令查看输出
head -5 protein_interpro.tsv

# TSV文件的列(用tab分隔):
# 列1:  蛋白质ID        → 你的蛋白质名称
# 列2:  序列MD5          → 序列的MD5哈希值
# 列3:  序列长度         → 蛋白质长度(氨基酸数)
# 列4:  分析类型         → Pfam/PANTHER/CDD等
# 列5:  匹配ID           → 数据库中的条目ID(如PF00069)
# 列6:  匹配描述         → 功能域描述(如Protein kinase domain)
# 列7:  起始位置         → 域在序列上的起始位置
# 列8:  结束位置         → 域在序列上的结束位置
# 列9:  E-value          → 统计显著性(越小越可靠)
# 列10: 状态             → T=真匹配
# 列11: 日期             → 分析日期
# 列12: InterPro ID      → InterPro整合后的ID(如IPR000719)
# 列13: InterPro描述     → InterPro描述
# 列14: GO注释           → Gene Ontology条目
# 列15: 通路注释         → 代谢通路信息

# ========== 统计注释结果 ==========
# 统计各数据库的匹配数
cut -f4 protein_interpro.tsv | sort | uniq -c | sort -rn  # 按分析类型统计

# 统计InterPro域分布
cut -f12,13 protein_interpro.tsv | sort | uniq -c | sort -rn | head -20  # Top20域

# 提取GO注释
awk -F'\t' '$14!=""' protein_interpro.tsv | cut -f1,14 | sort -u > go_annotations.txt  # 提取非空GO注释

四、Python解析InterPro结果

#!/usr/bin/env python3
"""解析InterProScan结果并进行统计分析"""

import pandas as pd  # 数据处理
from collections import Counter  # 计数器
import matplotlib.pyplot as plt  # 绑图

# ========== 读取TSV结果 ==========
# InterProScan TSV文件没有表头,需要手动指定列名
columns = [
    "protein_id",     # 蛋白质ID
    "md5",            # 序列MD5
    "length",         # 序列长度
    "analysis",       # 分析数据库
    "match_id",       # 匹配条目ID
    "match_desc",     # 匹配描述
    "start",          # 起始位置
    "end",            # 结束位置
    "evalue",         # E值
    "status",         # 匹配状态
    "date",           # 日期
    "interpro_id",    # InterPro ID
    "interpro_desc",  # InterPro描述
    "go_terms",       # GO注释
    "pathway"         # 通路注释
]

df = pd.read_csv(
    "protein_interpro.tsv",
    sep="\t",  # Tab分隔
    header=None,  # 无表头
    names=columns  # 使用自定义列名
)

print(f"总注释记录数: {len(df)}")  # 打印总记录数
print(f"注释的蛋白质数: {df['protein_id'].nunique()}")  # 唯一蛋白质数

# ========== 统计分析 ==========
# 1. 各数据库贡献
db_counts = df["analysis"].value_counts()  # 统计每个数据库的匹配数
print("\n各数据库注释数量:")
print(db_counts)

# 2. 最常见的蛋白质域
domain_counts = df["interpro_desc"].dropna().value_counts()  # 统计最常见的域
print("\n最常见的蛋白质域 TOP10:")
print(domain_counts.head(10))

# 3. GO注释统计
go_series = df["go_terms"].dropna()  # 获取非空GO注释
all_go = []
for go_str in go_series:  # 遍历每条GO注释
    all_go.extend(go_str.split("|"))  # GO注释用|分隔
go_counts = Counter(all_go)  # 统计GO term频率
print(f"\n总GO注释数: {len(go_counts)}")

# ========== 可视化 ==========
# 蛋白质域分布柱状图
fig, axes = plt.subplots(1, 2, figsize=(16, 6))  # 创建两个子图

# 子图1:各数据库注释数
db_counts.head(10).plot(kind="barh", ax=axes[0], color="steelblue")  # 水平柱状图
axes[0].set_xlabel("Number of annotations")  # X轴标签
axes[0].set_title("Annotations per database")  # 标题

# 子图2:最常见的域
domain_counts.head(10).plot(kind="barh", ax=axes[1], color="coral")  # 水平柱状图
axes[1].set_xlabel("Frequency")  # X轴标签
axes[1].set_title("Top 10 protein domains")  # 标题

plt.tight_layout()  # 自动布局
plt.savefig("interpro_stats.png", dpi=300, bbox_inches="tight")  # 保存图片
print("统计图已保存到 interpro_stats.png")

五、InterPro在线API查询

#!/usr/bin/env python3
"""使用InterPro REST API查询蛋白质域信息"""

import requests  # HTTP请求
import json  # JSON解析

# ========== 查询单个蛋白质的InterPro注释 ==========
def query_interpro(uniprot_id):
    """通过UniProt ID查询InterPro注释"""
    url = f"https://www.ebi.ac.uk/interpro/api/entry/interpro/protein/uniprot/{uniprot_id}"  # API地址

    response = requests.get(url, headers={"Accept": "application/json"})  # 发送GET请求

    if response.status_code == 200:  # 请求成功
        data = response.json()
        results = data.get("results", [])  # 获取结果列表

        print(f"\n蛋白质 {uniprot_id} 的InterPro注释:")
        print(f"{'InterPro ID':<15}{'类型':<20}{'描述'}")
        print("-" * 70)

        for entry in results:  # 遍历每个InterPro条目
            metadata = entry.get("metadata", {})
            print(f"{metadata.get('accession', 'N/A'):<15}"  # InterPro ID
                  f"{metadata.get('type', 'N/A'):<20}"  # 条目类型
                  f"{metadata.get('name', 'N/A')}")  # 描述

        return results
    else:
        print(f"查询失败: HTTP {response.status_code}")
        return []

# ========== 查询特定InterPro条目 ==========
def get_interpro_entry(interpro_id):
    """获取InterPro条目详细信息"""
    url = f"https://www.ebi.ac.uk/interpro/api/entry/interpro/{interpro_id}"  # 条目API

    response = requests.get(url, headers={"Accept": "application/json"})

    if response.status_code == 200:
        data = response.json()
        metadata = data.get("metadata", {})

        print(f"\nInterPro条目: {interpro_id}")
        print(f"名称: {metadata.get('name', 'N/A')}")  # 域名称
        print(f"类型: {metadata.get('type', 'N/A')}")  # 域类型
        print(f"蛋白质数: {metadata.get('counters', {}).get('proteins', 'N/A')}")  # 包含的蛋白质数

        return data
    else:
        print(f"查询失败: HTTP {response.status_code}")
        return {}

# ========== 使用示例 ==========
# 查询TP53蛋白(UniProt: P04637)的功能域
query_interpro("P04637")

# 查询特定域的详细信息
get_interpro_entry("IPR011615")  # p53 DNA结合域

常见报错与解决

报错信息原因解决方法
Java not found没安装Java或版本太低安装Java 11+:conda install openjdk=17
OutOfMemoryErrorJava内存不够修改interproscan.sh中的-Xmx参数,如-Xmx8g
No matches found序列太短或不是蛋白质确认输入是蛋白质序列,检查序列质量
Binary not found某个分析工具没装好运行python3 setup.py重新初始化
Lookup service error网络问题或数据库未下载-dp参数禁用预计算查找
Timeout序列太多处理超时分批运行,每批<1000条

速查表

========================================
蛋白质域注释InterPro 速查表
========================================

【InterProScan基本命令】
标准注释            → interproscan.sh -i input.fasta -f tsv -goterms
快速注释(Pfam)    → interproscan.sh -i input.fasta -appl Pfam -f tsv
批量注释            → interproscan.sh -i all.fasta -f tsv -goterms -cpu 16 -dp

【输出格式】
TSV                 → 制表符分隔(推荐,易解析)
GFF3                → 基因组注释格式
JSON                → 结构化数据
XML                 → XML格式

【常用参数】
-i                  → 输入文件(FASTA格式)
-o                  → 输出文件
-f                  → 输出格式(tsv,gff3,json,xml)
-t                  → 序列类型(p=蛋白质, n=核酸)
-appl               → 指定使用的数据库
-goterms            → 包含GO注释
-iprlookup          → 包含InterPro注释
-pa                 → 包含通路注释
-dp                 → 禁用预计算查找(本地运行)
-cpu                → CPU核数

【InterPro整合的数据库】
Pfam                → 蛋白质家族(HMM模型)
PANTHER             → 进化分类
CDD                 → 保守域
SMART               → 模块化架构
Gene3D              → 3D结构域
SUPERFAMILY         → 蛋白质超家族
PROSITE             → 功能位点模式
PRINTS              → 蛋白质指纹

【InterPro条目类型】
Domain              → 功能域(独立折叠单元)
Family              → 蛋白质家族
Homologous_superfamily → 同源超家族
Repeat              → 重复序列
Site                → 功能位点

【API查询】
蛋白质注释          → /api/entry/interpro/protein/uniprot/{ID}
条目详情            → /api/entry/interpro/{IPR_ID}
基地址              → https://www.ebi.ac.uk/interpro/api/

【面试考点】
Q: InterPro和Pfam的关系?
A: InterPro整合了Pfam等13+个数据库,Pfam是其中最大的子库

Q: InterProScan输出怎么看?
A: 主要看:蛋白质ID、匹配域ID、域描述、起止位置、E-value

Q: 什么是蛋白质域?
A: 蛋白质中能独立折叠的功能单元,一个蛋白可含多个域
========================================

参考资料:InterPro官方文档 | www.ebi.ac.uk/interpro | Pfam数据库 | InterProScan用户手册