inprogress
authorcmzmasek@gmail.com <cmzmasek@gmail.com@ca865154-3058-d1c3-3e42-d8f55a55bdbd>
Wed, 25 Sep 2013 00:43:11 +0000 (00:43 +0000)
committercmzmasek@gmail.com <cmzmasek@gmail.com@ca865154-3058-d1c3-3e42-d8f55a55bdbd>
Wed, 25 Sep 2013 00:43:11 +0000 (00:43 +0000)
forester/java/src/org/forester/archaeopteryx/AptxUtil.java
forester/java/src/org/forester/archaeopteryx/Configuration.java
forester/java/src/org/forester/archaeopteryx/Constants.java
forester/java/src/org/forester/archaeopteryx/TreePanel.java
forester/java/src/org/forester/archaeopteryx/TreePanelUtil.java [new file with mode: 0644]
forester/java/src/org/forester/test/Test.java

index 3f4bd4c..42e7ab1 100644 (file)
@@ -25,7 +25,6 @@
 
 package org.forester.archaeopteryx;
 
-import java.awt.Color;
 import java.awt.Component;
 import java.awt.Graphics2D;
 import java.awt.GraphicsEnvironment;
@@ -36,26 +35,18 @@ import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.IOException;
-import java.io.UnsupportedEncodingException;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.net.URI;
 import java.net.URL;
-import java.net.URLEncoder;
 import java.text.ParseException;
-import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
-import java.util.Map;
-import java.util.Map.Entry;
 import java.util.Set;
-import java.util.SortedMap;
 import java.util.SortedSet;
-import java.util.TreeMap;
 import java.util.TreeSet;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -69,7 +60,6 @@ import javax.swing.JApplet;
 import javax.swing.JOptionPane;
 import javax.swing.text.MaskFormatter;
 
-import org.forester.analysis.TaxonomyDataManager;
 import org.forester.io.parsers.PhylogenyParser;
 import org.forester.io.parsers.nexus.NexusPhylogeniesParser;
 import org.forester.io.parsers.nhx.NHXParser;
@@ -82,19 +72,13 @@ 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.Taxonomy;
 import org.forester.phylogeny.factories.ParserBasedPhylogenyFactory;
 import org.forester.phylogeny.factories.PhylogenyFactory;
 import org.forester.phylogeny.iterators.PhylogenyNodeIterator;
-import org.forester.phylogeny.iterators.PreorderTreeIterator;
 import org.forester.util.AsciiHistogram;
 import org.forester.util.DescriptiveStatistics;
-import org.forester.util.ForesterConstants;
 import org.forester.util.ForesterUtil;
