cleanup
[jalview.git] / forester / java / src / org / forester / archaeopteryx / TreePanel.java
index 3ad3935..7301784 100644 (file)
@@ -76,11 +76,8 @@ import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Hashtable;
 import java.util.List;
-import java.util.Map.Entry;
 import java.util.Set;
-import java.util.SortedMap;
 import java.util.SortedSet;
-import java.util.TreeMap;
 
 import javax.swing.BorderFactory;
 import javax.swing.JApplet;
@@ -109,6 +106,7 @@ import org.forester.phylogeny.Phylogeny;
 import org.forester.phylogeny.PhylogenyMethods;
 import org.forester.phylogeny.PhylogenyMethods.DESCENDANT_SORT_PRIORITY;
 import org.forester.phylogeny.PhylogenyNode;
+import org.forester.phylogeny.data.Accession;
 import org.forester.phylogeny.data.Annotation;
 import org.forester.phylogeny.data.BranchColor;
 import org.forester.phylogeny.data.Confidence;
@@ -130,123 +128,125 @@ import org.forester.util.BasicDescriptiveStatistics;
 import org.forester.util.DescriptiveStatistics;
 import org.forester.util.ForesterConstants;
 import org.forester.util.ForesterUtil;
-import org.forester.util.SequenceIdParser;
+import org.forester.util.SequenceAccessionTools;
+import org.forester.util.TaxonomyUtil;
 
 public final class TreePanel extends JPanel implements ActionListener, MouseWheelListener, Printable {
 
-    private static final BasicStroke     STROKE_2                                           = new BasicStroke( 2f );
-    private static final BasicStroke     STROKE_1                                           = new BasicStroke( 1f );
-    private static final BasicStroke     STROKE_075                                         = new BasicStroke( 0.75f );
-    private static final BasicStroke     STROKE_05                                          = new BasicStroke( 0.5f );
-    private static final BasicStroke     STROKE_025                                         = new BasicStroke( 0.25f );
-    private static final BasicStroke     STROKE_01                                          = new BasicStroke( 0.1f );
-    private static final BasicStroke     STROKE_005                                         = new BasicStroke( 0.05f );
-    private static final float           PI                                                 = ( float ) ( Math.PI );
-    private static final double          TWO_PI                                             = 2 * Math.PI;
-    private static final float           ONEHALF_PI                                         = ( float ) ( 1.5 * Math.PI );
-    private static final float           HALF_PI                                            = ( float ) ( Math.PI / 2.0 );
-    private static final float           ANGLE_ROTATION_UNIT                                = ( float ) ( Math.PI / 32 );
-    private static final short           OV_BORDER                                          = 10;
-    final static Cursor                  CUT_CURSOR                                         = Cursor.getPredefinedCursor( Cursor.CROSSHAIR_CURSOR );
-    final static Cursor                  MOVE_CURSOR                                        = Cursor.getPredefinedCursor( Cursor.MOVE_CURSOR );
     final static Cursor                  ARROW_CURSOR                                       = Cursor.getPredefinedCursor( Cursor.DEFAULT_CURSOR );
+    final static Cursor                  CUT_CURSOR                                         = Cursor.getPredefinedCursor( Cursor.CROSSHAIR_CURSOR );
     final static Cursor                  HAND_CURSOR                                        = Cursor.getPredefinedCursor( Cursor.HAND_CURSOR );
+    final static Cursor                  MOVE_CURSOR                                        = Cursor.getPredefinedCursor( Cursor.MOVE_CURSOR );
     final static Cursor                  WAIT_CURSOR                                        = Cursor.getPredefinedCursor( Cursor.WAIT_CURSOR );
-    private final static long            serialVersionUID                                   = -978349745916505029L;
+    final private static double          _180_OVER_PI                                       = 180.0 / Math.PI;
+    private static final float           ANGLE_ROTATION_UNIT                                = ( float ) ( Math.PI / 32 );
+    private final static int             CONFIDENCE_LEFT_MARGIN                             = 4;
     private final static int             EURO_D                                             = 10;
-    private final static String          NODE_POPMENU_NODE_CLIENT_PROPERTY                  = "node";
-    private final static int             MIN_ROOT_LENGTH                                    = 3;
-    private final static int             MAX_SUBTREES                                       = 100;
+    private final static NumberFormat    FORMATTER_BRANCH_LENGTH;
+    private final static NumberFormat    FORMATTER_CONFIDENCE;
+    private static final float           HALF_PI                                            = ( float ) ( Math.PI / 2.0 );
+    private final static int             LIMIT_FOR_HQ_RENDERING                             = 2000;
     private final static int             MAX_NODE_FRAMES                                    = 10;
+    private final static int             MAX_SUBTREES                                       = 100;
+    private final static int             MIN_ROOT_LENGTH                                    = 3;
     private final static int             MOVE                                               = 20;
-    private final static NumberFormat    FORMATTER_CONFIDENCE;
-    private final static NumberFormat    FORMATTER_BRANCH_LENGTH;
+    private final static String          NODE_POPMENU_NODE_CLIENT_PROPERTY                  = "node";
+    private static final float           ONEHALF_PI                                         = ( float ) ( 1.5 * Math.PI );
+    private static final short           OV_BORDER                                          = 10;
+    private static final float           PI                                                 = ( float ) ( Math.PI );
+    final private static Font            POPUP_FONT                                         = new Font( Configuration.getDefaultFontFamilyName(),
+                                                                                                        Font.PLAIN,
+                                                                                                        12 );
+    private static final float           ROUNDED_D                                          = 8;
+    private final static long            serialVersionUID                                   = -978349745916505029L;
+    private static final BasicStroke     STROKE_005                                         = new BasicStroke( 0.05f );
+    private static final BasicStroke     STROKE_01                                          = new BasicStroke( 0.1f );
+    private static final BasicStroke     STROKE_025                                         = new BasicStroke( 0.25f );
+    private static final BasicStroke     STROKE_05                                          = new BasicStroke( 0.5f );
+    private static final BasicStroke     STROKE_075                                         = new BasicStroke( 0.75f );
+    private static final BasicStroke     STROKE_1                                           = new BasicStroke( 1f );
+    private static final BasicStroke     STROKE_2                                           = new BasicStroke( 2f );
+    private static final double          TWO_PI                                             = 2 * Math.PI;
     private final static int             WIGGLE                                             = 2;
-    private final static int             LIMIT_FOR_HQ_RENDERING                             = 2000;
-    private final static int             CONFIDENCE_LEFT_MARGIN                             = 4;
-    private final RenderingHints         _rendering_hints                                   = new RenderingHints( RenderingHints.KEY_RENDERING,
-                                                                                                                  RenderingHints.VALUE_RENDER_DEFAULT );
-    private File                         _treefile                                          = null;
+    HashMap<Long, Short>                 _nodeid_dist_to_leaf                               = new HashMap<Long, Short>();
+    final private Arc2D                  _arc                                               = new Arc2D.Double();
+    private AffineTransform              _at;
+    private int                          _circ_max_depth;
+    final private Set<Long>              _collapsed_external_nodeid_set                     = new HashSet<Long>();
+    private JColorChooser                _color_chooser                                     = null;
     private Configuration                _configuration                                     = null;
-    private final NodeFrame[]            _node_frames                                       = new NodeFrame[ TreePanel.MAX_NODE_FRAMES ];
-    private int                          _node_frame_index                                  = 0;
-    private Phylogeny                    _phylogeny                                         = null;
-    private final Phylogeny[]            _sub_phylogenies                                   = new Phylogeny[ TreePanel.MAX_SUBTREES ];
-    private final PhylogenyNode[]        _sub_phylogenies_temp_roots                        = new PhylogenyNode[ TreePanel.MAX_SUBTREES ];
-    private int                          _subtree_index                                     = 0;
-    private MainPanel                    _main_panel                                        = null;
-    private Set<Long>                    _found_nodes                                       = null;
-    private PhylogenyNode                _highlight_node                                    = null;
-    private JPopupMenu                   _node_popup_menu                                   = null;
-    private JMenuItem                    _node_popup_menu_items[]                           = null;
-    private int                          _longest_ext_node_info                             = 0;
-    private float                        _x_correction_factor                               = 0.0f;
-    private float                        _ov_x_correction_factor                            = 0.0f;
-    private float                        _x_distance                                        = 0.0f;
-    private float                        _y_distance                                        = 0.0f;
-    private PHYLOGENY_GRAPHICS_TYPE      _graphics_type                                     = PHYLOGENY_GRAPHICS_TYPE.RECTANGULAR;
-    private double                       _domain_structure_width                            = Constants.DOMAIN_STRUCTURE_DEFAULT_WIDTH;
+    private ControlPanel                 _control_panel                                     = null;
+    private final CubicCurve2D           _cubic_curve                                       = new CubicCurve2D.Float();
+    private Set<Long>                    _current_external_nodes                            = null;
+    private StringBuilder                _current_external_nodes_data_buffer                = new StringBuilder();
+    private int                          _current_external_nodes_data_buffer_change_counter = 0;
     private int                          _domain_structure_e_value_thr_exp                  = Constants.DOMAIN_STRUCTURE_E_VALUE_THR_DEFAULT_EXP;
+    private double                       _domain_structure_width                            = Constants.DOMAIN_STRUCTURE_DEFAULT_WIDTH;
+    private int                          _dynamic_hiding_factor                             = 0;
+    private boolean                      _edited                                            = false;
+    private final Ellipse2D              _ellipse                                           = new Ellipse2D.Float();
+    private int                          _external_node_index                               = 0;
+    private Set<Long>                    _found_nodes_0                                     = null;
+    private Set<Long>                    _found_nodes_1                                     = null;
+    private final FontRenderContext      _frc                                               = new FontRenderContext( null,
+                                                                                                                     false,
+                                                                                                                     false );
+    private PHYLOGENY_GRAPHICS_TYPE      _graphics_type                                     = PHYLOGENY_GRAPHICS_TYPE.RECTANGULAR;
+    private PhylogenyNode                _highlight_node                                    = null;
+    private boolean                      _in_ov                                             = false;
+    private boolean                      _in_ov_rect                                        = false;
     private float                        _last_drag_point_x                                 = 0;
     private float                        _last_drag_point_y                                 = 0;
-    private ControlPanel                 _control_panel                                     = null;
-    private int                          _external_node_index                               = 0;
-    private final Path2D.Float           _polygon                                           = new Path2D.Float();
-    private final StringBuilder          _sb                                                = new StringBuilder();
-    private JColorChooser                _color_chooser                                     = null;
-    private double                       _scale_distance                                    = 0.0;
-    private String                       _scale_label                                       = null;
-    private final CubicCurve2D           _cubic_curve                                       = new CubicCurve2D.Float();
-    private final QuadCurve2D            _quad_curve                                        = new QuadCurve2D.Float();
     private final Line2D                 _line                                              = new Line2D.Float();
-    private final Ellipse2D              _ellipse                                           = new Ellipse2D.Float();
-    private final Rectangle2D            _rectangle                                         = new Rectangle2D.Float();
+    private int                          _longest_ext_node_info                             = 0;
+    private MainPanel                    _main_panel                                        = null;
+    private double                       _max_distance_to_root                              = -1;
+    private Popup                        _node_desc_popup;
+    private int                          _node_frame_index                                  = 0;
+    private final NodeFrame[]            _node_frames                                       = new NodeFrame[ TreePanel.MAX_NODE_FRAMES ];
+    private JPopupMenu                   _node_popup_menu                                   = null;
+    private JMenuItem                    _node_popup_menu_items[]                           = null;
+    private PhylogenyNode[]              _nodes_in_preorder                                 = null;
     private Options                      _options                                           = null;
-    private float                        _ov_max_width                                      = 0;
     private float                        _ov_max_height                                     = 0;
+    private float                        _ov_max_width                                      = 0;
+    private boolean                      _ov_on                                             = false;
+    private final Rectangle2D            _ov_rectangle                                      = new Rectangle2D.Float();
+    private final Rectangle              _ov_virtual_rectangle                              = new Rectangle();
+    private float                        _ov_x_correction_factor                            = 0.0f;
+    private float                        _ov_x_distance                                     = 0;
     private int                          _ov_x_position                                     = 0;
+    private float                        _ov_y_distance                                     = 0;
     private int                          _ov_y_position                                     = 0;
     private int                          _ov_y_start                                        = 0;
-    private float                        _ov_y_distance                                     = 0;
-    private float                        _ov_x_distance                                     = 0;
-    private boolean                      _ov_on                                             = false;
-    private double                       _urt_starting_angle                                = ( float ) ( Math.PI / 2 );
-    private float                        _urt_factor                                        = 1;
-    private float                        _urt_factor_ov                                     = 1;
     private final boolean                _phy_has_branch_lengths;
-    private final Rectangle2D            _ov_rectangle                                      = new Rectangle2D.Float();
-    private boolean                      _in_ov_rect                                        = false;
-    private boolean                      _in_ov                                             = false;
-    private final Rectangle              _ov_virtual_rectangle                              = new Rectangle();
-    final private static double          _180_OVER_PI                                       = 180.0 / Math.PI;
-    private static final float           ROUNDED_D                                          = 8;
-    private int                          _circ_max_depth;
-    private PhylogenyNode                _root;
-    final private Arc2D                  _arc                                               = new Arc2D.Double();
-    final private HashMap<Long, Double>  _urt_nodeid_angle_map                              = new HashMap<Long, Double>();
-    final private HashMap<Long, Integer> _urt_nodeid_index_map                              = new HashMap<Long, Integer>();
-    final private Set<Long>              _collapsed_external_nodeid_set                     = new HashSet<Long>();
-    HashMap<Long, Short>                 _nodeid_dist_to_leaf                               = new HashMap<Long, Short>();
-    private AffineTransform              _at;
-    private double                       _max_distance_to_root                              = -1;
-    private int                          _dynamic_hiding_factor                             = 0;
-    private boolean                      _edited                                            = false;
-    private Popup                        _node_desc_popup;
-    private JTextArea                    _rollover_popup;
+    private Phylogeny                    _phylogeny                                         = null;
+    private final Path2D.Float           _polygon                                           = new Path2D.Float();
     private final StringBuffer           _popup_buffer                                      = new StringBuffer();
-    final private static Font            POPUP_FONT                                         = new Font( Configuration.getDefaultFontFamilyName(),
-                                                                                                        Font.PLAIN,
-                                                                                                        12 );
+    private final QuadCurve2D            _quad_curve                                        = new QuadCurve2D.Float();
     private Sequence                     _query_sequence                                    = null;
-    private final FontRenderContext      _frc                                               = new FontRenderContext( null,
-                                                                                                                     false,
-                                                                                                                     false );
+    private final Rectangle2D            _rectangle                                         = new Rectangle2D.Float();
+    private final RenderingHints         _rendering_hints                                   = new RenderingHints( RenderingHints.KEY_RENDERING,
+                                                                                                                  RenderingHints.VALUE_RENDER_DEFAULT );
+    private JTextArea                    _rollover_popup;
+    private PhylogenyNode                _root;
+    private final StringBuilder          _sb                                                = new StringBuilder();
+    private double                       _scale_distance                                    = 0.0;
+    private String                       _scale_label                                       = null;
     // expression values menu:
     private DescriptiveStatistics        _statistics_for_vector_data;
-    private PhylogenyNode[]              _nodes_in_preorder                                 = null;
-    private StringBuilder                _current_external_nodes_data_buffer                = new StringBuilder();
-    private int                          _current_external_nodes_data_buffer_change_counter = 0;
-    private Set<Long>                    _current_external_nodes                            = null;
+    private final Phylogeny[]            _sub_phylogenies                                   = new Phylogeny[ TreePanel.MAX_SUBTREES ];
+    private final PhylogenyNode[]        _sub_phylogenies_temp_roots                        = new PhylogenyNode[ TreePanel.MAX_SUBTREES ];
+    private int                          _subtree_index                                     = 0;
+    private File                         _treefile                                          = null;
+    private float                        _urt_factor                                        = 1;
+    private float                        _urt_factor_ov                                     = 1;
+    final private HashMap<Long, Double>  _urt_nodeid_angle_map                              = new HashMap<Long, Double>();
+    final private HashMap<Long, Integer> _urt_nodeid_index_map                              = new HashMap<Long, Integer>();
+    private double                       _urt_starting_angle                                = ( float ) ( Math.PI / 2 );
+    private float                        _x_correction_factor                               = 0.0f;
+    private float                        _x_distance                                        = 0.0f;
+    private float                        _y_distance                                        = 0.0f;
     //  private Image                           offscreenImage;
     //  private Graphics                        offscreenGraphics;
     //  private Dimension                       offscreenDimension;
@@ -610,13 +610,18 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                             .getValue()
                             + " " );
                 }
