+ 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)
+ {
+ char[] sequence = getConsSequence().getSequence();
+ float minR;
+ float minG;
+ float minB;
+ float maxR;
+ float maxG;
+ float maxB;
+ minR = 0.3f;
+ minG = 0.0f;
+ minB = 0f;
+ maxR = 1.0f - minR;
+ maxG = 0.9f - minG;
+ maxB = 0f - minB; // scalable range for colouring both Conservation and
+ // Quality
+
+ float min = 0f;
+ float max = 11f;
+ float qmin = 0f;
+ float qmax = 0f;
+
+ char c;
+
+ 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;
+
+ c = sequence[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)
+ {
+ char[] sequence = getConsSequence().getSequence();
+ char val = column < sequence.length ? sequence[column] : '-';
+ boolean hasConservation = val != '-' && val != '0';
+ int consp = column - start;
+ String tip = (hasConservation && consp > -1 && consp < consSymbs.length) ? consSymbs[consp]
+ : "";
+ return tip;