flashalign(1) Bioinformatics tools flashalign(1)

flashalign - long-read DNA and spliced RNA alignment against a reference genome

* Indexing the reference (optional):

flashalign index [-x preset] ref.fa [out.faix]
flashalign index [-k kmer] [-s smer] [-I batchSize] ref.fa [out.faix]

* Long-read alignment with CIGAR:

flashalign align -a [-x preset] ref.faix reads.fq > output.sam
flashalign align -c [-x preset] ref.fa reads.fq > output.paf

* Long-read mapping without CIGAR:

flashalign align [-x preset] [-t nThreads] ref.fa reads.fq > output.paf

* Long-read overlap without CIGAR:

flashalign align -x ava-ont [-t nThreads] reads.fq reads.fq > output.paf

* Spliced alignment of long RNA reads:

flashalign align -ax splice ref.fa reads.fq > output.sam

FlashAlign maps long reads to a reference genome: noisy Nanopore reads, accurate long reads such as PacBio HiFi, and long cDNA, direct-RNA and Iso-Seq reads, which it aligns across introns. It outputs in the PAF or SAM format, PAF by default; it writes no BAM, so BAM is made by piping SAM to samtools.

Reads may be FASTA/FASTQ (plain, gzip or BGZF) or BAM/uBAM regular files. Legal additional BGZF extra subfields are accepted. Confirmed BAM container or record damage and non-gzip trailing bytes are errors; a missing final BGZF EOF marker alone warns and succeeds. Discard partial output after an error. Embedded empty BGZF blocks do not end the input.

Seeds are closed syncmers, so an index is defined by the pair (k, s). flashalign index writes a reusable .faix index (ref.fa.faix unless out.faix is given) and records in it the preset it was built with; flashalign align adopts that preset unless -x is given. The target of align may equally be a reference FASTA, which is indexed transiently in memory and never written out. FASTA or FASTQ (plain or gzip) and .faix targets are told apart by content, not by name, and any other file is refused.

The index owns the seeding: align has no -k and no -s. A FASTA target is indexed with the preset's (k, s), a .faix target supplies its own, and mapping under another pair means running flashalign index -k/-s first.

Preset [lr]. It fixes the seeding of the index and is written into it. Available STR are lr (-k21 -s9), lr:hq (-k21 -s5), splice and splice:hq (-k15 -s10), the experimental asm5, asm10 and asm20 (-k21 -s9), and the experimental ava-ont (-k17 -s9) and ava-hifi (-k21 -s5). See Preset options.
Syncmer k-mer length [21], no larger than 23. Every preset maps an index of any such k; Nanopore direct RNA maps on a -k14 splice index. A k-mer that is its own reverse complement, possible at an even value only, is never a seed.
Closed-syncmer s-mer size, 1 to k [9]. A closed syncmer is a k-mer whose minimal s-mer sits at one of its two ends; the seed density is about 2/(k-s+1). A preset's s larger than k is taken as k.
Load at most NUM target bases into RAM for indexing [no split]. If there are more than NUM bases in ref.fa, flashalign needs to read reads.fq multiple times to map it against each batch of target sequences. This would create a multi-part index. NUM may be ending with k/K/m/M/g/G. NB: mapping quality is incorrect given a multi-part index.
Don't store target sequences in the index. It saves disk space and memory but the index generated with this option will not work with -a or -c: it serves plain PAF output only, so SAM output, --cs, --MD and the splice presets refuse it. This option is not listed on the help screen.
Number of threads [all].
Suppress non-error logging, including the version, command line and resource usage printed at the end of the run.
Print the index help message to stdout and exit.

