54bcff1c390c972d8516638d5f17179cf5ac1e67
[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 = new TreeNode(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 = new TreeNode(
89               new PhylogenyNode(sequence.getName()));
90
91       sequenceNode.setSequence(sequence);
92
93       MappingUtils.putWithDuplicationCheck(nodesWithAlignment,
94               sequenceNode, sequence);
95       MappingUtils.putWithDuplicationCheck(alignmentWithNodes,
96               sequence, sequenceNode);
97       rootNode.addAsChild(sequenceNode);
98     }
99
100
101     aptxTree.setRoot(rootNode);
102
103     treeTitle = generateTreeName();
104     aptxTree.setTreeName(treeTitle);
105
106     return aptxTree;
107
108   }
109
110   @Override
111   public Map<SequenceI, ExternalTreeNodeI> getAlignmentBoundNodes()
112   {
113     return alignmentWithNodes;
114   }
115
116   @Override
117   public Map<ExternalTreeNodeI, SequenceI> getNodesBoundAlignment()
118   {
119     return nodesWithAlignment;
120   }
121
122
123   /**
124    * Formats a localised title for the tree panel, like
125    * <p>
126    * Neighbour Joining Using BLOSUM62
127    * <p>
128    * For a tree loaded from file, just uses the file name
129    * 
130    * @return
131    */
132   @Override
133   public String generateTreeName() // Move this and add selection region to the
134                                    // title when applicable
135   {
136     if (treeTitle != null) // will currently never happen, loaded tree file will
137                            // take a different path
138     {
139       return treeTitle;
140     }
141     else
142     {
143       /*
144       * i18n description of Neighbour Joining or Average Distance method
145       */
146       String treecalcnm = MessageManager
147               .getString("label.tree_calc_" + jalviewTree.getClass()
148                       .getSimpleName().substring(0, 2).toLowerCase());
149       /*
150       * short score model name (long description can be too long)
151       */
152       String smn = jalviewTree.getScoreModel().getName();
153
154       /*
155       * put them together as <method> Using <model>
156       */
157       final String ttl = MessageManager
158               .formatMessage("label.treecalc_title", treecalcnm, smn);
159       return ttl;
160     }
161   }
162
163
164   
165
166 }