/* * STARBEASTOptions.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.options; import dr.app.beauti.generator.Generator; import dr.app.beauti.types.OperatorType; import dr.app.beauti.types.PriorScaleType; import dr.app.beauti.types.TreePriorType; import dr.evomodelxml.operators.TreeNodeSlideParser; import dr.evomodelxml.speciation.BirthDeathModelParser; import dr.evomodelxml.speciation.SpeciesTreeModelParser; import dr.evomodelxml.speciation.YuleModelParser; import java.util.ArrayList; import java.util.List; /** * @author Walter Xie * @version $Id$ */ @Deprecated public class STARBEASTOptions extends ModelOptions { private static final long serialVersionUID = -668734758207432455L; public static final String TREE_FILE_NAME = "trees"; public static final String POP_MEAN = "popMean"; public static final String SPECIES_TREE_FILE_NAME = TraitData.TRAIT_SPECIES + "." + STARBEASTOptions.TREE_FILE_NAME; // species.trees public static final String CITATION = "<html>Joseph Heled and Alexei J. Drummond,<br>" + "Bayesian Inference of Species Trees from Multilocus Data,<br>" + "Molecular Biology and Evolution 2010 27(3):570-580</html>"; public static final String EXAMPLE_FORMAT = "<html>A proper trait file is tab delimited. " + "The first row is always <font color=red>traits</font> followed by the keyword " + "(e.g. <font color=red>species</font> in *BEAST) in the second column and separated " + "by <font color=red>tab</font>. The rest rows are mapping taxa to species, which list " + "taxon name in the first column and species name in the second column separated by " + "<font color=red>tab</font>. For example: <br>" + "traits\tspecies<br>" + "taxon1\tspeciesA<br>" + "taxon2\tspeciesA<br>" + "taxon3\tspeciesB<br>" + "... ...<br>" + "Once mapping file is loaded, the trait named by keyword <font color=red>species</font> " + "is displayed in the main panel, and the message of using *BEAST is also displayed on " + "the bottom of main frame.<br>" + "For multi-alignment, the default of *BEAST is unlinking all models: substitution model, " + "clock model, and tree models.</html>"; private final BeautiOptions options; public STARBEASTOptions(BeautiOptions options) { this.options = options; initModelParametersAndOpererators(); } @Override public void initModelParametersAndOpererators() { double spWeights = 5.0; double spTuning = 0.9; createParameterOneOverXPrior(TraitData.TRAIT_SPECIES + "." + POP_MEAN, "Species tree: population hyper-parameter operator", PriorScaleType.TIME_SCALE, 1.0); // species tree Yule createParameterOneOverXPrior(TraitData.TRAIT_SPECIES + "." + YuleModelParser.YULE + "." + YuleModelParser.BIRTH_RATE, "Species tree: Yule process birth rate", PriorScaleType.BIRTH_RATE_SCALE, 1.0); // species tree Birth Death createParameterOneOverXPrior(TraitData.TRAIT_SPECIES + "." + BirthDeathModelParser.MEAN_GROWTH_RATE_PARAM_NAME, "Species tree: Birth Death model mean growth rate", PriorScaleType.BIRTH_RATE_SCALE, 1.0); createZeroOneParameterUniformPrior(TraitData.TRAIT_SPECIES + "." + BirthDeathModelParser.RELATIVE_DEATH_RATE_PARAM_NAME, "Species tree: Birth Death model relative death rate", 0.5); createParameterOneOverXPrior(SpeciesTreeModelParser.SPECIES_TREE + "." + Generator.SPLIT_POPS, "Species tree: population size operator", PriorScaleType.TIME_SCALE, 1.0); createParameter(TraitData.TRAIT_SPECIES + "." + TreeNodeSlideParser.TREE_NODE_REHEIGHT, "Species tree: tree node operator"); createScaleOperator(TraitData.TRAIT_SPECIES + "." + POP_MEAN, spTuning, spWeights); createScaleOperator(TraitData.TRAIT_SPECIES + "." + YuleModelParser.YULE + "." + YuleModelParser.BIRTH_RATE, demoTuning, demoWeights); createScaleOperator(TraitData.TRAIT_SPECIES + "." + BirthDeathModelParser.MEAN_GROWTH_RATE_PARAM_NAME, demoTuning, demoWeights); createScaleOperator(TraitData.TRAIT_SPECIES + "." + BirthDeathModelParser.RELATIVE_DEATH_RATE_PARAM_NAME, demoTuning, demoWeights); createScaleOperator(SpeciesTreeModelParser.SPECIES_TREE + "." + Generator.SPLIT_POPS, 0.5, 94); createOperator(TraitData.TRAIT_SPECIES + "." + TreeNodeSlideParser.TREE_NODE_REHEIGHT, OperatorType.NODE_REHIGHT, demoTuning, 94); //TODO: more } @Override public List<Parameter> selectParameters(List<Parameter> params) { params.add(getParameter(TraitData.TRAIT_SPECIES + "." + POP_MEAN)); if (options.getPartitionTreePriors().get(0).getNodeHeightPrior() == TreePriorType.SPECIES_BIRTH_DEATH) { params.add(getParameter(TraitData.TRAIT_SPECIES + "." + BirthDeathModelParser.MEAN_GROWTH_RATE_PARAM_NAME)); params.add(getParameter(TraitData.TRAIT_SPECIES + "." + BirthDeathModelParser.RELATIVE_DEATH_RATE_PARAM_NAME)); } else if (options.getPartitionTreePriors().get(0).getNodeHeightPrior() == TreePriorType.SPECIES_YULE || options.getPartitionTreePriors().get(0).getNodeHeightPrior() == TreePriorType.SPECIES_YULE_CALIBRATION) { params.add(getParameter(TraitData.TRAIT_SPECIES + "." + YuleModelParser.YULE + "." + YuleModelParser.BIRTH_RATE)); } // params.add(getParameter(SpeciesTreeModel.SPECIES_TREE + "." + Generator.SPLIT_POPS)); return params; } @Override public List<Operator> selectOperators(List<Operator> ops) { ops.add(getOperator(TraitData.TRAIT_SPECIES + "." + POP_MEAN)); if (options.getPartitionTreePriors().get(0).getNodeHeightPrior() == TreePriorType.SPECIES_BIRTH_DEATH) { ops.add(getOperator(TraitData.TRAIT_SPECIES + "." + BirthDeathModelParser.MEAN_GROWTH_RATE_PARAM_NAME)); ops.add(getOperator(TraitData.TRAIT_SPECIES + "." + BirthDeathModelParser.RELATIVE_DEATH_RATE_PARAM_NAME)); // ops.add(getOperator("upDownBirthDeathSpeciesTree")); // ops.add(getOperator("upDownBirthDeathSTPop")); // // for (PartitionTreeModel tree : getPartitionTreeModels()) { // ops.add(getOperator(tree.getPrefix() + "upDownBirthDeathGeneTree")); // } } else if (options.getPartitionTreePriors().get(0).getNodeHeightPrior() == TreePriorType.SPECIES_YULE || options.getPartitionTreePriors().get(0).getNodeHeightPrior() == TreePriorType.SPECIES_YULE_CALIBRATION) { ops.add(getOperator(TraitData.TRAIT_SPECIES + "." + YuleModelParser.YULE + "." + YuleModelParser.BIRTH_RATE)); // ops.add(getOperator("upDownYuleSpeciesTree")); // ops.add(getOperator("upDownYuleSTPop")); // // for (PartitionTreeModel tree : getPartitionTreeModels()) { // ops.add(getOperator(tree.getPrefix() + "upDownYuleGeneTree")); // } } ops.add(getOperator(SpeciesTreeModelParser.SPECIES_TREE + "." + Generator.SPLIT_POPS)); ops.add(getOperator(TraitData.TRAIT_SPECIES + "." + TreeNodeSlideParser.TREE_NODE_REHEIGHT)); return ops; } @Override public String getPrefix() { return ""; } ///////////////////////////////////////////////////////////// public List<String> getSpeciesList() { return new ArrayList<String>(TraitData.getStatesListOfTrait(options.taxonList, TraitData.TRAIT_SPECIES)); } public int getEmptySpeciesIndex() { return TraitData.getEmptyStateIndex(options.taxonList, TraitData.TRAIT_SPECIES); } public String getDescription() { return "Species definition: binds taxa, species and gene trees"; } }