- catch ( final Exception e ) {\r
- JOptionPane.showMessageDialog( this,\r
- ForesterUtil.wordWrap( e.getLocalizedMessage(), 80 ),\r
- "Unexpected Exception",\r
- JOptionPane.ERROR_MESSAGE );\r
- }\r
- finally {\r
- if ( _mainpanel.getCurrentTreePanel() != null ) {\r
- _mainpanel.getCurrentTreePanel().setArrowCursor();\r
- }\r
- else {\r
- _mainpanel.setArrowCursor();\r
- }\r
- }\r
- if ( ( phys != null ) && ( phys.length > 0 ) ) {\r
- if ( nhx_or_nexus && getOptions().isInternalNumberAreConfidenceForNhParsing() ) {\r
- for( final Phylogeny phy : phys ) {\r
- PhylogenyMethods.transferInternalNodeNamesToConfidence( phy, "" );\r
- }\r
- }\r
- AptxUtil.addPhylogeniesToTabs( phys,\r
- new File( url.getFile() ).getName(),\r
- new File( url.getFile() ).toString(),\r
- getConfiguration(),\r
- getMainPanel() );\r
- _mainpanel.getControlPanel().showWhole();\r
- }\r
- }\r
- activateSaveAllIfNeeded();\r
- System.gc();\r
- }\r
-\r
- void setMsa( final Msa msa ) {\r
- _msa = msa;\r
- }\r
-\r
- void setMsaFile( final File msa_file ) {\r
- _msa_file = msa_file;\r
- }\r
-\r
- void setSeqs( final List<MolecularSequence> seqs ) {\r
- _seqs = seqs;\r
- }\r
-\r
- void setSeqsFile( final File seqs_file ) {\r
- _seqs_file = seqs_file;\r
- }\r
-\r
- void writePhylogenyToGraphicsFile( final String file_name, final GraphicsExportType type ) {\r
- _mainpanel.getCurrentTreePanel().calcParametersForPainting( _mainpanel.getCurrentTreePanel().getWidth(),\r
- _mainpanel.getCurrentTreePanel().getHeight(),\r
- true );\r
- String file_written_to = "";\r
- boolean error = false;\r
- try {\r
- file_written_to = AptxUtil.writePhylogenyToGraphicsFile( file_name,\r
- _mainpanel.getCurrentTreePanel().getWidth(),\r
- _mainpanel.getCurrentTreePanel().getHeight(),\r
- _mainpanel.getCurrentTreePanel(),\r
- _mainpanel.getControlPanel(),\r
- type,\r
- getOptions() );\r
- }\r
- catch ( final IOException e ) {\r
- error = true;\r
- JOptionPane.showMessageDialog( this, e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE );\r
- }\r
- if ( !error ) {\r
- if ( ( file_written_to != null ) && ( file_written_to.length() > 0 ) ) {\r
- JOptionPane.showMessageDialog( this,\r
- "Wrote image to: " + file_written_to,\r
- "Graphics Export",\r
- JOptionPane.INFORMATION_MESSAGE );\r
- }\r
- else {\r
- JOptionPane.showMessageDialog( this,\r
- "There was an unknown problem when attempting to write to an image file: \""\r
- + file_name + "\"",\r
- "Error",\r
- JOptionPane.ERROR_MESSAGE );\r
- }\r
- }\r
- _contentpane.repaint();\r
- }\r
-\r
- private void addExpressionValuesFromFile() {\r
- if ( ( getCurrentTreePanel() == null ) || ( getCurrentTreePanel().getPhylogeny() == null ) ) {\r
- JOptionPane.showMessageDialog( this,\r
- "Need to load evolutionary tree first",\r
- "Can Not Read Expression Values",\r
- JOptionPane.WARNING_MESSAGE );\r
- return;\r
- }\r
- final File my_dir = getCurrentDir();\r
- if ( my_dir != null ) {\r
- _values_filechooser.setCurrentDirectory( my_dir );\r
- }\r
- final int result = _values_filechooser.showOpenDialog( _contentpane );\r
- final File file = _values_filechooser.getSelectedFile();\r
- if ( ( file != null ) && ( file.length() > 0 ) && ( result == JFileChooser.APPROVE_OPTION ) ) {\r
- BasicTable<String> t = null;\r
- try {\r
- t = BasicTableParser.parse( file, '\t' );\r
- if ( t.getNumberOfColumns() < 2 ) {\r
- t = BasicTableParser.parse( file, ',' );\r
- }\r
- if ( t.getNumberOfColumns() < 2 ) {\r
- t = BasicTableParser.parse( file, ' ' );\r
- }\r
- }\r
- catch ( final IOException e ) {\r
- JOptionPane.showMessageDialog( this,\r
- e.getMessage(),\r
- "Could Not Read Expression Value Table",\r
- JOptionPane.ERROR_MESSAGE );\r
- return;\r
- }\r
- if ( t.getNumberOfColumns() < 2 ) {\r
- JOptionPane.showMessageDialog( this,\r
- "Table contains " + t.getNumberOfColumns() + " column(s)",\r
- "Problem with Expression Value Table",\r
- JOptionPane.ERROR_MESSAGE );\r
- return;\r
- }\r
- if ( t.getNumberOfRows() < 1 ) {\r
- JOptionPane.showMessageDialog( this,\r
- "Table contains zero rows",\r
- "Problem with Expression Value Table",\r
- JOptionPane.ERROR_MESSAGE );\r
- return;\r
- }\r
- final Phylogeny phy = getCurrentTreePanel().getPhylogeny();\r
- if ( t.getNumberOfRows() != phy.getNumberOfExternalNodes() ) {\r
- JOptionPane.showMessageDialog( this,\r
- "Table contains " + t.getNumberOfRows() + " rows, but tree contains "\r
- + phy.getNumberOfExternalNodes() + " external nodes",\r
- "Warning",\r
- JOptionPane.WARNING_MESSAGE );\r
- }\r
- final DescriptiveStatistics stats = new BasicDescriptiveStatistics();\r
- int not_found = 0;\r
- for( final PhylogenyNodeIterator iter = phy.iteratorPreorder(); iter.hasNext(); ) {\r
- final PhylogenyNode node = iter.next();\r
- final String node_name = node.getName();\r
- if ( !ForesterUtil.isEmpty( node_name ) ) {\r
- int row = -1;\r
- try {\r
- row = t.findRow( node_name );\r
- }\r
- catch ( final IllegalArgumentException e ) {\r
- JOptionPane\r
- .showMessageDialog( this,\r
- e.getMessage(),\r
- "Error Mapping Node Identifiers to Expression Value Identifiers",\r
- JOptionPane.ERROR_MESSAGE );\r
- return;\r
- }\r
- if ( row < 0 ) {\r
- if ( node.isExternal() ) {\r
- not_found++;\r
- }\r
- continue;\r
- }\r
- final List<Double> l = new ArrayList<Double>();\r
- for( int col = 1; col < t.getNumberOfColumns(); ++col ) {\r
- double d = -100;\r
- try {\r
- d = Double.parseDouble( t.getValueAsString( col, row ) );\r
- }\r
- catch ( final NumberFormatException e ) {\r
- JOptionPane.showMessageDialog( this,\r
- "Could not parse \"" + t.getValueAsString( col, row )\r
- + "\" into a decimal value",\r
- "Issue with Expression Value Table",\r
- JOptionPane.ERROR_MESSAGE );\r
- return;\r
- }\r
- stats.addValue( d );\r
- l.add( d );\r
- }\r
- if ( !l.isEmpty() ) {\r
- if ( node.getNodeData().getProperties() != null ) {\r
- node.getNodeData().getProperties()\r
- .removePropertiesWithGivenReferencePrefix( PhyloXmlUtil.VECTOR_PROPERTY_REF );\r
- }\r
- node.getNodeData().setVector( l );\r
- }\r
- }\r
- }\r
- if ( not_found > 0 ) {\r
- JOptionPane.showMessageDialog( this, "Could not fine expression values for " + not_found\r
- + " external node(s)", "Warning", JOptionPane.WARNING_MESSAGE );\r
- }\r
- getCurrentTreePanel().setStatisticsForExpressionValues( stats );\r
- }\r
- }\r
-\r
- private void addSequencesFromFile() {\r
- if ( ( getCurrentTreePanel() == null ) || ( getCurrentTreePanel().getPhylogeny() == null ) ) {\r
- JOptionPane.showMessageDialog( this,\r
- "Need to load evolutionary tree first",\r
- "Can Not Read Sequences",\r
- JOptionPane.WARNING_MESSAGE );\r
- return;\r
- }\r
- final File my_dir = getCurrentDir();\r
- if ( my_dir != null ) {\r
- _sequences_filechooser.setCurrentDirectory( my_dir );\r
- }\r
- final int result = _sequences_filechooser.showOpenDialog( _contentpane );\r
- final File file = _sequences_filechooser.getSelectedFile();\r
- List<MolecularSequence> seqs = null;\r
- if ( ( file != null ) && !file.isDirectory() && ( result == JFileChooser.APPROVE_OPTION ) ) {\r
- try {\r
- if ( FastaParser.isLikelyFasta( new FileInputStream( file ) ) ) {\r
- seqs = FastaParser.parse( new FileInputStream( file ) );\r
- }\r
- else {\r
- JOptionPane.showMessageDialog( this,\r
- "Format does not appear to be Fasta",\r
- "Multiple sequence file format error",\r
- JOptionPane.ERROR_MESSAGE );\r
- return;\r
- }\r
- }\r
- catch ( final MsaFormatException e ) {\r
- setArrowCursor();\r
- JOptionPane.showMessageDialog( this,\r
- e.getLocalizedMessage(),\r
- "Multiple sequence file format error",\r
- JOptionPane.ERROR_MESSAGE );\r
- return;\r
- }\r
- catch ( final IOException e ) {\r
- setArrowCursor();\r
- JOptionPane.showMessageDialog( this,\r
- e.getLocalizedMessage(),\r
- "Failed to read multiple sequence file",\r
- JOptionPane.ERROR_MESSAGE );\r
- return;\r
- }\r
- catch ( final Exception e ) {\r
- setArrowCursor();\r
- e.printStackTrace();\r
- JOptionPane.showMessageDialog( this,\r
- e.getLocalizedMessage(),\r
- "Unexpected error during reading of multiple sequence file",\r
- JOptionPane.ERROR_MESSAGE );\r
- return;\r
- }\r
- if ( ( seqs == null ) || ( seqs.size() < 1 ) ) {\r
- JOptionPane.showMessageDialog( this,\r
- "Multiple sequence file is empty",\r
- "Empty multiple sequence file",\r
- JOptionPane.ERROR_MESSAGE );\r
- setArrowCursor();\r
- return;\r
- }\r
- }\r
- if ( seqs != null ) {\r
- for( final MolecularSequence seq : seqs ) {\r
- System.out.println( seq.getIdentifier() );\r
- }\r
- final Phylogeny phy = getCurrentTreePanel().getPhylogeny();\r
- int total_counter = 0;\r
- int attached_counter = 0;\r
- for( final MolecularSequence seq : seqs ) {\r
- ++total_counter;\r
- final String seq_name = seq.getIdentifier();\r
- if ( !ForesterUtil.isEmpty( seq_name ) ) {\r
- List<PhylogenyNode> nodes = phy.getNodesViaSequenceName( seq_name );\r
- if ( nodes.isEmpty() ) {\r
- nodes = phy.getNodesViaSequenceSymbol( seq_name );\r
- }\r
- if ( nodes.isEmpty() ) {\r
- nodes = phy.getNodesViaGeneName( seq_name );\r
- }\r
- if ( nodes.isEmpty() ) {\r
- nodes = phy.getNodes( seq_name );\r
- }\r
- if ( nodes.size() > 1 ) {\r
- JOptionPane.showMessageDialog( this,\r
- "Sequence name \"" + seq_name + "\" is not unique",\r
- "Sequence name not unique",\r
- JOptionPane.ERROR_MESSAGE );\r
- setArrowCursor();\r
- return;\r
- }\r
- final String[] a = seq_name.split( "\\s" );\r
- if ( nodes.isEmpty() && ( a.length > 1 ) ) {\r
- final String seq_name_split = a[ 0 ];\r
- nodes = phy.getNodesViaSequenceName( seq_name_split );\r
- if ( nodes.isEmpty() ) {\r
- nodes = phy.getNodesViaSequenceSymbol( seq_name_split );\r
- }\r
- if ( nodes.isEmpty() ) {\r
- nodes = phy.getNodes( seq_name_split );\r
- }\r
- if ( nodes.size() > 1 ) {\r
- JOptionPane.showMessageDialog( this, "Split sequence name \"" + seq_name_split\r
- + "\" is not unique", "Sequence name not unique", JOptionPane.ERROR_MESSAGE );\r
- setArrowCursor();\r
- return;\r
- }\r
- }\r
- if ( nodes.size() == 1 ) {\r
- ++attached_counter;\r
- final PhylogenyNode n = nodes.get( 0 );\r
- if ( !n.getNodeData().isHasSequence() ) {\r
- n.getNodeData().addSequence( new org.forester.phylogeny.data.Sequence() );\r
- }\r
- n.getNodeData().getSequence().setMolecularSequence( seq.getMolecularSequenceAsString() );\r
- if ( ForesterUtil.isEmpty( n.getNodeData().getSequence().getName() ) ) {\r
- n.getNodeData().getSequence().setName( seq_name );\r
- }\r
- }\r
- }\r
- }\r
- if ( attached_counter > 0 ) {\r
- int ext_nodes = 0;\r
- int ext_nodes_with_seq = 0;\r
- for( final PhylogenyNodeIterator iter = phy.iteratorExternalForward(); iter.hasNext(); ) {\r
- ++ext_nodes;\r
- final PhylogenyNode n = iter.next();\r
- if ( n.getNodeData().isHasSequence()\r
- && !ForesterUtil.isEmpty( n.getNodeData().getSequence().getMolecularSequence() ) ) {\r
- ++ext_nodes_with_seq;\r
- }\r
- }\r
- final String s;\r
- if ( ext_nodes == ext_nodes_with_seq ) {\r
- s = "All " + ext_nodes_with_seq + " external nodes now have a molecular sequence attached to them.";\r
- }\r
- else {\r
- s = ext_nodes_with_seq + " out of " + ext_nodes\r
- + " external nodes now have a molecular sequence attached to them.";\r
- }\r
- if ( ( attached_counter == total_counter ) && ( ext_nodes == ext_nodes_with_seq ) ) {\r
- JOptionPane.showMessageDialog( this,\r
- "Attached all " + total_counter + " sequences to tree nodes.\n" + s,\r
- "All sequences attached",\r
- JOptionPane.INFORMATION_MESSAGE );\r
- }\r
- else {\r
- JOptionPane.showMessageDialog( this, "Attached " + attached_counter\r
- + " sequences out of a total of " + total_counter + " sequences.\n" + s, attached_counter\r
- + " sequences attached", JOptionPane.WARNING_MESSAGE );\r
- }\r