1.1 compatibility
[jalview.git] / src / jalview / analysis / Conservation.java
index c216471..52d7517 100755 (executable)
@@ -1,23 +1,24 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer
- * Copyright (C) 2007 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
  * as published by the Free Software Foundation; either version 2
  * of the License, or (at your option) any later version.
- *
+ * 
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- *
+ * 
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
  */
 package jalview.analysis;
 
+import java.awt.Color;
 import java.util.*;
 
 import jalview.datamodel.*;
@@ -45,9 +46,10 @@ public class Conservation
   Hashtable[] total;
 
   boolean canonicaliseAa = true; // if true then conservation calculation will
-                                  // map all symbols to canonical aa numbering
-                                  // rather than consider conservation of that
-                                  // symbol
+
+  // map all symbols to canonical aa numbering
+  // rather than consider conservation of that
+  // symbol
 
   /** Stores calculated quality values */
   public Vector quality;
@@ -95,7 +97,7 @@ public class Conservation
     this.end = end;
 
     maxLength = end - start + 1; // default width includes bounds of
-                                  // calculation
+    // calculation
 
     int s, sSize = sequences.size();
     SequenceI[] sarray = new SequenceI[sSize];
@@ -112,8 +114,8 @@ public class Conservation
   }
 
   /**
-   * Translate sequence i into a numerical 
-   * representation and store it in the i'th position of the seqNums array.
+   * Translate sequence i into a numerical representation and store it in the
+   * i'th position of the seqNums array.
    * 
    * @param i
    */
@@ -146,7 +148,7 @@ public class Conservation
         }
 
         sqnum = new int[len + 1]; // better to always make a new array -
-                                  // sequence can change its length
+        // sequence can change its length
         sqnum[0] = sq.hashCode();
 
         for (j = 1; j <= len; j++)
@@ -276,7 +278,8 @@ public class Conservation
   }
 
   /*****************************************************************************
-   * count conservation  for the j'th column of the alignment
+   * count conservation for the j'th column of the alignment
+   * 
    * @return { gap count, conserved residue count}
    */
   public int[] countConsNGaps(int j)
@@ -477,8 +480,7 @@ public class Conservation
        * maxj = -1;
        * 
        * for (int j=0;j<24;j++) { if (cons2[i][j] > max) { max = cons2[i][j];
-       * maxi = i; maxj = j; }
-       *  } }
+       * maxi = i; maxj = j; } } }
        */
     }
   }
@@ -590,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)));
+      }
+    }
+  }
 }