This release focuses on performance, Java modernization, and reliability, building on the compression and build-system work from v0.40.
New Features
-
Verbose Adapter Reporting: Added a
-verboseflag (placed after PE/SE, before the input files) that reports a per-adapter breakdown of how many reads each specific adapter sequence removed, sorted from most to least frequent. (#9) -
Simplified Invocation Mode: Trimmomatic can now be run with just the input file(s) — no explicit trimming steps or thread count required. It auto-detects available processor threads and applies sensible default steps (
ILLUMINACLIP:<fastaWithAdaptersEtc>:2:30:10 SLIDINGWINDOW:4:20 MINLEN:36), writing automatically-named output files alongside the input. To make this work reliably across different install layouts, ILLUMINACLIP's adapter file lookup was extended to check anadapters/subdirectory in the current working directory, in addition to the existing lookup next to the JAR and in the CWD itself. -
More Robust Compressed Input: Replaced the bundled Jbzip2 library with Apache Commons Compress, adding correct support for concatenated bzip2 streams (e.g. files produced via
cat a.bz2 b.bz2 > combined.bz2) — previously only the first stream in the file was read.
Performance & Correctness
-
Bug Fix: Corrected
calculateMaximumRangeinIlluminaClippingTrimmer, which had allowed a small number of reads very close to the adapter alignment boundary to be retained incorrectly. The effect is minimal — in our benchmarking on a 33.3M-read-pair human dataset, this changed the outcome for 1,309 pairs (0.004%). (#28) -
Java 25: Trimmomatic now targets Java 25 (up from Java 8), taking advantage of virtual threads (used to open paired-end input files in parallel) and other JVM runtime improvements. Running v0.41 requires a Java 25 runtime or newer.
-
Extensive Performance Work: Numerous optimizations across the hot path — pre-computed adapter packing in
IlluminaClippingTrimmer, reduced allocations inFastqRecord/FastqSerializer, a widened threaded-pipeline task queue, pre-sized buffers in the compression path, and array-based lookups inBarcodeSplitterand a fix for aStringIndexOutOfBoundsExceptionwhen a read is shorter than a barcode sequence in mismatch-tolerant mode.
We benchmarked v0.41 against v0.40 across 1–128 threads on both a plant and a human wgs dataset:
- At low thread counts (1–8), v0.41 is meaningfully faster — a mean speedup of ~11% on the plant dataset and ~2% on the human dataset, reflecting the single-threaded/low-concurrency optimizations above.
- At high thread counts (16–128), both versions converge as the workload becomes I/O-bound, though v0.41 retains a small edge (~7% mean speedup on plant, ~3% on human).
- v0.41 consistently uses less peak RAM than v0.40, especially on the plant dataset. (The v0.40 human-dataset RAM spike at 32 threads followed by a dip at 64 is a scheduler artifact from the benchmarking run, not a real v0.41 regression.)
Testing & Dependencies
- Added an extensive JUnit test suite, including additional sensitivity/specificity and general over-trimming tests.
- Updated Mockito, ByteBuddy, and JUnit dependencies.
Docker Support
With each release, a Docker container is automatically built and published to the GitHub Container Registry. You can pull the image for this release using the following command:
docker pull ghcr.io/usadellab/trimmomatic:v0.41