Skip to content

2. Using DUMMEST

Harvey Chua edited this page Oct 12, 2026 · 12 revisions

Input

DUMMEST needs three input files:

  • a protein profile in HMMER3/f format (profile.hmm),
  • the protein alignment that profile was built from, in Stockholm format (profile.msa), and
  • a (multi-)FASTA file containing query DNA sequences (queryDNA.fa).

Running DUMMEST

Using the Apptainer image
apptainer exec dummest.sif dummest profile.hmm profile.msa queryDNA.fa 8 > out.maf
Running directly
python3 bin/dummest profile.hmm profile.msa queryDNA.fa 8 > out.maf

The last argument (8) is the number of CPUs to use.

If you have an NVIDIA GPU, add --nv to accelerate pre-filtering with MMseqs2:

Using the Apptainer image
apptainer exec --nv dummest.sif dummest profile.hmm profile.msa queryDNA.fa 8 > out.maf

When running directly, the GPU is selected automatically when one is present, so no extra flag is needed.

Temporary files and mounts

Temporary files go to a .dummest-cache directory by default. DUMMEST_TMP is an environment variable that overrides the workspace — useful when that directory is small or on a shared filesystem:

Using the Apptainer image
apptainer exec --env DUMMEST_TMP=/scratch/tmp dummest.sif \
    dummest profile.hmm profile.msa queryDNA.fa 8 > out.maf
Running directly
DUMMEST_TMP=/scratch/tmp python3 bin/dummest profile.hmm profile.msa queryDNA.fa 8 > out.maf

Your working directory, $HOME, and /tmp are visible inside the container automatically, so relative paths from your data directory work as-is. Data anywhere else needs an explicit mount of the form --bind <host-dir>:<container-dir>, where <host-dir> is the path on your machine (e.g. an external drive) and <container-dir> is where it becomes visible inside the container:

Using the Apptainer image
# /scratch/data on your machine -> /mnt/data inside the container
apptainer exec --bind /scratch/data:/mnt/data dummest.sif \
    dummest /mnt/data/profile.hmm /mnt/data/profile.msa /mnt/data/queryDNA.fa 8 > out.maf

Try it on the bundled sample data

The image ships with a small test case built in at /samples. The example below runs CPU-only; pass --nv (see above) to accelerate it with a GPU.

Using the Apptainer image
apptainer exec dummest.sif dummest /samples/MET-test.hmm \
    /samples/MET.msa /samples/MET-target.fa 8 > out.maf
Running directly
python3 bin/dummest samples/MET-test.hmm samples/MET.msa samples/MET-target.fa 8 > out.maf

A successful run exits with status 0 and prints MAF records like the example under Output.

TODO this did not engage my GPU. maybe just the intel integrated one. had to force it by passing env CUDA_VISIBLE_DEVICES=0

Output

Results are written to standard output as MAF-format records; the examples above redirect them to out.maf. Informational lines are prefixed with #, and MMseqs2 prints its own logging as well; neither is part of the MAF output.

Each MAF record consists of an a line giving the score, E-value, and anchor coordinates, followed by two s lines showing a representative alignment of the profile and the sequence:

a score=164.79744 E=1.51809e-44 anchor=141,960
s metC  69  393 +   467 A--R--L--D--S--V--N--E--V--E--A-- ... --L--D--D--L--I--W--D--L--E--K
s seq2 741 1187 - 35613 AACAGAATCGATTACTTGAATAAAAAGAAT ... AAGATCTCAATGGTCTGACAAATGATTTAGATA

(Alignment rows are truncated here for readability. seq2 is one of the contigs in the bundled sample data.)

DUMMEST prints one MAF record per significant profile-DNA hit.

Prefilter and --max

By default, DUMMEST runs an MMseqs2 prefilter first, narrowing the query to candidate windows before the full alignment. Add --max to skip it and align against every contig on both strands (slower, maximum sensitivity):

Using the Apptainer image
apptainer exec dummest.sif dummest profile.hmm profile.msa queryDNA.fa 8 --max
Running directly
python3 bin/dummest profile.hmm profile.msa queryDNA.fa 8 --max

Building a profile HMM

Profiles are built with hmmbuild, which ships with HMMER3 (install it with, e.g., sudo apt install hmmer).

hmmbuild --amino data/profile.hmm data/profile.msa

Frameshift and indel probabilities are not set when building the profile; they are passed to DUMMEST as program parameters at search time.

Options

The MMseqs2 search runs in two stages — an ungapped prefilter, then a gapped (Smith-Waterman) alignment of whatever survives — each with its own significance threshold.

--gpu auto|on|off (default: auto) selects MMseqs2's device. Inside the container you still need apptainer --nv (see above) for the GPU to be visible.

Thread count is the fourth positional argument, not a flag: dummest profile.hmm profile.msa queryDNA.fa 8 uses 8 CPUs. It sets the thread count for seqkit translate, the MMseqs2 steps, and DUMMEST (-T).

Other options
  • --ungapped-pvalue F (default: 0.02): significance threshold for the ungapped prefilter (stage 1). Ignored with --max.
  • --gapped-pvalue F (default: 0.005): significance threshold for the gapped alignment (stage 2). Ignored with --max.
  • --evalue F (default: 10): DUMMEST E-value threshold for reported hits.
  • --batch N (default: 800000): number of sequences per DUMMEST stream chunk; lowering it forces multi-chunk streaming (less memory, more per-chunk overhead).

Run dummest --help for all remaining options.

Cache

DUMMEST stores estimated calibration parameters in a .dummest-cache directory (under $HOME by default). DUMMEST_CACHE_DIR is an environment variable that overrides this location — on shared filesystems (e.g. an HPC home directory) point it at node-local scratch so parallel runs do not clash.

Using the Apptainer image
apptainer exec --env DUMMEST_CACHE_DIR=/scratch/dummest-cache dummest.sif \
    dummest profile.hmm profile.msa queryDNA.fa 8 > out.maf
Running directly
DUMMEST_CACHE_DIR=/scratch/dummest-cache python3 bin/dummest profile.hmm profile.msa queryDNA.fa 8 > out.maf

Frameshift, stop codon, and masking thresholds

Thresholds and defaults

These options override the built-in defaults (current values in parentheses):

  • --insert1 F (default: 0.0171): 1-base insertion rate.
  • --insert2 F (default: 0.0018): 2-base insertion rate.
  • --delete1 F (default: 0.0328): 1-base deletion rate.
  • --delete2 F (default: 0.0083): 2-base deletion rate.
  • --stop-codon-prob F (default: 0.0005): stop codon probability.
  • --bg-stop-codon-prob F (default: 0.046875): background stop codon probability.
  • --tantan-threshold F (default: 0.5): tantan simple-region masking threshold.

The indel defaults are approximated from Badread's nanopore2020 error model (Oxford Nanopore R9.4.1) at 90% target identity.

Clone this wiki locally