Hello,Hello小伙伴们大家好。近年来,随着宏基因组学、微生物组学及病毒组学研究的快速发展,蛋白质序列数据规模不断扩大。如何快速、准确地利用 profile Hidden Markov Model(profile HMM)进行蛋白质同源搜索和功能注释,已成为生物信息学分析中的重要环节。今天给大家介绍一款由 Josh L. Espinoza 开发的高性能 HMM 搜索工具——PyHMMSearch。
PyHMMSearch 是一个灵活、高效的通用 profile HMM 搜索工具,尤其适合在多线程、高内存计算环境中处理大规模微生物基因组、宏基因组和病毒组蛋白质数据,为批量蛋白质功能注释提供了一种更加便捷的实现方式。
工作流程

原理:
PyHMMSearch 是一款面向大规模蛋白质数据的 HMM 搜索工具,核心功能是基于 PyHMMER 实现类似 HMMER hmmsearch 的 profile HMM 比对。该工具可将一个或多个 HMM 模型与蛋白质序列数据库进行搜索,用于识别蛋白质家族、保守结构域及潜在功能。PyHMMSearch 支持普通或 gzip 压缩的 FASTA 文件输入,并可输出标准表格、tblout 和 domtblout 等结果格式,便于后续筛选和统计分析。
优势:
传统 HMMER 已广泛应用于 Pfam、TIGRFAM、VOG、PHROG、dbCAN 等数据库的功能注释。然而,在处理大规模蛋白质数据时,数据库读取、中间文件生成及磁盘 I/O 可能影响分析效率。针对这些问题,PyHMMSearch 将 HMM 搜索过程整合至 Python 环境中,并针对高内存和多线程计算进行了优化,可减少中间文件和磁盘读写开销,提高批量蛋白质功能注释的执行效率。
在结果筛选方面,PyHMMSearch 支持 E-value、bitscore 以及 HMM 模型自带的 gathering、trusted 和 noise cutoff,也允许用户提供自定义模型评分阈值。因此,该工具不仅适用于 Pfam 等通用数据库,也可结合病毒功能基因、抗性基因或其他自定义 HMM 数据库开展蛋白质功能注释。
Github:
https://github.com/jolespin/pyhmmsearch
https://github.com/althonos/pyhmmer
数据库:
https://ftp.ebi.ac.uk/pub/databases/Pfam/current_release
https://phrogs.lmge.uca.fr/
https://bcb.unl.edu/dbCAN2/download/
https://www.genome.jp/ftp/db/kofam
注:
PyHMMSearch 具有较高的数据库兼容性,不依赖预设的特定数据库,可读取单个或合并后的 HMMER3 profile HMM 文件,对蛋白序列进行同源搜索与功能注释。
软件安装
# 创建一个名为PyHMMSearch的conda环境,并安装pyhmmsearch
conda create -n PyHMMSearch -c conda-forge -c bioconda pyhmmsearch
# conda install 直接安装
conda install -c bioconda pyhmmsearch
# pip install 安装
pip install pyhmmsearch
# 激活环境
conda activate PyHMMSearch 安装说明:
小编的安装更推荐第一种方法,因为小编习惯将每个软件单独创建一个虚拟conda环境,避免软件依赖产生冲突。
配置数据库
## Pfam数据库为例
# 离线模式
mkdir -p db/Pfam && cd db/Pfam
# 使用wget下Pfam数据库Hmm文件
wget -c -nv -a download.log -b https://ftp.ebi.ac.uk/pub/databases/Pfam/current_release/Pfam-A.hmm.gz
# 格式化数据库
# 方式 1:输入单个合并后的 HMM 数据库文件
serialize_hmm_models -d Pfam-A.hmm.gz -b PyHMMSearch.pkl.gz
# 方式 2:输入包含多个 HMM 文件的目录
serialize_hmm_models -d hmm_directory/ -b PyHMMSearch.pkl.gz
# 方式 3:输入记录多个 HMM 文件路径的列表文件
serialize_hmm_models -l hmms.list -b PyHMMSearch.pkl.gz使用方法
pyhmmsearch -h
usage: pyhmmsearch -i <proteins.fasta> -o <output.tsv> -d
Running: pyhmmsearch v2025.10.23.post1 via Python v3.12.13 | /Path/softwara/miniforge3/envs/PyHMMSearch/bin/python3.12
options:
-h, --help show this help message and exit
-v, --version show program's version number and exit
I/O arguments:
-i PROTEINS, --proteins PROTEINS
path/to/proteins.fasta. stdin does not stream and loads everything into memory. [Default: stdin]
-o OUTPUT, --output OUTPUT
path/to/output.tsv [Default: stdout]
--no_header No header
--tblout TBLOUT path/to/output.tblout
--domtblout DOMTBLOUT
path/to/output.domtblout
Utility arguments:
-p N_JOBS, --n_jobs N_JOBS
Number of threads to use [Default: 1]
HMMSearch arguments:
-s SCORES_CUTOFF, --scores_cutoff SCORES_CUTOFF
path/to/scores_cutoff.tsv[.gz] [id_hmm]<tab>[score_threshold], No header.
-f {accession,name}, --hmm_marker_field {accession,name}
HMM reference type (accession, name) [Default: accession]
-t {domain,full}, --score_type {domain,full}
{full, domain} [Default: full]
-m {trusted,noise,e,gathering}, --threshold_method {trusted,noise,e,gathering}
Cutoff threshold method [Default: e]
-e EVALUE, --evalue EVALUE
E-value threshold [Default: 10.0]
Database arguments:
-d HMM_DATABASE, --hmm_database HMM_DATABASE
path/to/database.hmm cannot be used with -b/-serialized_database. Expects a (concatenated) HMM file and not a directory. You can build a database from a directory using `serialize_hmm_models.py`
-b SERIALIZED_DATABASE, --serialized_database SERIALIZED_DATABASE
path/to/database.pkl cannot be used with -d/--database_directory. Database should be pickled dictionary {name:hmm}
https://github.com/jolespin/pyhmmsearch重要参数解释:
参数 | 说明 |
|---|---|
-h, --help | 显示帮助信息并退出。 |
-v, --version | 显示 PyHMMSearch 版本信息并退出。 |
-i PROTEINS, --proteins PROTEINS | 指定输入蛋白质序列文件,格式为 FASTA;也支持从标准输入读取,但所有数据会加载至内存中。 |
-o OUTPUT, --output OUTPUT | 指定输出结果文件路径,输出格式为 TSV;默认输出至标准输出。 |
--no_header | 输出结果时不包含表头信息。 |
--tblout TBLOUT | 输出 HMMER 风格的 tblout 格式结果文件。 |
--domtblout DOMTBLOUT | 输出 HMMER 风格的 domtblout 格式结果文件,用于记录结构域水平匹配信息。 |
-p N_JOBS, --n_jobs N_JOBS | 设置并行计算线程数,默认值为 1。 |
-s SCORES_CUTOFF, --scores_cutoff SCORES_CUTOFF | 指定自定义 score 阈值文件,格式为 [id_hmm]<tab>[score_threshold],不包含表头;支持 .tsv 或 .tsv.gz 文件。 |
-f {accession,name}, --hmm_marker_field {accession,name} | 指定 HMM 模型标识字段,可选择 accession 或 name,默认使用 accession。 |
-t {domain,full}, --score_type {domain,full} | 指定评分类型,可选择 full(完整蛋白评分)或 domain(结构域评分),默认使用 full。 |
-m {trusted,noise,e,gathering}, --threshold_method {trusted,noise,e,gathering} | 指定 HMM 搜索结果筛选阈值类型,包括 trusted(可信阈值)、noise(噪声阈值)、e(E-value 阈值)和 gathering(模型推荐阈值),默认使用 e。 |
-e EVALUE, --evalue EVALUE | 设置 E-value 筛选阈值,默认值为 10.0。 |
-d HMM_DATABASE, --hmm_database HMM_DATABASE | 指定 HMM 数据库文件路径,需要提供合并后的 .hmm 文件。 |
-b SERIALIZED_DATABASE, --serialized_database SERIALIZED_DATABASE | 指定序列化后的 HMM 数据库文件路径,例如 .pkl 或 .pkl.gz 文件。 |
说明:
-d 和 -b 都用于指定 KOfam 数据库,但二者的数据库加载方式不同。-d 用于直接指定官方 KOfam 数据库目录,适合直接使用下载后的原始数据库文件;-b 用于指定预先序列化的数据库文件,可减少重复读取和解析大量 HMM 模型的开销,更适合大规模蛋白质注释任务。-d 和 -b 不能同时使用,只能二选一。
实战演练
# 示例蛋白序列:https://ftp.ncbi.nlm.nih.gov/genomes/all/GCF/000/005/845/GCF_000005845.2_ASM584v2/GCF_000005845.2_ASM584v2_protein.faa.gz
# 去除序列ID后的注释信息
seqkit replace -p '\s.*' -r '' GCF_000005845.2_ASM584v2_protein.faa.gz -w 0 > ASM584v2_protein.faa
# 方式 1:输出 PyHMMSearch 整理后的全部命中结果
pyhmmsearch -i ASM584v2_protein.faa -o PyHMMSearch_Pfam_all.tsv -p 16 -b ./db/Pfam/PyHMMSearch.pkl.gz
# 方式 2:同时输出整理结果、序列级结果和结构域级结果
pyhmmsearch -i ASM584v2_protein.faa -o PyHMMSearch_Pfam_all.tsv --tblout PyHMMSearch_Pfam.tblout.tsv --domtblout PyHMMSearch_Pfam.domtblout.tsv -p 16 -b ./db/Pfam/PyHMMSearch.pkl.gz说明: PyHMMSearch 还提供了其他丰富参数和高级功能,本文仅介绍其中较为常用的核心参数及基本使用方法,旨在帮助用户快速了解工具的主要功能和应用流程,起到抛砖引玉的作用。更多详细命令和参数设置,读者可结合官方文档、AI 辅助工具以及实际研究需求进行灵活调整,以满足不同数据规模和分析场景的需求。
结果解读
1.结果文件
# 查看结果
tree -h
.
├── [1.3M] ASM584v2_protein.faa
├── [881K] GCF_000005845.2_ASM584v2_protein.faa.gz
├── [1.4M] PyHMMSearch_Pfam_all.tsv
├── [6.7M] PyHMMSearch_Pfam.domtblout
└── [3.2M] PyHMMSearch_Pfam.tblout.tsv文件说明
文件 | 分辨水平 | 主要用途 |
|---|---|---|
PyHMMSearch_Pfam_all.tsv | 注释结果 | 最常用,用于功能统计分析 |
PyHMMSearch_Pfam.tblout.tsv | 蛋白水平 | 查看蛋白-HMM整体匹配信息 |
PyHMMSearch_Pfam.domtblout | 结构域水平 | 查看具体结构域位置和组成 |
2.查看结果内容
# 查看结果
csvtk pretty -t PyHMMSearch_Pfam_all.tsv | head 
列名 | 含义 | 结果解读 |
|---|---|---|
id_protein | 输入蛋白质序列 ID | 如 NP_416317.1,表示进行 HMM 搜索和功能注释的目标蛋白序列。 |
id_hmm | 命中的 HMM 模型编号,通常对应 Pfam accession | 如 PF00389.37,表示该蛋白与 Pfam 数据库中的 PF00389 模型匹配,可进一步查询对应蛋白家族或结构域功能。 |
threshold | HMM 搜索结果采用的筛选阈值类型 | 用于表示当前结果采用的筛选标准,如 E-value 阈值、gathering cutoff、trusted cutoff 等。本结果为空时,通常表示使用默认 E-value 筛选。 |
score | 蛋白序列与 HMM 模型比对得到的 bit score | 分值越高,表示蛋白序列与该 HMM 模型的匹配程度越高。通常 score 越高代表同源关系越可靠。 |
bias | HMMER 计算的序列组成偏差校正值 | 用于评估低复杂度区域或异常氨基酸组成对匹配结果的影响。数值较低通常表示结果受组成偏差影响较小。 |
best_domain_score | 蛋白中最佳匹配结构域的 bit score | 表示该蛋白内得分最高的结构域匹配情况,适用于多结构域蛋白分析。 |
best_domain_bias | 最佳匹配结构域的组成偏差校正值 | 反映最佳结构域匹配过程中序列组成偏差的影响,数值越低表示可信度越高。 |
e-value | HMM 比对的统计显著性值 | 数值越小,表示随机情况下获得该匹配的可能性越低,说明该蛋白与 HMM 模型之间的同源关系越显著。 |
description | HMM 模型对应的功能描述 | 给出 Pfam 数据库中该结构域或蛋白家族的功能注释信息,可用于推断蛋白潜在功能。 |
参考文献