package dr.evoxml;
import dr.xml.*;
import dr.evolution.alignment.Patterns;
import dr.evolution.distance.DistanceMatrix;
import java.util.ArrayList;
/**
* @author Chieh-Hsi Wu
*
* Calculates overall mean pairwise distances across multiple loci
*
*/
public class MultiLociDistanceParser extends AbstractXMLObjectParser {
public static final String MULTI_LOCI_DISTANCE = "multiLociDistance";
public String getParserName() {
return MULTI_LOCI_DISTANCE;
}
public Object parseXMLObject(XMLObject xo) throws XMLParseException {
int childNum = xo.getChildCount();
ArrayList<DistanceMatrix> distMatList = new ArrayList<DistanceMatrix>();
for(int i = 0; i < childNum; i++){
distMatList.add((DistanceMatrix)xo.getChild(i));
}
double[] meanDists = new double[childNum];
for(int i = 0; i < childNum; i++){
meanDists[i] = distMatList.get(i).getMeanDistance();
}
double sum = 0.0;
for(int i = 0; i < childNum; i++){
sum = sum+meanDists[i];
}
double mean = sum/(double)childNum;
printMeans(distMatList,mean);
return mean;
}
public void printMeans(ArrayList<DistanceMatrix> distMat, double mean){
System.out.println("Individual mean distances:");
for(int i = 0; i < distMat.size(); i++){
System.out.print(distMat.get(i).getId()+": ");
System.out.println(distMat.get(i).getMeanDistance());
}
System.out.println("overallMean: "+mean);
}
public XMLSyntaxRule[] getSyntaxRules() {
return rules;
}
private final XMLSyntaxRule[] rules = {
new ElementRule(DistanceMatrix.class, 1, Integer.MAX_VALUE)
};
public String getParserDescription() {
return "Constructs a distance matrix from a pattern list or alignment";
}
public Class getReturnType() { return Double.class; }
}