JAL-2805 JAL-281 JAL-2847 set tree file made public as well (heh)
[jalview.git] / forester / java / src / org / forester / archaeopteryx / TreePanelUtil.java
index e131214..38f935b 100644 (file)
@@ -6,6 +6,7 @@ import java.awt.Component;
 import java.io.UnsupportedEncodingException;
 import java.net.URLEncoder;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -25,7 +26,7 @@ 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.NodeData.NODE_DATA;
+import org.forester.phylogeny.data.NodeDataField;
 import org.forester.phylogeny.data.Sequence;
 import org.forester.phylogeny.data.Taxonomy;
 import org.forester.phylogeny.iterators.PhylogenyNodeIterator;
@@ -33,6 +34,7 @@ import org.forester.phylogeny.iterators.PreorderTreeIterator;
 import org.forester.util.ForesterConstants;
 import org.forester.util.ForesterUtil;
 import org.forester.util.SequenceAccessionTools;
+import org.forester.util.StringInt;
 import org.forester.ws.seqdb.UniProtTaxonomy;
 
 public class TreePanelUtil {
@@ -44,7 +46,7 @@ public class TreePanelUtil {
         final String upkb = SequenceAccessionTools.obtainUniProtAccessorFromDataFields( node );
         if ( !ForesterUtil.isEmpty( upkb ) ) {
             try {
-                uri_str = ForesterUtil.UNIPROT_KB + URLEncoder.encode( upkb, ForesterConstants.UTF8 );
+                uri_str = ForesterUtil.UNIPROT_KB + URLEncoder.encode( upkb, ForesterConstants.UTF_8 );
             }
             catch ( final UnsupportedEncodingException e ) {
                 AptxUtil.showErrorMessage( tp, e.toString() );
@@ -56,10 +58,10 @@ public class TreePanelUtil {
             if ( !ForesterUtil.isEmpty( v ) ) {
                 try {
                     if ( SequenceAccessionTools.isProteinDbQuery( v ) ) {
-                        uri_str = ForesterUtil.NCBI_PROTEIN + URLEncoder.encode( v, ForesterConstants.UTF8 );
+                        uri_str = ForesterUtil.NCBI_PROTEIN + URLEncoder.encode( v, ForesterConstants.UTF_8 );
                     }
                     else {
-                        uri_str = ForesterUtil.NCBI_NUCCORE + URLEncoder.encode( v, ForesterConstants.UTF8 );
+                        uri_str = ForesterUtil.NCBI_NUCCORE + URLEncoder.encode( v, ForesterConstants.UTF_8 );
                     }
                 }
                 catch ( final UnsupportedEncodingException e ) {
@@ -73,10 +75,10 @@ public class TreePanelUtil {
             if ( !ForesterUtil.isEmpty( v ) ) {
                 try {
                     if ( SequenceAccessionTools.isProteinDbQuery( v ) ) {
-                        uri_str = ForesterUtil.NCBI_PROTEIN + URLEncoder.encode( v, ForesterConstants.UTF8 );
+                        uri_str = ForesterUtil.NCBI_PROTEIN + URLEncoder.encode( v, ForesterConstants.UTF_8 );
                     }
                     else {
-                        uri_str = ForesterUtil.NCBI_NUCCORE + URLEncoder.encode( v, ForesterConstants.UTF8 );
+                        uri_str = ForesterUtil.NCBI_NUCCORE + URLEncoder.encode( v, ForesterConstants.UTF_8 );
                     }
                 }
                 catch ( final UnsupportedEncodingException e ) {
@@ -89,7 +91,7 @@ public class TreePanelUtil {
             final String v = SequenceAccessionTools.obtainGiNumberFromDataFields( node );
             if ( !ForesterUtil.isEmpty( v ) ) {
                 try {
-                    uri_str = ForesterUtil.NCBI_GI + URLEncoder.encode( v, ForesterConstants.UTF8 );
+                    uri_str = ForesterUtil.NCBI_GI + URLEncoder.encode( v, ForesterConstants.UTF_8 );
                 }
                 catch ( final UnsupportedEncodingException e ) {
                     AptxUtil.showErrorMessage( tp, e.toString() );
@@ -120,7 +122,7 @@ public class TreePanelUtil {
      * all external nodes of node.
      * If at least one the external nodes has no taxonomy,
      * null is returned.
-     * 
+     *
      */
     public static Set<Taxonomy> obtainDistinctTaxonomies( final PhylogenyNode node ) {
         final List<PhylogenyNode> descs = node.getAllExternalDescendants();
@@ -147,8 +149,8 @@ public class TreePanelUtil {
         }
         if ( cp.isShowSeqSymbols() && node.getNodeData().isHasSequence()
                 && !ForesterUtil.isEmpty( node.getNodeData().getSequence().getSymbol() ) ) {
-            TreePanelUtil
-                    .showExtDescNodeDataUserSelectedHelperHelper( node.getNodeData().getSequence().getSymbol(), sb );
+            TreePanelUtil.showExtDescNodeDataUserSelectedHelperHelper( node.getNodeData().getSequence().getSymbol(),
+                                                                       sb );
         }
         if ( cp.isShowGeneNames() && node.getNodeData().isHasSequence()
                 && !ForesterUtil.isEmpty( node.getNodeData().getSequence().getGeneName() ) ) {
@@ -163,25 +165,27 @@ public class TreePanelUtil {
         }
         if ( cp.isShowTaxonomyCode() && node.getNodeData().isHasTaxonomy()
                 && !ForesterUtil.isEmpty( node.getNodeData().getTaxonomy().getTaxonomyCode() ) ) {
-            TreePanelUtil.showExtDescNodeDataUserSelectedHelperHelper( node.getNodeData().getTaxonomy()
-                    .getTaxonomyCode(), sb );
+            TreePanelUtil
+                    .showExtDescNodeDataUserSelectedHelperHelper( node.getNodeData().getTaxonomy().getTaxonomyCode(),
+                                                                  sb );
         }
         if ( cp.isShowTaxonomyScientificNames() && node.getNodeData().isHasTaxonomy()
                 && !ForesterUtil.isEmpty( node.getNodeData().getTaxonomy().getScientificName() ) ) {
-            TreePanelUtil.showExtDescNodeDataUserSelectedHelperHelper( node.getNodeData().getTaxonomy()
-                    .getScientificName(), sb );
+            TreePanelUtil
+                    .showExtDescNodeDataUserSelectedHelperHelper( node.getNodeData().getTaxonomy().getScientificName(),
+                                                                  sb );
         }
         if ( cp.isShowTaxonomyCommonNames() && node.getNodeData().isHasTaxonomy()
                 && !ForesterUtil.isEmpty( node.getNodeData().getTaxonomy().getCommonName() ) ) {
-            TreePanelUtil
-                    .showExtDescNodeDataUserSelectedHelperHelper( node.getNodeData().getTaxonomy().getCommonName(), sb );
-        }
-        if ( ( cp.isShowSeqNames() || cp.isShowSeqSymbols() || cp.isShowSequenceAcc() )
-                && node.getNodeData().isHasSequence()
-                && !ForesterUtil.isEmpty( node.getNodeData().getSequence().getMolecularSequence() ) ) {
-            TreePanelUtil.showExtDescNodeDataUserSelectedHelperHelper( node.getNodeData().getSequence()
-                    .getMolecularSequence(), sb );
+            TreePanelUtil.showExtDescNodeDataUserSelectedHelperHelper( node.getNodeData().getTaxonomy().getCommonName(),
+                                                                       sb );
         }
+        //        if ( ( cp.isShowSeqNames() || cp.isShowSeqSymbols() || cp.isShowSequenceAcc() )
+        //                && node.getNodeData().isHasSequence()
+        //                && !ForesterUtil.isEmpty( node.getNodeData().getSequence().getMolecularSequence() ) ) {
+        //            TreePanelUtil.showExtDescNodeDataUserSelectedHelperHelper( node.getNodeData().getSequence()
+        //                    .getMolecularSequence(), sb );
+        //        }
         final String s = sb.toString().trim();
         if ( !ForesterUtil.isEmpty( s ) ) {
             data.add( s );
@@ -201,6 +205,9 @@ public class TreePanelUtil {
 
     final static void collapseSpeciesSpecificSubtrees( final Phylogeny phy ) {
         boolean inferred = false;
+        for( final PhylogenyNodeIterator iter = phy.iteratorPreorder(); iter.hasNext(); ) {
+            iter.next().setCollapse( false );
+        }
         for( final PhylogenyNodeIterator it = phy.iteratorPreorder(); it.hasNext(); ) {
             final PhylogenyNode n = it.next();
             if ( !n.isExternal() && !n.isCollapse() && ( n.getNumberOfDescendants() > 1 ) ) {
@@ -234,7 +241,18 @@ public class TreePanelUtil {
         }
     }
 
-    static void colorizeSubtree( final PhylogenyNode node, final BranchColor c ) {
+    final static void uncollapseSubtree( final PhylogenyNode node ) {
+        node.setCollapse( false );
+        if ( node.isExternal() ) {
+            return;
+        }
+        final PhylogenyNodeIterator it = new PreorderTreeIterator( node );
+        while ( it.hasNext() ) {
+            it.next().setCollapse( false );
+        }
+    }
+
+    public static void colorizeSubtree( final PhylogenyNode node, final BranchColor c ) {
         node.getBranchData().setBranchColor( c );
         final List<PhylogenyNode> descs = PhylogenyMethods.getAllDescendants( node );
         for( final PhylogenyNode desc : descs ) {
@@ -277,7 +295,8 @@ public class TreePanelUtil {
             if ( !n.getBranchData().isHasBranchColor() ) {
                 final Taxonomy tax = PhylogenyMethods.getExternalDescendantsTaxonomy( n );
                 if ( tax != null ) {
-                    n.getBranchData().setBranchColor( new BranchColor( tree_panel.calculateTaxonomyBasedColor( tax ) ) );
+                    n.getBranchData()
+                            .setBranchColor( new BranchColor( tree_panel.calculateTaxonomyBasedColor( tax ) ) );
                     final List<PhylogenyNode> descs = PhylogenyMethods.getAllDescendants( n );
                     for( final PhylogenyNode desc : descs ) {
                         desc.getBranchData()
@@ -288,23 +307,97 @@ public class TreePanelUtil {
         }
     }
 
-    final static int colorPhylogenyAccordingToRanks( final Phylogeny tree, final String rank, final TreePanel tree_panel ) {
+//    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 ) {
         final Map<String, Color> true_lineage_to_color_map = new HashMap<String, Color>();
         int colorizations = 0;
         for( final PhylogenyNodeIterator it = tree.iteratorPostorder(); it.hasNext(); ) {
             final PhylogenyNode n = it.next();
             if ( n.getNodeData().isHasTaxonomy()
                     && ( !ForesterUtil.isEmpty( n.getNodeData().getTaxonomy().getScientificName() )
-                            || !ForesterUtil.isEmpty( n.getNodeData().getTaxonomy().getCommonName() ) || !ForesterUtil
-                            .isEmpty( n.getNodeData().getTaxonomy().getTaxonomyCode() ) ) ) {
+                            || !ForesterUtil.isEmpty( n.getNodeData().getTaxonomy().getCommonName() )
+                            || !ForesterUtil.isEmpty( n.getNodeData().getTaxonomy().getTaxonomyCode() ) ) ) {
                 if ( !ForesterUtil.isEmpty( n.getNodeData().getTaxonomy().getRank() )
                         && n.getNodeData().getTaxonomy().getRank().equalsIgnoreCase( rank ) ) {
-                    final BranchColor c = new BranchColor( tree_panel.calculateTaxonomyBasedColor( n.getNodeData()
-                            .getTaxonomy() ) );
+                    final BranchColor c = new BranchColor( tree_panel
+                            .calculateTaxonomyBasedColor( n.getNodeData().getTaxonomy() ) );
                     TreePanelUtil.colorizeSubtree( n, c );
                     ++colorizations;
                     if ( !ForesterUtil.isEmpty( n.getNodeData().getTaxonomy().getScientificName() ) ) {
-                        true_lineage_to_color_map.put( n.getNodeData().getTaxonomy().getScientificName(), c.getValue() );
+                        true_lineage_to_color_map.put( n.getNodeData().getTaxonomy().getScientificName(),
+                                                       c.getValue() );
                     }
                 }
             }
@@ -317,8 +410,8 @@ public class TreePanelUtil {
                 if ( !true_lineage_to_color_map.isEmpty() ) {
                     for( final String lin : node.getNodeData().getTaxonomy().getLineage() ) {
                         if ( true_lineage_to_color_map.containsKey( lin ) ) {
-                            TreePanelUtil
-                                    .colorizeSubtree( node, new BranchColor( true_lineage_to_color_map.get( lin ) ) );
+                            TreePanelUtil.colorizeSubtree( node,
+                                                           new BranchColor( true_lineage_to_color_map.get( lin ) ) );
                             ++colorizations;
                             success = true;
                             break;
@@ -349,8 +442,10 @@ public class TreePanelUtil {
                             }
                             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 ) ) {
-                                    final BranchColor c = new BranchColor( tree_panel.calculateTaxonomyBasedColor( temp_tax ) );
+                                    final BranchColor c = new BranchColor( tree_panel
+                                            .calculateTaxonomyBasedColor( temp_tax ) );
                                     TreePanelUtil.colorizeSubtree( node, c );
                                     ++colorizations;
                                     true_lineage_to_color_map.put( lin, c.getValue() );
@@ -365,7 +460,8 @@ public class TreePanelUtil {
         return colorizations;
     }
 
-    final static String createAnnotationString( final SortedSet<Annotation> annotations, final boolean show_ref_sources ) {
+    final static String createAnnotationString( final SortedSet<Annotation> annotations,
+                                                final boolean show_ref_sources ) {
         final SortedMap<String, List<Annotation>> m = new TreeMap<String, List<Annotation>>();
         for( final Annotation an : annotations ) {
             final String ref_source = ForesterUtil.isEmpty( an.getRefSource() ) ? "?" : an.getRefSource();
@@ -397,7 +493,7 @@ public class TreePanelUtil {
                 if ( sb.charAt( sb.length() - 1 ) == ' ' ) {
                     sb.deleteCharAt( sb.length() - 1 );
                 }
-                if ( i < ans.size() - 1 ) {
+                if ( i < ( ans.size() - 1 ) ) {
                     sb.append( ", " );
                 }
             }
@@ -433,14 +529,15 @@ public class TreePanelUtil {
 
     final static boolean isTaxonomyEmpty( final Taxonomy tax ) {
         return ( ( tax.getIdentifier() == null ) && ForesterUtil.isEmpty( tax.getTaxonomyCode() )
-                && ForesterUtil.isEmpty( tax.getCommonName() ) && ForesterUtil.isEmpty( tax.getScientificName() ) && tax
-                .getSynonyms().isEmpty() );
+                && ForesterUtil.isEmpty( tax.getCommonName() ) && ForesterUtil.isEmpty( tax.getScientificName() )
+                && tax.getSynonyms().isEmpty() );
     }
 
-    static int makeSB( final List<String> data, final Options optz, final StringBuilder sb ) {
+    static final int nodeDataIntoStringBuffer( 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 ) ) {
+        int size = 0;
+        if ( ( optz.getExtDescNodeDataToReturn() != NodeDataField.SEQUENCE_MOL_SEQ_FASTA )
+                && ( optz.getExtDescNodeDataToReturn() != NodeDataField.GO_TERM_IDS ) ) {
             for( final String d : data ) {
                 if ( !ForesterUtil.isEmpty( d ) ) {
                     if ( map.containsKey( d ) ) {
@@ -451,17 +548,30 @@ public class TreePanelUtil {
                     }
                 }
             }
-        }
-        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 );
+            if ( ( optz.getExtDescNodeDataToReturn() == NodeDataField.DOMAINS_ALL )
+                    || ( optz.getExtDescNodeDataToReturn() == NodeDataField.DOMAINS_COLLAPSED_PER_PROTEIN )
+                    || ( optz.getExtDescNodeDataToReturn() == NodeDataField.SEQ_ANNOTATIONS ) ) {
+                final ArrayList<StringInt> sis = new ArrayList<StringInt>();
+                for( final Entry<String, Integer> e : map.entrySet() ) {
+                    sis.add( new StringInt( e.getKey(), e.getValue() ) );
+                }
+                Collections.sort( sis, new StringInt.DescendingIntComparator() );
+                for( final StringInt si : sis ) {
+                    sb.append( si.getString() );
+                    sb.append( "\t" );
+                    sb.append( si.getInt() );
+                    sb.append( ForesterUtil.LINE_SEPARATOR );
+                }
+            }
+            else {
+                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();
         }