/* * MCMCPanel.java * * Copyright (C) 2002-2009 Alexei Drummond and Andrew Rambaut * * 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.beauti.mcmcpanel; import dr.app.beauti.BeautiFrame; import dr.app.beauti.BeautiPanel; import dr.app.beauti.options.BeautiOptions; import dr.app.beauti.options.PartitionTreeModel; import dr.app.beauti.options.STARBEASTOptions; import dr.app.gui.components.WholeNumberField; import dr.app.util.OSType; import dr.evolution.datatype.Microsatellite; import jam.panels.OptionsPanel; import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.util.List; /** * @author Andrew Rambaut * @author Alexei Drummond * @version $Id: MCMCPanel.java,v 1.16 2006/09/05 13:29:34 rambaut Exp $ */ public class MCMCPanel extends BeautiPanel { private static final long serialVersionUID = -3710586474593827540L; WholeNumberField chainLengthField = new WholeNumberField(1, Integer.MAX_VALUE); WholeNumberField echoEveryField = new WholeNumberField(1, Integer.MAX_VALUE); WholeNumberField logEveryField = new WholeNumberField(1, Integer.MAX_VALUE); JCheckBox samplePriorCheckBox = new JCheckBox("Sample from prior only - create empty alignment"); public static final String DEFAULT_FILE_NAME_STEM = "untitled"; JTextField fileNameStemField = new JTextField(DEFAULT_FILE_NAME_STEM); private JCheckBox addTxt = new JCheckBox("Add .txt suffix"); JTextField logFileNameField = new JTextField(DEFAULT_FILE_NAME_STEM + ".log"); JTextField treeFileNameField = new JTextField(DEFAULT_FILE_NAME_STEM + "." + STARBEASTOptions.TREE_FILE_NAME); // JCheckBox allowOverwriteLogCheck = new JCheckBox("Allow to overwrite the existing log file"); // JCheckBox mapTreeLogCheck = new JCheckBox("Create tree file containing the MAP tree:"); // JTextField mapTreeFileNameField = new JTextField("untitled.MAP.tree"); JCheckBox substTreeLogCheck = new JCheckBox("Create tree log file with branch length in substitutions:"); JTextField substTreeFileNameField = new JTextField("untitled(subst).trees"); JCheckBox operatorAnalaysisCheck = new JCheckBox("Create operator analysis file:"); JTextField operatorAnalaysisFileNameField = new JTextField(DEFAULT_FILE_NAME_STEM + ".ops"); BeautiFrame frame = null; private final OptionsPanel optionsPanel; private BeautiOptions options; public MCMCPanel(BeautiFrame parent) { setLayout(new BorderLayout()); // Mac OS X components have more spacing round them already optionsPanel = new OptionsPanel(12, (OSType.isMac() ? 6 : 24)); this.frame = parent; setOpaque(false); optionsPanel.setOpaque(false); chainLengthField.setValue(100000); chainLengthField.setColumns(10); optionsPanel.addComponentWithLabel("Length of chain:", chainLengthField); chainLengthField.addKeyListener(new java.awt.event.KeyListener() { public void keyTyped(KeyEvent e) { } public void keyPressed(KeyEvent e) { } public void keyReleased(KeyEvent e) { options.chainLength = chainLengthField.getValue(); frame.setDirty(); } }); optionsPanel.addSeparator(); echoEveryField.setValue(1000); echoEveryField.setColumns(10); optionsPanel.addComponentWithLabel("Echo state to screen every:", echoEveryField); echoEveryField.addKeyListener(new java.awt.event.KeyListener() { public void keyTyped(KeyEvent e) { } public void keyPressed(KeyEvent e) { } public void keyReleased(KeyEvent e) { options.echoEvery = echoEveryField.getValue(); frame.setDirty(); } }); logEveryField.setValue(100); logEveryField.setColumns(10); optionsPanel.addComponentWithLabel("Log parameters every:", logEveryField); logEveryField.addKeyListener(new java.awt.event.KeyListener() { public void keyTyped(KeyEvent e) { } public void keyPressed(KeyEvent e) { } public void keyReleased(KeyEvent e) { options.logEvery = logEveryField.getValue(); frame.setDirty(); } }); optionsPanel.addSeparator(); fileNameStemField.setColumns(32); optionsPanel.addComponentWithLabel("File name stem:", fileNameStemField); fileNameStemField.setEditable(true); fileNameStemField.addKeyListener(new java.awt.event.KeyListener() { public void keyTyped(KeyEvent e) { } public void keyPressed(KeyEvent e) { } public void keyReleased(KeyEvent e) { options.fileNameStem = fileNameStemField.getText(); updateOtherFileNames(options); frame.setDirty(); } }); optionsPanel.addComponent(addTxt); if (OSType.isWindows()) { addTxt.setSelected(true); } else { addTxt.setSelected(false); } addTxt.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent changeEvent) { setOptions(options); frame.setDirty(); } }); optionsPanel.addSeparator(); logFileNameField.setColumns(32); optionsPanel.addComponentWithLabel("Log file name:", logFileNameField); logFileNameField.setEditable(false); // optionsPanel.addComponent(allowOverwriteLogCheck); // allowOverwriteLogCheck.setSelected(false); // allowOverwriteLogCheck.addChangeListener(new ChangeListener() { // public void stateChanged(ChangeEvent changeEvent) { // options.allowOverwriteLog = allowOverwriteLogCheck.isSelected(); // } // }); treeFileNameField.setColumns(32); optionsPanel.addComponentWithLabel("Trees file name:", treeFileNameField); treeFileNameField.setEditable(false); // addComponent(mapTreeLogCheck); // mapTreeLogCheck.setOpaque(false); // mapTreeLogCheck.addActionListener(new java.awt.event.ActionListener() { // public void actionPerformed(ActionEvent e) { // mapTreeFileNameField.setEnabled(mapTreeLogCheck.isSelected()); // } // }); // // mapTreeFileNameField.setColumns(32); // addComponentWithLabel("MAP tree file name:", mapTreeFileNameField); optionsPanel.addComponent(substTreeLogCheck); substTreeLogCheck.setOpaque(false); substTreeLogCheck.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { options.substTreeLog = substTreeLogCheck.isSelected(); updateTreeFileNameList(); substTreeFileNameField.setEnabled(substTreeLogCheck.isSelected()); if (substTreeLogCheck.isSelected()) { substTreeFileNameField.setText(displayTreeList(options.substTreeFileName)); } else { substTreeFileNameField.setText(""); } frame.setDirty(); } }); substTreeFileNameField.setColumns(32); substTreeFileNameField.setEditable(false); substTreeFileNameField.setEnabled(false); optionsPanel.addComponentWithLabel("Substitutions trees file name:", substTreeFileNameField); optionsPanel.addComponent(operatorAnalaysisCheck); operatorAnalaysisCheck.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { options.operatorAnalysis = operatorAnalaysisCheck.isSelected(); updateOtherFileNames(options); frame.setDirty(); } }); operatorAnalaysisFileNameField.setColumns(32); operatorAnalaysisFileNameField.setEditable(false); operatorAnalaysisFileNameField.setEnabled(false); optionsPanel.addComponentWithLabel("Operator analysis file name:", operatorAnalaysisFileNameField); optionsPanel.addSeparator(); optionsPanel.addComponent(samplePriorCheckBox); samplePriorCheckBox.setOpaque(false); samplePriorCheckBox.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent changeEvent) { frame.setDirty(); } }); // logFileNameField.addKeyListener(listener); // treeFileNameField.addKeyListener(listener); //mapTreeFileNameField.addKeyListener(listener); // substTreeFileNameField.addKeyListener(listener); // optionsPanel.setPreferredSize(new java.awt.Dimension(500, 600)); JPanel panel = new JPanel(new FlowLayout(FlowLayout.CENTER)); panel.add(optionsPanel, BorderLayout.CENTER); panel.setOpaque(false); JScrollPane scrollPane = new JScrollPane(panel, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); scrollPane.setOpaque(false); scrollPane.setBorder(null); scrollPane.getViewport().setOpaque(false); add(scrollPane, BorderLayout.CENTER); } private void updateTreeFileNameList() { options.treeFileName.clear(); options.substTreeFileName.clear(); String treeFN; for (PartitionTreeModel tree : options.getPartitionTreeModels()) { if (options.substTreeLog) { treeFN = options.fileNameStem + "." + tree.getPrefix() + "(time)." + STARBEASTOptions.TREE_FILE_NAME; } else { treeFN = options.fileNameStem + "." + tree.getPrefix() + STARBEASTOptions.TREE_FILE_NAME; // stem.partitionName.tree } if (addTxt.isSelected()) treeFN = treeFN + ".txt"; options.treeFileName.add(treeFN); if (options.substTreeLog) { treeFN = options.fileNameStem + "." + tree.getPrefix() + "(subst)." + STARBEASTOptions.TREE_FILE_NAME; if (addTxt.isSelected()) treeFN = treeFN + ".txt"; options.substTreeFileName.add(treeFN); } } if (options.useStarBEAST) { treeFN = options.fileNameStem + "." + options.starBEASTOptions.SPECIES_TREE_FILE_NAME; if (addTxt.isSelected()) treeFN = treeFN + ".txt"; options.treeFileName.add(treeFN); //TODO: species sub tree } } private String displayTreeList(List<String> treeList) { String text = ""; for (String t : treeList) { text = text + t; if (treeList.indexOf(t) < treeList.size() - 1) { text = text + "; "; } } return text; } public void setOptions(BeautiOptions options) { this.options = options; chainLengthField.setValue(options.chainLength); echoEveryField.setValue(options.echoEvery); logEveryField.setValue(options.logEvery); if (options.fileNameStem != null) { fileNameStemField.setText(options.fileNameStem); } else { fileNameStemField.setText(DEFAULT_FILE_NAME_STEM); fileNameStemField.setEnabled(false); } operatorAnalaysisCheck.setSelected(options.operatorAnalysis); updateOtherFileNames(options); if (options.contains(Microsatellite.INSTANCE)) { samplePriorCheckBox.setSelected(false); samplePriorCheckBox.setVisible(false); } else { samplePriorCheckBox.setVisible(true); samplePriorCheckBox.setSelected(options.samplePriorOnly); } optionsPanel.validate(); optionsPanel.repaint(); } private void updateOtherFileNames(BeautiOptions options) { if (options.fileNameStem != null) { // fileNameStemField.setText(options.fileNameStem); options.logFileName = options.fileNameStem + ".log"; if (addTxt.isSelected()) options.logFileName = options.logFileName + ".txt"; logFileNameField.setText(options.logFileName); // if (options.mapTreeFileName == null) { // mapTreeFileNameField.setText(options.fileNameStem + ".MAP.tree"); // } else { // mapTreeFileNameField.setText(options.mapTreeFileName); // } updateTreeFileNameList(); treeFileNameField.setText(displayTreeList(options.treeFileName)); if (options.substTreeLog) { substTreeFileNameField.setText(displayTreeList(options.substTreeFileName)); } else { substTreeFileNameField.setText(""); } options.operatorAnalysisFileName = options.fileNameStem + ".ops"; if (addTxt.isSelected()) { options.operatorAnalysisFileName = options.operatorAnalysisFileName + ".txt"; } operatorAnalaysisFileNameField.setEnabled(options.operatorAnalysis); if (options.operatorAnalysis) { operatorAnalaysisFileNameField.setText(options.operatorAnalysisFileName); } else { operatorAnalaysisFileNameField.setText(""); } // mapTreeLogCheck.setEnabled(true); // mapTreeLogCheck.setSelected(options.mapTreeLog); // mapTreeFileNameField.setEnabled(options.mapTreeLog); substTreeLogCheck.setEnabled(true); substTreeLogCheck.setSelected(options.substTreeLog); } else { // fileNameStemField.setText(fileNameStem); // fileNameStemField.setEnabled(false); logFileNameField.setText(DEFAULT_FILE_NAME_STEM + ".log"); treeFileNameField.setText(DEFAULT_FILE_NAME_STEM + "." + STARBEASTOptions.TREE_FILE_NAME); // mapTreeLogCheck.setEnabled(false); // mapTreeFileNameField.setEnabled(false); // mapTreeFileNameField.setText("untitled"); substTreeLogCheck.setSelected(false); substTreeFileNameField.setEnabled(false); substTreeFileNameField.setText(""); operatorAnalaysisCheck.setSelected(false); operatorAnalaysisFileNameField.setText(""); } } public void getOptions(BeautiOptions options) { options.fileNameStem = fileNameStemField.getText(); options.logFileName = logFileNameField.getText(); // options.mapTreeLog = mapTreeLogCheck.isSelected(); // options.mapTreeFileName = mapTreeFileNameField.getText(); options.substTreeLog = substTreeLogCheck.isSelected(); updateTreeFileNameList(); options.operatorAnalysis = operatorAnalaysisCheck.isSelected(); options.operatorAnalysisFileName = operatorAnalaysisFileNameField.getText(); options.samplePriorOnly = samplePriorCheckBox.isSelected(); } public JComponent getExportableComponent() { return optionsPanel; } }