+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;
+ }
+
+
+}
+
+
+
+
+
+