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.inference.operators.OperatorFailedException; 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; } }; }