SeqAn3  3.0.3
The Modern C++ library for sequence analysis.
phred_base.hpp
Go to the documentation of this file.
1 // -----------------------------------------------------------------------------------------------------
2 // Copyright (c) 2006-2021, Knut Reinert & Freie Universität Berlin
3 // Copyright (c) 2016-2021, 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 
16 #include <seqan3/alphabet/detail/convert.hpp>
18 
19 namespace seqan3
20 {
21 
29 template <typename derived_type, size_t size>
30 class phred_base : public alphabet_base<derived_type, size, char>
31 {
32 public:
40  using phred_type = int8_t;
42 
43 private:
46 
48  friend base_t;
49 
53  constexpr phred_base() noexcept = default;
54  constexpr phred_base(phred_base const &) noexcept = default;
55  constexpr phred_base(phred_base &&) noexcept = default;
56  constexpr phred_base & operator=(phred_base const &) noexcept = default;
57  constexpr phred_base & operator=(phred_base &&) noexcept = default;
58  ~phred_base() noexcept = default;
59 
60 #ifdef SEQAN3_DEPRECATED_310
65  SEQAN3_DEPRECATED_310 constexpr phred_base(phred_type const p) noexcept
66  {
67  static_cast<derived_type *>(this)->assign_phred(p);
68  }
70 #endif // SEQAN3_DEPRECATED_310
71 
73  friend derived_type;
74 
75 public:
76  // Import from base type:
78  using base_t::to_rank;
79  using base_t::assign_rank;
80  using typename base_t::char_type;
81  using typename base_t::rank_type;
82 
86  // This constructor needs to be public, because constructor templates are not inherited otherwise
91  template <typename other_qual_type>
93  requires (!std::same_as<phred_base, other_qual_type>) &&
94  (!std::same_as<derived_type, other_qual_type>) &&
97  explicit constexpr phred_base(other_qual_type const & other) noexcept
98  {
99  assign_phred_to(seqan3::to_phred(other), static_cast<derived_type &>(*this));
100  }
102 
112  constexpr phred_type to_phred() const noexcept
113  {
114  return rank_to_phred[to_rank()];
115  }
117 
137  constexpr derived_type & assign_phred(phred_type const p) noexcept
138  {
139  return assign_rank(phred_to_rank[static_cast<rank_type>(p)]);
140  }
142 
143 private:
145  static std::array<rank_type, 256> constexpr phred_to_rank
146  {
147  [] () constexpr
148  {
150 
151  for (int64_t i = std::numeric_limits<phred_type>::lowest(); i <= std::numeric_limits<phred_type>::max(); ++i)
152  {
153  if (i < derived_type::offset_phred) // map too-small to smallest possible
154  ret[static_cast<rank_type>(i)] = 0;
155  else if (i >= derived_type::offset_phred + alphabet_size) // map too-large to highest possible
156  ret[static_cast<rank_type>(i)] = alphabet_size - 1;
157  else // map valid range to identity
158  ret[static_cast<rank_type>(i)] = i - derived_type::offset_phred;
159  }
160  return ret;
161  }()
162  };
163 
165  static std::array<phred_type, alphabet_size> constexpr rank_to_phred
166  {
167  [] () constexpr
168  {
170 
171  for (size_t i = 0; i < alphabet_size; ++i)
172  ret[i] = i + derived_type::offset_phred;
173 
174  return ret;
175  }()
176  };
177 
179  static constexpr rank_type char_to_rank(char_type const chr)
180  {
181  int64_t difference = static_cast<int64_t>(chr) - static_cast<int64_t>(derived_type::offset_char);
182  return std::clamp<int64_t>(difference, 0, alphabet_size - 1);
183  }
184 
186  static constexpr char_type rank_to_char(rank_type const rank)
187  {
188  return rank + derived_type::offset_char;
189  }
190 };
191 
192 } // namespace seqan3
Quality alphabet concept.
Provides seqan3::alphabet_base.
A CRTP-base that makes defining a custom alphabet easier.
Definition: alphabet_base.hpp:81
constexpr rank_type to_rank() const noexcept
Return the letter's numeric value (rank in the alphabet).
Definition: alphabet_base.hpp:185
detail::min_viable_uint_t< size - 1 > rank_type
The type of the alphabet when represented as a number (e.g. via to_rank()).
Definition: alphabet_base.hpp:104
static constexpr detail::min_viable_uint_t< size > alphabet_size
The size of the alphabet, i.e. the number of different values it can take.
Definition: alphabet_base.hpp:276
constexpr derived_type & assign_rank(rank_type const c) noexcept
Assign from a numeric value.
Definition: alphabet_base.hpp:264
std::conditional_t< std::same_as< char, void >, char, char > char_type
The char representation; conditional needed to make semi alphabet definitions legal.
Definition: alphabet_base.hpp:96
A CRTP-base that refines seqan3::alphabet_base and is used by the quality alphabets.
Definition: phred_base.hpp:31
constexpr phred_type to_phred() const noexcept
Return the alphabet's value in Phred score representation.
Definition: phred_base.hpp:112
constexpr derived_type & assign_phred(phred_type const p) noexcept
Assign from the numeric Phred score value.
Definition: phred_base.hpp:137
constexpr phred_base(other_qual_type const &other) noexcept
Allow explicit construction from any other quality type by means of the Phred score representation.
Definition: phred_base.hpp:97
int8_t phred_type
The integer representation of the quality score.
Definition: phred_base.hpp:40
constexpr auto to_phred
The public getter function for the Phred representation of a quality score.
Definition: concept.hpp:100
constexpr auto assign_phred_to
Assign a Phred score to a quality alphabet object.
Definition: concept.hpp:231
A concept that indicates whether an alphabet represents quality scores.
The main SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:29
#define SEQAN3_DEPRECATED_310
Deprecation message for SeqAn 3.1.0 release.
Definition: platform.hpp:203