source: branches/help/ARBDB/adRevCompl.cxx

Last change on this file was 16766, checked in by westram, 7 years ago
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 3.4 KB
Line 
1// =============================================================== //
2//                                                                 //
3//   File      : adRevCompl.cxx                                    //
4//   Purpose   : reverse / complement nucleotide sequences         //
5//                                                                 //
6//   Coded by Ralf Westram (coder@reallysoft.de) in January 2001   //
7//   Institute of Microbiology (Technical University Munich)       //
8//   http://www.arb-home.de/                                       //
9//                                                                 //
10// =============================================================== //
11
12#include "arbdbt.h"
13#include <cctype>
14
15static char GBT_complementNucleotide(char c, char T_or_U) {
16    char n = c;
17
18    switch (c) {
19        case 'A': n = T_or_U; break;                // A <-> TU
20        case 'a': n = tolower(T_or_U); break;
21        case 'U':
22        case 'T': n = 'A'; break;
23        case 'u':
24        case 't': n = 'a'; break;
25
26        case 'C': n = 'G'; break;                   // C <-> G
27        case 'c': n = 'g'; break;
28        case 'G': n = 'C'; break;
29        case 'g': n = 'c'; break;
30
31        case 'M': n = 'K'; break;                   // M=A/C <-> TU/G=K
32        case 'm': n = 'k'; break;
33        case 'K': n = 'M'; break;
34        case 'k': n = 'm'; break;
35
36        case 'R': n = 'Y'; break;                   // R=A/G <-> TU/C=Y
37        case 'r': n = 'y'; break;
38        case 'Y': n = 'R'; break;
39        case 'y': n = 'r'; break;
40
41        case 'V': n = 'B'; break;                   // V=A/C/G <-> TU/G/C=B
42        case 'v': n = 'b'; break;
43        case 'B': n = 'V'; break;
44        case 'b': n = 'v'; break;
45
46        case 'H': n = 'D'; break;                   // H=A/C/TU <-> TU/G/A=D
47        case 'h': n = 'd'; break;
48        case 'D': n = 'H'; break;
49        case 'd': n = 'h'; break;
50
51        case 'S':                                   // S = C/G <-> G/C=S
52        case 's':
53        case 'W':                                   // W = A/TU <-> TU/A=W
54        case 'w':
55        case 'N':                                   // N = A/C/G/TU
56        case 'n':
57        case '.':
58        case '-': break;
59
60        default: break;
61    }
62
63    return n;
64}
65
66char *GBT_reverseNucSequence(const char *s, int len) {
67    char *n = ARB_alloc<char>(len+1);
68    len--;
69
70    int p;
71    for (p=0; len>=0; p++, len--) {
72        n[p] = s[len];
73    }
74    n[p] = 0;
75
76    return n;
77}
78char *GBT_complementNucSequence(const char *s, int len, char T_or_U) {
79    char *n = ARB_alloc<char>(len+1);
80    int p;
81
82    for (p=0; p<len; p++) {
83        n[p] = GBT_complementNucleotide(s[p], T_or_U);
84    }
85    n[p] = 0;
86
87    return n;
88}
89
90NOT4PERL GB_ERROR GBT_determine_T_or_U(GB_alignment_type alignment_type, char *T_or_U, const char *supposed_target) {
91    switch (alignment_type) {
92        case GB_AT_RNA: *T_or_U = 'U'; break;
93        case GB_AT_DNA: *T_or_U = 'T'; break;
94        default: {
95            *T_or_U = 0;
96            return GBS_global_string("%s not available for alignment-type", supposed_target);
97        }
98    }
99    return NULp;
100}
101
102NOT4PERL void GBT_reverseComplementNucSequence(char *seq, long length, char T_or_U) {
103    long     i, l;
104    for (i=0, l=length-1; i <= l; i++, l--) {
105        char c = seq[i];
106
107        seq[i] = GBT_complementNucleotide(seq[l], T_or_U);
108        seq[l] = GBT_complementNucleotide(c, T_or_U);
109    }
110}
Note: See TracBrowser for help on using the repository browser.