Stop alignment elongation if there are no seeds within NUM-bp [5000]. It bounds how far base alignment extends toward a read end, and under a DNA preset two pieces of a read join into one record only across gaps of at most NUM. Under a DNA preset it is also the maximum gap of chaining, whose reach is never below the chain's band and grows with the read length, so values under the band leave that chain unchanged. The band is -b's first value for the dense chains and its second for the screening chain. Under a splice preset it bounds base alignment and is also the maximum query gap of the fine chain; there -G bounds introns. Untyped, lr uses 5000 for base alignment and 20000 for chaining, lr:hq 10000 for both, the assembly presets 10000 and 20000, and the splice presets 2000 for both; a typed NUM sets both. NUM may be ending with k/K/m/M/g/G.
Bandwidth for base alignment and gap filling [500,20000]. Under a DNA preset, NUM1 is used for alignment extension toward the read ends and for inverted middles, and NUM2 for closing gaps between anchors, both only when base-level alignment runs (-c, SAM); neither bands chaining, which -b sets. A single value sets NUM1 only. Each value may be ending with k/K/m/M/g/G, and NUM1 may not exceed NUM2. Under a splice preset NUM1 is the diagonal band of the fine chain and NUM2 only bounds NUM1; neither bands base alignment there, and -G sets both [200000,200000].
Chaining bandwidth [20000,20000; 100000,20000 on asm5, asm10, asm20]. NUM1 bands each candidate's dense chain over the whole read and NUM2 its bounded screening chain: a chain keeps only the anchors whose diagonal lies within the band of the candidate's, and long reads chain with a reach that grows with their length. It acts on placement, so also on plain PAF output. A single value sets both. Each value may end with k/K/m/M/g/G. The long form is --chain-band. DNA presets only; ava-ont and ava-hifi, which do not partition the read, refuse it.
Discard alignments with chaining score <INT [40; 100 on ava-ont, ava-hifi]. Chaining score equals the approximate number of matching bases minus a concave gap penalty. With a CIGAR the test counts the alignment's matching bases; in plain PAF output it reads the chain score. A rival chain scoring under INT is weighed as scoring INT in the mapping quality; an inverted middle is aligned only when both its spans reach INT; and base alignment trims a bad read end until 2*INT matching bases. At least 1. The long form is --min-chain-score. DNA presets only.
Minimal secondary-to-primary score ratio to output secondary mappings [0.8]. Under a splice preset it retains a rival: a retained rival is aligned, is what md and XA report, and is a record of its own under --secondary=yes. Under a DNA preset it decides which alternative loci enter the ownership selection, which chains attached to an owner are aligned beside it and kept as secondary alignments, and which rival a piece of a split read is weighed against in the mapping quality: one whose chain scores at least FLOAT times the primary's, or within 2k of it.
Retain at most INT secondary alignments [1; splice presets 5]. Under a DNA preset the base-level lane realizes and keeps up to INT rivals per read whether or not they are printed; one prices the mapping quality. -N0 is --secondary=no.
Absolute chain-score band that retains a rival beside -p [30]. Splice presets only.
Minimal number of seeds on a vote peak [3]. The splice presets use 2.
Ignore a seed whose reference occurrence is above INT when voting, and under a DNA preset when chaining too; 0 turns occurrence filtering off [200]. Unset, the cap is the larger of 200 and the occurrence of the top 1.81e-4 fraction of the most frequent seeds in the index, at most 500 under lr:hq, and the DNA chaining gates take the same cap. The splice presets keep the fixed 200. Under a DNA preset a vote tile whose seeds are all above the cap still votes with its rarest seed of at most 4095 occurrences (lr) or 1024 (lr:hq), and chaining keeps that seed.
Keep every vote peak whose vote is at least FLOAT of the best peak's [0.25; 0 on ava-ont, ava-hifi]. 0 keeps the top four peaks by count instead. DNA presets only.
Drop a seed whose genome-wide reference occurrence is above INT from the pool handed to chaining; 0 disables the gate [200]. Unset, the gate is the voting cap (--max-vote-occ). A seed an empty vote tile kept passes the gate. Only this gate bounds the seeds chaining receives: with 0, repeats can cost several times the CPU and memory. DNA presets only.
Width in reference bases of the diagonal bin a seed votes into, greater than 0 [64]. lr:hq and splice:hq use 48. Under a DNA preset the width otherwise grows with the read length; a value given here fixes it and turns that growth off.
--dw-slope-den INT
Denominator of the term that grows the vote bin with read length: the width is the read length divided by INT, held between the base width and the cap [128]. lr:hq, ava-ont and ava-hifi use 64, and 0 drops the term. DNA presets only.
--dw-max INT
Largest width that growth may reach, greater than 0 [2048]. While the growth is on it may not be below the width --dw sets. DNA presets only.
Seeds per strand that vote [128; 4096 on asm5, asm10, asm20; 256 on ava-ont]: the read is cut into INT equal tiles and each tile votes with one of its seeds; 0 votes with every seed. Above 128, the preset keeps the seeds the 128-tile cut picks and adds seeds of the INT-tile cut, each the farthest from those kept, until it holds as many as that cut picks; a rescued seed that would exceed the strand's budget of rescued occurrences is skipped, so the count can stop short. The exact refinement of the vote peaks uses the seeds of both cuts. Neither --min-support nor --max-cands scales with INT; a vote peak needs --min-support votes (3 on the DNA presets), so an INT below that places few reads or none. The Python field is Config.max_query_seeds. DNA presets only; the splice presets take --vote-spacing.
Vote peaks and placement candidates kept per strand, 1 to 64 [16]; 1 to 16383 [16383] under ava-ont and ava-hifi, which partition nothing. Elsewhere, unset, it is 16 when vote peaks are admitted by their ratio to the best (--vote-ratio), where it only bounds the cost, and 4 when --vote-ratio is 0, where it selects; a value replaces whichever applies. With a CIGAR the secondary alignments come from these candidates' chains, so a wider bound can add secondaries. DNA presets only.
Query tiles the read is cut into for placement, 2 to 4096 [128; 2048 on asm5, asm10, asm20]. The exact query partition gives each tile one candidate or none, and an owned block needs two tiles with seed support. Under the default --tile-score, 2 tiles place no read: a two-tile block scores 8 - 12 = -4, below the -2 of leaving both tiles unowned. The --tile-score terms are per tile, so their weight against each other and against the read's length moves with INT. A candidate starts with the tiles in which a voting seed supports it, so with fewer voting seeds than tiles (--vote-seeds) most tiles start unsupported and candidates are hard to admit; keep --vote-seeds at least INT. Above 2048 tiles, candidates are admitted by comparing their supports on 2048 tiles. The partition's work grows with INT. DNA presets only.
Objective of the exact query partition, which decides for each of the read's query tiles (--tiles) which candidate owns it [hit=4,block=12,null=1,miss=0]. Under a DNA preset the partition picks the candidates chained over the whole read, and the anchors of those chains then decide which chain owns each part of the read. hit rewards an owned tile the seeds support and is at least 1; block is charged each time an ownership block opens, null per valid tile left unowned, and miss per owned tile without seed support, each at least 0. Any subset of the keys may be given, and a repeated key keeps its last value. DNA presets only.

