c05a57c32121a978a331ec9c85e85e96b1bec660
[jalview.git] / src / jalview / ext / treeviewer / LoadedTreeSequenceAssociation.java
1 package jalview.ext.treeviewer;
2
3 import jalview.analysis.SequenceIdMatcher;
4 import jalview.datamodel.SequenceI;
5 import jalview.util.MappingUtils;
6
7 import java.util.HashMap;
8 import java.util.Iterator;
9 import java.util.Map;
10
11 /**
12  * Generic implementation of {@link LoadedTreeAssociationI } that tries to
13  * associate tree nodes based on comparing Jalview's sequence IDs to tree node
14  * names.
15  * 
16  * @author kjvanderheide
17  *
18  */
19 public class LoadedTreeSequenceAssociation
20         implements LoadedTreeAssociationI
21 {
22   SequenceI[] alignSequences;
23
24   TreeI tree;
25
26   Map<SequenceI, TreeNodeI> alignmentWithNodes;
27
28   Map<TreeNodeI, SequenceI> nodesWithAlignment;
29
30   public LoadedTreeSequenceAssociation(SequenceI[] alignmentSequences,
31           TreeI extTree)
32   {
33     alignSequences = alignmentSequences;
34     tree = extTree;
35     alignmentWithNodes = new HashMap<>(alignSequences.length);
36     nodesWithAlignment = new HashMap<>(alignSequences.length);
37
38   }
39
40   @Override
41   public void associateNodesToSequences()
42
43   {
44     SequenceIdMatcher algnIds = new SequenceIdMatcher(alignSequences);
45     SequenceI nodeSequence;
46     String nodeSequenceName;
47
48     if (!tree.isEmpty())
49     {
50       for (final Iterator<TreeNodeI> iter = tree
51               .iterateInPreOrder(); iter
52               .hasNext();)
53       {
54         TreeNodeI treeNode = iter.next();
55         nodeSequenceName = treeNode.getNodeName();
56
57         nodeSequence = algnIds.findIdMatch(nodeSequenceName);
58         if (nodeSequence != null)
59         {
60           // is there already a sequence present for the node?
61           // If so, does it actually match Jalview's sequence?
62           if (treeNode.getSequence() != null)
63           {
64             if (!(treeNode.getSequence().getSequenceAsString()
65                     .equals(nodeSequence.getSequenceAsString())))
66             {
67               System.err.println(
68                       "Sequence detected in tree node that does not match corresponding Jalview sequence:"
69                               + nodeSequenceName);
70               // which sequence gets precedence?
71
72             }
73
74           }
75           else
76           {
77           treeNode.setSequence(nodeSequence);
78           }
79           MappingUtils.putWithDuplicationCheck(alignmentWithNodes,
80                   nodeSequence, treeNode);
81           MappingUtils.putWithDuplicationCheck(nodesWithAlignment, treeNode,
82                   nodeSequence);
83
84
85         }
86
87     }
88
89     }
90   }
91
92
93
94   @Override
95   public Map<SequenceI, TreeNodeI> getAlignmentWithNodes()
96   {
97     return alignmentWithNodes;
98   }
99
100   @Override
101   public Map<TreeNodeI, SequenceI> getNodesWithAlignment()
102   {
103     return nodesWithAlignment;
104   }
105
106
107 }
108
109
110
111
112
113