1.1 compatibility
[jalview.git] / src / jalview / analysis / Conservation.java
index 31a4b66..52d7517 100755 (executable)
@@ -1,6 +1,6 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.4)
- * Copyright (C) 2008 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
+ * Jalview - A Sequence Alignment Editor and Viewer (Development Version 2.4.1)
+ * Copyright (C) 2009 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
  * 
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -18,6 +18,7 @@
  */
 package jalview.analysis;
 
+import java.awt.Color;
 import java.util.*;
 
 import jalview.datamodel.*;
@@ -591,4 +592,91 @@ public class Conservation
     qualityRange[0] = new Double(0);
     qualityRange[1] = new Double(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.annotations !=null && conservation.annotations.length<alWidth) 
+    { conservation.annotations = new Annotation[alWidth]; }
+    
+
+    if (quality2 != null)
+    {
+      quality2.graphMax = qualityRange[1].floatValue();
+      if (quality2.annotations!=null && quality2.annotations.length<alWidth) {
+        quality2.annotations = new Annotation[alWidth];
+      }
+      qmin = qualityRange[0].floatValue();
+      qmax = qualityRange[1].floatValue();
+    }
+
+    for (int i = 0; i < alWidth; i++)
+    {
+      float value = 0;
+
+      c = sequence[i];
+
+      if (Character.isDigit(c))
+      {
+        value = (int) (c - '0');
+      }
+      else if (c == '*')
+      {
+        value = 11;
+      }
+      else if (c == '+')
+      {
+        value = 10;
+      }
+
+      float vprop = value - min;
+      vprop /= max;
+      conservation.annotations[i] = new Annotation(String.valueOf(c),
+              String.valueOf(value), ' ', value, new Color(minR
+                      + (maxR * vprop), minG + (maxG * vprop), minB
+                      + (maxB * vprop)));
+
+      // Quality calc
+      if (quality2 != null)
+      {
+        value = ((Double) quality.elementAt(i)).floatValue();
+        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)));
+      }
+    }
+  }
 }