-                if ( getControlPanel().isShowGeneNames() && ( node.getNodeData().getSequence().getName().length() > 0 ) ) {
+                if ( getControlPanel().isShowSeqNames() && ( node.getNodeData().getSequence().getName().length() > 0 ) ) {
                     sum += getTreeFontSet()._fm_large.stringWidth( node.getNodeData().getSequence().getName() + " " );
                 }
-                if ( getControlPanel().isShowGeneSymbols()
+                if ( getControlPanel().isShowSeqSymbols()
                         && ( node.getNodeData().getSequence().getSymbol().length() > 0 ) ) {
                     sum += getTreeFontSet()._fm_large.stringWidth( node.getNodeData().getSequence().getSymbol() + " " );
                 }
+                if ( getControlPanel().isShowGeneNames()
+                        && ( node.getNodeData().getSequence().getGeneName().length() > 0 ) ) {
+                    sum += getTreeFontSet()._fm_large
+                            .stringWidth( node.getNodeData().getSequence().getGeneName() + " " );
+                }
                 if ( getControlPanel().isShowAnnotation()
                         && ( node.getNodeData().getSequence().getAnnotations() != null )
                         && !node.getNodeData().getSequence().getAnnotations().isEmpty() ) {
@@ -699,27 +704,48 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
     }
 
     final Color calculateTaxonomyBasedColor( final Taxonomy tax ) {
-        if ( ForesterUtil.isEmpty( tax.getTaxonomyCode() ) && ForesterUtil.isEmpty( tax.getScientificName() ) ) {
+        if ( getOptions().isColorByTaxonomicGroup() ) {
+            if ( !ForesterUtil.isEmpty( tax.getTaxonomyCode() ) ) {
+                boolean ex = false;
+                String group = null;
+                try {
+                    group = TaxonomyUtil.getTaxGroupByTaxCode( tax.getTaxonomyCode() );
+                }
+                catch ( final Exception e ) {
+                    ex = true;
+                }
+                if ( !ex && !ForesterUtil.isEmpty( group ) ) {
+                    final Color c = ForesterUtil.obtainColorDependingOnTaxonomyGroup( group );
+                    if ( c != null ) {
+                        return c;
+                    }
+                }
+            }
             return getTreeColorSet().getTaxonomyColor();
         }
-        Color c = null;
-        if ( !ForesterUtil.isEmpty( tax.getTaxonomyCode() ) ) {
-            c = getControlPanel().getSpeciesColors().get( tax.getTaxonomyCode() );
-        }
-        if ( ( c == null ) && !ForesterUtil.isEmpty( tax.getScientificName() ) ) {
-            c = getControlPanel().getSpeciesColors().get( tax.getScientificName() );
-        }
-        if ( c == null ) {
+        else {
+            if ( ForesterUtil.isEmpty( tax.getTaxonomyCode() ) && ForesterUtil.isEmpty( tax.getScientificName() ) ) {
+                return getTreeColorSet().getTaxonomyColor();
+            }
+            Color c = null;
             if ( !ForesterUtil.isEmpty( tax.getTaxonomyCode() ) ) {
-                c = TreePanelUtil.calculateColorFromString( tax.getTaxonomyCode(), true );
-                getControlPanel().getSpeciesColors().put( tax.getTaxonomyCode(), c );
+                c = getControlPanel().getSpeciesColors().get( tax.getTaxonomyCode() );
             }
-            else {
-                c = TreePanelUtil.calculateColorFromString( tax.getScientificName(), true );
-                getControlPanel().getSpeciesColors().put( tax.getScientificName(), c );
+            if ( ( c == null ) && !ForesterUtil.isEmpty( tax.getScientificName() ) ) {
+                c = getControlPanel().getSpeciesColors().get( tax.getScientificName() );
+            }
+            if ( c == null ) {
+                if ( !ForesterUtil.isEmpty( tax.getTaxonomyCode() ) ) {
+                    c = TreePanelUtil.calculateColorFromString( tax.getTaxonomyCode(), true );
+                    getControlPanel().getSpeciesColors().put( tax.getTaxonomyCode(), c );
+                }
+                else {
+                    c = TreePanelUtil.calculateColorFromString( tax.getScientificName(), true );
+                    getControlPanel().getSpeciesColors().put( tax.getScientificName(), c );
+                }
             }
+            return c;
         }
-        return c;
     }
 
     void checkForVectorProperties( final Phylogeny phy ) {
@@ -944,8 +970,12 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         return _domain_structure_e_value_thr_exp;
     }
 
-    final Set<Long> getFoundNodes() {
-        return _found_nodes;
+    final Set<Long> getFoundNodes0() {
+        return _found_nodes_0;
+    }
+
+    final Set<Long> getFoundNodes1() {
+        return _found_nodes_1;
     }
 
     final Color getGraphicsForNodeBoxWithColorForParentBranch( final PhylogenyNode node ) {
@@ -1200,10 +1230,10 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                 // Check if shift key is down
                 if ( ( e.getModifiers() & InputEvent.SHIFT_MASK ) != 0 ) {
                     // Yes, so add to _found_nodes
-                    if ( getFoundNodes() == null ) {
-                        setFoundNodes( new HashSet<Long>() );
+                    if ( getFoundNodes0() == null ) {
+                        setFoundNodes0( new HashSet<Long>() );
                     }
-                    getFoundNodes().add( node.getId() );
+                    getFoundNodes0().add( node.getId() );
                     // Check if control key is down
                 }
                 else if ( ( e.getModifiers() & InputEvent.CTRL_MASK ) != 0 ) {
@@ -1401,10 +1431,10 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                   root_x + ( Math.cos( angle ) * parent_radius ),
                   root_y + ( Math.sin( angle ) * parent_radius ),
                   g );
-        paintNodeBox( c.getXcoord(), c.getYcoord(), c, g, to_pdf, to_graphics_file, isInFoundNodes( c )
-                || isInCurrentExternalNodes( c ) );
+        paintNodeBox( c.getXcoord(), c.getYcoord(), c, g, to_pdf, to_graphics_file );
         if ( c.isExternal() ) {
-            final boolean is_in_found_nodes = isInFoundNodes( c ) || isInCurrentExternalNodes( c );
+            final boolean is_in_found_nodes = isInFoundNodes0( c ) || isInFoundNodes1( c )
+                    || isInCurrentExternalNodes( c );
             if ( ( _dynamic_hiding_factor > 1 ) && !is_in_found_nodes
                     && ( ( _urt_nodeid_index_map.get( c.getId() ) % _dynamic_hiding_factor ) != 1 ) ) {
                 return;
@@ -1431,8 +1461,16 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                   root_x + ( Math.cos( angle ) * parent_radius ),
                   root_y + ( Math.sin( angle ) * parent_radius ),
                   g );
-        if ( isInFoundNodes( c ) || isInCurrentExternalNodes( c ) ) {
-            g.setColor( getTreeColorSet().getFoundColor() );
+        if ( ( isInFoundNodes0( c ) && !isInFoundNodes1( c ) ) || isInCurrentExternalNodes( c ) ) {
+            g.setColor( getTreeColorSet().getFoundColor0() );
+            drawRectFilled( c.getXSecondary() - 1, c.getYSecondary() - 1, 3, 3, g );
+        }
+        else if ( ( isInFoundNodes1( c ) && !isInFoundNodes0( c ) ) ) {
+            g.setColor( getTreeColorSet().getFoundColor1() );
+            drawRectFilled( c.getXSecondary() - 1, c.getYSecondary() - 1, 3, 3, g );
+        }
+        else if ( isInFoundNodes0( c ) && isInFoundNodes1( c ) ) {
+            g.setColor( getTreeColorSet().getFoundColor0and1() );
             drawRectFilled( c.getXSecondary() - 1, c.getYSecondary() - 1, 3, 3, g );
         }
     }
@@ -1468,7 +1506,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
             }
         }
         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 ) );
+        paintNodeBox( _root.getXcoord(), _root.getYcoord(), _root, g, to_pdf, to_graphics_file );
     }
 
     final void paintCircularLite( final Phylogeny phy,
@@ -1789,22 +1827,22 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
     }
 
     final void selectNode( final PhylogenyNode node ) {
-        if ( ( getFoundNodes() != null ) && getFoundNodes().contains( node.getId() ) ) {
-            getFoundNodes().remove( node.getId() );
-            getControlPanel().setSearchFoundCountsOnLabel( getFoundNodes().size() );
-            if ( getFoundNodes().size() < 1 ) {
-                getControlPanel().searchReset();
+        if ( ( getFoundNodes0() != null ) && getFoundNodes0().contains( node.getId() ) ) {
+            getFoundNodes0().remove( node.getId() );
+            getControlPanel().setSearchFoundCountsOnLabel0( getFoundNodes0().size() );
+            if ( getFoundNodes0().size() < 1 ) {
+                getControlPanel().searchReset0();
             }
         }
         else {
-            getControlPanel().getSearchFoundCountsLabel().setVisible( true );
-            getControlPanel().getSearchResetButton().setEnabled( true );
-            getControlPanel().getSearchResetButton().setVisible( true );
-            if ( getFoundNodes() == null ) {
-                setFoundNodes( new HashSet<Long>() );
+            getControlPanel().getSearchFoundCountsLabel0().setVisible( true );
+            getControlPanel().getSearchResetButton0().setEnabled( true );
+            getControlPanel().getSearchResetButton0().setVisible( true );
+            if ( getFoundNodes0() == null ) {
+                setFoundNodes0( new HashSet<Long>() );
             }
-            getFoundNodes().add( node.getId() );
-            getControlPanel().setSearchFoundCountsOnLabel( getFoundNodes().size() );
+            getFoundNodes0().add( node.getId() );
+            getControlPanel().setSearchFoundCountsOnLabel0( getFoundNodes0().size() );
         }
     }
 
@@ -1822,8 +1860,12 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         _current_external_nodes_data_buffer = sb;
     }
 
-    final void setFoundNodes( final Set<Long> found_nodes ) {
-        _found_nodes = found_nodes;
+    final void setFoundNodes0( final Set<Long> found_nodes ) {
+        _found_nodes_0 = found_nodes;
+    }
+
+    final void setFoundNodes1( final Set<Long> found_nodes ) {
+        _found_nodes_1 = found_nodes;
     }
 
     final void setInOvRect( final boolean in_ov_rect ) {
@@ -1928,8 +1970,8 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
             DESCENDANT_SORT_PRIORITY pri = DESCENDANT_SORT_PRIORITY.TAXONOMY;
             if ( ( !getControlPanel().isShowTaxonomyScientificNames() && !getControlPanel().isShowTaxonomyCode() && !getControlPanel()
                     .isShowTaxonomyCommonNames() ) ) {
-                if ( ( getControlPanel().isShowSequenceAcc() || getControlPanel().isShowGeneNames() || getControlPanel()
-                        .isShowGeneSymbols() ) ) {
+                if ( ( getControlPanel().isShowSequenceAcc() || getControlPanel().isShowSeqNames() || getControlPanel()
+                        .isShowSeqSymbols() ) ) {
                     pri = DESCENDANT_SORT_PRIORITY.SEQUENCE;
                 }
                 else if ( getControlPanel().isShowNodeNames() ) {
@@ -2224,7 +2266,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                 && ( getCopiedAndPastedNodes() != null )
                 && !to_pdf
                 && !to_graphics_file && getCopiedAndPastedNodes().contains( node.getId() ) ) {
-            g.setColor( getTreeColorSet().getFoundColor() );
+            g.setColor( getTreeColorSet().getFoundColor0() );
         }
         else if ( getControlPanel().isColorBranches() && ( PhylogenyMethods.getBranchColorValue( node ) != null ) ) {
             g.setColor( PhylogenyMethods.getBranchColorValue( node ) );
@@ -2270,7 +2312,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                     }
                 }
                 if ( type == '?' ) {
-                    if ( SequenceIdParser.isProtein( query ) ) {
+                    if ( SequenceAccessionTools.isProteinDbQuery( query ) ) {
                         type = 'p';
                     }
                     else {
@@ -2403,11 +2445,8 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         }
         _color_chooser.setPreviewPanel( new JPanel() );
         SubtreeColorizationActionListener al;
-        if ( ( getFoundNodes() != null ) && !getFoundNodes().isEmpty() ) {
-            final List<PhylogenyNode> additional_nodes = new ArrayList<PhylogenyNode>();
-            for( final Long id : getFoundNodes() ) {
-                additional_nodes.add( _phylogeny.getNode( id ) );
-            }
+        if ( ( getFoundNodes0() != null ) && !getFoundNodes0().isEmpty() ) {
+            final List<PhylogenyNode> additional_nodes = getFoundNodes0AsListOfPhylogenyNodes();
             al = new SubtreeColorizationActionListener( _color_chooser, node, additional_nodes );
         }
         else {
@@ -2703,6 +2742,21 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                                        JOptionPane.ERROR_MESSAGE );
     }
 
+    private final Color getColorForFoundNode( final PhylogenyNode n ) {
+        if ( isInCurrentExternalNodes( n ) ) {
+            return getTreeColorSet().getFoundColor0();
+        }
+        else if ( isInFoundNodes0( n ) && !isInFoundNodes1( n ) ) {
+            return getTreeColorSet().getFoundColor0();
+        }
+        else if ( !isInFoundNodes0( n ) && isInFoundNodes1( n ) ) {
+            return getTreeColorSet().getFoundColor1();
+        }
+        else {
+            return getTreeColorSet().getFoundColor0and1();
+        }
+    }
+
     final private Set<Long> getCopiedAndPastedNodes() {
         return getMainPanel().getCopiedAndPastedNodes();
     }
@@ -2715,6 +2769,22 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         return getMainPanel().getCutOrCopiedTree();
     }
 
+    private List<PhylogenyNode> getFoundNodes0AsListOfPhylogenyNodes() {
+        final List<PhylogenyNode> additional_nodes = new ArrayList<PhylogenyNode>();
+        for( final Long id : getFoundNodes0() ) {
+            additional_nodes.add( _phylogeny.getNode( id ) );
+        }
+        return additional_nodes;
+    }
+
+    private List<PhylogenyNode> getFoundNodes1AsListOfPhylogenyNodes() {
+        final List<PhylogenyNode> additional_nodes = new ArrayList<PhylogenyNode>();
+        for( final Long id : getFoundNodes1() ) {
+            additional_nodes.add( _phylogeny.getNode( id ) );
+        }
+        return additional_nodes;
+    }
+
     final private float getLastDragPointX() {
         return _last_drag_point_x;
     }
@@ -2773,6 +2843,22 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         return _ov_y_start;
     }
 
+    final private List<Accession> getPdbAccs( final PhylogenyNode node ) {
+        final List<Accession> pdb_ids = new ArrayList<Accession>();
+        if ( node.getNodeData().isHasSequence() ) {
+            final Sequence seq = node.getNodeData().getSequence();
+            if ( !ForesterUtil.isEmpty( seq.getCrossReferences() ) ) {
+                final SortedSet<Accession> cross_refs = seq.getCrossReferences();
+                for( final Accession acc : cross_refs ) {
+                    if ( acc.getSource().equalsIgnoreCase( "pdb" ) ) {
+                        pdb_ids.add( acc );
+                    }
+                }
+            }
+        }
+        return pdb_ids;
+    }
+
     final private double getScaleDistance() {
         return _scale_distance;
     }
@@ -2822,6 +2908,9 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
             case OPEN_TAX_WEB:
                 openTaxWeb( node );
                 break;
+            case OPEN_PDB_WEB:
+                openPdbWeb( node );
+                break;
             case CUT_SUBTREE:
                 cutSubtree( node );
                 break;
@@ -2907,17 +2996,11 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
     }
 
     final private String isCanOpenSeqWeb( final PhylogenyNode node ) {
-        String v = ForesterUtil.extractUniProtKbProteinSeqIdentifier( node );
-        if ( ForesterUtil.isEmpty( v ) ) {
-            v = ForesterUtil.extractGenbankAccessor( node );
-        }
-        if ( ForesterUtil.isEmpty( v ) ) {
-            v = ForesterUtil.extractRefSeqAccessorAccessor( node );
+        final Accession a = SequenceAccessionTools.obtainAccessorFromDataFields( node );
+        if ( a != null ) {
+            return a.getValue();
         }
-        if ( ForesterUtil.isEmpty( v ) ) {
-            v = ForesterUtil.extractGInumber( node );
-        }
-        return v;
+        return null;
     }
 
     final private boolean isCanOpenTaxWeb( final PhylogenyNode node ) {
@@ -2938,8 +3021,16 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         return ( ( getCurrentExternalNodes() != null ) && getCurrentExternalNodes().contains( node.getId() ) );
     }
 
-    final private boolean isInFoundNodes( final PhylogenyNode node ) {
-        return ( ( getFoundNodes() != null ) && getFoundNodes().contains( node.getId() ) );
+    private boolean isInFoundNodes( final PhylogenyNode n ) {
+        return isInFoundNodes0( n ) || isInFoundNodes1( n );
+    }
+
+    final private boolean isInFoundNodes0( final PhylogenyNode node ) {
+        return ( ( getFoundNodes0() != null ) && getFoundNodes0().contains( node.getId() ) );
+    }
+
+    final private boolean isInFoundNodes1( final PhylogenyNode node ) {
+        return ( ( getFoundNodes1() != null ) && getFoundNodes1().contains( node.getId() ) );
     }
 
     final private boolean isInOv() {
@@ -3155,6 +3246,41 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                     _node_popup_menu_items[ i ].setEnabled( false );
                 }
             }
+            else if ( title.equals( Configuration.clickto_options[ Configuration.open_pdb_web ][ 0 ] ) ) {
+                final List<Accession> accs = getPdbAccs( node );
+                _node_popup_menu_items[ i ] = new JMenuItem( title );
+                if ( !ForesterUtil.isEmpty( accs ) ) {
+                    if ( accs.size() == 1 ) {
+                        _node_popup_menu_items[ i ].setText( _node_popup_menu_items[ i ].getText() + " ["
+                                + TreePanelUtil.pdbAccToString( accs, 0 ) + "]" );
+                        _node_popup_menu_items[ i ].setEnabled( true );
+                    }
+                    else if ( accs.size() == 2 ) {
+                        _node_popup_menu_items[ i ].setText( _node_popup_menu_items[ i ].getText() + " ["
+                                + TreePanelUtil.pdbAccToString( accs, 0 ) + ", "
+                                + TreePanelUtil.pdbAccToString( accs, 1 ) + "]" );
+                        _node_popup_menu_items[ i ].setEnabled( true );
+                    }
+                    else if ( accs.size() == 3 ) {
+                        _node_popup_menu_items[ i ].setText( _node_popup_menu_items[ i ].getText() + " ["
+                                + TreePanelUtil.pdbAccToString( accs, 0 ) + ", "
+                                + TreePanelUtil.pdbAccToString( accs, 1 ) + ", "
+                                + TreePanelUtil.pdbAccToString( accs, 2 ) + "]" );
+                        _node_popup_menu_items[ i ].setEnabled( true );
+                    }
+                    else {
+                        _node_popup_menu_items[ i ].setText( _node_popup_menu_items[ i ].getText() + " ["
+                                + TreePanelUtil.pdbAccToString( accs, 0 ) + ", "
+                                + TreePanelUtil.pdbAccToString( accs, 1 ) + ", "
+                                + TreePanelUtil.pdbAccToString( accs, 2 ) + ", + " + ( accs.size() - 3 ) + " more]" );
+                        _node_popup_menu_items[ i ].setEnabled( true );
+                    }
+                }
+                else {
+                    _node_popup_menu_items[ i ].setEnabled( false );
+                }
+                //
+            }
             else if ( title.equals( Configuration.clickto_options[ Configuration.open_tax_web ][ 0 ] ) ) {
                 _node_popup_menu_items[ i ].setEnabled( isCanOpenTaxWeb( node ) );
             }
@@ -3222,6 +3348,8 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         switch ( getOptions().getExtDescNodeDataToReturn() ) {
             case NODE_NAME:
                 return "Node Names";
+            case GENE_NAME:
+                return "Gene Names";
             case SEQUENCE_NAME:
                 return "Sequence Names";
             case SEQUENCE_SYMBOL:
@@ -3246,6 +3374,36 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         }
     }
 
+    final private void openPdbWeb( final PhylogenyNode node ) {
+        final List<Accession> pdb_ids = getPdbAccs( node );
+        if ( ForesterUtil.isEmpty( pdb_ids ) ) {
+            cannotOpenBrowserWarningMessage( "PDB" );
+            return;
+        }
+        final List<String> uri_strs = TreePanelUtil.createUrisForPdbWeb( node, pdb_ids, getConfiguration(), this );
+        if ( !ForesterUtil.isEmpty( uri_strs ) ) {
+            for( final String uri_str : uri_strs ) {
+                try {
+                    AptxUtil.launchWebBrowser( new URI( uri_str ),
+                                               isApplet(),
+                                               isApplet() ? obtainApplet() : null,
+                                               "_aptx_seq" );
+                }
+                catch ( final IOException e ) {
+                    AptxUtil.showErrorMessage( this, e.toString() );
+                    e.printStackTrace();
+                }
+                catch ( final URISyntaxException e ) {
+                    AptxUtil.showErrorMessage( this, e.toString() );
+                    e.printStackTrace();
+                }
+            }
+        }
+        else {
+            cannotOpenBrowserWarningMessage( "PDB" );
+        }
+    }
+
     final private void openSeqWeb( final PhylogenyNode node ) {
         if ( ForesterUtil.isEmpty( isCanOpenSeqWeb( node ) ) ) {
             cannotOpenBrowserWarningMessage( "sequence" );
@@ -3545,8 +3703,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
             }
         }
         if ( node.isExternal() ) {
-            paintNodeBox( x2, y2, node, g, to_pdf, to_graphics_file, isInFoundNodes( node )
-                    || isInCurrentExternalNodes( node ) );
+            paintNodeBox( x2, y2, node, g, to_pdf, to_graphics_file );
         }
     }
 
@@ -3631,7 +3788,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
             c = Color.BLACK;
         }
         else if ( is_in_found_nodes ) {
-            c = getTreeColorSet().getFoundColor();
+            c = getColorForFoundNode( node );
         }
         else if ( getControlPanel().isColorAccordingToTaxonomy() ) {
             c = getTaxonomyBasedColor( node );
@@ -3686,24 +3843,14 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                                               final boolean to_pdf,
                                               final boolean to_graphics_file ) {
         final List<Confidence> confidences = node.getBranchData().getConfidences();
-        //        if ( confidences.size() == 1 ) {
-        //            final double value = node.getBranchData().getConfidence( 0 ).getValue();
-        //            if ( ( value == Confidence.CONFIDENCE_DEFAULT_VALUE ) || ( value < getOptions().getMinConfidenceValue() ) ) {
-        //                return;
-        //            }
-        //            conf_str = FORMATTER_CONFIDENCE.format( value );
-        //        }
-        //        else if ( confidences.size() > 1 ) {
-        boolean one_ok = false;
         boolean not_first = false;
         Collections.sort( confidences );
         final StringBuilder sb = new StringBuilder();
-        String conf_str = "";
         for( final Confidence confidence : confidences ) {
             final double value = confidence.getValue();
             if ( value != Confidence.CONFIDENCE_DEFAULT_VALUE ) {
-                if ( value >= getOptions().getMinConfidenceValue() ) {
-                    one_ok = true;
+                if ( value < getOptions().getMinConfidenceValue() ) {
+                    return;
                 }
                 if ( not_first ) {
                     sb.append( "/" );
@@ -3723,12 +3870,8 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                     }
                 }
             }
-            //}
-            if ( one_ok ) {
-                conf_str = sb.toString();
-            }
         }
-        if ( conf_str.length() > 0 ) {
+        if ( sb.length() > 0 ) {
             final double parent_x = node.getParent().getXcoord();
             double x = node.getXcoord();
             g.setFont( getTreeFontSet().getSmallFont() );
@@ -3744,6 +3887,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
             else {
                 g.setColor( getTreeColorSet().getConfidenceColor() );
             }
+            final String conf_str = sb.toString();
             TreePanel
                     .drawString( conf_str,
                                  parent_x
@@ -3753,11 +3897,15 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         }
     }
 
-    final private void paintFoundNode( final int x, final int y, final Graphics2D g ) {
+    final private void paintFoundNode( final PhylogenyNode n, final double x, final double y, final Graphics2D g ) {
         final int box_size = getOptions().getDefaultNodeShapeSize();
-        final int half_box_size = getOptions().getDefaultNodeShapeSize() / 2;
-        g.setColor( getTreeColorSet().getFoundColor() );
-        g.fillRect( x - half_box_size, y - half_box_size, box_size, box_size );
+        final double half_box_size = getOptions().getDefaultNodeShapeSize() / 2.0;
+        g.setColor( getColorForFoundNode( n ) );
+        //g.fillRect( x - half_box_size, y - half_box_size, box_size, box_size );
+        //TODO check me
+        //FIXME
+        _rectangle.setRect( x - half_box_size, y - half_box_size, box_size, box_size );
+        g.fill( _rectangle );
     }
 
     final private void paintGainedAndLostCharacters( final Graphics2D g,
@@ -3798,20 +3946,19 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                                      final PhylogenyNode node,
                                      final Graphics2D g,
                                      final boolean to_pdf,
-                                     final boolean to_graphics_file,
-                                     final boolean is_in_found_nodes ) {
+                                     final boolean to_graphics_file ) {
         if ( node.isCollapse() ) {
             return;
         }
         // if this node should be highlighted, do so
         if ( ( _highlight_node == node ) && !to_pdf && !to_graphics_file ) {
-            g.setColor( getTreeColorSet().getFoundColor() );
+            g.setColor( getTreeColorSet().getFoundColor0() );
             drawOval( x - 8, y - 8, 16, 16, g );
             drawOval( x - 9, y - 8, 17, 17, g );
             drawOval( x - 9, y - 9, 18, 18, g );
         }
-        if ( is_in_found_nodes ) {
-            paintFoundNode( ForesterUtil.roundToInt( x ), ForesterUtil.roundToInt( y ), g );
+        if ( isInFoundNodes( node ) || isInCurrentExternalNodes( node ) ) {
+            paintFoundNode( node, x, y, g );
         }
         else {
             Color outline_color = null;
@@ -3944,7 +4091,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
             g.setColor( Color.BLACK );
         }
         else if ( is_in_found_nodes ) {
-            g.setColor( getTreeColorSet().getFoundColor() );
+            g.setColor( getColorForFoundNode( node ) );
         }
         else if ( getControlPanel().isColorAccordingToTaxonomy() ) {
             g.setColor( getTaxonomyBasedColor( node ) );
@@ -3982,13 +4129,19 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
             _sb.append( node.getName() );
         }
         if ( node.getNodeData().isHasSequence() ) {
-            if ( getControlPanel().isShowGeneSymbols() && ( node.getNodeData().getSequence().getSymbol().length() > 0 ) ) {
+            if ( getControlPanel().isShowSeqSymbols() && ( node.getNodeData().getSequence().getSymbol().length() > 0 ) ) {
                 if ( _sb.length() > 0 ) {
                     _sb.append( " " );
                 }
                 _sb.append( node.getNodeData().getSequence().getSymbol() );
             }
-            if ( getControlPanel().isShowGeneNames() && ( node.getNodeData().getSequence().getName().length() > 0 ) ) {
+            if ( getControlPanel().isShowGeneNames() && ( node.getNodeData().getSequence().getGeneName().length() > 0 ) ) {
+                if ( _sb.length() > 0 ) {
+                    _sb.append( " " );
+                }
+                _sb.append( node.getNodeData().getSequence().getGeneName() );
+            }
+            if ( getControlPanel().isShowSeqNames() && ( node.getNodeData().getSequence().getName().length() > 0 ) ) {
                 if ( _sb.length() > 0 ) {
                     _sb.append( " " );
                 }
@@ -4157,7 +4310,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
             g.setColor( Color.BLACK );
         }
         else if ( is_in_found_nodes ) {
-            g.setColor( getTreeColorSet().getFoundColor() );
+            g.setColor( getColorForFoundNode( node ) );
         }
         else if ( getControlPanel().isColorAccordingToTaxonomy() ) {
             g.setColor( getTaxonomyBasedColor( node ) );
@@ -4232,7 +4385,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                 }
                 _sb.append( node.getNodeData().getSequence().getAccession().getValue() );
             }
-            if ( getControlPanel().isShowGeneNames() && ( node.getNodeData().getSequence().getName().length() > 0 ) ) {
+            if ( getControlPanel().isShowSeqNames() && ( node.getNodeData().getSequence().getName().length() > 0 ) ) {
                 if ( _sb.length() > 0 ) {
                     _sb.append( " " );
                 }
@@ -4289,7 +4442,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
             return;
         }
         if ( isInFoundNodes( node ) || isInCurrentExternalNodes( node ) ) {
-            g.setColor( getTreeColorSet().getFoundColor() );
+            g.setColor( getColorForFoundNode( node ) );
             drawRectFilled( node.getXSecondary() - 1, node.getYSecondary() - 1, 3, 3, g );
         }
         float new_x = 0;
@@ -4417,8 +4570,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                 child_node.setYcoord( y2 );
                 y2 += _y_distance * child_node.getNumberOfExternalNodes();
             }
-            paintNodeBox( node.getXcoord(), node.getYcoord(), node, g, to_pdf, to_graphics_file, isInFoundNodes( node )
-                    || isInCurrentExternalNodes( node ) );
+            paintNodeBox( node.getXcoord(), node.getYcoord(), node, g, to_pdf, to_graphics_file );
         }
         if ( dynamically_hide
                 && !is_in_found_nodes
@@ -4475,16 +4627,21 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                         }
                     }
                     if ( node.getNodeData().isHasSequence() ) {
-                        if ( getControlPanel().isShowGeneNames()
+                        if ( getControlPanel().isShowSeqNames()
                                 && ( !ForesterUtil.isEmpty( node.getNodeData().getSequence().getName() ) ) ) {
                             x += getTreeFontSet()._fm_large.stringWidth( node.getNodeData().getSequence().getName()
                                     + " " );
                         }
-                        if ( getControlPanel().isShowGeneSymbols()
+                        if ( getControlPanel().isShowSeqSymbols()
                                 && ( !ForesterUtil.isEmpty( node.getNodeData().getSequence().getSymbol() ) ) ) {
                             x += getTreeFontSet()._fm_large.stringWidth( node.getNodeData().getSequence().getSymbol()
                                     + " " );
                         }
+                        if ( getControlPanel().isShowGeneNames()
+                                && ( !ForesterUtil.isEmpty( node.getNodeData().getSequence().getGeneName() ) ) ) {
+                            x += getTreeFontSet()._fm_large.stringWidth( node.getNodeData().getSequence().getGeneName()
+                                    + " " );
+                        }
                         if ( getControlPanel().isShowSequenceAcc()
                                 && ( node.getNodeData().getSequence().getAccession() != null ) ) {
                             x += getTreeFontSet()._fm_large.stringWidth( node.getNodeData().getSequence()
@@ -4540,7 +4697,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         final float height = getOvMaxHeight() / h_ratio;
         final float x = getVisibleRect().x + getOvXPosition() + ( getOvMaxWidth() / x_ratio );
         final float y = getVisibleRect().y + getOvYPosition() + ( getOvMaxHeight() / y_ratio );
-        g.setColor( getTreeColorSet().getFoundColor() );
+        g.setColor( getTreeColorSet().getFoundColor0() );
         getOvRectangle().setRect( x, y, width, height );
         final Stroke s = g.getStroke();
         g.setStroke( STROKE_1 );
@@ -4609,7 +4766,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
             final double w = PhylogenyMethods.getBranchWidthValue( root );
             drawRectFilled( x1 - d, root.getYcoord() - ( w / 2 ), d, w, g );
         }
-        paintNodeBox( x1, root.getYcoord(), root, g, to_pdf, to_graphics_file, isInFoundNodes( root ) );
+        paintNodeBox( x1, root.getYcoord(), root, g, to_pdf, to_graphics_file );
     }
 
     final private void paintScale( final Graphics2D g,
@@ -4653,7 +4810,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         }
         else if ( is_in_found_nodes ) {
             g.setFont( getTreeFontSet().getLargeItalicFont().deriveFont( TreeFontSet.BOLD_AND_ITALIC ) );
-            g.setColor( getTreeColorSet().getFoundColor() );
+            g.setColor( getColorForFoundNode( node ) );
         }
         else if ( getControlPanel().isColorAccordingToTaxonomy() ) {
             g.setColor( getTaxonomyBasedColor( node ) );
@@ -4811,11 +4968,10 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
             current_angle += arc_size;
             assignGraphicsForBranchWithColorForParentBranch( desc, false, g, to_pdf, to_graphics_file );
             drawLine( x, y, new_x, new_y, g );
-            paintNodeBox( new_x, new_y, desc, g, to_pdf, to_graphics_file, isInFoundNodes( desc )
-                    || isInCurrentExternalNodes( desc ) );
+            paintNodeBox( new_x, new_y, desc, g, to_pdf, to_graphics_file );
         }
         if ( n.isRoot() ) {
-            paintNodeBox( n.getXcoord(), n.getYcoord(), n, g, to_pdf, to_graphics_file, isInFoundNodes( n ) );
+            paintNodeBox( n.getXcoord(), n.getYcoord(), n, g, to_pdf, to_graphics_file );
         }
     }
 
@@ -4859,7 +5015,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
             desc.setXSecondary( new_x );
             desc.setYSecondary( new_y );
             if ( isInFoundNodes( desc ) || isInCurrentExternalNodes( desc ) ) {
-                g.setColor( getTreeColorSet().getFoundColor() );
+                g.setColor( getColorForFoundNode( desc ) );
                 drawRectFilled( desc.getXSecondary() - 1, desc.getYSecondary() - 1, 3, 3, g );
                 g.setColor( getTreeColorSet().getOvColor() );
             }
@@ -5070,7 +5226,22 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
 
     private void showExtDescNodeData( final PhylogenyNode node ) {
         final List<String> data = new ArrayList<String>();
-        for( final PhylogenyNode n : node.getAllExternalDescendants() ) {
+        final List<PhylogenyNode> nodes = node.getAllExternalDescendants();
+        if ( ( getFoundNodes0() != null ) && !getFoundNodes0().isEmpty() ) {
+            for( final PhylogenyNode n : getFoundNodes0AsListOfPhylogenyNodes() ) {
+                if ( !nodes.contains( n ) ) {
+                    nodes.add( n );
+                }
+            }
+        }
+        if ( ( getFoundNodes1() != null ) && !getFoundNodes1().isEmpty() ) {
+            for( final PhylogenyNode n : getFoundNodes1AsListOfPhylogenyNodes() ) {
+                if ( !nodes.contains( n ) ) {
+                    nodes.add( n );
+                }
+            }
+        }
+        for( final PhylogenyNode n : nodes ) {
             switch ( getOptions().getExtDescNodeDataToReturn() ) {
                 case NODE_NAME:
                     if ( !ForesterUtil.isEmpty( n.getName() ) ) {
@@ -5083,6 +5254,12 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                         data.add( n.getNodeData().getSequence().getName() );
                     }
                     break;
+                case GENE_NAME:
+                    if ( n.getNodeData().isHasSequence()
+                            && !ForesterUtil.isEmpty( n.getNodeData().getSequence().getGeneName() ) ) {
+                        data.add( n.getNodeData().getSequence().getGeneName() );
+                    }
+                    break;
                 case SEQUENCE_SYMBOL:
                     if ( n.getNodeData().isHasSequence()
                             && !ForesterUtil.isEmpty( n.getNodeData().getSequence().getSymbol() ) ) {
@@ -5114,6 +5291,11 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                             ann.append( n.getNodeData().getSequence().getName() );
                             ann.append( "|" );
                         }
+                        if ( !ForesterUtil.isEmpty( n.getNodeData().getSequence().getGeneName() ) ) {
+                            ann.append( "GN=" );
+                            ann.append( n.getNodeData().getSequence().getGeneName() );
+                            ann.append( "|" );
+                        }
                         if ( n.getNodeData().getSequence().getAccession() != null ) {
                             ann.append( "ACC=" );
                             ann.append( n.getNodeData().getSequence().getAccession().asText() );
@@ -5131,9 +5313,12 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                                 ann.append( "|" );
                             }
                         }
-                        String ann_str = ann.toString().trim();
-                        if ( ann_str.endsWith( "|" ) ) {
-                            ann_str = ann_str.substring( 0, ann_str.length() - 1 );
+                        String ann_str;
+                        if ( ann.charAt( ann.length() - 1 ) == '|' ) {
+                            ann_str = ann.substring( 0, ann.length() - 1 );
+                        }
+                        else {
+                            ann_str = ann.toString();
                         }
                         sb.append( SequenceWriter.toFasta( ann_str, n.getNodeData().getSequence()
                                 .getMolecularSequence(), 60 ) );
@@ -5173,7 +5358,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
             }
         } // for loop
         final StringBuilder sb = new StringBuilder();
-        final int size = makeSB( data, getOptions(), sb );
+        final int size = TreePanelUtil.makeSB( data, getOptions(), sb );
         if ( ( getConfiguration().getExtNodeDataReturnOn() == EXT_NODE_DATA_RETURN_ON.CONSOLE )
                 || ( getConfiguration().getExtNodeDataReturnOn() == EXT_NODE_DATA_RETURN_ON.BUFFER_ONLY ) ) {
             if ( getConfiguration().getExtNodeDataReturnOn() == EXT_NODE_DATA_RETURN_ON.CONSOLE ) {
@@ -5194,15 +5379,26 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
             }
             else {
                 setCurrentExternalNodesDataBuffer( sb );
-                final String title = ( getOptions().getExtDescNodeDataToReturn() == NODE_DATA.UNKNOWN ? "Data"
-                        : obtainTitleForExtDescNodeData() )
-                        + " for "
-                        + data.size()
-                        + "/"
-                        + node.getNumberOfExternalNodes()
-                        + " external descendats of node "
-                        + node
-                        + ", unique entries: " + size;
+                String title;
+                if ( ( getFoundNodes0() != null ) && !getFoundNodes0().isEmpty() ) {
+                    title = ( getOptions().getExtDescNodeDataToReturn() == NODE_DATA.UNKNOWN ? "Data"
+                            : obtainTitleForExtDescNodeData() )
+                            + " for "
+                            + data.size()
+                            + " nodes, unique entries: "
+                            + size;
+                }
+                else {
+                    title = ( getOptions().getExtDescNodeDataToReturn() == NODE_DATA.UNKNOWN ? "Data"
+                            : obtainTitleForExtDescNodeData() )
+                            + " for "
+                            + data.size()
+                            + "/"
+                            + node.getNumberOfExternalNodes()
+                            + " external descendats of node "
+                            + node
+                            + ", unique entries: " + size;
+                }
                 final String s = sb.toString().trim();
                 if ( getMainPanel().getMainFrame() == null ) {
                     // Must be "E" applet version.
@@ -5216,46 +5412,6 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         }
     }
 
-    private int makeSB( final List<String> data, final Options optz, final StringBuilder sb ) {
-        final SortedMap<String, Integer> map = new TreeMap<String, Integer>();
-        if ( ( optz.getExtDescNodeDataToReturn() != NODE_DATA.SEQUENCE_MOL_SEQ )
-                && ( optz.getExtDescNodeDataToReturn() != NODE_DATA.SEQUENCE_MOL_SEQ_FASTA ) ) {
-            for( final String d : data ) {
-                if ( !ForesterUtil.isEmpty( d ) ) {
-                    if ( map.containsKey( d ) ) {
-                        map.put( d, map.get( d ) + 1 );
-                    }
-                    else {
-                        map.put( d, 1 );
-                    }
-                }
-            }
-        }
-        int size = 0;
-        if ( ( optz.getExtDescNodeDataToReturn() != NODE_DATA.SEQUENCE_MOL_SEQ )
-                && ( optz.getExtDescNodeDataToReturn() != NODE_DATA.SEQUENCE_MOL_SEQ_FASTA ) ) {
-            for( final Entry<String, Integer> e : map.entrySet() ) {
-                final String v = e.getKey();
-                final Object c = e.getValue();
-                sb.append( v );
-                sb.append( "\t" );
-                sb.append( c );
-                sb.append( ForesterUtil.LINE_SEPARATOR );
-            }
-            size = map.size();
-        }
-        else {
-            for( final String d : data ) {
-                if ( !ForesterUtil.isEmpty( d ) ) {
-                    sb.append( d );
-                    sb.append( ForesterUtil.LINE_SEPARATOR );
-                }
-            }
-            size = data.size();
-        }
-        return size;
-    }
-
     final private void showNodeDataPopup( final MouseEvent e, final PhylogenyNode node ) {
         try {
             if ( ( node.getName().length() > 0 )
@@ -5382,6 +5538,17 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                         _popup_buffer.append( "]" );
                         enc_data = true;
                     }
+                    if ( !ForesterUtil.isEmpty( seq.getGeneName() ) ) {
+                        if ( enc_data ) {
+                            _popup_buffer.append( " [" );
+                        }
+                        else {
+                            _popup_buffer.append( "[" );
+                        }
+                        _popup_buffer.append( seq.getGeneName() );
+                        _popup_buffer.append( "]" );
+                        enc_data = true;
+                    }
                     if ( !ForesterUtil.isEmpty( seq.getName() ) ) {
                         if ( enc_data ) {
                             _popup_buffer.append( " " );
@@ -5446,8 +5613,14 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                         _rollover_popup
                                 .setBorder( BorderFactory.createLineBorder( getTreeColorSet().getBranchColor() ) );
                         _rollover_popup.setBackground( getTreeColorSet().getBackgroundColor() );
-                        if ( isInFoundNodes( node ) ) {
-                            _rollover_popup.setForeground( getTreeColorSet().getFoundColor() );
+                        if ( isInFoundNodes0( node ) && !isInFoundNodes1( node ) ) {
+                            _rollover_popup.setForeground( getTreeColorSet().getFoundColor0() );
+                        }
+                        else if ( !isInFoundNodes0( node ) && isInFoundNodes1( node ) ) {
+                            _rollover_popup.setForeground( getTreeColorSet().getFoundColor1() );
+                        }
+                        else if ( isInFoundNodes0( node ) && isInFoundNodes1( node ) ) {
+                            _rollover_popup.setForeground( getTreeColorSet().getFoundColor0and1() );
                         }
                         else if ( getControlPanel().isColorAccordingToTaxonomy() ) {
                             _rollover_popup.setForeground( getTaxonomyBasedColor( node ) );
@@ -5568,9 +5741,9 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
 
     final private class SubtreeColorizationActionListener implements ActionListener {
 
+        List<PhylogenyNode> _additional_nodes = null;
         JColorChooser       _chooser          = null;
         PhylogenyNode       _node             = null;
-        List<PhylogenyNode> _additional_nodes = null;
 
         SubtreeColorizationActionListener( final JColorChooser chooser, final PhylogenyNode node ) {
             _chooser = chooser;