SeqAn3 3.3.0-rc.1
The Modern C++ library for sequence analysis.
minimiser_hash.hpp
Go to the documentation of this file.
1// -----------------------------------------------------------------------------------------------------
2// Copyright (c) 2006-2022, Knut Reinert & Freie Universität Berlin
3// Copyright (c) 2016-2022, Knut Reinert & MPI für molekulare Genetik
4// This file may be used, modified and/or redistributed under the terms of the 3-clause BSD-License
5// shipped with this file and also available at: https://github.com/seqan/seqan3/blob/master/LICENSE.md
6// -----------------------------------------------------------------------------------------------------
7
13#pragma once
14
19
20namespace seqan3
21{
24struct seed : seqan3::detail::strong_type<uint64_t, seed>
25{
27};
28
31struct window_size : seqan3::detail::strong_type<uint32_t, window_size>
32{
34};
35} // namespace seqan3
36
37namespace seqan3::detail
38{
42{
49 constexpr auto operator()(shape const & shape, window_size const window_size) const
50 {
52 }
53
61 constexpr auto operator()(shape const & shape, window_size const window_size, seed const seed) const
62 {
64 }
65
75 template <std::ranges::range urng_t>
76 constexpr auto operator()(urng_t && urange,
77 shape const & shape,
79 seed const seed = seqan3::seed{0x8F3F73B5CF1C9ADE}) const
80 {
81 static_assert(std::ranges::viewable_range<urng_t>,
82 "The range parameter to views::minimiser_hash cannot be a temporary of a non-view range.");
83 static_assert(std::ranges::forward_range<urng_t>,
84 "The range parameter to views::minimiser_hash must model std::ranges::forward_range.");
86 "The range parameter to views::minimiser_hash must be over elements of seqan3::semialphabet.");
87
88 if (shape.size() > window_size.get())
89 throw std::invalid_argument{"The size of the shape cannot be greater than the window size."};
90
91 auto forward_strand = std::forward<urng_t>(urange) | seqan3::views::kmer_hash(shape)
93 [seed](uint64_t i)
94 {
95 return i ^ seed.get();
96 });
97
98 auto reverse_strand = std::forward<urng_t>(urange) | seqan3::views::complement | std::views::reverse
101 [seed](uint64_t i)
102 {
103 return i ^ seed.get();
104 })
105 | std::views::reverse;
106
107 return seqan3::detail::minimiser_view(forward_strand, reverse_strand, window_size.get() - shape.size() + 1);
108 }
109};
110
111} // namespace seqan3::detail
112
113namespace seqan3::views
114{
115
194
196
197} // namespace seqan3::views
Template for range adaptor closure objects that store arguments and wrap a proto-adaptor.
Definition: adaptor_from_functor.hpp:57
CRTP base class to declare a strong typedef for a regular type to avoid ambiguous parameter settings ...
Definition: strong_type.hpp:177
constexpr value_t & get() &noexcept
Returns the underlying value.
Definition: strong_type.hpp:204
constexpr strong_type() noexcept=default
Defaulted.
constexpr size_type size() const noexcept
Returns the number of elements in the container, i.e. std::distance(begin(), end()).
Definition: dynamic_bitset.hpp:1233
A class that defines which positions of a pattern to hash.
Definition: shape.hpp:60
Provides seqan3::views::complement.
constexpr auto minimiser_hash
Computes minimisers for a range with a given shape, window size and seed.
Definition: minimiser_hash.hpp:193
auto const complement
A view that converts a range of nucleotides to their complement.
Definition: complement.hpp:67
constexpr auto kmer_hash
Computes hash values for each position of a range via a given shape.
Definition: kmer_hash.hpp:750
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:470
The basis for seqan3::alphabet, but requires only rank interface (not char).
Provides seqan3::views::kmer_hash.
Provides seqan3::views::minimiser.
The internal SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:29
minimiser_view(rng1_t &&, size_t const window_size) -> minimiser_view< std::views::all_t< rng1_t > >
A deduction guide for the view class template.
The SeqAn namespace for views.
Definition: char_strictly_to.hpp:22
The main SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:29
Provides basic data structure for strong types.
seqan3::views::minimiser_hash's range adaptor object type (non-closure).
Definition: minimiser_hash.hpp:42
constexpr auto operator()(shape const &shape, window_size const window_size) const
Store the shape and the window size and return a range adaptor closure object.
Definition: minimiser_hash.hpp:49
constexpr auto operator()(shape const &shape, window_size const window_size, seed const seed) const
Store the shape, the window size and the seed and return a range adaptor closure object.
Definition: minimiser_hash.hpp:61
constexpr auto operator()(urng_t &&urange, shape const &shape, window_size const window_size, seed const seed=seqan3::seed{0x8F3F73B5CF1C9ADE}) const
Call the view's constructor with the underlying view, a seqan3::shape and a window size as argument.
Definition: minimiser_hash.hpp:76
strong_type for seed.
Definition: minimiser_hash.hpp:25
strong_type for the window_size.
Definition: minimiser_hash.hpp:32