JAL-1807 Bob's JalviewJS prototype first commit
[jalviewjs.git] / site / j2s / jalview / analysis / AAFrequency.js
1 Clazz.declarePackage ("jalview.analysis");\r
2 Clazz.load (null, "jalview.analysis.AAFrequency", ["jalview.analysis.CodingUtils", "jalview.datamodel.Annotation", "jalview.util.Format", "$.MappingUtils", "$.QuickSort", "java.lang.Float", "$.StringBuilder", "java.util.Arrays", "$.Hashtable"], function () {\r
3 c$ = Clazz.declareType (jalview.analysis, "AAFrequency");\r
4 c$.calculate = Clazz.defineMethod (c$, "calculate", \r
5 function (list, start, end) {\r
6 return jalview.analysis.AAFrequency.calculate (list, start, end, false);\r
7 }, "java.util.List,~N,~N");\r
8 c$.calculate = Clazz.defineMethod (c$, "calculate", \r
9 function (sequences, start, end, profile) {\r
10 var seqs =  new Array (sequences.size ());\r
11 var width = 0;\r
12 {\r
13 for (var i = 0; i < sequences.size (); i++) {\r
14 seqs[i] = sequences.get (i);\r
15 if (seqs[i].getLength () > width) {\r
16 width = seqs[i].getLength ();\r
17 }}\r
18 var reply =  new Array (width);\r
19 if (end >= width) {\r
20 end = width;\r
21 }jalview.analysis.AAFrequency.calculate (seqs, start, end, reply, profile);\r
22 return reply;\r
23 }}, "java.util.List,~N,~N,~B");\r
24 c$.calculate = Clazz.defineMethod (c$, "calculate", \r
25 function (sequences, start, end, result, profile) {\r
26 var residueHash;\r
27 var maxCount;\r
28 var nongap;\r
29 var i;\r
30 var j;\r
31 var v;\r
32 var jSize = sequences.length;\r
33 var maxResidue;\r
34 var c = '-';\r
35 var percentage;\r
36 var values =  Clazz.newIntArray (255, 0);\r
37 var seq;\r
38 for (i = start; i < end; i++) {\r
39 residueHash =  new java.util.Hashtable ();\r
40 maxCount = 0;\r
41 maxResidue = "";\r
42 nongap = 0;\r
43 values =  Clazz.newIntArray (255, 0);\r
44 for (j = 0; j < jSize; j++) {\r
45 if (sequences[j] == null) {\r
46 System.err.println ("WARNING: Consensus skipping null sequence - possible race condition.");\r
47 continue;\r
48 }seq = sequences[j].getSequence ();\r
49 if (seq.length > i) {\r
50 c = seq[i];\r
51 if (c == '.' || c == ' ') {\r
52 c = '-';\r
53 }if (c == '-') {\r
54 values['-'.charCodeAt (0)]++;\r
55 continue;\r
56 } else if ('a' <= c && c <= 'z') {\r
57 c = String.fromCharCode (c.charCodeAt (0) + -32);\r
58 }nongap++;\r
59 values[c.charCodeAt (0)]++;\r
60 } else {\r
61 values['-'.charCodeAt (0)]++;\r
62 }}\r
63 if (jSize == 1) {\r
64 maxResidue = String.valueOf (c);\r
65 maxCount = 1;\r
66 } else {\r
67 for (v = 65; v <= 90; v++) {\r
68 if (values[v] < 1 || values[v] < maxCount) {\r
69 continue;\r
70 }if (values[v] > maxCount) {\r
71 maxResidue = jalview.analysis.AAFrequency.CHARS[v - 65];\r
72 } else if (values[v] == maxCount) {\r
73 maxResidue += jalview.analysis.AAFrequency.CHARS[v - 65];\r
74 }maxCount = values[v];\r
75 }\r
76 }if (maxResidue.length == 0) {\r
77 maxResidue = "-";\r
78 }if (profile) {\r
79 residueHash.put ("P",  Clazz.newArray (-1, [values,  Clazz.newIntArray (-1, [jSize, nongap])]));\r
80 }residueHash.put ("C",  new Integer (maxCount));\r
81 residueHash.put ("R", maxResidue);\r
82 percentage = (maxCount * 100) / jSize;\r
83 residueHash.put ("G",  new Float (percentage));\r
84 if (nongap > 0) {\r
85 percentage = (maxCount * 100) / nongap;\r
86 }residueHash.put ("N",  new Float (percentage));\r
87 result[i] = residueHash;\r
88 }\r
89 }, "~A,~N,~N,~A,~B");\r
90 c$.completeConsensus = Clazz.defineMethod (c$, "completeConsensus", \r
91 function (consensus, hconsensus, iStart, width, ignoreGapsInConsensusCalculation, includeAllConsSymbols, nseq) {\r
92 jalview.analysis.AAFrequency.completeConsensus (consensus, hconsensus, iStart, width, ignoreGapsInConsensusCalculation, includeAllConsSymbols, null, nseq);\r
93 }, "jalview.datamodel.AlignmentAnnotation,~A,~N,~N,~B,~B,~N");\r
94 c$.completeConsensus = Clazz.defineMethod (c$, "completeConsensus", \r
95 function (consensus, hconsensus, iStart, width, ignoreGapsInConsensusCalculation, includeAllConsSymbols, alphabet, nseq) {\r
96 if (consensus == null || consensus.annotations == null || consensus.annotations.length < width) {\r
97 return;\r
98 }var fmt = jalview.analysis.AAFrequency.getPercentageFormat (nseq);\r
99 for (var i = iStart; i < width; i++) {\r
100 var hci;\r
101 if (i >= hconsensus.length || ((hci = hconsensus[i]) == null)) {\r
102 consensus.annotations[i] = null;\r
103 continue;\r
104 }var fv = hci.get (ignoreGapsInConsensusCalculation ? "N" : "G");\r
105 if (fv == null) {\r
106 consensus.annotations[i] = null;\r
107 continue;\r
108 }var value = fv.floatValue ();\r
109 var maxRes = hci.get ("R").toString ();\r
110 var mouseOver =  new StringBuilder (64);\r
111 if (maxRes.length > 1) {\r
112 mouseOver.append ("[").append (maxRes).append ("] ");\r
113 maxRes = "+";\r
114 } else {\r
115 mouseOver.append (hci.get ("R") + " ");\r
116 }var profile = hci.get ("P");\r
117 if (profile != null && includeAllConsSymbols) {\r
118 var sequenceCount = profile[1][0];\r
119 var nonGappedCount = profile[1][1];\r
120 var normalisedBy = ignoreGapsInConsensusCalculation ? nonGappedCount : sequenceCount;\r
121 mouseOver.setLength (0);\r
122 if (alphabet != null) {\r
123 for (var c = 0; c < alphabet.length; c++) {\r
124 var tval = profile[0][alphabet[c].charCodeAt (0)] * 100 / normalisedBy;\r
125 mouseOver.append (((c == 0) ? "" : "; ")).append (alphabet[c]).append (" ").append (((fmt != null) ? fmt.formDouble (tval) : (Clazz.floatToInt (tval)))).append ("%");\r
126 }\r
127 } else {\r
128 var ca =  Clazz.newCharArray (profile[0].length, '\0');\r
129 var vl =  Clazz.newFloatArray (profile[0].length, 0);\r
130 for (var c = 0; c < ca.length; c++) {\r
131 ca[c] = String.fromCharCode (c);\r
132 vl[c] = profile[0][c];\r
133 }\r
134 jalview.util.QuickSort.sortFloatChar (vl, ca);\r
135 for (var p = 0, c = ca.length - 1; profile[0][ca[c].charCodeAt (0)] > 0; c--) {\r
136 var residue = ca[c];\r
137 if (residue != '-') {\r
138 var tval = profile[0][residue.charCodeAt (0)] * 100 / normalisedBy;\r
139 mouseOver.append ((((p == 0) ? "" : "; "))).append (residue).append (" ").append (((fmt != null) ? fmt.formDouble (tval) : (Clazz.floatToInt (tval)))).append ("%");\r
140 p++;\r
141 }}\r
142 }} else {\r
143 mouseOver.append ((((fmt != null) ? fmt.formDouble (value) : (Clazz.floatToInt (value))))).append ("%");\r
144 }consensus.annotations[i] =  new jalview.datamodel.Annotation (maxRes, mouseOver.toString (), ' ', value);\r
145 }\r
146 }, "jalview.datamodel.AlignmentAnnotation,~A,~N,~N,~B,~B,~A,~N");\r
147 c$.getPercentageFormat = Clazz.defineMethod (c$, "getPercentageFormat", \r
148 function (nseq) {\r
149 var scale = 0;\r
150 while (nseq >= 10) {\r
151 scale++;\r
152 nseq /= 10;\r
153 }\r
154 return scale <= 1 ? null :  new jalview.util.Format ("%3." + (scale - 1) + "f");\r
155 }, "~N");\r
156 c$.extractProfile = Clazz.defineMethod (c$, "extractProfile", \r
157 function (hconsensus, ignoreGaps) {\r
158 var rtnval =  Clazz.newIntArray (64, 0);\r
159 var profile = hconsensus.get ("P");\r
160 if (profile == null) {\r
161 return null;\r
162 }var ca =  Clazz.newCharArray (profile[0].length, '\0');\r
163 var vl =  Clazz.newFloatArray (profile[0].length, 0);\r
164 for (var c = 0; c < ca.length; c++) {\r
165 ca[c] = String.fromCharCode (c);\r
166 vl[c] = profile[0][c];\r
167 }\r
168 jalview.util.QuickSort.sortFloatChar (vl, ca);\r
169 var nextArrayPos = 2;\r
170 var totalPercentage = 0;\r
171 var distinctValuesCount = 0;\r
172 var divisor = profile[1][ignoreGaps ? 1 : 0];\r
173 for (var c = ca.length - 1; profile[0][ca[c].charCodeAt (0)] > 0; c--) {\r
174 if (ca[c] != '-') {\r
175 rtnval[nextArrayPos++] = (ca[c]).charCodeAt (0);\r
176 var percentage = Clazz.floatToInt (profile[0][ca[c].charCodeAt (0)] * 100 / divisor);\r
177 rtnval[nextArrayPos++] = percentage;\r
178 totalPercentage += percentage;\r
179 distinctValuesCount++;\r
180 }}\r
181 rtnval[0] = distinctValuesCount;\r
182 rtnval[1] = totalPercentage;\r
183 var result =  Clazz.newIntArray (rtnval.length + 1, 0);\r
184 result[0] = 0;\r
185 System.arraycopy (rtnval, 0, result, 1, rtnval.length);\r
186 return result;\r
187 }, "java.util.Hashtable,~B");\r
188 c$.extractCdnaProfile = Clazz.defineMethod (c$, "extractCdnaProfile", \r
189 function (hashtable, ignoreGaps) {\r
190 var codonCounts = hashtable.get ("P");\r
191 var sortedCounts =  Clazz.newIntArray (codonCounts.length - 2, 0);\r
192 System.arraycopy (codonCounts, 2, sortedCounts, 0, codonCounts.length - 2);\r
193 var result =  Clazz.newIntArray (3 + 2 * sortedCounts.length, 0);\r
194 result[0] = 2;\r
195 var codons =  Clazz.newCharArray (sortedCounts.length, '\0');\r
196 for (var i = 0; i < codons.length; i++) {\r
197 codons[i] = String.fromCharCode (i);\r
198 }\r
199 jalview.util.QuickSort.sortIntChar (sortedCounts, codons);\r
200 var totalPercentage = 0;\r
201 var distinctValuesCount = 0;\r
202 var j = 3;\r
203 var divisor = ignoreGaps ? codonCounts[1] : codonCounts[0];\r
204 for (var i = codons.length - 1; i >= 0; i--) {\r
205 var codonCount = sortedCounts[i];\r
206 if (codonCount == 0) {\r
207 break;\r
208 }distinctValuesCount++;\r
209 result[j++] = (codons[i]).charCodeAt (0);\r
210 var percentage = Clazz.doubleToInt (codonCount * 100 / divisor);\r
211 result[j++] = percentage;\r
212 totalPercentage += percentage;\r
213 }\r
214 result[2] = totalPercentage;\r
215 result[1] = distinctValuesCount;\r
216 return java.util.Arrays.copyOfRange (result, 0, j);\r
217 }, "java.util.Hashtable,~B");\r
218 c$.calculateCdna = Clazz.defineMethod (c$, "calculateCdna", \r
219 function (alignment, mappings, hconsensus, col0, col1) {\r
220 var gapCharacter = alignment.getGapCharacter ();\r
221 for (var col = col0; col < col1; col++) {\r
222 var columnHash =  new java.util.Hashtable ();\r
223 var codonCounts =  Clazz.newIntArray (66, 0);\r
224 codonCounts[0] = alignment.getSequences ().size ();\r
225 var ungappedCount = 0;\r
226 for (var seq, $seq = alignment.getSequences ().iterator (); $seq.hasNext () && ((seq = $seq.next ()) || true);) {\r
227 if (seq.getCharAt (col) == gapCharacter) {\r
228 continue;\r
229 }var codon = jalview.util.MappingUtils.findCodonFor (seq, col, mappings);\r
230 var codonEncoded = jalview.analysis.CodingUtils.encodeCodon (codon);\r
231 if (codonEncoded >= 0) {\r
232 codonCounts[codonEncoded + 2]++;\r
233 ungappedCount++;\r
234 }}\r
235 codonCounts[1] = ungappedCount;\r
236 columnHash.put ("P", codonCounts);\r
237 hconsensus[col] = columnHash;\r
238 }\r
239 }, "jalview.datamodel.AlignmentI,java.util.Set,~A,~N,~N");\r
240 c$.completeCdnaConsensus = Clazz.defineMethod (c$, "completeCdnaConsensus", \r
241 function (consensusAnnotation, consensusData, showProfileLogo, nseqs) {\r
242 if (consensusAnnotation == null || consensusAnnotation.annotations == null || consensusAnnotation.annotations.length < consensusData.length) {\r
243 return;\r
244 }consensusAnnotation.scaleColLabel = true;\r
245 for (var col = 0; col < consensusData.length; col++) {\r
246 var hci = consensusData[col];\r
247 if (hci == null) {\r
248 continue;\r
249 }var codonCounts = hci.get ("P");\r
250 var totalCount = 0;\r
251 var codons =  Clazz.newCharArray (codonCounts.length - 2, '\0');\r
252 for (var j = 2; j < codonCounts.length; j++) {\r
253 var codonCount = codonCounts[j];\r
254 codons[j - 2] = String.fromCharCode (j - 2);\r
255 totalCount += codonCount;\r
256 }\r
257 var sortedCodonCounts =  Clazz.newIntArray (codonCounts.length - 2, 0);\r
258 System.arraycopy (codonCounts, 2, sortedCodonCounts, 0, codonCounts.length - 2);\r
259 jalview.util.QuickSort.sortIntChar (sortedCodonCounts, codons);\r
260 var modalCodonEncoded = (codons[codons.length - 1]).charCodeAt (0);\r
261 var modalCodonCount = sortedCodonCounts[codons.length - 1];\r
262 var modalCodon = String.valueOf (jalview.analysis.CodingUtils.decodeCodon (modalCodonEncoded));\r
263 if (sortedCodonCounts.length > 1 && sortedCodonCounts[codons.length - 2] == modalCodonEncoded) {\r
264 modalCodon = "+";\r
265 }var pid = sortedCodonCounts[sortedCodonCounts.length - 1] * 100 / totalCount;\r
266 var mouseOver =  new StringBuilder (32);\r
267 var samePercent =  new StringBuilder ();\r
268 var percent = null;\r
269 var lastPercent = null;\r
270 var fmt = jalview.analysis.AAFrequency.getPercentageFormat (nseqs);\r
271 for (var j = codons.length - 1; j >= 0; j--) {\r
272 var codonCount = sortedCodonCounts[j];\r
273 if (codonCount == 0) {\r
274 if (samePercent.length () > 0) {\r
275 mouseOver.append (samePercent).append (": ").append (percent).append ("% ");\r
276 }break;\r
277 }var codonEncoded = (codons[j]).charCodeAt (0);\r
278 var pct = Clazz.doubleToInt (codonCount * 100 / totalCount);\r
279 var codon = String.valueOf (jalview.analysis.CodingUtils.decodeCodon (codonEncoded));\r
280 percent = fmt == null ? Integer.toString (pct) : fmt.formLong (pct);\r
281 if (showProfileLogo || codonCount == modalCodonCount) {\r
282 if (percent.equals (lastPercent) && j > 0) {\r
283 samePercent.append (samePercent.length () == 0 ? "" : ", ");\r
284 samePercent.append (codon);\r
285 } else {\r
286 if (samePercent.length () > 0) {\r
287 mouseOver.append (samePercent).append (": ").append (lastPercent).append ("% ");\r
288 }samePercent.setLength (0);\r
289 samePercent.append (codon);\r
290 }lastPercent = percent;\r
291 }}\r
292 consensusAnnotation.annotations[col] =  new jalview.datamodel.Annotation (modalCodon, mouseOver.toString (), ' ', pid);\r
293 }\r
294 }, "jalview.datamodel.AlignmentAnnotation,~A,~B,~N");\r
295 Clazz.defineStatics (c$,\r
296 "TO_UPPER_CASE", -32,\r
297 "MAXCOUNT", "C",\r
298 "MAXRESIDUE", "R",\r
299 "PID_GAPS", "G",\r
300 "PID_NOGAPS", "N",\r
301 "PROFILE", "P",\r
302 "ENCODED_CHARS", "E");\r
303 c$.CHARS = c$.prototype.CHARS =  new Array (26);\r
304 {\r
305 for (var c = 'A'; c <= 'Z'; c = String.fromCharCode (c.charCodeAt (0) + 1)) {\r
306 jalview.analysis.AAFrequency.CHARS[c.charCodeAt (0) - 65] = String.valueOf (c);\r
307 }\r
308 }});\r