+ qualityMinimum = 0D;
+ qualityMaximum = newmax;
+ }
+
+ /**
+ * Complete the given consensus and quuality annotation rows. Note: currently
+ * this method will enlarge the given annotation row if it is too small,
+ * otherwise will leave its length unchanged.
+ *
+ * @param conservation
+ * conservation annotation row
+ * @param quality2
+ * (optional - may be null)
+ * @param istart
+ * first column for conservation
+ * @param alWidth
+ * extent of conservation
+ */
+ public void completeAnnotations(AlignmentAnnotation conservation,
+ AlignmentAnnotation quality2, int istart, int alWidth)
+ {
+ SequenceI cons = getConsSequence();
+
+ /*
+ * colour scale for Conservation and Quality;
+ */
+ float minR = 0.3f;
+ float minG = 0.0f;
+ float minB = 0f;
+ float maxR = 1.0f - minR;
+ float maxG = 0.9f - minG;
+ float maxB = 0f - minB;
+
+ float min = 0f;
+ float max = 11f;
+ float qmin = 0f;
+ float qmax = 0f;
+
+ if (conservation != null && conservation.annotations != null
+ && conservation.annotations.length < alWidth)
+ {
+ conservation.annotations = new Annotation[alWidth];
+ }
+
+ if (quality2 != null)
+ {
+ quality2.graphMax = (float) qualityMaximum;
+ if (quality2.annotations != null
+ && quality2.annotations.length < alWidth)
+ {
+ quality2.annotations = new Annotation[alWidth];
+ }
+ qmin = (float) qualityMinimum;
+ qmax = (float) qualityMaximum;
+ }
+
+ for (int i = istart; i < alWidth; i++)
+ {
+ float value = 0;
+
+ char c = cons.getCharAt(i);
+
+ if (Character.isDigit(c))
+ {
+ value = c - '0';
+ }
+ else if (c == '*')
+ {
+ value = 11;
+ }
+ else if (c == '+')
+ {
+ value = 10;
+ }
+
+ if (conservation != null)
+ {
+ float vprop = value - min;
+ vprop /= max;
+ int consp = i - start;
+ String conssym = (value > 0 && consp > -1
+ && consp < consSymbs.length) ? consSymbs[consp] : "";
+ conservation.annotations[i] = new Annotation(String.valueOf(c),
+ conssym, ' ', value, new Color(minR + (maxR * vprop),
+ minG + (maxG * vprop), minB + (maxB * vprop)));
+ }
+
+ // Quality calc
+ if (quality2 != null)
+ {
+ value = quality.elementAt(i).floatValue();
+ float vprop = value - qmin;
+ vprop /= qmax;
+ quality2.annotations[i] = new Annotation(" ", String.valueOf(value),
+ ' ', value, new Color(minR + (maxR * vprop),
+ minG + (maxG * vprop), minB + (maxB * vprop)));
+ }
+ }
+ }
+
+ /**
+ * construct and call the calculation methods on a new Conservation object
+ *
+ * @param name
+ * - name of conservation
+ * @param seqs
+ * @param start
+ * first column in calculation window
+ * @param end
+ * last column in calculation window
+ * @param positiveOnly
+ * calculate positive (true) or positive and negative (false)
+ * conservation
+ * @param maxPercentGaps
+ * percentage of gaps tolerated in column
+ * @param calcQuality
+ * flag indicating if alignment quality should be calculated
+ * @return Conservation object ready for use in visualization
+ */
+ public static Conservation calculateConservation(String name,
+ List<SequenceI> seqs, int start, int end, boolean positiveOnly,
+ int maxPercentGaps, boolean calcQuality)
+ {
+ Conservation cons = new Conservation(name, seqs, start, end);
+ cons.calculate();
+ cons.verdict(positiveOnly, maxPercentGaps);
+
+ if (calcQuality)
+ {
+ cons.findQuality();
+ }
+
+ return cons;
+ }
+
+ /**
+ * Returns the computed tooltip (annotation description) for a given column.
+ * The tip is empty if the conservation score is zero, otherwise holds the
+ * conserved properties (and, optionally, properties whose absence is
+ * conserved).
+ *
+ * @param column
+ * @return
+ */
+ String getTooltip(int column)
+ {
+ SequenceI cons = getConsSequence();
+ char val = column < cons.getLength() ? cons.getCharAt(column) : '-';
+ boolean hasConservation = val != '-' && val != '0';
+ int consp = column - start;
+ String tip = (hasConservation && consp > -1 && consp < consSymbs.length)
+ ? consSymbs[consp]
+ : "";
+ return tip;