/*
* BirthDeathEpidemiologyModelParser.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.evomodelxml.speciation;
import dr.evolution.util.Units;
import dr.evomodel.speciation.BirthDeathSerialSamplingModel;
import dr.evoxml.util.XMLUnits;
import dr.inference.model.Parameter;
import dr.xml.*;
import java.util.logging.Logger;
/**
* @author Andrew Rambaut
* @author Tanja Stadler
* @author Alexei Drummond
* @author Joseph Heled
*/
public class BirthDeathEpidemiologyModelParser extends AbstractXMLObjectParser {
public static final String BIRTH_DEATH_EPIDEMIOLOGY = "birthDeathEpidemiology";
public static final String R0 = "R0";
public static final String RECOVERY_RATE = "recoveryRate";
public static final String SAMPLING_PROBABILITY = "samplingProbability";
public static final String ORIGIN = BirthDeathSerialSamplingModelParser.ORIGIN;
public String getParserName() {
return BIRTH_DEATH_EPIDEMIOLOGY;
}
public Object parseXMLObject(XMLObject xo) throws XMLParseException {
final String modelName = xo.getId();
final Units.Type units = XMLUnits.Utils.getUnitsAttr(xo);
final Parameter R0Parameter = (Parameter) xo.getElementFirstChild(R0);
final Parameter recoveryRateParameter = (Parameter) xo.getElementFirstChild(RECOVERY_RATE);
final Parameter samplingProbabiltyParameter = (Parameter) xo.getElementFirstChild(SAMPLING_PROBABILITY);
Parameter origin = null;
if (xo.hasChildNamed(ORIGIN)) {
origin = (Parameter) xo.getElementFirstChild(ORIGIN);
}
Logger.getLogger("dr.evomodel").info("Using epidemiological parameterization of " + getCitationRT());
return new BirthDeathSerialSamplingModel(modelName, R0Parameter, recoveryRateParameter, samplingProbabiltyParameter, origin, units);
}
//************************************************************************
// AbstractXMLObjectParser implementation
//************************************************************************
public static String getCitationPsiOrg() {
// return "Stadler, T; Sampling-through-time in birth-death trees; JOURNAL OF THEORETICAL BIOLOGY (2010) 267:396-404";
return "Stadler T (2010) J Theor Biol 267, 396-404 [Birth-Death with Serial Samples].";
}
public static String getCitationRT() {
return "Stadler et al (2011) : Estimating the basic reproductive number from viral sequence data, " +
"Mol.Biol.Evol., doi: 10.1093/molbev/msr217, 2011";
}
public String getParserDescription() {
return "Stadler et al (2011) model of epidemiology.";
}
public Class getReturnType() {
return BirthDeathSerialSamplingModel.class;
}
public XMLSyntaxRule[] getSyntaxRules() {
return rules;
}
private final XMLSyntaxRule[] rules = {
new ElementRule(ORIGIN, Parameter.class, "The origin of the infection, x0 > tree.rootHeight", true),
new ElementRule(R0, new XMLSyntaxRule[]{new ElementRule(Parameter.class)}),
new ElementRule(RECOVERY_RATE, new XMLSyntaxRule[]{new ElementRule(Parameter.class)}),
new ElementRule(SAMPLING_PROBABILITY, new XMLSyntaxRule[]{new ElementRule(Parameter.class)}),
XMLUnits.SYNTAX_RULES[0]
};
}