/*
* CompleteHistorySimulatorParser.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.beagle.tools.parsers;
import dr.evomodelxml.treelikelihood.MarkovJumpsTreeLikelihoodParser;
import dr.evomodel.siteratemodel.GammaSiteRateModel;
import dr.evomodel.substmodel.CodonLabeling;
import dr.app.beagle.tools.CompleteHistorySimulator;
import dr.evolution.alignment.Alignment;
import dr.evolution.datatype.Codons;
import dr.evolution.datatype.DataType;
import dr.evolution.tree.Tree;
import dr.evomodel.branchratemodel.BranchRateModel;
import dr.evomodel.branchratemodel.DefaultBranchRateModel;
import dr.inference.markovjumps.MarkovJumpsType;
import dr.inference.model.Parameter;
import dr.xml.*;
/**
* @author Marc A. Suchard
*/
public class CompleteHistorySimulatorParser extends AbstractXMLObjectParser {
/* standard xml parser stuff follows */
public static final String HISTORY_SIMULATOR = "completeHistorySimulator";
public static final String TREE = "tree";
public static final String REPLICATIONS = "replications";
public static final String COUNTS = MarkovJumpsTreeLikelihoodParser.COUNTS;
public static final String REWARDS = MarkovJumpsTreeLikelihoodParser.REWARDS;
public static final String JUMP_TAG_NAME = MarkovJumpsTreeLikelihoodParser.JUMP_TAG_NAME;
public static final String JUMP_TAG = MarkovJumpsTreeLikelihoodParser.JUMP_TAG;
public static final String SYN_JUMPS = "reportSynonymousMutations";
public static final String NON_SYN_JUMPS = "reportNonSynonymousMutations";
public static final String SUM_SITES = "sumAcrossSites";
public static final String BRANCH_SPECIFIC_SPECIFICATION = "branchSpecificSpecification";
public static final String BRANCH_VARIABLE_PARAMETER = "variableParameter";
public static final String VARIABLE_VALUE_PARAMETER = "valuesParameter";
public static final String ANNOTATE_WITH_ALIGNMENT = "annotateWithAlignment";
public static final String ALIGNMENT_ONLY = "alignmentOnly";
public String getParserName() {
return HISTORY_SIMULATOR;
}
public Object parseXMLObject(XMLObject xo) throws XMLParseException {
int nReplications = xo.getIntegerAttribute(REPLICATIONS);
Tree tree = (Tree) xo.getChild(Tree.class);
GammaSiteRateModel siteModel = (GammaSiteRateModel) xo.getChild(GammaSiteRateModel.class);
BranchRateModel rateModel = (BranchRateModel) xo.getChild(BranchRateModel.class);
if (rateModel == null)
rateModel = new DefaultBranchRateModel();
DataType dataType = siteModel.getSubstitutionModel().getDataType();
String jumpTag = xo.getAttribute(JUMP_TAG_NAME, JUMP_TAG);
boolean sumAcrossSites = xo.getAttribute(SUM_SITES, false);
Parameter branchSpecificParameter = null;
Parameter variableValueParameter = null;
if (xo.hasChildNamed(BRANCH_SPECIFIC_SPECIFICATION)) {
XMLObject cxo = xo.getChild(BRANCH_SPECIFIC_SPECIFICATION);
branchSpecificParameter = (Parameter) cxo.getChild(BRANCH_VARIABLE_PARAMETER).getChild(Parameter.class);
variableValueParameter = (Parameter) cxo.getChild(VARIABLE_VALUE_PARAMETER).getChild(Parameter.class);
}
CompleteHistorySimulator history = new CompleteHistorySimulator(tree, siteModel, rateModel, nReplications,
sumAcrossSites, branchSpecificParameter, variableValueParameter);
XMLObject cxo = xo.getChild(COUNTS);
if (cxo != null) {
MarkovJumpsTreeLikelihoodParser.parseAllChildren(cxo, history, dataType.getStateCount(),
jumpTag, MarkovJumpsType.COUNTS, false);
}
cxo = xo.getChild(REWARDS);
if (cxo != null) {
MarkovJumpsTreeLikelihoodParser.parseAllChildren(cxo, history, dataType.getStateCount(),
jumpTag, MarkovJumpsType.REWARDS, false);
}
if (dataType instanceof Codons) {
Codons codons = (Codons) dataType;
if (xo.getAttribute(SYN_JUMPS, false)) {
double[] synRegMatrix = CodonLabeling.getRegisterMatrix(CodonLabeling.SYN, codons, false); // use base 61
Parameter registerParameter = new Parameter.Default(synRegMatrix);
registerParameter.setId("S");
history.addRegister(registerParameter, MarkovJumpsType.COUNTS, false);
}
if (xo.getAttribute(NON_SYN_JUMPS, false)) {
double[] nonSynRegMatrix = CodonLabeling.getRegisterMatrix(CodonLabeling.NON_SYN, codons, false); // use base 61
Parameter registerParameter = new Parameter.Default(nonSynRegMatrix);
registerParameter.setId("N");
history.addRegister(registerParameter, MarkovJumpsType.COUNTS, false);
}
}
if (xo.getAttribute(ANNOTATE_WITH_ALIGNMENT,false)) {
history.addAlignmentTrait();
}
boolean alignmentOnly = xo.getAttribute(ALIGNMENT_ONLY, false);
if (dataType instanceof Codons && !alignmentOnly) {
System.out.println("Codon models give exception when count statistics are done on them. "
+ "You can supress this by setting alignmentOnly to true.");
}
if (alignmentOnly) {
history.setAlignmentOnly();
}
history.simulate();
return history;
}
//************************************************************************
// AbstractXMLObjectParser implementation
//************************************************************************
public String getParserDescription() {
return "A SequenceSimulator that generates random sequences for a given tree, siteratemodel and branch rate model";
}
public Class getReturnType() {
return Alignment.class;
}
public XMLSyntaxRule[] getSyntaxRules() {
return rules;
}
private XMLSyntaxRule[] rules = new XMLSyntaxRule[]{
new ElementRule(Tree.class),
new ElementRule(GammaSiteRateModel.class),
new ElementRule(BranchRateModel.class, true),
AttributeRule.newIntegerRule(REPLICATIONS),
AttributeRule.newBooleanRule(SYN_JUMPS, true),
AttributeRule.newBooleanRule(NON_SYN_JUMPS, true),
AttributeRule.newBooleanRule(SUM_SITES, true),
AttributeRule.newBooleanRule(ANNOTATE_WITH_ALIGNMENT, true),
AttributeRule.newBooleanRule(ALIGNMENT_ONLY, true),
new ElementRule(BRANCH_SPECIFIC_SPECIFICATION, new XMLSyntaxRule[] {
new ElementRule(VARIABLE_VALUE_PARAMETER, Parameter.class),
new ElementRule(BRANCH_VARIABLE_PARAMETER, Parameter.class),
}, true),
};
}