Menus
[jalview.git] / src / jalview / analysis / Conservation.java
index 38047f8..deeb2e9 100755 (executable)
@@ -41,7 +41,7 @@ public class Conservation {
     if (i>-1 && i<sequences.size()) {\r
       sq = ((SequenceI)sequences.elementAt(i)).getSequence();\r
       if (seqNums.size()<=i) {\r
-        seqNums.add(new int[sq.length()+1]);\r
+        seqNums.addElement(new int[sq.length()+1]);\r
       }\r
       if (sq.hashCode()!=((int[])seqNums.elementAt(i))[0])\r
        {\r
@@ -58,11 +58,11 @@ public class Conservation {
            sqnum[j] = ( (Integer) jalview.schemes.ResidueProperties.aaHash.get(new\r
                String(sq.substring(j - 1, j)))).intValue(); // yuk\r
          }\r
-         seqNums.set(i, sqnum);\r
+         seqNums.setElementAt(sqnum, i);\r
        }\r
      } else {\r
        // JBPNote INFO level debug\r
-       System.out.println("calcSeqNum called with out of range sequence index for Alignment\n");\r
+       System.err.println("ERROR: calcSeqNum called with out of range sequence index for Alignment\n");\r
      }\r
    }\r
    Vector total = new Vector();\r
@@ -98,7 +98,8 @@ public class Conservation {
       residueHash = new Hashtable();\r
 \r
       for (int j=0; j < sequences.size(); j++) {\r
-\r
+        // JBPNote - have to make sure elements of the sequences vector\r
+        //  are tested like this everywhere...\r
         if (sequences.elementAt(j) instanceof Sequence) {\r
           Sequence s = (Sequence)sequences.elementAt(j);\r
 \r
@@ -155,6 +156,7 @@ public class Conservation {
           }\r
         }\r
       }\r
+\r
       total.addElement(resultHash);\r
     }\r
   }\r
@@ -175,14 +177,53 @@ public class Conservation {
     }\r
     return count;\r
   }\r
+  /***\r
+   * countConsNGaps\r
+   * returns gap count in int[0], and conserved residue count in int[1]\r
+   */\r
+  public int[] countConsNGaps(int j)\r
+  {\r
+    int count = 0;\r
+    int cons=0;\r
+    int nres = 0;\r
+    int[] r = new int[2];\r
+    char f='$';\r
+    for (int i = 0; i < sequences.size();i++)\r
+    {\r
+      if( j >= ((Sequence)sequences.elementAt(i)).getSequence().length())\r
+      {  count++;\r
+      continue;}\r
+\r
+      char c = ((Sequence)sequences.elementAt(i)).getSequence().charAt(j);\r
+      if (jalview.util.Comparison.isGap((c)))\r
+        count++;\r
+      else {\r
+        nres++;\r
+        if (nres==1) {\r
+          f = c;\r
+          cons++;\r
+        } else\r
+          if (f == c) {\r
+            cons++;\r
+          }\r
+      }\r
+    }\r
+    r[0] = (nres==cons) ? 1 : 0;\r
+    r[1] = count;\r
+\r
+\r
+    return r;\r
+  }\r
 \r
   public  void  verdict(boolean consflag, float percentageGaps) {\r
     String consString = "";\r
 \r
     for (int i=start; i <= end; i++) {\r
-      int totGaps = countGaps(i);\r
+      int[] gapcons = countConsNGaps(i);\r
+      boolean cons = (gapcons[0]==1) ? true : false;\r
+      int totGaps = gapcons[1];\r
       float pgaps = (float)totGaps*100/(float)sequences.size();\r
-\r
+      //      System.out.println("percentage gaps = "+pgaps+"\n");\r
       if (percentageGaps > pgaps)\r
       {\r
         Hashtable resultHash = (Hashtable)total.elementAt(i-start);\r
@@ -211,9 +252,9 @@ public class Conservation {
         }\r
 \r
         if (count < 10)\r
-          consString = consString + String.valueOf(count);\r
+          consString = consString + String.valueOf(count);// Conserved props!=Identity\r
         else\r
-          consString = consString + "*";\r
+          consString = consString + ((gapcons[0]==1) ? "*" : "+");\r
 \r
       }\r
       else\r
@@ -255,6 +296,9 @@ public class Conservation {
         for (int i = 1; i < sqnum.length; i++) {\r
           cons2[i-1][sqnum[i]]++;\r
         }\r
+        for (int i=sqnum.length-1; i<maxLength; i++) {\r
+          cons2[i][23]++; // gap count\r
+        }\r
         j++;\r
       }\r
 \r
@@ -292,7 +336,7 @@ public void findQuality(int start, int end) {
     int[] lengths = new int[size];\r
 \r
     for (int l = 0; l < size; l++)\r
-      lengths[l] = ((int[]) seqNums.get(l)).length;\r
+      lengths[l] = ((int[]) seqNums.elementAt(l)).length-1;\r
 \r
     for (int j=start; j <= end; j++) {\r
       double bigtot = 0;\r
@@ -307,7 +351,8 @@ public void findQuality(int start, int end) {
            x[ii]  += (double)cons2[j][i2] * BLOSUM62[ii][i2]+4;\r
          }\r
        } catch (Exception e) {\r
-         System.out.println("Exception : "  + e);\r
+         System.err.println("Exception during quality calculation.");\r
+          e.printStackTrace();\r
        }\r
        //System.out.println("X " + ii + " " + x[ii]);\r
        x[ii] /= (size);\r
@@ -318,8 +363,8 @@ public void findQuality(int start, int end) {
        double tot = 0;\r
        double[] xx = new double[24];\r
         int seqNum =\r
-            ((j+1)<lengths[size])\r
-            ? ((int[]) seqNums.get(k))[j+1]\r
+            (j<lengths[k])\r
+            ? ((int[]) seqNums.elementAt(k))[j+1]\r
             : 23; // Sequence, or gap at the end\r
 \r
         // This is a loop over r\r
@@ -328,7 +373,8 @@ public void findQuality(int start, int end) {
           try {\r
             sr = (double)BLOSUM62[i][seqNum]+4;\r
           } catch (Exception e) {\r
-            System.out.println("Exception in sr " + e);\r
+            System.out.println("Exception in sr: " + e);\r
+            e.printStackTrace();\r
           }\r
           //Calculate X with another loop over residues\r
 \r