inprogress
[jalview.git] / forester / java / src / org / forester / archaeopteryx / AptxUtil.java
index a615cb9..8ceb398 100644 (file)
@@ -43,6 +43,7 @@ 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;
@@ -50,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;
@@ -75,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;
@@ -92,16 +98,27 @@ import org.forester.ws.seqdb.UniProtTaxonomy;
 
 public final class AptxUtil {
 
+    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 );
     }
 
+    public static MaskFormatter createMaskFormatter( final String s ) {
+        MaskFormatter formatter = null;
+        try {
+            formatter = new MaskFormatter( s );
+        }
+        catch ( final ParseException e ) {
+            throw new IllegalArgumentException( e );
+        }
+        return formatter;
+    }
+
     public final static String createUriForSeqWeb( final PhylogenyNode node,
                                                    final Configuration conf,
                                                    final TreePanel tp ) {
@@ -165,17 +182,6 @@ public final class AptxUtil {
         return uri_str;
     }
 
-    public static MaskFormatter createMaskFormatter( final String s ) {
-        MaskFormatter formatter = null;
-        try {
-            formatter = new MaskFormatter( s );
-        }
-        catch ( final ParseException e ) {
-            throw new IllegalArgumentException( e );
-        }
-        return formatter;
-    }
-
     final static public boolean isHasAtLeastNodeWithEvent( final Phylogeny phy ) {
         final PhylogenyNodeIterator it = phy.iteratorPostorder();
         while ( it.hasNext() ) {
@@ -343,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() ) ) {
@@ -533,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;
         }
@@ -724,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() ) {
@@ -784,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 ) {
@@ -794,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" );
@@ -815,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" );
@@ -852,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() ) );
@@ -920,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 ) ) ) {
@@ -943,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 ) {
@@ -1061,6 +1108,7 @@ public final class AptxUtil {
         if ( midpoint_reroot ) {
             for( final Phylogeny phy : phys ) {
                 PhylogenyMethods.midpointRoot( phy );
+                PhylogenyMethods.orderAppearance( phy.getRoot(), true, true, DESCENDANT_SORT_PRIORITY.NODE_NAME );
             }
         }
         return phys;
@@ -1298,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 } );
@@ -1345,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;