+// final static int collapseByTaxonomicRank( final Phylogeny tree, final String rank, final TreePanel tree_panel ) {
+// final Set<String> true_lineage_set = new HashSet<String>();
+// for( final PhylogenyNodeIterator iter = tree.iteratorPreorder(); iter.hasNext(); ) {
+// iter.next().setCollapse( false );
+// }
+// int collapsed = 0;
+// for( final PhylogenyNodeIterator it = tree.iteratorPostorder(); it.hasNext(); ) {
+// final PhylogenyNode n = it.next();
+// if ( !n.isExternal() && n.getNodeData().isHasTaxonomy() && !ForesterUtil.isEmpty( n.getNodeData().getTaxonomy().getRank() )
+// && n.getNodeData().getTaxonomy().getRank().equalsIgnoreCase( rank ) /*&& !n.isRoot()*/ ) {
+// TreePanelUtil.collapseSubtree( n, true );
+// ++collapsed;
+// if ( !ForesterUtil.isEmpty( n.getNodeData().getTaxonomy().getScientificName() ) ) {
+// true_lineage_set.add( n.getNodeData().getTaxonomy().getScientificName() );
+// }
+// }
+// }
+// for( final PhylogenyNodeIterator it = tree.iteratorPostorder(); it.hasNext(); ) {
+// final PhylogenyNode node = it.next();
+// if ( ( !node.isExternal() && !node.isCollapse() ) && node.getNodeData().isHasTaxonomy()
+// && !ForesterUtil.isEmpty( node.getNodeData().getTaxonomy().getLineage() ) /* && !node.isRoot()*/ ) {
+// boolean success = false;
+// if ( !true_lineage_set.isEmpty() ) {
+// for( final String lin : node.getNodeData().getTaxonomy().getLineage() ) {
+// if ( true_lineage_set.contains( lin ) ) {
+// TreePanelUtil.collapseSubtree( node, true );
+// ++collapsed;
+// success = true;
+// break;
+// }
+// }
+// }
+// if ( !success ) {
+// final Map<String, String> lineage_to_rank_map = MainPanel.getLineageToRankMap();
+// for( final String lin : node.getNodeData().getTaxonomy().getLineage() ) {
+// final Taxonomy temp_tax = new Taxonomy();
+// temp_tax.setScientificName( lin );
+// if ( lineage_to_rank_map.containsKey( lin )
+// && !ForesterUtil.isEmpty( lineage_to_rank_map.get( lin ) )
+// && lineage_to_rank_map.get( lin ).equalsIgnoreCase( rank ) ) {
+// TreePanelUtil.collapseSubtree( node, true );
+// ++collapsed;
+// true_lineage_set.add( lin );
+// break;
+// }
+// else {
+// UniProtTaxonomy up = null;
+// try {
+// up = TaxonomyDataManager.obtainUniProtTaxonomy( temp_tax, null, null );
+// }
+// catch ( final Exception e ) {
+// e.printStackTrace();
+// }
+// if ( ( up != null ) && !ForesterUtil.isEmpty( up.getRank() ) ) {
+// lineage_to_rank_map.put( lin, up.getRank() );
+// System.out.println( lin + "->" + up.getRank() );
+// if ( up.getRank().equalsIgnoreCase( rank ) ) {
+// TreePanelUtil.collapseSubtree( node, true );
+// ++collapsed;
+// true_lineage_set.add( lin );
+// break;
+// }
+// }
+// }
+// }
+// }
+// }
+// }
+// return collapsed;
+// }
+
+ final static int colorPhylogenyAccordingToRanks( final Phylogeny tree,
+ final String rank,
+ final TreePanel tree_panel ) {