/*
Copyright (C) 2011 Diego Darriba, David Posada
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package es.uvigo.darwin.jmodeltest.gui;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FileDialog;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.io.IOException;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JMenuBar;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JSlider;
import javax.swing.JTextField;
import javax.swing.border.LineBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.plaf.BorderUIResource;
import pal.tree.Tree;
import pal.tree.TreeParseException;
import es.uvigo.darwin.jmodeltest.ApplicationOptions;
import es.uvigo.darwin.jmodeltest.ModelTest;
import es.uvigo.darwin.jmodeltest.exe.RunPhyml;
import es.uvigo.darwin.jmodeltest.exe.RunPhymlThread;
import es.uvigo.darwin.jmodeltest.io.TextOutputStream;
import es.uvigo.darwin.jmodeltest.selection.InformationCriterion;
import es.uvigo.darwin.jmodeltest.threads.SwingWorker;
import es.uvigo.darwin.jmodeltest.tree.TreeUtilities;
import es.uvigo.darwin.jmodeltest.utilities.Utilities;
public class Frame_CalcLike extends JModelTestFrame {
private static final long serialVersionUID = 201103091058L;
private static final int TOTAL_NUMBER_OF_THREADS = Runtime.getRuntime()
.availableProcessors();
private static final int DEFAULT_NUMBER_OF_THREADS = TOTAL_NUMBER_OF_THREADS;
private static final int DEFAULT_THRESHOLD = 100; // DEFAULT_THRESHOLD/1000
private static final int PANEL_X = 10;
private static final int PANEL_PROCESSORS_Y = 10;
private static final int PANEL_HEURISTICS_Y = 100;
private static final int PANEL_CALCLIKE_Y = 230;
private ApplicationOptions options = ApplicationOptions.getInstance();
private JPanel PanelProcessors = new JPanel();
private JSlider SliderProcessors = new JSlider(1, TOTAL_NUMBER_OF_THREADS,
DEFAULT_NUMBER_OF_THREADS);
private JLabel jLabelNumProcessors = new JLabel();
private JPanel PanelHeuristics = new JPanel();
private JRadioButton ButtonAICClustering = new JRadioButton();
private JRadioButton ButtonAICcClustering = new JRadioButton();
private JRadioButton ButtonBICClustering = new JRadioButton();
private ButtonGroup ButtonGroupClusteringIC = new ButtonGroup();
private JPanel PanelCalcLike = new JPanel();
JButton RunButtonCalcLike = new JButton();
private JButton CancelButtonCalcLike = new JButton();
private JButton JButtonDefaultCalcLike = new JButton();
private JPanel PanelNumberModelsCalcLike = new JPanel();
private JRadioButton Button3SubsTypeCalcLike = new JRadioButton();
private JRadioButton Button5SubsTypeCalcLike = new JRadioButton();
private JRadioButton Button7SubsTypeCalcLike = new JRadioButton();
private JRadioButton Button11SubsTypeCalcLike = new JRadioButton();
private JRadioButton Button203SubsTypeCalcLike = new JRadioButton();
private JCheckBox jCheckBoxModelFiltering = new JCheckBox();
private JLabel jLabelThreshold = new JLabel();
// private JLabel jLabelSliderCaption = new JLabel();
private JCheckBox jCheckBoxClustering = new JCheckBox();
private JSlider SliderThreshold = new JSlider(1, 1000, 100);
private JPanel PanelFrequenciesCalcLike = new JPanel();
private JCheckBox jCheckBoxFrequencies = new JCheckBox();
private JPanel PanelRateVariationCalcLike = new JPanel();
private JCheckBox jCheckBoxPinv = new JCheckBox();
private JCheckBox jCheckBoxGamma = new JCheckBox();
private JTextField TextFieldNcat = new JTextField();
private JPanel PanelTreeOptimizationCalcLike = new JPanel();
private JPanel PanelTreeOptimizationMethod = new JPanel();
private JRadioButton ButtonFixedCalcLike = new JRadioButton();
private JRadioButton ButtonBIONJCalcLike = new JRadioButton();
private JRadioButton ButtonMLCalcLike = new JRadioButton();
private JRadioButton ButtonFixedUserTopologyCalcLike = new JRadioButton();
private JRadioButton ButtonNNICalcLike = new JRadioButton();
private JRadioButton ButtonSPRCalcLike = new JRadioButton();
private JRadioButton ButtonBestCalcLike = new JRadioButton();
private ButtonGroup ButtonGroupTreeOptimizationCalcLike = new ButtonGroup();
private ButtonGroup ButtonGroupNumberModelsCalcLike = new ButtonGroup();
private ButtonGroup ButtonGroupTreeSearchCalcLike = new ButtonGroup();
private JLabel jLabelNumModels = new JLabel();
private JLabel jLabelUserTree = new JLabel();
private JLabel jLabelUserTopology = new JLabel();
private Frame_Progress progressFrame;
private RunPhyml runPhyml;
private ComputeLikelihoodTask task;
public void cancelTask() {
task.interrupt();
}
public RunPhyml getRunPhyml() {
return runPhyml;
}
public Frame_CalcLike() {
}
public void initComponents() throws Exception {
PanelProcessors.setLocation(PANEL_X, PANEL_PROCESSORS_Y);
PanelProcessors.setSize(460, 80);
PanelProcessors.setBorder(new BorderUIResource.TitledBorderUIResource(
new LineBorder(XManager.PANEL_BORDER_COLOR, 1, false),
"Number of processors requested", 4, 2, XManager.FONT_LABEL,
XManager.LABEL_BLUE_COLOR));
PanelProcessors.setVisible(true);
PanelProcessors.setLayout(null);
SliderProcessors.setValue(SliderProcessors.getMaximum());
SliderProcessors.setLocation(10, 20);
SliderProcessors.setSize(400, 45);
jLabelNumProcessors
.setText(String.valueOf(SliderProcessors.getValue()));
jLabelNumProcessors.setLocation(420, 25);
jLabelNumProcessors.setSize(20, 40);
PanelProcessors.add(SliderProcessors);
PanelProcessors.add(jLabelNumProcessors);
PanelHeuristics.setLocation(PANEL_X, PANEL_HEURISTICS_Y);
PanelHeuristics.setSize(460, 120);
PanelHeuristics.setBorder(new BorderUIResource.TitledBorderUIResource(
new LineBorder(XManager.PANEL_BORDER_COLOR, 1, false),
"Heuristics", 4, 2, XManager.FONT_LABEL,
XManager.LABEL_BLUE_COLOR));
PanelHeuristics.setVisible(true);
PanelHeuristics.setLayout(null);
jCheckBoxClustering.setEnabled(false);
jCheckBoxClustering.setText("Clustering");
jCheckBoxClustering.setSelected(false);
jCheckBoxClustering.setLocation(10, 30);
jCheckBoxClustering.setSize(150, 20);
jCheckBoxClustering.setVisible(true);
ButtonAICClustering.setText("AIC");
ButtonAICClustering.setLocation(180, 30);
ButtonAICClustering.setSize(70, 20);
ButtonAICClustering.setVisible(true);
ButtonAICClustering.setEnabled(jCheckBoxClustering.isSelected());
ButtonAICClustering
.setToolTipText("Use AIC for clustering next-step best model selection");
ButtonAICcClustering.setText("AICc");
ButtonAICcClustering.setLocation(250, 30);
ButtonAICcClustering.setSize(70, 20);
ButtonAICcClustering.setVisible(true);
ButtonAICcClustering
.setToolTipText("Use AICc for clustering next-step best model selection");
ButtonAICcClustering.setEnabled(jCheckBoxClustering.isSelected());
ButtonBICClustering.setText("BIC");
ButtonBICClustering.setLocation(320, 30);
ButtonBICClustering.setSize(70, 20);
ButtonBICClustering.setVisible(true);
ButtonBICClustering.setSelected(true);
ButtonBICClustering
.setToolTipText("Use BIC for clustering next-step best model selection");
ButtonBICClustering.setEnabled(jCheckBoxClustering.isSelected());
ButtonGroupClusteringIC.add(ButtonAICClustering);
ButtonGroupClusteringIC.add(ButtonAICcClustering);
ButtonGroupClusteringIC.add(ButtonBICClustering);
// jLabelSliderCaption.setText("Model filtering threshold:");
// jLabelSliderCaption.setLocation(160, 50);
// jLabelSliderCaption.setSize(250,40);
// jLabelSliderCaption.setVisible(true);
jCheckBoxModelFiltering.setEnabled(true);
jCheckBoxModelFiltering.setText("Model Filtering");
jCheckBoxModelFiltering.setSelected(false);
jCheckBoxModelFiltering.setLocation(10, 75);
jCheckBoxModelFiltering.setSize(140, 20);
jCheckBoxModelFiltering.setVisible(true);
jLabelThreshold.setText(Utilities.format(
SliderThreshold.getValue() / 1000.0, 5, 3, false));
jLabelThreshold.setLocation(400, 65);
jLabelThreshold.setSize(60, 40);
jLabelThreshold.setEnabled(jCheckBoxModelFiltering.isSelected());
jLabelThreshold.setVisible(true);
SliderThreshold.setEnabled(jCheckBoxModelFiltering.isSelected());
SliderThreshold.setLocation(150, 65);
SliderThreshold.setSize(240, 45);
SliderThreshold.setValue(DEFAULT_THRESHOLD);
SliderThreshold.setVisible(true);
SliderThreshold.setToolTipText("Model filtering threshold");
PanelHeuristics.add(jCheckBoxClustering);
PanelHeuristics.add(jCheckBoxModelFiltering);
PanelHeuristics.add(SliderThreshold);
PanelHeuristics.add(jLabelThreshold);
// PanelHeuristics.add(jLabelSliderCaption);
PanelHeuristics.add(ButtonAICClustering);
PanelHeuristics.add(ButtonAICcClustering);
PanelHeuristics.add(ButtonBICClustering);
PanelCalcLike.setLocation(PANEL_X, PANEL_CALCLIKE_Y);
PanelCalcLike.setSize(460, 360);
PanelCalcLike.setBorder(new BorderUIResource.TitledBorderUIResource(
new LineBorder(XManager.PANEL_BORDER_COLOR, 1, false),
"Likelihood settings", 4, 2, XManager.FONT_LABEL,
XManager.LABEL_BLUE_COLOR));
PanelCalcLike.setVisible(true);
PanelCalcLike.setLayout(null);
JButtonDefaultCalcLike.setText("Default Settings");
JButtonDefaultCalcLike.setLocation(10, 310);
JButtonDefaultCalcLike.setSize(141, 40);
JButtonDefaultCalcLike.setVisible(true);
CancelButtonCalcLike.setText("Cancel");
CancelButtonCalcLike.setLocation(160, 310);
CancelButtonCalcLike.setSize(110, 40);
CancelButtonCalcLike.setVisible(true);
RunButtonCalcLike.setText("Compute Likelihods");
RunButtonCalcLike.setLocation(280, 310);
RunButtonCalcLike.setSize(170, 40);
RunButtonCalcLike.setVisible(true);
getRootPane().setDefaultButton(RunButtonCalcLike);
PanelNumberModelsCalcLike.setLocation(20, 20);
PanelNumberModelsCalcLike.setSize(420, 50);
PanelNumberModelsCalcLike
.setBorder(new BorderUIResource.TitledBorderUIResource(
new LineBorder(XManager.PANEL_BORDER_COLOR, 1, false),
"Number of substitution schemes", 4, 2,
XManager.FONT_LABEL, XManager.LABEL_BLUE_COLOR));
PanelNumberModelsCalcLike.setVisible(true);
PanelNumberModelsCalcLike.setLayout(null);
Button3SubsTypeCalcLike.setVisible(true);
Button3SubsTypeCalcLike.setSize(45, 20);
Button3SubsTypeCalcLike.setText("3");
Button3SubsTypeCalcLike.setLocation(20, 20);
Button5SubsTypeCalcLike.setVisible(true);
Button5SubsTypeCalcLike.setSize(45, 20);
Button5SubsTypeCalcLike.setText("5");
Button5SubsTypeCalcLike.setLocation(65, 20);
Button7SubsTypeCalcLike.setVisible(true);
Button7SubsTypeCalcLike.setSize(45, 20);
Button7SubsTypeCalcLike.setText("7");
Button7SubsTypeCalcLike.setLocation(110, 20);
Button11SubsTypeCalcLike.setVisible(true);
Button11SubsTypeCalcLike.setSize(50, 20);
Button11SubsTypeCalcLike.setText("11");
Button11SubsTypeCalcLike.setLocation(155, 20);
Button11SubsTypeCalcLike.setSelected(true);
Button203SubsTypeCalcLike.setVisible(true);
Button203SubsTypeCalcLike.setSize(60, 20);
Button203SubsTypeCalcLike.setText("203");
Button203SubsTypeCalcLike.setLocation(205, 20);
Button203SubsTypeCalcLike.setSelected(true);
ButtonGroupNumberModelsCalcLike.add(Button3SubsTypeCalcLike);
ButtonGroupNumberModelsCalcLike.add(Button5SubsTypeCalcLike);
ButtonGroupNumberModelsCalcLike.add(Button7SubsTypeCalcLike);
ButtonGroupNumberModelsCalcLike.add(Button11SubsTypeCalcLike);
ButtonGroupNumberModelsCalcLike.add(Button203SubsTypeCalcLike);
jLabelNumModels.setSize(165, 20);
jLabelNumModels.setLocation(275, 20);
jLabelNumModels.setAlignmentX(JLabel.CENTER_ALIGNMENT);
jLabelNumModels.setAlignmentY(JLabel.CENTER_ALIGNMENT);
jLabelNumModels.setVisible(true);
jLabelNumModels.setForeground(Color.gray);
jLabelNumModels.setFont(XManager.FONT_LABEL_BIG);
PanelFrequenciesCalcLike.setSize(130, 50);
PanelFrequenciesCalcLike
.setBorder(new BorderUIResource.TitledBorderUIResource(
new LineBorder(XManager.PANEL_BORDER_COLOR, 1, false),
"Base frequencies", 4, 2, XManager.FONT_LABEL,
XManager.LABEL_BLUE_COLOR));
PanelFrequenciesCalcLike.setLocation(20, 80);
PanelFrequenciesCalcLike.setVisible(true);
PanelFrequenciesCalcLike.setLayout(null);
jCheckBoxFrequencies.setVisible(true);
jCheckBoxFrequencies.setSize(50, 20);
jCheckBoxFrequencies.setText("+F");
jCheckBoxFrequencies.setLocation(20, 20);
jCheckBoxFrequencies.setSelected(true);
PanelRateVariationCalcLike.setLocation(170, 80);
PanelRateVariationCalcLike.setSize(270, 50);
PanelRateVariationCalcLike
.setBorder(new BorderUIResource.TitledBorderUIResource(
new LineBorder(XManager.PANEL_BORDER_COLOR, 1, false),
"Rate variation", 4, 2, XManager.FONT_LABEL,
XManager.LABEL_BLUE_COLOR));
PanelRateVariationCalcLike.setVisible(true);
PanelRateVariationCalcLike.setLayout(null);
jCheckBoxPinv.setLocation(20, 20);
jCheckBoxPinv.setSize(50, 20);
jCheckBoxPinv.setText("+I");
jCheckBoxPinv.setVisible(true);
jCheckBoxPinv.setSelected(true);
jCheckBoxGamma.setVisible(true);
jCheckBoxGamma.setSize(55, 20);
jCheckBoxGamma.setText("+G");
jCheckBoxGamma.setLocation(70, 20);
jCheckBoxGamma.setSelected(true);
TextFieldNcat.setEnabled(jCheckBoxGamma.isSelected());
TextFieldNcat
.setToolTipText("Number of rate categories for the discrete gamma distribution");
TextFieldNcat.setBorder(new BorderUIResource.TitledBorderUIResource(
new LineBorder(XManager.PANEL_BORDER_COLOR, 1, false), "nCat",
4, 2, XManager.FONT_LABEL, XManager.LABEL_BLUE_COLOR));
TextFieldNcat.setVisible(true);
TextFieldNcat.setSize(65, 35);
TextFieldNcat.setText("4");
TextFieldNcat.setHorizontalAlignment(JTextField.RIGHT);
TextFieldNcat.setLocation(122, 10);
PanelTreeOptimizationCalcLike.setLocation(20, 140);
PanelTreeOptimizationCalcLike.setSize(420, 90);
PanelTreeOptimizationCalcLike
.setBorder(new BorderUIResource.TitledBorderUIResource(
new LineBorder(XManager.PANEL_BORDER_COLOR, 1, false),
"Base tree for likelihood calculations", 4, 2,
XManager.FONT_LABEL, XManager.LABEL_BLUE_COLOR));
PanelTreeOptimizationCalcLike.setVisible(true);
PanelTreeOptimizationCalcLike.setLayout(null);
ButtonFixedCalcLike.setText("Fixed BIONJ-JC");
ButtonFixedCalcLike.setSize(160, 20);
ButtonFixedCalcLike.setLocation(20, 20);
ButtonFixedCalcLike.setVisible(true);
ButtonFixedUserTopologyCalcLike.setText("Fixed user topology");
ButtonFixedUserTopologyCalcLike.setLocation(200, 20);
ButtonFixedUserTopologyCalcLike.setSize(200, 20);
ButtonFixedUserTopologyCalcLike.setVisible(true);
ButtonBIONJCalcLike.setText("BIONJ");
ButtonBIONJCalcLike.setLocation(20, 57);
ButtonBIONJCalcLike.setSize(160, 20);
ButtonBIONJCalcLike.setVisible(true);
ButtonMLCalcLike.setText("ML optimized");
ButtonMLCalcLike.setLocation(200, 57);
ButtonMLCalcLike.setSize(200, 20);
ButtonMLCalcLike.setVisible(true);
ButtonMLCalcLike.setSelected(true);
enableTreeSearching(ButtonMLCalcLike.isSelected());
jLabelUserTopology.setLocation(194, 22);
jLabelUserTopology.setSize(300, 50);
jLabelUserTopology.setForeground(Color.gray);
jLabelUserTopology.setFont(XManager.FONT_LABEL_BIG);
jLabelUserTopology.setVisible(true);
ButtonGroupTreeOptimizationCalcLike.add(ButtonFixedCalcLike);
ButtonGroupTreeOptimizationCalcLike.add(ButtonBIONJCalcLike);
ButtonGroupTreeOptimizationCalcLike.add(ButtonMLCalcLike);
ButtonGroupTreeOptimizationCalcLike
.add(ButtonFixedUserTopologyCalcLike);
setLocation(XManager.MAIN_LOCATION);
getContentPane().setLayout(null);
setTitle("Likelihood settings");
PanelTreeOptimizationMethod.setLocation(95, 240);
PanelTreeOptimizationMethod.setSize(250, 60);
PanelTreeOptimizationMethod
.setBorder(new BorderUIResource.TitledBorderUIResource(
new LineBorder(XManager.PANEL_BORDER_COLOR, 1, false),
"Base tree search", 4, 2, XManager.FONT_LABEL,
XManager.LABEL_BLUE_COLOR));
PanelTreeOptimizationMethod.setVisible(true);
PanelTreeOptimizationMethod.setLayout(null);
ButtonNNICalcLike.setText("NNI");
ButtonNNICalcLike.setLocation(20, 20);
ButtonNNICalcLike.setSize(70, 20);
ButtonNNICalcLike.setVisible(true);
ButtonNNICalcLike.setSelected(true);
ButtonNNICalcLike.setToolTipText("Nearest Neighbor Interchange");
ButtonSPRCalcLike.setText("SPR");
ButtonSPRCalcLike.setLocation(90, 20);
ButtonSPRCalcLike.setSize(70, 20);
ButtonSPRCalcLike.setVisible(true);
ButtonSPRCalcLike.setToolTipText("Subtree Pruning and Regrafting");
ButtonBestCalcLike.setText("Best");
ButtonBestCalcLike.setLocation(160, 20);
ButtonBestCalcLike.setSize(70, 20);
ButtonBestCalcLike.setVisible(true);
ButtonBestCalcLike
.setToolTipText("Best of NNI and SPR algorithms. Tests both of them (Slowest).");
ButtonGroupTreeSearchCalcLike.add(ButtonNNICalcLike);
ButtonGroupTreeSearchCalcLike.add(ButtonSPRCalcLike);
ButtonGroupTreeSearchCalcLike.add(ButtonBestCalcLike);
PanelCalcLike.add(RunButtonCalcLike);
PanelCalcLike.add(CancelButtonCalcLike);
PanelCalcLike.add(JButtonDefaultCalcLike);
PanelCalcLike.add(PanelNumberModelsCalcLike);
PanelCalcLike.add(PanelTreeOptimizationCalcLike);
PanelCalcLike.add(PanelTreeOptimizationMethod);
PanelCalcLike.add(PanelRateVariationCalcLike);
PanelCalcLike.add(PanelFrequenciesCalcLike);
PanelNumberModelsCalcLike.add(Button3SubsTypeCalcLike);
PanelNumberModelsCalcLike.add(Button5SubsTypeCalcLike);
PanelNumberModelsCalcLike.add(Button7SubsTypeCalcLike);
PanelNumberModelsCalcLike.add(Button11SubsTypeCalcLike);
PanelNumberModelsCalcLike.add(Button203SubsTypeCalcLike);
PanelNumberModelsCalcLike.add(jLabelNumModels);
PanelRateVariationCalcLike.add(jCheckBoxPinv);
PanelRateVariationCalcLike.add(jCheckBoxGamma);
PanelRateVariationCalcLike.add(TextFieldNcat);
PanelFrequenciesCalcLike.add(jCheckBoxFrequencies);
PanelTreeOptimizationCalcLike.add(ButtonFixedCalcLike);
PanelTreeOptimizationCalcLike.add(ButtonBIONJCalcLike);
PanelTreeOptimizationCalcLike.add(ButtonMLCalcLike);
PanelTreeOptimizationCalcLike.add(ButtonFixedUserTopologyCalcLike);
PanelTreeOptimizationMethod.add(ButtonNNICalcLike);
PanelTreeOptimizationMethod.add(ButtonSPRCalcLike);
PanelTreeOptimizationMethod.add(ButtonBestCalcLike);
// PanelTreeOptimizationCalcLike.add(ButtonFixedUserTreeCalcLike);
PanelTreeOptimizationCalcLike.add(jLabelUserTopology);
PanelTreeOptimizationCalcLike.add(jLabelUserTree);
getContentPane().add(PanelProcessors);
getContentPane().add(PanelCalcLike);
getContentPane().add(PanelHeuristics);
setSize(480, 630);
setResizable(false);
// Update number of models
CalculateNumberOfModels(null);
// event handling
RunButtonCalcLike.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
RunButtonCalcLikeActionPerformed(e);
}
});
CancelButtonCalcLike.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
CancelButtonCalcLikeActionPerformed(e);
}
});
JButtonDefaultCalcLike.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JButtonDefaultCalcLikeActionPerformed(e);
}
});
SliderProcessors.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
processorsSliderChangeListener(e);
}
});
jCheckBoxModelFiltering.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
SliderThreshold.setEnabled(jCheckBoxModelFiltering.isSelected());
jLabelThreshold.setEnabled(jCheckBoxModelFiltering.isSelected());
}
});
SliderThreshold.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
jLabelThreshold.setText(Utilities.format(
SliderThreshold.getValue() / 1000.0, 5, 3, false));
}
});
ActionListener subsSchemeButtonListener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
CalculateNumberOfModels(e);
jCheckBoxClustering.setSelected(Button203SubsTypeCalcLike
.isSelected());
ButtonAICClustering
.setEnabled(jCheckBoxClustering.isSelected());
ButtonAICcClustering.setEnabled(jCheckBoxClustering
.isSelected());
ButtonBICClustering
.setEnabled(jCheckBoxClustering.isSelected());
}
};
// common event handling for set of models
Button3SubsTypeCalcLike.addActionListener(subsSchemeButtonListener);
Button5SubsTypeCalcLike.addActionListener(subsSchemeButtonListener);
Button7SubsTypeCalcLike.addActionListener(subsSchemeButtonListener);
Button11SubsTypeCalcLike.addActionListener(subsSchemeButtonListener);
Button203SubsTypeCalcLike.addActionListener(subsSchemeButtonListener);
jCheckBoxPinv.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
CalculateNumberOfModels(e);
}
});
jCheckBoxGamma.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (jCheckBoxGamma.isSelected())
TextFieldNcat.setEnabled(true);
else
TextFieldNcat.setEnabled(false);
CalculateNumberOfModels(e);
}
});
jCheckBoxFrequencies.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
CalculateNumberOfModels(e);
}
});
ButtonFixedUserTopologyCalcLike.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
ReadUserTopologyCalcLike(e);
}
});
ButtonBIONJCalcLike.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
enableTreeSearching(false);
}
});
ButtonFixedCalcLike.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
enableTreeSearching(false);
}
});
ButtonFixedUserTopologyCalcLike.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
enableTreeSearching(false);
}
});
ButtonMLCalcLike.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
enableTreeSearching(true);
}
});
/*
* ButtonFixedUserTreeCalcLike.addActionListener(new ActionListener() {
* public void actionPerformed(ActionEvent e) { ReadUserTreeCalcLike(e);
* } });
*
*
* CheckBoxFixedTopology.addActionListener(new ActionListener() { public
* void actionPerformed(ActionEvent e) {
* CheckBoxFixedTopologyActionPerformed(e); } });
*
*
* CheckBoxOptimizeTopology.addActionListener(new ActionListener() {
* public void actionPerformed(ActionEvent e) {
* CheckBoxOptimizeTopologyActionPerformed(e); } });
*/
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
thisWindowClosing(e);
}
});
// END GENERATED CODE
}
private void enableTreeSearching(boolean enabled) {
ButtonNNICalcLike.setEnabled(enabled);
ButtonSPRCalcLike.setEnabled(enabled);
ButtonBestCalcLike.setEnabled(enabled);
}
private boolean mShown = false;
public void addNotify() {
super.addNotify();
if (mShown)
return;
// resize frame to account for menubar
JMenuBar jMenuBar = getJMenuBar();
if (jMenuBar != null) {
int jMenuBarHeight = jMenuBar.getPreferredSize().height;
Dimension dimension = getSize();
dimension.height += jMenuBarHeight;
setSize(dimension);
// move down components in layered pane
Component[] components = getLayeredPane().getComponentsInLayer(
JLayeredPane.DEFAULT_LAYER.intValue());
for (int i = 0; i < components.length; i++) {
Point location = components[i].getLocation();
location.move(location.x, location.y + jMenuBarHeight);
components[i].setLocation(location);
}
}
mShown = true;
}
// Close the window when the close box is clicked
void thisWindowClosing(WindowEvent e) {
setVisible(false);
dispose();
// System.exit(0);
}
public void RunButtonCalcLikeActionPerformed(ActionEvent e) {
try {
// set number of processors
options.setNumberOfThreads(SliderProcessors.getValue());
// get parameters
if (Button3SubsTypeCalcLike.isSelected())
options.setSubstTypeCode(0);
else if (Button5SubsTypeCalcLike.isSelected())
options.setSubstTypeCode(1);
else if (Button7SubsTypeCalcLike.isSelected())
options.setSubstTypeCode(2);
else if (Button11SubsTypeCalcLike.isSelected())
options.setSubstTypeCode(3);
else
options.setSubstTypeCode(4);
if (jCheckBoxFrequencies.isSelected())
options.doF = true;
else
options.doF = false;
if (jCheckBoxPinv.isSelected())
options.doI = true;
else
options.doI = false;
if (jCheckBoxGamma.isSelected()) {
options.doG = true;
options.numGammaCat = Integer.parseInt(TextFieldNcat.getText());
} else
options.doG = false;
CalculateNumberOfModels(e);
// base tree for ML calculations
if (ButtonFixedCalcLike.isSelected()) {
options.fixedTopology = true;
options.optimizeMLTopology = false;
options.userTopologyExists = false;
// ModelTest.userTreeExists = false;
} else if (ButtonBIONJCalcLike.isSelected()) {
options.fixedTopology = false;
options.optimizeMLTopology = false;
options.userTopologyExists = false;
// ModelTest.userTreeExists = false;
} else if (ButtonMLCalcLike.isSelected()) {
options.fixedTopology = false;
options.optimizeMLTopology = true;
options.userTopologyExists = false;
// ModelTest.userTreeExists = false;
} else if (ButtonFixedUserTopologyCalcLike.isSelected()) {
options.fixedTopology = false;
options.optimizeMLTopology = false;
options.userTopologyExists = true;
// ModelTest.userTreeExists = false;
}
if (ButtonNNICalcLike.isSelected()) {
options.treeSearchOperations = ApplicationOptions.TreeSearch.NNI;
} else if (ButtonSPRCalcLike.isSelected()) {
options.treeSearchOperations = ApplicationOptions.TreeSearch.SPR;
} else if (ButtonBestCalcLike.isSelected()) {
options.treeSearchOperations = ApplicationOptions.TreeSearch.BEST;
}
/*
* else if (ButtonFixedUserTreeCalcLike.isSelected()) {
* ModelTest.fixedTopology = false; ModelTest.optimizeMLTopology =
* false; ModelTest.userTopologyExists = false;
* ModelTest.userTreeExists = true; }
*/else { /* should not be here */
}
if (jCheckBoxClustering.isSelected()) {
if (ButtonAICClustering.isSelected()) {
options.setHeuristicInformationCriterion(InformationCriterion.IC_AIC);
} else if (ButtonAICcClustering.isSelected()) {
options.setHeuristicInformationCriterion(InformationCriterion.IC_AICc);
} else if (ButtonBICClustering.isSelected()) {
options.setHeuristicInformationCriterion(InformationCriterion.IC_BIC);
}
}
if (jCheckBoxModelFiltering.isSelected()) {
options.setGuidedSearchThreshold(SliderThreshold.getValue() / 1000.0);
} else {
options.setGuidedSearchThreshold(0.0d);
}
// build set of models
options.setCandidateModels();
// build progress frame
progressFrame = new Frame_Progress(options.getNumModels(), this,
options);
setVisible(false);
// scroll to the bottom
XManager.getInstance()
.getPane()
.setCaretPosition(
XManager.getInstance().getPane().getDocument()
.getLength());
options.createLogFile();
options.createCkpFile();
// run phyml
this.task = new ComputeLikelihoodTask();
this.runPhyml = task.getValue();
task.start();
} catch (Exception f) {
f.printStackTrace();
}
}
public void JButtonDefaultCalcLikeActionPerformed(ActionEvent e) {
try {
SliderProcessors.setValue(DEFAULT_NUMBER_OF_THREADS);
Button11SubsTypeCalcLike.setSelected(true);
ButtonMLCalcLike.setSelected(true);
enableTreeSearching(ButtonMLCalcLike.isSelected());
ButtonBestCalcLike.setSelected(true);
jCheckBoxFrequencies.setSelected(true);
jCheckBoxPinv.setSelected(true);
jCheckBoxGamma.setSelected(true);
TextFieldNcat.setEnabled(true);
TextFieldNcat.setText("4");
jCheckBoxClustering.setSelected(false);
ButtonAICClustering.setEnabled(jCheckBoxClustering.isSelected());
ButtonAICcClustering.setEnabled(jCheckBoxClustering.isSelected());
ButtonBICClustering.setEnabled(jCheckBoxClustering.isSelected());
jCheckBoxModelFiltering.setSelected(false);
SliderThreshold.setValue(DEFAULT_THRESHOLD);
CalculateNumberOfModels(null);
jLabelUserTopology.setText("");
jLabelUserTree.setText("");
} catch (Exception f) {
f.printStackTrace();
}
}
public void CancelButtonCalcLikeActionPerformed(ActionEvent e) {
try {
setVisible(false);
dispose();
} catch (Exception f) {
f.printStackTrace();
}
}
public void CalculateNumberOfModels(ActionEvent e) {
int numberOfModels;
try {
if (Button3SubsTypeCalcLike.isSelected())
numberOfModels = 3;
else if (Button5SubsTypeCalcLike.isSelected())
numberOfModels = 5;
else if (Button7SubsTypeCalcLike.isSelected())
numberOfModels = 7;
else if (Button11SubsTypeCalcLike.isSelected())
numberOfModels = 11;
else
numberOfModels = 203;
if (jCheckBoxFrequencies.isSelected())
numberOfModels *= 2;
if (jCheckBoxPinv.isSelected() && jCheckBoxGamma.isSelected())
numberOfModels *= 4;
else if (jCheckBoxPinv.isSelected() || jCheckBoxGamma.isSelected())
numberOfModels *= 2;
options.setNumModels(numberOfModels);
jLabelNumModels.setText("NumModels = " + numberOfModels);
} catch (Exception f) {
f.printStackTrace();
}
}
private void processorsSliderChangeListener(ChangeEvent e) {
jLabelNumProcessors
.setText(String.valueOf(SliderProcessors.getValue()));
}
public void ReadUserTopologyCalcLike(ActionEvent e) {
FileDialog fc = new FileDialog(this,
"Load Newick tree file with branch lengths", FileDialog.LOAD);
fc.setDirectory(System.getProperty("user.dir"));
fc.setVisible(true);
String treefilename = fc.getFile();
if (treefilename != null) // menu not canceled
{
String treefilenameComplete = fc.getDirectory() + treefilename;
ModelTest.getMainConsole().print(
"Reading tree file \"" + treefilename + "\"...");
System.err.print("\nreading tree file \"" + treefilename + "\"...");
options.setInputTreeFile(new File(treefilename));
// read the tree in
Tree tree = null;
try {
tree = TreeUtilities.readTree(treefilenameComplete);
} catch (IOException e1) {
JOptionPane.showMessageDialog(this, "The specified file \""
+ treefilename + "\" cannot be found",
"jModelTest error", JOptionPane.ERROR_MESSAGE);
ModelTest.getMainConsole().println(" failed.\n");
ButtonMLCalcLike.setSelected(true);
;
} catch (TreeParseException e1) {
ModelTest.getMainConsole().println(" failed.\n");
System.err.println(" failed.\n");
ButtonMLCalcLike.setSelected(true);
;
}
if (tree != null) {
options.setUserTree(TreeUtilities.toNewick(tree, true, false,
false));
TextOutputStream out = new TextOutputStream(options
.getTreeFile().getAbsolutePath());
System.out.println("INPUT TREE: " + options.getUserTree());
out.print(options.getUserTree());
out.close();
jLabelUserTopology.setText(treefilename);
ModelTest.getMainConsole().println(" OK.");
System.err.println("OK.");
}
} else // file does not exists
{
ButtonMLCalcLike.setSelected(true);
enableTreeSearching(true);
// ModelTest.mainConsole.println ("\nOpen file canceled\n");
}
}
private class ComputeLikelihoodTask extends SwingWorker {
private RunPhyml runPhyml;
public ComputeLikelihoodTask() {
this.runPhyml = new RunPhymlThread(progressFrame, options,
ModelTest.getCandidateModels());
}
public Object construct() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.runPhyml.execute();
return runPhyml;
}
public void interrupt() {
runPhyml.interruptThread();
super.interrupt();
}
public RunPhyml getValue() {
return runPhyml;
}
}
}