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