development version¶
#656: Report tandem duplications in single-end mode as one SAM record per copy instead of as a large insertion (options
--dl,--dmand--dw, see the README). Strobealign now also supports multiple records per read with anSA:Ztag.#685: Add
--be(default 10000, 0 for no limit) to cap how far a chain is extended towards the read ends. This halves peak memory on HG002 ONT reads, from 26 to 13 GiB.#674: Implemented a score drop early stop heuristic for the piecewise start/end extensions: an extension now stops where its score has dropped too far below the best running score, which speeds up extension into read ends that the reference does not explain. The threshold is a parameter (
--bd, default 1036, which matches the default--bwand gap costs),--bd 0disables it.#686: Avoid unbounded memory usage when data cannot be written to the output as fast as reads are mapped (that is, when the output file/stdout blocks).
v0.20.0 (2026-11-06)¶
#671 (and #669): Fixed the algorithm used for converting N wildcards to random nucleotides. This affects GRCh38, for which the index now needs 0.5 GB less RAM.
#677: Add
--exclude-altoption for excluding contigs from the reference that appear to be GRCh38 ALT contigs.#642: Prefetch index lookups, speeding up mapping by ~7%.
#675: Fix very slow chaining on references with many contigs (hundreds of thousands). Contributed by rhysnewell.
v0.19.1 (2026-10-19)¶
#666: Fix slow indexing of GRCh38.
#646: Speed up chaining slightly by avoiding some computations.
v0.19.0 (2026-10-08)¶
This release improves mapping speed, in particular when mapping paired-end reads, improves indexing speed, and reduces memory usage. Accuracy remains mostly unchanged.
#614: The piecewise extension for single-end reads now uses a custom SIMD aligner, extension length is controlled by a bandwidth parameter (
--bw, default 1024) in place of--xdrop.#632: Use the piecewise aligner even in paired-end mode.
#628/#619: Fix some incorrect alignments caused by invalid anchors (which arise due to hash collisions). These anchors are now removed from the chain they are in before computing the alignment.
#639: Speed up chaining by bit-packing anchors into a single 64-bit value. With this, the maximum reference size is now 17 Tbp and the maximum read length is 1 Mbp.
#648: Speed up indexing by about 20% by eliminating a pass over the reference.
#636: Reduce RAM usage for large, repetitive genomes
v0.18.0 (2026-09-01)¶
Strobealign has been ported to Rust. The Rust version is at least as fast and accurate as the C++ version. There are currently some regressions due to the port:
The Rust version cannot saturate more than about 30-35 cores. Please see issue 561.
Option
--index-statisticsis not implemented (this will likely not come back unless someone requests it).There are no Python bindings. These were used for experimenting with the algorithm, but Rust makes it easier to do these experiments directly in Rust.
If you need one of the above features, use version 0.17.0 for now.
In addition, the following functional changes have been made:
Options
--namshas been removed.#550: Introduce “piecewise“ extension alignment for single-end reads. The previous SSW extension can be enabled with
--ssw.#595: The in-memory representation of the reference sequence now uses two bits per nucleotide, reducing memory usage of the reference to 25% of its previous size. This change does not affect runtime.
#607: The reference is now stored as a single concatenated string of all contigs. Reference coordinates now use a single 64-bit value. This means that there are no longer any (relevant) limitations on the number and lengths of contigs.
#539: Add a “noisy” read profile. Use
-P noisyon the command line to select it. This is equivalent to-k 16 -s 12 -l 2 -u 2 -m 100. We found these settings to increase accuracy on error-prone reads (at the cost of runtime).#596: Fix not properly paired reads getting MAPQ 60 even if there were alternative equally good mapping locations.
#624: Fix for secondary alignments: Secondary alignments are now output if their score is at least 0.95 times the score of the primary alignment. This “secondary threshold” can now be set with command-line option
--st.
v0.17.0 (2025-12-18)¶
#504: Introduce collinear chaining as the new default mapping and alignment method, replacing NAMs. This reproduces the Minimap2 chaining algorithm providing better mapping accuracy. NAMs remain available via the
--namsflag. Contributed by NicolasBuchin.#527: Improve accuracy by changing the default multi-context seed strategy from “rescue” to “always”. This means that a partial seed lookup is done every time a full seed cannot be found (whereas previously, it was done only if no full seed was found for the entire query).
#521: Implement a “local” rescue of highly repetitive hits (similar to minimap2): Highly repetitive hits are usually filtered out because they increase runtime significantly. If there are too many filtered hits, we previously added back the least frequent ones of them (global rescue). Now, we implemented a minimap2-like “local” rescue that finds regions consisting of consecutive filtered hits and adds some of them back if the region is longer than a provided threshold. The
-Rcommand-line option is used to provide that threshold. (Use-R 0to disable both global and local rescue.)#515: PAF output now includes a sensible value for the mapping quality (last column), computed using the formula that minimap2 uses. It was previously set to 255, which means “missing”.
#525: The
-lund-ucommand-line options have changed meaning: They are now used to set how many syncmers downstream the second syncmer may be. Negative values are no longer allowed.#530: Fix a memory leak when option
-ris used to explicitly set read length.
v0.16.1 (2025-05-16)¶
#497: Fix a crash on macOS (ARM) and possible undefined behavior on Linux.
v0.16.0 (2025-04-11)¶
#476: Improve accuracy by enabling (by default) a variant of multi-context seeds: When no regular seeds - which consist of two strobes - can be found for the entire query, strobealign now always attempts to find single-strobe (“partial”) seeds. The
--mcsoption is still available for now. It is a bit slower, but slightly more accurate.#492: Switch to “asymmetric randstrobes”, which makes the code simpler and even leads to some speedups and increased accuracy for very short reads.
#489: Speed up mapping by a few percent by avoiding to process repetitive hits any further as soon it is clear that we need to start over with different thresholds anyway.
#468: Be less strict when checking reference sequence names.
v0.15.0 (2024-12-13)¶
#388 and #426: Increase accuracy and mapping rate for reads shorter than about 200 bp by introducing multi-context seeds. Previously, seeds always consisted of two k-mers (“strobes”) and would only be found if both occur in query and reference. With this change, strobealign falls back to looking up just one of the k-mers when appropriate. This feature is currently experimental and only enabled when using the
--mcscommand-line option. Contributed by Ivan Tolstoganov (Itolstoganov).#421: Allow references with up to 2^32 contigs (instead of 2^23 previously) by changing the way randstrobes are stored in the index.
#467: Reading a reference with many small references was sped up. Contributed by luispedro.
v0.14.0 (2024-10-03)¶
#401: The default number of threads is now 1 instead of 3.
#409: Ensure reference names are unique and conform to the SAM specification. Contributed by drtconway in PR #411.
#269, #418: Strobealign scales now much better to systems with many cores. Previously, decompressing gzipped-compressed input files was a bottleneck starting at about 30 threads. We now use ISA-L for decompression, which is about three times as fast as zlib, and decompression is also done in a separate thread. We tested up to 128 cores, and strobealign was still able to use all cores. Contributed by telmin.
#447: Switched to a new way for hashing randstrobes in preparation for the introduction of multi-context seeds. Pre-generated index files (
.stifiles) therefore need to be re-generated. (Strobealign will complain if you try to use an outdated index file.) This reduces the number of allowed contigs in a reference from previously 2^24 to 2^23.
v0.13.0 (2024-03-04)¶
#394: Added option
--aemb(abundance estimation for metagenomic binning), which makes strobealign output a table with estimated abundance values for each contig (instead of SAM or PAF). This was contributed by Shaojun Pan (psj1997).#386: Parallelize indexing even more by using alugowski’s poolSTL
pluggable_sort. Indexing a human reference (measured on CHM13) now takes only ~45 s on a recent machine (using 8 threads).#376: Improve accuracy for read length 50 by optimizing the default indexing parameters. Paired-end accuracy increases by 0.3 percentage points on average. Single-end accuracy increases by 1 percentage point.
#395: Previously, read length 75 used the same indexing parameters as length 50, but the improved settings for length 50 are not the best for length 75. To avoid a decrease in accuracy, we introduced a new set of pre-defined indexing parameters for read length 75 (a new canonical read length).
If
--detailsis used, outputX0:iSAM tag with the number of identically-scored best alignments#378: Added
-Coption for appending the FASTA or FASTQ comment to SAM output. (Idea and name of the option taken from BWA-MEM.)#371: Added
--no-PGoption for not outputting the PG SAM headerInclude ZStr in our own repository instead of downloading it at build time. This should make it possible to build strobealign without internet access.
v0.12.0 (2023-11-23)¶
#293: Fix: When mapping single-end reads, many multimappers were previously assigned a high mapping quality. They now get assigned mapping quality zero as intended.
#321: Fix: For paired-end reads that cannot be placed as proper pairs, we now prefer placing them onto the same chrosome instead of on different ones if there is a choice.
#328: Adjust MAPQ computation for single-end reads.
#318: Added a
--detailsoption mainly intended for debugging. When used, some strobealign-specific tags are added to the SAM output that inform about things like no. of seeds found, whether mate rescue was performed etc.#333: Fix matches ending too early in PAF output.
#359, #367: Assign (single-end and paired-end) multimappers randomly to one of the candidate mapping locations to reduce biases.
#347: Reduce memory usage by avoiding an unnecessary copy of reference contigs.
v0.11.0 (2023-06-22)¶
#278: Memory usage was reduced drastically due to a redesigned strobemer index memory layout. For the human genome, for example, RAM usage was reduced from 23 to 13 GiB. (Other changes increased RAM usage again slightly, see below.)
Idea and implementation for this substantial improvement were contributed by Shaojun Pan (psj1997) (supervised by Luis Pedro luispedro) and originate in his work on a “strobealign-lm” (low memory) branch of strobealign. Thanks!
#277, #285, PR #306: Support for very large references (exceeding ~20 Gbp) was added by switching from 32 bit to 64 bit strobemer indices. This was also enabled and made simpler by the memory layout changes. This increases RAM usage by 1 GiB for human-sized genomes.
#313: Increased accuracy (especially on short single-end reads) due to “more random” syncmers. This increases memory usage again slightly so that we are at 14.7 GiB RAM usage for the human genome for this version of strobealign.
#307: Indexing was further parallelized, cutting the time for index generation in about half for many cases.
#289: Fixed missing CIGAR for secondary alignments.
#212: SEQ and QUAL are set to
*for secondary alignments as recommended by the SAM specification.#294: Updated the alignment library (SSW), which fixes some incorrect alignments.
v0.10.0 (2023-06-05)¶
#258: Fixed compilation on MinGW. Thanks teepean.
#260: Include full command line in the SAM PG header. Thanks telmin.
#20: By default, emit
MCIGAR operations instead of=andX. Added option--eqxto use=andXas before.#265: Fixed overflowing read count statistics when processing 231 reads or more. Thanks telmin.
#273: Fix handling of interleaved files using
/1or/2suffixes
v0.9.0 (2023-03-16)¶
Added progress report (only shown if output is not a terminal; can be disabled with
--no-progress)PR #250: Avoid overeager soft clipping by adding an “end bonus” to the alignment score if the alignment reaches the 5’ or 3’ end of the read. This is equivalent to penalizing soft-clipping and improves mapping accuracy, in particular for short reads, as candidate mapping sites with and without soft clipping are compared more fairly. Use
-Lto change the end bonus. (This emulates a feature found in BWA-MEM.)Issue #238: Fixed occasionally incorrect soft clipping.
PR #239: Fixed an uninitialized variable that could lead to nondeterministic results.
Issue #137: Compute TLEN (in SAM output) correctly
PR #255: Added support for reading gzip-compressed reference FASTA files.
Issue #222: Made it possible again to build strobealign from the release tarball (not only from the Git repository).
v0.8.0 (2023-02-01)¶
Summary¶
This is a large release with over 600+ commits since the previous one (0.7.1). Much of the work that went into it was enabled by a Bioinformatics Long-Term Support grant through National Bioinformatics Structure Sweden (NBIS), which is the SciLifeLab Bioinformatics platform.
A majority of the commits was focused on reorganizing the code to make it easier to maintain, to read, to test and to change. This has already paid off in the form of external contributions that would have been more difficult without those changes.
Another focus was on usability and standards compliance: SAM output follows
the SAM specification more closely, error messages are better, there is
now a --help command-line option, some irrelevant logging output was
hidden, and the documentation was updated.
Mapping speed and accuracy remain mostly unaffected in this release, except for one bugfix that increases mapping rate and accuracy at short read lengths (<100 bp). Also, some unintended coverage spikes no longer occur.
Memory usage was decreased due to switching to a modified in-memory representation of the index. For the human genome, for example, RAM usage went from 28 GiB to 21 GiB. The reduction is smaller for more repetitive genomes.
Strobealign also gained the ability to pre-generate an index and save it to disk. As indexing is quite fast, this is not as relevant as it is for other read mappers, but important when processing many small libraries.
Features¶
PR #191 and PR #192: RAM usage was reduced significantly. For the human genome, for example, it went from from 28 GiB to 21 GiB. (Mapping runtime is unaffected.)
Issue #121: Deterministic output: Mapped reads are now output in the order that they had in the input (this was previously not the case when using more than one thread).
PR #48, PR #195: The index can now be pre-generated and saved to disk (
--create-indexand--use-index).Added
-h/--helpoptions.Added
--versionoption.Issue #31: Added
--rg-idoption for adding read group IDs to each SAM record, and added--rgoption for adding read group metadata (sample, library etc.) to the SAM header (example:--rg 1 --rg SM:mysamplesets read group id to “1” and the sample name to “mysample”).Suppress some logging output by default, and added option
-vfor showing full logging output.Issue #206: Added option
-Ufor suppressing output of unaligned reads. Thanks sjaenick.PR #213: Add support for interleaved reads. Thanks luispedro.
PR #213: Add support for reading from a pipe (including stdin). Thanks luispedro.
Bug fixes¶
Issue #121: When more than one thread is used, changed behavior so that alignments are output in the order that the reads had in the input file.
PR #114: Fix read-length estimate on input files with few reads.
PR #78: Fixed incorrect template length (TLEN) sign.
Issue #56: Unmapped reads did not have quality values in the SAM output.
PR #65: Fixed a logic error. This changes some mapping qualites.
Issue #141: Remove
/1and/2suffixes from read names if they exist.Issue #142: Template length (TLEN) should be zero when the two reads in a pair map to different contigs.
PR #149: Set mapping quality of unmapped reads to 0 for compatibility with Picard.
Issue #148: Fixed SAM output when one read in a pair is mapped and the other not.
Issue #141: Remove any
/1and/2suffixes from read names.Invalid or missing input files no longer lead to a crash.
Issue #199: No longer (inadvertently) ignore the
-land-ucommand-line options.
Developer-oriented changes¶
Switched to using a third-party library for parsing command-line arguments
Reorganized the source code (a lot).
In particular, moved unused code into
unused.cpp.Started using a unit testing library
Added Continuous Integration tests (GitHub Actions) for Linux and macOS.
Switched to CMake as main build system.
Maintain the version number in only one place (
CMakeLists.txt).Add a simple
dumpstrobescommand-line utility that produces a BED file with the locations of all seeds (randstrobes).
Other changes¶
There is now a Conda package for strobealign on Bioconda.
Issue #34: Disabled AVX2 CPU instructions by default as they are sometimes not available. Re-enable by running
cmakewith-DENABLE_AVX=ON.Added a changelog.
v0.7.1 (2022-04-17)¶
Changed to MIT license.