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.Parameter;
import dr.xml.AbstractXMLObjectParser;
import dr.xml.ElementRule;
import dr.xml.XMLObject;
import dr.xml.XMLObjectParser;
import dr.xml.XMLParseException;
import dr.xml.XMLSyntaxRule;
public class ClusterLabelsVirusesTreeTrait implements TreeTraitProvider {
protected Helper treeTraits = new Helper();
private TreeModel treeModel;
public static final String CLUSTERLABELSTREETRAIT = "ClusterLabelsVirusesTreeTrait";
public final static String CLUSTERLABELSTREENODE = "clusterLabelsTreeNodes";
private Parameter clusterLabelsTreeNode;
public ClusterLabelsVirusesTreeTrait(TreeModel treeModel_in, Parameter clusterLabelsTreeNode_in){
this.treeModel = treeModel_in;
this.clusterLabelsTreeNode = clusterLabelsTreeNode_in;
treeTraits.addTrait(new TreeTrait.IA() {
public String getTraitName() {
//System.out.println("print label");
// return tag;
return "cluster";
}
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);
}
//the problem is, I don't know how to only do the processing to get the clusterLabels
//right before this routine is run...
//so I have to keep a parameter or variable somewhere to store the clusterLabels information of the tree nodes
//whenever the cluster assignment is changed..
//the states have to be precomputed so this only prints..
//System.out.println("node=" + node.getNumber());
String clusterLabelString = ((int) clusterLabelsTreeNode.getParameterValue(node.getNumber()) ) + "";
//String clusterLabelString = node.getNumber() + ""; //to get the node numbering of the tree.
//if(node.getNumber() ==0){
// //System.out.println("print ");
// for(int i=0; i < treeModel.getNodeCount(); i++){
// System.out.print( clusterLabelsTreeNode.getParameterValue(i) + "\t");
// }
// System.out.println("");
//}
//return formattedState(getStatesForNode(tree, node), dataType);
return clusterLabelString;
}
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 CLUSTERLABELSTREETRAIT;
}
public Object parseXMLObject(XMLObject xo) throws XMLParseException {
TreeModel treeModel = (TreeModel) xo.getChild(TreeModel.class);
XMLObject cxo = xo.getChild(CLUSTERLABELSTREENODE);
Parameter clusterLabelsTreeNode = (Parameter) cxo.getChild(Parameter.class);
return new ClusterLabelsVirusesTreeTrait( treeModel, clusterLabelsTreeNode);
}
//************************************************************************
// AbstractXMLObjectParser implementation
//************************************************************************
public String getParserDescription() {
return "Integrate ClusterLabels of viruses into the tree.";
}
public Class getReturnType() {
return ClusterLabelsVirusesTreeTrait.class;
}
public XMLSyntaxRule[] getSyntaxRules() {
return rules;
}
private XMLSyntaxRule[] rules = new XMLSyntaxRule[]{
new ElementRule(TreeModel.class),
new ElementRule(CLUSTERLABELSTREENODE, Parameter.class),
};
};
}