Added:
/trunk/src/dr/evomodel/antigenic/AntigenicDistancePrior.java
Modified:
/trunk/src/dr/app/beast/development_parsers.properties
/trunk/src/dr/evomodel/antigenic/AntigenicLikelihood.java
/trunk/src/dr/inference/model/Parameter.java
=======================================
--- /dev/null
+++ /trunk/src/dr/evomodel/antigenic/AntigenicDistancePrior.java Fri Mar 9
03:30:01 2012
@@ -0,0 +1,193 @@
+package dr.evomodel.antigenic;
+
+import dr.evolution.util.Taxa;
+import dr.evolution.util.Taxon;
+import dr.evolution.util.TaxonList;
+import dr.inference.model.*;
+import dr.math.MathUtils;
+import dr.math.distributions.NormalDistribution;
+import dr.util.Author;
+import dr.util.Citable;
+import dr.util.Citation;
+import dr.util.DataTable;
+import dr.xml.*;
+
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Logger;
+
+/**
+ * @author Andrew Rambaut
+ * @author Trevor Bedford
+ * @author Marc Suchard
+ * @version $Id$
+ */
+public class AntigenicDistancePrior extends AbstractModelLikelihood
implements Citable {
+
+ public final static String ANTIGENIC_DISTANCE_PRIOR
= "antigenicDistancePrior";
+
+ public AntigenicDistancePrior(
+ MatrixParameter locationsParameter,
+ Parameter datesParameter
+ ) {
+
+ super(ANTIGENIC_DISTANCE_PRIOR);
+
+ this.locationsParameter = locationsParameter;
+ addVariable(this.locationsParameter);
+
+ this.datesParameter = datesParameter;
+ addVariable(this.datesParameter);
+
+ dimension = locationsParameter.getColumnDimension();
+
+ likelihoodKnown = false;
+ }
+
+
+ @Override
+ protected void handleModelChangedEvent(Model model, Object object, int
index) {
+ }
+
+ @Override
+ protected void handleVariableChangedEvent(Variable variable, int
index, Variable.ChangeType type) {
+ if (variable == locationsParameter) {
+ likelihoodKnown = false;
+ } else if (variable == datesParameter) {
+ likelihoodKnown = false;
+ }
+ }
+
+ @Override
+ protected void storeState() {
+ }
+
+ @Override
+ protected void restoreState() {
+ likelihoodKnown = false;
+ }
+
+ @Override
+ protected void acceptState() {
+ }
+
+ @Override
+ public Model getModel() {
+ return this;
+ }
+
+ @Override
+ public double getLogLikelihood() {
+ if (!likelihoodKnown) {
+ logLikelihood = computeLogLikelihood();
+ }
+
+ return logLikelihood;
+ }
+
+ private double computeLogLikelihood() {
+
+ logLikelihood = 0.0;
+
+ likelihoodKnown = true;
+
+ return logLikelihood;
+ }
+
+ protected double computeDistance(int rowStrain, int columnStrain) {
+ if (rowStrain == columnStrain) {
+ return 0.0;
+ }
+
+ Parameter X = locationsParameter.getParameter(rowStrain);
+ Parameter Y = locationsParameter.getParameter(columnStrain);
+ double sum = 0.0;
+ for (int i = 0; i < dimension; i++) {
+ double difference = X.getParameterValue(i) -
Y.getParameterValue(i);
+ sum += difference * difference;
+ }
+ return Math.sqrt(sum);
+ }
+
+ @Override
+ public void makeDirty() {
+ likelihoodKnown = false;
+ }
+
+ private final int dimension;
+ private final Parameter datesParameter;
+ private final MatrixParameter locationsParameter;
+
+ private double logLikelihood = 0.0;
+ private boolean likelihoodKnown = false;
+
+ // **************************************************************
+ // XMLObjectParser
+ // **************************************************************
+
+ public static XMLObjectParser PARSER = new AbstractXMLObjectParser() {
+ public final static String LOCATIONS = "locations";
+ public final static String DATES = "dates";
+
+ public String getParserName() {
+ return ANTIGENIC_DISTANCE_PRIOR;
+ }
+
+ public Object parseXMLObject(XMLObject xo) throws
XMLParseException {
+
+ MatrixParameter locationsParameter = (MatrixParameter)
xo.getElementFirstChild(LOCATIONS);
+
+ Parameter datesParameter = (Parameter)
xo.getElementFirstChild(DATES);
+
+ AntigenicDistancePrior AGDP = new AntigenicDistancePrior(
+ locationsParameter,
+ datesParameter);
+
+// Logger.getLogger("dr.evomodel").info("Using
EvolutionaryCartography model. Please cite:\n" +
Utils.getCitationString(AGL));
+
+ return AGDP;
+ }
+
+
//************************************************************************
+ // AbstractXMLObjectParser implementation
+
//************************************************************************
+
+ public String getParserDescription() {
+ return "Provides the likelihood of a vector of coordinates in
some multidimensional 'antigenic' space based on an expected relationship
with time.";
+ }
+
+ public XMLSyntaxRule[] getSyntaxRules() {
+ return rules;
+ }
+
+ private final XMLSyntaxRule[] rules = {
+ new ElementRule(LOCATIONS, MatrixParameter.class),
+ new ElementRule(DATES, Parameter.class),
+ };
+
+ public Class getReturnType() {
+ return ContinuousAntigenicTraitLikelihood.class;
+ }
+ };
+
+ public List<Citation> getCitations() {
+ List<Citation> citations = new ArrayList<Citation>();
+ citations.add(new Citation(
+ new Author[]{
+ new Author("T", "Bedford"),
+ new Author("MA", "Suchard"),
+ new Author("P", "Lemey"),
+ new Author("G", "Dudas"),
+ new Author("C", "Russell"),
+ new Author("D", "Smith"),
+ new Author("A", "Rambaut")
+ },
+ Citation.Status.IN_PREPARATION
+ ));
+ return citations;
+ }
+}
=======================================
--- /trunk/src/dr/app/beast/development_parsers.properties Wed Mar 7
08:38:00 2012
+++ /trunk/src/dr/app/beast/development_parsers.properties Fri Mar 9
03:30:01 2012
@@ -84,6 +84,7 @@
# ANTIGENIC EVOLUTION/EVOLUTIONARY CARTOGRAPHY
dr.evomodel.antigenic.AntigenicLikelihood
+dr.evomodel.antigenic.AntigenicDistancePrior
dr.evomodel.antigenic.MultidimensionalScalingLikelihood
dr.evomodel.antigenic.ContinuousAntigenicTraitLikelihood
dr.evomodel.antigenic.DiscreteAntigenicTraitLikelihood
=======================================
--- /trunk/src/dr/evomodel/antigenic/AntigenicLikelihood.java Thu Mar 8
09:08:52 2012
+++ /trunk/src/dr/evomodel/antigenic/AntigenicLikelihood.java Fri Mar 9
03:30:01 2012
@@ -13,6 +13,8 @@
/**
* @author Andrew Rambaut
+ * @author Trevor Bedford
+ * @author Marc Suchard
* @version $Id$
*/
public class AntigenicLikelihood extends AbstractModelLikelihood
implements Citable {
@@ -43,6 +45,7 @@
Parameter mdsPrecisionParameter,
TaxonList strainTaxa,
MatrixParameter locationsParameter,
+ Parameter datesParameter,
Parameter columnEffectsParameter,
Parameter rowEffectsParameter,
DataTable<String[]> dataTable,
@@ -68,6 +71,10 @@
columnStrain = strainNames.indexOf(values[SERUM_STRAIN]);
if (columnStrain == -1) {
strainNames.add(values[SERUM_STRAIN]);
+
+ Double date = Double.parseDouble(values[VIRUS_DATE]);
+ strainDateMap.put(values[VIRUS_STRAIN], date);
+
columnStrain = strainNames.size() - 1;
}
}
@@ -89,6 +96,10 @@
rowStrain = strainNames.indexOf(values[VIRUS_STRAIN]);
if (rowStrain == -1) {
strainNames.add(values[VIRUS_STRAIN]);
+
+ Double date = Double.parseDouble(values[VIRUS_DATE]);
+ strainDateMap.put(values[VIRUS_STRAIN], date);
+
rowStrain = strainNames.size() - 1;
}
}
@@ -96,7 +107,6 @@
throw new IllegalArgumentException("Error reading data
table: Unrecognized virus strain name, " + values[VIRUS_STRAIN] + ", in
row " + (i+1));
}
- // ignoring strain dates for the moment
double minTitre = Double.NaN;
if (values[MIN_TITRE].length() > 0) {
@@ -136,6 +146,12 @@
if (strainTaxa != null) {
this.strains = strainTaxa;
+
+ // fill in the strain name array for local use
+ for (int i = 0; i < strains.getTaxonCount(); i++) {
+ strainNames.add(strains.getTaxon(i).getId());
+ }
+
} else {
Taxa taxa = new Taxa();
for (String strain : strainNames) {
@@ -149,19 +165,33 @@
addVariable(mdsPrecisionParameter);
this.locationsParameter = locationsParameter;
- setupLocationsParameter(this.locationsParameter, strains);
+ setupLocationsParameter(this.locationsParameter, strainNames);
addVariable(this.locationsParameter);
+ if (datesParameter != null) {
+ // this parameter is not used in this class but is setup to be
used in other classes
+ datesParameter.setDimension(strainNames.size());
+
((Parameter.Abstract)datesParameter).setDimensionNames((String[])strainNames.toArray());
+ for (int i = 0; i < strainNames.size(); i++) {
+ double date = strainDateMap.get(strainNames.get(i));
+ datesParameter.setParameterValue(i, date);
+ }
+ }
+
this.columnEffectsParameter = columnEffectsParameter;
if (columnEffectsParameter != null) {
columnEffectsParameter.setDimension(columnLabels.size());
addVariable(columnEffectsParameter);
+ String[] labelArray = (String[])columnLabels.toArray();
+
((Parameter.Abstract)columnEffectsParameter).setDimensionNames(labelArray);
}
this.rowEffectsParameter = rowEffectsParameter;
if (rowEffectsParameter != null) {
rowEffectsParameter.setDimension(rowLabels.size());
addVariable(rowEffectsParameter);
+ String[] labelArray = (String[])rowLabels.toArray();
+
((Parameter.Abstract)rowEffectsParameter).setDimensionNames(labelArray);
}
StringBuilder sb = new StringBuilder();
@@ -190,11 +220,11 @@
likelihoodKnown = false;
}
- protected void setupLocationsParameter(MatrixParameter
locationsParameter, TaxonList strains) {
+ protected void setupLocationsParameter(MatrixParameter
locationsParameter, List<String> strains) {
locationsParameter.setColumnDimension(mdsDimension);
- locationsParameter.setRowDimension(strains.getTaxonCount());
- for (int i = 0; i < strains.getTaxonCount(); i++) {
-
locationsParameter.getParameter(i).setId(strains.getTaxon(i).getId());
+ locationsParameter.setRowDimension(strains.size());
+ for (int i = 0; i < strains.size(); i++) {
+ locationsParameter.getParameter(i).setId(strains.get(i));
}
}
@@ -218,7 +248,7 @@
@Override
protected void storeState() {
- }
+ }
@Override
protected void restoreState() {
@@ -227,7 +257,7 @@
@Override
protected void acceptState() {
- }
+ }
@Override
public Model getModel() {
@@ -416,6 +446,7 @@
public final static String TIP_TRAIT = "tipTrait";
public final static String LOCATIONS = "locations";
+ public final static String DATES = "dates";
public static final String MDS_DIMENSION = "mdsDimension";
public static final String MDS_PRECISION = "mdsPrecision";
public static final String COLUMN_EFFECTS = "columnEffects";
@@ -451,6 +482,8 @@
MatrixParameter locationsParameter = (MatrixParameter)
xo.getElementFirstChild(LOCATIONS);
+ Parameter datesParameter = (Parameter)
xo.getElementFirstChild(DATES);
+
Parameter mdsPrecision = (Parameter)
xo.getElementFirstChild(MDS_PRECISION);
Parameter columnEffectsParameter = (Parameter)
xo.getElementFirstChild(COLUMN_EFFECTS);
@@ -462,6 +495,7 @@
mdsPrecision,
strains,
locationsParameter,
+ datesParameter,
columnEffectsParameter,
rowEffectsParameter,
assayTable,
@@ -491,6 +525,7 @@
new ElementRule(STRAINS, TaxonList.class, "A taxon list of
strains", true),
// new ElementRule(TIP_TRAIT, CompoundParameter.class, "The
parameter of tip locations from the tree", true),
new ElementRule(LOCATIONS, MatrixParameter.class),
+ new ElementRule(DATES, Parameter.class, "An optional
parameter for strain dates to be stored", true),
new ElementRule(COLUMN_EFFECTS, Parameter.class),
new ElementRule(ROW_EFFECTS, Parameter.class),
new ElementRule(MDS_PRECISION, Parameter.class)
=======================================
--- /trunk/src/dr/inference/model/Parameter.java Mon Nov 29 13:13:42 2010
+++ /trunk/src/dr/inference/model/Parameter.java Fri Mar 9 03:30:01 2012
@@ -240,6 +240,21 @@
public final double getStatisticValue(int dim) {
return getParameterValue(dim);
}
+
+ @Override
+ public String getDimensionName(int dim) {
+ if (dimensionNames == null) {
+ return super.getDimensionName(dim);
+ }
+ return dimensionNames[dim];
+ }
+
+ public final void setDimensionNames(String[] names) {
+ if (names != null && names.length != getDimension()) {
+ throw new IllegalArgumentException("Length of dimension
name array doesn't match the number of dimensions");
+ }
+ dimensionNames = names;
+ }
public void setDimension(int dim) {
throw new UnsupportedOperationException();
@@ -421,6 +436,8 @@
private boolean isValid = true;
private ArrayList<VariableListener> listeners;
+
+ private String[] dimensionNames = null;
}
@@ -560,7 +577,7 @@
public void setDimension(int dim) {
final int oldDim = getDimension();
if( oldDim == dim ) {
- return;
+ return;
}
assert storedValues == null :