package dr.evomodel.antigenic.phyloClustering.statistics; import dr.evolution.tree.NodeRef; import dr.evolution.tree.Tree; import dr.evolution.tree.TreeTrait; import dr.evolution.tree.TreeTraitProvider; import dr.evomodel.tree.TreeModel; import dr.inference.model.MatrixParameter; import dr.inference.model.Parameter; 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 AnnotateLocationParameterTreeTrait implements TreeTraitProvider { protected Helper treeTraits = new Helper(); private TreeModel treeModel; public static final String ANNOTATELOCATIONPARAMETERTREETRAIT = "AnnotateLocationParameterTreeTrait"; public final static String locationParameterStr = "virusLocationsTreeNodes"; //public final static String serumDriftStr = "serumDrift"; //but maybe serum drift is off public final static String indicatorsStr = "indicators"; public final static String hasDriftStr = "hasDrift"; public final static String MU1_SCALE_PARAMETER = "mu1Scale"; public final static String MU2_SCALE_PARAMETER = "mu2Scale"; public final static String MUMEAN_PARAMETER = "muMean"; private MatrixParameter locationParameter; private Parameter indicators; // private Parameter serumDrift; private Parameter mu1ScaleParameter; private Parameter mu2ScaleParameter; private Parameter muMeanParameter; private boolean hasDrift; // public AnnotateMuTreeTrait(TreeModel treeModel_in, MatrixParameter muTreeNode_in, Parameter indicators_in, Parameter serumDrift_in, boolean driftTreeClusterMu){ public AnnotateLocationParameterTreeTrait(TreeModel treeModel_in, MatrixParameter locationTreeNode_in, Parameter indicators_in, boolean driftTreeClusterMu, Parameter mu1Scale, Parameter mu2Scale, Parameter muMean) { this.treeModel = treeModel_in; this.locationParameter = locationTreeNode_in; this.indicators = indicators_in; //this.serumDrift = serumDrift_in; this.mu1ScaleParameter = mu1Scale; this.mu2ScaleParameter = mu2Scale; this.muMeanParameter = muMean; this.hasDrift = driftTreeClusterMu; treeTraits.addTrait(new TreeTrait.IA() { public String getTraitName() { //System.out.println("print label"); // return tag; return "antigenic"; } public String getTraitString(Tree tree, NodeRef node) { if(tree != treeModel){ System.out.println("Something is wrong. Why is tree not equal to treeModel?"); System.exit(0); } double firstCoord = locationParameter.getParameter(node.getNumber()).getParameterValue(0); double secondCoord = locationParameter.getParameter(node.getNumber()).getParameterValue(1); //if(hasDrift && serumDrift != null ){ // //multiply the first coordinate by the drift term // firstCoord = firstCoord * serumDrift.getParameterValue(0); //} if(hasDrift && mu1ScaleParameter != null && muMeanParameter != null ){ //multiply the first coordinate by the drift term firstCoord = firstCoord * mu1ScaleParameter.getParameterValue(0); } if(hasDrift && mu2ScaleParameter != null ){ //multiply the first coordinate by the drift term secondCoord = secondCoord * mu2ScaleParameter.getParameterValue(0); } String outputStr = "{"+ firstCoord + "," + secondCoord +"}"; return outputStr; } public Intent getIntent() { //System.out.println("getIntent"); return Intent.NODE; } public Class getTraitClass() { System.out.println("getTraitClass ran. Not expected. Quit now"); System.exit(0); return int[].class; } public int[] getTrait(Tree tree, NodeRef node) { // return getStatesForNode(tree, node); System.out.println("getTrait ran. Not expected. Quit now"); System.exit(0); //int x[] = new int[10]; return null; } }); } public TreeTrait[] getTreeTraits() { //System.out.println("hihi"); return treeTraits.getTreeTraits(); } public TreeTrait getTreeTrait(String key) { System.out.println("not expected to run getTreeTrait. Quit now"); System.exit(0); return treeTraits.getTreeTrait(key); } public static XMLObjectParser PARSER = new AbstractXMLObjectParser() { public String getParserName() { return ANNOTATELOCATIONPARAMETERTREETRAIT; } public Object parseXMLObject(XMLObject xo) throws XMLParseException { TreeModel treeModel = (TreeModel) xo.getChild(TreeModel.class); XMLObject cxo = xo.getChild(locationParameterStr); MatrixParameter locationParameter = (MatrixParameter) cxo.getChild(MatrixParameter.class); cxo = xo.getChild(indicatorsStr); Parameter indicators = (Parameter) cxo.getChild(Parameter.class); // cxo = xo.getChild(serumDriftStr); // Parameter serumDrift = (Parameter) cxo.getChild(Parameter.class); boolean hasDrift = xo.getAttribute(hasDriftStr, false); Parameter mu1Scale = null; if (xo.hasChildNamed(MU1_SCALE_PARAMETER)) { mu1Scale = (Parameter) xo.getElementFirstChild(MU1_SCALE_PARAMETER); } Parameter mu2Scale = null; if (xo.hasChildNamed(MU2_SCALE_PARAMETER)) { mu2Scale = (Parameter) xo.getElementFirstChild(MU2_SCALE_PARAMETER); } Parameter muMean = null; if(xo.hasChildNamed(MUMEAN_PARAMETER)){ muMean = (Parameter) xo.getElementFirstChild(MUMEAN_PARAMETER); } // return new AnnotateMuTreeTrait( treeModel, clusterLabelsTreeNode, indicators, serumDrift,driftTreeClusterMu); return new AnnotateLocationParameterTreeTrait( treeModel, locationParameter, indicators, hasDrift, mu1Scale, mu2Scale, muMean); } //************************************************************************ // AbstractXMLObjectParser implementation //************************************************************************ public String getParserDescription() { return "Integrate mu coordinates into the tree."; } public Class getReturnType() { return AnnotateLocationParameterTreeTrait.class; } public XMLSyntaxRule[] getSyntaxRules() { return rules; } private XMLSyntaxRule[] rules = new XMLSyntaxRule[]{ new ElementRule(TreeModel.class), new ElementRule(locationParameterStr, MatrixParameter.class), new ElementRule(indicatorsStr,Parameter.class), // new ElementRule(serumDriftStr, Parameter.class), new ElementRule(MU1_SCALE_PARAMETER, Parameter.class, "Optional parameter for scaling the first dimension of mu"), new ElementRule(MU2_SCALE_PARAMETER, Parameter.class, "Optional parameter for scaling the second dimension of mu"), new ElementRule(MUMEAN_PARAMETER, Parameter.class), AttributeRule.newBooleanRule(hasDriftStr, true, "whether to multiple the mu by the drift term"), }; }; }