+
+ /**
+ * Compute all or part of the annotation row from the given consensus
+ * hashtable
+ *
+ * @param consensus
+ * - pre-allocated annotation row
+ * @param hconsensus
+ * @param iStart
+ * @param width
+ * @param ignoreGapsInConsensusCalculation
+ * @param includeAllConsSymbols
+ * @param nseq
+ */
+ public static void completeConsensus(AlignmentAnnotation consensus,
+ Hashtable[] hconsensus, int iStart, int width,
+ boolean ignoreGapsInConsensusCalculation,
+ boolean includeAllConsSymbols, long nseq)
+ {
+ completeConsensus(consensus, hconsensus, iStart, width,
+ ignoreGapsInConsensusCalculation, includeAllConsSymbols, null,
+ nseq); // new
+ // char[]
+ // { 'A', 'C', 'G', 'T', 'U' });
+ }
+
+ public static void completeConsensus(AlignmentAnnotation consensus,
+ Hashtable[] hconsensus, int iStart, int width,
+ boolean ignoreGapsInConsensusCalculation,
+ boolean includeAllConsSymbols, char[] alphabet, long nseq)
+ {
+ float tval, value;
+ if (consensus == null || consensus.annotations == null
+ || consensus.annotations.length < width)
+ {
+ // called with a bad alignment annotation row - wait for it to be
+ // initialised properly
+ return;
+ }
+ String fmtstr = "%3.1f";
+ int precision = 0;
+ while (nseq >= 10)
+ {
+ precision++;
+ nseq /= 10;
+ }
+ final Format fmt;
+ if (precision > 1)
+ {
+ // if (precision>2)
+ {
+ fmtstr = "%" + (2 + precision) + "." + (precision) + "f";
+ }
+ fmt = new Format(fmtstr);
+ }
+ else
+ {
+ fmt = null;
+ }
+ for (int i = iStart; i < width; i++)
+ {
+ Hashtable hci;
+ if (i >= hconsensus.length || ((hci = hconsensus[i]) == null))
+ {
+ // happens if sequences calculated over were shorter than alignment
+ // width
+ consensus.annotations[i] = null;
+ continue;
+ }
+ value = 0;
+ Float fv;
+ if (ignoreGapsInConsensusCalculation)
+ {
+ fv = (Float) hci.get(AAFrequency.PID_NOGAPS);
+ }
+ else
+ {
+ fv = (Float) hci.get(AAFrequency.PID_GAPS);
+ }
+ if (fv == null)
+ {
+ consensus.annotations[i] = null;
+ // data has changed below us .. give up and
+ continue;
+ }
+ value = fv.floatValue();
+ String maxRes = hci.get(AAFrequency.MAXRESIDUE).toString();
+ String mouseOver = hci.get(AAFrequency.MAXRESIDUE) + " ";
+ if (maxRes.length() > 1)
+ {
+ mouseOver = "[" + maxRes + "] ";
+ maxRes = "+";
+ }
+ int[][] profile = (int[][]) hci.get(AAFrequency.PROFILE);
+ if (profile != null && includeAllConsSymbols)
+ {
+ mouseOver = "";
+ if (alphabet != null)
+ {
+ for (int c = 0; c < alphabet.length; c++)
+ {
+ tval = profile[0][alphabet[c]] * 100f
+ / profile[1][ignoreGapsInConsensusCalculation ? 1 : 0];
+ mouseOver += ((c == 0) ? "" : "; ") + alphabet[c] + " "
+ + ((fmt != null) ? fmt.form(tval) : ((int) tval)) + "%";
+ }
+ }
+ else
+ {
+ Object[] ca = new Object[profile[0].length];
+ float[] vl = new float[profile[0].length];
+ for (int c = 0; c < ca.length; c++)
+ {
+ ca[c] = new char[]
+ { (char) c };
+ vl[c] = profile[0][c];
+ }
+ ;
+ jalview.util.QuickSort.sort(vl, ca);
+ for (int p = 0, c = ca.length - 1; profile[0][((char[]) ca[c])[0]] > 0; c--)
+ {
+ if (((char[]) ca[c])[0] != '-')
+ {
+ tval = profile[0][((char[]) ca[c])[0]]
+ * 100f
+ / profile[1][ignoreGapsInConsensusCalculation ? 1 : 0];
+ mouseOver += ((p == 0) ? "" : "; ") + ((char[]) ca[c])[0]
+ + " "
+ + ((fmt != null) ? fmt.form(tval) : ((int) tval))
+ + "%";
+ p++;
+
+ }
+ }
+
+ }
+ }
+ else
+ {
+ mouseOver += ((fmt != null) ? fmt.form(value) : ((int) value))
+ + "%";
+ }
+ consensus.annotations[i] = new Annotation(maxRes, mouseOver, ' ',
+ value);
+ }
+ }
+
+ /**
+ * get the sorted profile for the given position of the consensus
+ *
+ * @param hconsensus
+ * @return
+ */
+ public static int[] extractProfile(Hashtable hconsensus,
+ boolean ignoreGapsInConsensusCalculation)
+ {
+ int[] rtnval = new int[64];
+ int[][] profile = (int[][]) hconsensus.get(AAFrequency.PROFILE);
+ if (profile == null)
+ return null;
+ Object[] ca = new Object[profile[0].length];
+ float[] vl = new float[profile[0].length];
+ for (int c = 0; c < ca.length; c++)
+ {
+ ca[c] = new char[]
+ { (char) c };
+ vl[c] = profile[0][c];
+ }
+ ;
+ jalview.util.QuickSort.sort(vl, ca);
+ rtnval[0] = 2;
+ rtnval[1] = 0;
+ for (int c = ca.length - 1; profile[0][((char[]) ca[c])[0]] > 0; c--)
+ {
+ if (((char[]) ca[c])[0] != '-')
+ {
+ rtnval[rtnval[0]++] = ((char[]) ca[c])[0];
+ rtnval[rtnval[0]] = (int) (profile[0][((char[]) ca[c])[0]] * 100f / profile[1][ignoreGapsInConsensusCalculation ? 1
+ : 0]);
+ rtnval[1] += rtnval[rtnval[0]++];
+ }
+ }
+ return rtnval;
+ }