package com.cipres.mrBayesPlugin.ui;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.SystemColor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.prefs.Preferences;
import javax.swing.AbstractAction;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import org.jdom.Element;
import org.json.simple.JSONObject;
import org.virion.jam.util.SimpleListener;
import com.biomatters.geneious.publicapi.components.Dialogs;
import com.biomatters.geneious.publicapi.documents.AnnotatedPluginDocument;
import com.biomatters.geneious.publicapi.documents.XMLSerializationException;
import com.biomatters.geneious.publicapi.documents.sequence.AminoAcidSequenceDocument;
import com.biomatters.geneious.publicapi.documents.sequence.NucleotideSequenceDocument;
import com.biomatters.geneious.publicapi.documents.sequence.SequenceAlignmentDocument;
import com.biomatters.geneious.publicapi.documents.sequence.SequenceCharSequence;
import com.biomatters.geneious.publicapi.documents.sequence.SequenceDocument;
import com.biomatters.geneious.publicapi.plugin.DocumentOperation;
import com.biomatters.geneious.publicapi.plugin.DocumentOperationException;
import com.biomatters.geneious.publicapi.plugin.Options;
import com.biomatters.geneious.publicapi.plugin.PluginUtilities;
import com.biomatters.geneious.publicapi.plugin.Options.DoubleOption;
import com.biomatters.geneious.publicapi.plugin.Options.StringOption;
import com.biomatters.geneious.publicapi.utilities.IconUtilities;
import com.biomatters.geneious.publicapi.utilities.SequenceUtilities;
import com.cipres.mrBayesPlugin.CipresMrBayesPlugin;
import com.cipres.mrBayesPlugin.utilities.MrBayesUtilities;
import jebl.evolution.sequences.GeneticCode;
/**
* @author Matthew Cheung
* @version $Id: MrBayesOptions.java 24127 2008-12-22 03:23:13Z steve $
*/
public class MrBayesOptions extends Options {
private static final int MAX_SEED = 32000;
private static final String CODON_MODEL_WARNING = "Cannot use codon model.
The translation of one or more documents contains a stop codon.";
//models
public static final String JC69 = "JC69";
public static final String HKY85 = "HKY85";
public static final String GTR = "GTR";
public static final String CODON = "Codon (M1)";
//amino acid rates
private static final String[] AMINO_ACID_RATES = new String[]{
"poisson"
, "jones"
, "dayhoff"
, "mtrev"
, "mtmam"
, "wag"
, "rtrev"
, "cprev"
, "vt"
, "blosum"
, "equalin"
// ,"gtr" todo, gtr causes Geneious to crash with invalid xml element name
};
//rate variations
public static final String EQUAL = "equal";
public static final String GAMMA = "gamma";
public static final String PROPINV = "propinv";
public static final String INVGAMMA = "invgamma";
// Options name
public static final String MAXHOURSTORUN = "maxHourToRun";
public static final String LENGTH = "chainLength";
public static final String BURNIN = "burnin";
public static final String SUB_FREQ = "subsampleFrequency";
public static final String NUM_CHAINS = "numberOfChains";
public static final String TEMP = "chainTemp";
public static final String SEED = "randomSeed";
public static final String RATE_VAR = "rateVariation";
public static final String MODEL = "model";
public static final String AMINO_ACID_RATE_MATRIX = "aminoAcidRateMatrix";
public static final String GAMMA_CATS = "gammaCategories";
public static final String PRIOR_TASKS = "priorTasks";
public static final String BRANCH_LENGTH = "branchLength";
public static final String TREE_AGE_ALPHA = "treeAgeAlpha";
public static final String TREE_AGE_BETA = "treeAgeBeta";
public static final String SHAPE_ALPHA = "shapeAlpha";
public static final String OUTGROUP = "outgroup";
static final String DUPLICATE_NAME_MESSAGE = "MrBayes cannot be performed on a document with more than one sequence with the same name.";
// Options
private static DoubleOption maxHoursToRun;
private static BooleanOption useCustomCommandBlock;
private static MultipleLineStringOption commandBlockOption;
private static IntegerOption length;
private static IntegerOption burnin;
private static IntegerOption subsampleFrequency;
private static ComboBoxOption rateVariation;
private static IntegerOption gammaCategories;
private static RadioOption priorTasks;
private static DoubleOption branchLength;
private static DoubleOption treeAgeAlpha;
private static DoubleOption treeAgeBeta;
private static DoubleOption shapeAlpha;
private static AutoHideLabelOption codonModelWarning;
private static Options clustalOptions;
private static IntegerOption randomSeed;
private static Options.Option[] affectedByRateVariation;
private static HashMap serviceOptions;
private ButtonOption restoreButton;
ButtonOption restoreButton2;
public static JSONObject jsonCommand = new JSONObject();
public static JSONObject jsonInterface = new JSONObject();
public static JSONObject getJsonCommand() {
return jsonCommand;
}
@SuppressWarnings("unchecked")
public static void setJsonCommand(String key, Object value) {
jsonCommand.put(key, value);
}
@SuppressWarnings("unchecked")
public static JSONObject getJsonInterface(){
jsonInterface.put("Gamma Categories", gammaCategories.getValue());
jsonInterface.put("Length", length.getValue());
jsonInterface.put("Burning", burnin.getValue());
jsonInterface.put("SubsampleFrequency", subsampleFrequency.getValue());
jsonInterface.put("Rate Variation", rateVariation.getValue());
jsonInterface.put("Prior Tasks", priorTasks.getValue());
jsonInterface.put("Branch Length", branchLength.getValue());
jsonInterface.put("Tree Age Alpha", treeAgeAlpha.getValue());
jsonInterface.put("Tree Age Beta", treeAgeBeta.getValue());
jsonInterface.put("Shape Parameter", shapeAlpha.getValue());
jsonInterface.put("Random Seed", randomSeed.getValue());
return jsonInterface;
}
@SuppressWarnings("unchecked")
public static void setJsonInterface(String key, Object value){
jsonInterface.put(key, value);
}
private boolean panelCreated = false;
public MrBayesOptions(Element e) throws XMLSerializationException {
super(e);
List serviceOptionList = e.getChildren("gridServiceOptions");
serviceOptions = new HashMap();
// for (Element xml : serviceOptionList) {
// String id = xml.getAttributeValue("serviceId");
// if (id != null) {
// GeneiousService service = PluginUtilities.getGeneiousService(id);
// if (service instanceof GeneiousGridService) {
// GeneiousGridService gridService = (GeneiousGridService) service;
// Options serviceOptions1 = gridService.getOptions("MrBayes", true);
// serviceOptions1.valuesFromXML(xml);
// serviceOptions.put(id, serviceOptions1);
// }
// }
// }
}
private boolean duplicateNames = false;
private static StringOption clientJobName;
private static int bufferCnt = 0;
private static void addJobNameOption(Options options, final AnnotatedPluginDocument[] selectedDocuments, int bufferCnt)
{
options.beginAlignHorizontally(null, false);
clientJobName = options.addStringOption("clientJobName","Please specify a job name", selectedDocuments[0].getName());
for (int i = 0; i < bufferCnt; ++i)
addBuffer(options);
options.endAlignHorizontally();
}
public static String getJobName()
{
return clientJobName.getValueAsString();
}
protected static void addBuffer(Options options)
{
options.addStringOption("BUFFERNAME"+ (bufferCnt++), "BUFFERNAME", "").setVisible(false);
}
/**
* WARNING you will need to add the field clustalOptions as childOptions somehow if you want this class to be properly XMLSerializable.
*
*
* @param selectedDocuments
* @throws DocumentOperationException
*/
@SuppressWarnings("OverlyLongMethod")
public MrBayesOptions(final AnnotatedPluginDocument[] selectedDocuments) throws DocumentOperationException {
super(MrBayesOptions.class);
final ArrayList