extern void invcomp_dna( char *sequence, /* DNA sequence */ long length /* length of sequence */ ) { char *sl = sequence; /* left end of sequence */ char *sr = sequence + length - 1; /* right end of sequence */ for (; sl<=sr; sl++, sr--) { char tmp = comp_dna(*sl); *sl = comp_dna(*sr); *sr = tmp; } } /* invcomp_dna */
static void average_rc( BOOLEAN add_x, /* add x-tuples if TRUE */ double *a_p, /* tuple->prob assoc. array */ int n, /* widest tuple */ char *tuple, /* call with "" */ int tuplew, /* tuple width; call with 0 */ const char *alpha /* alphabet */ ) { int i, j; char *t = NULL, *rc = NULL; /* tuple and rc-tuple */ int ti, rci; /* index of tuple */ if (n==0) return; /* everything is OK */ Resize(t, tuplew+2, char); Resize(rc, tuplew+2, char); for(i=0; alpha[i+add_x]; i++) { /* ignore last letter (X) */ /* append letter to tuple */ strcpy(t, tuple); t[tuplew] = alpha[i]; t[tuplew+1] = '\0'; /* make reverse complement of tuple */ for (j=0; j<=tuplew; j++) rc[j] = comp_dna(t[tuplew-j]); rc[tuplew+1] = '\0'; /* get tuple and rc indices */ ti = s2i(t); /* index of tuple */ rci = s2i(rc); /* index of reverse complement*/ /* average their probabilites */ a_p[ti] = a_p[rci] = (a_p[ti] + a_p[rci]) / 2.0; /* recur */ average_rc(add_x, a_p, n-1, t, tuplew+1, alpha); } /* letter */ myfree(t); myfree(rc); return; } /* average_rc */