/* * DebugTreeImporter.java * * Copyright (c) 2002-2017 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.app.checkpoint; import dr.evolution.io.Importer; import dr.evolution.io.NewickImporter; import dr.evolution.tree.Tree; import java.io.*; /** * @author Guy Baele */ public class DebugTreeImporter { private static final boolean DEBUG = true; //just trolling public static boolean isInteger(String s) { try { Integer.parseInt(s); } catch(NumberFormatException e) { return false; } catch(NullPointerException e) { return false; } // only got here if we didn't return false return true; } //args[0]: saved dump file //args[1]: new XML file //args[2]: new tree (Newick format) //args[3]: output file //e.g.: dump.trump.160 worobey-con-sc-resume-162-taxa.xml newtree.nwk restart.dump public static void main (String[] args) { if (args.length != 4) { throw new RuntimeException("Incorrect number of arguments."); } try { FileReader fileIn = new FileReader(args[2]); BufferedReader in = new BufferedReader(fileIn); String fullTree = in.readLine(); NewickImporter importer = new NewickImporter(fullTree); Tree tree = importer.importNextTree(); //assume rootHeight in dumpfile is ALWAYS followed by all the nodeHeights System.out.println("root height: " + tree.getNodeHeight(tree.getRoot())); FileReader dumpFileIn = new FileReader(args[0]); BufferedReader dumpIn = new BufferedReader(dumpFileIn); FileWriter dumpFileOut = new FileWriter(args[3]); BufferedWriter dumpOut = new BufferedWriter(dumpFileOut); String original = dumpIn.readLine(); String[] fields = original.split("\t"); //write new rootHeight to new output dump file while (!fields[0].equals("treeModel.rootHeight")) { if (DEBUG) { System.out.println(original); } dumpOut.write(original + "\n"); original = dumpIn.readLine(); fields = original.split("\t"); } fields[2] = Double.toString(tree.getNodeHeight(tree.getRoot())); for (int i = 0; i < fields.length; i++) { dumpOut.write(fields[i] + "\t"); } dumpOut.write("\n"); //write all new node heights to new output dump file int nodeCount = tree.getNodeCount(); if (DEBUG) { System.out.println(nodeCount + " nodes found in tree."); } for (int i = 0; i < (nodeCount-1); i++) { if (DEBUG) { System.out.println(tree.getNode(i).getNumber() + "\t" + tree.getNodeHeight(tree.getNode(i))); } dumpOut.write(tree.getNode(i).getNumber() + "\t1\t" + tree.getNodeHeight(tree.getNode(i)) + "\n"); } //skip all the node heights in the original dump file //no clue as to how many there are ... //best I can tell only node heights have integers as parameter names original = dumpIn.readLine(); if (DEBUG) { System.out.println(original); } fields = original.split("\t"); while (isInteger(fields[0])) { original = dumpIn.readLine(); fields = original.split("\t"); } while (!fields[0].equals("treeModel")) { dumpOut.write(original + "\n"); original = dumpIn.readLine(); if (DEBUG) { System.out.println(original); } fields = original.split("\t"); } dumpOut.write(fields[0] + "\t" + fullTree); dumpOut.flush(); dumpOut.close(); } catch (FileNotFoundException fnfe) { throw new RuntimeException("Tree file not found."); } catch (IOException ioe) { throw new RuntimeException("Unable to read file: " + ioe.getMessage()); } catch (Importer.ImportException ie) { throw new RuntimeException("Unable to import tree: " + ie.getMessage()); } } }