1 package jalview.ext.archaeopteryx;
3 import jalview.datamodel.SequenceI;
4 import jalview.ext.treeviewer.ExternalTreeNodeI;
7 import java.util.ArrayList;
8 import java.util.HashMap;
12 import org.forester.phylogeny.PhylogenyMethods;
13 import org.forester.phylogeny.PhylogenyNode;
14 import org.forester.phylogeny.data.BranchColor;
16 public class TreeNode implements ExternalTreeNodeI
18 private final PhylogenyNode node;
20 private SequenceI nodeSeq;
22 private static Map<PhylogenyNode, ExternalTreeNodeI> originalNodes = new HashMap<>(
23 500); // prolly make this size dynamic
25 private static Map<ExternalTreeNodeI, PhylogenyNode> wrappedNodes = new HashMap<>(
28 private TreeNode(PhylogenyNode aptxNode)
31 originalNodes.put(aptxNode, this);
32 wrappedNodes.put(this, aptxNode);
33 System.out.println(getId());
39 public String getNodeName()
41 return node.getName();
46 public List<ExternalTreeNodeI> getAllDescendants()
49 List<PhylogenyNode> descNodes = PhylogenyMethods
50 .getAllDescendants(node);
51 return getUniqueWrappers(descNodes);
57 public List<ExternalTreeNodeI> getExternalDescendants()
59 List<PhylogenyNode> extDescNodes = node.getAllExternalDescendants();
60 return getUniqueWrappers(extDescNodes);
65 public List<ExternalTreeNodeI> getDirectChildren()
67 List<PhylogenyNode> childNodes = node.getDescendants();
68 return getUniqueWrappers(childNodes);
76 public void setSequence(SequenceI seq)
79 org.forester.phylogeny.data.Sequence foresterFormatSeq = DataConversions
80 .createForesterSequence(seq, true);
81 node.getNodeData().setSequence(foresterFormatSeq);
86 public SequenceI getSequence()
89 // ideally this would return a converted node.getNodeData().getSequence()
93 public void addAsChild(ExternalTreeNodeI childNode)
95 PhylogenyNode aptxNode = unwrapNode(childNode);
97 node.addAsChild(aptxNode);
108 public float getXcoord()
110 return node.getXcoord();
114 public void setBranchColor(Color branchColor)
116 node.getBranchData().setBranchColor(new BranchColor(branchColor));
121 public boolean isInternal()
123 return node.isInternal();
126 public static List<ExternalTreeNodeI> getUniqueWrappers(
127 List<PhylogenyNode> aptxNodes)
129 List<ExternalTreeNodeI> wrappedNodes = new ArrayList<>(
132 for (PhylogenyNode aptxNode : aptxNodes)
134 wrappedNodes.add(getUniqueWrapper(aptxNode));
140 * This method should be used to create new wrappers as there is a possibility
141 * the Archaeopteryx node was already introduced to Jalview previously so this
142 * avoids giving one node duplicate wrappers
147 public static ExternalTreeNodeI getUniqueWrapper(
148 PhylogenyNode aptxNode)
150 ExternalTreeNodeI wrappedNode = originalNodes.get(aptxNode);
151 if (wrappedNode == null)
153 wrappedNode = new TreeNode(aptxNode);
160 * Attempts to unwrap the given node, if the unwrapped node already exists it
161 * is simply returned as is. If it is not however, the wrapper will be used to
162 * create a new Archaeopteryx node. This way it becomes possible to construct
163 * new Archaeopteryx nodes from different tree viewers, as long as they
164 * implement the interface.
169 protected static PhylogenyNode unwrapNode(ExternalTreeNodeI wrappedNode)
171 PhylogenyNode aptxNode = wrappedNodes.get(wrappedNode);
172 if (aptxNode == null)
175 aptxNode = new PhylogenyNode(wrappedNode.getNodeName());
183 public int hashCode()
185 final int prime = 31;
187 result = prime * result + ((node == null) ? 0 : node.hashCode());
192 public boolean equals(Object obj)
202 if (getClass() != obj.getClass())
206 TreeNode other = (TreeNode) obj;
209 if (other.node != null)
213 else if (getId() != other.getId())
218 else if (!node.equals(other.node))