inprogress
[jalview.git] / forester / java / src / org / forester / archaeopteryx / AptxUtil.java
index 2ca3b87..8ceb398 100644 (file)
@@ -36,11 +36,14 @@ 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;
@@ -48,8 +51,11 @@ 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;
@@ -73,8 +79,10 @@ import org.forester.io.parsers.tol.TolParser;
 import org.forester.io.parsers.util.ParserUtils;
 import org.forester.phylogeny.Phylogeny;
 import org.forester.phylogeny.PhylogenyMethods;
+import org.forester.phylogeny.PhylogenyMethods.DESCENDANT_SORT_PRIORITY;
 import org.forester.phylogeny.PhylogenyNode;
 import org.forester.phylogeny.data.Accession;
+import org.forester.phylogeny.data.Annotation;
 import org.forester.phylogeny.data.BranchColor;
 import org.forester.phylogeny.data.Taxonomy;
 import org.forester.phylogeny.factories.ParserBasedPhylogenyFactory;
@@ -83,20 +91,19 @@ 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 {
 
-    final static String           UNIPROT_KB                     = "http://www.uniprot.org/uniprot/";
-    final static Pattern          UNIPROT_KB_PATTERN             = Pattern
-                                                                         .compile( "\\b[A-Z0-9]{5,6}_[A-Z9][A-Z]{2}[A-Z0-9]{2}|RAT|PIG|PEA\\b" );
+    private final static String[] AVAILABLE_FONT_FAMILIES_SORTED = GraphicsEnvironment.getLocalGraphicsEnvironment()
+                                                                         .getAvailableFontFamilyNames();
     private final static Pattern  seq_identifier_pattern_1       = Pattern
                                                                          .compile( "^([A-Za-z]{2,5})[|=:]([0-9A-Za-z_\\.]{5,40})\\s*$" );
     private final static Pattern  seq_identifier_pattern_2       = Pattern
                                                                          .compile( "^([A-Za-z]{2,5})[|=:]([0-9A-Za-z_\\.]{5,40})[|,; ].*$" );
-    private final static String[] AVAILABLE_FONT_FAMILIES_SORTED = GraphicsEnvironment.getLocalGraphicsEnvironment()
-                                                                         .getAvailableFontFamilyNames();
     static {
         Arrays.sort( AVAILABLE_FONT_FAMILIES_SORTED );
     }
@@ -112,6 +119,69 @@ 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() ) {
@@ -279,6 +349,10 @@ public final class AptxUtil {
                 && !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() ) ) {
@@ -469,25 +543,41 @@ public final class AptxUtil {
         lookAtSomeTreePropertiesForAptxControlSettings( phy, main_panel.getControlPanel(), configuration );
     }
 
-    final static Color calculateColorFromString( final String str ) {
-        final String species_uc = str.toUpperCase();
-        char first = species_uc.charAt( 0 );
+    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 ( species_uc.length() > 1 ) {
-            second = species_uc.charAt( 1 );
-            if ( species_uc.length() > 2 ) {
-                if ( species_uc.indexOf( " " ) > 0 ) {
-                    third = species_uc.charAt( species_uc.indexOf( " " ) + 1 );
-                }
-                else {
-                    third = species_uc.charAt( 2 );
+        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 = ( char ) ( Math.abs( str.hashCode() / 16909320 ) );
+                System.out.println( str.hashCode() );
+            }
         }
         first = AptxUtil.normalizeCharForRGB( first );
         second = AptxUtil.normalizeCharForRGB( second );
-        third = AptxUtil.normalizeCharForRGB( third );
+        if ( is_taxonomy ) {
+            third = AptxUtil.normalizeCharForRGB( third );
+        }
+        else {
+            third = third > 255 ? 255 : third;
+        }
         if ( ( first > 235 ) && ( second > 235 ) && ( third > 235 ) ) {
             first = 0;
         }
@@ -660,6 +750,49 @@ public final class AptxUtil {
         return colorizations;
     }
 
+    final static String createAnnotationString( final SortedSet<Annotation> annotations ) {
+        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 ( !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() ) {
@@ -720,6 +853,9 @@ public final class AptxUtil {
                 desc.append( "Distinct external taxonomies: " );
                 desc.append( taxs.size() );
             }
+            for( final Taxonomy t : taxs ) {
+                System.out.println( t.toString() );
+            }
             desc.append( "\n" );
             final DescriptiveStatistics bs = PhylogenyMethods.calculatBranchLengthStatistics( phy );
             if ( bs.getN() > 3 ) {
@@ -730,9 +866,8 @@ public final class AptxUtil {
                 desc.append( "\n" );
                 desc.append( "    Median: " + ForesterUtil.round( bs.median(), 6 ) );
                 desc.append( "\n" );
-                desc.append( "    Mean: " + ForesterUtil.round( bs.arithmeticMean(), 6 ) );
-                desc.append( "\n" );
-                desc.append( "    SD: " + ForesterUtil.round( bs.sampleStandardDeviation(), 6 ) );
+                desc.append( "    Mean: " + ForesterUtil.round( bs.arithmeticMean(), 6 ) + " (stdev: "
+                        + ForesterUtil.round( bs.sampleStandardDeviation(), 6 ) + ")" );
                 desc.append( "\n" );
                 desc.append( "    Minimum: " + ForesterUtil.round( bs.getMin(), 6 ) );
                 desc.append( "\n" );
@@ -751,9 +886,8 @@ public final class AptxUtil {
                 desc.append( "\n" );
                 desc.append( "    Median: " + ForesterUtil.round( ds.median(), 2 ) );
                 desc.append( "\n" );
-                desc.append( "    Mean: " + ForesterUtil.round( ds.arithmeticMean(), 2 ) );
-                desc.append( "\n" );
-                desc.append( "    SD: " + ForesterUtil.round( ds.sampleStandardDeviation(), 2 ) );
+                desc.append( "    Mean: " + ForesterUtil.round( ds.arithmeticMean(), 2 ) + " (stdev: "
+                        + ForesterUtil.round( ds.sampleStandardDeviation(), 2 ) + ")" );
                 desc.append( "\n" );
                 desc.append( "    Minimum: " + ForesterUtil.roundToInt( ds.getMin() ) );
                 desc.append( "\n" );
@@ -788,11 +922,10 @@ public final class AptxUtil {
                         desc.append( "    Median: " + ForesterUtil.round( cs.median(), 6 ) );
                         desc.append( "\n" );
                         desc.append( "    Mean: " + ForesterUtil.round( cs.arithmeticMean(), 6 ) );
-                        desc.append( "\n" );
                         if ( cs.getN() > 2 ) {
-                            desc.append( "    SD: " + ForesterUtil.round( cs.sampleStandardDeviation(), 6 ) );
-                            desc.append( "\n" );
+                            desc.append( " (stdev: " + ForesterUtil.round( cs.sampleStandardDeviation(), 6 ) + ")" );
                         }
+                        desc.append( "\n" );
                         desc.append( "    Minimum: " + ForesterUtil.roundToInt( cs.getMin() ) );
                         desc.append( "\n" );
                         desc.append( "    Maximum: " + ForesterUtil.roundToInt( cs.getMax() ) );
@@ -856,17 +989,6 @@ public final class AptxUtil {
         return true;
     }
 
-    final static boolean isMac() {
-        try {
-            final String s = ForesterUtil.OS_NAME.toLowerCase();
-            return s.startsWith( "mac" );
-        }
-        catch ( final Exception e ) {
-            ForesterUtil.printWarningMessage( Constants.PRG_NAME, "minor error: " + e );
-            return false;
-        }
-    }
-
     final static boolean isUsOrCanada() {
         try {
             if ( ( Locale.getDefault().equals( Locale.CANADA ) ) || ( Locale.getDefault().equals( Locale.US ) ) ) {
@@ -879,17 +1001,6 @@ public final class AptxUtil {
         return false;
     }
 
-    final static boolean isWindows() {
-        try {
-            final String s = ForesterUtil.OS_NAME.toLowerCase();
-            return s.indexOf( "win" ) > -1;
-        }
-        catch ( final Exception e ) {
-            ForesterUtil.printWarningMessage( Constants.PRG_NAME, "minor error: " + e );
-            return false;
-        }
-    }
-
     final static void lookAtSomeTreePropertiesForAptxControlSettings( final Phylogeny t,
                                                                       final ControlPanel atv_control,
                                                                       final Configuration configuration ) {
@@ -963,8 +1074,9 @@ public final class AptxUtil {
                                                      final boolean phyloxml_validate_against_xsd,
                                                      final boolean replace_underscores,
                                                      final boolean internal_numbers_are_confidences,
-                                                     final TAXONOMY_EXTRACTION taxonomy_extraction )
-            throws FileNotFoundException, IOException {
+                                                     final TAXONOMY_EXTRACTION taxonomy_extraction,
+                                                     final boolean midpoint_reroot ) throws FileNotFoundException,
+            IOException {
         final PhylogenyFactory factory = ParserBasedPhylogenyFactory.getInstance();
         final PhylogenyParser parser;
         boolean nhx_or_nexus = false;
@@ -993,6 +1105,12 @@ public final class AptxUtil {
                 PhylogenyMethods.transferInternalNodeNamesToConfidence( phy );
             }
         }
+        if ( midpoint_reroot ) {
+            for( final Phylogeny phy : phys ) {
+                PhylogenyMethods.midpointRoot( phy );
+                PhylogenyMethods.orderAppearance( phy.getRoot(), true, true, DESCENDANT_SORT_PRIORITY.NODE_NAME );
+            }
+        }
         return phys;
     }
 
@@ -1228,7 +1346,7 @@ public final class AptxUtil {
         if ( os.toLowerCase().startsWith( "win" ) ) {
             Runtime.getRuntime().exec( "rundll32 url.dll,FileProtocolHandler " + url );
         }
-        else if ( isMac() ) {
+        else if ( ForesterUtil.isMac() ) {
             final Class<?> file_mgr = Class.forName( "com.apple.eio.FileManager" );
             final Method open_url = file_mgr.getDeclaredMethod( "openURL", new Class[] { String.class } );
             open_url.invoke( null, new Object[] { url } );
@@ -1275,7 +1393,7 @@ public final class AptxUtil {
     // br.close();
     // }
     public static enum GraphicsExportType {
-        GIF( "gif" ), JPG( "jpg" ), PDF( "pdf" ), PNG( "png" ), TIFF( "tif" ), BMP( "bmp" );
+        BMP( "bmp" ), GIF( "gif" ), JPG( "jpg" ), PDF( "pdf" ), PNG( "png" ), TIFF( "tif" );
 
         private final String _suffix;