Under a DNA preset, -A, -B, -O, -E, -z and --score-N set the scoring of the gap fills between anchors, and that row is checked: -O and -E positive, E1>E2 and O1+E1<O2+E2 unless the two pieces are equal, (O1+E1)+(O2+E2) at most 127, --score-N below -B, -A and -B within [1,127] and --end-bonus at least -1; a row that fails exits 1. The read-end extensions use the preset's own row, which also scores every alignment, so AS, -S and --end-bonus are in its units: for lr -A2 -B4 -O4,24 -E2,1 -z400,200 --score-N 1, for lr:hq -A1 -B4 -O6,26 -E2,1 -z400,200 --score-N 1. Under asm5, asm10 and asm20, as under the splice presets, the gap fills and the read-end extensions use one row, and these options set it. The defaults below are those of lr.

Matching score [4].
Mismatching penalty [8]. Use a larger value for lower divergence.
Gap open penalty [8,48]. If the second INT is not specified, it is set to the first.
Gap extension penalty [4,1]. A gap of length k costs min{O1+k*E1,O2+k*E2}. If the second INT is not specified, it is set to the first.
Truncate an alignment if the running alignment score drops too quickly along the diagonal of the DP matrix (diagonal X-drop, or Z-drop) [800,200]. Under a DNA preset, a drop above INT2 tests the dropped region for a small inversion, aligning the reverse complement of the query there; under lr:hq, only where the read's own seeds of the other strand chain inside that region. If INT2 is not specified, it is set to INT1; it may not exceed INT1.
Minimal peak DP alignment score to output [80]. Under a splice preset it is also the floor of a supplementary piece, which needs 3 anchors and 40 matching bases besides; the primary is exempt. Under a DNA preset an alignment also needs at least -m (40) matching bases; a value of 0 or less turns off the score test, not the base count. Plain PAF output, which has no DP, is not filtered by this score; under a DNA preset it prints no record whose chaining score is below -m. The long form is --min-dp-score.
Penalty of a mismatch involving ambiguous bases [2].
Score bonus when alignment extends to the end of the query sequence [-1].

