Moved tree leafname to alignment set matching into SequenceIdMatcher class for
authorjprocter <Jim Procter>
Thu, 5 May 2005 13:15:25 +0000 (13:15 +0000)
committerjprocter <Jim Procter>
Thu, 5 May 2005 13:15:25 +0000 (13:15 +0000)
use in other contexts.

src/jalview/analysis/NJTree.java
src/jalview/analysis/SequenceIdMatcher.java [new file with mode: 0755]

index 8f3483d..7f4850e 100755 (executable)
@@ -48,69 +48,33 @@ public class NJTree {
     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
+    SequenceIdMatcher algnIds = new SequenceIdMatcher(seqs);\r
+\r
     Vector leaves = new Vector();\r
     findLeaves(top, leaves);\r
+\r
     int i = 0;\r
     int namesleft = seqs.length;\r
+\r
     SequenceNode j;\r
-    SeqIdname nam;\r
+    SequenceI nam;\r
+    String realnam;\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
+      realnam = j.getName();\r
+      nam = null;\r
+      if (namesleft>-1)\r
+        nam = algnIds.findIdMatch(realnam);\r
+      if (nam != null) {\r
+        j.setElement(nam);\r
         namesleft--;\r
       } else {\r
-        j.setElement(new Sequence(nam.id, "THISISAPLACEHLDER"));\r
+        j.setElement(new Sequence(realnam, "THISISAPLACEHLDER"));\r
       }\r
     }\r
   }\r
diff --git a/src/jalview/analysis/SequenceIdMatcher.java b/src/jalview/analysis/SequenceIdMatcher.java
new file mode 100755 (executable)
index 0000000..03528db
--- /dev/null
@@ -0,0 +1,137 @@
+package jalview.analysis;
+
+import java.util.Vector;
+import java.util.Hashtable;
+import jalview.datamodel.SequenceI;
+
+/**
+ * <p>Title: </p>
+ * SequenceIdMatcher
+ * <p>Description: </p>
+ * Routine which does approximate Sequence Id resolution by name using string containment rather than equivalence
+ * <p>Copyright: Copyright (c) 2004</p>
+ *
+ * <p>Company: Dundee University</p>
+ *
+ * @author not attributable
+ * @version 1.0
+ */
+public class SequenceIdMatcher
+{
+
+  private class SeqIdName
+  {
+    String id;
+
+    SeqIdName(String s)
+    {
+      id = new String(s);
+    }
+
+    public int hashCode()
+    {
+      return (id.substring(0, 4).hashCode());
+    }
+
+    public boolean equals(Object s)
+    {
+      if (s instanceof SeqIdName)
+      {
+        return this.equals( (SeqIdName) s);
+      }
+      else
+      {
+        if (s instanceof String)
+        {
+          return this.equals( (String) s);
+        }
+      }
+      return false;
+    }
+
+    public boolean equals(SeqIdName s)
+    {
+      if (id.startsWith(s.id) || s.id.startsWith(id))
+      {
+        return true;
+      }
+      return false;
+    }
+
+    public boolean equals(String s)
+    {
+      if (id.startsWith(s) || s.startsWith(id))
+      {
+        return true;
+      }
+      return false;
+    }
+  }
+
+  private Hashtable names;
+
+  public SequenceIdMatcher(SequenceI[] seqs)
+  {
+    names = new Hashtable();
+    for (int i = 0; i < seqs.length; i++)
+    {
+      names.put(new SeqIdName(seqs[i].getName()), seqs[i]);
+    }
+  }
+
+  SequenceI findIdMatch(SequenceI seq)
+  {
+    SeqIdName nam = new SeqIdName(seq.getName());
+    if (names.containsKey(nam))
+    {
+      return (SequenceI) names.get(nam);
+    }
+    return null;
+  }
+
+  SequenceI findIdMatch(String seqnam)
+  {
+    SeqIdName nam = new SeqIdName(seqnam);
+    if (names.containsKey(nam))
+    {
+      return (SequenceI) names.get(nam);
+    }
+    return null;
+  }
+
+  /**
+   * @method findIdMatch
+   *
+   * Return pointers to sequences (or sequence object containers)
+   * which have same Id as a given set of different sequence objects
+   *
+   * @param seqs SequenceI[]
+   * @return SequenceI[]
+   */
+
+  SequenceI[] findIdMatch(SequenceI[] seqs)
+  {
+    SequenceI[] namedseqs = new SequenceI[seqs.length];
+
+    int i = 0;
+    SeqIdName nam;
+    if (seqs.length > 0)
+    {
+      do
+      {
+        nam = new SeqIdName(seqs[i].getName());
+        if (names.containsKey(nam))
+        {
+          namedseqs[i] = (SequenceI) names.get(nam);
+        }
+        else
+        {
+          namedseqs[i] = null;
+        }
+      }
+      while (i++ < seqs.length);
+    }
+    return namedseqs;
+  }
+
+}