X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=forester%2Fjava%2Fsrc%2Forg%2Fforester%2Farchaeopteryx%2FAptxUtil.java;h=2f20136c807920807e8a73e4ef7f368602e0a421;hb=88718609970e490e94727d12ebbca1270ba2c0a7;hp=958a952089fd87947d7a0cd0a272cecb95e48287;hpb=803a2b32992b5944b73c6dfcb80ceb58c09b81c1;p=jalview.git diff --git a/forester/java/src/org/forester/archaeopteryx/AptxUtil.java b/forester/java/src/org/forester/archaeopteryx/AptxUtil.java index 958a952..2f20136 100644 --- a/forester/java/src/org/forester/archaeopteryx/AptxUtil.java +++ b/forester/java/src/org/forester/archaeopteryx/AptxUtil.java @@ -44,10 +44,12 @@ import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import java.text.ParseException; 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.Set; import java.util.SortedSet; import java.util.TreeSet; @@ -57,7 +59,6 @@ import javax.imageio.ImageIO; import javax.imageio.ImageWriteParam; import javax.imageio.ImageWriter; import javax.imageio.stream.ImageOutputStream; -import javax.swing.JApplet; import javax.swing.JOptionPane; import javax.swing.text.MaskFormatter; @@ -65,7 +66,6 @@ import org.forester.io.parsers.PhylogenyParser; import org.forester.io.parsers.nexus.NexusPhylogeniesParser; import org.forester.io.parsers.nhx.NHXParser; import org.forester.io.parsers.nhx.NHXParser.TAXONOMY_EXTRACTION; -import org.forester.io.parsers.phyloxml.PhyloXmlUtil; import org.forester.io.parsers.tol.TolParser; import org.forester.io.parsers.util.ParserUtils; import org.forester.phylogeny.Phylogeny; @@ -79,11 +79,17 @@ import org.forester.phylogeny.iterators.PhylogenyNodeIterator; import org.forester.util.AsciiHistogram; import org.forester.util.DescriptiveStatistics; import org.forester.util.ForesterUtil; +import org.forester.util.TaxonomyUtil; public final class AptxUtil { public static enum GraphicsExportType { - BMP( "bmp" ), GIF( "gif" ), JPG( "jpg" ), PDF( "pdf" ), PNG( "png" ), TIFF( "tif" ); + BMP( "bmp" ), + GIF( "gif" ), + JPG( "jpg" ), + PDF( "pdf" ), + PNG( "png" ), + TIFF( "tif" ); private final String _suffix; @@ -131,12 +137,15 @@ public final class AptxUtil { first = normalizeCharForRGB( first ); second = normalizeCharForRGB( second ); third = normalizeCharForRGB( third ); - if ( ( first > 235 ) && ( second > 235 ) && ( third > 235 ) ) { + if ( ( first > 200 ) && ( second > 200 ) && ( third > 200 ) ) { first = 0; } else if ( ( first < 60 ) && ( second < 60 ) && ( third < 60 ) ) { second = 255; } + else if ( Math.abs( first - second ) < 40 && Math.abs( second - third ) < 40 ) { + third = 255; + } return new Color( first, second, third ); } @@ -177,6 +186,33 @@ public final class AptxUtil { return false; } + final static public boolean isHasAtLeast50PercentBranchLengthLargerThanZero( final Phylogeny phy ) { + final PhylogenyNodeIterator it = phy.iteratorPostorder(); + int positive = 0; + int total = 0; + while ( it.hasNext() ) { + if ( it.next().getDistanceToParent() > 0.0 ) { + ++positive; + } + ++total; + } + if ( total == 0 ) { + return false; + } + return (((( double ) positive) / total) >= 0.5 ); + } + + final static public boolean isHasNoBranchLengthSmallerThanZero( final Phylogeny phy ) { + final PhylogenyNodeIterator it = phy.iteratorPostorder(); + while ( it.hasNext() ) { + final PhylogenyNode n = it.next(); + if ( n.getDistanceToParent() < 0.0 && !n.isRoot() ) { + return false; + } + } + return true; + } + final static public boolean isHasAtLeastOneBranchWithSupportSD( final Phylogeny phy ) { final PhylogenyNodeIterator it = phy.iteratorPostorder(); while ( it.hasNext() ) { @@ -227,45 +263,37 @@ public final class AptxUtil { return false; } - final public static void launchWebBrowser( final URI uri, - final boolean is_applet, - final JApplet applet, - final String frame_name ) throws IOException { - if ( is_applet ) { - applet.getAppletContext().showDocument( uri.toURL(), frame_name ); + final public static void launchWebBrowser( final URI uri, final String frame_name ) throws IOException { + // This requires Java 1.6: + // ======================= + // boolean no_desktop = false; + // try { + // if ( Desktop.isDesktopSupported() ) { + // System.out.println( "desktop supported" ); + // final Desktop dt = Desktop.getDesktop(); + // dt.browse( uri ); + // } + // else { + // no_desktop = true; + // } + // } + // catch ( final Exception ex ) { + // ex.printStackTrace(); + // no_desktop = true; + // } + // catch ( final Error er ) { + // er.printStackTrace(); + // no_desktop = true; + // } + // if ( no_desktop ) { + // System.out.println( "desktop not supported" ); + try { + openUrlInWebBrowser( uri.toString() ); } - else { - // This requires Java 1.6: - // ======================= - // boolean no_desktop = false; - // try { - // if ( Desktop.isDesktopSupported() ) { - // System.out.println( "desktop supported" ); - // final Desktop dt = Desktop.getDesktop(); - // dt.browse( uri ); - // } - // else { - // no_desktop = true; - // } - // } - // catch ( final Exception ex ) { - // ex.printStackTrace(); - // no_desktop = true; - // } - // catch ( final Error er ) { - // er.printStackTrace(); - // no_desktop = true; - // } - // if ( no_desktop ) { - // System.out.println( "desktop not supported" ); - try { - openUrlInWebBrowser( uri.toString() ); - } - catch ( final Exception e ) { - throw new IOException( e ); - } - // } + catch ( final Exception e ) { + throw new IOException( e ); } + // } } public static Set obtainAllDistinctTaxonomies( final PhylogenyNode node ) { @@ -289,7 +317,7 @@ public final class AptxUtil { final boolean internal_numbers_are_confidences, final TAXONOMY_EXTRACTION taxonomy_extraction, final boolean midpoint_reroot ) - throws FileNotFoundException, IOException { + throws FileNotFoundException, IOException { final PhylogenyParser parser; boolean nhx_or_nexus = false; if ( url.getHost().toLowerCase().indexOf( "tolweb" ) >= 0 ) { @@ -340,8 +368,10 @@ public final class AptxUtil { final public static void showErrorMessage( final Component parent, final String error_msg ) { printAppletMessage( AptxConstants.PRG_NAME, error_msg ); - JOptionPane.showMessageDialog( parent, error_msg, "[" + AptxConstants.PRG_NAME + " " + AptxConstants.VERSION - + "] Error", JOptionPane.ERROR_MESSAGE ); + JOptionPane.showMessageDialog( parent, + error_msg, + "[" + AptxConstants.PRG_NAME + " " + AptxConstants.VERSION + "] Error", + JOptionPane.ERROR_MESSAGE ); } public static void writePhylogenyToGraphicsFile( final File intree, @@ -349,7 +379,8 @@ public final class AptxUtil { final int width, final int height, final GraphicsExportType type, - final Configuration config ) throws IOException { + final Configuration config ) + throws IOException { final PhylogenyParser parser = ParserUtils.createParserDependingOnFileType( intree, true ); Phylogeny[] phys = null; phys = PhylogenyMethods.readPhylogenies( parser, intree ); @@ -361,12 +392,18 @@ public final class AptxUtil { final int width, final int height, final GraphicsExportType type, - final Configuration config ) throws IOException { + final Configuration config ) + throws IOException { final Phylogeny[] phys = new Phylogeny[ 1 ]; phys[ 0 ] = phy; final MainFrameApplication mf = MainFrameApplication.createInstance( phys, config ); - AptxUtil.writePhylogenyToGraphicsFileNonInteractive( outfile, width, height, mf.getMainPanel() - .getCurrentTreePanel(), mf.getMainPanel().getControlPanel(), type, mf.getOptions() ); + AptxUtil.writePhylogenyToGraphicsFileNonInteractive( outfile, + width, + height, + mf.getMainPanel().getCurrentTreePanel(), + mf.getMainPanel().getControlPanel(), + type, + mf.getOptions() ); mf.end(); } @@ -376,7 +413,8 @@ public final class AptxUtil { final TreePanel tree_panel, final ControlPanel ac, final GraphicsExportType type, - final Options options ) throws IOException { + final Options options ) + throws IOException { tree_panel.calcParametersForPainting( width, height ); tree_panel.resetPreferredSize(); tree_panel.repaint(); @@ -419,9 +457,9 @@ public final class AptxUtil { return c; } - final private static void openUrlInWebBrowser( final String url ) throws IOException, ClassNotFoundException, - SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, - InvocationTargetException, InterruptedException { + final private static void openUrlInWebBrowser( final String url ) + throws IOException, ClassNotFoundException, SecurityException, NoSuchMethodException, + IllegalArgumentException, IllegalAccessException, InvocationTargetException, InterruptedException { final String os = System.getProperty( "os.name" ); final Runtime runtime = Runtime.getRuntime(); if ( os.toLowerCase().startsWith( "win" ) ) { @@ -455,9 +493,13 @@ public final class AptxUtil { final Configuration configuration, final MainPanel main_panel ) { if ( phys.length > AptxConstants.MAX_TREES_TO_LOAD ) { - JOptionPane.showMessageDialog( main_panel, "Attempt to load " + phys.length - + " phylogenies,\ngoing to load only the first " + AptxConstants.MAX_TREES_TO_LOAD, AptxConstants.PRG_NAME - + " more than " + AptxConstants.MAX_TREES_TO_LOAD + " phylogenies", JOptionPane.WARNING_MESSAGE ); + JOptionPane.showMessageDialog( main_panel, + "Attempt to load " + phys.length + + " phylogenies,\ngoing to load only the first " + + AptxConstants.MAX_TREES_TO_LOAD, + AptxConstants.PRG_NAME + " more than " + AptxConstants.MAX_TREES_TO_LOAD + + " phylogenies", + JOptionPane.WARNING_MESSAGE ); } int i = 1; for( final Phylogeny phy : phys ) { @@ -731,16 +773,32 @@ public final class AptxUtil { } final static String[] getAllPossibleRanks() { - final String[] str_array = new String[ PhyloXmlUtil.TAXONOMY_RANKS_LIST.size() - 2 ]; + final String[] str_array = new String[ TaxonomyUtil.TAXONOMY_RANKS_LIST.size() - 2 ]; int i = 0; - for( final String e : PhyloXmlUtil.TAXONOMY_RANKS_LIST ) { - if ( !e.equals( PhyloXmlUtil.UNKNOWN ) && !e.equals( PhyloXmlUtil.OTHER ) ) { + for( final String e : TaxonomyUtil.TAXONOMY_RANKS_LIST ) { + if ( !e.equals( TaxonomyUtil.UNKNOWN ) && !e.equals( TaxonomyUtil.OTHER ) ) { str_array[ i++ ] = e; } } return str_array; } + final static String[] getAllPossibleRanks( final Map present_ranks ) { + final String[] str_array = new String[ TaxonomyUtil.TAXONOMY_RANKS_LIST.size() - 2 ]; + int i = 0; + for( final String e : TaxonomyUtil.TAXONOMY_RANKS_LIST ) { + if ( !e.equals( TaxonomyUtil.UNKNOWN ) && !e.equals( TaxonomyUtil.OTHER ) ) { + if ( present_ranks != null && present_ranks.containsKey( e ) ) { + str_array[ i++ ] = e + " (" + present_ranks.get( e ) + ")"; + } + else { + str_array[ i++ ] = e; + } + } + } + return str_array; + } + final static String[] getAllRanks( final Phylogeny tree ) { final SortedSet ranks = new TreeSet(); for( final PhylogenyNodeIterator it = tree.iteratorPreorder(); it.hasNext(); ) { @@ -767,78 +825,85 @@ public final class AptxUtil { } return false; } - final static void lookAtRealBranchLengthsForAptxControlSettings( final Phylogeny t, - final ControlPanel cp ) { + + final static void lookAtRealBranchLengthsForAptxControlSettings( final Phylogeny t, final ControlPanel cp ) { if ( ( t != null ) && !t.isEmpty() ) { final boolean has_bl = AptxUtil.isHasAtLeastOneBranchLengthLargerThanZero( t ); if ( !has_bl ) { - cp.setDrawPhylogram( false ); + cp.setTreeDisplayType( Options.PHYLOGENY_DISPLAY_TYPE.CLADOGRAM ); cp.setDrawPhylogramEnabled( false ); } - else if ( cp.getDisplayAsPhylogramCb() != null ) { - cp.setDrawPhylogramEnabled( true ); + else { + final boolean has_all_bl = AptxUtil.isHasNoBranchLengthSmallerThanZero( t ); + if ( has_all_bl ) { + cp.setTreeDisplayType( Options.PHYLOGENY_DISPLAY_TYPE.UNALIGNED_PHYLOGRAM ); + } + if ( cp.getDisplayAsUnalignedPhylogramRb() != null ) { + cp.setDrawPhylogramEnabled( true ); + } } } } + final static void lookAtSomeTreePropertiesForAptxControlSettings( final Phylogeny t, - final ControlPanel atv_control, + final ControlPanel cp, final Configuration configuration ) { if ( ( t != null ) && !t.isEmpty() ) { final boolean has_bl = AptxUtil.isHasAtLeastOneBranchLengthLargerThanZero( t ); if ( !has_bl ) { - atv_control.setDrawPhylogram( false ); - atv_control.setDrawPhylogramEnabled( false ); + cp.setTreeDisplayType( Options.PHYLOGENY_DISPLAY_TYPE.CLADOGRAM ); + cp.setDrawPhylogramEnabled( false ); } - if ( t.getFirstExternalNode().getBranchData().getBranchColor() != null - && atv_control.getUseVisualStylesCb() != null ) { - atv_control.getUseVisualStylesCb().setSelected( true ); + && cp.getUseVisualStylesCb() != null ) { + cp.getUseVisualStylesCb().setSelected( true ); } if ( t.getFirstExternalNode().getBranchData().getBranchWidth() != null - && t.getFirstExternalNode().getBranchData().getBranchWidth().getValue() - != BranchWidth.BRANCH_WIDTH_DEFAULT_VALUE - && atv_control.getUseBranchWidthsCb() != null ) { - atv_control.getUseBranchWidthsCb().setSelected( true ); + && t.getFirstExternalNode().getBranchData().getBranchWidth() + .getValue() != BranchWidth.BRANCH_WIDTH_DEFAULT_VALUE + && cp.getUseBranchWidthsCb() != null ) { + cp.getUseBranchWidthsCb().setSelected( true ); } - - if ( configuration.doGuessCheckOption( Configuration.display_as_phylogram ) ) { - if ( atv_control.getDisplayAsPhylogramCb() != null ) { + if ( cp.getDisplayAsAlignedPhylogramRb() != null ) { if ( has_bl ) { - atv_control.setDrawPhylogram( true ); - atv_control.setDrawPhylogramEnabled( true ); + final boolean has_mostly_bl = AptxUtil.isHasAtLeast50PercentBranchLengthLargerThanZero( t ); + if ( has_mostly_bl ) { + cp.setTreeDisplayType( Options.PHYLOGENY_DISPLAY_TYPE.UNALIGNED_PHYLOGRAM ); + } + cp.setDrawPhylogramEnabled( true ); } else { - atv_control.setDrawPhylogram( false ); + cp.setTreeDisplayType( Options.PHYLOGENY_DISPLAY_TYPE.CLADOGRAM ); } } } if ( configuration.doGuessCheckOption( Configuration.write_confidence_values ) ) { - if ( atv_control.getWriteConfidenceCb() != null ) { + if ( cp.getWriteConfidenceCb() != null ) { if ( AptxUtil.isHasAtLeastOneBranchWithSupportValues( t ) ) { - atv_control.setCheckbox( Configuration.write_confidence_values, true ); + cp.setCheckbox( Configuration.write_confidence_values, true ); } else { - atv_control.setCheckbox( Configuration.write_confidence_values, false ); + cp.setCheckbox( Configuration.write_confidence_values, false ); } } } if ( configuration.doGuessCheckOption( Configuration.write_events ) ) { - if ( atv_control.getShowEventsCb() != null ) { + if ( cp.getShowEventsCb() != null ) { if ( AptxUtil.isHasAtLeastNodeWithEvent( t ) ) { - atv_control.setCheckbox( Configuration.write_events, true ); + cp.setCheckbox( Configuration.write_events, true ); } else { - atv_control.setCheckbox( Configuration.write_events, false ); + cp.setCheckbox( Configuration.write_events, false ); } } } } } - final static void openWebsite( final String url, final boolean is_applet, final JApplet applet ) throws IOException { + final static void openWebsite( final String url ) throws IOException { try { - AptxUtil.launchWebBrowser( new URI( url ), is_applet, applet, AptxConstants.PRG_NAME ); + AptxUtil.launchWebBrowser( new URI( url ), AptxConstants.PRG_NAME ); } catch ( final Exception e ) { throw new IOException( e ); @@ -854,8 +919,9 @@ public final class AptxUtil { JOptionPane.showMessageDialog( null, "Java memory allocation might be too small, try \"-Xmx2048m\" java command line option" + "\n\nError: " + e.getLocalizedMessage(), - "Out of Memory Error [" + AptxConstants.PRG_NAME + " " + AptxConstants.VERSION + "]", - JOptionPane.ERROR_MESSAGE ); + "Out of Memory Error [" + AptxConstants.PRG_NAME + " " + AptxConstants.VERSION + + "]", + JOptionPane.ERROR_MESSAGE ); System.exit( -1 ); } @@ -883,13 +949,13 @@ public final class AptxUtil { for( final StackTraceElement s : e.getStackTrace() ) { sb.append( s + "\n" ); } - JOptionPane - .showMessageDialog( null, - "An unexpected (possibly severe) error has occured - terminating. \nPlease contact: " - + AptxConstants.AUTHOR_EMAIL + " \nError: " + e.getLocalizedMessage() + "\n" - + sb, - "Unexpected Severe Error [" + AptxConstants.PRG_NAME + " " + AptxConstants.VERSION + "]", - JOptionPane.ERROR_MESSAGE ); + JOptionPane.showMessageDialog( null, + "An unexpected (possibly severe) error has occured - terminating. \nPlease contact: " + + AptxConstants.AUTHOR_EMAIL + " \nError: " + e.getLocalizedMessage() + + "\n" + sb, + "Unexpected Severe Error [" + AptxConstants.PRG_NAME + " " + + AptxConstants.VERSION + "]", + JOptionPane.ERROR_MESSAGE ); System.exit( -1 ); } @@ -905,8 +971,8 @@ public final class AptxUtil { "An unexpected exception has occured. \nPlease contact: " + AptxConstants.AUTHOR_EMAIL + " \nException: " + e.getLocalizedMessage() + "\n" + sb, - "Unexpected Exception [" + AptxConstants.PRG_NAME + AptxConstants.VERSION + "]", - JOptionPane.ERROR_MESSAGE ); + "Unexpected Exception [" + AptxConstants.PRG_NAME + AptxConstants.VERSION + "]", + JOptionPane.ERROR_MESSAGE ); } final static String writePhylogenyToGraphicsByteArrayOutputStream( final ByteArrayOutputStream baos, @@ -915,8 +981,8 @@ public final class AptxUtil { final TreePanel tree_panel, final ControlPanel ac, final GraphicsExportType type, - final Options options ) throws IOException { - + final Options options ) + throws IOException { final RenderingHints rendering_hints = new RenderingHints( RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY ); rendering_hints.put( RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY ); @@ -933,11 +999,11 @@ public final class AptxUtil { return ""; } Rectangle visible = null; -// if ( !options.isGraphicsExportUsingActualSize() ) { -// width = options.getPrintSizeX(); -// height = options.getPrintSizeY(); -// } - /* else*/ if ( options.isGraphicsExportVisibleOnly() ) { + // if ( !options.isGraphicsExportUsingActualSize() ) { + // width = options.getPrintSizeX(); + // height = options.getPrintSizeY(); + // } + /* else*/ if ( options.isGraphicsExportVisibleOnly() ) { visible = tree_panel.getVisibleRect(); width = visible.width; height = visible.height; @@ -973,8 +1039,8 @@ public final class AptxUtil { final TreePanel tree_panel, final ControlPanel ac, final GraphicsExportType type, - final Options options ) throws IOException { - + final Options options ) + throws IOException { final RenderingHints rendering_hints = new RenderingHints( RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY ); rendering_hints.put( RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY ); @@ -995,10 +1061,10 @@ public final class AptxUtil { throw new IOException( "\"" + file_name + "\" is a directory" ); } Rectangle visible = null; -// if ( !options.isGraphicsExportUsingActualSize() ) { -// width = options.getPrintSizeX(); -// height = options.getPrintSizeY(); -// } + // if ( !options.isGraphicsExportUsingActualSize() ) { + // width = options.getPrintSizeX(); + // height = options.getPrintSizeY(); + // } /*else*/ if ( options.isGraphicsExportVisibleOnly() ) { visible = tree_panel.getVisibleRect(); width = visible.width; @@ -1062,4 +1128,24 @@ public final class AptxUtil { final IIOImage iio_image = new IIOImage( image, null, null ); writer.write( null, iio_image, image_write_param ); } + + final static Map getRankCounts( final Phylogeny tree ) { + final Map present_ranks = new HashMap(); + if ( ( tree != null ) && !tree.isEmpty() ) { + for( final PhylogenyNodeIterator it = tree.iteratorPostorder(); it.hasNext(); ) { + final PhylogenyNode n = it.next(); + if ( !n.isExternal() && n.getNodeData().isHasTaxonomy() + && !ForesterUtil.isEmpty( n.getNodeData().getTaxonomy().getRank() ) && !n.isRoot() ) { + final String rank = n.getNodeData().getTaxonomy().getRank().toLowerCase(); + if ( present_ranks.containsKey( rank ) ) { + present_ranks.put( rank, present_ranks.get( rank ) + 1 ); + } + else { + present_ranks.put( rank, 1 ); + } + } + } + } + return present_ranks; + } }