Minimal reference gap that chaining accepts as an intron [20]; a shorter gap is left to base alignment as a deletion. It does not decide the `N' CIGAR operator: base alignment writes a gap as `N' once the second gap penalty makes the long gap cheaper (see -O and -E). Splice presets only.
Maximum gap on the reference (effective with a splice preset), that is the maximum intron length [200k]. It also sets both values of -r, as in minimap2; when both -G and -r are given, the later one decides them. NUM may be ending with k/K/m/M/g/G. The long form is --max-intron-len. Splice presets only.
How to find canonical splicing sites GT-AG - f: transcript strand; b: both strands; r: reverse strand; n: no attempt to match GT-AG [b]. Under n no ts tag is stamped. Use f for reads already on the transcript strand, such as direct RNA and Iso-Seq. Splice presets only.
Junctions to prefer during base alignment []. FILE can be gene annotations in the BED12 format (aka 12-column BED), or intron positions in 6-column BED with the strand column required. BED12 file can be converted from GTF/GFF3 with `paftools.js gff2bed anno.gtf'. Splice presets only.
Score bonus for a splice donor or acceptor found in annotation [9]. Effective with --junc-bed. INT ranges from 0 to 127. Splice presets only.
One vote seed per INT query bases [8; splice:hq 16]: a read of length L votes with max(128, ceil(L/INT)) seeds per strand, one per equal tile, so a read of at most 128 times INT bases votes with 128 seeds as before; 0 keeps the fixed 128. The vote serves plain PAF and base-level output alike. The Python field is Config.vote_seed_spacing. Splice presets only.

Output alignments to FILE [stdout].
Generate CIGAR. In PAF, the CIGAR is written to the `cg' custom tag. PAF without -c is placement-only: it runs no base-level dynamic programming, so its coordinates and its AS:i differ from those of a base-level alignment. -c, --cs and --MD turn base-level alignment on in PAF; SAM output always has it.
Output the cs tag. If no argument is given, `short' is set [none]. Implies -c.
Output the MD tag (see the SAM spec). Implies -c.
Output =/X CIGAR operators for sequence match/mismatch. It rewrites every CIGAR the run realizes - the SAM CIGAR, SA:Z and PAF's cg:Z - and implies nothing, so plain PAF needs -c beside it.
In SAM output, use soft clipping for supplementary alignments. The default is hard clipping.
SAM read group line in a format like @RG\tID:foo\tSM:bar []. It must start with @RG and carry an ID field, and it adds RG:Z as the first tag of every SAM record.
In SAM, don't output unmapped reads.
In PAF, output unmapped queries; the strand and the reference name fields are set to `*', and every count to 0.
Don't output the SAM header.
With an overlap preset, whether an overlap is printed from each of its reads that finds it (yes) or once, from the shorter read, ties going to the read whose name sorts first (no), minimap2's --dual [no] (minimap2 prints from the read whose name sorts first). With no a read is not compared with a target read shorter than itself, or as long and earlier by name. Refused with any other preset.
Whether to output secondary alignments [no]. With yes, each alternative alignment of a read is written after the primary and its supplementary records: FLAG 0x100, or 0x900 on its continuation segments, tp:A:S in PAF, mapping quality 0, and `*' for SEQ and QUAL. A secondary record carries ms and its own chain's cm and s1, but no md, s2, SA or XA. Under a DNA preset the secondary alignments are those of the chains aligned beside an owner that, after alignment, overlap a primary record by more than half of the shorter, at most -N per read; they are listed on the primary's XA. Without a CIGAR a DNA preset writes no secondary alignment. The value may also be given as a separate word (--secondary yes); typed twice, the last one wins.
Copy input FASTA/Q comments to output, verbatim, as the last field of every record the read produces.
Number of threads [all-2]: mapping runs on the machine's hardware threads less the reader and the writer. An explicit value is the whole mapping budget, and decompression of compressed input borrows from it rather than adding to it: -t/8 threads, from 1 to 8, when every read input qualifies (BGZF or BAM of at least 16 MiB at any -t of 2 or more; other gzip of at least 64 MiB from -t 32).
Number of bases loaded into memory to process in a mini-batch [500M]. As with -I, a k/K/m/M/g/G suffix is accepted. Output bytes and output order do not depend on it.
Print the fully resolved configuration to stdout and exit 0. It loads neither the reference nor the reads, so flashalign align -x lr:hq --show-config is a complete invocation; of a .faix target it reads the header alone.
Print a summary of the run to stderr: reads and bases, mapped reads, records written, wall time, throughput and peak memory.
Print per-batch progress to stderr.
Suppress non-error logging, including the three lines a run ends with on stderr: the version, the command line, and the real time, CPU time and peak memory.
Generate CIGAR and output alignments in the SAM format. FlashAlign outputs in PAF by default.
Number of batches in flight in the compute stage [3]. With 1, all threads finish a batch before the next one starts. Output bytes and order are identical for every value.
Ceiling, in MiB, on the decompressed gzip input staged ahead of the reader; 0 scales it with -t [0]. A non-zero value must be at least 64. BGZF and BAM input is not affected.

Preset [lr]. This option applies multiple options at the same time. An explicit -x also overrides the preset recorded in a .faix target; the index keeps its own (k, s). Available STR are:
Align noisy long reads of ~10% error rate to a reference genome. This is the default mode. (-k21 -s9 --min-support 3 -A4 -B8 -O8,48 -E4,1 -z800,200 --score-N 2 -r500,20000 -m40 -p0.8 -S80).
Align accurate long reads (error rate <1%), such as PacBio HiFi reads, to a reference genome (-k21 -s5 --min-support 3 -A3 -B12 -O18,78 -E6,1 -z1200,600 --score-N 3 -r500,20000 -g10000 -m40 -p0.8 -S200). Its alignments are scored with minimap2's map-hifi scoring (-A1 -B4 -O6,26 -E2,1, -S200).
Long-read spliced alignment (-k15 -s10 --min-support 2 -A1 -B2 -O2,32 -E1,0 -z200,100 -S80 --min-intron 20 -g2000 -G200k -ub --junc-bonus 9 -p0.8 -N5). In the splice mode a long deletion is taken as an intron and represented as the `N' CIGAR operator, and -m is refused. For Nanopore direct RNA, index with -k14 (flashalign index -x splice -k 14 ref.fa) and align with -x splice -u f.
Spliced alignment for accurate long RNA-seq reads such as PacBio Iso-Seq (-xsplice -B4 -O6,24). It differs from splice in scoring and also in the vote's diagonal bin (48 against 64), the vote spacing (16 against 8; see --vote-spacing) and the MAPQ coverage threshold (0.70 against 0.55).
Experimental. Long assembly to reference mapping (-k21 -s9 -A1 -B19 -O39,81 -E3,1 -z200,200 --score-N 1 -r1000,100000 -b100000,20000 -S200 --vote-seeds 4096 --tiles 2048). Use this preset if the average divergence is not much higher than 0.1%.
Experimental. Long assembly to reference mapping (-xasm5 -B9 -O16,41 -E2,1). Use this if the average divergence is around 1%.
Experimental. Long assembly to reference mapping (-xasm5 -B4 -O6,26 -E2,1). Use this if the average divergence is around several percent.
Experimental. Oxford Nanopore all-vs-all overlap mapping (-k17 -s9 --min-support 2 --vote-seeds 256 --vote-ratio 0 --dw-slope-den 64 --max-cands 16383 -m100 --dual=no). Output is PAF without CIGAR; -a and -c are refused. Read names must be unique.
Experimental. PacBio HiFi all-vs-all overlap mapping (-k21 -s5 --min-support 3 --vote-ratio 0 --dw-slope-den 64 --max-cands 16383 -m100 --dual=no).

