JAL-1953 2.11.2 with Archeopteryx!
[jalview.git] / src / jalview / ext / treeviewer / LoadedTreeSequenceAssociation.java
diff --git a/src/jalview/ext/treeviewer/LoadedTreeSequenceAssociation.java b/src/jalview/ext/treeviewer/LoadedTreeSequenceAssociation.java
new file mode 100644 (file)
index 0000000..c05a57c
--- /dev/null
@@ -0,0 +1,113 @@
+package jalview.ext.treeviewer;
+
+import jalview.analysis.SequenceIdMatcher;
+import jalview.datamodel.SequenceI;
+import jalview.util.MappingUtils;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+/**
+ * Generic implementation of {@link LoadedTreeAssociationI } that tries to
+ * associate tree nodes based on comparing Jalview's sequence IDs to tree node
+ * names.
+ * 
+ * @author kjvanderheide
+ *
+ */
+public class LoadedTreeSequenceAssociation
+        implements LoadedTreeAssociationI
+{
+  SequenceI[] alignSequences;
+
+  TreeI tree;
+
+  Map<SequenceI, TreeNodeI> alignmentWithNodes;
+
+  Map<TreeNodeI, SequenceI> nodesWithAlignment;
+
+  public LoadedTreeSequenceAssociation(SequenceI[] alignmentSequences,
+          TreeI extTree)
+  {
+    alignSequences = alignmentSequences;
+    tree = extTree;
+    alignmentWithNodes = new HashMap<>(alignSequences.length);
+    nodesWithAlignment = new HashMap<>(alignSequences.length);
+
+  }
+
+  @Override
+  public void associateNodesToSequences()
+
+  {
+    SequenceIdMatcher algnIds = new SequenceIdMatcher(alignSequences);
+    SequenceI nodeSequence;
+    String nodeSequenceName;
+
+    if (!tree.isEmpty())
+    {
+      for (final Iterator<TreeNodeI> iter = tree
+              .iterateInPreOrder(); iter
+              .hasNext();)
+      {
+        TreeNodeI treeNode = iter.next();
+        nodeSequenceName = treeNode.getNodeName();
+
+        nodeSequence = algnIds.findIdMatch(nodeSequenceName);
+        if (nodeSequence != null)
+        {
+          // is there already a sequence present for the node?
+          // If so, does it actually match Jalview's sequence?
+          if (treeNode.getSequence() != null)
+          {
+            if (!(treeNode.getSequence().getSequenceAsString()
+                    .equals(nodeSequence.getSequenceAsString())))
+            {
+              System.err.println(
+                      "Sequence detected in tree node that does not match corresponding Jalview sequence:"
+                              + nodeSequenceName);
+              // which sequence gets precedence?
+
+            }
+
+          }
+          else
+          {
+          treeNode.setSequence(nodeSequence);
+          }
+          MappingUtils.putWithDuplicationCheck(alignmentWithNodes,
+                  nodeSequence, treeNode);
+          MappingUtils.putWithDuplicationCheck(nodesWithAlignment, treeNode,
+                  nodeSequence);
+
+
+        }
+
+    }
+
+    }
+  }
+
+
+
+  @Override
+  public Map<SequenceI, TreeNodeI> getAlignmentWithNodes()
+  {
+    return alignmentWithNodes;
+  }
+
+  @Override
+  public Map<TreeNodeI, SequenceI> getNodesWithAlignment()
+  {
+    return nodesWithAlignment;
+  }
+
+
+}
+
+
+
+
+
+