/
amino_acids.go
175 lines (169 loc) · 3.72 KB
/
amino_acids.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
package bioutil
import(
"sort"
"strings"
)
const AMINO_ACIDS string = "ARNDCEQGHILKMFPSTWYV"
type Nucleotide byte
type Codon [3]Nucleotide
// May contain multiple characters, eg. iKL
type AminoAcid string
type AminoAcids []AminoAcid
func (codon *Codon) AminoAcid() AminoAcid {
switch codon[0] {
case 't', 'T':
switch codon[1] {
case 't', 'T':
switch codon[2] {
case 't', 'T', 'c', 'C':
return AminoAcid("F") // TTT TTC
case 'a', 'A', 'g', 'G':
return AminoAcid("L") // TTA TTG
}
case 'c', 'C':
switch codon[2] {
case 't', 'T', 'c', 'C', 'a', 'A', 'g', 'G':
return AminoAcid("S") // TCT TCC TCA TCG
}
case 'a', 'A':
switch codon[2] {
case 't', 'T', 'c', 'C':
return AminoAcid("Y") // TAT TAC
case 'a', 'A', 'g', 'G':
return AminoAcid("*") // TAA TAG
}
case 'g', 'G':
switch codon[2] {
case 't', 'T', 'c', 'C':
return AminoAcid("C") // TGT TGC
case 'a', 'A':
return AminoAcid("*") // TGA
case 'g', 'G':
return AminoAcid("W") // TGG
}
}
case 'c', 'C':
switch codon[1] {
case 't', 'T':
switch codon[2] {
case 't', 'T', 'c', 'C', 'a', 'A', 'g', 'G':
return AminoAcid("L") // CTT CTC CTA CTG
}
case 'c', 'C':
switch codon[2] {
case 't', 'T', 'c', 'C', 'a', 'A', 'g', 'G':
return AminoAcid("P") // CCT CCC CCA CCG
}
case 'a', 'A':
switch codon[2] {
case 't', 'T', 'c', 'C':
return AminoAcid("H") // CAT CAC
case 'a', 'A', 'g', 'G':
return AminoAcid("Q") // CAA CAG
}
case 'g', 'G':
switch codon[2] {
case 't', 'T', 'c', 'C', 'a', 'A', 'g', 'G':
return AminoAcid("R") // CGT CGC CGA CGG
}
}
case 'a', 'A':
switch codon[1] {
case 't', 'T':
switch codon[2] {
case 't', 'T', 'c', 'C', 'a', 'A':
return AminoAcid("I") //ATT ATC ATA
case 'g', 'G':
return AminoAcid("M") // ATG
}
case 'c', 'C':
switch codon[2] {
case 't', 'T', 'c', 'C', 'a', 'A', 'g', 'G':
return AminoAcid("T") // ACT ACC ACA ACG
}
case 'a', 'A':
switch codon[2] {
case 't', 'T', 'c', 'C':
return AminoAcid("N") // AAT AAC
case 'a', 'A', 'g', 'G':
return AminoAcid("K") // AAA AAG
}
case 'g', 'G':
switch codon[2] {
case 't', 'T', 'c', 'C':
return AminoAcid("S") // AGT AGC
case 'a', 'A', 'g', 'G':
return AminoAcid("R") // AGA AGG
}
}
case 'g', 'G':
switch codon[1] {
case 't', 'T':
switch codon[2] {
case 't', 'T', 'c', 'C', 'a', 'A', 'g', 'G':
return AminoAcid("V") // GTT GTC GTA GTG
}
case 'c', 'C':
switch codon[2] {
case 't', 'T', 'c', 'C', 'a', 'A', 'g', 'G':
return AminoAcid("A") // GCT GCC GCA GCG
}
case 'a', 'A':
switch codon[2] {
case 't', 'T', 'c', 'C':
return AminoAcid("D") // GAT GAC
case 'a', 'A', 'g', 'G':
return AminoAcid("E") // GAA GAG
}
case 'g', 'G':
switch codon[2] {
case 't', 'T', 'c', 'C', 'a', 'A', 'g', 'G':
return AminoAcid("G") // GGT GGC GGA GGG
}
}
}
return AminoAcid("X")
}
func CodonsToAminoAcids(sequence []Nucleotide) AminoAcids {
result := make(AminoAcids, len(sequence)/3)
for i, _ := range result {
codon := Codon{sequence[i*3], sequence[i*3+1], sequence[i*3+2]}
result[i] = codon.AminoAcid()
}
return result
}
// Returns the code for an ambigious amino acid.
func AminoAcidCode(aa string) string {
aa = strings.ToUpper(aa)
if len(aa) == 1 {
return aa
}
letters := sort.StringSlice{aa[:]}
letters.Sort()
sorted := strings.Join([]string(letters), "")
switch sorted {
case "AG":
return "R"
case "CT":
return "Y"
case "AC":
return "M"
case "GT":
return "K"
case "CG":
return "S"
case "AT":
return "W"
case "ACT":
return "H"
case "CGT":
return "B"
case "ACG":
return "V"
case "AGT":
return "D"
case "ACGT":
return "N"
}
return aa
}