1 package jalview.ext.archaeopteryx;
3 import jalview.analysis.TreeBuilder;
4 import jalview.datamodel.SequenceI;
5 import jalview.ext.forester.DataConversions;
6 import jalview.ext.forester.ForesterMatrix;
7 import jalview.ext.treeviewer.ExternalTreeBuilderI;
8 import jalview.util.MappingUtils;
9 import jalview.util.MessageManager;
11 import java.util.HashMap;
14 import org.forester.evoinference.matrix.distance.DistanceMatrix;
15 import org.forester.phylogeny.Phylogeny;
16 import org.forester.phylogeny.PhylogenyNode;
17 import org.forester.phylogeny.data.NodeData;
18 import org.forester.phylogeny.data.Sequence;
21 * Class for converting trees made in Jalview (through TreeBuilder) to trees
22 * compatible with Forester (Phylogeny objects).
24 * Note that this currently demands a 1:1 relationship between tree nodes and
25 * the sequences used for generating them.
27 * @author kjvanderheide
30 public class AptxTreeBuilder
31 implements ExternalTreeBuilderI<Phylogeny, PhylogenyNode>
33 protected final SequenceI[] sequences;
35 protected final DistanceMatrix distances;
37 protected final TreeBuilder jalviewTree;
39 public String treeTitle;
41 private final Phylogeny aptxTree;
43 private PhylogenyNode rootNode;
45 private final Map<SequenceI, PhylogenyNode> alignmentWithNodes;
47 private final Map<PhylogenyNode, SequenceI> nodesWithAlignment;
49 public AptxTreeBuilder(final TreeBuilder calculatedTree)
51 jalviewTree = calculatedTree;
52 sequences = jalviewTree.getSequences();
53 distances = ForesterMatrix.convertJalviewToForester(
54 jalviewTree.getDistances(), sequences);
56 aptxTree = new Phylogeny();
57 rootNode = new PhylogenyNode();
59 int amountOfSequences = distances.getSize();
60 alignmentWithNodes = new HashMap<>(amountOfSequences);
61 nodesWithAlignment = new HashMap<>(amountOfSequences);
67 public Phylogeny buildTree(final PhylogenyNode treeRoot)
83 public Phylogeny buildTree()
86 for (SequenceI sequence : sequences)
88 Sequence seq = DataConversions
89 .createForesterSequence(sequence, true);
90 PhylogenyNode sequenceNode = new PhylogenyNode(sequence.getName());
92 NodeData nodeData = sequenceNode.getNodeData();
93 nodeData.setSequence(seq);
95 MappingUtils.putWithDuplicationCheck(nodesWithAlignment,
96 sequenceNode, sequence);
97 MappingUtils.putWithDuplicationCheck(alignmentWithNodes,
98 sequence, sequenceNode);
99 rootNode.addAsChild(sequenceNode);
103 aptxTree.setRoot(rootNode);
105 treeTitle = generateTreeName();
106 aptxTree.setName(treeTitle);
113 public Map<SequenceI, PhylogenyNode> getAlignmentBoundNodes()
115 return alignmentWithNodes;
119 public Map<PhylogenyNode, SequenceI> getNodesBoundAlignment()
121 return nodesWithAlignment;
124 private Phylogeny clusterNodes()
130 * Formats a localised title for the tree panel, like
132 * Neighbour Joining Using BLOSUM62
134 * For a tree loaded from file, just uses the file name
139 public String generateTreeName() // Move this and add selection region to the
140 // title when applicable
142 if (treeTitle != null) // will currently never happen, loaded tree file will
143 // take a different path
150 * i18n description of Neighbour Joining or Average Distance method
152 String treecalcnm = MessageManager
153 .getString("label.tree_calc_" + jalviewTree.getClass()
154 .getSimpleName().substring(0, 2).toLowerCase());
156 * short score model name (long description can be too long)
158 String smn = jalviewTree.getScoreModel().getName();
161 * put them together as <method> Using <model>
163 final String ttl = MessageManager
164 .formatMessage("label.treecalc_title", treecalcnm, smn);