Repository navigation
2. Using DUMMEST
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).
Using the Apptainer image
apptainer exec dummest.sif dummest profile.hmm profile.msa queryDNA.fa 8 > out.mafRunning directly
python3 bin/dummest profile.hmm profile.msa queryDNA.fa 8 > out.mafThe 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.mafWhen running directly, the GPU is selected automatically when one is present, so no extra flag is needed.
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.mafRunning directly
DUMMEST_TMP=/scratch/tmp python3 bin/dummest profile.hmm profile.msa queryDNA.fa 8 > out.mafYour 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.mafThe 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.mafRunning directly
python3 bin/dummest samples/MET-test.hmm samples/MET.msa samples/MET-target.fa 8 > out.mafA 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
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.
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 --maxRunning directly
python3 bin/dummest profile.hmm profile.msa queryDNA.fa 8 --maxProfiles are built with hmmbuild, which ships with HMMER3 (install it with, e.g., sudo apt install hmmer).
hmmbuild --amino data/profile.hmm data/profile.msaFrameshift and indel probabilities are not set when building the profile; they are passed to DUMMEST as program parameters at search time.
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.
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.mafRunning directly
DUMMEST_CACHE_DIR=/scratch/dummest-cache python3 bin/dummest profile.hmm profile.msa queryDNA.fa 8 > out.mafThresholds 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.