JAL-2805 check actually works now
[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 public class LoadedTreeSequenceAssociation
12         implements LoadedTreeAssociationI
13 {
14   SequenceI[] alignSequences;
15
16   TreeI tree;
17
18   Map<SequenceI, TreeNodeI> alignmentWithNodes;
19
20   Map<TreeNodeI, SequenceI> nodesWithAlignment;
21
22   public LoadedTreeSequenceAssociation(SequenceI[] alignmentSequences,
23           TreeI extTree)
24   {
25     alignSequences = alignmentSequences;
26     tree = extTree;
27     alignmentWithNodes = new HashMap<>(alignSequences.length);
28     nodesWithAlignment = new HashMap<>(alignSequences.length);
29
30   }
31
32   /**
33    * Tries to match sequences from Jalview with tree nodes in Archaeopteryx and
34    * fills in the tree node with sequence data if a match is found.
35    * 
36    * Partially refactored from the old Jalview TreeModel
37    * associateLeavesToSequences method.
38    *
39    * @param seqs
40    * @param aptxTree
41    */
42   @Override
43   public void associateLeavesToSequences()
44
45   {
46     SequenceIdMatcher algnIds = new SequenceIdMatcher(alignSequences);
47     SequenceI nodeSequence;
48     String nodeSequenceName;
49
50     if (!tree.isEmpty())
51     {
52       for (final Iterator<TreeNodeI> iter = tree
53               .iterateInPreOrder(); iter
54               .hasNext();)
55       {
56         TreeNodeI treeNode = iter.next();
57         nodeSequenceName = treeNode.getNodeName();
58
59         nodeSequence = algnIds.findIdMatch(nodeSequenceName);
60         if (nodeSequence != null)
61         {
62           // is there already a sequence present for the node?
63           // If so, does it actually match Jalview's sequence?
64           if (treeNode.getSequence() != null)
65           {
66             if (!(treeNode.getSequence().getSequenceAsString()
67                     .equals(nodeSequence.getSequenceAsString())))
68             {
69               System.err.println(
70                       "Sequence detected in tree node that does not match corresponding Jalview sequence:"
71                               + nodeSequenceName);
72               // which sequence gets precedence?
73
74             }
75
76           }
77           else
78           {
79           treeNode.setSequence(nodeSequence);
80           }
81           MappingUtils.putWithDuplicationCheck(alignmentWithNodes,
82                   nodeSequence, treeNode);
83           MappingUtils.putWithDuplicationCheck(nodesWithAlignment, treeNode,
84                   nodeSequence);
85
86
87         }
88
89     }
90
91     }
92   }
93
94
95
96   @Override
97   public Map<SequenceI, TreeNodeI> getAlignmentWithNodes()
98   {
99     return alignmentWithNodes;
100   }
101
102   @Override
103   public Map<TreeNodeI, SequenceI> getNodesWithAlignment()
104   {
105     return nodesWithAlignment;
106   }
107
108
109 }
110
111
112
113
114
115