JAL-2145 JAL-1551 formatting
[jalview.git] / src / jalview / analysis / Conservation.java
index e6f035f..7b3ce25 100755 (executable)
@@ -1,27 +1,35 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2)
- * Copyright (C) 2014 The Jalview Authors
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
  * 
  * This file is part of Jalview.
  * 
  * Jalview 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 3 of the License, or (at your option) any later version.
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
  *  
  * Jalview 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 Jalview.  If not, see <http://www.gnu.org/licenses/>.
+ * You should have received a copy of the GNU General Public License
+ * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
  * The Jalview Authors are detailed in the 'AUTHORS' file.
  */
 package jalview.analysis;
 
-import java.awt.Color;
-import java.util.*;
+import jalview.datamodel.AlignmentAnnotation;
+import jalview.datamodel.Annotation;
+import jalview.datamodel.Sequence;
+import jalview.datamodel.SequenceI;
 
-import jalview.datamodel.*;
+import java.awt.Color;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Vector;
 
 /**
  * Calculates conservation values for a given set of sequences
@@ -69,6 +77,8 @@ public class Conservation
 
   int[][] cons2;
 
+  private String[] consSymbs;
+
   /**
    * Creates a new Conservation object.
    * 
@@ -104,7 +114,7 @@ public class Conservation
     {
       for (s = 0; s < sSize; s++)
       {
-        sarray[s] = (SequenceI) sequences.get(s);
+        sarray[s] = sequences.get(s);
         if (sarray[s].getLength() > maxLength)
         {
           maxLength = sarray[s].getLength();
@@ -225,10 +235,7 @@ public class Conservation
               c = '-';
             }
 
-            if (!canonicaliseAa && 'a' <= c && c <= 'z')
-            {
-              c -= (32); // 32 = 'a' - 'A'
-            }
+            c = toUpperCase(c);
           }
           values[c]++;
         }
@@ -270,8 +277,7 @@ public class Conservation
                 resultHash.put(type, ht.get("-"));
               }
             }
-            else if (((Integer) resultHash.get(type)).equals((Integer) ht
-                    .get(res)) == false)
+            else if (((Integer) resultHash.get(type)).equals(ht.get(res)) == false)
             {
               resultHash.put(type, new Integer(-1));
             }
@@ -317,6 +323,7 @@ public class Conservation
       }
       else
       {
+        c = toUpperCase(c);
         nres++;
 
         if (nres == 1)
@@ -338,6 +345,22 @@ public class Conservation
   }
 
   /**
+   * Returns the upper-cased character if between 'a' and 'z', else the
+   * unchanged value
+   * 
+   * @param c
+   * @return
+   */
+  char toUpperCase(char c)
+  {
+    if ('a' <= c && c <= 'z')
+    {
+      c -= (32); // 32 = 'a' - 'A'
+    }
+    return c;
+  }
+
+  /**
    * Calculates the conservation sequence
    * 
    * @param consflag
@@ -364,17 +387,17 @@ public class Conservation
     {
       consString.append('-');
     }
-
+    consSymbs = new String[end - start + 1];
     for (int i = start; i <= end; i++)
     {
       gapcons = countConsNGaps(i);
       totGaps = gapcons[1];
-      pgaps = ((float) totGaps * 100) / (float) sequences.length;
+      pgaps = ((float) totGaps * 100) / sequences.length;
+      consSymbs[i - start] = new String();
 
       if (percentageGaps > pgaps)
       {
         resultHash = total[i - start];
-
         // Now find the verdict
         count = 0;
         enumeration = resultHash.keys();
@@ -383,12 +406,12 @@ public class Conservation
         {
           type = (String) enumeration.nextElement();
           result = (Integer) resultHash.get(type);
-
           // Do we want to count +ve conservation or +ve and -ve cons.?
           if (consflag)
           {
             if (result.intValue() == 1)
             {
+              consSymbs[i - start] = type + " " + consSymbs[i - start];
               count++;
             }
           }
@@ -396,6 +419,17 @@ public class Conservation
           {
             if (result.intValue() != -1)
             {
+              {
+                if (result.intValue() == 0)
+                {
+                  consSymbs[i - start] = consSymbs[i - start] + " !" + type;
+                }
+                else
+                {
+                  consSymbs[i - start] = type + " " + consSymbs[i - start];
+                }
+              }
+
               count++;
             }
           }
@@ -667,7 +701,7 @@ public class Conservation
 
       if (Character.isDigit(c))
       {
-        value = (int) (c - '0');
+        value = c - '0';
       }
       else if (c == '*')
       {
@@ -680,10 +714,12 @@ public class Conservation
 
       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),
-              String.valueOf(value), ' ', value, new Color(minR
-                      + (maxR * vprop), minG + (maxG * vprop), minB
-                      + (maxB * vprop)));
+              conssym, ' ', value, new Color(minR + (maxR * vprop), minG
+                      + (maxG * vprop), minB + (maxB * vprop)));
 
       // Quality calc
       if (quality2 != null)