import jalview.analysis.TreeBuilder;
import jalview.datamodel.SequenceI;
+import jalview.ext.forester.ForesterConversions;
+import jalview.ext.forester.ForesterMatrix;
import jalview.util.MessageManager;
+import java.util.HashMap;
+import java.util.Map;
+
import org.forester.evoinference.matrix.distance.DistanceMatrix;
import org.forester.phylogeny.Phylogeny;
import org.forester.phylogeny.PhylogenyNode;
-
+import org.forester.phylogeny.data.NodeData;
+import org.forester.phylogeny.data.Sequence;
+
+/**
+ * Class for converting trees made in Jalview (through TreeBuilder) to trees
+ * compatible with Forester (Phylogeny objects).
+ *
+ * Note that this currently demands a 1:1 relationship between tree nodes and
+ * the sequences used for generating them.
+ *
+ * @author kjvanderheide
+ *
+ */
public class ArchaeopteryxTreeConverter
{
- protected SequenceI[] sequences;
-
- private Phylogeny aptxTree;
-
- private PhylogenyNode rootNode;
+ protected final SequenceI[] sequences;
- protected DistanceMatrix distances;
+ protected final DistanceMatrix distances;
- protected TreeBuilder jalviewTree;
+ protected final TreeBuilder jalviewTree;
public String treeTitle;
+ private final Phylogeny aptxTree;
+ private PhylogenyNode rootNode;
- public ArchaeopteryxTreeConverter(TreeBuilder calculatedTree)
- {
- this.jalviewTree = calculatedTree;
- this.sequences = jalviewTree.getSequences();
- this.distances = MatrixConverter.convertJalviewToForester(
- jalviewTree.getDistances(), jalviewTree.getSequences());
+ private final Map<SequenceI, PhylogenyNode> alignmentBoundNodes;
- }
+ private final Map<PhylogenyNode, SequenceI> nodesBoundAlignment;
- public Phylogeny buildAptxTree()
+ public ArchaeopteryxTreeConverter(final TreeBuilder calculatedTree)
{
- this.rootNode = new PhylogenyNode();
+ jalviewTree = calculatedTree;
+ sequences = jalviewTree.getSequences();
+ distances = ForesterMatrix.convertJalviewToForester(
+ jalviewTree.getDistances(), sequences);
+ aptxTree = new Phylogeny();
+ rootNode = new PhylogenyNode();
+ alignmentBoundNodes = new HashMap<>(distances.getSize());
+ nodesBoundAlignment = new HashMap<>(distances.getSize());
- return buildAptxTree(rootNode);
}
- public Phylogeny buildAptxTree(PhylogenyNode treeRoot)
+ public Phylogeny buildAptxTree(final PhylogenyNode treeRoot)
{
- this.rootNode = treeRoot;
-
- this.aptxTree = new Phylogeny();
-
- this.treeTitle = generateTreeName();
- this.aptxTree.setName(treeTitle);
-
- // final NeighborJoiningF nj = NeighborJoiningF.createInstance(false, 5);
+ if (treeRoot != null)
+ {
+ rootNode = treeRoot;
+ }
- //
- // final Phylogeny phy = nj.execute(JalviewMatrixToForesterMatrix
- // .convertJalviewToForester(distances));
+ buildAptxTree();
- return buildAptxTree(sequences);
+ return aptxTree;
}
- // testing method to be removed
- public Phylogeny buildAptxTree(SequenceI[] sequences)
+
+ public Phylogeny buildAptxTree()
{
for (SequenceI sequence : sequences)
{
- PhylogenyNode treeNode = new PhylogenyNode(sequence.getName());
- rootNode.addAsChild(treeNode);
-
+ Sequence seq = ForesterConversions
+ .createForesterSequence(sequence, true);
+ PhylogenyNode sequenceNode = new PhylogenyNode(sequence.getName());
+ NodeData nodeData = sequenceNode.getNodeData();
+ nodeData.setSequence(seq);
+
+ nodesBoundAlignment.put(sequenceNode, sequence);
+ alignmentBoundNodes.put(sequence, sequenceNode);
+ rootNode.addAsChild(sequenceNode);
}
+
aptxTree.setRoot(rootNode);
+
+ treeTitle = generateTreeName();
+ aptxTree.setName(treeTitle);
+
return aptxTree;
}
+ public Map<SequenceI, PhylogenyNode> getAlignmentBoundNodes()
+ {
+ return alignmentBoundNodes;
+ }
+ public Map<PhylogenyNode, SequenceI> getNodesBoundAlignment()
+ {
+ return nodesBoundAlignment;
+ }
+
+ private Phylogeny clusterNodes()
+ {
+ return aptxTree;
+
+ }
/**
* Formats a localised title for the tree panel, like
* <p>
*
* @return
*/
- public String generateTreeName()
+ public String generateTreeName() // Move this and add selection region to the
+ // title when applicable
{
if (treeTitle != null) // will currently never happen, loaded tree file will
// take a different path