/*
* TransmissionSimulator.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.evomodel.transmission;
import dr.evolution.coalescent.Intervals;
import dr.evolution.tree.NodeRef;
import dr.evolution.tree.Tree;
import dr.evolution.util.Taxa;
import dr.evolution.util.TaxonList;
import dr.evomodel.coalescent.DemographicModel;
import dr.xml.*;
/**
* A likelihood function for a complete transmission history. Takes a viruses tree
* and a demographic model. The transmission history consists of a number of
* hosts with known history of transmission. The viruses tree should have tip
* attributes specifying which host they are from (host="").
*
* @version $Id: TransmissionSimulator.java,v 1.5 2005/06/15 17:20:55 rambaut Exp $
*
* @author Andrew Rambaut
* @author Alexei Drummond
*/
public class TransmissionSimulator {
// PUBLIC STUFF
public static final String TRANSMISSION_SIMULATOR = "transmissionSimulator";
public static final String SOURCE_PATIENT = "sourcePatient";
public TransmissionSimulator(Taxa taxa, Tree hostTree, DemographicModel demographic)
throws TaxonList.MissingTaxonException {
this(TRANSMISSION_SIMULATOR, taxa, hostTree, demographic);
}
public TransmissionSimulator(String name, Taxa taxa, Tree hostTree, DemographicModel demographic)
throws TaxonList.MissingTaxonException {
this.hostTree = hostTree;
setupHosts();
}
private void setupHosts() {
hostCount = hostTree.getTaxonCount();
intervals = new Intervals[hostCount];
for (int i = 0; i < hostCount; i++) {
// 3 times virusTree tip count will be enough events...
intervals[i] = new Intervals(virusTree.getExternalNodeCount() * 3);
}
donorHost = new int[hostCount];
donorHost[0] = -1;
transmissionTime = new double[hostCount];
transmissionTime[0] = Double.POSITIVE_INFINITY;
setupHosts(hostTree.getRoot());
}
private int setupHosts(NodeRef node) {
int host;
if (hostTree.isExternal(node)) {
host = node.getNumber();
} else {
// This traversal assumes that the first child is the donor
// and the second is the recipient
int host1 = setupHosts(hostTree.getChild(node, 0));
int host2 = setupHosts(hostTree.getChild(node, 1));
donorHost[host2] = host1;
transmissionTime[host2] = hostTree.getNodeHeight(node);
host = host1;
}
return host;
}
// ****************************************************************
// Private and protected stuff
// ****************************************************************
public static XMLObjectParser PARSER = new AbstractXMLObjectParser() {
public String getParserName() { return TRANSMISSION_SIMULATOR; }
public Object parseXMLObject(XMLObject xo) throws XMLParseException {
DemographicModel demoModel0 = (DemographicModel)xo.getElementFirstChild(SOURCE_PATIENT);
TransmissionDemographicModel demoModel1 = (TransmissionDemographicModel)xo.getChild(TransmissionDemographicModel.class);
Tree hostTree = (Tree)xo.getElementFirstChild("hostTree");
Tree virusTree = (Tree)xo.getElementFirstChild("parasiteTree");
TransmissionSimulator simulator = null;
// try {
// simulator = new TransmissionSimulator(hostTree, virusTree, demoModel0, demoModel1);
// } catch (TaxonList.MissingTaxonException e) {
// throw new XMLParseException(e.toString());
// }
return simulator;
}
//************************************************************************
// AbstractXMLObjectParser implementation
//************************************************************************
public String getParserDescription() {
return "This element represents a simulator for a transmission history.";
}
public Class getReturnType() { return TransmissionSimulator.class; }
public XMLSyntaxRule[] getSyntaxRules() { return rules; }
private XMLSyntaxRule[] rules = new XMLSyntaxRule[] {
new ElementRule(SOURCE_PATIENT, DemographicModel.class,
"This describes the demographic process for the source donor patient."),
new ElementRule(TransmissionDemographicModel.class,
"This describes the demographic process for the recipient patients."),
new ElementRule("hostTree",
new XMLSyntaxRule[] { new ElementRule(Tree.class) }),
new ElementRule("parasiteTree",
new XMLSyntaxRule[] { new ElementRule(Tree.class) })
};
};
/** The host tree. */
private Tree hostTree = null;
/** The viruses tree. */
private Tree virusTree = null;
/** The number of hosts. */
private int hostCount;
/** The intervals for each host. */
private Intervals[] intervals;
/** The donor host for each recipient host (-1 for initial host). */
private int[] donorHost;
/** The time of transmission into this host (POSITIVE_INFINITY for initial host). */
private double[] transmissionTime;
}