jpayne@69: #include "translate.hh" jpayne@69: jpayne@69: jpayne@69: long int Translate_DNA jpayne@69: (char * A, char * tA, int Frame) jpayne@69: jpayne@69: // function to translate dna sequence to aminoacid sequence jpayne@69: // uses esttrans' headers and algo jpayne@69: // A as read in from gene.h Read_String jpayne@69: // tA should be an empty string malloced to atleast (Len A / 3) jpayne@69: // frame is 1,2,3,4,5,6 jpayne@69: // returns new (strlen(tA+1)) or -1 on error jpayne@69: jpayne@69: { jpayne@69: int dna_int; jpayne@69: int dnaseq_len, aaseq_len; jpayne@69: int aa_index; jpayne@69: char *dna_seq, *dna_ptr, *dna_end, *aa_ptr; jpayne@69: jpayne@69: dnaseq_len = strlen ( A + 1 ); jpayne@69: aa_ptr = tA + 1; jpayne@69: dna_seq = A + 1; jpayne@69: dna_end = A + dnaseq_len; jpayne@69: jpayne@69: if ( Frame >= 1 && Frame <= 3 ) jpayne@69: { jpayne@69: dna_end -= 2; jpayne@69: dna_ptr = dna_seq + Frame - 1; jpayne@69: for (; dna_ptr <= dna_end;) jpayne@69: { jpayne@69: dna_int = transdna [ int(*dna_ptr++) ]; jpayne@69: if ( dna_int == BAD_PEP_CHAR ) { jpayne@69: fprintf(stderr,"WARNING: Forcing unrecognized DNA char to N\n"); jpayne@69: dna_int = DNA_XN; jpayne@69: } jpayne@69: aa_index = dna_int; jpayne@69: aa_index <<= 4; jpayne@69: jpayne@69: dna_int = transdna [ int(*dna_ptr++) ]; jpayne@69: if ( dna_int == BAD_PEP_CHAR ) { jpayne@69: fprintf(stderr,"WARNING: Forcing unrecognized DNA char to N\n"); jpayne@69: dna_int = DNA_XN; jpayne@69: } jpayne@69: aa_index += dna_int; jpayne@69: aa_index <<= 4; jpayne@69: jpayne@69: dna_int = transdna [ int(*dna_ptr++) ]; jpayne@69: if ( dna_int == BAD_PEP_CHAR ) { jpayne@69: fprintf(stderr,"WARNING: Forcing unrecognized DNA char to N\n"); jpayne@69: dna_int = DNA_XN; jpayne@69: } jpayne@69: aa_index += dna_int; jpayne@69: jpayne@69: *(aa_ptr++) = universal[aa_index]; jpayne@69: } jpayne@69: jpayne@69: *aa_ptr = '\0'; jpayne@69: aaseq_len = strlen ( tA + 1 ); jpayne@69: } jpayne@69: else if ( Frame >= 4 && Frame <= 6 ) jpayne@69: { jpayne@69: Frame -= 3; jpayne@69: jpayne@69: dna_seq += 2; jpayne@69: dna_ptr = dna_end - Frame + 1; jpayne@69: for (; dna_ptr >= dna_seq;) jpayne@69: { jpayne@69: dna_int = compdna [ transdna [ int(*dna_ptr--)] ]; jpayne@69: if ( dna_int == BAD_PEP_CHAR ) { jpayne@69: fprintf(stderr,"WARNING: Forcing unrecognized DNA char to N\n"); jpayne@69: dna_int = DNA_XN; jpayne@69: } jpayne@69: aa_index = dna_int; jpayne@69: aa_index <<= 4; jpayne@69: jpayne@69: dna_int = compdna [ transdna [ int(*dna_ptr--)] ]; jpayne@69: if ( dna_int == BAD_PEP_CHAR ) { jpayne@69: fprintf(stderr,"WARNING: Forcing unrecognized DNA char to N\n"); jpayne@69: dna_int = DNA_XN; jpayne@69: } jpayne@69: aa_index += dna_int; jpayne@69: aa_index <<= 4; jpayne@69: jpayne@69: dna_int = compdna [ transdna [ int(*dna_ptr--)] ]; jpayne@69: if ( dna_int == BAD_PEP_CHAR ) { jpayne@69: fprintf(stderr,"WARNING: Forcing unrecognized DNA char to N\n"); jpayne@69: dna_int = DNA_XN; jpayne@69: } jpayne@69: aa_index += dna_int; jpayne@69: jpayne@69: *(aa_ptr++) = universal[aa_index]; jpayne@69: } jpayne@69: jpayne@69: *aa_ptr = '\0'; jpayne@69: aaseq_len = strlen ( tA + 1 ); jpayne@69: } jpayne@69: else jpayne@69: aaseq_len = -1; jpayne@69: jpayne@69: jpayne@69: return aaseq_len; jpayne@69: } jpayne@69: