X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=forester%2Fjava%2Fsrc%2Forg%2Fforester%2Farchaeopteryx%2FMainFrameApplication.java;h=5954fe3c86273f4ad6b9b02bb8cd7870015dcb90;hb=e928c819cdb894764733f5d40441a8235a6c629a;hp=d3b700d71ed554b418ae4acda60a7ce1c8a5d74a;hpb=1051703a697d29be2dc59ed1ed26b7ce5665ad66;p=jalview.git diff --git a/forester/java/src/org/forester/archaeopteryx/MainFrameApplication.java b/forester/java/src/org/forester/archaeopteryx/MainFrameApplication.java index d3b700d..5954fe3 100644 --- a/forester/java/src/org/forester/archaeopteryx/MainFrameApplication.java +++ b/forester/java/src/org/forester/archaeopteryx/MainFrameApplication.java @@ -22,7 +22,7 @@ // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA // // Contact: phylosoft @ gmail . com -// WWW: www.phylosoft.org/forester +// WWW: https://sites.google.com/site/cmzmasek/home/software/forester package org.forester.archaeopteryx; @@ -101,7 +101,6 @@ import org.forester.phylogeny.iterators.PhylogenyNodeIterator; import org.forester.sdi.GSDI; import org.forester.sdi.GSDIR; import org.forester.sdi.SDIException; -import org.forester.sdi.SDIR; import org.forester.sequence.Sequence; import org.forester.util.BasicDescriptiveStatistics; import org.forester.util.BasicTable; @@ -129,9 +128,10 @@ public final class MainFrameApplication extends MainFrame { private final static DefaultFilter defaultfilter = new DefaultFilter(); private static final long serialVersionUID = -799735726778865234L; private final JFileChooser _values_filechooser; + private final JFileChooser _sequences_filechooser; private final JFileChooser _open_filechooser; private final JFileChooser _msa_filechooser; - private final JFileChooser _seqs_filechooser; + private final JFileChooser _seqs_pi_filechooser; private final JFileChooser _open_filechooser_for_species_tree; private final JFileChooser _save_filechooser; private final JFileChooser _writetopdf_filechooser; @@ -141,8 +141,6 @@ public final class MainFrameApplication extends MainFrame { private JMenuItem _load_species_tree_item; private JMenuItem _gsdi_item; private JMenuItem _gsdir_item; - private JMenuItem _root_min_dups_item; - private JMenuItem _root_min_cost_l_item; private JMenuItem _lineage_inference; private JMenuItem _function_analysis; // Application-only print menu items @@ -153,7 +151,6 @@ public final class MainFrameApplication extends MainFrame { private JMenuItem _write_to_tif_item; private JMenuItem _write_to_png_item; private JMenuItem _write_to_bmp_item; - private Phylogeny _species_tree; private File _current_dir; private ButtonGroup _radio_group_1; private ButtonGroup _radio_group_2; @@ -169,8 +166,8 @@ public final class MainFrameApplication extends MainFrame { private File _msa_file = null; private List _seqs = null; private File _seqs_file = null; - // expression values menu: JMenuItem _read_values_jmi; + JMenuItem _read_seqs_jmi; private MainFrameApplication( final Phylogeny[] phys, final Configuration config ) { _configuration = config; @@ -186,8 +183,9 @@ public final class MainFrameApplication extends MainFrame { _writetopdf_filechooser = null; _writetographics_filechooser = null; _msa_filechooser = null; - _seqs_filechooser = null; + _seqs_pi_filechooser = null; _values_filechooser = null; + _sequences_filechooser = null; _jmenubar = new JMenuBar(); buildFileMenu(); buildTypeMenu(); @@ -277,7 +275,6 @@ public final class MainFrameApplication extends MainFrame { setInferenceManager( InferenceManager.createInstance( _configuration ) ); setPhylogeneticInferenceOptions( PhylogeneticInferenceOptions.createInstance( _configuration ) ); // _textframe = null; #~~~~ - _species_tree = null; // set title setTitle( Constants.PRG_NAME + " " + Constants.VERSION + " (" + Constants.PRG_DATE + ")" ); _mainpanel = new MainPanel( _configuration, this ); @@ -302,7 +299,6 @@ public final class MainFrameApplication extends MainFrame { _save_filechooser.setCurrentDirectory( new File( "." ) ); _save_filechooser.setMultiSelectionEnabled( false ); _save_filechooser.setFileFilter( MainFrameApplication.xmlfilter ); - _save_filechooser.addChoosableFileFilter( MainFrameApplication.nhxfilter ); _save_filechooser.addChoosableFileFilter( MainFrameApplication.nhfilter ); _save_filechooser.addChoosableFileFilter( MainFrameApplication.nexusfilter ); _save_filechooser.addChoosableFileFilter( _save_filechooser.getAcceptAllFileFilter() ); @@ -318,16 +314,20 @@ public final class MainFrameApplication extends MainFrame { _msa_filechooser.addChoosableFileFilter( _msa_filechooser.getAcceptAllFileFilter() ); _msa_filechooser.addChoosableFileFilter( MainFrameApplication.msafilter ); // Seqs: - _seqs_filechooser = new JFileChooser(); - _seqs_filechooser.setName( "Read Sequences File" ); - _seqs_filechooser.setCurrentDirectory( new File( "." ) ); - _seqs_filechooser.setMultiSelectionEnabled( false ); - _seqs_filechooser.addChoosableFileFilter( _seqs_filechooser.getAcceptAllFileFilter() ); - _seqs_filechooser.addChoosableFileFilter( MainFrameApplication.seqsfilter ); + _seqs_pi_filechooser = new JFileChooser(); + _seqs_pi_filechooser.setName( "Read Sequences File" ); + _seqs_pi_filechooser.setCurrentDirectory( new File( "." ) ); + _seqs_pi_filechooser.setMultiSelectionEnabled( false ); + _seqs_pi_filechooser.addChoosableFileFilter( _seqs_pi_filechooser.getAcceptAllFileFilter() ); + _seqs_pi_filechooser.addChoosableFileFilter( MainFrameApplication.seqsfilter ); // Expression _values_filechooser = new JFileChooser(); _values_filechooser.setCurrentDirectory( new File( "." ) ); _values_filechooser.setMultiSelectionEnabled( false ); + // Sequences + _sequences_filechooser = new JFileChooser(); + _sequences_filechooser.setCurrentDirectory( new File( "." ) ); + _sequences_filechooser.setMultiSelectionEnabled( false ); // build the menu bar _jmenubar = new JMenuBar(); if ( !_configuration.isUseNativeUI() ) { @@ -391,11 +391,11 @@ public final class MainFrameApplication extends MainFrame { @Override public void componentResized( final ComponentEvent e ) { if ( _mainpanel.getCurrentTreePanel() != null ) { - _mainpanel.getCurrentTreePanel().setParametersForPainting( _mainpanel.getCurrentTreePanel() - .getWidth(), - _mainpanel.getCurrentTreePanel() - .getHeight(), - false ); + _mainpanel.getCurrentTreePanel().calcParametersForPainting( _mainpanel.getCurrentTreePanel() + .getWidth(), + _mainpanel.getCurrentTreePanel() + .getHeight(), + getOptions().isAllowFontSizeChange() ); } } } ); @@ -500,6 +500,12 @@ public final class MainFrameApplication extends MainFrame { } addExpressionValuesFromFile(); } + else if ( o == _read_seqs_jmi ) { + if ( isSubtreeDisplayed() ) { + return; + } + addSequencesFromFile(); + } else if ( o == _move_node_names_to_tax_sn_jmi ) { moveNodeNamesToTaxSn(); } @@ -521,18 +527,6 @@ public final class MainFrameApplication extends MainFrame { } executeGSDIR(); } - else if ( o == _root_min_dups_item ) { - if ( isSubtreeDisplayed() ) { - return; - } - executeSDIR( false ); - } - else if ( o == _root_min_cost_l_item ) { - if ( isSubtreeDisplayed() ) { - return; - } - executeSDIR( true ); - } else if ( o == _graphics_export_visible_only_cbmi ) { updateOptions( getOptions() ); } @@ -645,12 +639,7 @@ public final class MainFrameApplication extends MainFrame { } } catch ( final MsaFormatException e ) { - try { - _mainpanel.getCurrentTreePanel().setArrowCursor(); - } - catch ( final Exception ex ) { - // Do nothing. - } + setArrowCursor(); JOptionPane.showMessageDialog( this, e.getLocalizedMessage(), "Multiple sequence alignment format error", @@ -658,12 +647,7 @@ public final class MainFrameApplication extends MainFrame { return; } catch ( final IOException e ) { - try { - _mainpanel.getCurrentTreePanel().setArrowCursor(); - } - catch ( final Exception ex ) { - // Do nothing. - } + setArrowCursor(); JOptionPane.showMessageDialog( this, e.getLocalizedMessage(), "Failed to read multiple sequence alignment", @@ -671,12 +655,7 @@ public final class MainFrameApplication extends MainFrame { return; } catch ( final IllegalArgumentException e ) { - try { - _mainpanel.getCurrentTreePanel().setArrowCursor(); - } - catch ( final Exception ex ) { - // Do nothing. - } + setArrowCursor(); JOptionPane.showMessageDialog( this, e.getLocalizedMessage(), "Unexpected error during reading of multiple sequence alignment", @@ -684,12 +663,7 @@ public final class MainFrameApplication extends MainFrame { return; } catch ( final Exception e ) { - try { - _mainpanel.getCurrentTreePanel().setArrowCursor(); - } - catch ( final Exception ex ) { - // Do nothing. - } + setArrowCursor(); e.printStackTrace(); JOptionPane.showMessageDialog( this, e.getLocalizedMessage(), @@ -724,18 +698,18 @@ public final class MainFrameApplication extends MainFrame { } } - public void readSeqsFromFile() { + public void readSeqsFromFileforPI() { // Set an initial directory if none set yet final File my_dir = getCurrentDir(); - _seqs_filechooser.setMultiSelectionEnabled( false ); + _seqs_pi_filechooser.setMultiSelectionEnabled( false ); // Open file-open dialog and set current directory if ( my_dir != null ) { - _seqs_filechooser.setCurrentDirectory( my_dir ); + _seqs_pi_filechooser.setCurrentDirectory( my_dir ); } - final int result = _seqs_filechooser.showOpenDialog( _contentpane ); + final int result = _seqs_pi_filechooser.showOpenDialog( _contentpane ); // All done: get the seqs - final File file = _seqs_filechooser.getSelectedFile(); - setCurrentDir( _seqs_filechooser.getCurrentDirectory() ); + final File file = _seqs_pi_filechooser.getSelectedFile(); + setCurrentDir( _seqs_pi_filechooser.getCurrentDirectory() ); if ( ( file != null ) && !file.isDirectory() && ( result == JFileChooser.APPROVE_OPTION ) ) { setSeqsFile( null ); setSeqs( null ); @@ -752,12 +726,7 @@ public final class MainFrameApplication extends MainFrame { } } catch ( final MsaFormatException e ) { - try { - _mainpanel.getCurrentTreePanel().setArrowCursor(); - } - catch ( final Exception ex ) { - // Do nothing. - } + setArrowCursor(); JOptionPane.showMessageDialog( this, e.getLocalizedMessage(), "Multiple sequence file format error", @@ -765,12 +734,7 @@ public final class MainFrameApplication extends MainFrame { return; } catch ( final IOException e ) { - try { - _mainpanel.getCurrentTreePanel().setArrowCursor(); - } - catch ( final Exception ex ) { - // Do nothing. - } + setArrowCursor(); JOptionPane.showMessageDialog( this, e.getLocalizedMessage(), "Failed to read multiple sequence file", @@ -778,12 +742,7 @@ public final class MainFrameApplication extends MainFrame { return; } catch ( final IllegalArgumentException e ) { - try { - _mainpanel.getCurrentTreePanel().setArrowCursor(); - } - catch ( final Exception ex ) { - // Do nothing. - } + setArrowCursor(); JOptionPane.showMessageDialog( this, e.getLocalizedMessage(), "Unexpected error during reading of multiple sequence file", @@ -791,12 +750,7 @@ public final class MainFrameApplication extends MainFrame { return; } catch ( final Exception e ) { - try { - _mainpanel.getCurrentTreePanel().setArrowCursor(); - } - catch ( final Exception ex ) { - // Do nothing. - } + setArrowCursor(); e.printStackTrace(); JOptionPane.showMessageDialog( this, e.getLocalizedMessage(), @@ -826,7 +780,7 @@ public final class MainFrameApplication extends MainFrame { // return; // } System.gc(); - setSeqsFile( _seqs_filechooser.getSelectedFile() ); + setSeqsFile( _seqs_pi_filechooser.getSelectedFile() ); setSeqs( seqs ); } } @@ -834,16 +788,10 @@ public final class MainFrameApplication extends MainFrame { 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 (re-rooting)" ) ); - _analysis_menu.addSeparator(); - _analysis_menu.add( _root_min_dups_item = new JMenuItem( "Root by Minimizing Duplications | Height (SDI)" ) ); - _analysis_menu.add( _root_min_cost_l_item = new JMenuItem( "Root by Minimizing Cost L | Height (SDI)" ) ); - _analysis_menu.addSeparator(); + _analysis_menu.add( _gsdir_item = new JMenuItem( "GSDIR (GSDI with re-rooting)" ) ); _analysis_menu.add( _load_species_tree_item = new JMenuItem( "Load Species Tree..." ) ); customizeJMenuItem( _gsdi_item ); customizeJMenuItem( _gsdir_item ); - customizeJMenuItem( _root_min_dups_item ); - customizeJMenuItem( _root_min_cost_l_item ); customizeJMenuItem( _load_species_tree_item ); _analysis_menu.addSeparator(); _analysis_menu.add( _lineage_inference = new JMenuItem( INFER_ANCESTOR_TAXONOMIES ) ); @@ -963,7 +911,10 @@ public final class MainFrameApplication extends MainFrame { _options_jmenu .add( _show_branch_length_values_cbmi = new JCheckBoxMenuItem( DISPLAY_BRANCH_LENGTH_VALUES_LABEL ) ); _options_jmenu.add( _show_confidence_stddev_cbmi = new JCheckBoxMenuItem( SHOW_CONF_STDDEV_LABEL ) ); - _options_jmenu.add( _show_default_node_shapes_cbmi = new JCheckBoxMenuItem( DISPLAY_NODE_BOXES_LABEL ) ); + _options_jmenu + .add( _show_default_node_shapes_internal_cbmi = new JCheckBoxMenuItem( DISPLAY_NODE_BOXES_LABEL_INT ) ); + _options_jmenu + .add( _show_default_node_shapes_external_cbmi = new JCheckBoxMenuItem( DISPLAY_NODE_BOXES_LABEL_EXT ) ); _options_jmenu .add( _taxonomy_colorize_node_shapes_cbmi = new JCheckBoxMenuItem( MainFrame.TAXONOMY_COLORIZE_NODE_SHAPES_LABEL ) ); _options_jmenu.add( _cycle_node_shape_mi = new JMenuItem( MainFrame.CYCLE_NODE_SHAPE_LABEL ) ); @@ -1034,7 +985,10 @@ public final class MainFrameApplication extends MainFrame { customizeJMenuItem( _print_size_mi ); customizeJMenuItem( _choose_pdf_width_mi ); customizeJMenuItem( _overview_placment_mi ); - customizeCheckBoxMenuItem( _show_default_node_shapes_cbmi, getOptions().isShowDefaultNodeShapes() ); + customizeCheckBoxMenuItem( _show_default_node_shapes_external_cbmi, getOptions() + .isShowDefaultNodeShapesExternal() ); + customizeCheckBoxMenuItem( _show_default_node_shapes_internal_cbmi, getOptions() + .isShowDefaultNodeShapesInternal() ); customizeCheckBoxMenuItem( _taxonomy_colorize_node_shapes_cbmi, getOptions().isTaxonomyColorizeNodeShapes() ); customizeJMenuItem( _cycle_node_shape_mi ); customizeJMenuItem( _cycle_node_fill_mi ); @@ -1063,9 +1017,9 @@ public final class MainFrameApplication extends MainFrame { customizeRadioButtonMenuItem( _extract_taxonomy_no_rbmi, getOptions().getTaxonomyExtraction() == TAXONOMY_EXTRACTION.NO ); customizeRadioButtonMenuItem( _extract_taxonomy_yes_rbmi, - getOptions().getTaxonomyExtraction() == TAXONOMY_EXTRACTION.YES ); + getOptions().getTaxonomyExtraction() == TAXONOMY_EXTRACTION.PFAM_STYLE_RELAXED ); customizeRadioButtonMenuItem( _extract_taxonomy_pfam_rbmi, - getOptions().getTaxonomyExtraction() == TAXONOMY_EXTRACTION.PFAM_STYLE_ONLY ); + getOptions().getTaxonomyExtraction() == TAXONOMY_EXTRACTION.PFAM_STYLE_STRICT ); customizeCheckBoxMenuItem( _replace_underscores_cbmi, getOptions().isReplaceUnderscoresInNhParsing() ); customizeCheckBoxMenuItem( _search_whole_words_only_cbmi, getOptions().isMatchWholeTermsOnly() ); customizeCheckBoxMenuItem( _inverse_search_result_cbmi, getOptions().isInverseSearchResult() ); @@ -1163,9 +1117,14 @@ public final class MainFrameApplication extends MainFrame { .setToolTipText( "To add UniProtKB annotations for sequences with appropriate identifiers" ); _tools_menu.addSeparator(); } - _tools_menu.add( _read_values_jmi = new JMenuItem( "Read Vector/Expression Values" ) ); + _tools_menu.add( _read_values_jmi = new JMenuItem( "Attach Vector/Expression Values" ) ); customizeJMenuItem( _read_values_jmi ); - _read_values_jmi.setToolTipText( "To add vector (e.g. gene expression) values (beta)" ); + _read_values_jmi.setToolTipText( "To attach vector (e.g. gene expression) values to tree nodes (beta)" ); + _jmenubar.add( _tools_menu ); + _tools_menu.add( _read_seqs_jmi = new JMenuItem( "Attach Molecular Sequences" ) ); + customizeJMenuItem( _read_seqs_jmi ); + _read_seqs_jmi + .setToolTipText( "To attach molecular sequences to tree nodes (from Fasta-formatted file) (beta)" ); _jmenubar.add( _tools_menu ); } @@ -1224,11 +1183,9 @@ public final class MainFrameApplication extends MainFrame { return; } gene_tree.setRerootable( false ); - _mainpanel.getCurrentTreePanel().setTree( gene_tree ); - _mainpanel.getCurrentPhylogeny().clearHashIdToNodeMap(); - _mainpanel.getCurrentPhylogeny().recalculateNumberOfExternalDescendants( true ); - _mainpanel.getCurrentTreePanel().resetNodeIdToDistToLeafMap(); - _mainpanel.getCurrentTreePanel().setEdited( true ); + 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(); @@ -1237,13 +1194,46 @@ public final class MainFrameApplication extends MainFrame { _mainpanel.getTabbedPane().setSelectedIndex( selected ); showWhole(); _mainpanel.getCurrentTreePanel().setEdited( true ); - JOptionPane.showMessageDialog( this, "Duplications: " + gsdi.getDuplicationsSum() + "\n" - + "Potential duplications: " + gsdi.getSpeciationOrDuplicationEventsSum() + "\n" + "Speciations: " - + gsdi.getSpeciationsSum(), "GSDI successfully completed", JOptionPane.INFORMATION_MESSAGE ); + 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, true ) ) { + 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(); @@ -1265,9 +1255,7 @@ public final class MainFrameApplication extends MainFrame { AptxUtil.unexpectedException( e ); return; } - final List assigned_trees = gsdir.getMinDuplicationsSumGeneTrees(); - final List shortests = GSDIR.getIndexesOfShortestTree( assigned_trees ); - final Phylogeny result_gene_tree = assigned_trees.get( shortests.get( 0 ) ); + final Phylogeny result_gene_tree = gsdir.getMinDuplicationsSumGeneTree(); result_gene_tree.setRerootable( false ); result_gene_tree.clearHashIdToNodeMap(); result_gene_tree.recalculateNumberOfExternalDescendants( true ); @@ -1280,14 +1268,29 @@ public final class MainFrameApplication extends MainFrame { _mainpanel.getTabbedPane().setSelectedIndex( selected ); showWhole(); _mainpanel.getCurrentTreePanel().setEdited( true ); - JOptionPane.showMessageDialog( this, - "Duplications (min): " + gsdir.getMinDuplicationsSum() + "\n" + "Speciations: " - + gsdir.getSpeciationsSum() + "\n" - + "Number of root positions minimizing duplications sum: " - + gsdir.getMinDuplicationsSumGeneTrees().size() + "\n" - + "Number of shortest trees: " + shortests.size(), - "GSDIR successfully completed", - JOptionPane.INFORMATION_MESSAGE ); + 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() { @@ -1308,37 +1311,6 @@ public final class MainFrameApplication extends MainFrame { new Thread( inferrer ).start(); } - void executeSDIR( final boolean minimize_cost ) { - if ( !isOKforSDI( true, true ) ) { - return; - } - Phylogeny gene_tree = _mainpanel.getCurrentPhylogeny().copy(); - final SDIR sdiunrooted = new SDIR(); - gene_tree.setAllNodesToNotCollapse(); - gene_tree.recalculateNumberOfExternalDescendants( false ); - try { - gene_tree = sdiunrooted.infer( gene_tree, _species_tree, minimize_cost, // minimize cost - !minimize_cost, // minimize sum of dups - true, // minimize height - true, // return tree(s) - 1 )[ 0 ]; // # of trees to return - } - catch ( final Exception e ) { - JOptionPane.showMessageDialog( this, e.toString(), "Error during SDIR", JOptionPane.ERROR_MESSAGE ); - return; - } - final int duplications = sdiunrooted.getMinimalDuplications(); - gene_tree.setRerootable( false ); - _mainpanel.getCurrentTreePanel().setTree( gene_tree ); - getControlPanel().setShowEvents( true ); - showWhole(); - _mainpanel.getCurrentTreePanel().setEdited( true ); - JOptionPane.showMessageDialog( this, - "Number of duplications: " + duplications, - "SDIR successfully completed", - JOptionPane.INFORMATION_MESSAGE ); - } - void exit() { removeAllTextFrames(); _mainpanel.terminate(); @@ -1355,21 +1327,21 @@ public final class MainFrameApplication extends MainFrame { else if ( ( _species_tree == null ) || _species_tree.isEmpty() ) { JOptionPane.showMessageDialog( this, "No species tree loaded", - "Cannot execute SDI", + "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 SDI", + "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 SDI", + "Cannot execute GSDI", JOptionPane.ERROR_MESSAGE ); return false; } @@ -1476,9 +1448,9 @@ public final class MainFrameApplication extends MainFrame { } void writePhylogenyToGraphicsFile( final String file_name, final GraphicsExportType type ) { - _mainpanel.getCurrentTreePanel().setParametersForPainting( _mainpanel.getCurrentTreePanel().getWidth(), - _mainpanel.getCurrentTreePanel().getHeight(), - true ); + _mainpanel.getCurrentTreePanel().calcParametersForPainting( _mainpanel.getCurrentTreePanel().getWidth(), + _mainpanel.getCurrentTreePanel().getHeight(), + true ); String file_written_to = ""; boolean error = false; try { @@ -1512,6 +1484,171 @@ public final class MainFrameApplication extends MainFrame { _contentpane.repaint(); } + private void addSequencesFromFile() { + if ( ( getCurrentTreePanel() == null ) || ( getCurrentTreePanel().getPhylogeny() == null ) ) { + JOptionPane.showMessageDialog( this, + "Need to load evolutionary tree first", + "Can Not Read Sequences", + JOptionPane.WARNING_MESSAGE ); + return; + } + final File my_dir = getCurrentDir(); + if ( my_dir != null ) { + _sequences_filechooser.setCurrentDirectory( my_dir ); + } + final int result = _sequences_filechooser.showOpenDialog( _contentpane ); + final File file = _sequences_filechooser.getSelectedFile(); + List seqs = null; + if ( ( file != null ) && !file.isDirectory() && ( result == JFileChooser.APPROVE_OPTION ) ) { + try { + if ( FastaParser.isLikelyFasta( new FileInputStream( file ) ) ) { + seqs = FastaParser.parse( new FileInputStream( file ) ); + } + else { + JOptionPane.showMessageDialog( this, + "Format does not appear to be Fasta", + "Multiple sequence file format error", + JOptionPane.ERROR_MESSAGE ); + return; + } + } + catch ( final MsaFormatException e ) { + setArrowCursor(); + JOptionPane.showMessageDialog( this, + e.getLocalizedMessage(), + "Multiple sequence file format error", + JOptionPane.ERROR_MESSAGE ); + return; + } + catch ( final IOException e ) { + setArrowCursor(); + JOptionPane.showMessageDialog( this, + e.getLocalizedMessage(), + "Failed to read multiple sequence file", + JOptionPane.ERROR_MESSAGE ); + return; + } + catch ( final Exception e ) { + setArrowCursor(); + e.printStackTrace(); + JOptionPane.showMessageDialog( this, + e.getLocalizedMessage(), + "Unexpected error during reading of multiple sequence file", + JOptionPane.ERROR_MESSAGE ); + return; + } + if ( ( seqs == null ) || ( seqs.size() < 1 ) ) { + JOptionPane.showMessageDialog( this, + "Multiple sequence file is empty", + "Empty multiple sequence file", + JOptionPane.ERROR_MESSAGE ); + setArrowCursor(); + return; + } + } + if ( seqs != null ) { + for( final Sequence seq : seqs ) { + System.out.println( seq.getIdentifier() ); + } + final Phylogeny phy = getCurrentTreePanel().getPhylogeny(); + int total_counter = 0; + int attached_counter = 0; + for( final Sequence seq : seqs ) { + ++total_counter; + final String seq_name = seq.getIdentifier(); + if ( !ForesterUtil.isEmpty( seq_name ) ) { + List nodes = phy.getNodesViaSequenceName( seq_name ); + if ( nodes.isEmpty() ) { + nodes = phy.getNodesViaSequenceSymbol( seq_name ); + } + if ( nodes.isEmpty() ) { + nodes = phy.getNodes( seq_name ); + } + if ( nodes.size() > 1 ) { + JOptionPane.showMessageDialog( this, + "Sequence name \"" + seq_name + "\" is not unique", + "Sequence name not unique", + JOptionPane.ERROR_MESSAGE ); + setArrowCursor(); + return; + } + final String[] a = seq_name.split( "\\s" ); + if ( nodes.isEmpty() && ( a.length > 1 ) ) { + final String seq_name_split = a[ 0 ]; + nodes = phy.getNodesViaSequenceName( seq_name_split ); + if ( nodes.isEmpty() ) { + nodes = phy.getNodesViaSequenceSymbol( seq_name_split ); + } + if ( nodes.isEmpty() ) { + nodes = phy.getNodes( seq_name_split ); + } + if ( nodes.size() > 1 ) { + JOptionPane.showMessageDialog( this, "Split sequence name \"" + seq_name_split + + "\" is not unique", "Sequence name not unique", JOptionPane.ERROR_MESSAGE ); + setArrowCursor(); + return; + } + } + if ( nodes.size() == 1 ) { + ++attached_counter; + final PhylogenyNode n = nodes.get( 0 ); + if ( !n.getNodeData().isHasSequence() ) { + n.getNodeData().addSequence( new org.forester.phylogeny.data.Sequence() ); + } + n.getNodeData().getSequence().setMolecularSequence( seq.getMolecularSequenceAsString() ); + if ( ForesterUtil.isEmpty( n.getNodeData().getSequence().getName() ) ) { + n.getNodeData().getSequence().setName( seq_name ); + } + } + } + } + if ( attached_counter > 0 ) { + int ext_nodes = 0; + int ext_nodes_with_seq = 0; + for( final PhylogenyNodeIterator iter = phy.iteratorExternalForward(); iter.hasNext(); ) { + ++ext_nodes; + final PhylogenyNode n = iter.next(); + if ( n.getNodeData().isHasSequence() + && !ForesterUtil.isEmpty( n.getNodeData().getSequence().getMolecularSequence() ) ) { + ++ext_nodes_with_seq; + } + } + final String s; + if ( ext_nodes == ext_nodes_with_seq ) { + s = "All " + ext_nodes_with_seq + " external nodes now have a molecular sequence attached to them."; + } + else { + s = ext_nodes_with_seq + " out of " + ext_nodes + + " external nodes now have a molecular sequence attached to them."; + } + if ( ( attached_counter == total_counter ) && ( ext_nodes == ext_nodes_with_seq ) ) { + JOptionPane.showMessageDialog( this, + "Attached all " + total_counter + " sequences to tree nodes.\n" + s, + "All sequences attached", + JOptionPane.INFORMATION_MESSAGE ); + } + else { + JOptionPane.showMessageDialog( this, "Attached " + attached_counter + + " sequences out of a total of " + total_counter + " sequences.\n" + s, attached_counter + + " sequences attached", JOptionPane.WARNING_MESSAGE ); + } + } + else { + JOptionPane.showMessageDialog( this, "No maching tree node for any of the " + total_counter + + " sequences", "Could not attach any sequences", JOptionPane.ERROR_MESSAGE ); + } + } + } + + 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, @@ -1884,7 +2021,8 @@ public final class MainFrameApplication extends MainFrame { final PhylogenyNode n = it.next(); final String name = n.getName().trim(); if ( !ForesterUtil.isEmpty( name ) ) { - final String nt = ParserUtils.extractTaxonomyDataFromNodeName( n, TAXONOMY_EXTRACTION.YES ); + final String nt = ParserUtils + .extractTaxonomyDataFromNodeName( n, TAXONOMY_EXTRACTION.PFAM_STYLE_RELAXED ); if ( !ForesterUtil.isEmpty( nt ) ) { if ( counter < 15 ) { sb.append( name + ": " + nt + "\n" ); @@ -2070,9 +2208,9 @@ public final class MainFrameApplication extends MainFrame { return; } if ( !getOptions().isPrintUsingActualSize() ) { - getCurrentTreePanel().setParametersForPainting( getOptions().getPrintSizeX() - 80, - getOptions().getPrintSizeY() - 140, - true ); + getCurrentTreePanel().calcParametersForPainting( getOptions().getPrintSizeX() - 80, + getOptions().getPrintSizeY() - 140, + true ); getCurrentTreePanel().resetPreferredSize(); getCurrentTreePanel().repaint(); } @@ -2100,9 +2238,9 @@ public final class MainFrameApplication extends MainFrame { private void printPhylogenyToPdf( final String file_name ) { if ( !getOptions().isPrintUsingActualSize() ) { - getCurrentTreePanel().setParametersForPainting( getOptions().getPrintSizeX(), - getOptions().getPrintSizeY(), - true ); + getCurrentTreePanel().calcParametersForPainting( getOptions().getPrintSizeX(), + getOptions().getPrintSizeY(), + true ); getCurrentTreePanel().resetPreferredSize(); getCurrentTreePanel().repaint(); } @@ -2434,7 +2572,12 @@ public final class MainFrameApplication extends MainFrame { final int count = getMainPanel().getTabbedPane().getTabCount(); final List trees = new ArrayList(); for( int i = 0; i < count; ++i ) { - trees.add( getMainPanel().getPhylogeny( i ) ); + final Phylogeny phy = getMainPanel().getPhylogeny( i ); + if ( ForesterUtil.isEmpty( phy.getName() ) + && !ForesterUtil.isEmpty( getMainPanel().getTabbedPane().getTitleAt( i ) ) ) { + phy.setName( getMainPanel().getTabbedPane().getTitleAt( i ) ); + } + trees.add( phy ); getMainPanel().getTreePanels().get( i ).setEdited( false ); } final PhylogenyWriter writer = new PhylogenyWriter(); @@ -2474,18 +2617,6 @@ public final class MainFrameApplication extends MainFrame { return exception; } - private boolean writeAsNHX( final Phylogeny t, boolean exception, final File file ) { - try { - final PhylogenyWriter writer = new PhylogenyWriter(); - writer.toNewHampshireX( t, file ); - } - catch ( final Exception e ) { - exception = true; - exceptionOccuredDuringSaveAs( e ); - } - return exception; - } - private boolean writeAsPhyloXml( final Phylogeny t, boolean exception, final File file ) { try { final PhylogenyWriter writer = new PhylogenyWriter(); @@ -2560,9 +2691,6 @@ public final class MainFrameApplication extends MainFrame { if ( _save_filechooser.getFileFilter() == MainFrameApplication.nhfilter ) { exception = writeAsNewHampshire( t, exception, file ); } - else if ( _save_filechooser.getFileFilter() == MainFrameApplication.nhxfilter ) { - exception = writeAsNHX( t, exception, file ); - } else if ( _save_filechooser.getFileFilter() == MainFrameApplication.xmlfilter ) { exception = writeAsPhyloXml( t, exception, file ); } @@ -2576,9 +2704,6 @@ public final class MainFrameApplication extends MainFrame { || file_name.endsWith( ".tree" ) ) { exception = writeAsNewHampshire( t, exception, file ); } - else if ( file_name.endsWith( ".nhx" ) ) { - exception = writeAsNHX( t, exception, file ); - } else if ( file_name.endsWith( ".nex" ) || file_name.endsWith( ".nexus" ) ) { exception = writeAsNexus( t, exception, file ); } @@ -2816,7 +2941,7 @@ class NHXFilter extends FileFilter { @Override public String getDescription() { - return "NHX files (*.nhx)"; + return "NHX files (*.nhx) [deprecated]"; } }