From 0bcaf88108ac7d33e5a76df7fa49bf22d01c6798 Mon Sep 17 00:00:00 2001 From: "cmzmasek@gmail.com" Date: Sat, 9 Mar 2013 01:35:06 +0000 Subject: [PATCH] applet gsdi --- .../org/forester/archaeopteryx/ArchaeopteryxA.java | 31 +- .../org/forester/archaeopteryx/ArchaeopteryxE.java | 293 ++++++++++++- .../src/org/forester/archaeopteryx/Constants.java | 4 +- .../src/org/forester/archaeopteryx/MainFrame.java | 187 +++++++++ .../forester/archaeopteryx/MainFrameApplet.java | 15 +- .../archaeopteryx/MainFrameApplication.java | 435 ++++++-------------- .../src/org/forester/util/ForesterConstants.java | 4 +- 7 files changed, 617 insertions(+), 352 deletions(-) diff --git a/forester/java/src/org/forester/archaeopteryx/ArchaeopteryxA.java b/forester/java/src/org/forester/archaeopteryx/ArchaeopteryxA.java index b1cd27c..c508eda 100644 --- a/forester/java/src/org/forester/archaeopteryx/ArchaeopteryxA.java +++ b/forester/java/src/org/forester/archaeopteryx/ArchaeopteryxA.java @@ -82,14 +82,14 @@ public class ArchaeopteryxA extends JApplet { return getMainFrameApplet().getCurrentTreePanel().getCurrentExternalNodesDataBufferAsString().length(); } - public String getTreeUrlStr() { - return _tree_url_str; - } - public String getSpeciesTreeUrlStr() { return _species_tree_url_str; } + public String getTreeUrlStr() { + return _tree_url_str; + } + @Override public void init() { boolean has_exception = false; @@ -156,7 +156,18 @@ public class ArchaeopteryxA extends JApplet { TAXONOMY_EXTRACTION.NO ); if ( ( species_trees != null ) && ( species_trees.length > 0 ) ) { AptxUtil.printAppletMessage( NAME, "successfully read species tree" ); - getMainFrameApplet().setSpeciesTree( species_trees[ 0 ] ); + if ( species_trees[ 0 ].isEmpty() ) { + ForesterUtil.printErrorMessage( NAME, "species tree is empty" ); + } + else if ( !species_trees[ 0 ].isRooted() ) { + ForesterUtil.printErrorMessage( NAME, "species tree is not rooted" ); + } + else { + getMainFrameApplet().setSpeciesTree( species_trees[ 0 ] ); + } + } + else { + ForesterUtil.printErrorMessage( NAME, "failed to read species tree from " + getSpeciesTreeUrlStr() ); } } getMainFrameApplet().getMainPanel().getControlPanel().showWholeAll(); @@ -191,8 +202,8 @@ public class ArchaeopteryxA extends JApplet { if ( default_sequence != null ) { getMainFrameApplet().getMainPanel().getControlPanel().getSequenceRelationBox() .setSelectedItem( default_sequence ); - /* GUILHEM_END */ } + /* GUILHEM_END */ } /** @@ -239,11 +250,11 @@ public class ArchaeopteryxA extends JApplet { _message_2 = message_2; } - private void setTreeUrlStr( final String url_string ) { - _tree_url_str = url_string; - } - private void setSpeciesTreeUrlStr( final String url_string ) { _species_tree_url_str = url_string; } + + private void setTreeUrlStr( final String url_string ) { + _tree_url_str = url_string; + } } diff --git a/forester/java/src/org/forester/archaeopteryx/ArchaeopteryxE.java b/forester/java/src/org/forester/archaeopteryx/ArchaeopteryxE.java index 89e043f..c33a34a 100644 --- a/forester/java/src/org/forester/archaeopteryx/ArchaeopteryxE.java +++ b/forester/java/src/org/forester/archaeopteryx/ArchaeopteryxE.java @@ -33,8 +33,13 @@ import org.forester.archaeopteryx.AptxUtil.GraphicsExportType; import org.forester.archaeopteryx.Options.CLADOGRAM_TYPE; import org.forester.archaeopteryx.Options.NODE_LABEL_DIRECTION; import org.forester.archaeopteryx.Options.PHYLOGENY_GRAPHICS_TYPE; +import org.forester.io.parsers.nhx.NHXParser.TAXONOMY_EXTRACTION; import org.forester.phylogeny.Phylogeny; +import org.forester.phylogeny.PhylogenyMethods; import org.forester.phylogeny.data.SequenceRelation; +import org.forester.sdi.GSDI; +import org.forester.sdi.GSDIR; +import org.forester.sdi.SDIException; import org.forester.util.ForesterConstants; import org.forester.util.ForesterUtil; @@ -55,7 +60,7 @@ public class ArchaeopteryxE extends JApplet implements ActionListener { private final static String NAME = "ArchaeopteryxE"; private static final long serialVersionUID = -1220055577935759443L; private Configuration _configuration; - private MainPanelApplets _main_panel; + private MainPanelApplets _mainpanel; private JMenuBar _jmenubar; private JMenu _options_jmenu; private JMenu _font_size_menu; @@ -120,15 +125,29 @@ public class ArchaeopteryxE extends JApplet implements ActionListener { private JCheckBoxMenuItem _taxonomy_colorize_node_shapes_cbmi; private JCheckBoxMenuItem _show_confidence_stddev_cbmi; private final LinkedList _textframes = new LinkedList(); + private JMenu _analysis_menu; + private JMenuItem _gsdi_item; + private JMenuItem _gsdir_item; + private Phylogeny _species_tree; - // private String _ext_node_data_buffer = ""; - // private int _ext_node_data_buffer_change_counter = 0; @Override public void actionPerformed( final ActionEvent e ) { final Object o = e.getSource(); if ( o == _midpoint_root_item ) { getMainPanel().getCurrentTreePanel().midpointRoot(); } + else if ( o == _gsdi_item ) { + if ( isSubtreeDisplayed() ) { + return; + } + executeGSDI(); + } + else if ( o == _gsdir_item ) { + if ( isSubtreeDisplayed() ) { + return; + } + executeGSDIR(); + } else if ( o == _taxcolor_item ) { getMainPanel().getCurrentTreePanel().taxColor(); } @@ -208,15 +227,15 @@ public class ArchaeopteryxE extends JApplet implements ActionListener { } else if ( o == _non_lined_up_cladograms_rbmi ) { updateOptions( getOptions() ); - _main_panel.getControlPanel().showWhole(); + _mainpanel.getControlPanel().showWhole(); } else if ( o == _uniform_cladograms_rbmi ) { updateOptions( getOptions() ); - _main_panel.getControlPanel().showWhole(); + _mainpanel.getControlPanel().showWhole(); } else if ( o == _ext_node_dependent_cladogram_rbmi ) { updateOptions( getOptions() ); - _main_panel.getControlPanel().showWhole(); + _mainpanel.getControlPanel().showWhole(); } else if ( o == _search_case_senstive_cbmi ) { updateOptions( getOptions() ); @@ -386,8 +405,8 @@ public class ArchaeopteryxE extends JApplet implements ActionListener { final ByteArrayOutputStream baos = new ByteArrayOutputStream(); try { AptxUtil.writePhylogenyToGraphicsByteArrayOutputStream( baos, - _main_panel.getWidth(), - _main_panel.getHeight(), + _mainpanel.getWidth(), + _mainpanel.getHeight(), getCurrentTreePanel(), getCurrentTreePanel().getControlPanel(), GraphicsExportType.valueOf( format ), @@ -464,6 +483,39 @@ public class ArchaeopteryxE extends JApplet implements ActionListener { else { AptxUtil.printAppletMessage( NAME, "loaded " + phys.length + " phylogenies from: " + phys_url ); } + // + final String species_tree_url_str = getParameter( Constants.APPLET_PARAM_NAME_FOR_URL_OF_SPECIES_TREE_TO_LOAD ); + if ( !ForesterUtil.isEmpty( species_tree_url_str ) ) { + AptxUtil.printAppletMessage( NAME, "URL of species tree to load: \"" + species_tree_url_str + "\"" ); + Phylogeny[] species_trees = null; + try { + final URL species_tree_url = new URL( species_tree_url_str ); + species_trees = AptxUtil.readPhylogeniesFromUrl( species_tree_url, + configuration.isValidatePhyloXmlAgainstSchema(), + configuration.isReplaceUnderscoresInNhParsing(), + false, + TAXONOMY_EXTRACTION.NO ); + } + catch ( final IOException e ) { + ForesterUtil.printErrorMessage( NAME, "could not read species tree from [" + species_tree_url_str + + "]" ); + JOptionPane.showMessageDialog( this, NAME + ": could not read species tree from [" + + species_tree_url_str + "]", "Failed to read species tree", JOptionPane.ERROR_MESSAGE ); + } + if ( ( species_trees != null ) && ( species_trees.length > 0 ) ) { + AptxUtil.printAppletMessage( NAME, "successfully read species tree" ); + if ( species_trees[ 0 ].isEmpty() ) { + ForesterUtil.printErrorMessage( NAME, "species tree is empty" ); + } + else if ( !species_trees[ 0 ].isRooted() ) { + ForesterUtil.printErrorMessage( NAME, "species tree is not rooted" ); + } + else { + setSpeciesTree( species_trees[ 0 ] ); + } + } + } + // setVisible( false ); setMainPanel( new MainPanelApplets( getConfiguration(), this ) ); _jmenubar = new JMenuBar(); @@ -471,6 +523,9 @@ public class ArchaeopteryxE extends JApplet implements ActionListener { if ( !getConfiguration().isUseNativeUI() ) { _jmenubar.setBackground( getConfiguration().getGuiMenuBackgroundColor() ); } + if ( getSpeciesTree() != null ) { + buildAnalysisMenu(); + } buildToolsMenu(); buildViewMenu(); buildFontSizeMenu(); @@ -529,8 +584,8 @@ public class ArchaeopteryxE extends JApplet implements ActionListener { final String default_sequence = getParameter( Constants.APPLET_PARAM_NAME_FOR_DEFAULT_QUERY_SEQUENCE ); if ( default_sequence != null ) { getCurrentTreePanel().getControlPanel().getSequenceRelationBox().setSelectedItem( default_sequence ); - /* GUILHEM_END */ } + /* GUILHEM_END */ setVisible( true ); } @@ -550,6 +605,19 @@ public class ArchaeopteryxE extends JApplet implements ActionListener { AptxUtil.printAppletMessage( NAME, "started" ); } + void buildAnalysisMenu() { + _analysis_menu = MainFrame.createMenu( "Analysis", getConfiguration() ); + _analysis_menu.add( _gsdi_item = new JMenuItem( "GSDI (Generalized Speciation Duplication Inference)" ) ); + _analysis_menu.add( _gsdir_item = new JMenuItem( "GSDIR (GSDI with re-rooting)" ) ); + customizeJMenuItem( _gsdi_item ); + customizeJMenuItem( _gsdir_item ); + // _analysis_menu.addSeparator(); + // _analysis_menu.add( _lineage_inference = new JMenuItem( INFER_ANCESTOR_TAXONOMIES ) ); + // customizeJMenuItem( _lineage_inference ); + // _lineage_inference.setToolTipText( "Inference of ancestor taxonomies/lineages" ); + _jmenubar.add( _analysis_menu ); + } + void buildFontSizeMenu() { _font_size_menu = MainFrame.createMenu( MainFrame.FONT_SIZE_MENU_LABEL, getConfiguration() ); _font_size_menu.add( _super_tiny_fonts_mi = new JMenuItem( "Super tiny fonts" ) ); @@ -799,6 +867,147 @@ public class ArchaeopteryxE extends JApplet implements ActionListener { } } + void executeGSDI() { + if ( !isOKforSDI( false, true ) ) { + return; + } + if ( !_mainpanel.getCurrentPhylogeny().isRooted() ) { + JOptionPane.showMessageDialog( this, + "Gene tree is not rooted.", + "Cannot execute GSDI", + JOptionPane.ERROR_MESSAGE ); + return; + } + final Phylogeny gene_tree = _mainpanel.getCurrentPhylogeny().copy(); + gene_tree.setAllNodesToNotCollapse(); + gene_tree.recalculateNumberOfExternalDescendants( false ); + GSDI gsdi = null; + final Phylogeny species_tree = _species_tree.copy(); + try { + gsdi = new GSDI( gene_tree, species_tree, false, true, true ); + } + catch ( final SDIException e ) { + JOptionPane.showMessageDialog( this, + e.getLocalizedMessage(), + "Error during GSDI", + JOptionPane.ERROR_MESSAGE ); + return; + } + catch ( final Exception e ) { + AptxUtil.unexpectedException( e ); + return; + } + gene_tree.setRerootable( false ); + gene_tree.clearHashIdToNodeMap(); + gene_tree.recalculateNumberOfExternalDescendants( true ); + _mainpanel.addPhylogenyInNewTab( gene_tree, getConfiguration(), "gene tree", null ); + getMainPanel().getControlPanel().setShowEvents( true ); + showWhole(); + final int selected = _mainpanel.getTabbedPane().getSelectedIndex(); + _mainpanel.addPhylogenyInNewTab( species_tree, getConfiguration(), "species tree", null ); + showWhole(); + _mainpanel.getTabbedPane().setSelectedIndex( selected ); + showWhole(); + _mainpanel.getCurrentTreePanel().setEdited( true ); + final int poly = PhylogenyMethods.countNumberOfPolytomies( species_tree ); + if ( gsdi.getStrippedExternalGeneTreeNodes().size() > 0 ) { + JOptionPane.showMessageDialog( this, + "Duplications: " + gsdi.getDuplicationsSum() + "\n" + + "Potential duplications: " + + gsdi.getSpeciationOrDuplicationEventsSum() + "\n" + + "Speciations: " + gsdi.getSpeciationsSum() + "\n" + + "Stripped gene tree nodes: " + + gsdi.getStrippedExternalGeneTreeNodes().size() + "\n" + + "Taxonomy linkage based on: " + gsdi.getTaxCompBase() + "\n" + + "Number of polytomies in species tree used: " + poly + "\n", + "GSDI successfully completed", + JOptionPane.WARNING_MESSAGE ); + } + else { + JOptionPane.showMessageDialog( this, + "Duplications: " + gsdi.getDuplicationsSum() + "\n" + + "Potential duplications: " + + gsdi.getSpeciationOrDuplicationEventsSum() + "\n" + + "Speciations: " + gsdi.getSpeciationsSum() + "\n" + + "Stripped gene tree nodes: " + + gsdi.getStrippedExternalGeneTreeNodes().size() + "\n" + + "Taxonomy linkage based on: " + gsdi.getTaxCompBase() + "\n" + + "Number of polytomies in species tree used: " + poly + "\n", + "GSDI successfully completed", + JOptionPane.INFORMATION_MESSAGE ); + } + } + + void executeGSDIR() { + if ( !isOKforSDI( false, false ) ) { + return; + } + final int p = PhylogenyMethods.countNumberOfPolytomies( _mainpanel.getCurrentPhylogeny() ); + if ( ( p > 0 ) + && !( ( p == 1 ) && ( _mainpanel.getCurrentPhylogeny().getRoot().getNumberOfDescendants() == 3 ) ) ) { + JOptionPane.showMessageDialog( this, + "Gene tree is not completely binary", + "Cannot execute GSDI", + JOptionPane.ERROR_MESSAGE ); + return; + } + final Phylogeny gene_tree = _mainpanel.getCurrentPhylogeny().copy(); + gene_tree.setAllNodesToNotCollapse(); + gene_tree.recalculateNumberOfExternalDescendants( false ); + GSDIR gsdir = null; + final Phylogeny species_tree = _species_tree.copy(); + try { + gsdir = new GSDIR( gene_tree, species_tree, true, true ); + } + catch ( final SDIException e ) { + JOptionPane.showMessageDialog( this, + e.getLocalizedMessage(), + "Error during GSDIR", + JOptionPane.ERROR_MESSAGE ); + return; + } + catch ( final Exception e ) { + AptxUtil.unexpectedException( e ); + return; + } + final Phylogeny result_gene_tree = gsdir.getMinDuplicationsSumGeneTree(); + result_gene_tree.setRerootable( false ); + result_gene_tree.clearHashIdToNodeMap(); + result_gene_tree.recalculateNumberOfExternalDescendants( true ); + _mainpanel.addPhylogenyInNewTab( result_gene_tree, getConfiguration(), "gene tree", null ); + getMainPanel().getControlPanel().setShowEvents( true ); + showWhole(); + final int selected = _mainpanel.getTabbedPane().getSelectedIndex(); + _mainpanel.addPhylogenyInNewTab( species_tree, getConfiguration(), "species tree", null ); + showWhole(); + _mainpanel.getTabbedPane().setSelectedIndex( selected ); + showWhole(); + _mainpanel.getCurrentTreePanel().setEdited( true ); + final int poly = PhylogenyMethods.countNumberOfPolytomies( species_tree ); + if ( gsdir.getStrippedExternalGeneTreeNodes().size() > 0 ) { + JOptionPane.showMessageDialog( this, + "Minimal duplications: " + gsdir.getMinDuplicationsSum() + "\n" + + "Speciations: " + gsdir.getSpeciationsSum() + "\n" + + "Stripped gene tree nodes: " + + gsdir.getStrippedExternalGeneTreeNodes().size() + "\n" + + "Taxonomy linkage based on: " + gsdir.getTaxCompBase() + "\n" + + "Number of polytomies in species tree used: " + poly + "\n", + "GSDIR successfully completed", + JOptionPane.WARNING_MESSAGE ); + } + else { + JOptionPane.showMessageDialog( this, + "Minimal duplications: " + gsdir.getMinDuplicationsSum() + "\n" + + "Speciations: " + gsdir.getSpeciationsSum() + "\n" + + "Stripped gene tree nodes: " + + gsdir.getStrippedExternalGeneTreeNodes().size() + "\n" + + "Taxonomy linkage based on: " + gsdir.getTaxCompBase() + "\n" + + "Number of polytomies in species tree used: " + poly + "\n", + "GSDIR successfully completed", + JOptionPane.INFORMATION_MESSAGE ); + } + } + Configuration getConfiguration() { return _configuration; } @@ -848,12 +1057,6 @@ public class ArchaeopteryxE extends JApplet implements ActionListener { sb.append( "------------------------\n" ); sb.append( "Order Subtrees -- order the tree by branch length\n" ); sb.append( "Uncollapse All -- uncollapse any and all collapsed branches\n\n" ); - sb.append( "Memory problems (Java heap space error)\n" ); - sb.append( "---------------------------------------\n" ); - sb.append( "Since the Java default memory allocation is quite small, it might by necessary (for trees\n" ); - sb.append( "with more than approximately 5000 external nodes) to increase the memory which Java can use, with\n" ); - sb.append( "the '-Xmx' Java command line option. For example:\n" ); - sb.append( "java -Xmx1024m -cp path\\to\\forester.jar org.forester.archaeopteryx.Archaeopteryx\n\n" ); sb.append( "phyloXML\n" ); sb.append( "-------------------\n" ); sb.append( "Reference: " + Constants.PHYLOXML_REFERENCE + "\n" ); @@ -900,6 +1103,50 @@ public class ArchaeopteryxE extends JApplet implements ActionListener { } } + boolean isOKforSDI( final boolean species_tree_has_to_binary, final boolean gene_tree_has_to_binary ) { + if ( ( _mainpanel.getCurrentPhylogeny() == null ) || _mainpanel.getCurrentPhylogeny().isEmpty() ) { + return false; + } + else if ( ( _species_tree == null ) || _species_tree.isEmpty() ) { + JOptionPane.showMessageDialog( this, + "No species tree loaded", + "Cannot execute GSDI", + JOptionPane.ERROR_MESSAGE ); + return false; + } + else if ( species_tree_has_to_binary && !_species_tree.isCompletelyBinary() ) { + JOptionPane.showMessageDialog( this, + "Species tree is not completely binary", + "Cannot execute GSDI", + JOptionPane.ERROR_MESSAGE ); + return false; + } + else if ( gene_tree_has_to_binary && !_mainpanel.getCurrentPhylogeny().isCompletelyBinary() ) { + JOptionPane.showMessageDialog( this, + "Gene tree is not completely binary", + "Cannot execute GSDI", + JOptionPane.ERROR_MESSAGE ); + return false; + } + else { + return true; + } + } + + boolean isSubtreeDisplayed() { + if ( getCurrentTreePanel() != null ) { + if ( getCurrentTreePanel().isCurrentTreeIsSubtree() ) { + JOptionPane + .showMessageDialog( this, + "This operation can only be performed on a complete tree, not on the currently displayed sub-tree only.", + "Operation can not be exectuted on a sub-tree", + JOptionPane.WARNING_MESSAGE ); + return true; + } + } + return false; + } + void removeAllTextFrames() { for( final TextFrame tf : _textframes ) { if ( tf != null ) { @@ -981,6 +1228,10 @@ public class ArchaeopteryxE extends JApplet implements ActionListener { } } + void showWhole() { + _mainpanel.getControlPanel().showWhole(); + } + void switchColors() { final TreeColorSet colorset = getMainPanel().getCurrentTreePanel().getTreeColorSet(); final ColorSchemeChooser csc = new ColorSchemeChooser( getMainPanel(), colorset ); @@ -1174,7 +1425,11 @@ public class ArchaeopteryxE extends JApplet implements ActionListener { } private MainPanel getMainPanel() { - return _main_panel; + return _mainpanel; + } + + private Phylogeny getSpeciesTree() { + return _species_tree; } private boolean isScreenAntialias() { @@ -1188,7 +1443,11 @@ public class ArchaeopteryxE extends JApplet implements ActionListener { } private void setMainPanel( final MainPanelApplets main_panel ) { - _main_panel = main_panel; + _mainpanel = main_panel; + } + + private void setSpeciesTree( final Phylogeny species_tree ) { + _species_tree = species_tree; } private void setupUI() { diff --git a/forester/java/src/org/forester/archaeopteryx/Constants.java b/forester/java/src/org/forester/archaeopteryx/Constants.java index 500ec78..e539c54 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.9805+ A1ST"; - final static String PRG_DATE = "130306"; + final static String VERSION = "0.9806 A1ST"; + final static String PRG_DATE = "130308"; final static String DEFAULT_CONFIGURATION_FILE_NAME = "_aptx_configuration_file"; final static String[] DEFAULT_FONT_CHOICES = { "Verdana", "Tahoma", "Arial", "Helvetica", "Dialog", "Lucida Sans", "SansSerif", "Sans-serif", "Sans" }; diff --git a/forester/java/src/org/forester/archaeopteryx/MainFrame.java b/forester/java/src/org/forester/archaeopteryx/MainFrame.java index 5e7a13d..8689bd4 100644 --- a/forester/java/src/org/forester/archaeopteryx/MainFrame.java +++ b/forester/java/src/org/forester/archaeopteryx/MainFrame.java @@ -59,11 +59,15 @@ import org.forester.archaeopteryx.tools.ProcessPool; import org.forester.archaeopteryx.tools.ProcessRunning; import org.forester.io.parsers.nhx.NHXParser.TAXONOMY_EXTRACTION; import org.forester.phylogeny.Phylogeny; +import org.forester.phylogeny.PhylogenyMethods; import org.forester.phylogeny.PhylogenyNode; import org.forester.phylogeny.PhylogenyNode.NH_CONVERSION_SUPPORT_VALUE_STYLE; import org.forester.phylogeny.data.Annotation; import org.forester.phylogeny.data.NodeVisualization.NodeFill; import org.forester.phylogeny.data.NodeVisualization.NodeShape; +import org.forester.sdi.GSDI; +import org.forester.sdi.GSDIR; +import org.forester.sdi.SDIException; import org.forester.util.ForesterConstants; import org.forester.util.ForesterUtil; @@ -264,6 +268,18 @@ public abstract class MainFrame extends JFrame implements ActionListener { else if ( o == _exit_item ) { close(); } + else if ( o == _gsdi_item ) { + if ( isSubtreeDisplayed() ) { + return; + } + executeGSDI(); + } + else if ( o == _gsdir_item ) { + if ( isSubtreeDisplayed() ) { + return; + } + executeGSDIR(); + } else if ( o == _taxcolor_item ) { taxColor(); } @@ -766,6 +782,147 @@ public abstract class MainFrame extends JFrame implements ActionListener { JOptionPane.showMessageDialog( this, "Exception" + e, "Error during File|SaveAs", JOptionPane.ERROR_MESSAGE ); } + void executeGSDI() { + if ( !isOKforSDI( false, true ) ) { + return; + } + if ( !_mainpanel.getCurrentPhylogeny().isRooted() ) { + JOptionPane.showMessageDialog( this, + "Gene tree is not rooted.", + "Cannot execute GSDI", + JOptionPane.ERROR_MESSAGE ); + return; + } + final Phylogeny gene_tree = _mainpanel.getCurrentPhylogeny().copy(); + gene_tree.setAllNodesToNotCollapse(); + gene_tree.recalculateNumberOfExternalDescendants( false ); + GSDI gsdi = null; + final Phylogeny species_tree = _species_tree.copy(); + try { + gsdi = new GSDI( gene_tree, species_tree, false, true, true ); + } + catch ( final SDIException e ) { + JOptionPane.showMessageDialog( this, + e.getLocalizedMessage(), + "Error during GSDI", + JOptionPane.ERROR_MESSAGE ); + return; + } + catch ( final Exception e ) { + AptxUtil.unexpectedException( e ); + return; + } + gene_tree.setRerootable( false ); + gene_tree.clearHashIdToNodeMap(); + gene_tree.recalculateNumberOfExternalDescendants( true ); + _mainpanel.addPhylogenyInNewTab( gene_tree, getConfiguration(), "gene tree", null ); + getMainPanel().getControlPanel().setShowEvents( true ); + showWhole(); + final int selected = _mainpanel.getTabbedPane().getSelectedIndex(); + _mainpanel.addPhylogenyInNewTab( species_tree, getConfiguration(), "species tree", null ); + showWhole(); + _mainpanel.getTabbedPane().setSelectedIndex( selected ); + showWhole(); + _mainpanel.getCurrentTreePanel().setEdited( true ); + final int poly = PhylogenyMethods.countNumberOfPolytomies( species_tree ); + if ( gsdi.getStrippedExternalGeneTreeNodes().size() > 0 ) { + JOptionPane.showMessageDialog( this, + "Duplications: " + gsdi.getDuplicationsSum() + "\n" + + "Potential duplications: " + + gsdi.getSpeciationOrDuplicationEventsSum() + "\n" + + "Speciations: " + gsdi.getSpeciationsSum() + "\n" + + "Stripped gene tree nodes: " + + gsdi.getStrippedExternalGeneTreeNodes().size() + "\n" + + "Taxonomy linkage based on: " + gsdi.getTaxCompBase() + "\n" + + "Number of polytomies in species tree used: " + poly + "\n", + "GSDI successfully completed", + JOptionPane.WARNING_MESSAGE ); + } + else { + JOptionPane.showMessageDialog( this, + "Duplications: " + gsdi.getDuplicationsSum() + "\n" + + "Potential duplications: " + + gsdi.getSpeciationOrDuplicationEventsSum() + "\n" + + "Speciations: " + gsdi.getSpeciationsSum() + "\n" + + "Stripped gene tree nodes: " + + gsdi.getStrippedExternalGeneTreeNodes().size() + "\n" + + "Taxonomy linkage based on: " + gsdi.getTaxCompBase() + "\n" + + "Number of polytomies in species tree used: " + poly + "\n", + "GSDI successfully completed", + JOptionPane.INFORMATION_MESSAGE ); + } + } + + void executeGSDIR() { + if ( !isOKforSDI( false, false ) ) { + return; + } + final int p = PhylogenyMethods.countNumberOfPolytomies( _mainpanel.getCurrentPhylogeny() ); + if ( ( p > 0 ) + && !( ( p == 1 ) && ( _mainpanel.getCurrentPhylogeny().getRoot().getNumberOfDescendants() == 3 ) ) ) { + JOptionPane.showMessageDialog( this, + "Gene tree is not completely binary", + "Cannot execute GSDI", + JOptionPane.ERROR_MESSAGE ); + return; + } + final Phylogeny gene_tree = _mainpanel.getCurrentPhylogeny().copy(); + gene_tree.setAllNodesToNotCollapse(); + gene_tree.recalculateNumberOfExternalDescendants( false ); + GSDIR gsdir = null; + final Phylogeny species_tree = _species_tree.copy(); + try { + gsdir = new GSDIR( gene_tree, species_tree, true, true ); + } + catch ( final SDIException e ) { + JOptionPane.showMessageDialog( this, + e.getLocalizedMessage(), + "Error during GSDIR", + JOptionPane.ERROR_MESSAGE ); + return; + } + catch ( final Exception e ) { + AptxUtil.unexpectedException( e ); + return; + } + final Phylogeny result_gene_tree = gsdir.getMinDuplicationsSumGeneTree(); + result_gene_tree.setRerootable( false ); + result_gene_tree.clearHashIdToNodeMap(); + result_gene_tree.recalculateNumberOfExternalDescendants( true ); + _mainpanel.addPhylogenyInNewTab( result_gene_tree, getConfiguration(), "gene tree", null ); + getMainPanel().getControlPanel().setShowEvents( true ); + showWhole(); + final int selected = _mainpanel.getTabbedPane().getSelectedIndex(); + _mainpanel.addPhylogenyInNewTab( species_tree, getConfiguration(), "species tree", null ); + showWhole(); + _mainpanel.getTabbedPane().setSelectedIndex( selected ); + showWhole(); + _mainpanel.getCurrentTreePanel().setEdited( true ); + final int poly = PhylogenyMethods.countNumberOfPolytomies( species_tree ); + if ( gsdir.getStrippedExternalGeneTreeNodes().size() > 0 ) { + JOptionPane.showMessageDialog( this, + "Minimal duplications: " + gsdir.getMinDuplicationsSum() + "\n" + + "Speciations: " + gsdir.getSpeciationsSum() + "\n" + + "Stripped gene tree nodes: " + + gsdir.getStrippedExternalGeneTreeNodes().size() + "\n" + + "Taxonomy linkage based on: " + gsdir.getTaxCompBase() + "\n" + + "Number of polytomies in species tree used: " + poly + "\n", + "GSDIR successfully completed", + JOptionPane.WARNING_MESSAGE ); + } + else { + JOptionPane.showMessageDialog( this, + "Minimal duplications: " + gsdir.getMinDuplicationsSum() + "\n" + + "Speciations: " + gsdir.getSpeciationsSum() + "\n" + + "Stripped gene tree nodes: " + + gsdir.getStrippedExternalGeneTreeNodes().size() + "\n" + + "Taxonomy linkage based on: " + gsdir.getTaxCompBase() + "\n" + + "Number of polytomies in species tree used: " + poly + "\n", + "GSDIR successfully completed", + JOptionPane.INFORMATION_MESSAGE ); + } + } + boolean GAndSDoHaveMoreThanOneSpeciesInComman( final Phylogeny gene_tree ) { if ( ( gene_tree == null ) || gene_tree.isEmpty() ) { JOptionPane.showMessageDialog( this, @@ -922,6 +1079,36 @@ public abstract class MainFrame extends JFrame implements ActionListener { } } + boolean isOKforSDI( final boolean species_tree_has_to_binary, final boolean gene_tree_has_to_binary ) { + if ( ( _mainpanel.getCurrentPhylogeny() == null ) || _mainpanel.getCurrentPhylogeny().isEmpty() ) { + return false; + } + else if ( ( _species_tree == null ) || _species_tree.isEmpty() ) { + JOptionPane.showMessageDialog( this, + "No species tree loaded", + "Cannot execute GSDI", + JOptionPane.ERROR_MESSAGE ); + return false; + } + else if ( species_tree_has_to_binary && !_species_tree.isCompletelyBinary() ) { + JOptionPane.showMessageDialog( this, + "Species tree is not completely binary", + "Cannot execute GSDI", + JOptionPane.ERROR_MESSAGE ); + return false; + } + else if ( gene_tree_has_to_binary && !_mainpanel.getCurrentPhylogeny().isCompletelyBinary() ) { + JOptionPane.showMessageDialog( this, + "Gene tree is not completely binary", + "Cannot execute GSDI", + JOptionPane.ERROR_MESSAGE ); + return false; + } + else { + return true; + } + } + boolean isSubtreeDisplayed() { if ( getCurrentTreePanel() != null ) { if ( getCurrentTreePanel().isCurrentTreeIsSubtree() ) { diff --git a/forester/java/src/org/forester/archaeopteryx/MainFrameApplet.java b/forester/java/src/org/forester/archaeopteryx/MainFrameApplet.java index 4a5c932..b6f99ea 100644 --- a/forester/java/src/org/forester/archaeopteryx/MainFrameApplet.java +++ b/forester/java/src/org/forester/archaeopteryx/MainFrameApplet.java @@ -113,8 +113,9 @@ public final class MainFrameApplet extends MainFrame { if ( !_configuration.isUseNativeUI() ) { _jmenubar.setBackground( _configuration.getGuiMenuBackgroundColor() ); } - //TODO if species tree... - buildAnalysisMenu(); + if ( _species_tree != null ) { + buildAnalysisMenu(); + } buildToolsMenu(); buildViewMenu(); buildFontSizeMenu(); @@ -154,6 +155,11 @@ public final class MainFrameApplet extends MainFrame { System.gc(); } + @Override + public MainPanel getMainPanel() { + return _mainpanel; + } + void buildAnalysisMenu() { _analysis_menu = MainFrame.createMenu( "Analysis", getConfiguration() ); _analysis_menu.add( _gsdi_item = new JMenuItem( "GSDI (Generalized Speciation Duplication Inference)" ) ); @@ -294,11 +300,6 @@ public final class MainFrameApplet extends MainFrame { } @Override - public MainPanel getMainPanel() { - return _mainpanel; - } - - @Override void readPhylogeniesFromURL() { throw new NoSuchMethodError( "not implemented" ); } diff --git a/forester/java/src/org/forester/archaeopteryx/MainFrameApplication.java b/forester/java/src/org/forester/archaeopteryx/MainFrameApplication.java index 5954fe3..822c4d4 100644 --- a/forester/java/src/org/forester/archaeopteryx/MainFrameApplication.java +++ b/forester/java/src/org/forester/archaeopteryx/MainFrameApplication.java @@ -98,9 +98,6 @@ 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.sdi.GSDI; -import org.forester.sdi.GSDIR; -import org.forester.sdi.SDIException; import org.forester.sequence.Sequence; import org.forester.util.BasicDescriptiveStatistics; import org.forester.util.BasicTable; @@ -136,13 +133,6 @@ public final class MainFrameApplication extends MainFrame { private final JFileChooser _save_filechooser; private final JFileChooser _writetopdf_filechooser; private final JFileChooser _writetographics_filechooser; - // Analysis menu - private JMenu _analysis_menu; - private JMenuItem _load_species_tree_item; - private JMenuItem _gsdi_item; - private JMenuItem _gsdir_item; - private JMenuItem _lineage_inference; - private JMenuItem _function_analysis; // Application-only print menu items private JMenuItem _print_item; private JMenuItem _write_to_pdf_item; @@ -515,18 +505,6 @@ public final class MainFrameApplication extends MainFrame { else if ( o == _extract_tax_code_from_node_names_jmi ) { extractTaxDataFromNodeNames(); } - else if ( o == _gsdi_item ) { - if ( isSubtreeDisplayed() ) { - return; - } - executeGSDI(); - } - else if ( o == _gsdir_item ) { - if ( isSubtreeDisplayed() ) { - return; - } - executeGSDIR(); - } else if ( o == _graphics_export_visible_only_cbmi ) { updateOptions( getOptions() ); } @@ -1152,147 +1130,6 @@ public final class MainFrameApplication extends MainFrame { new Thread( a ).start(); } - void executeGSDI() { - if ( !isOKforSDI( false, true ) ) { - return; - } - if ( !_mainpanel.getCurrentPhylogeny().isRooted() ) { - JOptionPane.showMessageDialog( this, - "Gene tree is not rooted.", - "Cannot execute GSDI", - JOptionPane.ERROR_MESSAGE ); - return; - } - final Phylogeny gene_tree = _mainpanel.getCurrentPhylogeny().copy(); - gene_tree.setAllNodesToNotCollapse(); - gene_tree.recalculateNumberOfExternalDescendants( false ); - GSDI gsdi = null; - final Phylogeny species_tree = _species_tree.copy(); - try { - gsdi = new GSDI( gene_tree, species_tree, false, true, true ); - } - catch ( final SDIException e ) { - JOptionPane.showMessageDialog( this, - e.getLocalizedMessage(), - "Error during GSDI", - JOptionPane.ERROR_MESSAGE ); - return; - } - catch ( final Exception e ) { - AptxUtil.unexpectedException( e ); - return; - } - gene_tree.setRerootable( false ); - gene_tree.clearHashIdToNodeMap(); - gene_tree.recalculateNumberOfExternalDescendants( true ); - _mainpanel.addPhylogenyInNewTab( gene_tree, getConfiguration(), "gene tree", null ); - getControlPanel().setShowEvents( true ); - showWhole(); - final int selected = _mainpanel.getTabbedPane().getSelectedIndex(); - _mainpanel.addPhylogenyInNewTab( species_tree, getConfiguration(), "species tree", null ); - showWhole(); - _mainpanel.getTabbedPane().setSelectedIndex( selected ); - showWhole(); - _mainpanel.getCurrentTreePanel().setEdited( true ); - final int poly = PhylogenyMethods.countNumberOfPolytomies( species_tree ); - if ( gsdi.getStrippedExternalGeneTreeNodes().size() > 0 ) { - JOptionPane.showMessageDialog( this, - "Duplications: " + gsdi.getDuplicationsSum() + "\n" - + "Potential duplications: " - + gsdi.getSpeciationOrDuplicationEventsSum() + "\n" - + "Speciations: " + gsdi.getSpeciationsSum() + "\n" - + "Stripped gene tree nodes: " - + gsdi.getStrippedExternalGeneTreeNodes().size() + "\n" - + "Taxonomy linkage based on: " + gsdi.getTaxCompBase() + "\n" - + "Number of polytomies in species tree used: " + poly + "\n", - "GSDI successfully completed", - JOptionPane.WARNING_MESSAGE ); - } - else { - JOptionPane.showMessageDialog( this, - "Duplications: " + gsdi.getDuplicationsSum() + "\n" - + "Potential duplications: " - + gsdi.getSpeciationOrDuplicationEventsSum() + "\n" - + "Speciations: " + gsdi.getSpeciationsSum() + "\n" - + "Stripped gene tree nodes: " - + gsdi.getStrippedExternalGeneTreeNodes().size() + "\n" - + "Taxonomy linkage based on: " + gsdi.getTaxCompBase() + "\n" - + "Number of polytomies in species tree used: " + poly + "\n", - "GSDI successfully completed", - JOptionPane.INFORMATION_MESSAGE ); - } - } - - void executeGSDIR() { - if ( !isOKforSDI( false, false ) ) { - return; - } - final int p = PhylogenyMethods.countNumberOfPolytomies( _mainpanel.getCurrentPhylogeny() ); - if ( ( p > 0 ) - && !( ( p == 1 ) && ( _mainpanel.getCurrentPhylogeny().getRoot().getNumberOfDescendants() == 3 ) ) ) { - JOptionPane.showMessageDialog( this, - "Gene tree is not completely binary", - "Cannot execute GSDI", - JOptionPane.ERROR_MESSAGE ); - return; - } - final Phylogeny gene_tree = _mainpanel.getCurrentPhylogeny().copy(); - gene_tree.setAllNodesToNotCollapse(); - gene_tree.recalculateNumberOfExternalDescendants( false ); - GSDIR gsdir = null; - final Phylogeny species_tree = _species_tree.copy(); - try { - gsdir = new GSDIR( gene_tree, species_tree, true, true ); - } - catch ( final SDIException e ) { - JOptionPane.showMessageDialog( this, - e.getLocalizedMessage(), - "Error during GSDIR", - JOptionPane.ERROR_MESSAGE ); - return; - } - catch ( final Exception e ) { - AptxUtil.unexpectedException( e ); - return; - } - final Phylogeny result_gene_tree = gsdir.getMinDuplicationsSumGeneTree(); - result_gene_tree.setRerootable( false ); - result_gene_tree.clearHashIdToNodeMap(); - result_gene_tree.recalculateNumberOfExternalDescendants( true ); - _mainpanel.addPhylogenyInNewTab( result_gene_tree, getConfiguration(), "gene tree", null ); - getControlPanel().setShowEvents( true ); - showWhole(); - final int selected = _mainpanel.getTabbedPane().getSelectedIndex(); - _mainpanel.addPhylogenyInNewTab( species_tree, getConfiguration(), "species tree", null ); - showWhole(); - _mainpanel.getTabbedPane().setSelectedIndex( selected ); - showWhole(); - _mainpanel.getCurrentTreePanel().setEdited( true ); - final int poly = PhylogenyMethods.countNumberOfPolytomies( species_tree ); - if ( gsdir.getStrippedExternalGeneTreeNodes().size() > 0 ) { - JOptionPane.showMessageDialog( this, - "Minimal duplications: " + gsdir.getMinDuplicationsSum() + "\n" - + "Speciations: " + gsdir.getSpeciationsSum() + "\n" - + "Stripped gene tree nodes: " - + gsdir.getStrippedExternalGeneTreeNodes().size() + "\n" - + "Taxonomy linkage based on: " + gsdir.getTaxCompBase() + "\n" - + "Number of polytomies in species tree used: " + poly + "\n", - "GSDIR successfully completed", - JOptionPane.WARNING_MESSAGE ); - } - else { - JOptionPane.showMessageDialog( this, - "Minimal duplications: " + gsdir.getMinDuplicationsSum() + "\n" - + "Speciations: " + gsdir.getSpeciationsSum() + "\n" - + "Stripped gene tree nodes: " - + gsdir.getStrippedExternalGeneTreeNodes().size() + "\n" - + "Taxonomy linkage based on: " + gsdir.getTaxCompBase() + "\n" - + "Number of polytomies in species tree used: " + poly + "\n", - "GSDIR successfully completed", - JOptionPane.INFORMATION_MESSAGE ); - } - } - void executeLineageInference() { if ( ( _mainpanel.getCurrentPhylogeny() == null ) || ( _mainpanel.getCurrentPhylogeny().isEmpty() ) ) { return; @@ -1320,36 +1157,6 @@ public final class MainFrameApplication extends MainFrame { System.exit( 0 ); } - boolean isOKforSDI( final boolean species_tree_has_to_binary, final boolean gene_tree_has_to_binary ) { - if ( ( _mainpanel.getCurrentPhylogeny() == null ) || _mainpanel.getCurrentPhylogeny().isEmpty() ) { - return false; - } - else if ( ( _species_tree == null ) || _species_tree.isEmpty() ) { - JOptionPane.showMessageDialog( this, - "No species tree loaded", - "Cannot execute GSDI", - JOptionPane.ERROR_MESSAGE ); - return false; - } - else if ( species_tree_has_to_binary && !_species_tree.isCompletelyBinary() ) { - JOptionPane.showMessageDialog( this, - "Species tree is not completely binary", - "Cannot execute GSDI", - JOptionPane.ERROR_MESSAGE ); - return false; - } - else if ( gene_tree_has_to_binary && !_mainpanel.getCurrentPhylogeny().isCompletelyBinary() ) { - JOptionPane.showMessageDialog( this, - "Gene tree is not completely binary", - "Cannot execute GSDI", - JOptionPane.ERROR_MESSAGE ); - return false; - } - else { - return true; - } - } - @Override void readPhylogeniesFromURL() { URL url = null; @@ -1484,6 +1291,118 @@ public final class MainFrameApplication extends MainFrame { _contentpane.repaint(); } + private void addExpressionValuesFromFile() { + if ( ( getCurrentTreePanel() == null ) || ( getCurrentTreePanel().getPhylogeny() == null ) ) { + JOptionPane.showMessageDialog( this, + "Need to load evolutionary tree first", + "Can Not Read Expression Values", + JOptionPane.WARNING_MESSAGE ); + return; + } + final File my_dir = getCurrentDir(); + if ( my_dir != null ) { + _values_filechooser.setCurrentDirectory( my_dir ); + } + final int result = _values_filechooser.showOpenDialog( _contentpane ); + final File file = _values_filechooser.getSelectedFile(); + if ( ( file != null ) && ( file.length() > 0 ) && ( result == JFileChooser.APPROVE_OPTION ) ) { + BasicTable t = null; + try { + t = BasicTableParser.parse( file, "\t" ); + if ( t.getNumberOfColumns() < 2 ) { + t = BasicTableParser.parse( file, "," ); + } + if ( t.getNumberOfColumns() < 2 ) { + t = BasicTableParser.parse( file, " " ); + } + } + catch ( final IOException e ) { + JOptionPane.showMessageDialog( this, + e.getMessage(), + "Could Not Read Expression Value Table", + JOptionPane.ERROR_MESSAGE ); + return; + } + if ( t.getNumberOfColumns() < 2 ) { + JOptionPane.showMessageDialog( this, + "Table contains " + t.getNumberOfColumns() + " column(s)", + "Problem with Expression Value Table", + JOptionPane.ERROR_MESSAGE ); + return; + } + if ( t.getNumberOfRows() < 1 ) { + JOptionPane.showMessageDialog( this, + "Table contains zero rows", + "Problem with Expression Value Table", + JOptionPane.ERROR_MESSAGE ); + return; + } + final Phylogeny phy = getCurrentTreePanel().getPhylogeny(); + if ( t.getNumberOfRows() != phy.getNumberOfExternalNodes() ) { + JOptionPane.showMessageDialog( this, + "Table contains " + t.getNumberOfRows() + " rows, but tree contains " + + phy.getNumberOfExternalNodes() + " external nodes", + "Warning", + JOptionPane.WARNING_MESSAGE ); + } + final DescriptiveStatistics stats = new BasicDescriptiveStatistics(); + int not_found = 0; + for( final PhylogenyNodeIterator iter = phy.iteratorPreorder(); iter.hasNext(); ) { + final PhylogenyNode node = iter.next(); + final String node_name = node.getName(); + if ( !ForesterUtil.isEmpty( node_name ) ) { + int row = -1; + try { + row = t.findRow( node_name ); + } + catch ( final IllegalArgumentException e ) { + JOptionPane + .showMessageDialog( this, + e.getMessage(), + "Error Mapping Node Identifiers to Expression Value Identifiers", + JOptionPane.ERROR_MESSAGE ); + return; + } + if ( row < 0 ) { + if ( node.isExternal() ) { + not_found++; + } + continue; + } + final List l = new ArrayList(); + for( int col = 1; col < t.getNumberOfColumns(); ++col ) { + double d = -100; + try { + d = Double.parseDouble( t.getValueAsString( col, row ) ); + } + catch ( final NumberFormatException e ) { + JOptionPane.showMessageDialog( this, + "Could not parse \"" + t.getValueAsString( col, row ) + + "\" into a decimal value", + "Issue with Expression Value Table", + JOptionPane.ERROR_MESSAGE ); + return; + } + stats.addValue( d ); + l.add( d ); + } + if ( !l.isEmpty() ) { + if ( node.getNodeData().getProperties() != null ) { + node.getNodeData().getProperties() + .removePropertiesWithGivenReferencePrefix( PhyloXmlUtil.VECTOR_PROPERTY_REF ); + } + node.getNodeData().setVector( l ); + } + } + } + if ( not_found > 0 ) { + JOptionPane.showMessageDialog( this, "Could not fine expression values for " + not_found + + " external node(s)", "Warning", JOptionPane.WARNING_MESSAGE ); + } + getCurrentTreePanel().setStatisticsForExpressionValues( stats ); + } + } + private void addSequencesFromFile() { if ( ( getCurrentTreePanel() == null ) || ( getCurrentTreePanel().getPhylogeny() == null ) ) { JOptionPane.showMessageDialog( this, @@ -1640,127 +1559,6 @@ public final class MainFrameApplication extends MainFrame { } } - private void setArrowCursor() { - try { - _mainpanel.getCurrentTreePanel().setArrowCursor(); - } - catch ( final Exception ex ) { - // Do nothing. - } - } - - private void addExpressionValuesFromFile() { - if ( ( getCurrentTreePanel() == null ) || ( getCurrentTreePanel().getPhylogeny() == null ) ) { - JOptionPane.showMessageDialog( this, - "Need to load evolutionary tree first", - "Can Not Read Expression Values", - JOptionPane.WARNING_MESSAGE ); - return; - } - final File my_dir = getCurrentDir(); - if ( my_dir != null ) { - _values_filechooser.setCurrentDirectory( my_dir ); - } - final int result = _values_filechooser.showOpenDialog( _contentpane ); - final File file = _values_filechooser.getSelectedFile(); - if ( ( file != null ) && ( file.length() > 0 ) && ( result == JFileChooser.APPROVE_OPTION ) ) { - BasicTable t = null; - try { - t = BasicTableParser.parse( file, "\t" ); - if ( t.getNumberOfColumns() < 2 ) { - t = BasicTableParser.parse( file, "," ); - } - if ( t.getNumberOfColumns() < 2 ) { - t = BasicTableParser.parse( file, " " ); - } - } - catch ( final IOException e ) { - JOptionPane.showMessageDialog( this, - e.getMessage(), - "Could Not Read Expression Value Table", - JOptionPane.ERROR_MESSAGE ); - return; - } - if ( t.getNumberOfColumns() < 2 ) { - JOptionPane.showMessageDialog( this, - "Table contains " + t.getNumberOfColumns() + " column(s)", - "Problem with Expression Value Table", - JOptionPane.ERROR_MESSAGE ); - return; - } - if ( t.getNumberOfRows() < 1 ) { - JOptionPane.showMessageDialog( this, - "Table contains zero rows", - "Problem with Expression Value Table", - JOptionPane.ERROR_MESSAGE ); - return; - } - final Phylogeny phy = getCurrentTreePanel().getPhylogeny(); - if ( t.getNumberOfRows() != phy.getNumberOfExternalNodes() ) { - JOptionPane.showMessageDialog( this, - "Table contains " + t.getNumberOfRows() + " rows, but tree contains " - + phy.getNumberOfExternalNodes() + " external nodes", - "Warning", - JOptionPane.WARNING_MESSAGE ); - } - final DescriptiveStatistics stats = new BasicDescriptiveStatistics(); - int not_found = 0; - for( final PhylogenyNodeIterator iter = phy.iteratorPreorder(); iter.hasNext(); ) { - final PhylogenyNode node = iter.next(); - final String node_name = node.getName(); - if ( !ForesterUtil.isEmpty( node_name ) ) { - int row = -1; - try { - row = t.findRow( node_name ); - } - catch ( final IllegalArgumentException e ) { - JOptionPane - .showMessageDialog( this, - e.getMessage(), - "Error Mapping Node Identifiers to Expression Value Identifiers", - JOptionPane.ERROR_MESSAGE ); - return; - } - if ( row < 0 ) { - if ( node.isExternal() ) { - not_found++; - } - continue; - } - final List l = new ArrayList(); - for( int col = 1; col < t.getNumberOfColumns(); ++col ) { - double d = -100; - try { - d = Double.parseDouble( t.getValueAsString( col, row ) ); - } - catch ( final NumberFormatException e ) { - JOptionPane.showMessageDialog( this, - "Could not parse \"" + t.getValueAsString( col, row ) - + "\" into a decimal value", - "Issue with Expression Value Table", - JOptionPane.ERROR_MESSAGE ); - return; - } - stats.addValue( d ); - l.add( d ); - } - if ( !l.isEmpty() ) { - if ( node.getNodeData().getProperties() != null ) { - node.getNodeData().getProperties() - .removePropertiesWithGivenReferencePrefix( PhyloXmlUtil.VECTOR_PROPERTY_REF ); - } - node.getNodeData().setVector( l ); - } - } - } - if ( not_found > 0 ) { - JOptionPane.showMessageDialog( this, "Could not fine expression values for " + not_found - + " external node(s)", "Warning", JOptionPane.WARNING_MESSAGE ); - } - getCurrentTreePanel().setStatisticsForExpressionValues( stats ); - } - } - private void choosePdfWidth() { final String s = ( String ) JOptionPane.showInputDialog( this, "Please enter the default line width for PDF export.\n" @@ -2513,6 +2311,15 @@ public final class MainFrameApplication extends MainFrame { } } + private void setArrowCursor() { + try { + _mainpanel.getCurrentTreePanel().setArrowCursor(); + } + catch ( final Exception ex ) { + // Do nothing. + } + } + private void setCurrentDir( final File current_dir ) { _current_dir = current_dir; } diff --git a/forester/java/src/org/forester/util/ForesterConstants.java b/forester/java/src/org/forester/util/ForesterConstants.java index 1232c66..1f8d1c0 100644 --- a/forester/java/src/org/forester/util/ForesterConstants.java +++ b/forester/java/src/org/forester/util/ForesterConstants.java @@ -27,8 +27,8 @@ package org.forester.util; public final class ForesterConstants { - public final static String FORESTER_VERSION = "1.023"; - public final static String FORESTER_DATE = "130306"; + public final static String FORESTER_VERSION = "1.024"; + public final static String FORESTER_DATE = "130308"; public final static String PHYLO_XML_VERSION = "1.10"; public final static String PHYLO_XML_LOCATION = "http://www.phyloxml.org"; public final static String PHYLO_XML_XSD = "phyloxml.xsd"; -- 1.7.10.2