/*
* Copyright (c) 2009 The Jackson Laboratory
*
* This software was developed by Gary Churchill's Lab at The Jackson
* Laboratory (see http://research.jax.org/faculty/churchill).
*
* This 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 software 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 software. If not, see <http://www.gnu.org/licenses/>.
*/
package org.jax.qtl.cross.gui;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.SpinnerNumberModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.jax.qtl.cross.SimulateCrossCommandBuilder;
import org.jax.qtl.cross.SimulateMapCommandBuilder;
import org.jax.qtl.cross.Cross.CrossSubType;
import org.jax.qtl.cross.SimulateCrossCommandBuilder.MapFunction;
import org.jax.r.RCommand;
import org.jax.r.gui.RCommandEditorPanel;
/**
* The 1st sim cross panel
* @author <A HREF="mailto:keith.sheppard@jax.org">Keith Sheppard</A>
*/
public class SimulateCrossPanelOne extends RCommandEditorPanel
{
/**
* every {@link java.io.Serializable} is supposed to have one of these
*/
private static final long serialVersionUID = 6956336179249044949L;
private final SimulateMapCommandBuilder simulateMapCommandBuilder;
private final SimulateCrossCommandBuilder simulateCrossCommandBuilder;
private final SpinnerNumberModel numIndividualsSpinnerModel =
new SpinnerNumberModel(
100, // value
0, // min
Integer.MAX_VALUE, // max
1); // step
private final SpinnerNumberModel genoErrorRateSpinnerModel =
new SpinnerNumberModel(
0.0,
0.0,
1.0,
0.1);
private final SpinnerNumberModel missingGenoRateSpinnerModel =
new SpinnerNumberModel(
0.0,
0.0,
1.0,
0.1);
private final SpinnerNumberModel partiallyInformativeRateSpinnerModel =
new SpinnerNumberModel(
0.0,
0.0,
1.0,
0.1);
private final SpinnerNumberModel probabilityOfNoInterferenceSpinnerModel =
new SpinnerNumberModel(
0.0,
0.0,
1.0,
0.1);
private final SpinnerNumberModel interferenceParameterSpinnerModel =
new SpinnerNumberModel(
0.0,
0.0,
Integer.MAX_VALUE,
0.1);
private final ChangeListener updateOnAnyChangeListener =
new ChangeListener()
{
public void stateChanged(ChangeEvent e)
{
SimulateCrossPanelOne.this.updateCommand();
}
};
private final ItemListener updateOnAnyItemChangeListener =
new ItemListener()
{
public void itemStateChanged(ItemEvent e)
{
if(e.getStateChange() == ItemEvent.SELECTED)
{
SimulateCrossPanelOne.this.updateCommand();
}
}
};
/**
* Constructor
* @param simulateMapCommandBuilder
* this map command builder
* @param simulateCrossCommandBuilder
* the cross command builder
*/
public SimulateCrossPanelOne(
SimulateMapCommandBuilder simulateMapCommandBuilder,
SimulateCrossCommandBuilder simulateCrossCommandBuilder)
{
this.simulateMapCommandBuilder = simulateMapCommandBuilder;
this.simulateCrossCommandBuilder = simulateCrossCommandBuilder;
this.initComponents();
this.postGuiInit();
}
/**
* Take care of the GUI initialization that wasn't handled by the GUI
* builder
*/
private void postGuiInit()
{
this.numIndividualsSpinner.setModel(
this.numIndividualsSpinnerModel);
this.numIndividualsSpinnerModel.setValue(
this.simulateCrossCommandBuilder.getNumIndividuals());
this.numIndividualsSpinnerModel.addChangeListener(
this.updateOnAnyChangeListener);
this.genoErrorRateSpinner.setModel(
this.genoErrorRateSpinnerModel);
this.genoErrorRateSpinnerModel.setValue(
this.simulateCrossCommandBuilder.getGenotypingErrorRate());
this.genoErrorRateSpinnerModel.addChangeListener(
this.updateOnAnyChangeListener);
this.missingGenoRateSpinner.setModel(
this.missingGenoRateSpinnerModel);
this.missingGenoRateSpinnerModel.setValue(
this.simulateCrossCommandBuilder.getMissingGenotypeRate());
this.missingGenoRateSpinnerModel.addChangeListener(
this.updateOnAnyChangeListener);
this.partiallyInformativeRateSpinner.setModel(
this.partiallyInformativeRateSpinnerModel);
this.partiallyInformativeRateSpinnerModel.setValue(
this.simulateCrossCommandBuilder.getPartiallyInformativeRate());
this.partiallyInformativeRateSpinnerModel.addChangeListener(
this.updateOnAnyChangeListener);
this.probabilityOfNoInterferenceSpinner.setModel(
this.probabilityOfNoInterferenceSpinnerModel);
this.probabilityOfNoInterferenceSpinnerModel.setValue(
this.simulateCrossCommandBuilder.getProbabilityOfNoInterference());
this.probabilityOfNoInterferenceSpinnerModel.addChangeListener(
this.updateOnAnyChangeListener);
this.interferenceParameterSpinner.setModel(
this.interferenceParameterSpinnerModel);
this.interferenceParameterSpinnerModel.setValue(
this.simulateCrossCommandBuilder.getInterferenceParameter());
this.interferenceParameterSpinnerModel.addChangeListener(
this.updateOnAnyChangeListener);
for(CrossSubType crossType: CrossSubType.values())
{
this.crossTypeComboBox.addItem(crossType);
}
this.crossTypeComboBox.setSelectedItem(
this.simulateCrossCommandBuilder.getCrossType());
this.crossTypeComboBox.addItemListener(
this.updateOnAnyItemChangeListener);
for(MapFunction mapFunction: MapFunction.values())
{
this.mapFunctionComboBox.addItem(mapFunction);
}
this.mapFunctionComboBox.setSelectedItem(
this.simulateCrossCommandBuilder.getMapFunction());
this.mapFunctionComboBox.addItemListener(
this.updateOnAnyItemChangeListener);
}
/**
* {@inheritDoc}
*/
public RCommand[] getCommands()
{
return new RCommand[] {this.simulateCrossCommandBuilder.getCommand()};
}
/**
* Validate the data in this panel
* @return
* true iff the data is valid
*/
public boolean validateData()
{
// the user can't enter invalid data
return true;
}
/**
* Update the cross command
*/
private void updateCommand()
{
this.simulateCrossCommandBuilder.setNumIndividuals(
this.numIndividualsSpinnerModel.getNumber().intValue());
this.simulateCrossCommandBuilder.setGenotypingErrorRate(
this.genoErrorRateSpinnerModel.getNumber().doubleValue());
this.simulateCrossCommandBuilder.setMissingGenotypeRate(
this.missingGenoRateSpinnerModel.getNumber().doubleValue());
this.simulateCrossCommandBuilder.setPartiallyInformativeRate(
this.partiallyInformativeRateSpinnerModel.getNumber().doubleValue());
this.simulateCrossCommandBuilder.setProbabilityOfNoInterference(
this.probabilityOfNoInterferenceSpinnerModel.getNumber().doubleValue());
this.simulateCrossCommandBuilder.setInterferenceParameter(
this.interferenceParameterSpinnerModel.getNumber().doubleValue());
CrossSubType crossType =
(CrossSubType)this.crossTypeComboBox.getSelectedItem();
this.simulateCrossCommandBuilder.setCrossType(crossType);
this.simulateCrossCommandBuilder.setMapFunction(
(MapFunction)this.mapFunctionComboBox.getSelectedItem());
this.simulateMapCommandBuilder.setCreateSexSpecificGeneticMaps(
crossType == CrossSubType.FOUR_WAY);
this.fireCommandModified();
}
/**
* This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("all")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
javax.swing.JLabel numIndividualsLabel = new javax.swing.JLabel();
numIndividualsSpinner = new javax.swing.JSpinner();
javax.swing.JLabel crossTypeLabel = new javax.swing.JLabel();
crossTypeComboBox = new javax.swing.JComboBox();
javax.swing.JLabel mapFunctionLabel = new javax.swing.JLabel();
mapFunctionComboBox = new javax.swing.JComboBox();
javax.swing.JLabel genoErrorRateLabel = new javax.swing.JLabel();
genoErrorRateSpinner = new javax.swing.JSpinner();
javax.swing.JLabel missingGenoRateLabel = new javax.swing.JLabel();
missingGenoRateSpinner = new javax.swing.JSpinner();
javax.swing.JLabel partiallyInformativeRateLabel = new javax.swing.JLabel();
partiallyInformativeRateSpinner = new javax.swing.JSpinner();
javax.swing.JLabel probabilityOfNoInterferenceLabel = new javax.swing.JLabel();
probabilityOfNoInterferenceSpinner = new javax.swing.JSpinner();
javax.swing.JLabel interferenceParameterLabel = new javax.swing.JLabel();
interferenceParameterSpinner = new javax.swing.JSpinner();
numIndividualsLabel.setText("Number of Individuals:");
crossTypeLabel.setText("Cross Type:");
mapFunctionLabel.setText("Map Function:");
genoErrorRateLabel.setText("Genotyping Error Rate (0-1):");
missingGenoRateLabel.setText("Missing Genotype Rate (0-1):");
partiallyInformativeRateLabel.setText("Partially Informative Rate (0-1):");
probabilityOfNoInterferenceLabel.setText("Probability of No Interference (0-1):");
interferenceParameterLabel.setText("Interference Parameter:");
org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.addContainerGap()
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.add(numIndividualsLabel)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(numIndividualsSpinner, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 67, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.add(layout.createSequentialGroup()
.add(crossTypeLabel)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(crossTypeComboBox, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(mapFunctionLabel)
.add(5, 5, 5)
.add(mapFunctionComboBox, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.add(layout.createSequentialGroup()
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(probabilityOfNoInterferenceLabel)
.add(partiallyInformativeRateLabel))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(partiallyInformativeRateSpinner, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 55, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(layout.createSequentialGroup()
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.add(genoErrorRateSpinner, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 55, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(missingGenoRateLabel))
.add(layout.createSequentialGroup()
.add(probabilityOfNoInterferenceSpinner, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 55, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(interferenceParameterLabel)))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(interferenceParameterSpinner, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 55, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(missingGenoRateSpinner, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 55, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))))
.add(genoErrorRateLabel))
.addContainerGap(85, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.addContainerGap()
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(numIndividualsLabel)
.add(numIndividualsSpinner, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(crossTypeLabel)
.add(crossTypeComboBox, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(mapFunctionLabel)
.add(mapFunctionComboBox, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(genoErrorRateLabel)
.add(genoErrorRateSpinner, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(missingGenoRateSpinner, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(missingGenoRateLabel))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(partiallyInformativeRateLabel)
.add(partiallyInformativeRateSpinner, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(probabilityOfNoInterferenceLabel)
.add(probabilityOfNoInterferenceSpinner, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(interferenceParameterLabel)
.add(interferenceParameterSpinner, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
}// </editor-fold>//GEN-END:initComponents
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JComboBox crossTypeComboBox;
private javax.swing.JSpinner genoErrorRateSpinner;
private javax.swing.JSpinner interferenceParameterSpinner;
private javax.swing.JComboBox mapFunctionComboBox;
private javax.swing.JSpinner missingGenoRateSpinner;
private javax.swing.JSpinner numIndividualsSpinner;
private javax.swing.JSpinner partiallyInformativeRateSpinner;
private javax.swing.JSpinner probabilityOfNoInterferenceSpinner;
// End of variables declaration//GEN-END:variables
}