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