Print the help screen of the subcommand to stdout and exit 0. A subcommand invoked with no arguments prints the same screen to stderr and exits 2. The help screen lists the common options; this page lists every option.
Print the version number to stdout. flashalign --version and flashalign -V print the same line. Both spellings are top-level only: neither is an align or index option.

FlashAlign outputs in the PAF format by default; without -c, PAF output is approximate mapping, with no base-level alignment. -a selects the SAM format. FlashAlign writes no BAM; pipe its SAM to samtools sort for one, as in flashalign align -a ref.fa reads.fq | samtools sort -o out.bam. PAF is a TAB-delimited text format with each line consisting of at least 12 fields as are described in the following table:

Col Type Description
1 string Read name
2 int Read length
3 int Read start coordinate (0-based)
4 int Read end coordinate (0-based)
5 char `+' for forward strand; `-' for reverse
6 string Contig name
7 int Contig length
8 int Contig start coordinate on the original strand
9 int Contig end coordinate on the original strand
10 int Number of matching bases
11 int Number of bases in alignment
12 int Mapping quality (0-60)

When alignment is available, column 11 gives the total number of sequence matches, mismatches and gaps in the alignment; column 10 divided by column 11 gives the BLAST-like alignment identity. When alignment is unavailable, these two columns are approximate. SAM and PAF may optionally have additional fields in the SAM-like typed key-value format. FlashAlign may output the following tags:

