JAL-2805 added getter in trees for retrieving all node sequences
[jalview.git] / src / jalview / ext / archaeopteryx / Tree.java
1 package jalview.ext.archaeopteryx;
2
3 import jalview.datamodel.SequenceI;
4 import jalview.ext.treeviewer.TreeFrameI;
5 import jalview.ext.treeviewer.TreeI;
6 import jalview.ext.treeviewer.TreeNodeI;
7
8 import java.util.Iterator;
9
10 import org.forester.archaeopteryx.Archaeopteryx;
11 import org.forester.phylogeny.Phylogeny;
12 import org.forester.phylogeny.PhylogenyMethods;
13 import org.forester.phylogeny.PhylogenyNode;
14
15 public class Tree implements TreeI
16 {
17   private final Phylogeny tree;
18
19   // alternative to static maps in TreeNode
20   // private Map<PhylogenyNode, TreeNodeI> originalNodes = new HashMap<>(500);
21   // private Map<TreeNodeI, PhylogenyNode> wrappedNodes = new HashMap<>(500);
22
23   public Tree()
24   {
25     tree = new Phylogeny();
26   }
27
28   public Tree(Phylogeny aptxTree)
29   {
30     tree = aptxTree;
31     wrapAllTreeNodes();
32
33   }
34
35   private void wrapAllTreeNodes()
36   {
37     for (Iterator<PhylogenyNode> iterator = tree
38             .iteratorPostorder(); iterator.hasNext();)
39     {
40       PhylogenyNode foresterNode = iterator.next();
41       TreeNodeI treeNode = TreeNode
42               .getUniqueWrapper(foresterNode);
43
44     }
45   }
46
47   @Override
48   public TreeNodeI getRoot()
49   {
50     TreeNodeI root = TreeNode.getUniqueWrapper(tree.getRoot());
51     return root;
52   }
53
54   @Override
55   public void setTreeName(String name)
56   {
57     tree.setName(name);
58
59   }
60
61   @Override
62   public TreeNodeI getNodeWithName(String name)
63   {
64     return TreeNode.getUniqueWrapper(tree.getNode(name));
65
66   }
67
68   @Override
69   public String[] getAllLeafNames()
70   {
71     return tree.getAllExternalNodeNames();
72   }
73
74   @Override
75   public void setRerootable(boolean b)
76   {
77     tree.setRerootable(b);
78
79   }
80
81   @Override
82   public void setRooted(boolean b)
83   {
84     tree.setRooted(b);
85
86   }
87
88   @Override
89   public boolean isEmpty()
90   {
91     return tree.isEmpty();
92   }
93
94   @Override
95   public String getTreeName()
96   {
97     return tree.getName();
98   }
99
100   @Override
101   public void setRoot(TreeNodeI rootNode)
102   {
103     PhylogenyNode treeRoot = TreeNode.unwrapNode(rootNode);
104     tree.setRoot(treeRoot);
105     wrapAllTreeNodes();
106
107   }
108
109   @Override
110   public double getHeight(boolean adjustForCollapsedSubtrees)
111   {
112     return tree.calculateHeight(adjustForCollapsedSubtrees);
113   }
114
115   @Override
116   public Iterator<TreeNodeI> iterateInPreOrder()
117   {
118     Iterator<TreeNodeI> iter = new TreeIterator(
119             tree.iteratorPreorder());
120     return iter;
121   }
122
123   @Override
124   public Iterator<TreeNodeI> iterateInLevelOrder()
125   {
126     Iterator<TreeNodeI> iter = new TreeIterator(
127             tree.iteratorLevelOrder());
128     return iter;
129   }
130
131   @Override
132   public Iterator<TreeNodeI> iterateInPostOrder()
133   {
134     Iterator<TreeNodeI> iter = new TreeIterator(
135             tree.iteratorPostorder());
136     return iter;
137   }
138
139   @Override
140   public TreeNodeI getFurthestNode()
141   {
142     PhylogenyNode furthestNode = PhylogenyMethods
143             .calculateNodeWithMaxDistanceToRoot(tree);
144     return TreeNode.getUniqueWrapper(furthestNode);
145   }
146
147   @Override
148   public TreeFrameI createTreeViewerFromTree(String instanceTitle)
149   {
150     return new AptxFrame(Archaeopteryx.createApplication(tree,
151             AptxInit.APTX_CONFIG,
152             instanceTitle));
153   }
154
155   @Override
156   public SequenceI[] getNodeSequences()
157   {
158     SequenceI[] treeSeqs = new SequenceI[tree.getNodeCount()];
159     Iterator<TreeNodeI> iter = iterateInPreOrder();
160     int i = 0;
161     while (iter.hasNext())
162     {
163       SequenceI nodeSeq = iter.next().getSequence();
164       treeSeqs[i++] = nodeSeq;
165     }
166     return treeSeqs;
167   }
168
169   @Override
170   public TreeNodeI[] getAllNodes()
171   {
172     TreeNodeI[] treeNodes = new TreeNodeI[tree.getNodeCount()];
173     Iterator<TreeNodeI> iter = iterateInPreOrder();
174     int i = 0;
175     while (iter.hasNext())
176     {
177       treeNodes[i++] = iter.next();
178     }
179     return treeNodes;
180   }
181
182 }