package test.beast.app.tools;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;
import org.junit.Test;
import beast.app.beauti.BeautiDoc;
import beast.app.tools.LogCombiner;
import beast.evolution.tree.Tree;
import beast.util.LogAnalyser;
import beast.util.NexusParser;
import beast.util.Randomizer;
import junit.framework.TestCase;
public class LogCombinerTest extends TestCase {
static void creatLogFiles(int filesCount, int sampleInterval, int sampleCount) {
for (int i = 0; i < filesCount; i++) {
StringBuilder b = new StringBuilder();
b.append("Sample\tRandom\n");
for (int j = 0; j < sampleCount; j++) {
b.append(j * sampleInterval);
b.append('\t');
b.append(Randomizer.nextDouble());
b.append('\n');
}
try {
FileWriter outfile = new FileWriter(new File("tmp_in" + i + ".log"));
outfile.write(b.toString());
outfile.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Test
public void testLogCombiner() throws IOException {
creatLogFiles(3, 1000, 101);
LogAnalyser analyser = new LogAnalyser("tmp_in0.log", 0);
assertEquals(101, analyser.getTrace(0).length);
// combine 3 log files (default burn in 10%)
LogCombiner.main(new String[] { "-log", "tmp_in0.log", "tmp_in1.log", "tmp_in2.log", "-o", "tmp_out.log" });
analyser = new LogAnalyser("tmp_out.log", 0);
Double[] trace = analyser.getTrace(0);
// ensure length of combined trace = 300 - 10% burn in
assertEquals(273, trace.length);
// ensure last sample nr = 272 x 1000 = 26900
assertEquals(272000, trace[trace.length - 1], 1e-10);
// combine 3 log files with burnin 0
LogCombiner.main(new String[] { "-log", "tmp_in0.log", "tmp_in1.log", "tmp_in2.log", "-o", "tmp_out.log",
"-burnin", "0" });
analyser = new LogAnalyser("tmp_out.log", 0);
assertEquals(303, analyser.getTrace(0).length);
// test resampling single file
LogCombiner.main(
new String[] { "-log", "tmp_in0.log", "-o", "tmp_out.log", "-burnin", "0", "-resample", "10000" });
analyser = new LogAnalyser("tmp_out.log", 0);
trace = analyser.getTrace(0);
// ensure length of combined trace = 10 burn in
assertEquals(11, trace.length);
// ensure last sample nr = 100000
assertEquals(100000, trace[trace.length - 1], 1e-10);
// test resampling three files
LogCombiner.main(new String[] { "-log", "tmp_in0.log", "tmp_in1.log", "tmp_in2.log", "-o", "tmp_out.log",
"-burnin", "0", "-resample", "10000" });
analyser = new LogAnalyser("tmp_out.log", 0);
trace = analyser.getTrace(0);
// ensure length of combined trace = 10 burn in
assertEquals(33, trace.length);
// ensure last sample nr = 100000
assertEquals(320000, trace[trace.length - 1], 1e-10);
// new File("tmp_out.log").delete();
// test renumbering single file
LogCombiner.main(new String[] { "-log", "tmp_in0.log", "-o", "tmp_out.log", "-burnin", "0", "-renumber" });
analyser = new LogAnalyser("tmp_out.log", 0);
trace = analyser.getTrace(0);
// ensure length of combined trace = 300 - 10% burn in
assertEquals(101, trace.length);
// ensure last sample nr = 101
assertEquals(100, trace[trace.length - 1], 1e-10);
// test renumbering 3 log files
LogCombiner.main(new String[] { "-log", "tmp_in0.log", "tmp_in1.log", "tmp_in2.log", "-o", "tmp_out.log",
"-burnin", "0", "-renumber" });
analyser = new LogAnalyser("tmp_out.log", 0);
trace = analyser.getTrace(0);
// ensure length of combined trace = 303
assertEquals(303, trace.length);
// ensure last sample nr = 303
assertEquals(302, trace[trace.length - 1], 1e-10);
}
static void creatTreeLogFiles(int filesCount, int sampleInterval, int sampleCount) {
for (int i = 0; i < filesCount; i++) {
StringBuilder b = new StringBuilder();
b.append("#NEXUS\n\n");
b.append("Begin taxa;\n");
b.append("Dimensions ntax=2;\n");
b.append(" Taxlabels\n");
b.append(" bonobo \n");
b.append(" siamang \n");
b.append(";\n");
b.append("End;\n");
b.append("Begin trees;\n");
b.append(" Translate\n");
b.append(" 1 bonobo,\n");
b.append(" 2 siamang\n");
b.append(";\n");
for (int j = 0; j < sampleCount; j++) {
b.append("tree STATE_" + j * sampleInterval + " = ");
double h = Randomizer.nextDouble();
b.append("(1:" + h + ",2:" + h +"):0.0;\n");
}
b.append("End;\n");
try {
FileWriter outfile = new FileWriter(new File("tmp_in" + i + ".trees"));
outfile.write(b.toString());
outfile.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Test
public void testTreeLogCombiner() throws IOException {
creatTreeLogFiles(3, 1000, 101);
assertEquals(101, treeCount("tmp_in0.trees"));
assertEquals(100000, lastTreeStateNr("tmp_in0.trees"));
// combine 3 log files (default burn in 10%)
LogCombiner.main(new String[] { "-log", "tmp_in0.trees", "tmp_in1.trees", "tmp_in2.trees", "-o", "tmp_out.trees" });
// ensure length of combined trace = 300 - 10% burn in
assertEquals(273, treeCount("tmp_out.trees"));
// ensure last sample nr = 272 x 1000 = 26900
assertEquals(272000, lastTreeStateNr("tmp_out.trees"));
// combine 3 log files with burnin 0
LogCombiner.main(new String[] { "-log", "tmp_in0.trees", "tmp_in1.trees", "tmp_in2.trees", "-o", "tmp_out.trees",
"-burnin", "0" });
assertEquals(303, treeCount("tmp_out.trees"));
// test resampling single file
LogCombiner.main(
new String[] { "-log", "tmp_in0.trees", "-o", "tmp_out.trees", "-burnin", "0", "-resample", "10000" });
assertEquals(11, treeCount("tmp_out.trees"));
// ensure last sample nr = 100000
assertEquals(100000, lastTreeStateNr("tmp_out.trees"));
// test resampling three files
LogCombiner.main(new String[] { "-log", "tmp_in0.trees", "tmp_in1.trees", "tmp_in2.trees", "-o", "tmp_out.trees",
"-burnin", "0", "-resample", "10000" });
assertEquals(33, treeCount("tmp_out.trees"));
// ensure last sample nr = 100000
assertEquals(320000, lastTreeStateNr("tmp_out.trees"));
// new File("tmp_out.trees").delete();
// test renumbering single file
LogCombiner.main(new String[] { "-log", "tmp_in0.trees", "-o", "tmp_out.trees", "-burnin", "0", "-renumber" });
assertEquals(101, treeCount("tmp_out.trees"));
// ensure last sample nr = 101
assertEquals(100, lastTreeStateNr("tmp_out.trees"));
// test renumbering 3 log files
LogCombiner.main(new String[] { "-log", "tmp_in0.trees", "tmp_in1.trees", "tmp_in2.trees", "-o", "tmp_out.trees",
"-burnin", "0", "-renumber" });
assertEquals(303, treeCount("tmp_out.trees"));
// ensure last sample nr = 303
assertEquals(302, lastTreeStateNr("tmp_out.trees"));
}
private int treeCount(String file) throws IOException {
NexusParser analyser = new NexusParser();
analyser.parseFile(new File(file));
return analyser.trees.size();
}
private long lastTreeStateNr(String file) throws IOException {
String str = BeautiDoc.load(file);
String [] strs = str.split("\n");
str = strs[strs.length - 2];
String str2 = str.substring(11, str.indexOf("=")).trim();
str2 = str2.split("\\s")[0];
long logState = Long.parseLong(str2);
return logState;
}
}