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
--- /dev/null
+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;
+ }
+
+}