1 package jalview.ext.archaeopteryx;
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;
9 import java.util.HashMap;
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;
19 * Class for converting trees made in Jalview (through TreeBuilder) to trees
20 * compatible with Forester (Phylogeny objects).
22 * Note that this currently demands a 1:1 relationship between tree nodes and
23 * the sequences used for generating them.
25 * @author kjvanderheide
28 public class ArchaeopteryxTreeBuilder
29 implements ExternalTreeBuilderI<Phylogeny, PhylogenyNode>
31 protected final SequenceI[] sequences;
33 protected final DistanceMatrix distances;
35 protected final TreeBuilder jalviewTree;
37 public String treeTitle;
39 private final Phylogeny aptxTree;
41 private PhylogenyNode rootNode;
43 private final Map<SequenceI, PhylogenyNode> alignmentWithNodes;
45 private final Map<PhylogenyNode, SequenceI> nodesWithAlignment;
47 public ArchaeopteryxTreeBuilder(final TreeBuilder calculatedTree)
49 jalviewTree = calculatedTree;
50 sequences = jalviewTree.getSequences();
51 distances = ForesterMatrix.convertJalviewToForester(
52 jalviewTree.getDistances(), sequences);
54 aptxTree = new Phylogeny();
55 rootNode = new PhylogenyNode();
57 int amountOfSequences = distances.getSize();
58 alignmentWithNodes = new HashMap<>(amountOfSequences);
59 nodesWithAlignment = new HashMap<>(amountOfSequences);
65 public Phylogeny buildTree(final PhylogenyNode treeRoot)
81 public Phylogeny buildTree()
84 for (SequenceI sequence : sequences)
86 Sequence seq = ForesterDataConversions
87 .createForesterSequence(sequence, true);
88 PhylogenyNode sequenceNode = new PhylogenyNode(sequence.getName());
90 NodeData nodeData = sequenceNode.getNodeData();
91 nodeData.setSequence(seq);
93 nodesWithAlignment.put(sequenceNode, sequence);
94 alignmentWithNodes.put(sequence, sequenceNode);
95 rootNode.addAsChild(sequenceNode);
99 aptxTree.setRoot(rootNode);
101 treeTitle = generateTreeName();
102 aptxTree.setName(treeTitle);
109 public Map<SequenceI, PhylogenyNode> getAlignmentBoundNodes()
111 return alignmentWithNodes;
115 public Map<PhylogenyNode, SequenceI> getNodesBoundAlignment()
117 return nodesWithAlignment;
120 private Phylogeny clusterNodes()
126 * Formats a localised title for the tree panel, like
128 * Neighbour Joining Using BLOSUM62
130 * For a tree loaded from file, just uses the file name
135 public String generateTreeName() // Move this and add selection region to the
136 // title when applicable
138 if (treeTitle != null) // will currently never happen, loaded tree file will
139 // take a different path
146 * i18n description of Neighbour Joining or Average Distance method
148 String treecalcnm = MessageManager
149 .getString("label.tree_calc_" + jalviewTree.getClass()
150 .getSimpleName().substring(0, 2).toLowerCase());
152 * short score model name (long description can be too long)
154 String smn = jalviewTree.getScoreModel().getName();
157 * put them together as <method> Using <model>
159 final String ttl = MessageManager
160 .formatMessage("label.treecalc_title", treecalcnm, smn);