1 package jalview.ext.archaeopteryx;
3 import jalview.datamodel.SequenceI;
4 import jalview.ext.treeviewer.TreeFrameI;
5 import jalview.ext.treeviewer.TreeI;
6 import jalview.ext.treeviewer.TreeNodeI;
9 import java.io.IOException;
10 import java.util.ArrayList;
11 import java.util.Iterator;
12 import java.util.List;
14 import org.forester.archaeopteryx.Archaeopteryx;
15 import org.forester.io.writers.PhylogenyWriter;
16 import org.forester.phylogeny.Phylogeny;
17 import org.forester.phylogeny.PhylogenyMethods;
18 import org.forester.phylogeny.PhylogenyNode;
20 public class Tree implements TreeI
22 private final Phylogeny tree;
24 // alternative to static maps in TreeNode
25 // private Map<PhylogenyNode, TreeNodeI> originalNodes = new HashMap<>(500);
26 // private Map<TreeNodeI, PhylogenyNode> wrappedNodes = new HashMap<>(500);
30 tree = new Phylogeny();
33 public Tree(Phylogeny aptxTree)
40 private void wrapAllTreeNodes()
42 for (Iterator<PhylogenyNode> iterator = tree
43 .iteratorPostorder(); iterator.hasNext();)
45 PhylogenyNode foresterNode = iterator.next();
46 TreeNodeI treeNode = TreeNode
47 .getUniqueWrapper(foresterNode);
53 public TreeNodeI getRoot()
55 TreeNodeI root = TreeNode.getUniqueWrapper(tree.getRoot());
60 public void setTreeName(String name)
67 public TreeNodeI getNodeWithName(String name)
69 return TreeNode.getUniqueWrapper(tree.getNode(name));
74 public String[] getAllLeafNames()
76 return tree.getAllExternalNodeNames();
80 public void setRerootable(boolean b)
82 tree.setRerootable(b);
87 public void setRooted(boolean b)
94 public boolean isEmpty()
96 return tree.isEmpty();
100 public String getTreeName()
102 return tree.getName();
106 public void setRoot(TreeNodeI rootNode)
108 PhylogenyNode treeRoot = TreeNode.unwrapNode(rootNode);
109 tree.setRoot(treeRoot);
115 public double getHeight(boolean adjustForCollapsedSubtrees)
117 return tree.calculateHeight(adjustForCollapsedSubtrees);
121 public Iterator<TreeNodeI> iterateInPreOrder()
123 Iterator<TreeNodeI> iter = new TreeIterator(
124 tree.iteratorPreorder());
129 public Iterator<TreeNodeI> iterateInLevelOrder()
131 Iterator<TreeNodeI> iter = new TreeIterator(
132 tree.iteratorLevelOrder());
137 public Iterator<TreeNodeI> iterateInPostOrder()
139 Iterator<TreeNodeI> iter = new TreeIterator(
140 tree.iteratorPostorder());
145 public TreeNodeI getFurthestNode()
147 PhylogenyNode furthestNode = PhylogenyMethods
148 .calculateNodeWithMaxDistanceToRoot(tree);
149 return TreeNode.getUniqueWrapper(furthestNode);
153 public TreeFrameI createTreeViewerFromTree(String instanceTitle)
155 return new AptxFrame(Archaeopteryx.createApplication(tree,
156 AptxInit.APTX_CONFIG,
161 public List<SequenceI> getNodeSequences()
163 List<SequenceI> treeSeqs = new ArrayList<>();
164 Iterator<TreeNodeI> iter = iterateInPreOrder();
165 while (iter.hasNext())
168 SequenceI nodeSeq = iter.next().getSequence();
171 treeSeqs.add(nodeSeq);
178 public TreeNodeI[] getAllNodes()
180 TreeNodeI[] treeNodes = new TreeNodeI[tree.getNodeCount()];
181 Iterator<TreeNodeI> iter = iterateInPreOrder();
183 while (iter.hasNext())
185 treeNodes[i++] = iter.next();
191 public void writeToXml(File outputFile) throws IOException
193 PhylogenyWriter treeWriter = new PhylogenyWriter();
194 treeWriter.toPhyloXML(tree, 0, outputFile);