From 7bbb45295594e9574ee64a32fac17a93b5aa6ade Mon Sep 17 00:00:00 2001 From: "cmzmasek@gmail.com" Date: Wed, 25 Sep 2013 00:43:11 +0000 Subject: [PATCH] inprogress --- .../src/org/forester/archaeopteryx/AptxUtil.java | 416 ----------------- .../org/forester/archaeopteryx/Configuration.java | 2 +- .../src/org/forester/archaeopteryx/Constants.java | 4 +- .../src/org/forester/archaeopteryx/TreePanel.java | 167 +++---- .../org/forester/archaeopteryx/TreePanelUtil.java | 480 ++++++++++++++++++++ forester/java/src/org/forester/test/Test.java | 28 +- 6 files changed, 569 insertions(+), 528 deletions(-) create mode 100644 forester/java/src/org/forester/archaeopteryx/TreePanelUtil.java diff --git a/forester/java/src/org/forester/archaeopteryx/AptxUtil.java b/forester/java/src/org/forester/archaeopteryx/AptxUtil.java index 3f4bd4c..42e7ab1 100644 --- a/forester/java/src/org/forester/archaeopteryx/AptxUtil.java +++ b/forester/java/src/org/forester/archaeopteryx/AptxUtil.java @@ -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 obtainDistinctTaxonomies( final PhylogenyNode node ) { - final List descs = node.getAllExternalDescendants(); - final Set tax_set = new HashSet(); - 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 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 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 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 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 true_lineage_to_color_map = new HashMap(); - 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 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 annotations, final boolean show_ref_sources ) { - final SortedMap> m = new TreeMap>(); - 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() ); - } - m.get( ref_source ).add( an ); - } - final StringBuilder sb = new StringBuilder(); - for( final Entry> e : m.entrySet() ) { - final String ref_source = e.getKey(); - final List 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 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 { diff --git a/forester/java/src/org/forester/archaeopteryx/Configuration.java b/forester/java/src/org/forester/archaeopteryx/Configuration.java index a81370a..087f8e1 100644 --- a/forester/java/src/org/forester/archaeopteryx/Configuration.java +++ b/forester/java/src/org/forester/archaeopteryx/Configuration.java @@ -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" }, diff --git a/forester/java/src/org/forester/archaeopteryx/Constants.java b/forester/java/src/org/forester/archaeopteryx/Constants.java index 9f2eb80..856163c 100644 --- a/forester/java/src/org/forester/archaeopteryx/Constants.java +++ b/forester/java/src/org/forester/archaeopteryx/Constants.java @@ -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" }; diff --git a/forester/java/src/org/forester/archaeopteryx/TreePanel.java b/forester/java/src/org/forester/archaeopteryx/TreePanel.java index 978b132..3ad3935 100644 --- a/forester/java/src/org/forester/archaeopteryx/TreePanel.java +++ b/forester/java/src/org/forester/archaeopteryx/TreePanel.java @@ -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 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 additional_nodes = new ArrayList(); + 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 _additional_nodes = null; SubtreeColorizationActionListener( final JColorChooser chooser, final PhylogenyNode node ) { _chooser = chooser; _node = node; } + SubtreeColorizationActionListener( final JColorChooser chooser, + final PhylogenyNode node, + final List 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 index 0000000..082efa9 --- /dev/null +++ b/forester/java/src/org/forester/archaeopteryx/TreePanelUtil.java @@ -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 obtainDistinctTaxonomies( final PhylogenyNode node ) { + final List descs = node.getAllExternalDescendants(); + final Set tax_set = new HashSet(); + 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 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 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 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 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 true_lineage_to_color_map = new HashMap(); + 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 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 annotations, final boolean show_ref_sources ) { + final SortedMap> m = new TreeMap>(); + 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() ); + } + m.get( ref_source ).add( an ); + } + final StringBuilder sb = new StringBuilder(); + for( final Entry> e : m.entrySet() ) { + final String ref_source = e.getKey(); + final List 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; + } +} diff --git a/forester/java/src/org/forester/test/Test.java b/forester/java/src/org/forester/test/Test.java index 9a6afc0..796acd0 100644 --- a/forester/java/src/org/forester/test/Test.java +++ b/forester/java/src/org/forester/test/Test.java @@ -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; } } -- 1.7.10.2