package dr.evomodel.speciation.ModelAveragingResearch; import dr.inference.trace.LogFileTraces; import dr.inference.trace.TraceException; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.io.Reader; import java.util.StringTokenizer; /** * @author Walter Xie */ public class MAIndexResearchLog extends LogFileTraces { private int[][] indexTranMatrix; // 3 => 6; 4 => 24 MAIndexResearch ma; public MAIndexResearchLog(String name, File file) { super(name, file); ma = new MAIndexResearch(); indexTranMatrix = new int[ma.index][ma.index]; try { FileReader reader = new FileReader(file); loadTraces(reader); reader.close(); } catch (Exception e) { e.printStackTrace(); } report(); } private void report() { System.out.println("\n-----------------------\n"); System.out.print(" =>"); for(int[] p : ma.indexPatterns) { System.out.printf("\t%10s", getPatterns(p)); } System.out.print("\n"); int i=0; for(int[] row : indexTranMatrix) { System.out.print(getPatterns(ma.indexPatterns.get(i))); i++; for(int col : row) { System.out.printf("\t%10d", col); } System.out.print("\n"); } } public void loadTraces(Reader r) throws TraceException, IOException { TrimLineReader reader = new LogFileTraces.TrimLineReader(r); // Read through to first token StringTokenizer tokens = reader.tokenizeLine(); if (tokens == null) { throw new TraceException("Trace file is empty."); } // read over empty lines while (!tokens.hasMoreTokens()) { tokens = reader.tokenizeLine(); } // skip the first column which should be the state number String token = tokens.nextToken(); // lines starting with [ are ignored, assuming comments in MrBayes file // lines starting with # are ignored, assuming comments in Migrate or BEAST file while (token.startsWith("[") || token.startsWith("#")) { tokens = reader.tokenizeLine(); // read over empty lines while (!tokens.hasMoreTokens()) { tokens = reader.tokenizeLine(); } // read state token and ignore token = tokens.nextToken(); } // read label tokens String[] labels = new String[tokens.countTokens()]; for (int i = 0; i < labels.length; i++) { labels[i] = tokens.nextToken(); } int[] indexLength = getIndexLength(labels); System.out.println("\n-----------------------\n"); System.out.println("indexLength = " + indexLength[0] + "; matrixLength = " + indexTranMatrix.length + "\n"); // int traceCount = getTraceCount(); boolean firstState = true; tokens = reader.tokenizeLine(); int[] prevValues = new int[0]; while (tokens != null && tokens.hasMoreTokens()) { String stateString = tokens.nextToken(); int state = 0; try { try { // Changed this to parseDouble because LAMARC uses scientific notation for the state number state = (int) Double.parseDouble(stateString); } catch (NumberFormatException nfe) { throw new TraceException("Unable to parse state number in column 1 (Line " + reader.getLineNumber() + ")"); } if (firstState) { // MrBayes puts 1 as the first state, BEAST puts 0 // In order to get the same gap between subsequent samples, // we force this to 0. if (state == 1) state = 0; firstState = false; } } catch (NumberFormatException nfe) { throw new TraceException("State " + state + ":Expected real value in column " + reader.getLineNumber()); } for (int i = 0; i < indexLength[1]; i++) { tokens.nextToken(); } int[] values = new int[indexLength[0]]; for (int i = 0; i < indexLength[0]; i++) { try { values[i] = (int) Double.parseDouble(tokens.nextToken()); } catch (NumberFormatException nfe) { throw new TraceException("State " + state + ": Expected correct number type (Double, Integer or String) in column " + (i + 1) + " (Line " + reader.getLineNumber() + ")"); } } if (state > 0) countTranMatrix(prevValues, values); prevValues = new int[indexLength[0]]; System.arraycopy(values, 0, prevValues, 0, values.length); tokens = reader.tokenizeLine(); } } private void countTranMatrix(int[] prevValues, int[] values) throws TraceException { int pre = -1; int cur = -1; for (int i = 0; i < ma.indexPatterns.size(); i++) { int[] p = ma.indexPatterns.get(i); if (p.length != prevValues.length) throw new TraceException("MAIndexResearch.indexLen != indexLength in log"); if (ma.isRepeated(p, prevValues)) pre = i; if (ma.isRepeated(p, values)) cur = i; } indexTranMatrix[pre][cur] += 1; } private int[] getIndexLength(String[] labels) { int[] len = new int[2]; for (int i = 0; i < labels.length; i++) { if (labels[i].startsWith("integer")) { if (len[0] == 0) len[1] = i; len[0] += 1; } } return len; } public String getPatterns(int[] patterns) { String p = ""; for (int pattern : patterns) { p += Integer.toString(pattern); } return p; } public static void main(String[] args) { File file = new File(".\\tanjaCLSTall.log"); MAIndexResearchLog mal = new MAIndexResearchLog("", file); } }