1 | /********************************************************************************* |
---|
2 | * Coded by Ralf Westram (coder@reallysoft.de) in 2001 * |
---|
3 | * Institute of Microbiology (Technical University Munich) * |
---|
4 | * http://www.mikro.biologie.tu-muenchen.de/ * |
---|
5 | *********************************************************************************/ |
---|
6 | |
---|
7 | #include <stdio.h> |
---|
8 | #include <stdlib.h> |
---|
9 | #include <ctype.h> |
---|
10 | |
---|
11 | #include "arbdb.h" |
---|
12 | #include "arbdbt.h" |
---|
13 | |
---|
14 | /* -------------------------------------------------------------------------------- reverse complement functions */ |
---|
15 | |
---|
16 | |
---|
17 | |
---|
18 | char GBT_complementNucleotide(char c, char T_or_U) |
---|
19 | { |
---|
20 | char n = c; |
---|
21 | |
---|
22 | switch (c) |
---|
23 | { |
---|
24 | case 'A': n = T_or_U; break; /* A <-> TU */ |
---|
25 | case 'a': n = tolower(T_or_U); break; |
---|
26 | case 'U': |
---|
27 | case 'T': n = 'A'; break; |
---|
28 | case 'u': |
---|
29 | case 't': n = 'a'; break; |
---|
30 | |
---|
31 | case 'C': n = 'G'; break; /* C <-> G */ |
---|
32 | case 'c': n = 'g'; break; |
---|
33 | case 'G': n = 'C'; break; |
---|
34 | case 'g': n = 'c'; break; |
---|
35 | |
---|
36 | case 'M': n = 'K'; break; /* M=A/C <-> TU/G=K */ |
---|
37 | case 'm': n = 'k'; break; |
---|
38 | case 'K': n = 'M'; break; |
---|
39 | case 'k': n = 'm'; break; |
---|
40 | |
---|
41 | case 'R': n = 'Y'; break; /* R=A/G <-> TU/C=Y */ |
---|
42 | case 'r': n = 'y'; break; |
---|
43 | case 'Y': n = 'R'; break; |
---|
44 | case 'y': n = 'r'; break; |
---|
45 | |
---|
46 | case 'V': n = 'B'; break; /* V=A/C/G <-> TU/G/C=B */ |
---|
47 | case 'v': n = 'b'; break; |
---|
48 | case 'B': n = 'V'; break; |
---|
49 | case 'b': n = 'v'; break; |
---|
50 | |
---|
51 | case 'H': n = 'D'; break; /* H=A/C/TU <-> TU/G/A=D */ |
---|
52 | case 'h': n = 'd'; break; |
---|
53 | case 'D': n = 'H'; break; |
---|
54 | case 'd': n = 'h'; break; |
---|
55 | |
---|
56 | case 'S': /* S=C/G <-> G/C=S */ |
---|
57 | case 's': |
---|
58 | case 'W': /* W=A/TU <-> TU/A=W */ |
---|
59 | case 'w': |
---|
60 | case 'N': /* N=A/C/G/TU */ |
---|
61 | case 'n': |
---|
62 | case '.': |
---|
63 | case '-': break; |
---|
64 | |
---|
65 | default: break; |
---|
66 | } |
---|
67 | |
---|
68 | return n; |
---|
69 | } |
---|
70 | |
---|
71 | char *GBT_reverseNucSequence(const char *s, int len) { |
---|
72 | char *n = (char*)malloc(len+1); |
---|
73 | int p; |
---|
74 | |
---|
75 | if (!n) { |
---|
76 | GB_memerr(); |
---|
77 | return 0; |
---|
78 | } |
---|
79 | |
---|
80 | len--; |
---|
81 | for (p=0; len>=0; p++,len--) { |
---|
82 | n[p] = s[len]; |
---|
83 | } |
---|
84 | n[p] = 0; |
---|
85 | |
---|
86 | return n; |
---|
87 | } |
---|
88 | char *GBT_complementNucSequence(const char *s, int len, char T_or_U) { |
---|
89 | char *n = (char*)malloc(len+1); |
---|
90 | int p; |
---|
91 | |
---|
92 | for (p=0; p<len; p++) { |
---|
93 | n[p] = GBT_complementNucleotide(s[p], T_or_U); |
---|
94 | } |
---|
95 | n[p] = 0; |
---|
96 | |
---|
97 | return n; |
---|
98 | } |
---|
99 | |
---|
100 | GB_ERROR GBT_determine_T_or_U(GB_alignment_type alignment_type, char *T_or_U, const char *supposed_target) { |
---|
101 | switch (alignment_type) |
---|
102 | { |
---|
103 | case GB_AT_RNA: *T_or_U = 'U'; break; |
---|
104 | case GB_AT_DNA: *T_or_U = 'T'; break; |
---|
105 | default: { |
---|
106 | *T_or_U = 0; |
---|
107 | return GB_export_errorf("%s not available for alignment-type", supposed_target); |
---|
108 | } |
---|
109 | } |
---|
110 | return 0; |
---|
111 | } |
---|
112 | |
---|
113 | /* GB_ERROR GBT_reverseComplementNucSequence(char *seq, long length, GB_alignment_type alignment_type) */ |
---|
114 | void GBT_reverseComplementNucSequence(char *seq, long length, char T_or_U) |
---|
115 | { |
---|
116 | long i,l; |
---|
117 | /* char T_or_U = 0; */ |
---|
118 | /* GB_ERROR error = GBT_determine_T_or_U(alignment_type, &T_or_U, "reverse-complement"); */ |
---|
119 | |
---|
120 | /* if (!error) { */ |
---|
121 | for (i=0,l=length-1; i <= l; i++,l--) { |
---|
122 | char c = seq[i]; |
---|
123 | |
---|
124 | seq[i] = GBT_complementNucleotide(seq[l], T_or_U); |
---|
125 | seq[l] = GBT_complementNucleotide(c, T_or_U); |
---|
126 | } |
---|
127 | /* } */ |
---|
128 | |
---|
129 | /* return error; */ |
---|
130 | } |
---|