/* * CoalGenFrame.java * * Copyright (c) 2002-2015 Alexei Drummond, Andrew Rambaut and Marc Suchard * * This file is part of BEAST. * See the NOTICE file distributed with this work for additional * information regarding copyright ownership and licensing. * * BEAST is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * BEAST is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with BEAST; if not, write to the * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301 USA */ package dr.app.coalgen; import dr.evolution.coalescent.DemographicFunction; import dr.evolution.io.Importer; import dr.evolution.io.NewickImporter; import dr.evolution.io.NexusImporter; import dr.evolution.tree.Tree; import dr.evolution.tree.TreeUtils; import dr.inference.trace.LogFileTraces; import dr.inference.trace.TraceException; import jam.framework.DocumentFrame; import jam.framework.Exportable; import javax.swing.*; import javax.swing.plaf.BorderUIResource; import java.awt.*; import java.io.*; /** * @author Andrew Rambaut * @author Alexei Drummond * @version $Id$ */ public class CoalGenFrame extends DocumentFrame { private CoalGenData data = null; private final JTabbedPane tabbedPane = new JTabbedPane(); private InputsPanel inputsPanel; private DataPanel dataPanel; private ModelPanel modelPanel; private SimulationsPanel simulationsPanel; private JLabel statusLabel; public CoalGenFrame(String title) { super(); setTitle(title); data = new CoalGenData(); } public void initializeComponents() { setSize(new java.awt.Dimension(800, 600)); inputsPanel = new InputsPanel(this, data); dataPanel = new DataPanel(this, data); modelPanel = new ModelPanel(this, data); simulationsPanel = new SimulationsPanel(this, data); tabbedPane.addTab("Inputs", null, inputsPanel); tabbedPane.addTab("Taxa", null, dataPanel); tabbedPane.addTab("Model", null, modelPanel); tabbedPane.addTab("Simulations", null, simulationsPanel); statusLabel = new JLabel("No taxa loaded"); JPanel progressPanel = new JPanel(new BorderLayout(0, 0)); JLabel progressLabel = new JLabel(""); JProgressBar progressBar = new JProgressBar(); progressPanel.add(progressLabel, BorderLayout.NORTH); progressPanel.add(progressBar, BorderLayout.CENTER); JPanel panel1 = new JPanel(new BorderLayout(0, 0)); panel1.add(statusLabel, BorderLayout.CENTER); panel1.add(progressPanel, BorderLayout.EAST); panel1.setBorder(new BorderUIResource.EmptyBorderUIResource(new java.awt.Insets(0, 6, 0, 6))); JPanel panel = new JPanel(new BorderLayout(0, 0)); panel.add(tabbedPane, BorderLayout.CENTER); panel.add(panel1, BorderLayout.SOUTH); panel.setBorder(new BorderUIResource.EmptyBorderUIResource(new java.awt.Insets(12, 12, 12, 12))); getContentPane().setLayout(new java.awt.BorderLayout(0, 0)); getContentPane().add(panel, BorderLayout.CENTER); } public void fireTaxaChanged() { } public void fireModelChanged() { modelPanel.collectSettings(); } public void fireTracesChanged() { inputsPanel.tracesChanged(); modelPanel.tracesChanged(); simulationsPanel.tracesChanged(); } public final void dataSelectionChanged(boolean isSelected) { if (isSelected) { getDeleteAction().setEnabled(true); } else { getDeleteAction().setEnabled(false); } } public void doDelete() { // if (tabbedPane.getSelectedComponent() == dataPanel) { // dataPanel.deleteSelection(); // } else { // throw new RuntimeException("Delete should only be accessable from the Data panel"); // } } protected boolean writeToFile(File file) { inputsPanel.collectSettings(); modelPanel.collectSettings(); simulationsPanel.collectSettings(); return false; } protected boolean readFromFile(final File file) throws IOException { try { final String fileName = file.getName(); final ProgressMonitorInputStream in = new ProgressMonitorInputStream( this, "Reading " + fileName, new FileInputStream(file)); // final Reader reader = new InputStreamReader(in); final JFrame frame = this; // the monitored activity must be in a new thread. Thread readThread = new Thread() { public void run() { try { final File file1 = new File(fileName); final LogFileTraces traces = new LogFileTraces(fileName, file1); traces.loadTraces(in); EventQueue.invokeLater( new Runnable() { public void run() { data.logFile = file; data.traces = traces; fireTracesChanged(); } }); } catch (final TraceException tex) { EventQueue.invokeLater( new Runnable() { public void run() { JOptionPane.showMessageDialog(frame, "Error reading trace file: " + tex, "Error reading trace file", JOptionPane.ERROR_MESSAGE); } }); } catch (final InterruptedIOException iioex) { // The cancel dialog button was pressed - do nothing } catch (final IOException ioex) { EventQueue.invokeLater( new Runnable() { public void run() { JOptionPane.showMessageDialog(frame, "File I/O Error: " + ioex, "File I/O Error", JOptionPane.ERROR_MESSAGE); } }); } catch (final Exception ex) { EventQueue.invokeLater( new Runnable() { public void run() { JOptionPane.showMessageDialog(frame, "Fatal exception: " + ex, "Error reading file", JOptionPane.ERROR_MESSAGE); } }); } } }; readThread.start(); } catch (IOException ioex) { JOptionPane.showMessageDialog(this, "File I/O Error: " + ioex, "File I/O Error", JOptionPane.ERROR_MESSAGE); return false; } catch (Exception ex) { JOptionPane.showMessageDialog(this, "Fatal exception: " + ex, "Error reading file", JOptionPane.ERROR_MESSAGE); return false; } return true; } public final void doImport() { FileDialog dialog = new FileDialog(this, "Import Tree or Alignment...", FileDialog.LOAD); dialog.setVisible(true); if (dialog.getFile() != null) { File file = new File(dialog.getDirectory(), dialog.getFile()); try { importFromFile(file); } catch (Importer.ImportException ie) { JOptionPane.showMessageDialog(this, "Unable to read file: " + ie, "Unable to read file", JOptionPane.ERROR_MESSAGE); } catch (FileNotFoundException fnfe) { JOptionPane.showMessageDialog(this, "Unable to open file: File not found", "Unable to open file", JOptionPane.ERROR_MESSAGE); } catch (IOException ioe) { JOptionPane.showMessageDialog(this, "Unable to read file: " + ioe, "Unable to read file", JOptionPane.ERROR_MESSAGE); } } } protected void importFromFile(File file) throws IOException, Importer.ImportException { BufferedReader reader = new BufferedReader(new FileReader(file)); String line = reader.readLine(); Tree tree; if (line.toUpperCase().startsWith("#NEXUS")) { NexusImporter importer = new NexusImporter(reader); tree = importer.importTree(null); } else { NewickImporter importer = new NewickImporter(reader); tree = importer.importTree(null); } data.taxonList = tree; statusLabel.setText(Integer.toString(data.taxonList.getTaxonCount()) + " taxa loaded."); reader.close(); fireTaxaChanged(); } public final void doExport() { FileDialog outDialog = new FileDialog(this, "Save Log File As...", FileDialog.SAVE); outDialog.setVisible(true); if (outDialog.getFile() != null) { File outFile = new File(outDialog.getDirectory(), outDialog.getFile()); try { generateFile(outFile); } catch (IOException ioe) { JOptionPane.showMessageDialog(this, "Unable to write file: " + ioe, "Unable to read/write file", JOptionPane.ERROR_MESSAGE); } } } protected void generateFile(File outFile) throws IOException { PrintWriter writer = new PrintWriter(new FileWriter(outFile)); dr.evolution.coalescent.CoalescentSimulator simulator = new dr.evolution.coalescent.CoalescentSimulator(); int count = 0; while (data.hasNext()) { DemographicFunction demo = data.nextDemographic(); Tree tree = simulator.simulateTree(data.taxonList, demo); writer.println(count + "\t" + TreeUtils.newick(tree)); count += 1; } writer.close(); } public void doCopy() { } public JComponent getExportableComponent() { JComponent exportable = null; Component comp = tabbedPane.getSelectedComponent(); if (comp instanceof Exportable) { exportable = ((Exportable) comp).getExportableComponent(); } else if (comp instanceof JComponent) { exportable = (JComponent) comp; } return exportable; } public boolean useImportAction() { return true; } public Action getImportAction() { return importTaxaAction; } protected AbstractAction importTaxaAction = new AbstractAction("Import Taxa...") { public void actionPerformed(java.awt.event.ActionEvent ae) { doImport(); } }; public boolean useExportAction() { return true; } public Action getExportAction() { return generateSimulationsAction; } protected AbstractAction generateSimulationsAction = new AbstractAction("Generate Simulations...") { public void actionPerformed(java.awt.event.ActionEvent ae) { doExport(); } }; }