SeqAn3  3.0.3
The Modern C++ library for sequence analysis.
translation.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 
15 #include <tuple>
16 
21 
22 namespace seqan3
23 {
24 
25 // forwards:
26 class dna4;
27 class dna5;
28 class dna15;
29 class rna4;
30 class rna5;
31 class rna15;
32 
54 template <genetic_code gc = genetic_code::canonical, nucleotide_alphabet nucl_type>
55 constexpr aa27 translate_triplet(nucl_type const & n1, nucl_type const & n2, nucl_type const & n3) noexcept
56 {
57  if constexpr (std::same_as<nucl_type, dna4> || std::same_as<nucl_type, dna5> || std::same_as<nucl_type, dna15>)
58  {
59  // table exists for dna15 and is generated for dna4 and dna5 (compile time ok, because small)
60  return seqan3::detail::translation_table<nucl_type, gc>::value[to_rank(n1)][to_rank(n2)][to_rank(n3)];
61  }
62  else if constexpr (std::same_as<nucl_type, rna4> || std::same_as<nucl_type, rna5> || std::same_as<nucl_type, rna15>)
63  {
67 
68  // we can use dna's tables, because ranks are identical
69  return seqan3::detail::translation_table<rna2dna_t, gc>::value[to_rank(n1)][to_rank(n2)][to_rank(n3)];
70  }
71  else // composites or user defined nucleotide
72  {
73  // we cast to dna15; slightly slower run-time, but lot's of compile time saved for large alphabets.
74  // (nucleotide types can be converted to dna15 by definition)
75  return seqan3::detail::translation_table<dna15, gc>::value[to_rank(static_cast<dna15>(n1))]
76  [to_rank(static_cast<dna15>(n2))]
77  [to_rank(static_cast<dna15>(n3))];
78  }
79 }
80 
81 #ifdef SEQAN3_DEPRECATED_310
101 template <genetic_code gc = genetic_code::canonical, typename tuple_type>
103  requires (std::tuple_size<tuple_type>::value == 3) &&
108 constexpr aa27 translate_triplet SEQAN3_DEPRECATED_310 (tuple_type const & input_tuple) noexcept
109 {
110  return translate_triplet(std::get<0>(input_tuple), std::get<1>(input_tuple), std::get<2>(input_tuple));
111 }
112 
132 template <genetic_code gc = genetic_code::canonical, std::ranges::input_range range_type>
136 constexpr aa27 translate_triplet SEQAN3_DEPRECATED_310 (range_type && input_range)
137 {
138  auto n1 = std::ranges::begin(input_range);
139  auto n2 = ++n1;
140  auto n3 = ++n2;
141 
142  assert(n1 != std::ranges::end(input_range));
143  assert(n2 != std::ranges::end(input_range));
144  assert(n3 != std::ranges::end(input_range));
145 
146  return translate_triplet(*n1, *n2, *n3);
147 }
148 
168 template <genetic_code gc = genetic_code::canonical, std::ranges::random_access_range rng_t>
172 constexpr aa27 translate_triplet SEQAN3_DEPRECATED_310 (rng_t && input_range)
173 {
174  assert(std::ranges::begin(input_range) != std::ranges::end(input_range));
175  assert(std::ranges::begin(input_range) + 1 != std::ranges::end(input_range));
176  assert(std::ranges::begin(input_range) + 2 != std::ranges::end(input_range));
177 
178  return translate_triplet(input_range[0], input_range[1], input_range[2]);
179 }
180 #endif // SEQAN3_DEPRECATED_310
181 
182 } // namespace seqan3
Provides seqan3::aa27, container aliases and string literals.
The twenty-seven letter amino acid alphabet.
Definition: aa27.hpp:46
The 15 letter DNA alphabet, containing all IUPAC smybols minus the gap.
Definition: dna15.hpp:51
The four letter DNA alphabet of A,C,G,T.
Definition: dna4.hpp:53
The five letter DNA alphabet of A,C,G,T and the unknown character N.
Definition: dna5.hpp:51
Provides various transformation traits used by the range module.
constexpr auto to_rank
Return the rank representation of a (semi-)alphabet object.
Definition: concept.hpp:155
constexpr aa27 translate_triplet(nucl_type const &n1, nucl_type const &n2, nucl_type const &n3) noexcept
Translate one nucleotide triplet into single amino acid (single nucleotide interface).
Definition: translation.hpp:55
A concept that indicates whether an alphabet represents nucleotides.
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
Provides translation details for nucleotide to aminoacid translation.
Genetic codes used for translating a triplet of nucleotides into an amino acid.