Merge branch 'develop' into menard
[jalview.git] / src / jalview / analysis / StructureFrequency.java
index aa1e277..d57e1c5 100644 (file)
@@ -1,13 +1,13 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7)
- * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, G Barton, M Clamp, S Searle
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8)
+ * Copyright (C) 2012 J Procter, AM Waterhouse, LM Lui, J Engelhardt, G Barton, M Clamp, S Searle
  * 
  * 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.
- * 
+ *  
  * 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 
@@ -16,6 +16,7 @@
  * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+
 package jalview.analysis;
 
 import java.util.*;
@@ -58,11 +59,15 @@ public class StructureFrequency
    */
   public static int findPair(SequenceFeature[] pairs, int indice)
   {
+         System.out.print("indice"+indice+"    ");
     for (int i = 0; i < pairs.length; i++)
     {
       if (pairs[i].getBegin() == indice)
+        
       {
+         System.out.println(pairs[i].getEnd());
         return pairs[i].getEnd();
+        
       }
     }
     return -1;
@@ -83,15 +88,26 @@ public class StructureFrequency
           int end, Hashtable[] result, boolean profile,
           AlignmentAnnotation rnaStruc)
   {
+//     System.out.println("longueur="+sequences.length);
+//     for(int l=0;l<=(sequences.length-1);l++){  
+//     System.out.println("sequences "+l+":"+sequences[l].getSequenceAsString());
+//     }
+//     System.out.println("start="+start);
+       System.out.println("end="+end);
+//     System.out.println("result="+result.length);
+//
+//     System.out.println("profile="+profile);
+//     System.out.println("rnaStruc="+rnaStruc);
     Hashtable residueHash;
     String maxResidue;
-    char[] seq, struc = rnaStruc.getRNAStruc().toCharArray();
+    char[] struc = rnaStruc.getRNAStruc().toCharArray();
     SequenceFeature[] rna = rnaStruc._rnasecstr;
     char c, s, cEnd;
-    int count, nonGap = 0, i, bpEnd = -1, j, jSize = sequences.length;
+    int count = 0, nonGap = 0, i, bpEnd = -1, j, jSize = sequences.length;
     int[] values;
     int[][] pairs;
     float percentage;
+    boolean wooble = true;
 
     for (i = start; i < end; i++) // foreach column
     {
@@ -100,9 +116,11 @@ public class StructureFrequency
       values = new int[255];
       pairs = new int[255][255];
       bpEnd = -1;
+      //System.out.println("s="+struc[i]);
       if (i < struc.length)
       {
         s = struc[i];
+        
       }
       else
       {
@@ -113,7 +131,7 @@ public class StructureFrequency
         s = '-';
       }
 
-      if (s != '(')
+      if (s != '(' && s != '[')
       {
         if (s == '-')
         {
@@ -122,6 +140,12 @@ public class StructureFrequency
       }
       else
       {
+        
+         
+        bpEnd = findPair(rna, i);
+       
+        if (bpEnd>-1)
+        {
         for (j = 0; j < jSize; j++) // foreach row
         {
           if (sequences[j] == null)
@@ -130,33 +154,43 @@ public class StructureFrequency
                     .println("WARNING: Consensus skipping null sequence - possible race condition.");
             continue;
           }
-          seq = sequences[j].getSequence();
-
-          if (seq.length > i)
-          {
-            c = seq[i];
+          c = sequences[j].getCharAt(i);
+          //System.out.println("c="+c);
+          
 
             // standard representation for gaps in sequence and structure
             if (c == '.' || c == ' ')
             {
-              c = '-';
-            }
-
-            if (c == '-')
-            {
-              values['-']++;
+              System.err
+                      .println("WARNING: Consensus skipping null sequence - possible race condition.");
               continue;
             }
-            bpEnd = findPair(rna, i);
-            cEnd = seq[bpEnd];
-            if (checkBpType(c, cEnd))
+            cEnd = sequences[j].getCharAt(bpEnd);
+         
+         
+            System.out.println("pairs ="+c+","+cEnd);
+            if (checkBpType(c, cEnd)==true)
             {
               values['(']++; // H means it's a helix (structured)
+              maxResidue = "(";
+              wooble=true;
+              System.out.println("It's a pair wc");
+              
+            }
+            if (checkBpType(c, cEnd)==false)
+            {
+              wooble =false;
+              values['[']++; // H means it's a helix (structured)
+              maxResidue = "[";
+              System.out.println("It's an pair non canonic");
+              System.out.println(sequences[j].getRNA());
+              System.out.println(rnaStruc.getRNAStruc().charAt(i));
             }
-            pairs[c][cEnd]++;
+            pairs[c][cEnd]++;  
+           
+          
+               }
 
-            maxResidue = "(";
-          }
         }
         // nonGap++;
       }
@@ -169,13 +203,18 @@ public class StructureFrequency
 
         residueHash.put(PAIRPROFILE, pairs);
       }
-
+      if (wooble==true)
+      {
       count = values['('];
-
+      }
+      if (wooble==false)
+      {
+      count = values['['];
+      }
       residueHash.put(MAXCOUNT, new Integer(count));
       residueHash.put(MAXRESIDUE, maxResidue);
 
-      percentage = ((float) count * 100) / (float) jSize;
+      percentage = ((float) count * 100) / jSize;
       residueHash.put(PID_GAPS, new Float(percentage));
 
       // percentage = ((float) count * 100) / (float) nongap;
@@ -186,12 +225,19 @@ public class StructureFrequency
       }
       if (bpEnd > 0)
       {
-        values[')'] = values['('];
+       values[')'] = values['('];
+        values[']'] = values['['];
         values['('] = 0;
-
+        values['['] = 0;
         residueHash = new Hashtable();
-        maxResidue = ")";
-
+        if (wooble==true){
+               System.out.println(maxResidue+","+wooble);
+               maxResidue = ")";
+        }
+        if(wooble==false){
+               System.out.println(maxResidue+","+wooble);
+               maxResidue = "]";
+        }
         if (profile)
         {
           residueHash.put(PROFILE, new int[][]
@@ -204,10 +250,11 @@ public class StructureFrequency
         residueHash.put(MAXCOUNT, new Integer(count));
         residueHash.put(MAXRESIDUE, maxResidue);
 
-        percentage = ((float) count * 100) / (float) jSize;
+        percentage = ((float) count * 100) / jSize;
         residueHash.put(PID_GAPS, new Float(percentage));
 
         result[bpEnd] = residueHash;
+        
       }
     }
   }
