X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=forester%2Fjava%2Fsrc%2Forg%2Fforester%2Farchaeopteryx%2FAptxUtil.java;h=b2c3dd849557588b203a4ed4be00d75f721d877f;hb=362bd0a813f302f28631d9c9447dd8aa9ee0ceda;hp=42e7ab1113067843e2b476eb6bcb67efbe5c2be9;hpb=7bbb45295594e9574ee64a32fac17a93b5aa6ade;p=jalview.git diff --git a/forester/java/src/org/forester/archaeopteryx/AptxUtil.java b/forester/java/src/org/forester/archaeopteryx/AptxUtil.java index 42e7ab1..b2c3dd8 100644 --- a/forester/java/src/org/forester/archaeopteryx/AptxUtil.java +++ b/forester/java/src/org/forester/archaeopteryx/AptxUtil.java @@ -25,6 +25,7 @@ package org.forester.archaeopteryx; +import java.awt.Color; import java.awt.Component; import java.awt.Graphics2D; import java.awt.GraphicsEnvironment; @@ -35,10 +36,12 @@ import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; +import java.io.InputStream; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.net.URI; import java.net.URL; +import java.net.URLConnection; import java.text.ParseException; import java.util.Arrays; import java.util.HashSet; @@ -48,8 +51,6 @@ import java.util.Locale; import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import javax.imageio.IIOImage; import javax.imageio.ImageIO; @@ -71,7 +72,7 @@ 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.Confidence; import org.forester.phylogeny.data.Taxonomy; import org.forester.phylogeny.factories.ParserBasedPhylogenyFactory; import org.forester.phylogeny.factories.PhylogenyFactory; @@ -84,10 +85,6 @@ 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})[|,; ].*$" ); static { Arrays.sort( AVAILABLE_FONT_FAMILIES_SORTED ); } @@ -139,6 +136,46 @@ public final class AptxUtil { return false; } + final static public boolean isHasAtLeastOneBranchWithSupportSD( final Phylogeny phy ) { + final PhylogenyNodeIterator it = phy.iteratorPostorder(); + while ( it.hasNext() ) { + final PhylogenyNode n = it.next(); + if ( n.getBranchData().isHasConfidences() ) { + final List c = n.getBranchData().getConfidences(); + for( final Confidence confidence : c ) { + if ( confidence.getStandardDeviation() > 0 ) { + return true; + } + } + } + } + return false; + } + + final static public boolean isHasAtLeastOneNodeWithScientificName( final Phylogeny phy ) { + final PhylogenyNodeIterator it = phy.iteratorPostorder(); + while ( it.hasNext() ) { + final PhylogenyNode n = it.next(); + if ( n.getNodeData().isHasTaxonomy() + && !ForesterUtil.isEmpty( n.getNodeData().getTaxonomy().getScientificName() ) ) { + return true; + } + } + return false; + } + + final static public boolean isHasAtLeastOneNodeWithSequenceAnnotation( final Phylogeny phy ) { + final PhylogenyNodeIterator it = phy.iteratorPostorder(); + while ( it.hasNext() ) { + final PhylogenyNode n = it.next(); + if ( n.getNodeData().isHasSequence() + && !ForesterUtil.isEmpty( n.getNodeData().getSequence().getAnnotations() ) ) { + return true; + } + } + return false; + } + final public static void launchWebBrowser( final URI uri, final boolean is_applet, final JApplet applet, @@ -191,28 +228,6 @@ public final class AptxUtil { 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 ); - String group1 = ""; - String group2 = ""; - if ( matcher1.matches() ) { - group1 = matcher1.group( 1 ); - group2 = matcher1.group( 2 ); - } - else { - final Matcher matcher2 = seq_identifier_pattern_2.matcher( n ); - if ( matcher2.matches() ) { - group1 = matcher2.group( 1 ); - group2 = matcher2.group( 2 ); - } - } - if ( ForesterUtil.isEmpty( group1 ) || ForesterUtil.isEmpty( group2 ) ) { - return null; - } - return new Accession( group2, group1 ); - } - public final static void printWarningMessage( final String name, final String message ) { System.out.println( "[" + name + "] > " + message ); } @@ -397,9 +412,23 @@ public final class AptxUtil { return iter.hasNext(); } - final static String createBasicInformation( final Phylogeny phy ) { + final static String createBasicInformation( final Phylogeny phy, final File treefile ) { final StringBuilder desc = new StringBuilder(); if ( ( phy != null ) && !phy.isEmpty() ) { + String f = null; + if ( treefile != null ) { + try { + f = treefile.getCanonicalPath(); + } + catch ( final IOException e ) { + //Not important, ignore. + } + if ( !ForesterUtil.isEmpty( f ) ) { + desc.append( "Path: " ); + desc.append( f ); + desc.append( "\n" ); + } + } if ( !ForesterUtil.isEmpty( phy.getName() ) ) { desc.append( "Name: " ); desc.append( phy.getName() ); @@ -488,10 +517,10 @@ public final class AptxUtil { desc.append( "\n" ); desc.append( "Descendants per node statistics: " ); desc.append( "\n" ); - desc.append( " Median: " + ForesterUtil.round( ds.median(), 2 ) ); + desc.append( " Median: " + ForesterUtil.round( ds.median(), 6 ) ); desc.append( "\n" ); - desc.append( " Mean: " + ForesterUtil.round( ds.arithmeticMean(), 2 ) + " (stdev: " - + ForesterUtil.round( ds.sampleStandardDeviation(), 2 ) + ")" ); + desc.append( " Mean: " + ForesterUtil.round( ds.arithmeticMean(), 6 ) + " (stdev: " + + ForesterUtil.round( ds.sampleStandardDeviation(), 6 ) + ")" ); desc.append( "\n" ); desc.append( " Minimum: " + ForesterUtil.roundToInt( ds.getMin() ) ); desc.append( "\n" ); @@ -530,9 +559,9 @@ public final class AptxUtil { desc.append( " (stdev: " + ForesterUtil.round( cs.sampleStandardDeviation(), 6 ) + ")" ); } desc.append( "\n" ); - desc.append( " Minimum: " + ForesterUtil.roundToInt( cs.getMin() ) ); + desc.append( " Minimum: " + ForesterUtil.round( cs.getMin(), 6 ) ); desc.append( "\n" ); - desc.append( " Maximum: " + ForesterUtil.roundToInt( cs.getMax() ) ); + desc.append( " Maximum: " + ForesterUtil.round( cs.getMax(), 6 ) ); desc.append( "\n" ); } } @@ -664,13 +693,13 @@ public final class AptxUtil { System.out.println( "[" + applet_name + "] > " + message ); } - final static Phylogeny[] readPhylogeniesFromUrl( final URL url, - final boolean phyloxml_validate_against_xsd, - final boolean replace_underscores, - final boolean internal_numbers_are_confidences, - final TAXONOMY_EXTRACTION taxonomy_extraction, - final boolean midpoint_reroot ) throws FileNotFoundException, - IOException { + final public static Phylogeny[] readPhylogeniesFromUrl( final URL url, + final boolean phyloxml_validate_against_xsd, + final boolean replace_underscores, + final boolean internal_numbers_are_confidences, + 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; @@ -693,16 +722,23 @@ public final class AptxUtil { nex.setIgnoreQuotes( false ); } } - final Phylogeny[] phys = factory.create( url.openStream(), parser ); - if ( nhx_or_nexus && internal_numbers_are_confidences ) { - for( final Phylogeny phy : phys ) { - PhylogenyMethods.transferInternalNodeNamesToConfidence( phy ); + AptxUtil.printAppletMessage( "Archaeopteryx", "parser is " + parser.getName() ); + final URLConnection url_connection = url.openConnection(); + url_connection.setDefaultUseCaches( false ); + final InputStream i = url_connection.getInputStream(); + final Phylogeny[] phys = factory.create( i, parser ); + i.close(); + if ( phys != null ) { + if ( nhx_or_nexus && internal_numbers_are_confidences ) { + for( final Phylogeny phy : phys ) { + 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 ); + if ( midpoint_reroot ) { + for( final Phylogeny phy : phys ) { + PhylogenyMethods.midpointRoot( phy ); + PhylogenyMethods.orderAppearance( phy.getRoot(), true, true, DESCENDANT_SORT_PRIORITY.NODE_NAME ); + } } } return phys; @@ -714,6 +750,12 @@ public final class AptxUtil { } } + final static void removeVisualStyles( final Phylogeny phy ) { + for( final PhylogenyNodeIterator it = phy.iteratorPreorder(); it.hasNext(); ) { + it.next().getNodeData().setNodeVisualData( null ); + } + } + final static void unexpectedError( final Error e ) { System.err.println(); e.printStackTrace( System.err ); @@ -946,30 +988,6 @@ public final class AptxUtil { } } - // See: http://www.xml.nig.ac.jp/tutorial/rest/index.html#2.2 - // static void openDDBJRest() throws IOException { - // //set URL - // URL url = new URL( "http://xml.nig.ac.jp/rest/Invoke" ); - // //set parameter - // String query = "service=GetEntry&method=getDDBJEntry&accession=AB000100"; - // //make connection - // URLConnection urlc = url.openConnection(); - // //use post mode - // urlc.setDoOutput( true ); - // urlc.setAllowUserInteraction( false ); - // //send query - // PrintStream ps = new PrintStream( urlc.getOutputStream() ); - // ps.print( query ); - // ps.close(); - // //get result - // BufferedReader br = new BufferedReader( new InputStreamReader( - // urlc.getInputStream() ) ); - // String l = null; - // while ( ( l = br.readLine() ) != null ) { - // System.out.println( l ); - // } - // br.close(); - // } public static enum GraphicsExportType { BMP( "bmp" ), GIF( "gif" ), JPG( "jpg" ), PDF( "pdf" ), PNG( "png" ), TIFF( "tif" ); @@ -984,4 +1002,50 @@ public final class AptxUtil { return _suffix; } } + + final public 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 = normalizeCharForRGB( first ); + second = normalizeCharForRGB( second ); + third = 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 private static char normalizeCharForRGB( char c ) { + c -= 65; + c *= 10.2; + c = c > 255 ? 255 : c; + c = c < 0 ? 0 : c; + return c; + } }