package dr.app.beauti.generator;
import dr.app.beauti.components.ComponentFactory;
import dr.app.beauti.options.BeautiOptions;
import dr.app.beauti.options.PartitionTreeModel;
import dr.app.beauti.util.XMLWriter;
import dr.evolution.util.Taxa;
import dr.evomodel.tree.TreeModel;
import dr.evomodelxml.speciation.SpeciesTreeModelParser;
import dr.evomodelxml.tree.MonophylyStatisticParser;
import dr.evomodelxml.tree.TMRCAStatisticParser;
import dr.evoxml.TaxaParser;
import dr.evoxml.TaxonParser;
import dr.util.Attribute;
import dr.xml.XMLParser;
import java.util.List;
import java.util.Map;
/**
* @author Alexei Drummond
* @author Andrew Rambaut
* @author Walter Xie
*/
public class TMRCAStatisticsGenerator extends Generator {
public TMRCAStatisticsGenerator(BeautiOptions options, ComponentFactory[] components) {
super(options, components);
}
/**
* Generate additional taxon sets
*
* @param writer the writer
* @param taxonSets a list of taxa to write
*/
public void writeTaxonSets(XMLWriter writer, List<Taxa> taxonSets) {
writer.writeText("");
for (Taxa taxa : taxonSets) {
writer.writeOpenTag(
TaxaParser.TAXA,
new Attribute[]{
new Attribute.Default<String>(XMLParser.ID, taxa.getId())
}
);
for (int j = 0; j < taxa.getTaxonCount(); j++) {
writer.writeIDref(TaxonParser.TAXON, taxa.getTaxon(j).getId());
}
writer.writeCloseTag(TaxaParser.TAXA);
}
}
/**
* Generate tmrca statistics
*
* @param writer the writer
*/
public void writeTMRCAStatistics(XMLWriter writer) {
List<Taxa> taxonSets;
Map<Taxa, Boolean> taxonSetsMono;
if (options.useStarBEAST) {
taxonSets = options.speciesSets;
taxonSetsMono = options.speciesSetsMono;
writer.writeComment("Species Sets");
writer.writeText("");
for (Taxa taxa : taxonSets) {
writer.writeOpenTag(TMRCAStatisticParser.TMRCA_STATISTIC,
new Attribute[]{
new Attribute.Default<String>(XMLParser.ID, "tmrca(" + taxa.getId() + ")"),
// new Attribute.Default<Boolean>(TMRCAStatisticParser.STEM, options.taxonSetsIncludeStem.get(taxa)),
}
); // make tmrca(tree.name) eay to read in log for Tracer
writer.writeOpenTag(TMRCAStatisticParser.MRCA);
writer.writeIDref(TaxaParser.TAXA, taxa.getId());
writer.writeCloseTag(TMRCAStatisticParser.MRCA);
writer.writeIDref(SpeciesTreeModelParser.SPECIES_TREE, SP_TREE);
writer.writeCloseTag(TMRCAStatisticParser.TMRCA_STATISTIC);
if (taxonSetsMono.get(taxa)) {
// && treeModel.getPartitionTreePrior().getNodeHeightPrior() != TreePriorType.YULE
// && options.getKeysFromValue(options.taxonSetsTreeModel, treeModel).size() > 1) {
writer.writeOpenTag(
MonophylyStatisticParser.MONOPHYLY_STATISTIC,
new Attribute[]{
new Attribute.Default<String>(XMLParser.ID, "monophyly(" + taxa.getId() + ")"),
});
writer.writeOpenTag(MonophylyStatisticParser.MRCA);
writer.writeIDref(TaxaParser.TAXA, taxa.getId());
writer.writeCloseTag(MonophylyStatisticParser.MRCA);
writer.writeIDref(SpeciesTreeModelParser.SPECIES_TREE, SP_TREE);
writer.writeCloseTag(MonophylyStatisticParser.MONOPHYLY_STATISTIC);
}
}
} else {
taxonSets = options.taxonSets;
taxonSetsMono = options.taxonSetsMono;
writer.writeComment("Taxon Sets");
writer.writeText("");
for (Taxa taxa : taxonSets) {
PartitionTreeModel treeModel = options.taxonSetsTreeModel.get(taxa);
writer.writeOpenTag(TMRCAStatisticParser.TMRCA_STATISTIC,
new Attribute[]{
new Attribute.Default<String>(XMLParser.ID, "tmrca(" + treeModel.getPrefix() + taxa.getId() + ")"),
new Attribute.Default<Boolean>(TMRCAStatisticParser.STEM, options.taxonSetsIncludeStem.get(taxa)),
}
); // make tmrca(tree.name) eay to read in log for Tracer
writer.writeOpenTag(TMRCAStatisticParser.MRCA);
writer.writeIDref(TaxaParser.TAXA, taxa.getId());
writer.writeCloseTag(TMRCAStatisticParser.MRCA);
writer.writeIDref(TreeModel.TREE_MODEL, treeModel.getPrefix() + TreeModel.TREE_MODEL);
writer.writeCloseTag(TMRCAStatisticParser.TMRCA_STATISTIC);
if (taxonSetsMono.get(taxa)) {
// && treeModel.getPartitionTreePrior().getNodeHeightPrior() != TreePriorType.YULE
// && options.getKeysFromValue(options.taxonSetsTreeModel, treeModel).size() > 1) {
writer.writeOpenTag(
MonophylyStatisticParser.MONOPHYLY_STATISTIC,
new Attribute[]{
new Attribute.Default<String>(XMLParser.ID, "monophyly(" + taxa.getId() + ")"),
});
writer.writeOpenTag(MonophylyStatisticParser.MRCA);
writer.writeIDref(TaxaParser.TAXA, taxa.getId());
writer.writeCloseTag(MonophylyStatisticParser.MRCA);
writer.writeIDref(TreeModel.TREE_MODEL, treeModel.getPrefix() + TreeModel.TREE_MODEL);
writer.writeCloseTag(MonophylyStatisticParser.MONOPHYLY_STATISTIC);
}
}
}
}
}