[TOC]
This changelog contains a top-level entry for each release with sections on new features, API changes and notable bug-fixes (not all bug-fixes will be listed).
Get to know SeqAn3 with our tutorials.
Please see the release announcement: https://www.seqan.de/announcing-seqan3/
See the porting guide for some help on porting: https://docs.seqan.de/seqan3/main_user/howto_porting.html
See the documentation on API stability to learn about when API changes are allowed.
- We now use Doxygen version 1.9.8 to build our documentation (#3197).
- We bumped the minimal CMake version to 3.5 (#3223).
- The function
seqan3::alignment_from_cigar
creates an alignment (tuple of two aligned sequences) from a CIGAR vector (std::vector<seqan3::cigar>
) (#3057) or a CIGAR string (std::string
) (#3077). - The function
seqan3::cigar_from_alignment
creates a CIGAR vector (std::vector<seqan3::cigar>
) from an alignment (tuple of 2 aligned sequences) (#3057).
- Improved performance of vector assignment for alphabets (#3038).
- Improved performance of
seqan3::dna4::complement()
(#3026). - Char literals returning
std::vector
are nowconstexpr
if supported by the compiler (#3073).
- Made
seqan3::sam_file_header::program_info_t
easier to copy (#3145).
- Added a constructor to the
seqan3::interleaved_bloom_filter
for decompressing a compressedseqan3::interleaved_bloom_filter
(#3082).
- Resolved an issue resulting in a wrong alignment score (#3098).
- Empty SAM/BAM files must at least write a header to ensure a valid file (#3081).
- Reading SAM/BAM files is 2x faster than before (#3106).
seqan3::sequence_file_input_traits
now allowschar
as a sequence alphabet (#3128).
- Fixed spin delay having no effect on the PowerPC platform (#3129).
- The fields
seqan3::field::offset
andseqan3::field::alignment
have been removed fromseqan3::sam_record
(#3058, #3089). Forseqan3::field::offset
, please check the soft clipping of the CIGAR string (seqan3::sam_record::cigar()
). Forseqan3::field::alignment
, please useseqan3::alignment_from_cigar
.
- We require at least CMake 3.16 for our test suite. Note that the minimum requirement for using SeqAn3 is unchanged (#3050).
- We now use Doxygen version 1.9.6 to build our documentation (#3116).
- Updated sdsl-lite to 3.0.3 (#3170, #3174).
- Compatibility with SeqAn2: SeqAn2's namespace was changed from
seqan
toseqan2
. For interoperability, an up-to-date checkout of SeqAn2's main branch is required (#3156).
seqan3::cigar
can now be assigned fromstd::string_view
(#2966).- Added
seqan3::views::char_strictly_to
. Behaves likeseqan3::views::char_to
, but throws on invalid input (#2898).
- Added
seqan3::sequence_file_option::fasta_ignore_blanks_before_id
to ignore blanks before IDs when reading FASTA files. E.g.,> some_id
will only store"some_id"
as ID (#2770).
- Improved performance of
seqan3::counting_vector::operator+=
(#2930).
- Added
seqan3::list_traits::repeat
(#2899).
- FASTA files containing IDs starting with
>
, e.g.,> >MyID
, are now parsed correctly (#2869).
- Relaxed
kmer_hash_view::iterator
difference requirement (#2931). - Relaxed
seqan3::views::minimiser
requirements to be C++20-compatible (#2845). - Relaxed
seqan3::views::kmer_hash
requirements to be C++20-compatible (#2843).
seqan3::views::single_pass_input
cannot propagate thestd::ranges::output_range
property because it cannot satisfy the following requirement (#2775):*it++ = value; // must be the same as *it = value; ++it; // but it actually would be the same as ++it; *it = value;
- Fixed signature of
seqan3::detail::store_sse4
. This might have affected some public API (#2893). - Relaxed
seqan3::views::to_simd
requirements to be C++20-compatible (#2849).
GCC 7, 8, and 9 have been removed. All headers in seqan3/std/
except charconv
and new
have been deprecated, please
use the equivalent std
includes.
The namespace std::cpp20
has been deprecated, please use std::
.
seqan3::views::to
has been changed to seqan3::ranges::to
. Since it is not a view anymore, it cannot be properly
deprecated. Please keep this in mind if you encounter errors with seqan3::views::to
.
- Dropped support for GCC 7 and 8 (#2891).
- Dropped support for GCC 9 (#2952).
- Removed C++17 support (#2915).
- Changed the default of
output_options::fasta_blank_before_id
tofalse
(#2769). - Changed the default of
bgzf_thread_count
to4
. Previously, all available threads on the machine were utilised (#2911). - The global variable
bgzf_thread_count
is not static anymore. Modifying the variable now affects the runtime of the entire program. Formerly, this variable was specific to each translation unit (#2752).
- Replaced
seqan3::views::to
(implemented via range-v3) withseqan3::ranges::to
(implemented in SeqAn3).seqan3::ranges::to
provides a subset of C++23'sstd::ranges::to
and will be replaced with the STL-equivalent in a future version (#2969). - Replaced the implementation of
seqan3::views::chunk
. It is now implemented in SeqAn3 and does not use the range-v3 implementation anymore.seqan3::views::chunk
is similar to C++23'sstd::views::chunk
and will be replaced with the STL-equivalent in a future version (#2975). - Replaced the implementation of
seqan3::views::join_with
. It is now implemented in SeqAn3 and does not use the range-v3 implementation anymore.seqan3::views::join_with
is equivalent to C++23'sstd::views::join_with
and will be replaced with the STL-equivalent in a future version (#2973). - Replaced the implementation of
seqan3::views::zip
. It is now implemented in SeqAn3 and does not use the range-v3 implementation anymore.seqan3::views::zip
is equivalent to C++23'sstd::views::zip
and will be replaced with the STL-equivalent in a future version (#2971).
- We now use Doxygen version 1.9.4 to build our documentation (#2979).
- Removed range-v3 (#2998).
- Updated cereal to 1.3.2 (#3012).
- Updated sdsl-lite to 3.0.1 (#3012).
- We now use Doxygen version 1.9.2 to build our documentation (#2765).
- Fixed an issue that led to the wrong option type being printed on errors (#2836).
- Resolved an issue that prevented the FM-Index from being constructed correctly for inputs larger than 4 GiB (#2756).
The files deprecated in 3.0.3 (denoted by [deleted without replacement]
) have been removed.
Note that 3.1.0 will be the first API stable release and interfaces in this release might still change.
-
Check out our updated SeqAn3 Cookbook. It contains a listing of code examples on how to perform particular tasks using the library.
-
SeqAn 3.0.3 is known to compile with GCC 7.5, 8.4, 9.3, 10.3, and 11.1. Future versions (e.g. GCC 11.2 and 12) might work, but were not yet available at the time of this release.
- Added
seqan3::phred94
, a quality type that represents the full Phred Score range (Sanger format) and is used for PacBio Phred scores of HiFi reads (#2290).
- The
seqan3::argument_parser
constructor was changed to accept a strong-typeseqan3::update_notifications::(on|off)
instead of a simple bool (which was subject to unexpected implicit conversion) (#2180). - We expanded the
seqan3::output_file_validator
, with a parameterseqan3::output_file_open_options
to allow overwriting output files (#2009). - The
seqan3::argument_parser
has a new member functionseqan3::argument_parser::is_option_set
that checks whether an option, identified by its long or short name, was set on the command line by the user (#1859). - The subcommand of the
seqan3::argument_parser
may contain a dash (#2306).
- We now use Doxygen version 1.9.1 to build our documentation (#2327).
- Explicit record-classes with explicit member accessor for our file implementations. We added
seqan3::sequence_record
forseqan3::sequence_file_(in|out)put
,seqan3::sam_record
forseqan3::sam_file_(in|out)put
andseqan3::structure_record
forseqan3::structure_file_(in|out)put
. You can now access theid
in a sequence file (e.g.fasta
file) record viarecord.id()
instead ofseqan3::get<seqan3::field::id>(record)
. This will allow us to add convenient functions that compute information based on the record itself and to provide better documentation. (#2340, #2380, #2389)
- The
seqan3::fm_index_cursor
andseqan3::bi_fm_index_cursor
can be serialised (#2048). - The
seqan3::fm_index_cursor
exposes its suffix array interval (#2076). - The
seqan3::interleaved_bloom_filter
supports counting occurrences of a range of values (#2373). - The
seqan3::interleaved_bloom_filter
supports clearing of bins (#2428).
- Argument parsing with subcommands: If the user forgets or misspells the subcommand, the error is thrown when calling
seqan3::argument_parser::parse()
and not on construction of theseqan3::argument_parser
(#2179). - The
seqan3::regex_validator
parsesstd::filesystem::path
's correctly now (#2216). - The
seqan3::input_file_validator
andseqan3::input_file_validator
support extensions containing a dot (#2363). - The Argument Parser accepts containers of all values it is able to parse, e.g. a
std::vector
of enums orbool
(#2381). - The Argument Parser's help pages now contain author and email information (#2374).
- The Argument Parser is able to process defaults for list arguments (#2394).
- The
seqan3::views::kmer_hash
does not return wrong values when combined withstd::views::reverse
on a text of the same size as the kmer (#2416).
- The SAM/BAM format reads the quality field (or any other text field) that starts with an asterisk (
*
) but is not empty correctly now (#2184). - Requesting the alignment without also requesting the sequence for BAM files containing empty CIGAR strings does now not result in erroneous parsing (#2418).
- BAM files with 64 references are now parsed correctly (#2423).
- BAM files not containing a plain text header are now accepted (#2536).
- Writing
gz
-compressed output no longer results inbgzf
-compressed output. This change may have following effects (#2458):- A noticeable slowdown when writing
gz
-compressed content since, in contrast tobgzf
,gz
does not feature parallelisation (magnitude depends on the application and level of parallelisation). - A reduced output size when writing
gz
-compressed content due togz
storing less metadata thanbgzf
(up to 20% smaller file size). - The processed data should experience no negative effects since
gz
andbgzf
are fully compatible. - This bug may also cause unexpected parallelisation when reading
gz
-compressed input. This is the case when thegz
-compressed input was also generated with SeqAn.
- A noticeable slowdown when writing
- The following requirements of parsing a SAM/BAM header where relaxed as they were in violation of the specification
(#2605):
- The order of tags within the header may be arbitrary. Before, necessary tags where required to be first.
- Unknown tags will emit a warning. Before, a error was raised.
Most of our API or header file changes will trigger a deprecation warning to let you know if something changed and, if applicable, when it will be removed. We recommend upgrading version-by-version to check whether you need to change code. You can either directly check the reported code or verify with our documentation how the new API should be used.
For a complete list of behavioural changes in our public and internal API, you can consult our API stability regression test suite and patches at https://github.com/seqan/seqan3/tree/main/test/api_stability/3.0.2.
- The member constants of
seqan3::aminoacid_similarity_matrix
were changed to lower case (#2599):seqan3::aminoacid_similarity_matrix::BLOSUM30
is replaced byseqan3::aminoacid_similarity_matrix::blosum30
.seqan3::aminoacid_similarity_matrix::BLOSUM45
is replaced byseqan3::aminoacid_similarity_matrix::blosum45
.seqan3::aminoacid_similarity_matrix::BLOSUM62
is replaced byseqan3::aminoacid_similarity_matrix::blosum62
.seqan3::aminoacid_similarity_matrix::BLOSUM80
is replaced byseqan3::aminoacid_similarity_matrix::blosum80
.
- Deprecated seqan3::alignment_coordinate and it will be removed in 3.1.0 (#2602).
Header Changes:
#include <seqan3/alignment/band/static_band.hpp> [deleted without replacement]
#include <seqan3/alignment/matrix/advanceable_alignment_coordinate.hpp> [deleted without replacement]
#include <seqan3/alignment/scoring/gap_scheme.hpp> [deleted without replacement]
-
We relaxed some requirements of
seqan3::alphabet_base<alphabet_t>
(#2427):- Old requirements:
alphabet_t::rank_to_char
andalphabet_t::char_to_rank
must be lookup tables. - New requirements:
alphabet_t::rank_to_char
andalphabet_t::char_to_rank
must be static member functions.
This allows for more flexible rank <-> char conversion implementations. Lookup tables are still possible within those static member functions. However, alphabets that do not need a lookup table can now use easier and/or more efficient implementations. For example,
seqan3::gap
always returns rank0
or char-
, orseqan3::phred42
where the rank and char representations are offset by a fixed value. - Old requirements:
-
We relaxed a requirement of
seqan3::nucleotide_base<alphabet_t>
(#2584):- Old requirement:
alphabet_t::complement_table
must be a lookup table. - New requirement:
alphabet_t::rank_complement
must be a static member function.
- Old requirement:
-
Removed seqan3::char_is_valid_for requirement from seqan3::writable_alphabet and seqan3::detail::writable_constexpr_alphabet (#2337).
-
Removed seqan3::cigar_op, please use seqan3::cigar::operation instead (#2388).
-
The literal 'M'_cigar_op was renamed to 'M'_cigar_operation (#2388).
-
Renamed
seqan3::phred68legacy
toseqan3::phred68solexa
(#2522). -
Renamed
seqan3::sam_dna16
toseqan3::dna16sam
(#2521). -
Removed phred constructors (#2537):
- Use
seqan3::phred42::assign_phred()
orseqan3::operator""_phred42
instead ofseqan3::phred42(phred_type)
. - Use
seqan3::phred63::assign_phred()
orseqan3::operator""_phred63
instead ofseqan3::phred63(phred_type)
. - Use
seqan3::phred94::assign_phred()
orseqan3::operator""_phred94
instead ofseqan3::phred94(phred_type)
. - Use
seqan3::phred68legacy::assign_phred()
orseqan3::operator""_phred68legacy
instead ofseqan3::phred68legacy(phred_type)
.
- Use
-
Renamed
seqan3::quality_base
toseqan3::phred_base
(#2539). -
Added the
seqan3::literals
namespace containing all literals. This adds the option to useusing namespace seqan3::literals
to import literal operators. The old way of explicitly importing specific operators viausing seqan3::operator""_{dna4, rna4, ...}
is not affected by this change (#2568). -
Breaking change: Swapped the meaning of
seqan3::alphabet_variant::is_alternative
andseqan3::alphabet_variant::holds_alternative
(#2596).
Header Changes:
#include <seqan3/alphabet/cigar/{cigar_op => cigar}.hpp>
#include <seqan3/alphabet/nucleotide/{sam_dna16 => dna16sam}.hpp}>
#include <seqan3/alphabet/quality/{phred68legacy => phred68solexa}.hpp>
#include <seqan3/alphabet/quality/{quality_base => phred_base}.hpp>
seqan3::output_file_validator
cannot be constructed with the extension list alone anymore, you need to specify one of the seqan3::output_file_open_options options. (#2009).- The enum names of
seqan3::option_spec
were changed to lower case (#2285):seqan3::option_spec::DEFAULT
is replaced byseqan3::option_spec::standard
.seqan3::option_spec::REQUIRED
is replaced byseqan3::option_spec::required
.seqan3::option_spec::ADVANCED
is replaced byseqan3::option_spec::advanced
.seqan3::option_spec::HIDDEN
is replaced byseqan3::option_spec::hidden
.
- Deprecated seqan3::range_compatible_concept and it will be removed in 3.1.0 (#2265).
Header Changes:
#include <seqan3/core/algorithm/bound.hpp> [Functionality included in alignment/configuration/align_config_band.hpp]
#include <seqan3/core/{algorithm => configuration}/configuration.hpp>
#include <seqan3/core/{algorithm => configuration}/pipeable_config_element.hpp>
#include <seqan3/{core => utility}/char_operations/predicate.hpp>
#include <seqan3/{core => utility}/char_operations/transform.hpp>
#include <seqan3/{core => utility/tuple}/common_tuple.hpp>
#include <seqan3/{core/concept/tuple => utility/tuple/concept}.hpp>
#include <seqan3/{core => utility}/math.hpp>
#include <seqan3/{core => utility/tuple}/pod_tuple.hpp>
#include <seqan3/{core => utility}/simd/concept.hpp>
#include <seqan3/{core => utility}/simd/{simd_algorithm => algorithm}.hpp>
#include <seqan3/{core => utility}/simd/simd.hpp>
#include <seqan3/{core => utility}/simd/simd_traits.hpp>
#include <seqan3/{core => utility}/simd/{view_iota_simd => views/iota_simd}.hpp>
#include <seqan3/{core => utility}/simd/{view_to_simd => views/to_simd}.hpp>
#include <seqan3/{core/tuple_utility => utility/tuple/pop_front}.hpp>
#include <seqan3/{core/tuple_utility => utility/tuple/split}.hpp>
#include <seqan3/{core => utility}/type_list/traits.hpp>
#include <seqan3/{core => utility}/type_list/type_list.hpp>
#include <seqan3/{core => utility}/type_traits/basic.hpp>
#include <seqan3/{core => utility}/type_traits/concept.hpp>
#include <seqan3/{core => utility}/type_traits/function{ =>_traits}.hpp>
#include <seqan3/{core => utility}/type_traits/{lazy => lazy_conditional.hpp>
#include <seqan3/{core/type_traits/pack => utility/type_pack/traits}.hpp>
#include <seqan3/{core => utility}/type_traits/pre.hpp> [deleted without replacement]
#include <seqan3/core/{type_traits/range => range/type_traits}.hpp>
- Deprecated
seqan3::field::seq_qual
. Useseqan3::field::seq
andseqan3::field::qual
instead. (#2379). Check out SeqAn3 Cookbook - Write Record for usage. - Renamed seqan3::alignment_file* to seqan3::sam_file*
(#2459):
seqan3::alignment_file_header
is replaced byseqan3::sam_file_header
.seqan3::alignment_file_input_default_traits
is replaced byseqan3::sam_file_input_default_traits
.seqan3::alignment_file_input
is replaced byseqan3::sam_file_input
.seqan3::alignment_file_input_format
is replaced byseqan3::sam_file_input_format
.seqan3::alignment_file_input_options
is replaced byseqan3::sam_file_input_options
.seqan3::alignment_file_output
is replaced byseqan3::sam_file_output
.seqan3::alignment_file_output_format
is replaced byseqan3::sam_file_output_format
.seqan3::alignment_file_output_options
is replaced byseqan3::sam_file_output_options
.
seqan3::sam_file_input
andseqan3::sam_file_output
do not acceptseqan3::field::ref_seq
,seqan3::field::evalue
andseqan3::field::bit_score
anymore. (#2658).- The
seqan3::get
accessor for I/O records, e.g.seqan3::get<seqan3::field::id>(record)
, is deprecated, please use the corresponding member accessor (#2420):- If you used files as views with
seqan3::views::get<seqan3::field::id>
to project a single field, e.g.seqan3::views::get<seqan3::field::id>(fin)
=>std::views::transform(fin, [](auto && record){ return record.id(); })
fin | seqan3::views::get<seqan3::field::id>()
=>fin | std::views::transform([](auto && record){ return record.id(); })
- or per projection:
fin | std::views::transform(&decltype(fin)::%record_type::id)
seqan3::sequence_record
:seqan3::get<seqan3::field::id>(record)
=>record.id()
seqan3::get<seqan3::field::seq>(record)
=>record.sequence()
seqan3::get<seqan3::field::qual>(record)
=>record.base_qualities()
seqan3::structure_record
:seqan3::get<seqan3::field::id>(record)
=>record.id()
seqan3::get<seqan3::field::seq>(record)
=>record.sequence()
seqan3::get<seqan3::field::structure>(record)
=>record.sequence_structure()
seqan3::get<seqan3::field::energy>(record)
=>record.energy()
seqan3::get<seqan3::field::bpp>(record)
=>record.base_pair_probability_matrix()
seqan3::sam_record
:seqan3::get<seqan3::field::id>(record)
=>record.id()
seqan3::get<seqan3::field::seq>(record)
=>record.sequence()
seqan3::get<seqan3::field::qual>(record)
=>record.base_qualities()
seqan3::get<seqan3::field::offset>(record)
=>record.sequence_position()
seqan3::get<seqan3::field::alignment>(record)
=>record.alignment()
seqan3::get<seqan3::field::ref_id>(record)
=>record.reference_id()
seqan3::get<seqan3::field::ref_offset>(record)
=>record.reference_position()
seqan3::get<seqan3::field::header_ptr>(record)
=>record.header_ptr()
seqan3::get<seqan3::field::flag>(record)
=>record.flag()
std::get<0>(seqan3::get<seqan3::field::mate>(record))
=>record.mate_reference_id()
std::get<1>(seqan3::get<seqan3::field::mate>(record))
=>record.mate_position()
std::get<2>(seqan3::get<seqan3::field::mate>(record))
=>record.template_length()
seqan3::get<seqan3::field::mapq>(record)
=>record.mapping_quality()
seqan3::get<seqan3::field::cigar>(record)
=>record.cigar_sequence()
seqan3::get<seqan3::field::tags>(record)
=>record.tags()
- If you used files as views with
Header Changes:
#include <seqan3/io/{alignment_file=> sam_file}/format_bam.hpp>
#include <seqan3/io/{alignment_file=> sam_file}/format_sam.hpp>
#include <seqan3/io/{alignment_file=> sam_file}/header.hpp>
#include <seqan3/io/{alignment_file=> sam_file}/input.hpp>
#include <seqan3/io/{alignment_file=> sam_file}/input_format_concept.hpp>
#include <seqan3/io/{alignment_file=> sam_file}/input_options.hpp>
#include <seqan3/io/{alignment_file/misc => sam_file/sam_flag}.hpp>
#include <seqan3/io/{alignment_file=> sam_file}/output.hpp>
#include <seqan3/io/{alignment_file=> sam_file}/output_format_concept.hpp>
#include <seqan3/io/{alignment_file=> sam_file}/output_options.hpp>
#include <seqan3/io/{alignment_file=> sam_file}/sam_tag_dictionary.hpp>
- We made
seqan3::views::convert
NOAPI and moved it toseqan3/utility/views/convert.hpp
. You can still useseqan3::views::convert
in the meantime, but we encourage usingstd::views::transform
instead as shown in our Cookbook (#2524). - Deprecated
seqan3::views::as_const
, there is no alternative other than reimplementing it yourself (#2567). - Deprecated
seqan3::views::drop
, usestd::views::drop
orseqan3::views::type_reduce | std::views::drop
. (#2540) - Deprecated
seqan3::views::join
. Please usestd::views::join
orseqan3::views::join_with
instead (#2526). - Deprecated
seqan3::views::move
, use thestd::ranges::move
algorithm,std::[cpp20::]move_iterator
or an explicit for loop where you move the value. (#2563) - Deprecated
seqan3::views::take
and it will be removed in 3.1.0. Usestd::views::take
instead (#2541). - Deprecated
seqan3::views::take_line
and it will be removed in 3.1.0 (#2525). - Deprecated
seqan3::views::take_exactly
. Please usestd::views::take
orstd::views::counted
instead (#2601). - Deprecated
seqan3::views::take_until
and it will be removed in 3.1.0. Usestd::views::take_while(std::not_fn(predicate))
instead (#2604). - Deprecated
seqan3::views::take_until_and_consume
and it will be removed in 3.1.0. There is no alternative other than reimplementing it yourself (#2604). - Deprecated
seqan3::views::to_upper
and it will be removed in 3.1.0, usestd::views::transform([](auto && chr){return std::toupper(chr)})
. (#2538) - Deprecated
seqan3::views::to_lower
and it will be removed in 3.1.0, usestd::views::transform([](auto && chr){return std::tolower(chr)})
. (#2556) - Deprecated
seqan3::views::persist
. There is no replacement, use lvalues instead of rvalues (#2553). - Renamed
seqan3::gap_decorator::unaligned_seq_type
toseqan3::gap_decorator::unaligned_sequence_type
(#2564). - Renamed
seqan3::views::get
toseqan3::views::elements
(#2554). - Renamed
seqan3::translation_frames::*FRAME*
(#2565):seqan3::translation_frames::FWD_FRAME_0
is replaced byseqan3::translation_frames::forward_frame0
.seqan3::translation_frames::FWD_FRAME_1
is replaced byseqan3::translation_frames::forward_frame1
.seqan3::translation_frames::FWD_FRAME_2
is replaced byseqan3::translation_frames::forward_frame2
.seqan3::translation_frames::REV_FRAME_0
is replaced byseqan3::translation_frames::reverse_frame0
.seqan3::translation_frames::REV_FRAME_1
is replaced byseqan3::translation_frames::reverse_frame1
.seqan3::translation_frames::REV_FRAME_2
is replaced byseqan3::translation_frames::reverse_frame2
.seqan3::translation_frames::FWD_REV_0
is replaced byseqan3::translation_frames::forward_reverse0
.seqan3::translation_frames::FWD_REV_1
is replaced byseqan3::translation_frames::forward_reverse1
.seqan3::translation_frames::FWD_REV_2
is replaced byseqan3::translation_frames::forward_reverse2
.seqan3::translation_frames::FWD
is replaced byseqan3::translation_frames::forward_frames
.seqan3::translation_frames::REV
is replaced byseqan3::translation_frames::reverse_frames
.seqan3::translation_frames::SIX_FRAME
is replaced byseqan3::translation_frames::six_frames
.
- Renamed
seqan3::type_reduce_view
toseqan3::type_reduce_t
(#2587).
Header Changes:
#include <seqan3/{range/concept => alphabet/range/sequence}.hpp>
#include <seqan3/{range/concept => alphabet/range/concept}.hpp>
#include <seqan3/{range => utility}/container/aligned_allocator.hpp>
#include <seqan3/{range => alphabet}/container/{bitcompressed_vector => bitpacked_sequence}.hpp>
#include <seqan3/{range => alphabet}/container/concatenated_sequences.hpp>
#include <seqan3/{range => utility}/container/concept.hpp>
#include <seqan3/{range => utility}/container/dynamic_bitset.hpp>
#include <seqan3/{range => utility}/container/small_string.hpp>
#include <seqan3/{range => utility}/container/small_vector.hpp>
#include <seqan3/{range => alignment}/decorator/gap_decorator.hpp>
#include <seqan3/{range => alphabet/range}/hash.hpp>
#include <seqan3/{range => io}/views/async_input_buffer.hpp>
#include <seqan3/{range => alphabet}/views/char_to.hpp>
#include <seqan3/{range => utility}/views/chunk.hpp>
#include <seqan3/{range => alphabet}/views/complement.hpp>
#include <seqan3/{range => utility}/views/convert.hpp>
#include <seqan3/{range => utility}/views/deep.hpp>
#include <seqan3/{range => utility}/views/enforce_random_access.hpp>
#include <seqan3/{range => utility}/views/{get => elements}.hpp>
#include <seqan3/{range => utility}/views/interleave.hpp>
#include <seqan3/range/views/istreambuf.hpp> [deleted without replacement]
#include <seqan3/{range => utility}/views/{join => join_with}.hpp>
#include <seqan3/{range => search}/views/kmer_hash.hpp>
#include <seqan3/{range => search}/views/minimiser.hpp>
#include <seqan3/{range => search}/views/minimiser_hash.hpp>
#include <seqan3/{range => utility}/views/pairwise_combine.hpp>
#include <seqan3/range/views/persist> [deleted without replacement]
#include <seqan3/{range => alphabet}/views/rank_to.hpp>
#include <seqan3/{range => utility}/views/repeat.hpp>
#include <seqan3/{range => utility}/views/repeat_n.hpp>
#include <seqan3/{range => utility}/views/single_pass_input.hpp>
#include <seqan3/{range => utility}/views/slice.hpp>
#include <seqan3/range/views/take.hpp> [deleted without replacement]
#include <seqan3/range/views/take_exactly.hpp> [deleted without replacement]
#include <seqan3/range/views/take_line.hpp> [deleted without replacement]
#include <seqan3/range/views/take_until.hpp> [deleted without replacement]
#include <seqan3/{range => utility}/views/to.hpp>
#include <seqan3/{range => alphabet}/views/to_char.hpp>
#include <seqan3/{range => alphabet}/views/to_rank.hpp>
#include <seqan3/{range => alphabet}/views/translate.hpp>
#include <seqan3/{range => alphabet}/views/translate_join.hpp>
#include <seqan3/{range => alphabet}/views/trim_quality.hpp>
#include <seqan3/{range => utility}/views/type_reduce.hpp>
#include <seqan3/{range => utility}/views/zip.hpp>
- We removed the concepts
seqan3::[bi_]fm_index[_cursor]_specialisation
. We did this because we currently have only one implementation modelling each concept and are not completely sure if the current definition of the concepts is the right one. If you used those concepts, you can check whether the cursor type isseqan3::[bi_]fm_index_cursor
as a substitute. (#2348)
Note that 3.1.0 will be the first API stable release and interfaces in this release might still change.
-
Check out our new SeqAn3 Cookbook. It contains a listing of code examples on how to perform particular tasks using the library.
-
SeqAn 3.0.2 is known to compile with GCC 7.5, 8.4, 9.3 and 10.2. Future versions (e.g. GCC 10.3 and 11) might work, but were not yet available at the time of this release.
- The alignment algorithm can now be invoked with a user defined callback function using the alignment configuration
seqan3::align_cfg::on_result
(#1876). - The function
seqan3::align_pairwise
accepts astd::pair
of sequences as input (#1913). - We lowered the requirements of the
seqan3::aligned_sequence
concept by removing everything that needs write access to the object. We then added a newseqan3::writable_aligned_sequence
concept which extendsseqan3::aligned_sequence
with the requirements that need write access (e.g.insert_gap
) (#1933).
- The following functions accept a
seqan3::argument_parser::option_spec::ADVANCED
to control what is displayed on the (advanced) help page:seqan3::argument_parser::add_section
seqan3::argument_parser::add_subsection
seqan3::argument_parser::add_line
seqan3::argument_parser::add_list_item
Note that otherseqan3::argument_parser::option_spec
s likeREQUIRED
are ignored (#1652).
- The
seqan3::format_fasta
accepts the file extension.fas
as a valid extension for the FASTA format (#1599).
- Add top-level
CMakeLists.txt
(#1475). - We now use Doxygen version 1.8.20 to build our documentation (#2081).
- The
seqan3::views::minimiser
has been added. This is a view that computes the minimum in a window shifted over a range of comparable values (#1654). - The
seqan3::views::minimiser_hash
has been added. This is a view that computes the minimisers of a range of typeseqan3::semialphabet
(#1721).
- Added
seqan3::interleaved_bloom_filter
, a data structure that efficiently answers set-membership queries for multiple bins (#920). - Added
seqan3::search_cfg::hit
, which allows dynamic configuration of the hit strategy. (#1853). - Added
seqan3::search_cfg::on_result
, which allows providing a custom callback for the search algorithm (#2019).
- The required version of the ranges-v3 library has increased: We now support the versions >= 0.11.0 and < 0.12.0, increasing the previous requirement of >= 0.10.0 and < 0.11.0 (#2014).
- The alignment configuration elements have been refactored:
- All options are now classes and must be constructed explicitly even if they don’t take any arguments,
e.g.
seqan3::align_cfg::vectorise
->seqan3::align_cfg::vectorised{}
. - The configuration
seqan3::align_cfg::band
has been replaced byseqan3::align_cfg::band_fixed_size
, and will directly be initialised with aseqan3::align_cfg::lower_diagonal
andseqan3::align_cfg::upper_diagonal
instead of aseqan3::static_band
class. It also directly exposes thelower_diagonal
andupper_diagonal
as public members (#1873). - The configuration
seqan3::align_cfg::mode
has been replaced by two separate configuration elementsseqan3::align_cfg::method_global
andseqan3::align_cfg::method_local
(#1918). - The configuration
seqan3::align_cfg::aligned_ends
has been replaced byseqan3::align_cfg::method_global
. The free end-gaps are now initialised via constructor arguments to theseqan3::align_cfg::method_global
configuration (#2119). - The configuration
seqan3::align_cfg::vectorise
has been replaced byseqan3::align_cfg::vectorised
(#2026). - The configuration
seqan3::align_cfg::scoring
has been replaced byseqan3::align_cfg::scoring_scheme
(#2027). - The configuration
seqan3::align_cfg::result
has been replaced byseqan3::align_cfg::output_*
options. When no output configuration was configured, the default behaviour changed from computing only the score to all possible outputs. Please read the linked documentation above carefully to understand all implied changes (#2024 & #2035). - The configuration
seqan3::align_cfg::gap
has been replaced byseqan3::align_cfg::gap_cost_affine
, which is directly initialised with the relevant gap scores (#2037). - The configuration
seqan3::align_cfg::max_error
has been replaced byseqan3::align_cfg::min_score
, and thus prepares it for non-edit scoring schemes in the future as well (#2021).
- All options are now classes and must be constructed explicitly even if they don’t take any arguments,
e.g.
Header Changes:
#include <seqan3/alignment/configuration/{align_config_max_error.hpp => align_config_min_score.hpp}>
#include <seqan3/alignment/configuration/{align_config_scoring.hpp => align_config_scoring_scheme.hpp}>
#include <seqan3/alignment/configuration/{align_config_vectorise.hpp => align_config_vectorised.hpp}>
#include <seqan3/alignment/configuration/{align_config_gap.hpp => align_config_gap_cost_affine.hpp}>
#include <seqan3/alignment/configuration/{align_config_mode.hpp => align_config_method.hpp}>
#include <seqan3/alignment/configuration/{align_config_result.hpp => align_config_score_type.hpp}>
#include <seqan3/alignment/configuration/align_config_aligned_ends.hpp> [deleted without replacement; is now part of seqan3::align_cfg::method_global]
#include <seqan3/{alignment/pairwise => core/algorithm}/alignment_range.hpp>
- In accordance with the standard, the following concepts have been renamed:
std::default_constructible
tostd::default_initializable
std::readable
tostd::indirectly_readable
std::writable
tostd::indirectly_writable
(#1860).
- The
seqan3::remove_cvref_t
has been replaced bystd::remove_cvref_t
(#2079).
- The
seqan3::begin()
,seqan3::end()
,seqan3::cbegin()
,seqan3::cend()
,seqan3::size()
,seqan3::empty()
functions have been deprecated. Usestd::ranges::{begin|end|cbegin|cend|size|empty}()
instead (#1663). - The
seqan3::forward_range
has been removed. Usestd::ranges::borrowed_range
instead (#2038). - The
seqan3::views:trim
has been renamed toseqan3::views:trim_quality
(#2025).
Header Changes:
#include <seqan3/range/views/{trim.hpp => trim_quality.hpp}>
- Moved
seqan3::search
fromsearch/algorithm/
tosearch/
(#1696). - The
seqan3::search_result_range
returns now aseqan3::search_result
which unifies the interface for all the search instances, e.g. using an index over a single text or a text collection (#1706). - Configuration refactoring:
- The configuration
seqan3::search_cfg::max_error
has been replaced by individual configuration elements:seqan3::search_cfg::max_error{seqan3::search_cfg::total}
toseqan3::search_cfg::max_error_total{}
seqan3::search_cfg::max_error{seqan3::search_cfg::insertion}
toseqan3::search_cfg::max_error_insertion{}
seqan3::search_cfg::max_error{seqan3::search_cfg::deletion}
toseqan3::search_cfg::max_error_deletion{}
seqan3::search_cfg::max_error{seqan3::search_cfg::substitution}
toseqan3::search_cfg::max_error_substitution{}
(#1861).
- The max error configurations can be initialised with either a
seqan3::search_cfg::error_rate
orseqan3::search_cfg::error_count
, and can be reassigned (#1861). - The configuration
seqan3::search_cfg::mode
has been replaced by individual configuration elements (#1639):seqan3::search_cfg::mode{seqan3::search_cfg::all}
toseqan3::search_cfg::hit_all{}
seqan3::search_cfg::mode{seqan3::search_cfg::best}
toseqan3::search_cfg::hit_single_best{}
seqan3::search_cfg::mode{seqan3::search_cfg::all_best}
toseqan3::search_cfg::hit_all_best{}
seqan3::search_cfg::mode{seqan3::search_cfg::strata{5}}
toseqan3::search_cfg::hit_strata{5}
- The
seqan3::search_cfg::hit_strata
member variablevalue
has been replaced tostratum
- The configuration
seqan3::search_cfg::output
has been replaced by individual configuration elements (#1862):seqan3::search_cfg::output{seqan3::search_cfg::text_position}
toseqan3::search_cfg::output_reference_begin_position{}
seqan3::search_cfg::output{seqan3::search_cfg::text_position}
toseqan3::search_cfg::output_index_cursor
seqan3::search_cfg::output_query_id{}
has been addedseqan3::search_cfg::output_reference_id{}
has been added
- The configuration
- Removed
seqan3::bi_fm_index_cursor::to_rev_cursor()
andseqan3::bi_fm_index::rev_cursor()
(#1892).
Header Changes:
#include <seqan3/search/{algorithm => }/search.hpp>
#include <seqan3/{search/search_result_range.hpp => core/algorithm/algorithm_result_generator_range.hpp}>
#include <seqan3/search/configuration/{mode.hpp => hit.hpp}>
#include <seqan3/search/configuration/{max_error_rate.hpp => max_error.hpp AND max_error_common.hpp}>
- When invoking the alignment algorithm with a user defined thread count using the
seqan3::align_cfg::parallel
configuration element, all available threads were used. This is now fixed and only the specified number of threads will be spawned (#1854). - Using an unsigned score type via the
seqan3::align_cfg::score_type
configuration is prevented with a static assert, since gaps and mismatches have negative scores and thus need a signed score type (#1891).
-
Long option identifiers and their value must be separated by a space or equal sign
=
. Applying this restriction resolves an ambiguity that occurs if one long option identifier is the prefix of another (#1792).Valid short id value pairs:
-iValue
,-i=Value
,-i Value
Valid long id value pairs:--id=Value
,--id Value
(prohibited now:--idValue
)
- The
seqan3::field::cigar
was added to the default fields for reading and writing alignment files (#1642). This has the following impact:- Reading and writing in one line is now possible without additional reference information:
seqan3::alignment_file_output{"foo.sam"} = seqan3::alignment_file_input{"bar.sam"};
- The
seqan3::alignment_file_output
now acceptsseqan3::field::cigar
andseqan3::field::alignment
although they store redundant information. For the SAM/BAM format this ambiguity is handled by favouring the CIGAR information at all times if present. Note that this breaks your code if you have not selected custom fields and used structural bindings!
- Reading and writing in one line is now possible without additional reference information:
- The
seqan3::fm_index_cursor::extend_right()
,seqan3::bi_fm_index_cursor::extend_right()
andseqan3::bi_fm_index_cursor::extend_left()
functions handle c-style strings without including the null character (#1588). seqan3::fm_index
andseqan3::bi_fm_index
construct the index correctly if a collection with a single text is passed as input (#1892).
- Added
size()
function toseqan3::views::kmer_hash
(#1722). operator[](difference_type const n)
of the iterator of theseqan3::views::kmer_hash
is declaredconst
and returns valuen
steps after the current position without jumping to that position (#1756).
Note that 3.1.0 will be the first API stable release and interfaces in this release might still change.
- Added
seqan3::semialphabet_any
, a semi-alphabet that type erases all other semi-alphabets of the same size (#981). - Added
seqan3::dna3bs
, an alphabet that mimics a bisulfite-treated dna4 sequence (#1191).
- The score type used in the alignment score matrix and the result type is configurable through a template
argument of the
seqan3::align_cfg::result
configuration (#1340). - The function
seqan3::align_pairwise
can be parallelised using theseqan3::align_cfg::parallel
configuration (#1379, #1444).
- Simplified reading file extensions from formatted files with the
seqan3::input_file_validator
andseqan3::output_file_validator
(#863). - The
seqan3::value_list_validator
is now constructible from a range or a parameter pack (#1298). - Enable subcommand argument parsing, see How-to for an example (#1185).
- The
seqan3::argument_parser::add_option
(and add_positional_option) calls allow enum types when using theseqan3::enumeration_names
customisation point (#1196).
find_package(SeqAn3)
is now case-insensitive and always populatesSEQAN3_*
variables in all upper-case (#1427).
- Added
seqan3::lzcnt
,seqan3::tzcnt
, andseqan3::popcount
for bit manipulation (#1141). - Added traits for "metaprogramming" with
seqan3::type_list
and type packs (#1204, #1214, #1273). - Added SIMD functions
seqan3::upcast
andseqan3::upcast_signed
(#1190).
- We increased our input performance using a faster iterator on the stream buffer (#1030).
- Support of padded alignments in the SAM/BAM format was added (#1173).
- Reading
seqan3::field::cigar
into a vector overseqan3::cigar
is supported viaseqan3::alignment_file_input
(#1192). - Writing
seqan3::field::cigar
into a vector overseqan3::cigar
is supported viaseqan3::alignment_file_output
(#1192). - Asynchronous input (background file reading) supported via
seqan3::view::async_input_buffer
(#1205).
- Added
seqan3::views::kmer_hash
, a view that computes hash values of an alphabet sequence given aseqan3::shape
(#946). - Added
seqan3::views::to
, a view that returns a container created from a range by copying all elements (#1033). - Added
seqan3::dynamic_bitset
, a container that stores single bits and has a dynamic size (#1153). - Added
seqan3::views::translate_join
, analogue toseqan3::views::translate
but returns a flattened range (#1171). - Added
seqan3::views::to_simd
, a view that transforms a range of ranges into chunks ofseqan3::simd
vectors (#1190). - Added
seqan3::views::as_const
, a view that provides onlyconst &
to elements of the underlying range (#1410). - Added
seqan3::views::move
, a view that turns lvalue-references into rvalue-references (#1410). - Renamed
seqan3::views::all
toseqan3::views::type_reduce
(#1410).
- The memory footprint of FM-indices over text collections was reduced (#1363).
- We provide a
std::to_chars
overload for floating point data types in ourseqan3/std/from_chars
header (#1160).
- The required version of the ranges-v3 library has increased: We now support the versions >= 0.10.0 and < 0.11.0, increasing the previous requirement of >= 0.5.0 and < 0.6.0 (#1471).
- Customising for third party types has changes slightly:
You are only affected if you added types to
seqan3::custom::
. Please see About Customisation (#1225). - All our concepts are named in the
snake_case
style (e.g.seqan3::WritableAlphabet
->seqan3::writable_alphabet
)! This change was motivated by the decision of the ISO C++ committee to also use snake case everywhere (#1235).
- The
seqan3::cigar
alphabet is not anseqan3::alphabet
anymore but only aseqan3::semialphabet
(#1285).
- The
seqan3::value_list_validator
is not constructible from a std::initialiser_list anymore (e.g.seqan3::value_list_validator{{1,2,3}}
does not work, useseqan3::value_list_validator{1,2,3}
instead) (#1298). - Changed class signature of input/output file validators:
Most user code will be unaffected; to fix possible compiler errors you need to add an empty template parameter list to
the respective instances (e.g. change
input_file_validator
toinput_file_validator<>
) (#863). - The member type that denotes which arguments a
validator
can validate has been renamed fromvalue_type
tooption_value_type
(#1394). - Some exception names were altered and some removed (#1467):
- The exception seqan3::parser_invalid_argument was renamed to seqan3::argument_parser_error.
- The exception seqan3::validation_failed was renamed to seqan3::validation_error.
- The exception seqan3::parser_design_error was renamed to seqan3::design_error and also inherits from seqan3::argument_parser_error.
- The exception seqan3::type_conversion_failed was deprecated, you can catch seqan3::user_input_error instead.
- The exception seqan3::overflow_error_on_conversion was deprecated, you can catch seqan3::user_input_error instead.
- find_package accepts minimum
versions (e.g.
find_package(SEQAN3 3.0.1)
requires at least SeqAn3 with a version of>= 3.0.1
and< 4.0.0
) (#1425). - The variable
SEQAN3_VERSION_STRING
defined byfind_package(SEQAN3)
was renamed toSEQAN3_VERSION
(#1425).
- The
type_list
header has moved: If you included<seqan3/core/type_list.hpp>
you need to change the path to<seqan3/core/type_list/type_list.hpp>
(#1204).
-
Removed the field-based in- and output interface for sequence and structure files through std::get and std::tie: Output can instead be achieved with
seqan3::views:zip()
, for input we will implementunzip()
in the future (#1398 #1412). -
The
seqan3::field::flag
of SAM/BAM input and output is now an enum instead of an integer, seeseqan3::sam_flag
(#1390). -
Uppercase
seqan3::field
names are deprecated. Use the lower case field names instead. You can easily find and replace all occurrences by the following regex: findfield::([A-Z_]+)
replacefield::\L$1
(#1421). -
Removed the char type from the input and output files: Most user code will be unaffected; however, if you have fully specified all templates of any of the input or output files in your code, you need to remove the template parameter to select the char type of the stream, e.g. change
seqan3::sequence_file_input<traits_t, fields_t, formats_t, char>
toseqan3::sequence_file_input<traits_t, fields_t, formats_t>
. Before this change, setting the char type gave the impression that also streams over wide characters are supported which is not the case yet (#1400).
- The
seqan3::concatenated_sequences::data()
function has been deprecated: Useseqan3::concatenated_sequences::raw_data()
instead (#1208). seqan3::to_char
must always return a built-in character type (#1285).seqan3/range/view
has be renamed toseqan3/range/views
(#1251).- namespace
seqan3::view
has been renamed toseqan3::views
(#1251).
-
Changed class signature of (bi_)fm_index: All code that relies on automatic template deduction will be unaffected. In case you specified the template parameters of a
seqan3::fm_index
orseqan3::bi_fm_index
you will need to add the alphabet type as first parameter and pass aseqan3::text_layout
instead of abool
to indicate the text layout (single, collection). For example,fm_index<false> index{text}
wheretext
is of typedna4_vector
needs to be changed tofm_index<dna4, text_layout::single> index{text}
(#1222). -
The
construct()
method of the (bi_)fm_index is now private: Use the constructorseqan3::fm_index::fm_index(text_t && text)
orseqan3::bi_fm_index::bi_fm_index(text_t && text)
instead (#1222). -
The
seqan3::fm_index::char_type
member was renamed toseqan3::fm_index::alphabet_type
The same applies for theseqan3::bi_fm_index
(#1433). -
The
seqan3::fm_index_cursor::index_char_type
member was renamed toseqan3::fm_index_cursor::index_alphabet_type
The same applies for theseqan3::bi_fm_index_cursor
(#1433).
- All our headers are self contained (#1085).
- The alignment algorithm with edit distance returns the correct back coordinate (#1093).
- Inserting or deleting gaps into an empty
seqan3::gap_decorator
does not cause assert anymore (#1109). - Some fixes to edge cases in BAM file writing (#1110).
- The application name of the
seqan3::argument_parser
is restricted to alpha-numeric characters and_
and-
(#1133). - Copying and moving the
seqan3::fm_index
andseqan3::bi_fm_index
now work properly (#1144). - Searching in the
seqan3::fm_index
andseqan3::bi_fm_index
constructed from a text collection containing a single text now returns the correct result (#1316). - The view
seqan3::views::take
is sized if the underlying range is sized (#1146). - The detection of the pthread library works correctly on linux based systems (#1200).
- The translation table for nucleotide to amino acid translation was corrected (#1485).
- The amino acid score matrices were corrected (#1455).
This is the initial release of SeqAn3. It is an entirely new library so there is no changelog that covers the differences to SeqAn2.
Note that 3.1.0 will be the first API stable release and interfaces in this release might still change.