From b88e65c78ea0d334aeeb3ad5c23b12b31c05f949 Mon Sep 17 00:00:00 2001 From: "cmzmasek@gmail.com" Date: Mon, 4 Jul 2011 02:33:41 +0000 Subject: [PATCH] working on issue of collapsed nodes in circular display --- .../src/org/forester/archaeopteryx/TreePanel.java | 47 +++++++++++++++----- .../src/org/forester/phylogeny/PhylogenyNode.java | 24 ++++++++++ .../iterators/ExternalForwardIterator.java | 4 +- 3 files changed, 61 insertions(+), 14 deletions(-) diff --git a/forester/java/src/org/forester/archaeopteryx/TreePanel.java b/forester/java/src/org/forester/archaeopteryx/TreePanel.java index 1f03048..086fb1a 100644 --- a/forester/java/src/org/forester/archaeopteryx/TreePanel.java +++ b/forester/java/src/org/forester/archaeopteryx/TreePanel.java @@ -145,7 +145,6 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee private final static NumberFormat FORMATTER_CONFIDENCE; private final static NumberFormat FORMATTER_BRANCH_LENGTH; private final static int WIGGLE = 2; - //private final int _half_box_size_plus_wiggle; private final static int LIMIT_FOR_HQ_RENDERING = 1000; private final static int CONFIDENCE_LEFT_MARGIN = 4; // TODO "rendering_hints" was static before. Need to make sure everything is OK with it not @@ -207,11 +206,11 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee final private static double _180_OVER_PI = 180.0 / Math.PI; private static final float ROUNDED_D = 8; private int _circ_max_depth; - private int _circ_num_ext_nodes; private PhylogenyNode _root; final private Arc2D _arc = new Arc2D.Double(); final private HashMap _urt_nodeid_angle_map = new HashMap(); final private HashMap _urt_nodeid_index_map = new HashMap(); + final private Set _collapsed_external_nodeid_set = new HashSet(); HashMap _nodeid_dist_to_leaf = new HashMap(); private AffineTransform _at; private double _max_distance_to_root = -1; @@ -692,6 +691,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee if ( !node.isExternal() && !node.isRoot() ) { final boolean collapse = !node.isCollapse(); Util.collapseSubtree( node, collapse ); + updateSetOfCollapsedExternalNodes( _phylogeny ); _phylogeny.recalculateNumberOfExternalDescendants( true ); resetNodeIdToDistToLeafMap(); calculateLongestExtNodeInfo(); @@ -709,6 +709,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee } setWaitCursor(); Util.collapseSpeciesSpecificSubtrees( _phylogeny ); + updateSetOfCollapsedExternalNodes( _phylogeny ); _phylogeny.recalculateNumberOfExternalDescendants( true ); resetNodeIdToDistToLeafMap(); calculateLongestExtNodeInfo(); @@ -2434,7 +2435,8 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee final Graphics2D g, final boolean to_pdf, final boolean to_graphics_file ) { - _circ_num_ext_nodes = phy.getNumberOfExternalNodes(); + final int circ_num_ext_nodes = phy.getNumberOfExternalNodes() - _collapsed_external_nodeid_set.size(); + System.out.println( "# collapsed external = " + _collapsed_external_nodeid_set.size() ); _root = phy.getRoot(); _root.setXcoord( center_x ); _root.setYcoord( center_y ); @@ -2443,23 +2445,44 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee int i = 0; for( final PhylogenyNodeIterator it = phy.iteratorExternalForward(); it.hasNext(); ) { final PhylogenyNode n = it.next(); - n.setXcoord( ( float ) ( center_x + ( radius * Math.cos( current_angle ) ) ) ); - n.setYcoord( ( float ) ( center_y + ( radius * Math.sin( current_angle ) ) ) ); - _urt_nodeid_angle_map.put( n.getId(), current_angle ); - _urt_nodeid_index_map.put( n.getId(), i++ ); - current_angle += ( TWO_PI / _circ_num_ext_nodes ); + if ( !n.isCollapse() ) { + n.setXcoord( ( float ) ( center_x + ( radius * Math.cos( current_angle ) ) ) ); + n.setYcoord( ( float ) ( center_y + ( radius * Math.sin( current_angle ) ) ) ); + _urt_nodeid_angle_map.put( n.getId(), current_angle ); + _urt_nodeid_index_map.put( n.getId(), i++ ); + current_angle += ( TWO_PI / circ_num_ext_nodes ); + } + else { + //TODO remove me + System.out.println( "is collapse" + n.getName() ); + } } paintCirculars( phy.getRoot(), phy, center_x, center_y, radius, radial_labels, g, to_pdf, to_graphics_file ); paintNodeBox( _root.getXcoord(), _root.getYcoord(), _root, g, to_pdf, to_graphics_file, isInFoundNodes( _root ) ); } + private void updateSetOfCollapsedExternalNodes( final Phylogeny phy ) { + _collapsed_external_nodeid_set.clear(); + E: for( final PhylogenyNodeIterator it = phy.iteratorExternalForward(); it.hasNext(); ) { + final PhylogenyNode ext_node = it.next(); + PhylogenyNode n = ext_node; + while ( !n.isRoot() ) { + if ( n.isCollapse() ) { + _collapsed_external_nodeid_set.add( ext_node.getId() ); + continue E; + } + n = n.getParent(); + } + } + } + final void paintCircularLite( final Phylogeny phy, final double starting_angle, final int center_x, final int center_y, final int radius, final Graphics2D g ) { - _circ_num_ext_nodes = phy.getNumberOfExternalNodes(); + final int circ_num_ext_nodes = phy.getNumberOfExternalNodes(); _root = phy.getRoot(); _root.setXSecondary( center_x ); _root.setYSecondary( center_y ); @@ -2469,7 +2492,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee n.setXSecondary( ( float ) ( center_x + radius * Math.cos( current_angle ) ) ); n.setYSecondary( ( float ) ( center_y + radius * Math.sin( current_angle ) ) ); _urt_nodeid_angle_map.put( n.getId(), current_angle ); - current_angle += ( TWO_PI / _circ_num_ext_nodes ); + current_angle += ( TWO_PI / circ_num_ext_nodes ); } paintCircularsLite( phy.getRoot(), phy, center_x, center_y, radius, g ); } @@ -2483,9 +2506,9 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee final Graphics2D g, final boolean to_pdf, final boolean to_graphics_file ) { - if ( n.isExternal() ) { + if ( n.isExternal() || n.isCollapse() ) { //~~circ collapse if ( !_urt_nodeid_angle_map.containsKey( n.getId() ) ) { - System.out.println( "no " + n + ", ERROR!" );//TODO + System.out.println( "no " + n + " =====>>>>>>> ERROR!" );//TODO } return _urt_nodeid_angle_map.get( n.getId() ); } diff --git a/forester/java/src/org/forester/phylogeny/PhylogenyNode.java b/forester/java/src/org/forester/phylogeny/PhylogenyNode.java index 9a493bb..c341108 100644 --- a/forester/java/src/org/forester/phylogeny/PhylogenyNode.java +++ b/forester/java/src/org/forester/phylogeny/PhylogenyNode.java @@ -411,6 +411,30 @@ public class PhylogenyNode implements PhylogenyNodeI, Comparable return current_node; } + public final PhylogenyNode getNextExternalNodeWhileTakingIntoAccountCollapsedNodes() { + //TODO work on me ~~ + if ( isInternal() ) { + throw new UnsupportedOperationException( "attempt to get next external node of an internal node" ); + } + else if ( isLastExternalNode() ) { + return null; + } + int index = getChildNodeIndex(); + PhylogenyNode previous_node = this; + PhylogenyNode current_node = getParent(); + while ( !current_node.isRoot() + && ( ( current_node.getNumberOfDescendants() == 1 ) || previous_node.isLastChildNode() ) ) { + index = current_node.getChildNodeIndex(); + previous_node = current_node; + current_node = current_node.getParent(); + } + current_node = current_node.getChildNode( index + 1 ); + while ( current_node.isInternal() ) { + current_node = current_node.getFirstChildNode(); + } + return current_node; + } + public final NodeData getNodeData() { if ( _node_data == null ) { _node_data = new NodeData(); diff --git a/forester/java/src/org/forester/phylogeny/iterators/ExternalForwardIterator.java b/forester/java/src/org/forester/phylogeny/iterators/ExternalForwardIterator.java index bf68269..4d4a602 100644 --- a/forester/java/src/org/forester/phylogeny/iterators/ExternalForwardIterator.java +++ b/forester/java/src/org/forester/phylogeny/iterators/ExternalForwardIterator.java @@ -47,7 +47,7 @@ public class ExternalForwardIterator implements PhylogenyNodeIterator { */ public ExternalForwardIterator( final Phylogeny phylogeny ) throws IllegalArgumentException { if ( phylogeny.isEmpty() ) { - throw new IllegalArgumentException( "Attempt to use ExternalForwardIterator on an empty phylogeny." ); + throw new IllegalArgumentException( "attempt to use ExternalForwardIterator on an empty phylogeny" ); } PhylogenyNode n = phylogeny.getRoot(); while ( !n.isExternal() ) { @@ -88,7 +88,7 @@ public class ExternalForwardIterator implements PhylogenyNodeIterator { @Override public PhylogenyNode next() throws NoSuchElementException { if ( !hasNext() ) { - throw new NoSuchElementException( "Attempt to call \"next()\" on iterator which has no more next elements." ); + throw new NoSuchElementException( "attempt to call \"next()\" on iterator which has no more next elements" ); } final PhylogenyNode n = getCurrentNode(); if ( n == getLastExtNode() ) { -- 1.7.10.2