Works on strings, not seqs
[jalview.git] / src / jalview / analysis / NJTree.java
index 46a2ced..be3b96d 100755 (executable)
@@ -39,6 +39,11 @@ public class NJTree
 {\r
     Vector cluster;\r
     SequenceI[] sequence;\r
+\r
+    //SequenceData is a string representation of what the user\r
+    //sees. The display may contain hidden columns.\r
+    String [] sequenceString;\r
+\r
     int[] done;\r
     int noseqs;\r
     int noClus;\r
@@ -58,19 +63,12 @@ public class NJTree
     String pwtype;\r
     Object found = null;\r
     Object leaves = null;\r
-    int start;\r
-    int end;\r
 \r
-    /**\r
-     * Creates a new NJTree object.\r
-     *\r
-     * @param node DOCUMENT ME!\r
-     */\r
-    public NJTree(SequenceNode node)\r
-    {\r
-        top = node;\r
-        maxheight = findHeight(top);\r
-    }\r
+    boolean hasDistances = true; // normal case for jalview trees\r
+    boolean hasBootstrap = false; // normal case for jalview trees\r
+\r
+    private boolean hasRootDistance = true;\r
+\r
 \r
     /**\r
      * Creates a new NJTree object.\r
@@ -78,9 +76,24 @@ public class NJTree
      * @param seqs DOCUMENT ME!\r
      * @param treefile DOCUMENT ME!\r
      */\r
-    public NJTree(SequenceI[] seqs, NewickFile treefile)\r
+    public NJTree(SequenceI[] seqs,  NewickFile treefile)\r
     {\r
         top = treefile.getTree();\r
+\r
+        if (sequenceString == null)\r
+        {\r
+          sequenceString = new String[sequence.length];\r
+          for (int i = 0; i < sequence.length; i++)\r
+          {\r
+            sequenceString[i] = sequence[i].getSequence();\r
+          }\r
+        }\r
+\r
+\r
+        hasDistances = treefile.HasDistances();\r
+        hasBootstrap = treefile.HasBootstrap();\r
+        hasRootDistance = treefile.HasRootDistance();\r
+\r
         maxheight = findHeight(top);\r
 \r
         SequenceIdMatcher algnIds = new SequenceIdMatcher(seqs);\r
@@ -123,32 +136,33 @@ public class NJTree
      * Creates a new NJTree object.\r
      *\r
      * @param sequence DOCUMENT ME!\r
-     * @param start DOCUMENT ME!\r
-     * @param end DOCUMENT ME!\r
-     */\r
-    public NJTree(SequenceI[] sequence, int start, int end)\r
-    {\r
-        this(sequence, "NJ", "BL", start, end);\r
-    }\r
-\r
-    /**\r
-     * Creates a new NJTree object.\r
-     *\r
-     * @param sequence DOCUMENT ME!\r
      * @param type DOCUMENT ME!\r
      * @param pwtype DOCUMENT ME!\r
      * @param start DOCUMENT ME!\r
      * @param end DOCUMENT ME!\r
      */\r
-    public NJTree(SequenceI[] sequence, String type, String pwtype, int start,\r
-        int end)\r
+    public NJTree(SequenceI[] sequence,\r
+                  String [] sequenceString,\r
+                  String type,\r
+                  String pwtype,\r
+                  int start, int end)\r
     {\r
         this.sequence = sequence;\r
         this.node = new Vector();\r
         this.type = type;\r
         this.pwtype = pwtype;\r
-        this.start = start;\r
-        this.end = end;\r
+\r
+        if (sequenceString == null)\r
+        {\r
+          this.sequenceString = new String[sequence.length];\r
+          for(int i=0; i<sequence.length; i++)\r
+          {\r
+            this.sequenceString[i] = sequence[i].getSequence(start, end);\r
+          }\r
+        }\r
+        else\r
+          this.sequenceString = sequenceString;\r
+\r
 \r
         if (!(type.equals("NJ")))\r
         {\r
@@ -375,7 +389,7 @@ public class NJTree
     public void findNewNJDistances(SequenceNode tmpi, SequenceNode tmpj,\r
         float dist)\r
     {\r
-     \r
+\r
         tmpi.dist = ((dist + ri) - rj) / 2;\r
         tmpj.dist = (dist - tmpi.dist);\r
 \r
@@ -598,7 +612,8 @@ public class NJTree
                     else\r
                     {\r
                         distance[i][j] = 100 -\r
-                            Comparison.PID(sequence[i], sequence[j], start, end);\r
+                             Comparison.PID(sequenceString[i], sequenceString[j]);\r
+\r
                         distance[j][i] = distance[i][j];\r
                     }\r
                 }\r
@@ -607,20 +622,20 @@ public class NJTree
         else if (pwtype.equals("BL"))\r
         {\r
             int maxscore = 0;\r
-\r
+            int end = sequenceString[0].length();\r
             for (int i = 0; i < (noseqs - 1); i++)\r
             {\r
                 for (int j = i; j < noseqs; j++)\r
                 {\r
                     int score = 0;\r
 \r
-                    for (int k = start; k < end; k++)\r
+                    for (int k = 0; k < end; k++)\r
                     {\r
                         try\r
                         {\r
-                            score += ResidueProperties.getBLOSUM62(sequence[i].getSequence(\r
-                                    k, k + 1), sequence[j].getSequence(k, k +\r
-                                    1));\r
+                            score += ResidueProperties.getBLOSUM62(\r
+                              sequenceString[i].substring(k, k + 1),\r
+                              sequenceString[j].substring(k, k + 1));\r
                         }\r
                         catch (Exception ex)\r
                         {\r
@@ -647,7 +662,7 @@ public class NJTree
                 }\r
             }\r
         }\r
-        else if (pwtype.equals("SW"))\r
+      /*  else if (pwtype.equals("SW"))\r
         {\r
             float max = -1;\r
 \r
@@ -658,7 +673,7 @@ public class NJTree
                     AlignSeq as = new AlignSeq(sequence[i], sequence[j], "pep");\r
                     as.calcScoreMatrix();\r
                     as.traceAlignment();\r
-                    as.printAlignment();\r
+                    as.printAlignment(System.out);\r
                     distance[i][j] = (float) as.maxscore;\r
 \r
                     if (max < distance[i][j])\r
@@ -676,7 +691,7 @@ public class NJTree
                     distance[j][i] = distance[i][j];\r
                 }\r
             }\r
-        }\r
+        }/*/\r
 \r
         return distance;\r
     }\r
@@ -967,12 +982,23 @@ public class NJTree
         return top;\r
     }\r
 \r
+    public String printOriginalSequenceData()\r
+    {\r
+      StringBuffer sb = new StringBuffer();\r
+      for(int i=0; i<sequenceString.length; i++)\r
+      {\r
+        sb.append(sequence[i].getName()+"\t");\r
+        sb.append(sequenceString[i]+"\n");\r
+      }\r
+      return sb.toString();\r
+    }\r
+\r
     /**\r
      * DOCUMENT ME!\r
      *\r
      * @param node DOCUMENT ME!\r
      */\r
-    public static void printN(SequenceNode node)\r
+    public void printN(SequenceNode node)\r
     {\r
         if (node == null)\r
         {\r
@@ -1134,6 +1160,27 @@ public class NJTree
     {\r
         return top;\r
     }\r
+    /**\r
+     *\r
+     * @return true if tree has real distances\r
+     */\r
+    public boolean isHasDistances() {\r
+      return hasDistances;\r
+    }\r
+\r
+    /**\r
+     *\r
+     * @return true if tree has real bootstrap values\r
+     */\r
+    public boolean isHasBootstrap() {\r
+      return hasBootstrap;\r
+    }\r
+\r
+  public boolean isHasRootDistance()\r
+  {\r
+    return hasRootDistance;\r
+  }\r
+\r
 }\r
 \r
 \r