JAL-1807 still testing
[jalviewjs.git] / bin / jalview / analysis / AAFrequency.js
index a7a69d1..8e3d4c5 100644 (file)
-Clazz.declarePackage ("jalview.analysis");
-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 () {
-c$ = Clazz.declareType (jalview.analysis, "AAFrequency");
-c$.calculate = Clazz.defineMethod (c$, "calculate", 
-function (list, start, end) {
-return jalview.analysis.AAFrequency.calculate (list, start, end, false);
-}, "java.util.List,~N,~N");
-c$.calculate = Clazz.defineMethod (c$, "calculate", 
-function (sequences, start, end, profile) {
-var seqs =  new Array (sequences.size ());
-var width = 0;
-{
-for (var i = 0; i < sequences.size (); i++) {
-seqs[i] = sequences.get (i);
-if (seqs[i].getLength () > width) {
-width = seqs[i].getLength ();
-}}
-var reply =  new Array (width);
-if (end >= width) {
-end = width;
-}jalview.analysis.AAFrequency.calculate (seqs, start, end, reply, profile);
-return reply;
-}}, "java.util.List,~N,~N,~B");
-c$.calculate = Clazz.defineMethod (c$, "calculate", 
-function (sequences, start, end, result, profile) {
-var residueHash;
-var maxCount;
-var nongap;
-var i;
-var j;
-var v;
-var jSize = sequences.length;
-var maxResidue;
-var c = '-';
-var percentage;
-var values =  Clazz.newIntArray (255, 0);
-var seq;
-for (i = start; i < end; i++) {
-residueHash =  new java.util.Hashtable ();
-maxCount = 0;
-maxResidue = "";
-nongap = 0;
-values =  Clazz.newIntArray (255, 0);
-for (j = 0; j < jSize; j++) {
-if (sequences[j] == null) {
-System.err.println ("WARNING: Consensus skipping null sequence - possible race condition.");
-continue;
-}seq = sequences[j].getSequence ();
-if (seq.length > i) {
-c = seq[i];
-if (c == '.' || c == ' ') {
-c = '-';
-}if (c == '-') {
-values['-'.charCodeAt (0)]++;
-continue;
-} else if ('a' <= c && c <= 'z') {
-c = String.fromCharCode (c.charCodeAt (0) + -32);
-}nongap++;
-values[c.charCodeAt (0)]++;
-} else {
-values['-'.charCodeAt (0)]++;
-}}
-if (jSize == 1) {
-maxResidue = String.valueOf (c);
-maxCount = 1;
-} else {
-for (v = 65; v <= 90; v++) {
-if (values[v] < 1 || values[v] < maxCount) {
-continue;
-}if (values[v] > maxCount) {
-maxResidue = jalview.analysis.AAFrequency.CHARS[v - 65];
-} else if (values[v] == maxCount) {
-maxResidue += jalview.analysis.AAFrequency.CHARS[v - 65];
-}maxCount = values[v];
-}
-}if (maxResidue.length == 0) {
-maxResidue = "-";
-}if (profile) {
-residueHash.put ("P",  Clazz.newArray (-1, [values,  Clazz.newIntArray (-1, [jSize, nongap])]));
-}residueHash.put ("C",  new Integer (maxCount));
-residueHash.put ("R", maxResidue);
-percentage = (maxCount * 100) / jSize;
-residueHash.put ("G",  new Float (percentage));
-if (nongap > 0) {
-percentage = (maxCount * 100) / nongap;
-}residueHash.put ("N",  new Float (percentage));
-result[i] = residueHash;
-}
-}, "~A,~N,~N,~A,~B");
-c$.completeConsensus = Clazz.defineMethod (c$, "completeConsensus", 
-function (consensus, hconsensus, iStart, width, ignoreGapsInConsensusCalculation, includeAllConsSymbols, nseq) {
-jalview.analysis.AAFrequency.completeConsensus (consensus, hconsensus, iStart, width, ignoreGapsInConsensusCalculation, includeAllConsSymbols, null, nseq);
-}, "jalview.datamodel.AlignmentAnnotation,~A,~N,~N,~B,~B,~N");
-c$.completeConsensus = Clazz.defineMethod (c$, "completeConsensus", 
-function (consensus, hconsensus, iStart, width, ignoreGapsInConsensusCalculation, includeAllConsSymbols, alphabet, nseq) {
-if (consensus == null || consensus.annotations == null || consensus.annotations.length < width) {
-return;
-}var fmt = jalview.analysis.AAFrequency.getPercentageFormat (nseq);
-for (var i = iStart; i < width; i++) {
-var hci;
-if (i >= hconsensus.length || ((hci = hconsensus[i]) == null)) {
-consensus.annotations[i] = null;
-continue;
-}var fv = hci.get (ignoreGapsInConsensusCalculation ? "N" : "G");
-if (fv == null) {
-consensus.annotations[i] = null;
-continue;
-}var value = fv.floatValue ();
-var maxRes = hci.get ("R").toString ();
-var mouseOver =  new StringBuilder (64);
-if (maxRes.length > 1) {
-mouseOver.append ("[").append (maxRes).append ("] ");
-maxRes = "+";
-} else {
-mouseOver.append (hci.get ("R") + " ");
-}var profile = hci.get ("P");
-if (profile != null && includeAllConsSymbols) {
-var sequenceCount = profile[1][0];
-var nonGappedCount = profile[1][1];
-var normalisedBy = ignoreGapsInConsensusCalculation ? nonGappedCount : sequenceCount;
-mouseOver.setLength (0);
-if (alphabet != null) {
-for (var c = 0; c < alphabet.length; c++) {
-var tval = profile[0][alphabet[c].charCodeAt (0)] * 100 / normalisedBy;
-mouseOver.append (((c == 0) ? "" : "; ")).append (alphabet[c]).append (" ").append (((fmt != null) ? fmt.formDouble (tval) : (Clazz.floatToInt (tval)))).append ("%");
-}
-} else {
-var ca =  Clazz.newCharArray (profile[0].length, '\0');
-var vl =  Clazz.newFloatArray (profile[0].length, 0);
-for (var c = 0; c < ca.length; c++) {
-ca[c] = String.fromCharCode (c);
-vl[c] = profile[0][c];
-}
-jalview.util.QuickSort.sortFloatChar (vl, ca);
-for (var p = 0, c = ca.length - 1; profile[0][ca[c].charCodeAt (0)] > 0; c--) {
-var residue = ca[c];
-if (residue != '-') {
-var tval = profile[0][residue.charCodeAt (0)] * 100 / normalisedBy;
-mouseOver.append ((((p == 0) ? "" : "; "))).append (residue).append (" ").append (((fmt != null) ? fmt.formDouble (tval) : (Clazz.floatToInt (tval)))).append ("%");
-p++;
-}}
-}} else {
-mouseOver.append ((((fmt != null) ? fmt.formDouble (value) : (Clazz.floatToInt (value))))).append ("%");
-}consensus.annotations[i] =  new jalview.datamodel.Annotation (maxRes, mouseOver.toString (), ' ', value);
-}
-}, "jalview.datamodel.AlignmentAnnotation,~A,~N,~N,~B,~B,~A,~N");
-c$.getPercentageFormat = Clazz.defineMethod (c$, "getPercentageFormat", 
-function (nseq) {
-var scale = 0;
-while (nseq >= 10) {
-scale++;
-nseq /= 10;
-}
-return scale <= 1 ? null :  new jalview.util.Format ("%3." + (scale - 1) + "f");
-}, "~N");
-c$.extractProfile = Clazz.defineMethod (c$, "extractProfile", 
-function (hconsensus, ignoreGaps) {
-var rtnval =  Clazz.newIntArray (64, 0);
-var profile = hconsensus.get ("P");
-if (profile == null) {
-return null;
-}var ca =  Clazz.newCharArray (profile[0].length, '\0');
-var vl =  Clazz.newFloatArray (profile[0].length, 0);
-for (var c = 0; c < ca.length; c++) {
-ca[c] = String.fromCharCode (c);
-vl[c] = profile[0][c];
-}
-jalview.util.QuickSort.sortFloatChar (vl, ca);
-var nextArrayPos = 2;
-var totalPercentage = 0;
-var distinctValuesCount = 0;
-var divisor = profile[1][ignoreGaps ? 1 : 0];
-for (var c = ca.length - 1; profile[0][ca[c].charCodeAt (0)] > 0; c--) {
-if (ca[c] != '-') {
-rtnval[nextArrayPos++] = (ca[c]).charCodeAt (0);
-var percentage = Clazz.floatToInt (profile[0][ca[c].charCodeAt (0)] * 100 / divisor);
-rtnval[nextArrayPos++] = percentage;
-totalPercentage += percentage;
-distinctValuesCount++;
-}}
-rtnval[0] = distinctValuesCount;
-rtnval[1] = totalPercentage;
-var result =  Clazz.newIntArray (rtnval.length + 1, 0);
-result[0] = 0;
-System.arraycopy (rtnval, 0, result, 1, rtnval.length);
-return result;
-}, "java.util.Hashtable,~B");
-c$.extractCdnaProfile = Clazz.defineMethod (c$, "extractCdnaProfile", 
-function (hashtable, ignoreGaps) {
-var codonCounts = hashtable.get ("P");
-var sortedCounts =  Clazz.newIntArray (codonCounts.length - 2, 0);
-System.arraycopy (codonCounts, 2, sortedCounts, 0, codonCounts.length - 2);
-var result =  Clazz.newIntArray (3 + 2 * sortedCounts.length, 0);
-result[0] = 2;
-var codons =  Clazz.newCharArray (sortedCounts.length, '\0');
-for (var i = 0; i < codons.length; i++) {
-codons[i] = String.fromCharCode (i);
-}
-jalview.util.QuickSort.sortIntChar (sortedCounts, codons);
-var totalPercentage = 0;
-var distinctValuesCount = 0;
-var j = 3;
-var divisor = ignoreGaps ? codonCounts[1] : codonCounts[0];
-for (var i = codons.length - 1; i >= 0; i--) {
-var codonCount = sortedCounts[i];
-if (codonCount == 0) {
-break;
-}distinctValuesCount++;
-result[j++] = (codons[i]).charCodeAt (0);
-var percentage = Clazz.doubleToInt (codonCount * 100 / divisor);
-result[j++] = percentage;
-totalPercentage += percentage;
-}
-result[2] = totalPercentage;
-result[1] = distinctValuesCount;
-return java.util.Arrays.copyOfRange (result, 0, j);
-}, "java.util.Hashtable,~B");
-c$.calculateCdna = Clazz.defineMethod (c$, "calculateCdna", 
-function (alignment, mappings, hconsensus, col0, col1) {
-var gapCharacter = alignment.getGapCharacter ();
-for (var col = col0; col < col1; col++) {
-var columnHash =  new java.util.Hashtable ();
-var codonCounts =  Clazz.newIntArray (66, 0);
-codonCounts[0] = alignment.getSequences ().size ();
-var ungappedCount = 0;
-for (var seq, $seq = alignment.getSequences ().iterator (); $seq.hasNext () && ((seq = $seq.next ()) || true);) {
-if (seq.getCharAt (col) == gapCharacter) {
-continue;
-}var codon = jalview.util.MappingUtils.findCodonFor (seq, col, mappings);
-var codonEncoded = jalview.analysis.CodingUtils.encodeCodon (codon);
-if (codonEncoded >= 0) {
-codonCounts[codonEncoded + 2]++;
-ungappedCount++;
-}}
-codonCounts[1] = ungappedCount;
-columnHash.put ("P", codonCounts);
-hconsensus[col] = columnHash;
-}
-}, "jalview.datamodel.AlignmentI,java.util.Set,~A,~N,~N");
-c$.completeCdnaConsensus = Clazz.defineMethod (c$, "completeCdnaConsensus", 
-function (consensusAnnotation, consensusData, showProfileLogo, nseqs) {
-if (consensusAnnotation == null || consensusAnnotation.annotations == null || consensusAnnotation.annotations.length < consensusData.length) {
-return;
-}consensusAnnotation.scaleColLabel = true;
-for (var col = 0; col < consensusData.length; col++) {
-var hci = consensusData[col];
-if (hci == null) {
-continue;
-}var codonCounts = hci.get ("P");
-var totalCount = 0;
-var codons =  Clazz.newCharArray (codonCounts.length - 2, '\0');
-for (var j = 2; j < codonCounts.length; j++) {
-var codonCount = codonCounts[j];
-codons[j - 2] = String.fromCharCode (j - 2);
-totalCount += codonCount;
-}
-var sortedCodonCounts =  Clazz.newIntArray (codonCounts.length - 2, 0);
-System.arraycopy (codonCounts, 2, sortedCodonCounts, 0, codonCounts.length - 2);
-jalview.util.QuickSort.sortIntChar (sortedCodonCounts, codons);
-var modalCodonEncoded = (codons[codons.length - 1]).charCodeAt (0);
-var modalCodonCount = sortedCodonCounts[codons.length - 1];
-var modalCodon = String.valueOf (jalview.analysis.CodingUtils.decodeCodon (modalCodonEncoded));
-if (sortedCodonCounts.length > 1 && sortedCodonCounts[codons.length - 2] == modalCodonEncoded) {
-modalCodon = "+";
-}var pid = sortedCodonCounts[sortedCodonCounts.length - 1] * 100 / totalCount;
-var mouseOver =  new StringBuilder (32);
-var samePercent =  new StringBuilder ();
-var percent = null;
-var lastPercent = null;
-var fmt = jalview.analysis.AAFrequency.getPercentageFormat (nseqs);
-for (var j = codons.length - 1; j >= 0; j--) {
-var codonCount = sortedCodonCounts[j];
-if (codonCount == 0) {
-if (samePercent.length () > 0) {
-mouseOver.append (samePercent).append (": ").append (percent).append ("% ");
-}break;
-}var codonEncoded = (codons[j]).charCodeAt (0);
-var pct = Clazz.doubleToInt (codonCount * 100 / totalCount);
-var codon = String.valueOf (jalview.analysis.CodingUtils.decodeCodon (codonEncoded));
-percent = fmt == null ? Integer.toString (pct) : fmt.formLong (pct);
-if (showProfileLogo || codonCount == modalCodonCount) {
-if (percent.equals (lastPercent) && j > 0) {
-samePercent.append (samePercent.length () == 0 ? "" : ", ");
-samePercent.append (codon);
-} else {
-if (samePercent.length () > 0) {
-mouseOver.append (samePercent).append (": ").append (lastPercent).append ("% ");
-}samePercent.setLength (0);
-samePercent.append (codon);
-}lastPercent = percent;
-}}
-consensusAnnotation.annotations[col] =  new jalview.datamodel.Annotation (modalCodon, mouseOver.toString (), ' ', pid);
-}
-}, "jalview.datamodel.AlignmentAnnotation,~A,~B,~N");
-Clazz.defineStatics (c$,
-"TO_UPPER_CASE", -32,
-"MAXCOUNT", "C",
-"MAXRESIDUE", "R",
-"PID_GAPS", "G",
-"PID_NOGAPS", "N",
-"PROFILE", "P",
-"ENCODED_CHARS", "E");
-c$.CHARS = c$.prototype.CHARS =  new Array (26);
-{
-for (var c = 'A'; c <= 'Z'; c = String.fromCharCode (c.charCodeAt (0) + 1)) {
-jalview.analysis.AAFrequency.CHARS[c.charCodeAt (0) - 65] = String.valueOf (c);
-}
-}});
+Clazz.declarePackage ("jalview.analysis");\r
+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
+c$ = Clazz.declareType (jalview.analysis, "AAFrequency");\r
+c$.calculate = Clazz.defineMethod (c$, "calculate", \r
+function (list, start, end) {\r
+return jalview.analysis.AAFrequency.calculate (list, start, end, false);\r
+}, "java.util.List,~N,~N");\r
+c$.calculate = Clazz.defineMethod (c$, "calculate", \r
+function (sequences, start, end, profile) {\r
+var seqs =  new Array (sequences.size ());\r
+var width = 0;\r
+{\r
+for (var i = 0; i < sequences.size (); i++) {\r
+seqs[i] = sequences.get (i);\r
+if (seqs[i].getLength () > width) {\r
+width = seqs[i].getLength ();\r
+}}\r
+var reply =  new Array (width);\r
+if (end >= width) {\r
+end = width;\r
+}jalview.analysis.AAFrequency.calculate (seqs, start, end, reply, profile);\r
+return reply;\r
+}}, "java.util.List,~N,~N,~B");\r
+c$.calculate = Clazz.defineMethod (c$, "calculate", \r
+function (sequences, start, end, result, profile) {\r
+var residueHash;\r
+var maxCount;\r
+var nongap;\r
+var i;\r
+var j;\r
+var v;\r
+var jSize = sequences.length;\r
+var maxResidue;\r
+var c = '-';\r
+var percentage;\r
+var values =  Clazz.newIntArray (255, 0);\r
+var seq;\r
+for (i = start; i < end; i++) {\r
+residueHash =  new java.util.Hashtable ();\r
+maxCount = 0;\r
+maxResidue = "";\r
+nongap = 0;\r
+values =  Clazz.newIntArray (255, 0);\r
+for (j = 0; j < jSize; j++) {\r
+if (sequences[j] == null) {\r
+System.err.println ("WARNING: Consensus skipping null sequence - possible race condition.");\r
+continue;\r
+}seq = sequences[j].getSequence ();\r
+if (seq.length > i) {\r
+c = seq[i];\r
+if (c == '.' || c == ' ') {\r
+c = '-';\r
+}if (c == '-') {\r
+values['-'.charCodeAt (0)]++;\r
+continue;\r
+} else if ('a' <= c && c <= 'z') {\r
+c = String.fromCharCode (c.charCodeAt (0) + -32);\r
+}nongap++;\r
+values[c.charCodeAt (0)]++;\r
+} else {\r
+values['-'.charCodeAt (0)]++;\r
+}}\r
+if (jSize == 1) {\r
+maxResidue = String.valueOf (c);\r
+maxCount = 1;\r
+} else {\r
+for (v = 65; v <= 90; v++) {\r
+if (values[v] < 1 || values[v] < maxCount) {\r
+continue;\r
+}if (values[v] > maxCount) {\r
+maxResidue = jalview.analysis.AAFrequency.CHARS[v - 65];\r
+} else if (values[v] == maxCount) {\r
+maxResidue += jalview.analysis.AAFrequency.CHARS[v - 65];\r
+}maxCount = values[v];\r
+}\r
+}if (maxResidue.length == 0) {\r
+maxResidue = "-";\r
+}if (profile) {\r
+residueHash.put ("P",  Clazz.newArray (-1, [values,  Clazz.newIntArray (-1, [jSize, nongap])]));\r
+}residueHash.put ("C",  new Integer (maxCount));\r
+residueHash.put ("R", maxResidue);\r
+percentage = (maxCount * 100) / jSize;\r
+residueHash.put ("G",  new Float (percentage));\r
+if (nongap > 0) {\r
+percentage = (maxCount * 100) / nongap;\r
+}residueHash.put ("N",  new Float (percentage));\r
+result[i] = residueHash;\r
+}\r
+}, "~A,~N,~N,~A,~B");\r
+c$.completeConsensus = Clazz.defineMethod (c$, "completeConsensus", \r
+function (consensus, hconsensus, iStart, width, ignoreGapsInConsensusCalculation, includeAllConsSymbols, nseq) {\r
+jalview.analysis.AAFrequency.completeConsensus (consensus, hconsensus, iStart, width, ignoreGapsInConsensusCalculation, includeAllConsSymbols, null, nseq);\r
+}, "jalview.datamodel.AlignmentAnnotation,~A,~N,~N,~B,~B,~N");\r
+c$.completeConsensus = Clazz.defineMethod (c$, "completeConsensus", \r
+function (consensus, hconsensus, iStart, width, ignoreGapsInConsensusCalculation, includeAllConsSymbols, alphabet, nseq) {\r
+if (consensus == null || consensus.annotations == null || consensus.annotations.length < width) {\r
+return;\r
+}var fmt = jalview.analysis.AAFrequency.getPercentageFormat (nseq);\r
+for (var i = iStart; i < width; i++) {\r
+var hci;\r
+if (i >= hconsensus.length || ((hci = hconsensus[i]) == null)) {\r
+consensus.annotations[i] = null;\r
+continue;\r
+}var fv = hci.get (ignoreGapsInConsensusCalculation ? "N" : "G");\r
+if (fv == null) {\r
+consensus.annotations[i] = null;\r
+continue;\r
+}var value = fv.floatValue ();\r
+var maxRes = hci.get ("R").toString ();\r
+var mouseOver =  new StringBuilder (64);\r
+if (maxRes.length > 1) {\r
+mouseOver.append ("[").append (maxRes).append ("] ");\r
+maxRes = "+";\r
+} else {\r
+mouseOver.append (hci.get ("R") + " ");\r
+}var profile = hci.get ("P");\r
+if (profile != null && includeAllConsSymbols) {\r
+var sequenceCount = profile[1][0];\r
+var nonGappedCount = profile[1][1];\r
+var normalisedBy = ignoreGapsInConsensusCalculation ? nonGappedCount : sequenceCount;\r
+mouseOver.setLength (0);\r
+if (alphabet != null) {\r
+for (var c = 0; c < alphabet.length; c++) {\r
+var tval = profile[0][alphabet[c].charCodeAt (0)] * 100 / normalisedBy;\r
+mouseOver.append (((c == 0) ? "" : "; ")).append (alphabet[c]).append (" ").append (((fmt != null) ? fmt.formDouble (tval) : (Clazz.floatToInt (tval)))).append ("%");\r
+}\r
+} else {\r
+var ca =  Clazz.newCharArray (profile[0].length, '\0');\r
+var vl =  Clazz.newFloatArray (profile[0].length, 0);\r
+for (var c = 0; c < ca.length; c++) {\r
+ca[c] = String.fromCharCode (c);\r
+vl[c] = profile[0][c];\r
+}\r
+jalview.util.QuickSort.sortFloatChar (vl, ca);\r
+for (var p = 0, c = ca.length - 1; profile[0][ca[c].charCodeAt (0)] > 0; c--) {\r
+var residue = ca[c];\r
+if (residue != '-') {\r
+var tval = profile[0][residue.charCodeAt (0)] * 100 / normalisedBy;\r
+mouseOver.append ((((p == 0) ? "" : "; "))).append (residue).append (" ").append (((fmt != null) ? fmt.formDouble (tval) : (Clazz.floatToInt (tval)))).append ("%");\r
+p++;\r
+}}\r
+}} else {\r
+mouseOver.append ((((fmt != null) ? fmt.formDouble (value) : (Clazz.floatToInt (value))))).append ("%");\r
+}consensus.annotations[i] =  new jalview.datamodel.Annotation (maxRes, mouseOver.toString (), ' ', value);\r
+}\r
+}, "jalview.datamodel.AlignmentAnnotation,~A,~N,~N,~B,~B,~A,~N");\r
+c$.getPercentageFormat = Clazz.defineMethod (c$, "getPercentageFormat", \r
+function (nseq) {\r
+var scale = 0;\r
+while (nseq >= 10) {\r
+scale++;\r
+nseq /= 10;\r
+}\r
+return scale <= 1 ? null :  new jalview.util.Format ("%3." + (scale - 1) + "f");\r
+}, "~N");\r
+c$.extractProfile = Clazz.defineMethod (c$, "extractProfile", \r
+function (hconsensus, ignoreGaps) {\r
+var rtnval =  Clazz.newIntArray (64, 0);\r
+var profile = hconsensus.get ("P");\r
+if (profile == null) {\r
+return null;\r
+}var ca =  Clazz.newCharArray (profile[0].length, '\0');\r
+var vl =  Clazz.newFloatArray (profile[0].length, 0);\r
+for (var c = 0; c < ca.length; c++) {\r
+ca[c] = String.fromCharCode (c);\r
+vl[c] = profile[0][c];\r
+}\r
+jalview.util.QuickSort.sortFloatChar (vl, ca);\r
+var nextArrayPos = 2;\r
+var totalPercentage = 0;\r
+var distinctValuesCount = 0;\r
+var divisor = profile[1][ignoreGaps ? 1 : 0];\r
+for (var c = ca.length - 1; profile[0][ca[c].charCodeAt (0)] > 0; c--) {\r
+if (ca[c] != '-') {\r
+rtnval[nextArrayPos++] = (ca[c]).charCodeAt (0);\r
+var percentage = Clazz.floatToInt (profile[0][ca[c].charCodeAt (0)] * 100 / divisor);\r
+rtnval[nextArrayPos++] = percentage;\r
+totalPercentage += percentage;\r
+distinctValuesCount++;\r
+}}\r
+rtnval[0] = distinctValuesCount;\r
+rtnval[1] = totalPercentage;\r
+var result =  Clazz.newIntArray (rtnval.length + 1, 0);\r
+result[0] = 0;\r
+System.arraycopy (rtnval, 0, result, 1, rtnval.length);\r
+return result;\r
+}, "java.util.Hashtable,~B");\r
+c$.extractCdnaProfile = Clazz.defineMethod (c$, "extractCdnaProfile", \r
+function (hashtable, ignoreGaps) {\r
+var codonCounts = hashtable.get ("P");\r
+var sortedCounts =  Clazz.newIntArray (codonCounts.length - 2, 0);\r
+System.arraycopy (codonCounts, 2, sortedCounts, 0, codonCounts.length - 2);\r
+var result =  Clazz.newIntArray (3 + 2 * sortedCounts.length, 0);\r
+result[0] = 2;\r
+var codons =  Clazz.newCharArray (sortedCounts.length, '\0');\r
+for (var i = 0; i < codons.length; i++) {\r
+codons[i] = String.fromCharCode (i);\r
+}\r
+jalview.util.QuickSort.sortIntChar (sortedCounts, codons);\r
+var totalPercentage = 0;\r
+var distinctValuesCount = 0;\r
+var j = 3;\r
+var divisor = ignoreGaps ? codonCounts[1] : codonCounts[0];\r
+for (var i = codons.length - 1; i >= 0; i--) {\r
+var codonCount = sortedCounts[i];\r
+if (codonCount == 0) {\r
+break;\r
+}distinctValuesCount++;\r
+result[j++] = (codons[i]).charCodeAt (0);\r
+var percentage = Clazz.doubleToInt (codonCount * 100 / divisor);\r
+result[j++] = percentage;\r
+totalPercentage += percentage;\r
+}\r
+result[2] = totalPercentage;\r
+result[1] = distinctValuesCount;\r
+return java.util.Arrays.copyOfRange (result, 0, j);\r
+}, "java.util.Hashtable,~B");\r
+c$.calculateCdna = Clazz.defineMethod (c$, "calculateCdna", \r
+function (alignment, mappings, hconsensus, col0, col1) {\r
+var gapCharacter = alignment.getGapCharacter ();\r
+for (var col = col0; col < col1; col++) {\r
+var columnHash =  new java.util.Hashtable ();\r
+var codonCounts =  Clazz.newIntArray (66, 0);\r
+codonCounts[0] = alignment.getSequences ().size ();\r
+var ungappedCount = 0;\r
+for (var seq, $seq = alignment.getSequences ().iterator (); $seq.hasNext () && ((seq = $seq.next ()) || true);) {\r
+if (seq.getCharAt (col) == gapCharacter) {\r
+continue;\r
+}var codon = jalview.util.MappingUtils.findCodonFor (seq, col, mappings);\r
+var codonEncoded = jalview.analysis.CodingUtils.encodeCodon (codon);\r
+if (codonEncoded >= 0) {\r
+codonCounts[codonEncoded + 2]++;\r
+ungappedCount++;\r
+}}\r
+codonCounts[1] = ungappedCount;\r
+columnHash.put ("P", codonCounts);\r
+hconsensus[col] = columnHash;\r
+}\r
+}, "jalview.datamodel.AlignmentI,java.util.Set,~A,~N,~N");\r
+c$.completeCdnaConsensus = Clazz.defineMethod (c$, "completeCdnaConsensus", \r
+function (consensusAnnotation, consensusData, showProfileLogo, nseqs) {\r
+if (consensusAnnotation == null || consensusAnnotation.annotations == null || consensusAnnotation.annotations.length < consensusData.length) {\r
+return;\r
+}consensusAnnotation.scaleColLabel = true;\r
+for (var col = 0; col < consensusData.length; col++) {\r
+var hci = consensusData[col];\r
+if (hci == null) {\r
+continue;\r
+}var codonCounts = hci.get ("P");\r
+var totalCount = 0;\r
+var codons =  Clazz.newCharArray (codonCounts.length - 2, '\0');\r
+for (var j = 2; j < codonCounts.length; j++) {\r
+var codonCount = codonCounts[j];\r
+codons[j - 2] = String.fromCharCode (j - 2);\r
+totalCount += codonCount;\r
+}\r
+var sortedCodonCounts =  Clazz.newIntArray (codonCounts.length - 2, 0);\r
+System.arraycopy (codonCounts, 2, sortedCodonCounts, 0, codonCounts.length - 2);\r
+jalview.util.QuickSort.sortIntChar (sortedCodonCounts, codons);\r
+var modalCodonEncoded = (codons[codons.length - 1]).charCodeAt (0);\r
+var modalCodonCount = sortedCodonCounts[codons.length - 1];\r
+var modalCodon = String.valueOf (jalview.analysis.CodingUtils.decodeCodon (modalCodonEncoded));\r
+if (sortedCodonCounts.length > 1 && sortedCodonCounts[codons.length - 2] == modalCodonEncoded) {\r
+modalCodon = "+";\r
+}var pid = sortedCodonCounts[sortedCodonCounts.length - 1] * 100 / totalCount;\r
+var mouseOver =  new StringBuilder (32);\r
+var samePercent =  new StringBuilder ();\r
+var percent = null;\r
+var lastPercent = null;\r
+var fmt = jalview.analysis.AAFrequency.getPercentageFormat (nseqs);\r
+for (var j = codons.length - 1; j >= 0; j--) {\r
+var codonCount = sortedCodonCounts[j];\r
+if (codonCount == 0) {\r
+if (samePercent.length () > 0) {\r
+mouseOver.append (samePercent).append (": ").append (percent).append ("% ");\r
+}break;\r
+}var codonEncoded = (codons[j]).charCodeAt (0);\r
+var pct = Clazz.doubleToInt (codonCount * 100 / totalCount);\r
+var codon = String.valueOf (jalview.analysis.CodingUtils.decodeCodon (codonEncoded));\r
+percent = fmt == null ? Integer.toString (pct) : fmt.formLong (pct);\r
+if (showProfileLogo || codonCount == modalCodonCount) {\r
+if (percent.equals (lastPercent) && j > 0) {\r
+samePercent.append (samePercent.length () == 0 ? "" : ", ");\r
+samePercent.append (codon);\r
+} else {\r
+if (samePercent.length () > 0) {\r
+mouseOver.append (samePercent).append (": ").append (lastPercent).append ("% ");\r
+}samePercent.setLength (0);\r
+samePercent.append (codon);\r
+}lastPercent = percent;\r
+}}\r
+consensusAnnotation.annotations[col] =  new jalview.datamodel.Annotation (modalCodon, mouseOver.toString (), ' ', pid);\r
+}\r
+}, "jalview.datamodel.AlignmentAnnotation,~A,~B,~N");\r
+Clazz.defineStatics (c$,\r
+"TO_UPPER_CASE", -32,\r
+"MAXCOUNT", "C",\r
+"MAXRESIDUE", "R",\r
+"PID_GAPS", "G",\r
+"PID_NOGAPS", "N",\r
+"PROFILE", "P",\r
+"ENCODED_CHARS", "E");\r
+c$.CHARS = c$.prototype.CHARS =  new Array (26);\r
+{\r
+for (var c = 'A'; c <= 'Z'; c = String.fromCharCode (c.charCodeAt (0) + 1)) {\r
+jalview.analysis.AAFrequency.CHARS[c.charCodeAt (0) - 65] = String.valueOf (c);\r
+}\r
+}});\r