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