Recipes#
This page references recipes for common operations for the PyHMMER API, similarly to the itertools
recipes from the Python documentation.
Loading multiple HMMs#
An adapter for loading several HMMFile
objects into a single object to pass to .
Credits
The original implementation proposed by Zachary Kurtz in #24, which was failing when too many file-descriptors where open on some OS (#48), was updated to keep at most a single file open at a time.
[1]:
import contextlib
import itertools
import os
import typing
from pyhmmer.plan7 import HMMFile, HMM
class HMMFiles(typing.Iterable[HMM]):
def __init__(self, *files: typing.Union[str, bytes, os.PathLike]):
self.files = files
def __iter__(self):
for file in self.files:
with HMMFile(file) as hmm_file:
yield from hmm_file
To use it with hmmsearch
, simply create a HMMFiles
object with the paths for the different HMM files to concatenate. They will be read in the order given as argument.
[2]:
import pyhmmer
from pyhmmer.easel import SequenceFile
with SequenceFile("data/seqs/938293.PRJEB85.HG003687.faa", digital=True) as sequences:
targets = sequences.read_block()
hmm_files = HMMFiles("data/hmms/txt/PKSI-AT.hmm", "data/hmms/txt/LuxC.hmm")
all_hits = list(pyhmmer.hmmsearch(hmm_files, targets))
print("HMMs searched:", len(all_hits))
print("Hits found: ", sum(len(hits) for hits in all_hits))
HMMs searched: 2
Hits found: 2
If your filenames are stored in a list, just use the splat operator to unpack it:
[3]:
filenames = ["data/hmms/txt/PKSI-AT.hmm", "data/hmms/txt/LuxC.hmm"]
hmm_files = HMMFiles(*filenames)