/* * NexusApplicationImporter.java * * Copyright (C) 2002-2006 Alexei Drummond and Andrew Rambaut * * 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.oldbeauti; import dr.evolution.io.NexusImporter; import java.io.IOException; import java.io.Reader; import java.io.Writer; /** * Class for importing PAUP, MrBayes and Rhino NEXUS file format * * @author Andrew Rambaut * @author Alexei Drummond * @version $Id: NexusApplicationImporter.java,v 1.4 2005/07/11 14:07:25 rambaut Exp $ */ public class NexusApplicationImporter extends NexusImporter { public static final NexusBlock PAUP_BLOCK = new NexusBlock("PAUP"); public static final NexusBlock MRBAYES_BLOCK = new NexusBlock("MRBAYES"); public static final NexusBlock RHINO_BLOCK = new NexusBlock("RHINO"); public static final NexusBlock BEAST_BLOCK = new NexusBlock("BEAST"); /** * Constructor */ public NexusApplicationImporter(Reader reader) { super(reader); setCommentDelimiters('[', ']', '\0'); } public NexusApplicationImporter(Reader reader, Writer commentWriter) { super(reader, commentWriter); setCommentDelimiters('[', ']', '\0'); } /** * This function returns an enum class to specify what the * block given by blockName is. */ public NexusBlock findBlockName(String blockName) { if (blockName.equalsIgnoreCase(PAUP_BLOCK.toString())) { return PAUP_BLOCK; } else if (blockName.equalsIgnoreCase(MRBAYES_BLOCK.toString())) { return MRBAYES_BLOCK; } else if (blockName.equalsIgnoreCase(BEAST_BLOCK.toString())) { return BEAST_BLOCK; } else if (blockName.equalsIgnoreCase(RHINO_BLOCK.toString())) { return RHINO_BLOCK; } else { return super.findBlockName(blockName); } } /** * Parses a 'PAUP' block. */ public void parsePAUPBlock(BeastGenerator options) throws ImportException, IOException { // PAUP is largely a subset of BEAST block readBEASTBlock(options); } /** * Parses a 'MRBAYES' block. */ public void parseMrBayesBlock(BeastGenerator options) throws ImportException, IOException { // MRBAYES is largely a subset of BEAST block readBEASTBlock(options); } /** * Parses a 'BEAST' block. */ public void parseBEASTBlock(BeastGenerator options) throws ImportException, IOException { readBEASTBlock(options); } /** * Parses a 'RHINO' block. */ public void parseRhinoBlock(BeastGenerator options) throws ImportException, IOException { readRhinoBlock(options); } private void readBEASTBlock(BeastGenerator options) throws ImportException, IOException { boolean done = false; while (!done) { String command = readToken(";"); if (match("HSEARCH", command, 2)) { done = true; } else if (match("MCMC", command, 4)) { if (getLastDelimiter() != ';') { readMCMCCommand(options); } done = true; } else if (match("MCMCP", command, 5)) { if (getLastDelimiter() != ';') { readMCMCCommand(options); } } else if (match("LSET", command, 2)) { if (getLastDelimiter() != ';') { readLSETCommand(options); } } else if (command.equalsIgnoreCase("ENDBLOCK") || command.equalsIgnoreCase("END")) { done = true; } else { System.err.println("The command, '" + command + "', is not used by BEAST and has been ignored"); } } } private void readLSETCommand(BeautiOptions options) throws ImportException, IOException { boolean done = false; while (!done) { String subcommand = readToken("=;"); if (match("NST", subcommand, 2)) { int nst = readInteger( ";" ); if (nst == 1) { options.nucSubstitutionModel = BeautiOptions.JC; } else if (nst == 2) { options.nucSubstitutionModel = BeautiOptions.HKY; } else if (nst == 6) { options.nucSubstitutionModel = BeautiOptions.GTR; } else { throw new BadFormatException("Bad value for NST subcommand of LSET command"); } } else if (match("RATES", subcommand, 2)) { String token = readToken( ";" ); if (match("EQUAL", token, 1)) { options.gammaHetero = false; options.invarHetero = false; } else if (match("GAMMA", token, 1)) { options.gammaHetero = true; options.invarHetero = false; } else if (match("PROPINV", token, 1)) { options.gammaHetero = false; options.invarHetero = true; } else if (match("INVGAMMA", token, 1)) { options.gammaHetero = true; options.invarHetero = true; } else if (match("ADGAMMA", token, 1)) { System.err.println("The option, 'RATES=ADGAMMA', in the LSET command is not used by BEAST and has been ignored"); } else if (match("SITESPEC", token, 1)) { System.err.println("The option, 'RATES=SITESPEC', in the LSET command is not used by BEAST and has been ignored"); } else { throw new BadFormatException("Unknown value, '" + token + "'"); } } else if (match("NGAMMACAT", subcommand, 2)) { options.gammaCategories = readInteger( ";" ); } else { System.err.println("The option, '" + subcommand + "', in the LSET command is not used by BEAST and has been ignored"); } if (getLastDelimiter() == ';') { done = true; } } } private void readMCMCCommand(BeautiOptions options) throws ImportException, IOException { boolean done = false; while (!done) { String subcommand = readToken("=;"); if (match("NGEN", subcommand, 2)) { options.chainLength = readInteger( ";" ); } else if (match("SAMPLEFREQ", subcommand, 2)) { options.logEvery = readInteger( ";" ); } else if (match("PRINTFREQ", subcommand, 1)) { options.echoEvery = readInteger( ";" ); } else if (match("FILENAME", subcommand, 1)) { options.fileName = readToken( ";" ); } else if (match("BURNIN", subcommand, 1)) { options.burnIn = readInteger( ";" ); } else if (match("STARTINGTREE", subcommand, 2)) { String token = readToken(";"); if (match("USER", token, 1)) { options.userTree = true; } else if (match("RANDOM", token, 1)) { options.userTree = false; } else { throw new BadFormatException("Unknown value, '" + token + "'"); } } else { System.err.println("The option, '" + subcommand + "', in the MCMC command is not used by BEAST and has been ignored"); } if (getLastDelimiter() == ';') { done = true; } } } private void readRhinoBlock(BeastGenerator options) throws ImportException, IOException { boolean done = false; while (!done) { String command = readToken(";"); if (match("NUCMODEL", command, 2)) { if (getLastDelimiter() != ';') { readNUCMODELCommand(options); } } else if (match("SITEMODEL", command, 2)) { if (getLastDelimiter() != ';') { readSITEMODELCommand(options); } } else if (match("TREEMODEL", command, 2)) { if (getLastDelimiter() != ';') { readTREEMODELCommand(options); } } else if (match("CPPARTITIONMODEL", command, 2)) { if (getLastDelimiter() != ';') { readCPPARTITIONMODELCommand(options); } } else if (match("OPTIMIZE", command, 1)) { done = true; } else if (command.equalsIgnoreCase("ENDBLOCK") || command.equalsIgnoreCase("END")) { done = true; } else { System.err.println("The command, '" + command + "', is not used by BEAST and has been ignored"); } } } private void readNUCMODELCommand(BeautiOptions options) throws ImportException, IOException { boolean done = false; while (!done) { String subcommand = readToken("=;"); if (match("TYPE", subcommand, 1)) { String token = readToken(";"); if (match("HKY", token, 1)) { options.nucSubstitutionModel = BeautiOptions.HKY; } else if (match("GTR", token, 1)) { options.nucSubstitutionModel = BeautiOptions.GTR; } else if (match("F84", token, 1)) { System.err.println("The option, 'TYPE=F84', in the NUCMODEL command is not used by BEAST and has been ignored"); } else { throw new BadFormatException("Unknown value, '" + token + "'"); } } else { System.err.println("The option, '" + subcommand + "', in the NUCMODEL command is not used by BEAST and has been ignored"); } if (getLastDelimiter() == ';') { done = true; } } } private void readSITEMODELCommand(BeautiOptions options) throws ImportException, IOException { boolean done = false; while (!done) { String subcommand = readToken("=;"); if (match("TYPE", subcommand, 1)) { String token = readToken(";"); if (match("HOMOGENEOUS", token, 1)) { options.gammaHetero = false; options.invarHetero = false; } else if (match("GAMMA", token, 2)) { options.gammaHetero = true; options.invarHetero = false; } else if (match("INVAR", token, 1)) { options.gammaHetero = false; options.invarHetero = true; } else if (match("GI", token, 2)) { options.gammaHetero = true; options.invarHetero = true; } else { throw new BadFormatException("Unknown value, '" + token + "'"); } } else if (match("NUMCAT", subcommand, 1)) { options.gammaCategories = readInteger( ";" ); } else { System.err.println("The option, '" + subcommand + "', in the SITEMODEL command is not used by BEAST and has been ignored"); } if (getLastDelimiter() == ';') { done = true; } } } private void readTREEMODELCommand(BeautiOptions options) throws ImportException, IOException { boolean done = false; while (!done) { String subcommand = readToken("=;"); if (match("TYPE", subcommand, 1)) { String token = readToken(";"); if (match("UNCONSTRAINED", token, 1)) { System.err.println("The option, 'TYPE=UNCONSTRAINED', in the TREEMODEL command is not used by BEAST and has been ignored"); } else if (match("CONSTRAINED", token, 1)) { // do nothing } else if (match("NODEDATES", token, 1)) { // do nothing } else if (match("TIPDATES", token, 1)) { // do nothing } else { throw new BadFormatException("Unknown value, '" + token + "'"); } } else { System.err.println("The option, '" + subcommand + "', in the TREEMODEL command is not used by BEAST and has been ignored"); } if (getLastDelimiter() == ';') { done = true; } } } private void readCPPARTITIONMODELCommand(BeautiOptions options) throws ImportException, IOException { boolean done = false; options.codonHeteroPattern = null; while (!done) { String subcommand = readToken("=;"); if (match("ON", subcommand, 1)) { String token = readToken(";"); if (match("TRUE", token, 1)) { options.codonHeteroPattern = "123"; } else if (match("FALSE", token, 1)) { options.codonHeteroPattern = null; } else { throw new BadFormatException("Unknown value, '" + token + "'"); } } else if (match("SUBSTMODEL", subcommand, 1)) { String token = readToken(";"); if (match("TRUE", token, 1)) { options.unlinkedSubstitutionModel = true; options.unlinkedHeterogeneityModel = true; } else if (match("FALSE", token, 1)) { options.unlinkedSubstitutionModel = false; options.unlinkedHeterogeneityModel = false; } else { throw new BadFormatException("Unknown value, '" + token + "'"); } } else if (match("FREQMODEL", subcommand, 1)) { String token = readToken(";"); if (match("TRUE", token, 1)) { options.unlinkedFrequencyModel = true; } else if (match("FALSE", token, 1)) { options.unlinkedFrequencyModel = false; } else { throw new BadFormatException("Unknown value, '" + token + "'"); } } else { System.err.println("The option, '" + subcommand + "', in the CPPARTITIONMODEL command is not used by BEAST and has been ignored"); } if (getLastDelimiter() == ';') { done = true; } } } private boolean match(String reference, String target, int min) throws ImportException { if (target.length() < min) { throw new BadFormatException("Ambiguous command or subcommand, '" + target + "'"); } return reference.startsWith(target.toUpperCase()); } }