CodonFrequency * flat_CodonFrequency(CodonTable * ct) { int number[26]; CodonFrequency * out; register int i; out = CodonFrequency_alloc(); for(i=0;i<26;i++) number[i] = 0; for(i=0;i<64;i++) out->freq[i]= 0.0; for(i=0;i<125;i++) if( has_random_bases(i) == FALSE && is_stop_codon(i,ct) == FALSE) number[aminoacid_no_from_codon(ct,i)]++; for(i=0;i<64;i++) { if( is_stop_codon(codon_from_base4_codon(i),ct) == FALSE && number[aminoacid_no_from_codon(ct,codon_from_base4_codon(i))] != 0) out->freq[i] = 1.0 / number[aminoacid_no_from_codon(ct,codon_from_base4_codon(i))]; } return out; }
void show_CodonFrequency(CodonFrequency * cf,CodonTable * ct,FILE * ofp) { int i; for(i=0;i<64;i++) fprintf(ofp,"[%3d][%c] %.2f\n",i,aminoacid_from_codon(ct,codon_from_base4_codon(i)),cf->freq[i]); }
CodonFrequency * CodonFrequence_from_raw_counts(double * codon,CodonTable * ct) { double total[26]; CodonFrequency * cf; register int i; int c; register int j; for(i=0;i<26;i++) { total[i] = 0.0; for(j=0;j<64;j++) { c = codon_from_base4_codon(j); if( ct->codon_str[c] == ('A' + i) ) { total[i] += codon[j]; } } } cf = CodonFrequency_alloc(); for(i=0;i<64;i++) { c = codon_from_base4_codon(i); if( is_stop_codon(c,ct) ) continue; if( codon[i] < 0.0000000001) cf->freq[i] = 0.0; else { if( total[ct->codon_str[c] -'A'] < 0.00000001 ) { warn("For codon %d, amino acid %c, we have no frequency",i,ct->codon_str[i]); } else cf->freq[i] = codon[i] / total[ct->codon_str[c]-'A']; } } return cf; }
void show_single_codon_emission(double no,int base4codon,FILE * ofp) { codon c; base one; base two; base three; c = codon_from_base4_codon(base4codon); all_bases_from_codon(c,&one,&two,&three); fprintf(ofp,"%c%c%c %.2f\n",char_from_base(one),char_from_base(two),char_from_base(three),no); }
CodonMapper * new_CodonMapper(CodonTable * ct,CodonFrequency * cf) { register int i; register int j; int k; base one; base two; base three; int base4; int oi,ti,ri; double total_freq; CodonMapper * out; out = CodonMapper_alloc(); out->ct = hard_link_CodonTable(ct); for(i=0;i<125;i++) { for(j=0;j<26;j++) out->codon_map[i][j] =0.0; if( has_random_bases(i) == FALSE ) { if( is_stop_codon(i,ct) == TRUE ) { for(k=0;k<26;k++) out->codon_map[i][k] = (0.0); } else { out->codon_map[i][aminoacid_no_from_codon(ct,i)] = cf->freq[base4_codon_from_codon(i)]; } } else { /*** is a random base ***/ /*** sneaky stuff. What we want to do is loop over all possible codons, adding up their frequencies for the amino acids they represent. This is done by looping over all possible bases for each position and then letting through ones which either have an N at this position or is the actual base. ***/ all_bases_from_codon(i,&one,&two,&three); total_freq = 0.0; for(oi=0;oi<4;oi++) for(ti=0;ti<4;ti++) for(ri=0;ri<4;ri++) { if( (one == BASE_N || one == oi) && (two == BASE_N || two == ti) && (three == BASE_N || three == ri) ) { base4 = codon_from_base4_codon(oi*16+ti*4+ri); if( !is_stop_codon(base4,ct) ) { out->codon_map[i][aminoacid_no_from_codon(ct,base4)] += cf->freq[base4_codon_from_codon(base4)]; } } /* end of if one == BASE_N || one == oi */ } /* end of for oi,ti,ri */ } /* end of else */ } return out; }