Merge branch 'master' of https://source.jalview.org/git/jalviewjs.git
[jalviewjs.git] / site / j2s / jalview / analysis / AAFrequency.js
index 8e3d4c5..a7a69d1 100644 (file)
-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
+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);
+}
+}});