/*
* OldTreeLogger.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 dr.evolution.colouring.TreeColouring;
import dr.evolution.tree.Tree;
import dr.evolution.tree.TreeUtils;
import dr.evomodel.branchratemodel.BranchRateModel;
import dr.evomodel.coalescent.structure.ColourSamplerModel;
import dr.inference.loggers.LogFormatter;
import dr.inference.loggers.MCLogger;
import dr.inference.model.Likelihood;
/**
* A logger that logs tree and clade frequencies.
*
* @author Andrew Rambaut
* @author Alexei Drummond
* @version $Id: OldTreeLogger.java,v 1.25 2006/09/05 13:29:34 rambaut Exp $
*/
public class OldTreeLogger extends MCLogger {
public static final String LOG_TREE = "logTree";
public static final String NEXUS_FORMAT = "nexusFormat";
public static final String USING_RATES = "usingRates";
public static final String BRANCH_LENGTHS = "branchLengths";
public static final String TIME = "time";
public static final String SUBSTITUTIONS = "substitutions";
// The following were in MCLogger; where did they go?
public static final String LOG = "log";
public static final String ECHO = "echo";
public static final String ECHO_EVERY = "echoEvery";
public static final String TITLE = "title";
public static final String FILE_NAME = "fileName";
public static final String FORMAT = "format";
public static final String TAB = "tab";
public static final String HTML = "html";
public static final String PRETTY = "pretty";
public static final String LOG_EVERY = "logEvery";
public static final String COLUMNS = "columns";
public static final String COLUMN = "column";
public static final String LABEL = "label";
public static final String SIGNIFICANT_FIGURES = "sf";
public static final String DECIMAL_PLACES = "dp";
public static final String WIDTH = "width";
private Tree tree;
private BranchRateModel branchRateModel = null;
private String rateLabel;
private ColourSamplerModel colourSamplerModel = null;
private String colouringLabel;
private Likelihood likelihood = null;
private String likelihoodLabel;
private boolean nexusFormat = false;
public boolean usingRates = false;
public boolean substitutions = false;
/**
* Constructor
*/
public OldTreeLogger(Tree tree, BranchRateModel branchRateModel, String rateLabel,
ColourSamplerModel colourSamplerModel, String colouringLabel,
Likelihood likelihood, String likelihoodLabel,
LogFormatter formatter, int logEvery, boolean nexusFormat, boolean substitutions) {
super(formatter, logEvery, false);
this.nexusFormat = nexusFormat;
this.branchRateModel = branchRateModel;
this.rateLabel = rateLabel;
this.colourSamplerModel = colourSamplerModel;
this.colouringLabel = colouringLabel;
this.likelihood = likelihood;
this.likelihoodLabel = likelihoodLabel;
if (branchRateModel != null) {
this.substitutions = substitutions;
}
this.tree = tree;
}
public void startLogging() {
if (nexusFormat) {
int taxonCount = tree.getTaxonCount();
logLine("#NEXUS");
logLine("");
logLine("Begin taxa;");
logLine("\tDimensions ntax=" + taxonCount + ";");
logLine("\tTaxlabels");
for (int i = 0; i < taxonCount; i++) {
logLine("\t\t" + tree.getTaxon(i).getId());
}
logLine("\t\t;");
logLine("End;");
logLine("");
logLine("Begin trees;");
if (!useTaxonLabels()) {
// This is needed if the trees use numerical taxon labels
logLine("\tTranslate");
for (int i = 0; i < taxonCount; i++) {
int k = i + 1;
if (k < taxonCount) {
logLine("\t\t" + k + " " + tree.getTaxonId(i) + ",");
} else {
logLine("\t\t" + k + " " + tree.getTaxonId(i));
}
}
logLine("\t\t;");
}
}
}
public void log(long state) {
if (logEvery <= 0 || ((state % logEvery) == 0)) {
StringBuffer buffer = new StringBuffer("tree STATE_");
buffer.append(state);
if (likelihood != null) {
buffer.append(" [&");
buffer.append(likelihoodLabel);
buffer.append("=");
buffer.append(likelihood.getLogLikelihood());
buffer.append("]");
}
buffer.append(additionalInfo());
buffer.append(" = [&R] ");
TreeColouring colouring = null;
if (colourSamplerModel != null) {
colouring = colourSamplerModel.getTreeColouring();
}
Tree printTree = getPrintTree();
if (substitutions) {
TreeUtils.newick(printTree, printTree.getRoot(), useTaxonLabels(), TreeUtils.BranchLengthType.LENGTHS_AS_SUBSTITUTIONS,
null, branchRateModel, null, null, buffer);
} else {
TreeUtils.newick(printTree, printTree.getRoot(), useTaxonLabels(), TreeUtils.BranchLengthType.LENGTHS_AS_TIME,
null, branchRateModel, null, null, buffer);
}
buffer.append(";");
logLine(buffer.toString());
}
}
protected String additionalInfo() {
return "";
}
protected Tree getPrintTree() {
return tree;
}
protected Tree getTree() {
return tree;
}
protected boolean useTaxonLabels() {
return false;
}
public void stopLogging() {
logLine("End;");
super.stopLogging();
}
}