HMMER is a biological sequence analysis tool that uses profile hidden Markov models to search for sequence homologs. HMMER3 is maintained by members of the the Eddy/Rivas Laboratory at Harvard University.
pyhmmer is a Python module, implemented using the Cython
language, that provides bindings to HMMER3. It directly interacts with the
HMMER internals, which has the following advantages over CLI wrappers
single dependency: If your software or your analysis pipeline is
distributed as a Python package, you can add
pyhmmeras a dependency to your project, and stop worrying about the HMMER binaries being properly setup on the end-user machine.
no intermediate files: Everything happens in memory, in Python objects
you have control on, making it easier to pass your inputs to HMMER without
needing to write them to a temporary file. Output retrieval is also done
in memory, via instances of the
no input formatting: The Easel object model is exposed in the
pyhmmer.easelmodule, and you have the possibility to build a
DigitalSequenceobject yourself to pass to the HMMER pipeline. This is useful if your sequences are already loaded in memory, for instance because you obtained them from another Python library (such as Pyrodigal or Biopython).
no output formatting: HMMER3 is notorious for its numerous output files
and its fixed-width tabular output, which is hard to parse (even
Bio.SearchIO.HmmerIOis struggling on some sequences).
hmmsearchon sequences and HMMs in disk storage is typically as fast as directly using the
hmmsearchbinary (see the Benchmarks section).
pyhmmer.hmmer.hmmsearchuses a different parallelisation strategy compared to the
hmmsearchbinary from HMMER, which can help getting the most of multiple CPUs when annotating smaller sequence databases.
This library is still a work-in-progress, and in an experimental stage,
but it should already pack enough features to run biological analyses or
pyhmmer can be installed from PyPI,
which hosts some pre-built CPython wheels for x86-64 Linux, as well as the
code required to compile from source with Cython:
$ pip install pyhmmer
Compilation for UNIX PowerPC is not tested in CI, but should work out of the box. Other architectures (e.g. Arm) and OSes (e.g. Windows) are not supported by HMMER.
A Bioconda package is also available:
$ conda install -c bioconda pyhmmer
$ pydoc pyhmmer.easel $ pydoc pyhmmer.plan7
pyhmmer to run
hmmsearch, and obtain an iterable over
TopHits that can be used for further sorting/querying in Python.
Processing happens in parallel using Python threads, and a
object is yielded for every
HMM passed in the input iterable.
import pyhmmer with pyhmmer.easel.SequenceFile("tests/data/seqs/938293.PRJEB85.HG003687.faa", digital=True) as seq_file: sequences = list(seq_file) with pyhmmer.plan7.HMMFile("tests/data/hmms/txt/t2pks.hmm") as hmm_file: all_hits = list(pyhmmer.hmmsearch(hmm_file, sequences_file, cpus=4))
Have a look at more in-depth examples such as building a HMM from an alignment, analysing the active site of a hit, or fetching marker genes from a genome in the Examples page of the online documentation.
⚠️ Issue Tracker
Found a bug ? Have an enhancement request ? Head over to the GitHub issue tracker if you need to report or ask something. If you are filing in on a bug, please include as much information as you can about the issue, and try to recreate the same bug in a simple, easily reproducible situation.
Contributions are more than welcome! See
CONTRIBUTING.md for more details.
Benchmarks were run on a i7-10710U CPU running @1.10GHz with 6 physical / 12
logical cores, using a FASTA file containing 2,100 protein sequences extracted
from the genome of Anaerococcus provencensis
and the version 33.1 of the Pfam HMM library containing
18,259 domains. Commands were run 4 times on a warm SSD. Plain lines show
the times for pressed HMMs, and dashed-lines the times for HMMs in text format.
Raw numbers can be found in the
They suggest that
phmmer should be run with the number of logical cores,
hmmsearch should be run with the number of physical cores (or less).
A possible explanation for this observation would be that HMMER
platform-specific code requires too many SIMD
registers per thread to benefit from simultaneous multi-threading.
To read more about how PyHMMER achieves better parallelism than HMMER for many-to-many searches, have a look at the Performance page of the documentation.
🔍 See Also
Building a HMM from scratch? Then you may be interested in the
package, providing bindings to FAMSA,
a very fast multiple sequence aligner. In addition, you may want to trim alignments:
in that case, consider
wraps trimAl 2.0.
If despite of all the advantages listed earlier, you would rather use HMMER
through its CLI, this package will not be of great help. You can instead check
hmmer-py package developed
by Danilo Horta at the EMBL-EBI.
This project is in no way affiliated, sponsored, or otherwise endorsed by the original HMMER authors. It was developed by Martin Larralde during his PhD project at the European Molecular Biology Laboratory in the Zeller team.