JAL-1953 more progress on interfaces, jalview binding still problematic
[jalview.git] / src / jalview / ext / archaeopteryx / AptxTreeBuilder.java
1 package jalview.ext.archaeopteryx;
2
3 import jalview.analysis.TreeBuilder;
4 import jalview.datamodel.SequenceI;
5 import jalview.ext.forester.ForesterMatrix;
6 import jalview.ext.treeviewer.ExternalTreeBuilderI;
7 import jalview.ext.treeviewer.ExternalTreeI;
8 import jalview.ext.treeviewer.ExternalTreeNodeI;
9 import jalview.util.MappingUtils;
10 import jalview.util.MessageManager;
11
12 import java.util.HashMap;
13 import java.util.Map;
14
15 import org.forester.evoinference.matrix.distance.DistanceMatrix;
16 import org.forester.phylogeny.Phylogeny;
17 import org.forester.phylogeny.PhylogenyNode;
18
19 /**
20  * Class for converting trees made in Jalview (through TreeBuilder) to trees
21  * compatible with Forester (Phylogeny objects).
22  * 
23  * Note that this currently demands a 1:1 relationship between tree nodes and
24  * the sequences used for generating them.
25  * 
26  * @author kjvanderheide
27  *
28  */
29 public class AptxTreeBuilder
30         implements ExternalTreeBuilderI
31 {
32   protected final SequenceI[] sequences;
33
34   protected final DistanceMatrix distances;
35   
36   protected final TreeBuilder jalviewTree;
37   
38   public String treeTitle;
39
40   private final ExternalTreeI aptxTree;
41
42   private ExternalTreeNodeI rootNode;
43
44   private final Map<SequenceI, ExternalTreeNodeI> alignmentWithNodes;
45
46   private final Map<ExternalTreeNodeI, SequenceI> nodesWithAlignment;
47
48   public AptxTreeBuilder(final TreeBuilder calculatedTree)
49   {
50     jalviewTree = calculatedTree;
51     sequences = jalviewTree.getSequences();
52     distances = ForesterMatrix.convertJalviewToForester(
53             jalviewTree.getDistances(), sequences);
54
55     aptxTree = new Tree(new Phylogeny());
56     rootNode = TreeNode.getUniqueWrapper(new PhylogenyNode());
57
58     int amountOfSequences = distances.getSize();
59     alignmentWithNodes = new HashMap<>(amountOfSequences);
60     nodesWithAlignment = new HashMap<>(amountOfSequences);
61
62
63   }
64
65   @Override
66   public ExternalTreeI buildTree(final ExternalTreeNodeI treeRoot)
67   {
68
69     if (treeRoot != null)
70     {
71       rootNode = treeRoot;
72     }
73
74     buildTree();
75
76     return aptxTree;
77
78   }
79
80
81   @Override
82   public ExternalTreeI buildTree()
83   {
84
85     for (SequenceI sequence : sequences)
86     {
87
88       ExternalTreeNodeI sequenceNode = TreeNode
89               .getUniqueWrapper(
90               new PhylogenyNode(sequence.getName()));
91
92       sequenceNode.setSequence(sequence);
93
94       MappingUtils.putWithDuplicationCheck(nodesWithAlignment,
95               sequenceNode, sequence);
96       MappingUtils.putWithDuplicationCheck(alignmentWithNodes,
97               sequence, sequenceNode);
98       rootNode.addAsChild(sequenceNode);
99     }
100
101
102     aptxTree.setRoot(rootNode);
103
104     treeTitle = generateTreeName();
105     aptxTree.setTreeName(treeTitle);
106
107     return aptxTree;
108
109   }
110
111   @Override
112   public Map<SequenceI, ExternalTreeNodeI> getAlignmentBoundNodes()
113   {
114     return alignmentWithNodes;
115   }
116
117   @Override
118   public Map<ExternalTreeNodeI, SequenceI> getNodesBoundAlignment()
119   {
120     return nodesWithAlignment;
121   }
122
123
124   /**
125    * Formats a localised title for the tree panel, like
126    * <p>
127    * Neighbour Joining Using BLOSUM62
128    * <p>
129    * For a tree loaded from file, just uses the file name
130    * 
131    * @return
132    */
133   @Override
134   public String generateTreeName() // Move this and add selection region to the
135                                    // title when applicable
136   {
137     if (treeTitle != null) // will currently never happen, loaded tree file will
138                            // take a different path
139     {
140       return treeTitle;
141     }
142     else
143     {
144       /*
145       * i18n description of Neighbour Joining or Average Distance method
146       */
147       String treecalcnm = MessageManager
148               .getString("label.tree_calc_" + jalviewTree.getClass()
149                       .getSimpleName().substring(0, 2).toLowerCase());
150       /*
151       * short score model name (long description can be too long)
152       */
153       String smn = jalviewTree.getScoreModel().getName();
154
155       /*
156       * put them together as <method> Using <model>
157       */
158       final String ttl = MessageManager
159               .formatMessage("label.treecalc_title", treecalcnm, smn);
160       return ttl;
161     }
162   }
163
164
165   
166
167 }