/*
* ARGReassortmentTimingStatistic.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.arg;
import java.util.ArrayList;
import java.util.Collections;
import java.util.logging.Logger;
import dr.evomodel.arg.ARGModel.Node;
import dr.evomodel.arg.operators.ARGPartitioningOperator.PartitionChangedEvent;
import dr.inference.model.Parameter;
import dr.inference.model.Statistic;
import dr.math.MathUtils;
import dr.xml.AbstractXMLObjectParser;
import dr.xml.AttributeRule;
import dr.xml.ElementRule;
import dr.xml.XMLObject;
import dr.xml.XMLObjectParser;
import dr.xml.XMLParseException;
import dr.xml.XMLSyntaxRule;
public class ARGReassortmentTimingStatistic extends Statistic.Abstract{
private int dimension;
private ARGModel arg;
public static final String ARG_TIMING_STATISTIC = "argTimingStatistic";
public static final String NUMBER_OF_REASSORTMENTS = "reassortments"; //TODO This is probably somewhere else in BEAST.
public ARGReassortmentTimingStatistic(String name, ARGModel arg){
super(name);
this.dimension = arg.getExternalNodeCount() + 1;
this.arg = arg;
}
public int getDimension() {
return dimension;
}
public String getDimensionName(int dim){
if(dim == 0){
return "Root";
}else if(dim == 1){
return "RootChild";
}else if(dim == 2){
return "ENParent";
}else if(dim == 3){
return "DNParent";
}else if(dim == 4){
return "DCParent";
}else if(dim == 5){
return "CCParent";
}else if(dim == 6){
return "FNParent";
}else if(dim == 7){
return "ReassortHeight";
}else if(dim == 8){
return "CNParent";
}else if(dim == 9){
return "CCParentParent";
}
return "";
}
public double getStatisticValue(int dim) {
String max = "((((((<(FC,FN)>,CN),CC),<(FC,FN)>),DC),((EC,EN),DN)),AN);";
if(!arg.toExtendedNewick().equals(max)){
return Double.NaN;
}
if(dim == 0){
return arg.getRootHeightParameter().getParameterValue(0);
}else if(dim == 1){
Node a = (Node)arg.getRoot();
Node aLeft = a.leftChild;
Node aRight = a.rightChild;
return Math.max(aLeft.heightParameter.getParameterValue(0), aRight.heightParameter.getParameterValue(0));
}else if(dim == 2){
int value = 0;
Node a = (Node)arg.getExternalNode(0);
while(!a.taxon.toString().equals("EN")){
value++;
a = (Node)arg.getExternalNode(value);
}
return a.leftParent.heightParameter.getParameterValue(0);
}else if(dim == 3){
int value = 0;
Node a = (Node)arg.getExternalNode(0);
while(!a.taxon.toString().equals("DN")){
value++;
a = (Node)arg.getExternalNode(value);
}
return a.leftParent.heightParameter.getParameterValue(0);
}else if(dim == 4){
int value = 0;
Node a = (Node)arg.getExternalNode(0);
while(!a.taxon.toString().equals("DC")){
value++;
a = (Node)arg.getExternalNode(value);
}
return a.leftParent.heightParameter.getParameterValue(0);
}else if(dim == 5){
int value = 0;
Node a = (Node)arg.getExternalNode(0);
while(!a.taxon.toString().equals("CC")){
value++;
a = (Node)arg.getExternalNode(value);
}
return a.leftParent.heightParameter.getParameterValue(0);
}else if(dim == 6){
int value = 0;
Node a = (Node)arg.getExternalNode(0);
while(!a.taxon.toString().equals("FN")){
value++;
a = (Node)arg.getExternalNode(value);
}
return a.leftParent.heightParameter.getParameterValue(0);
}else if(dim == 7){
int value = 0;
Node a = (Node)arg.getExternalNode(0);
while(!a.taxon.toString().equals("FN")){
value++;
a = (Node)arg.getExternalNode(value);
}
return a.leftParent.leftParent.heightParameter.getParameterValue(0);
}else if(dim == 8){
int value = 0;
Node a = (Node)arg.getExternalNode(0);
while(!a.taxon.toString().equals("CN")){
value++;
a = (Node)arg.getExternalNode(value);
}
return a.leftParent.heightParameter.getParameterValue(0);
}
int value = 0;
Node a = (Node)arg.getExternalNode(0);
while(!a.taxon.toString().equals("CC")){
value++;
a = (Node)arg.getExternalNode(value);
}
return a.leftParent.leftParent.heightParameter.getParameterValue(0);
}
public static XMLObjectParser PARSER = new AbstractXMLObjectParser(){
public String getParserDescription() {
return "";
}
public Class getReturnType() {
return ARGReassortmentTimingStatistic.class;
}
public XMLSyntaxRule[] getSyntaxRules() {
return new XMLSyntaxRule[]{
new ElementRule(ARGModel.class,false),
AttributeRule.newStringRule(NAME,true),
};
}
public Object parseXMLObject(XMLObject xo) throws XMLParseException {
String name = xo.getId();
// int dim = xo.getIntegerAttribute(DIMENSION);
ARGModel arg = (ARGModel)xo.getChild(ARGModel.class);
Logger.getLogger("dr.evomodel").info("Creating timing statistic");
return new ARGReassortmentTimingStatistic(name,arg);
}
public String getParserName() {
return ARG_TIMING_STATISTIC;
}
};
}