jpayne@69
|
1 #include "translate.hh"
|
jpayne@69
|
2
|
jpayne@69
|
3
|
jpayne@69
|
4 long int Translate_DNA
|
jpayne@69
|
5 (char * A, char * tA, int Frame)
|
jpayne@69
|
6
|
jpayne@69
|
7 // function to translate dna sequence to aminoacid sequence
|
jpayne@69
|
8 // uses esttrans' headers and algo
|
jpayne@69
|
9 // A as read in from gene.h Read_String
|
jpayne@69
|
10 // tA should be an empty string malloced to atleast (Len A / 3)
|
jpayne@69
|
11 // frame is 1,2,3,4,5,6
|
jpayne@69
|
12 // returns new (strlen(tA+1)) or -1 on error
|
jpayne@69
|
13
|
jpayne@69
|
14 {
|
jpayne@69
|
15 int dna_int;
|
jpayne@69
|
16 int dnaseq_len, aaseq_len;
|
jpayne@69
|
17 int aa_index;
|
jpayne@69
|
18 char *dna_seq, *dna_ptr, *dna_end, *aa_ptr;
|
jpayne@69
|
19
|
jpayne@69
|
20 dnaseq_len = strlen ( A + 1 );
|
jpayne@69
|
21 aa_ptr = tA + 1;
|
jpayne@69
|
22 dna_seq = A + 1;
|
jpayne@69
|
23 dna_end = A + dnaseq_len;
|
jpayne@69
|
24
|
jpayne@69
|
25 if ( Frame >= 1 && Frame <= 3 )
|
jpayne@69
|
26 {
|
jpayne@69
|
27 dna_end -= 2;
|
jpayne@69
|
28 dna_ptr = dna_seq + Frame - 1;
|
jpayne@69
|
29 for (; dna_ptr <= dna_end;)
|
jpayne@69
|
30 {
|
jpayne@69
|
31 dna_int = transdna [ int(*dna_ptr++) ];
|
jpayne@69
|
32 if ( dna_int == BAD_PEP_CHAR ) {
|
jpayne@69
|
33 fprintf(stderr,"WARNING: Forcing unrecognized DNA char to N\n");
|
jpayne@69
|
34 dna_int = DNA_XN;
|
jpayne@69
|
35 }
|
jpayne@69
|
36 aa_index = dna_int;
|
jpayne@69
|
37 aa_index <<= 4;
|
jpayne@69
|
38
|
jpayne@69
|
39 dna_int = transdna [ int(*dna_ptr++) ];
|
jpayne@69
|
40 if ( dna_int == BAD_PEP_CHAR ) {
|
jpayne@69
|
41 fprintf(stderr,"WARNING: Forcing unrecognized DNA char to N\n");
|
jpayne@69
|
42 dna_int = DNA_XN;
|
jpayne@69
|
43 }
|
jpayne@69
|
44 aa_index += dna_int;
|
jpayne@69
|
45 aa_index <<= 4;
|
jpayne@69
|
46
|
jpayne@69
|
47 dna_int = transdna [ int(*dna_ptr++) ];
|
jpayne@69
|
48 if ( dna_int == BAD_PEP_CHAR ) {
|
jpayne@69
|
49 fprintf(stderr,"WARNING: Forcing unrecognized DNA char to N\n");
|
jpayne@69
|
50 dna_int = DNA_XN;
|
jpayne@69
|
51 }
|
jpayne@69
|
52 aa_index += dna_int;
|
jpayne@69
|
53
|
jpayne@69
|
54 *(aa_ptr++) = universal[aa_index];
|
jpayne@69
|
55 }
|
jpayne@69
|
56
|
jpayne@69
|
57 *aa_ptr = '\0';
|
jpayne@69
|
58 aaseq_len = strlen ( tA + 1 );
|
jpayne@69
|
59 }
|
jpayne@69
|
60 else if ( Frame >= 4 && Frame <= 6 )
|
jpayne@69
|
61 {
|
jpayne@69
|
62 Frame -= 3;
|
jpayne@69
|
63
|
jpayne@69
|
64 dna_seq += 2;
|
jpayne@69
|
65 dna_ptr = dna_end - Frame + 1;
|
jpayne@69
|
66 for (; dna_ptr >= dna_seq;)
|
jpayne@69
|
67 {
|
jpayne@69
|
68 dna_int = compdna [ transdna [ int(*dna_ptr--)] ];
|
jpayne@69
|
69 if ( dna_int == BAD_PEP_CHAR ) {
|
jpayne@69
|
70 fprintf(stderr,"WARNING: Forcing unrecognized DNA char to N\n");
|
jpayne@69
|
71 dna_int = DNA_XN;
|
jpayne@69
|
72 }
|
jpayne@69
|
73 aa_index = dna_int;
|
jpayne@69
|
74 aa_index <<= 4;
|
jpayne@69
|
75
|
jpayne@69
|
76 dna_int = compdna [ transdna [ int(*dna_ptr--)] ];
|
jpayne@69
|
77 if ( dna_int == BAD_PEP_CHAR ) {
|
jpayne@69
|
78 fprintf(stderr,"WARNING: Forcing unrecognized DNA char to N\n");
|
jpayne@69
|
79 dna_int = DNA_XN;
|
jpayne@69
|
80 }
|
jpayne@69
|
81 aa_index += dna_int;
|
jpayne@69
|
82 aa_index <<= 4;
|
jpayne@69
|
83
|
jpayne@69
|
84 dna_int = compdna [ transdna [ int(*dna_ptr--)] ];
|
jpayne@69
|
85 if ( dna_int == BAD_PEP_CHAR ) {
|
jpayne@69
|
86 fprintf(stderr,"WARNING: Forcing unrecognized DNA char to N\n");
|
jpayne@69
|
87 dna_int = DNA_XN;
|
jpayne@69
|
88 }
|
jpayne@69
|
89 aa_index += dna_int;
|
jpayne@69
|
90
|
jpayne@69
|
91 *(aa_ptr++) = universal[aa_index];
|
jpayne@69
|
92 }
|
jpayne@69
|
93
|
jpayne@69
|
94 *aa_ptr = '\0';
|
jpayne@69
|
95 aaseq_len = strlen ( tA + 1 );
|
jpayne@69
|
96 }
|
jpayne@69
|
97 else
|
jpayne@69
|
98 aaseq_len = -1;
|
jpayne@69
|
99
|
jpayne@69
|
100
|
jpayne@69
|
101 return aaseq_len;
|
jpayne@69
|
102 }
|
jpayne@69
|
103
|