/*
* PartitionClockModelPanel.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.beauti.clockModelsPanel;
import dr.app.beauti.options.PartitionClockModel;
import dr.app.beauti.types.ClockDistributionType;
import dr.app.beauti.types.ClockType;
import dr.app.beauti.util.PanelUtils;
import dr.app.util.OSType;
import jam.panels.OptionsPanel;
import javax.swing.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.EnumSet;
/**
* @author Andrew Rambaut
*/
public class PartitionClockModelPanel extends OptionsPanel {
// Components
private static final long serialVersionUID = -1645661616353099424L;
private JComboBox clockTypeCombo = new JComboBox(EnumSet.range(
ClockType.STRICT_CLOCK, ClockType.FIXED_LOCAL_CLOCK).toArray());
private JComboBox clockDistributionCombo = new JComboBox (new ClockDistributionType[] {
ClockDistributionType.LOGNORMAL,
ClockDistributionType.GAMMA,
// ClockDistributionType.CAUCHY,
ClockDistributionType.EXPONENTIAL
});
private JCheckBox continuousQuantileCheck = new JCheckBox("Use continuous quantile parameterization.");
protected final PartitionClockModel model;
public PartitionClockModelPanel(final PartitionClockModel partitionModel) {
super(12, (OSType.isMac() ? 6 : 24));
this.model = partitionModel;
PanelUtils.setupComponent(clockTypeCombo);
clockTypeCombo.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent ev) {
model.setClockType((ClockType) clockTypeCombo.getSelectedItem());
setupPanel();
}
});
clockTypeCombo.setToolTipText("<html>Select the type of molecular clock model.</html>");
clockTypeCombo.setSelectedItem(model.getClockType());
PanelUtils.setupComponent(clockDistributionCombo);
clockDistributionCombo.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent ev) {
model.setClockDistributionType((ClockDistributionType) clockDistributionCombo.getSelectedItem());
}
});
clockDistributionCombo.setToolTipText("<html>Select the distribution that describes the variation in rate.</html>");
clockDistributionCombo.setSelectedItem(model.getClockDistributionType());
PanelUtils.setupComponent(continuousQuantileCheck);
continuousQuantileCheck.setToolTipText("<html>" +
"Select this option to use the continuous quantile form of the relaxed<br>" +
"clock model described by Li & Drummond (2012) MBE 29:751-61 instead of<br>" +
"the discretized categorical form.<html>");
continuousQuantileCheck.setSelected(model.isContinuousQuantile());
continuousQuantileCheck.addItemListener(
new ItemListener() {
public void itemStateChanged(ItemEvent ev) {
model.setContinuousQuantile(continuousQuantileCheck.isSelected());
}
});
setupPanel();
setOpaque(false);
}
/**
* Lays out the appropriate components in the panel for this partition model.
*/
public void setupPanel() {
removeAll();
addComponentWithLabel("Clock Type:", clockTypeCombo);
switch (model.getClockType()) {
case STRICT_CLOCK:
break;
case UNCORRELATED:
addComponent(new JLabel(
"<html>" +
"Using the uncorrelated relaxed clock model of Drummond, Ho, Phillips & <br>" +
"Rambaut (2006) PLoS Biology 4, e88.<html>"));
addComponentWithLabel("Relaxed Distribution:", clockDistributionCombo);
addComponent(continuousQuantileCheck);
break;
case AUTOCORRELATED:
addComponentWithLabel("Relaxed Distribution:", clockDistributionCombo);
break;
case RANDOM_LOCAL_CLOCK:
case FIXED_LOCAL_CLOCK:
break;
default:
throw new IllegalArgumentException("Unknown clock model type");
}
}
/**
* Sets the components up according to the partition model - but does not
* layout the top level options panel.
*/
public void setOptions() {
if (model == null) {
return;
}
clockTypeCombo.setSelectedItem(model.getClockType());
clockDistributionCombo.setSelectedItem(model.getClockDistributionType());
setupPanel();
setOpaque(false);
}
}