btllib
seq.hpp
1 #ifndef BTLLIB_SEQ_HPP
2 #define BTLLIB_SEQ_HPP
3 
4 #include "status.hpp"
5 
6 #include <algorithm>
7 #include <string>
8 
9 namespace btllib {
10 
11 // clang-format off
12 static const char COMPLEMENTS[256] = {
13  0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
14  0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
15 
16 // ! " # $ % & ' ( ) * + , - . /
17  0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , '-' , '.', 0 ,
18 
19 // 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
20  0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
21 
22 // @ A B C D E F G H I J K L M N O
23  0 , 'T', 'V', 'G', 'H', 0 , 0 , 'C', 'D', 0 , 0 , 'M', 0 , 'K', 'N', 0 ,
24 
25 // P Q R S T U V W X Y Z [ \ ] ^ _
26  0 , 0 , 'Y', 'S', 'A', 'U', 'B', 'W', 0 , 'R', 0 , 0 , 0 , 0 , 0 , 0 ,
27 
28 // ` a b c d e f g h i j k l m n o
29  0 , 't', 'v', 'g', 'h', 0 , 0 , 'c', 'd', 0 , 0 , 'm', 0 , 'k', 'n', 0 ,
30 
31 // p q r s t u v w x y z { | } ~ DEL
32  0 , 0 , 'y', 's', 'a', 'u', 'b', 'w', 0 , 'r', 0 , 0 , 0 , 0 , 0 , 0 ,
33 
34  0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
35  0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
36  0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
37  0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
38  0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
39  0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
40  0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
41  0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
42 };
43 
44 static const char CAPITALS[256] = {
45  0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
46  0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
47 
48 // ! " # $ % & ' ( ) * + , - . /
49  0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , '-' , '.', 0 ,
50 
51 // 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
52  0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
53 
54 // @ A B C D E F G H I J K L M N O
55  0 , 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
56 
57 // P Q R S T U V W X Y Z [ \ ] ^ _
58  'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 0 , 0 , 0 , 0 , 0 ,
59 
60 // ` a b c d e f g h i j k l m n o
61  0 , 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
62 
63 // p q r s t u v w x y z { | } ~ DEL
64  'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 0 , 0 , 0 , 0 , 0 ,
65 
66  0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
67  0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
68  0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
69  0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
70  0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
71  0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
72  0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
73  0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
74 };
75 // clang-format on
76 
77 inline void
78 reverse_complement(std::string& seq)
79 {
80  std::reverse(seq.begin(), seq.end());
81  std::transform(seq.begin(), seq.end(), seq.begin(), [](char c) {
82  return COMPLEMENTS[unsigned(c)];
83  });
84 }
85 
86 inline std::string
87 get_reverse_complement(const std::string& seq)
88 {
89  std::string rc(seq);
90  reverse_complement(rc);
91  return rc;
92 }
93 
94 } // namespace btllib
95 
96 #endif