-import org.forester.util.SequenceIdParser;
-import org.forester.ws.seqdb.UniProtTaxonomy;
 
 public final class AptxUtil {
 
@@ -119,69 +103,6 @@ public final class AptxUtil {
         return formatter;
     }
 
-    public final static String createUriForSeqWeb( final PhylogenyNode node,
-                                                   final Configuration conf,
-                                                   final TreePanel tp ) {
-        String uri_str = null;
-        final String upkb = ForesterUtil.extractUniProtKbProteinSeqIdentifier( node );
-        if ( !ForesterUtil.isEmpty( upkb ) ) {
-            try {
-                uri_str = ForesterUtil.UNIPROT_KB + URLEncoder.encode( upkb, ForesterConstants.UTF8 );
-            }
-            catch ( final UnsupportedEncodingException e ) {
-                showErrorMessage( tp, e.toString() );
-                e.printStackTrace();
-            }
-        }
-        if ( ForesterUtil.isEmpty( uri_str ) ) {
-            final String v = ForesterUtil.extractGenbankAccessor( node );
-            if ( !ForesterUtil.isEmpty( v ) ) {
-                try {
-                    if ( SequenceIdParser.isProtein( v ) ) {
-                        uri_str = ForesterUtil.NCBI_PROTEIN + URLEncoder.encode( v, ForesterConstants.UTF8 );
-                    }
-                    else {
-                        uri_str = ForesterUtil.NCBI_NUCCORE + URLEncoder.encode( v, ForesterConstants.UTF8 );
-                    }
-                }
-                catch ( final UnsupportedEncodingException e ) {
-                    showErrorMessage( tp, e.toString() );
-                    e.printStackTrace();
-                }
-            }
-        }
-        if ( ForesterUtil.isEmpty( uri_str ) ) {
-            final String v = ForesterUtil.extractRefSeqAccessorAccessor( node );
-            if ( !ForesterUtil.isEmpty( v ) ) {
-                try {
-                    if ( SequenceIdParser.isProtein( v ) ) {
-                        uri_str = ForesterUtil.NCBI_PROTEIN + URLEncoder.encode( v, ForesterConstants.UTF8 );
-                    }
-                    else {
-                        uri_str = ForesterUtil.NCBI_NUCCORE + URLEncoder.encode( v, ForesterConstants.UTF8 );
-                    }
-                }
-                catch ( final UnsupportedEncodingException e ) {
-                    showErrorMessage( tp, e.toString() );
-                    e.printStackTrace();
-                }
-            }
-        }
-        if ( ForesterUtil.isEmpty( uri_str ) ) {
-            final String v = ForesterUtil.extractGInumber( node );
-            if ( !ForesterUtil.isEmpty( v ) ) {
-                try {
-                    uri_str = ForesterUtil.NCBI_GI + URLEncoder.encode( v, ForesterConstants.UTF8 );
-                }
-                catch ( final UnsupportedEncodingException e ) {
-                    showErrorMessage( tp, e.toString() );
-                    e.printStackTrace();
-                }
-            }
-        }
-        return uri_str;
-    }
-
     final static public boolean isHasAtLeastNodeWithEvent( final Phylogeny phy ) {
         final PhylogenyNodeIterator it = phy.iteratorPostorder();
         while ( it.hasNext() ) {
@@ -270,25 +191,6 @@ public final class AptxUtil {
         return tax_set;
     }
 
-    /**
-     * Returns the set of distinct taxonomies of
-     * 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();
-        final Set<Taxonomy> tax_set = new HashSet<Taxonomy>();
-        for( final PhylogenyNode n : descs ) {
-            if ( !n.getNodeData().isHasTaxonomy() || n.getNodeData().getTaxonomy().isEmpty() ) {
-                return null;
-            }
-            tax_set.add( n.getNodeData().getTaxonomy() );
-        }
-        return tax_set;
-    }
-
     public final static Accession obtainSequenceAccessionFromName( final String sequence_name ) {
         final String n = sequence_name.trim();
         final Matcher matcher1 = seq_identifier_pattern_1.matcher( n );
@@ -321,60 +223,6 @@ public final class AptxUtil {
                 + "] Error", JOptionPane.ERROR_MESSAGE );
     }
 
-    public final static void showExtDescNodeDataUserSelectedHelper( final ControlPanel cp,
-                                                                    final PhylogenyNode node,
-                                                                    final List<String> data ) {
-        final StringBuilder sb = new StringBuilder();
-        if ( cp.isShowNodeNames() && !ForesterUtil.isEmpty( node.getName() ) ) {
-            showExtDescNodeDataUserSelectedHelperHelper( node.getName(), sb );
-        }
-        if ( cp.isShowGeneNames() && node.getNodeData().isHasSequence()
-                && !ForesterUtil.isEmpty( node.getNodeData().getSequence().getName() ) ) {
-            showExtDescNodeDataUserSelectedHelperHelper( node.getNodeData().getSequence().getName(), sb );
-        }
-        if ( cp.isShowGeneSymbols() && node.getNodeData().isHasSequence()
-                && !ForesterUtil.isEmpty( node.getNodeData().getSequence().getSymbol() ) ) {
-            showExtDescNodeDataUserSelectedHelperHelper( node.getNodeData().getSequence().getSymbol(), sb );
-        }
-        if ( cp.isShowSequenceAcc() && node.getNodeData().isHasSequence()
-                && ( node.getNodeData().getSequence().getAccession() != null )
-                && !ForesterUtil.isEmpty( node.getNodeData().getSequence().getAccession().toString() ) ) {
-            showExtDescNodeDataUserSelectedHelperHelper( node.getNodeData().getSequence().getAccession().toString(), sb );
-        }
-        if ( cp.isShowTaxonomyCode() && node.getNodeData().isHasTaxonomy()
-                && !ForesterUtil.isEmpty( node.getNodeData().getTaxonomy().getTaxonomyCode() ) ) {
-            showExtDescNodeDataUserSelectedHelperHelper( node.getNodeData().getTaxonomy().getTaxonomyCode(), sb );
-        }
-        if ( cp.isShowTaxonomyScientificNames() && node.getNodeData().isHasTaxonomy()
-                && !ForesterUtil.isEmpty( node.getNodeData().getTaxonomy().getScientificName() ) ) {
-            showExtDescNodeDataUserSelectedHelperHelper( node.getNodeData().getTaxonomy().getScientificName(), sb );
-        }
-        if ( cp.isShowTaxonomyCommonNames() && node.getNodeData().isHasTaxonomy()
-                && !ForesterUtil.isEmpty( node.getNodeData().getTaxonomy().getCommonName() ) ) {
-            showExtDescNodeDataUserSelectedHelperHelper( node.getNodeData().getTaxonomy().getCommonName(), sb );
-        }
-        if ( ( cp.isShowGeneNames() || cp.isShowGeneSymbols() || cp.isShowSequenceAcc() )
-                && node.getNodeData().isHasSequence()
-                && !ForesterUtil.isEmpty( node.getNodeData().getSequence().getMolecularSequence() ) ) {
-            showExtDescNodeDataUserSelectedHelperHelper( node.getNodeData().getSequence().getMolecularSequence(), sb );
-        }
-        final String s = sb.toString().trim();
-        if ( !ForesterUtil.isEmpty( s ) ) {
-            data.add( s );
-        }
-    }
-
-    public final static void showExtDescNodeDataUserSelectedHelperHelper( final String s, final StringBuilder sb ) {
-        if ( sb.length() > 0 ) {
-            sb.append( "\t" );
-        }
-        sb.append( s );
-    }
-
-    final public static void showInformationMessage( final Component parent, final String title, final String msg ) {
-        JOptionPane.showMessageDialog( parent, msg, title, JOptionPane.INFORMATION_MESSAGE );
-    }
-
     public static void writePhylogenyToGraphicsFile( final File intree,
                                                      final File outfile,
                                                      final int width,
@@ -543,250 +391,12 @@ public final class AptxUtil {
         lookAtSomeTreePropertiesForAptxControlSettings( phy, main_panel.getControlPanel(), configuration );
     }
 
-    final static Color calculateColorFromString( final String str, final boolean is_taxonomy ) {
-        final String my_str = str.toUpperCase();
-        char first = my_str.charAt( 0 );
-        char second = ' ';
-        char third = ' ';
-        if ( my_str.length() > 1 ) {
-            if ( is_taxonomy ) {
-                second = my_str.charAt( 1 );
-            }
-            else {
-                second = my_str.charAt( my_str.length() - 1 );
-            }
-            if ( is_taxonomy ) {
-                if ( my_str.length() > 2 ) {
-                    if ( my_str.indexOf( " " ) > 0 ) {
-                        third = my_str.charAt( my_str.indexOf( " " ) + 1 );
-                    }
-                    else {
-                        third = my_str.charAt( 2 );
-                    }
-                }
-            }
-            else if ( my_str.length() > 2 ) {
-                third = my_str.charAt( ( my_str.length() - 1 ) / 2 );
-            }
-        }
-        first = AptxUtil.normalizeCharForRGB( first );
-        second = AptxUtil.normalizeCharForRGB( second );
-        third = AptxUtil.normalizeCharForRGB( third );
-        if ( ( first > 235 ) && ( second > 235 ) && ( third > 235 ) ) {
-            first = 0;
-        }
-        else if ( ( first < 60 ) && ( second < 60 ) && ( third < 60 ) ) {
-            second = 255;
-        }
-        return new Color( first, second, third );
-    }
-
     // Returns true if the specified format name can be written
     final static boolean canWriteFormat( final String format_name ) {
         final Iterator<ImageWriter> iter = ImageIO.getImageWritersByFormatName( format_name );
         return iter.hasNext();
     }
 
-    final static void collapseSpeciesSpecificSubtrees( final Phylogeny phy ) {
-        boolean inferred = false;
-        for( final PhylogenyNodeIterator it = phy.iteratorPreorder(); it.hasNext(); ) {
-            final PhylogenyNode n = it.next();
-            if ( !n.isExternal() && !n.isCollapse() && ( n.getNumberOfDescendants() > 1 ) ) {
-                final Set<Taxonomy> taxs = obtainDistinctTaxonomies( n );
-                if ( ( taxs != null ) && ( taxs.size() == 1 ) ) {
-                    AptxUtil.collapseSubtree( n, true );
-                    if ( !n.getNodeData().isHasTaxonomy() ) {
-                        n.getNodeData().setTaxonomy( ( Taxonomy ) n.getAllExternalDescendants().get( 0 ).getNodeData()
-                                .getTaxonomy().copy() );
-                    }
-                    inferred = true;
-                }
-                else {
-                    n.setCollapse( false );
-                }
-            }
-        }
-        if ( inferred ) {
-            phy.setRerootable( false );
-        }
-    }
-
-    final static void collapseSubtree( final PhylogenyNode node, final boolean collapse ) {
-        node.setCollapse( collapse );
-        if ( node.isExternal() ) {
-            return;
-        }
-        final PhylogenyNodeIterator it = new PreorderTreeIterator( node );
-        while ( it.hasNext() ) {
-            it.next().setCollapse( collapse );
-        }
-    }
-
-    final static void colorPhylogenyAccordingToConfidenceValues( final Phylogeny tree, final TreePanel tree_panel ) {
-        double max_conf = 0.0;
-        for( final PhylogenyNodeIterator it = tree.iteratorPreorder(); it.hasNext(); ) {
-            final PhylogenyNode n = it.next();
-            n.getBranchData().setBranchColor( null );
-            if ( n.getBranchData().isHasConfidences() ) {
-                final double conf = PhylogenyMethods.getConfidenceValue( n );
-                if ( conf > max_conf ) {
-                    max_conf = conf;
-                }
-            }
-        }
-        if ( max_conf > 0.0 ) {
-            final Color bg = tree_panel.getTreeColorSet().getBackgroundColor();
-            final Color br = tree_panel.getTreeColorSet().getBranchColor();
-            for( final PhylogenyNodeIterator it = tree.iteratorPreorder(); it.hasNext(); ) {
-                final PhylogenyNode n = it.next();
-                if ( n.getBranchData().isHasConfidences() ) {
-                    final double conf = PhylogenyMethods.getConfidenceValue( n );
-                    final BranchColor c = new BranchColor( ForesterUtil.calcColor( conf, 0.0, max_conf, bg, br ) );
-                    colorizeSubtree( n, c );
-                }
-            }
-        }
-    }
-
-    final static void colorPhylogenyAccordingToExternalTaxonomy( final Phylogeny tree, final TreePanel tree_panel ) {
-        for( final PhylogenyNodeIterator it = tree.iteratorPreorder(); it.hasNext(); ) {
-            it.next().getBranchData().setBranchColor( null );
-        }
-        for( final PhylogenyNodeIterator it = tree.iteratorPreorder(); it.hasNext(); ) {
-            final PhylogenyNode n = it.next();
-            if ( !n.getBranchData().isHasBranchColor() ) {
-                final Taxonomy tax = PhylogenyMethods.getExternalDescendantsTaxonomy( n );
-                if ( tax != null ) {
-                    n.getBranchData().setBranchColor( new BranchColor( tree_panel.calculateTaxonomyBasedColor( tax ) ) );
-                    final List<PhylogenyNode> descs = PhylogenyMethods.getAllDescendants( n );
-                    for( final PhylogenyNode desc : descs ) {
-                        desc.getBranchData()
-                                .setBranchColor( new BranchColor( tree_panel.calculateTaxonomyBasedColor( tax ) ) );
-                    }
-                }
-            }
-        }
-    }
-
-    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() ) ) ) {
-                if ( !ForesterUtil.isEmpty( n.getNodeData().getTaxonomy().getRank() )
-                        && n.getNodeData().getTaxonomy().getRank().equalsIgnoreCase( rank ) ) {
-                    final BranchColor c = new BranchColor( tree_panel.calculateTaxonomyBasedColor( n.getNodeData()
-                            .getTaxonomy() ) );
-                    colorizeSubtree( n, c );
-                    ++colorizations;
-                    if ( !ForesterUtil.isEmpty( n.getNodeData().getTaxonomy().getScientificName() ) ) {
-                        true_lineage_to_color_map.put( n.getNodeData().getTaxonomy().getScientificName(), c.getValue() );
-                    }
-                }
-            }
-        }
-        for( final PhylogenyNodeIterator it = tree.iteratorPostorder(); it.hasNext(); ) {
-            final PhylogenyNode node = it.next();
-            if ( ( node.getBranchData().getBranchColor() == null ) && node.getNodeData().isHasTaxonomy()
-                    && !ForesterUtil.isEmpty( node.getNodeData().getTaxonomy().getLineage() ) ) {
-                boolean success = false;
-                if ( !true_lineage_to_color_map.isEmpty() ) {
-                    for( final String lin : node.getNodeData().getTaxonomy().getLineage() ) {
-                        if ( true_lineage_to_color_map.containsKey( lin ) ) {
-                            colorizeSubtree( node, new BranchColor( true_lineage_to_color_map.get( lin ) ) );
-                            ++colorizations;
-                            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 ) ) {
-                            final BranchColor c = new BranchColor( tree_panel.calculateTaxonomyBasedColor( temp_tax ) );
-                            colorizeSubtree( node, c );
-                            ++colorizations;
-                            true_lineage_to_color_map.put( lin, c.getValue() );
-                            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() );
-                                if ( up.getRank().equalsIgnoreCase( rank ) ) {
-                                    final BranchColor c = new BranchColor( tree_panel.calculateTaxonomyBasedColor( temp_tax ) );
-                                    colorizeSubtree( node, c );
-                                    ++colorizations;
-                                    true_lineage_to_color_map.put( lin, c.getValue() );
-                                    break;
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        return colorizations;
-    }
-
-    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();
-            if ( !m.containsKey( ref_source ) ) {
-                m.put( ref_source, new ArrayList<Annotation>() );
-            }
-            m.get( ref_source ).add( an );
-        }
-        final StringBuilder sb = new StringBuilder();
-        for( final Entry<String, List<Annotation>> e : m.entrySet() ) {
-            final String ref_source = e.getKey();
-            final List<Annotation> ans = e.getValue();
-            if ( m.size() > 1 ) {
-                sb.append( "[" );
-            }
-            if ( show_ref_sources && !ref_source.equals( "?" ) ) {
-                sb.append( ref_source );
-                sb.append( ": " );
-            }
-            for( int i = 0; i < ans.size(); ++i ) {
-                final Annotation an = ans.get( i );
-                if ( !ForesterUtil.isEmpty( an.getRefValue() ) ) {
-                    sb.append( an.getRefValue() );
-                    sb.append( " " );
-                }
-                if ( !ForesterUtil.isEmpty( an.getDesc() ) ) {
-                    sb.append( an.getDesc() );
-                }
-                if ( sb.charAt( sb.length() - 1 ) == ' ' ) {
-                    sb.deleteCharAt( sb.length() - 1 );
-                }
-                if ( i < ans.size() - 1 ) {
-                    sb.append( ", " );
-                }
-            }
-            if ( m.size() > 1 ) {
-                sb.append( "] " );
-            }
-        }
-        return sb.toString();
-    }
-
     final static String createBasicInformation( final Phylogeny phy ) {
         final StringBuilder desc = new StringBuilder();
         if ( ( phy != null ) && !phy.isEmpty() ) {
@@ -973,16 +583,6 @@ public final class AptxUtil {
         return AVAILABLE_FONT_FAMILIES_SORTED;
     }
 
-    final static boolean isHasAssignedEvent( final PhylogenyNode node ) {
-        if ( !node.getNodeData().isHasEvent() ) {
-            return false;
-        }
-        if ( ( node.getNodeData().getEvent() ).isUnassigned() ) {
-            return false;
-        }
-        return true;
-    }
-
     final static boolean isUsOrCanada() {
         try {
             if ( ( Locale.getDefault().equals( Locale.CANADA ) ) || ( Locale.getDefault().equals( Locale.US ) ) ) {
@@ -1316,22 +916,6 @@ public final class AptxUtil {
         writer.write( null, iio_image, image_write_param );
     }
 
-    private 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 ) {
-            desc.getBranchData().setBranchColor( c );
-        }
-    }
-
-    final private static char normalizeCharForRGB( char c ) {
-        c -= 65;
-        c *= 10.2;
-        c = c > 255 ? 255 : c;
-        c = c < 0 ? 0 : c;
-        return c;
-    }
-
     final private static void openUrlInWebBrowser( final String url ) throws IOException, ClassNotFoundException,
             SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException,
             InvocationTargetException, InterruptedException {
index a81370a..087f8e1 100644 (file)
@@ -160,7 +160,7 @@ public final class Configuration {
     String                                  default_config_filename                                = Constants.DEFAULT_CONFIGURATION_FILE_NAME;
     final static String                     display_options[][]                                    = {
             { "Phylogram", "display", "?" }, { "Node Name", "display", "yes" }, { "Taxonomy Code", "display", "yes" },
-            { "Annotation", "nodisplay", "no" }, { "Confidence Values", "display", "?" },
+            { "Seq Annotations", "nodisplay", "no" }, { "Confidence Values", "display", "?" },
             { "Node Events", "display", "?" }, { "Taxonomy Colorize", "display", "yes" },
             { "Colorize Branches", "display", "no" }, { "Use Branch-Widths", "display", "no" },
             { "Show Custom Nodes", "display", "yes" }, { "Domains", "nodisplay", "no" },
index 9f2eb80..856163c 100644 (file)
@@ -42,8 +42,8 @@ public final class Constants {
     public final static boolean __SYNTH_LF                                                    = false;                                                               // TODO remove me
     public final static boolean ALLOW_DDBJ_BLAST                                              = false;
     public final static String  PRG_NAME                                                      = "Archaeopteryx";
-    final static String         VERSION                                                       = "0.9814";
-    final static String         PRG_DATE                                                      = "130916";
+    final static String         VERSION                                                       = "0.9815 PP";
+    final static String         PRG_DATE                                                      = "130924";
     final static String         DEFAULT_CONFIGURATION_FILE_NAME                               = "_aptx_configuration_file";
     final static String[]       DEFAULT_FONT_CHOICES                                          = { "Arial", "Helvetica",
             "Verdana", "Tahoma", "Dialog", "Lucida Sans", "SansSerif", "Sans-serif", "Sans"  };
index 978b132..3ad3935 100644 (file)
@@ -620,8 +620,8 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                 if ( getControlPanel().isShowAnnotation()
                         && ( node.getNodeData().getSequence().getAnnotations() != null )
                         && !node.getNodeData().getSequence().getAnnotations().isEmpty() ) {
-                    sum += getTreeFontSet()._fm_large.stringWidth( AptxUtil.createAnnotationString( node.getNodeData()
-                            .getSequence().getAnnotations(), getOptions().isShowAnnotationRefSource() )
+                    sum += getTreeFontSet()._fm_large.stringWidth( TreePanelUtil.createAnnotationString( node
+                            .getNodeData().getSequence().getAnnotations(), getOptions().isShowAnnotationRefSource() )
                             + " " );
                 }
                 if ( getControlPanel().isShowDomainArchitectures()
@@ -711,11 +711,11 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         }
         if ( c == null ) {
             if ( !ForesterUtil.isEmpty( tax.getTaxonomyCode() ) ) {
-                c = AptxUtil.calculateColorFromString( tax.getTaxonomyCode(), true );
+                c = TreePanelUtil.calculateColorFromString( tax.getTaxonomyCode(), true );
                 getControlPanel().getSpeciesColors().put( tax.getTaxonomyCode(), c );
             }
             else {
-                c = AptxUtil.calculateColorFromString( tax.getScientificName(), true );
+                c = TreePanelUtil.calculateColorFromString( tax.getScientificName(), true );
                 getControlPanel().getSpeciesColors().put( tax.getScientificName(), c );
             }
         }
@@ -801,7 +801,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         }
         if ( !node.isExternal() && !node.isRoot() ) {
             final boolean collapse = !node.isCollapse();
-            AptxUtil.collapseSubtree( node, collapse );
+            TreePanelUtil.collapseSubtree( node, collapse );
             updateSetOfCollapsedExternalNodes();
             _phylogeny.recalculateNumberOfExternalDescendants( true );
             resetNodeIdToDistToLeafMap();
@@ -820,7 +820,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
             return;
         }
         setWaitCursor();
-        AptxUtil.collapseSpeciesSpecificSubtrees( _phylogeny );
+        TreePanelUtil.collapseSpeciesSpecificSubtrees( _phylogeny );
         updateSetOfCollapsedExternalNodes();
         _phylogeny.recalculateNumberOfExternalDescendants( true );
         resetNodeIdToDistToLeafMap();
@@ -838,7 +838,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         }
         setWaitCursor();
         AptxUtil.removeBranchColors( _phylogeny );
-        final int colorizations = AptxUtil.colorPhylogenyAccordingToRanks( _phylogeny, rank, this );
+        final int colorizations = TreePanelUtil.colorPhylogenyAccordingToRanks( _phylogeny, rank, this );
         if ( colorizations > 0 ) {
             _control_panel.setColorBranches( true );
             if ( _control_panel.getColorBranchesCb() != null ) {
@@ -884,7 +884,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         }
         setWaitCursor();
         AptxUtil.removeBranchColors( _phylogeny );
-        AptxUtil.colorPhylogenyAccordingToConfidenceValues( _phylogeny, this );
+        TreePanelUtil.colorPhylogenyAccordingToConfidenceValues( _phylogeny, this );
         _control_panel.setColorBranches( true );
         if ( _control_panel.getColorBranchesCb() != null ) {
             _control_panel.getColorBranchesCb().setSelected( true );
@@ -1974,7 +1974,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
             _sub_phylogenies[ _subtree_index ] = _phylogeny;
             _sub_phylogenies_temp_roots[ _subtree_index ] = node;
             ++_subtree_index;
-            _phylogeny = subTree( node, _phylogeny );
+            _phylogeny = TreePanelUtil.subTree( node, _phylogeny );
             updateSubSuperTreeButton();
         }
         else if ( node.isRoot() && isCurrentTreeIsSubtree() ) {
@@ -2024,7 +2024,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
             return;
         }
         setWaitCursor();
-        AptxUtil.colorPhylogenyAccordingToExternalTaxonomy( _phylogeny, this );
+        TreePanelUtil.colorPhylogenyAccordingToExternalTaxonomy( _phylogeny, this );
         _control_panel.setColorBranches( true );
         if ( _control_panel.getColorBranchesCb() != null ) {
             _control_panel.getColorBranchesCb().setSelected( true );
@@ -2340,7 +2340,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
             if ( !ForesterUtil.isEmpty( ann_str ) ) {
                 c = getControlPanel().getAnnotationColors().get( ann_str );
                 if ( c == null ) {
-                    c = AptxUtil.calculateColorFromString( ann_str, false );
+                    c = TreePanelUtil.calculateColorFromString( ann_str, false );
                     getControlPanel().getAnnotationColors().put( ann_str, c );
                 }
                 if ( c == null ) {
@@ -2373,42 +2373,48 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                                        JOptionPane.WARNING_MESSAGE );
     }
 
-    final private void colorizeSubtree( final Color c, final PhylogenyNode node ) {
-        if ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.UNROOTED ) {
-            JOptionPane.showMessageDialog( this,
-                                           "Cannot colorize subtree in unrooted display type",
-                                           "Attempt to colorize subtree in unrooted display",
-                                           JOptionPane.WARNING_MESSAGE );
-            return;
-        }
+    final private void colorizeSubtree( final Color c,
+                                        final PhylogenyNode node,
+                                        final List<PhylogenyNode> additional_nodes ) {
         _control_panel.setColorBranches( true );
         if ( _control_panel.getColorBranchesCb() != null ) {
             _control_panel.getColorBranchesCb().setSelected( true );
         }
-        for( final PreorderTreeIterator it = new PreorderTreeIterator( node ); it.hasNext(); ) {
-            it.next().getBranchData().setBranchColor( new BranchColor( c ) );
+        if ( node != null ) {
+            for( final PreorderTreeIterator it = new PreorderTreeIterator( node ); it.hasNext(); ) {
+                it.next().getBranchData().setBranchColor( new BranchColor( c ) );
+            }
+        }
+        if ( additional_nodes != null ) {
+            for( final PhylogenyNode n : additional_nodes ) {
+                n.getBranchData().setBranchColor( new BranchColor( c ) );
+            }
         }
         repaint();
     }
 
     final private void colorSubtree( final PhylogenyNode node ) {
-        Color intitial_color = null;
-        if ( getControlPanel().isColorBranches() && ( PhylogenyMethods.getBranchColorValue( node ) != null )
-                && ( ( ( !node.isRoot() && ( node.getParent().getNumberOfDescendants() < 3 ) ) ) || ( node.isRoot() ) ) ) {
-            intitial_color = PhylogenyMethods.getBranchColorValue( node );
+        if ( getPhylogenyGraphicsType() == PHYLOGENY_GRAPHICS_TYPE.UNROOTED ) {
+            JOptionPane.showMessageDialog( this,
+                                           "Cannot colorize subtree in unrooted display type",
+                                           "Attempt to colorize subtree in unrooted display",
+                                           JOptionPane.WARNING_MESSAGE );
+            return;
+        }
+        _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 ) );
+            }
+            al = new SubtreeColorizationActionListener( _color_chooser, node, additional_nodes );
         }
         else {
-            intitial_color = getTreeColorSet().getBranchColor();
+            al = new SubtreeColorizationActionListener( _color_chooser, node );
         }
-        _color_chooser.setColor( intitial_color );
-        _color_chooser.setPreviewPanel( new JPanel() );
         final JDialog dialog = JColorChooser
-                .createDialog( this,
-                               "Subtree colorization",
-                               true,
-                               _color_chooser,
-                               new SubtreeColorizationActionListener( _color_chooser, node ),
-                               null );
+                .createDialog( this, "Subtree colorization", true, _color_chooser, al, null );
         dialog.setVisible( true );
     }
 
@@ -3245,7 +3251,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
             cannotOpenBrowserWarningMessage( "sequence" );
             return;
         }
-        final String uri_str = AptxUtil.createUriForSeqWeb( node, getConfiguration(), this );
+        final String uri_str = TreePanelUtil.createUriForSeqWeb( node, getConfiguration(), this );
         if ( !ForesterUtil.isEmpty( uri_str ) ) {
             try {
                 AptxUtil.launchWebBrowser( new URI( uri_str ),
@@ -3812,7 +3818,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
             if ( ( to_pdf || to_graphics_file ) && getOptions().isPrintBlackAndWhite() ) {
                 outline_color = Color.BLACK;
             }
-            else if ( getControlPanel().isEvents() && AptxUtil.isHasAssignedEvent( node ) ) {
+            else if ( getControlPanel().isEvents() && TreePanelUtil.isHasAssignedEvent( node ) ) {
                 final Event event = node.getNodeData().getEvent();
                 if ( event.isDuplication() ) {
                     outline_color = getTreeColorSet().getDuplicationBoxColor();
@@ -4095,7 +4101,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
             else if ( getControlPanel().isColorAccordingToAnnotation() ) {
                 g.setColor( calculateColorForAnnotation( ann ) );
             }
-            final String ann_str = AptxUtil.createAnnotationString( ann, getOptions().isShowAnnotationRefSource() );
+            final String ann_str = TreePanelUtil.createAnnotationString( ann, getOptions().isShowAnnotationRefSource() );
             TreePanel.drawString( ann_str, node.getXcoord() + x + 3 + half_box_size, node.getYcoord()
                     + ( getTreeFontSet()._fm_large.getAscent() / down_shift_factor ), g );
             _sb.setLength( 0 );
@@ -4488,7 +4494,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                         if ( getControlPanel().isShowAnnotation()
                                 && ( node.getNodeData().getSequence().getAnnotations() != null )
                                 && ( !node.getNodeData().getSequence().getAnnotations().isEmpty() ) ) {
-                            x += getTreeFontSet()._fm_large.stringWidth( AptxUtil.createAnnotationString( node
+                            x += getTreeFontSet()._fm_large.stringWidth( TreePanelUtil.createAnnotationString( node
                                     .getNodeData().getSequence().getAnnotations(), getOptions()
                                     .isShowAnnotationRefSource() )
                                     + " " );
@@ -4950,11 +4956,11 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                 sb.append( " " );
             }
             final Property p = properties.getProperty( ref );
-            sb.append( getPartAfterColon( p.getRef() ) );
+            sb.append( TreePanelUtil.getPartAfterColon( p.getRef() ) );
             sb.append( "=" );
             sb.append( p.getValue() );
             if ( !ForesterUtil.isEmpty( p.getUnit() ) ) {
-                sb.append( getPartAfterColon( p.getUnit() ) );
+                sb.append( TreePanelUtil.getPartAfterColon( p.getUnit() ) );
             }
         }
         return sb;
@@ -5159,7 +5165,7 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                     }
                     break;
                 case UNKNOWN:
-                    AptxUtil.showExtDescNodeDataUserSelectedHelper( getControlPanel(), n, data );
+                    TreePanelUtil.showExtDescNodeDataUserSelectedHelper( getControlPanel(), n, data );
                     break;
                 default:
                     throw new IllegalArgumentException( "unknown data element: "
@@ -5182,9 +5188,8 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         }
         else if ( getConfiguration().getExtNodeDataReturnOn() == EXT_NODE_DATA_RETURN_ON.WINODW ) {
             if ( sb.length() < 1 ) {
-                AptxUtil.showInformationMessage( this,
-                                                 "No Appropriate Data (" + obtainTitleForExtDescNodeData() + ")",
-                                                 "Descendants of selected node do not contain selected data" );
+                TreePanelUtil.showInformationMessage( this, "No Appropriate Data (" + obtainTitleForExtDescNodeData()
+                        + ")", "Descendants of selected node do not contain selected data" );
                 clearCurrentExternalNodesDataBuffer();
             }
             else {
@@ -5254,17 +5259,19 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
     final private void showNodeDataPopup( final MouseEvent e, final PhylogenyNode node ) {
         try {
             if ( ( node.getName().length() > 0 )
-                    || ( node.getNodeData().isHasTaxonomy() && !isTaxonomyEmpty( node.getNodeData().getTaxonomy() ) )
-                    || ( node.getNodeData().isHasSequence() && !isSequenceEmpty( node.getNodeData().getSequence() ) )
-                    || ( node.getNodeData().isHasDate() ) || ( node.getNodeData().isHasDistribution() )
-                    || node.getBranchData().isHasConfidences() ) {
+                    || ( node.getNodeData().isHasTaxonomy() && !TreePanelUtil.isTaxonomyEmpty( node.getNodeData()
+                            .getTaxonomy() ) )
+                    || ( node.getNodeData().isHasSequence() && !TreePanelUtil.isSequenceEmpty( node.getNodeData()
+                            .getSequence() ) ) || ( node.getNodeData().isHasDate() )
+                    || ( node.getNodeData().isHasDistribution() ) || node.getBranchData().isHasConfidences() ) {
                 _popup_buffer.setLength( 0 );
                 short lines = 0;
                 if ( node.getName().length() > 0 ) {
                     lines++;
                     _popup_buffer.append( node.getName() );
                 }
-                if ( node.getNodeData().isHasTaxonomy() && !isTaxonomyEmpty( node.getNodeData().getTaxonomy() ) ) {
+                if ( node.getNodeData().isHasTaxonomy()
+                        && !TreePanelUtil.isTaxonomyEmpty( node.getNodeData().getTaxonomy() ) ) {
                     lines++;
                     boolean enc_data = false;
                     final Taxonomy tax = node.getNodeData().getTaxonomy();
@@ -5346,7 +5353,8 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                         }
                     }
                 }
-                if ( node.getNodeData().isHasSequence() && !isSequenceEmpty( node.getNodeData().getSequence() ) ) {
+                if ( node.getNodeData().isHasSequence()
+                        && !TreePanelUtil.isSequenceEmpty( node.getNodeData().getSequence() ) ) {
                     lines++;
                     boolean enc_data = false;
                     if ( _popup_buffer.length() > 0 ) {
@@ -5425,11 +5433,11 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
                     for( final String ref : properties.getPropertyRefs() ) {
                         _popup_buffer.append( "\n" );
                         final Property p = properties.getProperty( ref );
-                        _popup_buffer.append( getPartAfterColon( p.getRef() ) );
+                        _popup_buffer.append( TreePanelUtil.getPartAfterColon( p.getRef() ) );
                         _popup_buffer.append( "=" );
                         _popup_buffer.append( p.getValue() );
                         if ( !ForesterUtil.isEmpty( p.getUnit() ) ) {
-                            _popup_buffer.append( getPartAfterColon( p.getUnit() ) );
+                            _popup_buffer.append( TreePanelUtil.getPartAfterColon( p.getUnit() ) );
                         }
                     }
                 }
@@ -5549,70 +5557,39 @@ public final class TreePanel extends JPanel implements ActionListener, MouseWhee
         }
     }
 
-    final private static void drawString( final int i, final double x, final double y, final Graphics2D g ) {
-        g.drawString( String.valueOf( i ), ( int ) ( x + 0.5 ), ( int ) ( y + 0.5 ) );
-    }
-
     final private static void drawString( final String str, final double x, final double y, final Graphics2D g ) {
         g.drawString( str, ( int ) ( x + 0.5 ), ( int ) ( y + 0.5 ) );
     }
 
-    final private static String getPartAfterColon( final String s ) {
-        final int i = s.indexOf( ':' );
-        if ( ( i < 1 ) || ( i == ( s.length() - 1 ) ) ) {
-            return s;
-        }
-        return s.substring( i + 1, s.length() );
-    }
-
-    final private static boolean isSequenceEmpty( final Sequence seq ) {
-        return ( seq.getAccession() == null ) && ForesterUtil.isEmpty( seq.getName() )
-                && ForesterUtil.isEmpty( seq.getSymbol() );
-    }
-
-    final private 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() );
-    }
-
     final private static boolean plusPressed( final int key_code ) {
         return ( ( key_code == KeyEvent.VK_ADD ) || ( key_code == KeyEvent.VK_PLUS )
                 || ( key_code == KeyEvent.VK_EQUALS ) || ( key_code == KeyEvent.VK_SEMICOLON ) || ( key_code == KeyEvent.VK_1 ) );
     }
 
-    final private static Phylogeny subTree( final PhylogenyNode new_root, final Phylogeny source_phy ) {
-        final Phylogeny new_phy = new Phylogeny();
-        new_phy.setRooted( true );
-        new_phy.setName( source_phy.getName() );
-        new_phy.setDescription( source_phy.getDescription() );
-        new_phy.setType( source_phy.getType() );
-        new_phy.setDistanceUnit( source_phy.getDistanceUnit() );
-        new_phy.setConfidence( source_phy.getConfidence() );
-        new_phy.setIdentifier( source_phy.getIdentifier() );
-        new_phy.setRoot( new_root.copyNodeDataShallow() );
-        int i = 0;
-        for( final PhylogenyNode n : new_root.getDescendants() ) {
-            new_phy.getRoot().setChildNode( i++, n );
-        }
-        return new_phy;
-    }
-
     final private class SubtreeColorizationActionListener implements ActionListener {
 
-        JColorChooser _chooser;
-        PhylogenyNode _node;
+        JColorChooser       _chooser          = null;
+        PhylogenyNode       _node             = null;
+        List<PhylogenyNode> _additional_nodes = null;
 
         SubtreeColorizationActionListener( final JColorChooser chooser, final PhylogenyNode node ) {
             _chooser = chooser;
             _node = node;
         }
 
+        SubtreeColorizationActionListener( final JColorChooser chooser,
+                                           final PhylogenyNode node,
+                                           final List<PhylogenyNode> additional_nodes ) {
+            _chooser = chooser;
+            _node = node;
+            _additional_nodes = additional_nodes;
+        }
+
         @Override
         public void actionPerformed( final ActionEvent e ) {
             final Color c = _chooser.getColor();
             if ( c != null ) {
-                colorizeSubtree( c, _node );
+                colorizeSubtree( c, _node, _additional_nodes );
             }
         }
     }
diff --git a/forester/java/src/org/forester/archaeopteryx/TreePanelUtil.java b/forester/java/src/org/forester/archaeopteryx/TreePanelUtil.java
new file mode 100644 (file)
index 0000000..082efa9
--- /dev/null
@@ -0,0 +1,480 @@
+
+package org.forester.archaeopteryx;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.SortedMap;
+import java.util.SortedSet;
+import java.util.TreeMap;
+
+import javax.swing.JOptionPane;
+
+import org.forester.analysis.TaxonomyDataManager;
+import org.forester.phylogeny.Phylogeny;
+import org.forester.phylogeny.PhylogenyMethods;
+import org.forester.phylogeny.PhylogenyNode;
+import org.forester.phylogeny.data.Annotation;
+import org.forester.phylogeny.data.BranchColor;
+import org.forester.phylogeny.data.Sequence;
+import org.forester.phylogeny.data.Taxonomy;
+import org.forester.phylogeny.iterators.PhylogenyNodeIterator;
+import org.forester.phylogeny.iterators.PreorderTreeIterator;
+import org.forester.util.ForesterConstants;
+import org.forester.util.ForesterUtil;
+import org.forester.util.SequenceIdParser;
+import org.forester.ws.seqdb.UniProtTaxonomy;
+
+public class TreePanelUtil {
+
+    public final static String createUriForSeqWeb( final PhylogenyNode node,
+                                                   final Configuration conf,
+                                                   final TreePanel tp ) {
+        String uri_str = null;
+        final String upkb = ForesterUtil.extractUniProtKbProteinSeqIdentifier( node );
+        if ( !ForesterUtil.isEmpty( upkb ) ) {
+            try {
+                uri_str = ForesterUtil.UNIPROT_KB + URLEncoder.encode( upkb, ForesterConstants.UTF8 );
+            }
+            catch ( final UnsupportedEncodingException e ) {
+                AptxUtil.showErrorMessage( tp, e.toString() );
+                e.printStackTrace();
+            }
+        }
+        if ( ForesterUtil.isEmpty( uri_str ) ) {
+            final String v = ForesterUtil.extractGenbankAccessor( node );
+            if ( !ForesterUtil.isEmpty( v ) ) {
+                try {
+                    if ( SequenceIdParser.isProtein( v ) ) {
+                        uri_str = ForesterUtil.NCBI_PROTEIN + URLEncoder.encode( v, ForesterConstants.UTF8 );
+                    }
+                    else {
+                        uri_str = ForesterUtil.NCBI_NUCCORE + URLEncoder.encode( v, ForesterConstants.UTF8 );
+                    }
+                }
+                catch ( final UnsupportedEncodingException e ) {
+                    AptxUtil.showErrorMessage( tp, e.toString() );
+                    e.printStackTrace();
+                }
+            }
+        }
+        if ( ForesterUtil.isEmpty( uri_str ) ) {
+            final String v = ForesterUtil.extractRefSeqAccessorAccessor( node );
+            if ( !ForesterUtil.isEmpty( v ) ) {
+                try {
+                    if ( SequenceIdParser.isProtein( v ) ) {
+                        uri_str = ForesterUtil.NCBI_PROTEIN + URLEncoder.encode( v, ForesterConstants.UTF8 );
+                    }
+                    else {
+                        uri_str = ForesterUtil.NCBI_NUCCORE + URLEncoder.encode( v, ForesterConstants.UTF8 );
+                    }
+                }
+                catch ( final UnsupportedEncodingException e ) {
+                    AptxUtil.showErrorMessage( tp, e.toString() );
+                    e.printStackTrace();
+                }
+            }
+        }
+        if ( ForesterUtil.isEmpty( uri_str ) ) {
+            final String v = ForesterUtil.extractGInumber( node );
+            if ( !ForesterUtil.isEmpty( v ) ) {
+                try {
+                    uri_str = ForesterUtil.NCBI_GI + URLEncoder.encode( v, ForesterConstants.UTF8 );
+                }
+                catch ( final UnsupportedEncodingException e ) {
+                    AptxUtil.showErrorMessage( tp, e.toString() );
+                    e.printStackTrace();
+                }
+            }
+        }
+        return uri_str;
+    }
+
+    /**
+     * Returns the set of distinct taxonomies of
+     * 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();
+        final Set<Taxonomy> tax_set = new HashSet<Taxonomy>();
+        for( final PhylogenyNode n : descs ) {
+            if ( !n.getNodeData().isHasTaxonomy() || n.getNodeData().getTaxonomy().isEmpty() ) {
+                return null;
+            }
+            tax_set.add( n.getNodeData().getTaxonomy() );
+        }
+        return tax_set;
+    }
+
+    public final static void showExtDescNodeDataUserSelectedHelper( final ControlPanel cp,
+                                                                    final PhylogenyNode node,
+                                                                    final List<String> data ) {
+        final StringBuilder sb = new StringBuilder();
+        if ( cp.isShowNodeNames() && !ForesterUtil.isEmpty( node.getName() ) ) {
+            TreePanelUtil.showExtDescNodeDataUserSelectedHelperHelper( node.getName(), sb );
+        }
+        if ( cp.isShowGeneNames() && node.getNodeData().isHasSequence()
+                && !ForesterUtil.isEmpty( node.getNodeData().getSequence().getName() ) ) {
+            TreePanelUtil.showExtDescNodeDataUserSelectedHelperHelper( node.getNodeData().getSequence().getName(), sb );
+        }
+        if ( cp.isShowGeneSymbols() && node.getNodeData().isHasSequence()
+                && !ForesterUtil.isEmpty( node.getNodeData().getSequence().getSymbol() ) ) {
+            TreePanelUtil
+                    .showExtDescNodeDataUserSelectedHelperHelper( node.getNodeData().getSequence().getSymbol(), sb );
+        }
+        if ( cp.isShowSequenceAcc() && node.getNodeData().isHasSequence()
+                && ( node.getNodeData().getSequence().getAccession() != null )
+                && !ForesterUtil.isEmpty( node.getNodeData().getSequence().getAccession().toString() ) ) {
+            TreePanelUtil.showExtDescNodeDataUserSelectedHelperHelper( node.getNodeData().getSequence().getAccession()
+                    .toString(), sb );
+        }
+        if ( cp.isShowTaxonomyCode() && node.getNodeData().isHasTaxonomy()
+                && !ForesterUtil.isEmpty( node.getNodeData().getTaxonomy().getTaxonomyCode() ) ) {
+            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 );
+        }
+        if ( cp.isShowTaxonomyCommonNames() && node.getNodeData().isHasTaxonomy()
+                && !ForesterUtil.isEmpty( node.getNodeData().getTaxonomy().getCommonName() ) ) {
+            TreePanelUtil
+                    .showExtDescNodeDataUserSelectedHelperHelper( node.getNodeData().getTaxonomy().getCommonName(), sb );
+        }
+        if ( ( cp.isShowGeneNames() || cp.isShowGeneSymbols() || 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 );
+        }
+    }
+
+    public final static void showExtDescNodeDataUserSelectedHelperHelper( final String s, final StringBuilder sb ) {
+        if ( sb.length() > 0 ) {
+            sb.append( "\t" );
+        }
+        sb.append( s );
+    }
+
+    final public static void showInformationMessage( final Component parent, final String title, final String msg ) {
+        JOptionPane.showMessageDialog( parent, msg, title, JOptionPane.INFORMATION_MESSAGE );
+    }
+
+    final static Color calculateColorFromString( final String str, final boolean is_taxonomy ) {
+        final String my_str = str.toUpperCase();
+        char first = my_str.charAt( 0 );
+        char second = ' ';
+        char third = ' ';
+        if ( my_str.length() > 1 ) {
+            if ( is_taxonomy ) {
+                second = my_str.charAt( 1 );
+            }
+            else {
+                second = my_str.charAt( my_str.length() - 1 );
+            }
+            if ( is_taxonomy ) {
+                if ( my_str.length() > 2 ) {
+                    if ( my_str.indexOf( " " ) > 0 ) {
+                        third = my_str.charAt( my_str.indexOf( " " ) + 1 );
+                    }
+                    else {
+                        third = my_str.charAt( 2 );
+                    }
+                }
+            }
+            else if ( my_str.length() > 2 ) {
+                third = my_str.charAt( ( my_str.length() - 1 ) / 2 );
+            }
+        }
+        first = TreePanelUtil.normalizeCharForRGB( first );
+        second = TreePanelUtil.normalizeCharForRGB( second );
+        third = TreePanelUtil.normalizeCharForRGB( third );
+        if ( ( first > 235 ) && ( second > 235 ) && ( third > 235 ) ) {
+            first = 0;
+        }
+        else if ( ( first < 60 ) && ( second < 60 ) && ( third < 60 ) ) {
+            second = 255;
+        }
+        return new Color( first, second, third );
+    }
+
+    final static void collapseSpeciesSpecificSubtrees( final Phylogeny phy ) {
+        boolean inferred = false;
+        for( final PhylogenyNodeIterator it = phy.iteratorPreorder(); it.hasNext(); ) {
+            final PhylogenyNode n = it.next();
+            if ( !n.isExternal() && !n.isCollapse() && ( n.getNumberOfDescendants() > 1 ) ) {
+                final Set<Taxonomy> taxs = TreePanelUtil.obtainDistinctTaxonomies( n );
+                if ( ( taxs != null ) && ( taxs.size() == 1 ) ) {
+                    TreePanelUtil.collapseSubtree( n, true );
+                    if ( !n.getNodeData().isHasTaxonomy() ) {
+                        n.getNodeData().setTaxonomy( ( Taxonomy ) n.getAllExternalDescendants().get( 0 ).getNodeData()
+                                .getTaxonomy().copy() );
+                    }
+                    inferred = true;
+                }
+                else {
+                    n.setCollapse( false );
+                }
+            }
+        }
+        if ( inferred ) {
+            phy.setRerootable( false );
+        }
+    }
+
+    final static void collapseSubtree( final PhylogenyNode node, final boolean collapse ) {
+        node.setCollapse( collapse );
+        if ( node.isExternal() ) {
+            return;
+        }
+        final PhylogenyNodeIterator it = new PreorderTreeIterator( node );
+        while ( it.hasNext() ) {
+            it.next().setCollapse( collapse );
+        }
+    }
+
+    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 ) {
+            desc.getBranchData().setBranchColor( c );
+        }
+    }
+
+    final static void colorPhylogenyAccordingToConfidenceValues( final Phylogeny tree, final TreePanel tree_panel ) {
+        double max_conf = 0.0;
+        for( final PhylogenyNodeIterator it = tree.iteratorPreorder(); it.hasNext(); ) {
+            final PhylogenyNode n = it.next();
+            n.getBranchData().setBranchColor( null );
+            if ( n.getBranchData().isHasConfidences() ) {
+                final double conf = PhylogenyMethods.getConfidenceValue( n );
+                if ( conf > max_conf ) {
+                    max_conf = conf;
+                }
+            }
+        }
+        if ( max_conf > 0.0 ) {
+            final Color bg = tree_panel.getTreeColorSet().getBackgroundColor();
+            final Color br = tree_panel.getTreeColorSet().getBranchColor();
+            for( final PhylogenyNodeIterator it = tree.iteratorPreorder(); it.hasNext(); ) {
+                final PhylogenyNode n = it.next();
+                if ( n.getBranchData().isHasConfidences() ) {
+                    final double conf = PhylogenyMethods.getConfidenceValue( n );
+                    final BranchColor c = new BranchColor( ForesterUtil.calcColor( conf, 0.0, max_conf, bg, br ) );
+                    TreePanelUtil.colorizeSubtree( n, c );
+                }
+            }
+        }
+    }
+
+    final static void colorPhylogenyAccordingToExternalTaxonomy( final Phylogeny tree, final TreePanel tree_panel ) {
+        for( final PhylogenyNodeIterator it = tree.iteratorPreorder(); it.hasNext(); ) {
+            it.next().getBranchData().setBranchColor( null );
+        }
+        for( final PhylogenyNodeIterator it = tree.iteratorPreorder(); it.hasNext(); ) {
+            final PhylogenyNode n = it.next();
+            if ( !n.getBranchData().isHasBranchColor() ) {
+                final Taxonomy tax = PhylogenyMethods.getExternalDescendantsTaxonomy( n );
+                if ( tax != null ) {
+                    n.getBranchData().setBranchColor( new BranchColor( tree_panel.calculateTaxonomyBasedColor( tax ) ) );
+                    final List<PhylogenyNode> descs = PhylogenyMethods.getAllDescendants( n );
+                    for( final PhylogenyNode desc : descs ) {
+                        desc.getBranchData()
+                                .setBranchColor( new BranchColor( tree_panel.calculateTaxonomyBasedColor( tax ) ) );
+                    }
+                }
+            }
+        }
+    }
+
+    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() ) ) ) {
+                if ( !ForesterUtil.isEmpty( n.getNodeData().getTaxonomy().getRank() )
+                        && n.getNodeData().getTaxonomy().getRank().equalsIgnoreCase( rank ) ) {
+                    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() );
+                    }
+                }
+            }
+        }
+        for( final PhylogenyNodeIterator it = tree.iteratorPostorder(); it.hasNext(); ) {
+            final PhylogenyNode node = it.next();
+            if ( ( node.getBranchData().getBranchColor() == null ) && node.getNodeData().isHasTaxonomy()
+                    && !ForesterUtil.isEmpty( node.getNodeData().getTaxonomy().getLineage() ) ) {
+                boolean success = false;
+                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 ) ) );
+                            ++colorizations;
+                            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 ) ) {
+                            final BranchColor c = new BranchColor( tree_panel.calculateTaxonomyBasedColor( temp_tax ) );
+                            TreePanelUtil.colorizeSubtree( node, c );
+                            ++colorizations;
+                            true_lineage_to_color_map.put( lin, c.getValue() );
+                            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() );
+                                if ( up.getRank().equalsIgnoreCase( rank ) ) {
+                                    final BranchColor c = new BranchColor( tree_panel.calculateTaxonomyBasedColor( temp_tax ) );
+                                    TreePanelUtil.colorizeSubtree( node, c );
+                                    ++colorizations;
+                                    true_lineage_to_color_map.put( lin, c.getValue() );
+                                    break;
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return colorizations;
+    }
+
+    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();
+            if ( !m.containsKey( ref_source ) ) {
+                m.put( ref_source, new ArrayList<Annotation>() );
+            }
+            m.get( ref_source ).add( an );
+        }
+        final StringBuilder sb = new StringBuilder();
+        for( final Entry<String, List<Annotation>> e : m.entrySet() ) {
+            final String ref_source = e.getKey();
+            final List<Annotation> ans = e.getValue();
+            if ( m.size() > 1 ) {
+                sb.append( "[" );
+            }
+            if ( show_ref_sources && !ref_source.equals( "?" ) ) {
+                sb.append( ref_source );
+                sb.append( ": " );
+            }
+            for( int i = 0; i < ans.size(); ++i ) {
+                final Annotation an = ans.get( i );
+                if ( !ForesterUtil.isEmpty( an.getRefValue() ) ) {
+                    sb.append( an.getRefValue() );
+                    sb.append( " " );
+                }
+                if ( !ForesterUtil.isEmpty( an.getDesc() ) ) {
+                    sb.append( an.getDesc() );
+                }
+                if ( sb.charAt( sb.length() - 1 ) == ' ' ) {
+                    sb.deleteCharAt( sb.length() - 1 );
+                }
+                if ( i < ans.size() - 1 ) {
+                    sb.append( ", " );
+                }
+            }
+            if ( m.size() > 1 ) {
+                sb.append( "] " );
+            }
+        }
+        return sb.toString();
+    }
+
+    final static String getPartAfterColon( final String s ) {
+        final int i = s.indexOf( ':' );
+        if ( ( i < 1 ) || ( i == ( s.length() - 1 ) ) ) {
+            return s;
+        }
+        return s.substring( i + 1, s.length() );
+    }
+
+    final static boolean isHasAssignedEvent( final PhylogenyNode node ) {
+        if ( !node.getNodeData().isHasEvent() ) {
+            return false;
+        }
+        if ( ( node.getNodeData().getEvent() ).isUnassigned() ) {
+            return false;
+        }
+        return true;
+    }
+
+    final static boolean isSequenceEmpty( final Sequence seq ) {
+        return ( seq.getAccession() == null ) && ForesterUtil.isEmpty( seq.getName() )
+                && ForesterUtil.isEmpty( seq.getSymbol() );
+    }
+
+    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() );
+    }
+
+    final static char normalizeCharForRGB( char c ) {
+        c -= 65;
+        c *= 10.2;
+        c = c > 255 ? 255 : c;
+        c = c < 0 ? 0 : c;
+        return c;
+    }
+
+    final static Phylogeny subTree( final PhylogenyNode new_root, final Phylogeny source_phy ) {
+        final Phylogeny new_phy = new Phylogeny();
+        new_phy.setRooted( true );
+        new_phy.setName( source_phy.getName() );
+        new_phy.setDescription( source_phy.getDescription() );
+        new_phy.setType( source_phy.getType() );
+        new_phy.setDistanceUnit( source_phy.getDistanceUnit() );
+        new_phy.setConfidence( source_phy.getConfidence() );
+        new_phy.setIdentifier( source_phy.getIdentifier() );
+        new_phy.setRoot( new_root.copyNodeDataShallow() );
+        int i = 0;
+        for( final PhylogenyNode n : new_root.getDescendants() ) {
+            new_phy.getRoot().setChildNode( i++, n );
+        }
+        return new_phy;
+    }
+}
index 9a6afc0..796acd0 100644 (file)
@@ -38,7 +38,7 @@ import java.util.Locale;
 import java.util.Set;
 
 import org.forester.application.support_transfer;
-import org.forester.archaeopteryx.AptxUtil;
+import org.forester.archaeopteryx.TreePanelUtil;
 import org.forester.development.DevelopmentTools;
 import org.forester.evoinference.TestPhylogenyReconstruction;
 import org.forester.evoinference.matrix.character.CharacterStateMatrix;
@@ -2448,46 +2448,46 @@ public final class Test {
         try {
             final PhylogenyNode n = new PhylogenyNode();
             n.setName( "tr|B3RJ64" );
-            if ( !AptxUtil.createUriForSeqWeb( n, null, null ).equals( ForesterUtil.UNIPROT_KB + "B3RJ64" ) ) {
+            if ( !TreePanelUtil.createUriForSeqWeb( n, null, null ).equals( ForesterUtil.UNIPROT_KB + "B3RJ64" ) ) {
                 return false;
             }
             n.setName( "B0LM41_HUMAN" );
-            if ( !AptxUtil.createUriForSeqWeb( n, null, null ).equals( ForesterUtil.UNIPROT_KB + "B0LM41_HUMAN" ) ) {
+            if ( !TreePanelUtil.createUriForSeqWeb( n, null, null ).equals( ForesterUtil.UNIPROT_KB + "B0LM41_HUMAN" ) ) {
                 return false;
             }
             n.setName( "NP_001025424" );
-            if ( !AptxUtil.createUriForSeqWeb( n, null, null ).equals( ForesterUtil.NCBI_PROTEIN + "NP_001025424" ) ) {
+            if ( !TreePanelUtil.createUriForSeqWeb( n, null, null ).equals( ForesterUtil.NCBI_PROTEIN + "NP_001025424" ) ) {
                 return false;
             }
             n.setName( "_NM_001030253-" );
-            if ( !AptxUtil.createUriForSeqWeb( n, null, null ).equals( ForesterUtil.NCBI_NUCCORE + "NM_001030253" ) ) {
+            if ( !TreePanelUtil.createUriForSeqWeb( n, null, null ).equals( ForesterUtil.NCBI_NUCCORE + "NM_001030253" ) ) {
                 return false;
             }
             n.setName( "XM_002122186" );
-            if ( !AptxUtil.createUriForSeqWeb( n, null, null ).equals( ForesterUtil.NCBI_NUCCORE + "XM_002122186" ) ) {
+            if ( !TreePanelUtil.createUriForSeqWeb( n, null, null ).equals( ForesterUtil.NCBI_NUCCORE + "XM_002122186" ) ) {
                 return false;
             }
             n.setName( "dgh_AAA34956_gdg" );
-            if ( !AptxUtil.createUriForSeqWeb( n, null, null ).equals( ForesterUtil.NCBI_PROTEIN + "AAA34956" ) ) {
+            if ( !TreePanelUtil.createUriForSeqWeb( n, null, null ).equals( ForesterUtil.NCBI_PROTEIN + "AAA34956" ) ) {
                 return false;
             }
             n.setName( "j40f4_Q06891.1_fndn2 fnr3" );
-            if ( !AptxUtil.createUriForSeqWeb( n, null, null ).equals( ForesterUtil.NCBI_PROTEIN + "Q06891.1" ) ) {
+            if ( !TreePanelUtil.createUriForSeqWeb( n, null, null ).equals( ForesterUtil.NCBI_PROTEIN + "Q06891.1" ) ) {
                 return false;
             }
             n.setName( "GI:394892" );
-            if ( !AptxUtil.createUriForSeqWeb( n, null, null ).equals( ForesterUtil.NCBI_GI + "394892" ) ) {
-                System.out.println( AptxUtil.createUriForSeqWeb( n, null, null ) );
+            if ( !TreePanelUtil.createUriForSeqWeb( n, null, null ).equals( ForesterUtil.NCBI_GI + "394892" ) ) {
+                System.out.println( TreePanelUtil.createUriForSeqWeb( n, null, null ) );
                 return false;
             }
             n.setName( "gi_394892" );
-            if ( !AptxUtil.createUriForSeqWeb( n, null, null ).equals( ForesterUtil.NCBI_GI + "394892" ) ) {
-                System.out.println( AptxUtil.createUriForSeqWeb( n, null, null ) );
+            if ( !TreePanelUtil.createUriForSeqWeb( n, null, null ).equals( ForesterUtil.NCBI_GI + "394892" ) ) {
+                System.out.println( TreePanelUtil.createUriForSeqWeb( n, null, null ) );
                 return false;
             }
             n.setName( "gi6335_gi_394892_56635_Gi_43" );
-            if ( !AptxUtil.createUriForSeqWeb( n, null, null ).equals( ForesterUtil.NCBI_GI + "394892" ) ) {
-                System.out.println( AptxUtil.createUriForSeqWeb( n, null, null ) );
+            if ( !TreePanelUtil.createUriForSeqWeb( n, null, null ).equals( ForesterUtil.NCBI_GI + "394892" ) ) {
+                System.out.println( TreePanelUtil.createUriForSeqWeb( n, null, null ) );
                 return false;
             }
         }