new place for sequencefeaturefetcher
[jalview.git] / src / jalview / analysis / NJTree.java
index 7324b6c..8f3483d 100755 (executable)
@@ -5,6 +5,8 @@ import jalview.util.*;
 import jalview.schemes.ResidueProperties;\r
 import java.util.*;\r
 \r
+import jalview.io.NewickFile;\r
+\r
 public class NJTree {\r
 \r
   Vector cluster;\r
@@ -44,6 +46,73 @@ public class NJTree {
   public NJTree(SequenceNode node) {\r
     top = node;\r
     maxheight = findHeight(top);\r
+\r
+  }\r
+  // Private SequenceID class to do fuzzy .equals() method for Hashtable.\r
+\r
+  private class SeqIdname {\r
+    String id;\r
+\r
+    SeqIdname(String s) {\r
+      id = new String(s);\r
+    }\r
+    public int hashCode() {\r
+      return (id.substring(0,4).hashCode());\r
+    }\r
+    public boolean equals(Object s) {\r
+      if (s instanceof SeqIdname) {\r
+        return this.equals((SeqIdname) s);\r
+      } else {\r
+        if (s instanceof String) {\r
+          return this.equals((String) s);\r
+        }\r
+      }\r
+      return false;\r
+    }\r
+\r
+\r
+    public boolean equals(SeqIdname s) {\r
+      if (id.startsWith(s.id) || s.id.startsWith(id)) {\r
+        return true;\r
+      }\r
+      return false;\r
+    }\r
+\r
+    public boolean equals(String s) {\r
+      if (id.startsWith(s) || s.startsWith(id)) {\r
+        return true;\r
+      }\r
+      return false;\r
+    }\r
+  }\r
+\r
+  public NJTree(SequenceI[] seqs, NewickFile treefile) {\r
+    top = treefile.getTree();\r
+    maxheight = findHeight(top);\r
+    Hashtable names = new Hashtable();\r
+    for (int i = 0; i < seqs.length; i++)\r
+    {\r
+      names.put(new SeqIdname(seqs[i].getDisplayId()), seqs[i]);\r
+    }\r
+    Vector leaves = new Vector();\r
+    findLeaves(top, leaves);\r
+    int i = 0;\r
+    int namesleft = seqs.length;\r
+    SequenceNode j;\r
+    SeqIdname nam;\r
+    while (i < leaves.size())\r
+    {\r
+      j = (SequenceNode) leaves.elementAt(i++);\r
+      nam = new SeqIdname(j.getName());\r
+      if ((namesleft>-1)\r
+          && names.containsKey(nam))\r
+      {\r
+        j.setElement(names.get(nam));\r
+        namesleft--;\r
+      } else {\r
+        j.setElement(new Sequence(nam.id, "THISISAPLACEHLDER"));\r
+      }\r
+    }\r
   }\r
 \r
   public NJTree(SequenceI[] sequence,int start, int end) {\r
@@ -469,8 +538,8 @@ public class NJTree {
 \r
       float dist = ((SequenceNode)node).dist;\r
       if (dist > maxDistValue) {\r
-         maxdist      = (SequenceNode)node;\r
-         maxDistValue = dist;\r
+          maxdist      = (SequenceNode)node;\r
+          maxDistValue = dist;\r
       }\r
     } else {\r
       findMaxDist((SequenceNode)node.left());\r
@@ -478,10 +547,10 @@ public class NJTree {
     }\r
   }\r
     public Vector getGroups() {\r
-       return groups;\r
+        return groups;\r
     }\r
     public float getMaxHeight() {\r
-       return maxheight;\r
+        return maxheight;\r
     }\r
   public void  groupNodes(SequenceNode node, float threshold) {\r
     if (node == null) {\r
@@ -570,8 +639,8 @@ public class NJTree {
   }\r
 \r
     public void reCount(SequenceNode node) {\r
-       ycount = 0;\r
-       _reCount(node);\r
+        ycount = 0;\r
+        _reCount(node);\r
     }\r
   public void _reCount(SequenceNode node) {\r
     if (node == null) {\r
@@ -595,13 +664,13 @@ public class NJTree {
 \r
   }\r
     public void swapNodes(SequenceNode node) {\r
-       if (node == null) {\r
-           return;\r
-       }\r
-       SequenceNode tmp = (SequenceNode)node.left();\r
+        if (node == null) {\r
+            return;\r
+        }\r
+        SequenceNode tmp = (SequenceNode)node.left();\r
 \r
-       node.setLeft(node.right());\r
-       node.setRight(tmp);\r
+        node.setLeft(node.right());\r
+        node.setRight(tmp);\r
     }\r
   public void changeDirection(SequenceNode node, SequenceNode dir) {\r
     if (node == null) {\r
@@ -641,13 +710,13 @@ public class NJTree {
     }\r
   }\r
     public void setMaxDist(SequenceNode node) {\r
-       this.maxdist = maxdist;\r
+        this.maxdist = maxdist;\r
     }\r
     public SequenceNode getMaxDist() {\r
-       return maxdist;\r
+        return maxdist;\r
     }\r
     public SequenceNode getTopNode() {\r
-       return top;\r
+        return top;\r
     }\r
 \r
 }\r