SeqAn3  3.2.0
The Modern C++ library for sequence analysis.
Changelog

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/seqan/3-master-user/howto_porting.html

See the documentation on API stability to learn about when API changes are allowed.

3.2.0

New features

Alphabet

I/O

  • 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).

Search

  • Improved performance of seqan3::counting_vector::operator+= (#2930).

Utility

Notable Bug-fixes

Core

  • Added missing implementations for AVX512 (#2920 and #2926).

IO

  • FASTA files containing IDs starting with >, e.g., > >MyID, are now parsed correctly (#2869).

Search

Utility

  • seqan3::views::single_pass_input cannot propagate the std::ranges::output_range property because it cannot satisfy the following requirement (#2775): ```cpp *it++ = value; // must be the same as *it = value; ++it; // but it actually would be the same as ++it; *it = value; ``
  • Fixed signature ofseqan3::detail::store_sse4`. This might have affected some public API (#2893).
  • Relaxed seqan3::views::to_simd requirements to be C++20-compatible (#2849).

API changes

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.

Compiler

  • Dropped support for GCC 7 and 8 (#2891).
  • Dropped support for GCC 9 (#2952).
  • Removed C++17 support (#2915).

I/O

  • Changed the default of output_options::fasta_blank_before_id to false (#2769).
  • Changed the default of bgzf_thread_count to 4. 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).

Range

  • Replaced seqan3::views::to (implemented via range-v3) with seqan3::ranges::to (implemented in SeqAn3). seqan3::ranges::to provides a subset of C++23's std::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's std::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's std::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's std::views::zip and will be replaced with the STL-equivalent in a future version (#2971).

Dependencies

  • 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).

3.1.0

New features

Build system

  • We now use Doxygen version 1.9.2 to build our documentation (#2765).

Notable Bug-fixes

Argument Parser

  • Fixed an issue that led to the wrong option type being printed on errors (#2836).

Search

  • Resolved an issue that prevented the FM-Index from being constructed correctly for inputs larger than 4 GiB (#2756).

API changes

The files deprecated in 3.0.3 (denoted by [deleted without replacement]) have been removed.

3.0.3

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.

New features

Alphabet

  • 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).

Argument Parser

Build system

  • We now use Doxygen version 1.9.1 to build our documentation (#2327).

I/O

  • Explicit record-classes with explicit member accessor for our file implementations. We added seqan3::sequence_record for seqan3::sequence_file_(in|out)put, seqan3::sam_record for seqan3::sam_file_(in|out)put and seqan3::structure_record for seqan3::structure_file_(in|out)put. You can now access the id in a sequence file (e.g. fasta file) record via record.id() instead of seqan3::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)

Search

Notable Bug-fixes

Argument Parser

Range

  • The seqan3::views::kmer_hash does not return wrong values when combined with std::views::reverse on a text of the same size as the kmer (#2416).

I/O

  • 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 in bgzf-compressed output. This change may have following effects (#2458):
    • A noticeable slowdown when writing gz-compressed content since, in contrast to bgzf, gz does not feature parallelisation (magnitude depends on the application and level of parallelisation).
    • A reduced output size when writing gz-compressed content due to gz storing less metadata than bgzf (up to 20% smaller file size).
    • The processed data should experience no negative effects since gz and bgzf are fully compatible.
    • This bug may also cause unexpected parallelisation when reading gz-compressed input. This is the case when the gz-compressed input was also generated with SeqAn.
  • 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.

API changes

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/master/test/api_stability/3.0.2.

Alignment

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]

Alphabet

  • We relaxed some requirements of seqan3::alphabet_base<alphabet_t> (#2427):

    • Old requirements: alphabet_t::rank_to_char and alphabet_t::char_to_rank must be lookup tables.
    • New requirements: alphabet_t::rank_to_char and alphabet_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 rank 0 or char -, or seqan3::phred42 where the rank and char representations are offset by a fixed value.

  • 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.
  • 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 to seqan3::phred68solexa (#2522).
  • Renamed seqan3::sam_dna16 to seqan3::dna16sam (#2521).
  • Removed phred constructors (#2537):
    • Use seqan3::phred42::assign_phred() or seqan3::operator""_phred42 instead of seqan3::phred42(phred_type).
    • Use seqan3::phred63::assign_phred() or seqan3::operator""_phred63 instead of seqan3::phred63(phred_type).
    • Use seqan3::phred94::assign_phred() or seqan3::operator""_phred94 instead of seqan3::phred94(phred_type).
    • Use seqan3::phred68legacy::assign_phred() or seqan3::operator""_phred68legacy instead of seqan3::phred68legacy(phred_type).
  • Renamed seqan3::quality_base to seqan3::phred_base (#2539).
  • Added the seqan3::literals namespace containing all literals. This adds the option to use using namespace seqan3::literals to import literal operators. The old way of explicitly importing specific operators via using seqan3::operator""_{dna4, rna4, ...} is not affected by this change (#2568).
    • Breaking change: Swapped the meaning of seqan3::alphabet_variant::is_alternative and seqan3::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>
@ cigar
The cigar vector (std::vector<seqan3::cigar>) representing the alignment in SAM/BAM format.

Argument Parser

  • 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 by seqan3::option_spec::standard.
    • seqan3::option_spec::REQUIRED is replaced by seqan3::option_spec::required.
    • seqan3::option_spec::ADVANCED is replaced by seqan3::option_spec::advanced.
    • seqan3::option_spec::HIDDEN is replaced by seqan3::option_spec::hidden.

Core

  • 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>
configuration(config_t) -> configuration< config_t >
Deduces the correct configuration element type from the passed seqan3::pipeable_config_element.
decltype(detail::transform< trait_t >(list_t{})) transform
Apply a transformation trait to every type in the list and return a seqan3::type_list of the results.
Definition: type_list/traits.hpp:469
constexpr detail::iota_simd_view_fn< index_simd_t > iota_simd
An iota view over a simd vector.
Definition: iota_simd.hpp:274
constexpr auto to_simd
A view that transforms a range of ranges into chunks of seqan3::simd vectors.
Definition: to_simd.hpp:782
common_tuple(UTypes...) -> common_tuple< UTypes... >
Class template argument deduction guide.
pod_tuple(types &&...) -> pod_tuple< types... >
User defined deduction guide enables easy use.

I/O

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>
sam_flag
An enum flag that describes the properties of an aligned read (given as a SAM record).
Definition: sam_flag.hpp:76

Range

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>
small_string(char const(&)[N]) -> small_string< N - 1 >
Deduces small_string from string literals.
deep(underlying_adaptor_t &&inner) -> deep< underlying_adaptor_t >
Template argument deduction helper that preserves lvalue references and turns rvalue references into ...
constexpr auto complement
Return the complement of a nucleotide object.
Definition: alphabet/nucleotide/concept.hpp:105
constexpr auto translate_join
A view that translates nucleotide into aminoacid alphabet with 1, 2, 3 or 6 frames....
Definition: translate_join.hpp:381
constexpr auto minimiser_hash
Computes minimisers for a range with a given shape, window size and seed.
Definition: minimiser_hash.hpp:193
constexpr auto translate
A view that translates nucleotide into aminoacid alphabet with 1, 2, 3 or 6 frames.
Definition: translate.hpp:803
requires writable_semialphabet< alphabet_type > auto const rank_to
A view over an alphabet, given a range of ranks.
Definition: rank_to.hpp:66
auto const char_to
A view over an alphabet, given a range of characters.
Definition: char_to.hpp:67
constexpr auto trim_quality
A view that does quality-threshold trimming on a range of seqan3::quality_alphabet.
Definition: trim_quality.hpp:129
constexpr auto to_char
Return the char representation of an alphabet object.
Definition: alphabet/concept.hpp:386
constexpr auto to_rank
Return the rank representation of a (semi-)alphabet object.
Definition: alphabet/concept.hpp:155
constexpr auto & get(configuration< configs_t... > &config) noexcept
Returns the stored element.
Definition: configuration.hpp:405
constexpr auto async_input_buffer
A view adapter that returns a concurrent-queue-like view over the underlying range.
Definition: async_input_buffer.hpp:481
constexpr auto minimiser
Computes minimisers for a range of comparable values. A minimiser is the smallest value in a window.
Definition: minimiser.hpp:586
constexpr auto kmer_hash
Computes hash values for each position of a range via a given shape.
Definition: kmer_hash.hpp:750
requires std::ranges::forward_range< std::ranges::range_reference_t< queries_t > > &&std::same_as< range_innermost_value_t< queries_t >, typename index_t::alphabet_type > auto search(queries_t &&queries, index_t const &index, configuration_t const &cfg=search_cfg::default_configuration)
Search a query or a range of queries in an index.
Definition: search.hpp:103
constexpr auto to(args_t &&... args)
Converts a range to a container.
Definition: range/to.hpp:114
decltype(detail::repeat< count, t >()) repeat
Create a type list with the given type repeated count times..
Definition: type_list/traits.hpp:503
constexpr auto join_with
A view adaptor that represents view consisting of the sequence obtained from flattening a view of ran...
Definition: join_with.hpp:531
constexpr auto single_pass_input
A view adapter that decays most of the range properties and adds single pass behavior.
Definition: single_pass_input.hpp:348
constexpr auto chunk
Divide a range in chunks.
Definition: chunk.hpp:835
constexpr auto slice
A view adaptor that returns a half-open interval on the underlying range.
Definition: slice.hpp:178
constexpr auto zip
A view adaptor that takes several views and returns tuple-like values from every i-th element of each...
Definition: zip.hpp:573
constexpr auto convert
A view that converts each element in the input range (implicitly or via static_cast).
Definition: utility/views/convert.hpp:69
constexpr auto repeat_n
A view factory that repeats a given value n times.
Definition: repeat_n.hpp:91
constexpr auto enforce_random_access
A view adaptor that converts a pseudo random access range to a std::ranges::random_access_range.
Definition: enforce_random_access.hpp:350
constexpr auto elements
A view calling get on each element in a range.
Definition: elements.hpp:80
constexpr auto type_reduce
A view adaptor that behaves like std::views::all, but type erases certain ranges.
Definition: type_reduce.hpp:150
constexpr auto pairwise_combine
A view adaptor that generates all pairwise combinations of the elements of the underlying range.
Definition: pairwise_combine.hpp:652
constexpr auto interleave
A view that interleaves a given range into another range at regular intervals.
Definition: interleave.hpp:379
The generic alphabet concept that covers most data types used in ranges.
The (most general) container concept as defined by the standard library.
The generic concept for a (biological) sequence.
gap_decorator(urng_t range) -> gap_decorator< urng_t >
Views always deduce to their respective type because they are copied.
small_vector(value_type const (&array)[capacity2]) -> small_vector< value_type, capacity2 >
Deducts the size and value type from an built-in array on construction.

Search

  • 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 is seqan3::[bi_]fm_index_cursor as a substitute. (#2348)

3.0.2

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.

New features

Alignment

Argument Parser

I/O

Build system

  • Add top-level CMakeLists.txt (#1475).
  • We now use Doxygen version 1.8.20 to build our documentation (#2081).

Range

Search

API changes

  • 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).

Alignment

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>
Sets the global alignment method.
Definition: align_config_method.hpp:122

Core

  • In accordance with the standard, the following concepts have been renamed:
    • std::default_constructible to std::default_initializable
    • std::readable to std::indirectly_readable
    • std::writable to std::indirectly_writable (#1860).
  • The seqan3::remove_cvref_t has been replaced by std::remove_cvref_t (#2079).

Range

  • The seqan3::begin(), seqan3::end(), seqan3::cbegin(), seqan3::cend(), seqan3::size(), seqan3::empty() functions have been deprecated. Use std::ranges::{begin|end|cbegin|cend|size|empty}() instead (#1663).
  • The seqan3::forward_range has been removed. Use std::ranges::borrowed_range instead (#2038).
  • The seqan3::views:trim has been renamed to seqan3::views:trim_quality (#2025).

Header Changes:

#include <seqan3/range/views/{trim.hpp => trim_quality.hpp}>

Search

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}>
algorithm_result_generator_range(algorithm_executor_type &&) -> algorithm_result_generator_range< std::remove_reference_t< algorithm_executor_type >>
Deduces from the passed algorithm_executor_type.

Notable Bug-fixes

Alignment

  • 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).

Argument Parser

  • 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)

I/O

  • The seqan3::field::cigar was added to the default fields for reading and writing alignment files (#1642). This has the following impact:
    1. 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"};
    2. The seqan3::alignment_file_output now accepts seqan3::field::cigar and seqan3::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!

Search

Range

3.0.1

Note that 3.1.0 will be the first API stable release and interfaces in this release might still change.

New features

Alphabet

Alignment

Argument parser

Build system

  • find_package(SeqAn3) is now case-insensitive and always populates SEQAN3_* variables in all upper-case (#1427).

Core

  • Added seqan3::lzcnt, seqan3::tzcnt, and seqan3::popcount for bit manipulation (#1141).
  • Added traits for "metaprogramming" with seqan3::type_list and type packs (#1204, #1214, #1273).
  • Added SIMD functions seqan3::upcast and seqan3::upcast_signed (#1190).

I/O

  • 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 over seqan3::cigar is supported via seqan3::alignment_file_input (#1192).
  • Writing seqan3::field::cigar into a vector over seqan3::cigar is supported via seqan3::alignment_file_output (#1192).
  • Asynchronous input (background file reading) supported via seqan3::view::async_input_buffer (#1205).

Range

Search

  • The memory footprint of FM-indices over text collections was reduced (#1363).

Std

  • We provide a std::to_chars overload for floating point data types in our seqan3/std/from_chars header (#1160).

API changes

  • 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).

Alphabet

Argument parser

Build system

  • 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 by find_package(SEQAN3) was renamed to SEQAN3_VERSION (#1425).

Core

  • 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).

I/O

  • 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 implement unzip() in the future (#1398 #1412).
  • The seqan3::field::flag of SAM/BAM input and output is now an enum instead of an integer, see seqan3::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: find field::([A-Z_]+) replace field::\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> to seqan3::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).

Range

Search

  • 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 or seqan3::bi_fm_index you will need to add the alphabet type as first parameter and pass a seqan3::text_layout instead of a bool to indicate the text layout (single, collection). For example, fm_index<false> index{text} where text is of type dna4_vector needs to be changed to fm_index<dna4, text_layout::single> index{text} (#1222).
  • The construct() method of the (bi_)fm_index is now private: Use the constructor seqan3::fm_index::fm_index(text_t && text) or seqan3::bi_fm_index::bi_fm_index(text_t && text) instead (#1222).
  • The seqan3::fm_index::char_type member was renamed to seqan3::fm_index::alphabet_type The same applies for the seqan3::bi_fm_index (#1433).
  • The seqan3::fm_index_cursor::index_char_type member was renamed to seqan3::fm_index_cursor::index_alphabet_type The same applies for the seqan3::bi_fm_index_cursor (#1433).

Notable Bug-fixes

  • 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 and seqan3::bi_fm_index now work properly (#1144).
  • Searching in the seqan3::fm_index and seqan3::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).

3.0.0 ("Escala")

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.