Works on strings, not seqs
[jalview.git] / src / jalview / analysis / NJTree.java
index 97b8519..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
@@ -251,14 +265,14 @@ public class NJTree
     {\r
         while (noClus > 2)\r
         {\r
-           /* if (type.equals("NJ"))\r
+            if (type.equals("NJ"))\r
             {\r
-                float mind = findMinNJDistance();\r
+                findMinNJDistance();\r
             }\r
             else\r
             {\r
-                float mind = findMinDistance();\r
-            }*/\r
+                findMinDistance();\r
+            }\r
 \r
             Cluster c = joinClusters(mini, minj);\r
 \r
@@ -273,7 +287,7 @@ public class NJTree
         boolean onefound = false;\r
 \r
         int one = -1;\r
-        //int two = -1;\r
+        int two = -1;\r
 \r
         for (int i = 0; i < noseqs; i++)\r
         {\r
@@ -281,7 +295,7 @@ public class NJTree
             {\r
                 if (onefound == false)\r
                 {\r
-                    //two = i;\r
+                    two = i;\r
                     onefound = true;\r
                 }\r
                 else\r
@@ -291,7 +305,7 @@ public class NJTree
             }\r
         }\r
 \r
-       // Cluster c = joinClusters(one, two);\r
+        joinClusters(one, two);\r
         top = (SequenceNode) (node.elementAt(one));\r
 \r
         reCount(top);\r
@@ -375,11 +389,6 @@ public class NJTree
     public void findNewNJDistances(SequenceNode tmpi, SequenceNode tmpj,\r
         float dist)\r
     {\r
-        //float ih = 0;\r
-       // float jh = 0;\r
-\r
-        //SequenceNode sni = tmpi;\r
-        //SequenceNode snj = tmpj;\r
 \r
         tmpi.dist = ((dist + ri) - rj) / 2;\r
         tmpj.dist = (dist - tmpi.dist);\r
@@ -469,8 +478,6 @@ public class NJTree
      */\r
     public void findClusterNJDistance(int i, int j)\r
     {\r
-        //int noi = ((Cluster) cluster.elementAt(i)).value.length;\r
-        //int noj = ((Cluster) cluster.elementAt(j)).value.length;\r
 \r
         // New distances from cluster to others\r
         float[] newdist = new float[noseqs];\r
@@ -605,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
@@ -614,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
@@ -654,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
@@ -665,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
@@ -683,7 +691,7 @@ public class NJTree
                     distance[j][i] = distance[i][j];\r
                 }\r
             }\r
-        }\r
+        }/*/\r
 \r
         return distance;\r
     }\r
@@ -974,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
@@ -1141,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
@@ -1164,3 +1204,4 @@ class Cluster
         this.value = value;\r
     }\r
 }\r
+\r