Tag Type Description
AS i Alignment score from dynamic programming
ms i Score of the maximum scoring segment
md i Max score minus secondary max score
NM i Edit distance
nn i Number of ambiguous bases in the alignment
tp A Type of aln: P/primary, S/secondary, I/inversion
cm i Number of anchors on the chain; FlashAlign's anchors are syncmers
s1 i Chaining score
s2 i Chaining score of the best secondary chain
de f Gap-compressed per-base sequence divergence
ts A Transcript strand (splice mode only)
RG Z Read group ID from -R (SAM only)
SA Z List of other supplementary alignments (SAM only)
XA Z Secondary hits in (ctg,strandPos,CIGAR,NM;)+ (SAM only)
cg Z CIGAR (PAF only)
cs Z Difference string
MD Z Difference string in the SAM spec

Tags md, s2 and XA are not written on a secondary alignment. cm and s1 describe the chain a record comes from, the chain s2 is compared against. s2 is taken over every rival the mapping quality weighs, before -p applies, as in minimap2. A secondary alignment carries its own chain's. Under the DNA presets but ava-ont and ava-hifi, a primary or supplementary record carries the anchor count and score of its own part of that chain. A record without a chain, such as the inverted middle of a DNA alignment, carries none of the three.

In SAM, the tags of a BAM input record ride every record of its read, spelled as samtools view spells them, after FlashAlign's own tags and before SA. MM, ML, MN and a B array with one element per base of the read are left off a record whose SEQ is not the whole read: a hard-clipped supplementary and a secondary alignment. An input tag that FlashAlign writes itself is dropped with a warning. The headers of the BAM inputs are merged: their @PG lines come before FlashAlign's, whose PP names the first input's last program, and their @RG and @CO lines after it; one read group ID declared differently by two inputs is an error. An aligned BAM is read as reads: its secondary and supplementary records are skipped and a mapped record loses its alignment tags. PAF carries no input tag.

The cs tag encodes difference sequences in the short form or the entire query AND reference sequences in the long form. It consists of a series of operations:

Op Regex Description
= [ACGTN]+ Identical sequence (long form)
: [0-9]+ Identical sequence length
* [acgtn][acgtn] Substitution: ref to query
+ [acgtn]+ Insertion to the reference
- [acgtn]+ Deletion from the reference
~ [acgtn]{2}[0-9]+[acgtn]{2} Intron length and splice signal

0
Success, and every --help path, which prints to stdout.
1
Runtime failure: a missing or unreadable input, a write failure, CRAM or SAM text handed in as reads, a closed output, or an option the resolved preset cannot honour, such as a scoring row that fails its check or a -r pair whose first value exceeds the second. One error line on stderr, no hint.
2
Usage error: an unknown command, an unknown option, a bad value or a missing operand. One error line plus one hint line on stderr. flashalign with no arguments, and flashalign align or flashalign index with no arguments, print their help screen to stderr and exit 2 instead.

*
Long reads only: a read has to carry enough anchors to be collapsed into one or more diagonals.
*
FlashAlign requires SSE4.1 instructions on x86 CPUs or NEON on ARM CPUs. A build without them is not provided.
*
The assembly and overlap presets are experimental.

samtools(1).

11 October 2026 flashalign-0.3.0