@@ -310,7 +357,8 @@ public class StructureFrequency
     }
     for (int i = iStart; i < width; i++)
     {
-      if (i >= hconsensus.length)
+      Hashtable hci;
+      if (i >= hconsensus.length || ((hci = hconsensus[i]) == null))
       {
         // happens if sequences calculated over were shorter than alignment
         // width
@@ -318,30 +366,31 @@ public class StructureFrequency
         continue;
       }
       value = 0;
+      Float fv;
       if (ignoreGapsInConsensusCalculation)
       {
-        value = ((Float) hconsensus[i].get(StructureFrequency.PID_NOGAPS))
-                .floatValue();
+        fv = (Float) hci.get(StructureFrequency.PID_NOGAPS);
       }
       else
       {
-        value = ((Float) hconsensus[i].get(StructureFrequency.PID_GAPS))
-                .floatValue();
+        fv = (Float) hci.get(StructureFrequency.PID_GAPS);
       }
-
-      String maxRes = hconsensus[i].get(StructureFrequency.MAXRESIDUE)
-              .toString();
-      String mouseOver = hconsensus[i].get(StructureFrequency.MAXRESIDUE)
-              + " ";
+      if (fv == null)
+      {
+        consensus.annotations[i] = null;
+        // data has changed below us .. give up and
+        continue;
+      }
+      value = fv.floatValue();
+      String maxRes = hci.get(StructureFrequency.MAXRESIDUE).toString();
+      String mouseOver = hci.get(StructureFrequency.MAXRESIDUE) + " ";
       if (maxRes.length() > 1)
       {
         mouseOver = "[" + maxRes + "] ";
         maxRes = "+";
       }
-      int[][] profile = (int[][]) hconsensus[i]
-              .get(StructureFrequency.PROFILE);
-      int[][] pairs = (int[][]) hconsensus[i]
-              .get(StructureFrequency.PAIRPROFILE);
+      int[][] profile = (int[][]) hci.get(StructureFrequency.PROFILE);
+      int[][] pairs = (int[][]) hci.get(StructureFrequency.PAIRPROFILE);
 
       if (pairs != null && includeAllConsSymbols) // Just responsible for the
       // tooltip
@@ -349,7 +398,9 @@ public class StructureFrequency
       {
         mouseOver = "";
 
-        /* TODO It's not sure what is the purpose of the alphabet and wheter it is useful for structure?
+        /*
+         * TODO It's not sure what is the purpose of the alphabet and wheter it
+         * is useful for structure?
          * 
          * if (alphabet != null) { for (int c = 0; c < alphabet.length; c++) {
          * tval = ((float) profile[0][alphabet[c]]) 100f / (float)
@@ -366,7 +417,7 @@ public class StructureFrequency
           {
             ca[x] = new int[]
             { c, d };
-            vl[x] = (float) pairs[c][d];
+            vl[x] = pairs[c][d];
             x++;
           }
         }
@@ -377,7 +428,7 @@ public class StructureFrequency
         {
           if (vl[c] > 0)
           {
-            tval = ((float) vl[c] * 100f / (float) profile[1][ignoreGapsInConsensusCalculation ? 1
+            tval = (vl[c] * 100f / profile[1][ignoreGapsInConsensusCalculation ? 1
                     : 0]);
             mouseOver += ((p == 0) ? "" : "; ") + (char) ((int[]) ca[c])[0]
                     + (char) ((int[]) ca[c])[1] + " " + ((int) tval) + "%";
@@ -406,7 +457,7 @@ public class StructureFrequency
   public static int[] extractProfile(Hashtable hconsensus,
           boolean ignoreGapsInConsensusCalculation)
   {
-    int[] rtnval = new int[52]; // 2*(5*5)+2
+    int[] rtnval = new int[74]; // 2*(5*5)+2
     int[][] profile = (int[][]) hconsensus.get(StructureFrequency.PROFILE);
     int[][] pairs = (int[][]) hconsensus
             .get(StructureFrequency.PAIRPROFILE);
@@ -424,7 +475,7 @@ public class StructureFrequency
       {
         ca[x] = new int[]
         { c, d };
-        vl[x] = (float) pairs[c][d];
+        vl[x] = pairs[c][d];
         x++;
       }
     }
@@ -438,9 +489,9 @@ public class StructureFrequency
       {
         rtnval[rtnval[0]++] = ((int[]) ca[c])[0];
         rtnval[rtnval[0]++] = ((int[]) ca[c])[1];
-        rtnval[rtnval[0]] = (int) ((float) vl[c] * 100f / (float) profile[1][ignoreGapsInConsensusCalculation ? 1
+        rtnval[rtnval[0]] = (int) (vl[c] * 100f / profile[1][ignoreGapsInConsensusCalculation ? 1
                 : 0]);
-        rtnval[1]+=rtnval[rtnval[0]++];
+        rtnval[1] += rtnval[rtnval[0]++];
       }
     }