]> git.donarmstrong.com Git - mothur.git/blob - alpha2.cpp
08f6e21cefab25906fa8b54a0afa330099a6079c
[mothur.git] / alpha2.cpp
1 //uchime by Robert C. Edgar http://drive5.com/uchime This code is donated to the public domain.\r
2 \r
3 #include "myutils.h"\r
4 #include "alpha.h"\r
5 #include "timing.h"\r
6 \r
7 bool isgap(byte c)\r
8         {\r
9         return c == '-' || c == '.';\r
10         }\r
11 \r
12 const char *WordToStrAmino(unsigned Word, unsigned WordLength)\r
13         {\r
14         static char Str[32];\r
15         for (unsigned i = 0; i < WordLength; ++i)\r
16                 {\r
17                 unsigned Letter = Word%20;\r
18                 Str[WordLength-i-1] = g_LetterToCharAmino[Letter];\r
19                 Word /= 20;\r
20                 }\r
21         Str[WordLength] = 0;\r
22         return Str;\r
23         }\r
24 \r
25 const char *WordToStrAmino2(unsigned Word, unsigned WordLength, char *Str)\r
26         {\r
27         for (unsigned i = 0; i < WordLength; ++i)\r
28                 {\r
29                 unsigned Letter = Word%20;\r
30                 Str[WordLength-i-1] = g_LetterToCharAmino[Letter];\r
31                 Word /= 20;\r
32                 }\r
33         Str[WordLength] = 0;\r
34         return Str;\r
35         }\r
36 \r
37 const char *WordToStrNucleo(unsigned Word, unsigned WordLength)\r
38         {\r
39         static char Str[32];\r
40         for (unsigned i = 0; i < WordLength; ++i)\r
41                 {\r
42                 unsigned Letter = Word%4;\r
43                 Str[WordLength-i-1] = g_LetterToCharNucleo[Letter];\r
44                 Word /= 4;\r
45                 }\r
46         Str[WordLength] = 0;\r
47         return Str;\r
48         }\r
49 \r
50 const char *WordToStr(unsigned Word, unsigned WordLength, bool Nucleo)\r
51         {\r
52         return (Nucleo ? WordToStrNucleo : WordToStrAmino)(Word, WordLength);\r
53         }\r
54 \r
55 byte *RevCompAlloc(const byte *Seq, unsigned L)\r
56         {\r
57         byte *RCSeq = MYALLOC(byte, L, Alpha);\r
58 \r
59         for (unsigned i = 0; i < L; ++i)\r
60                 RCSeq[L-i-1] = g_CharToCompChar[Seq[i]];\r
61 \r
62         return RCSeq;\r
63         }\r
64 \r
65 void RevCompInPlace(byte *Seq, unsigned L)\r
66         {\r
67         unsigned L1 = L - 1;\r
68         unsigned L2 = L/2;\r
69         for (unsigned i = 0; i < L2; ++i)\r
70                 {\r
71                 unsigned j = L1 - i;\r
72                 unsigned ci = Seq[i];\r
73                 unsigned cj = Seq[j];\r
74 \r
75                 unsigned ri = g_CharToCompChar[ci];\r
76                 unsigned rj = g_CharToCompChar[cj];\r
77 \r
78                 Seq[i] = rj;\r
79                 Seq[j] = ri;\r
80                 }\r
81 \r
82         if (L%2 == 1)\r
83                 Seq[L2] = g_CharToCompChar[Seq[L2]];\r
84         }\r
85 \r
86 void RevComp(const byte *Seq, unsigned L, byte *RCSeq)\r
87         {\r
88         for (unsigned i = 0; i < L; ++i)\r
89                 RCSeq[L-i-1] = g_CharToCompChar[Seq[i]];\r
90         }\r
91 \r
92 unsigned char GetAminoCharFrom3NucChars(unsigned char c1, unsigned char c2,\r
93   unsigned char c3)\r
94         {\r
95         unsigned Letter1 = g_CharToLetterNucleo[c1];\r
96         unsigned Letter2 = g_CharToLetterNucleo[c2];\r
97         unsigned Letter3 = g_CharToLetterNucleo[c3];\r
98         unsigned Word = Letter1*(4*4) + Letter2*4 + Letter3;\r
99 \r
100         unsigned Letter = g_CodonWordToAminoLetter[Word];\r
101         return g_LetterToCharAmino[Letter];\r
102         }\r