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 alignmentWithNodes; Map 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 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 getAlignmentWithNodes() { return alignmentWithNodes; } @Override public Map getNodesWithAlignment() { return nodesWithAlignment; } }