/* * BeastRemote.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.app.beast; import dr.app.util.Arguments; import dr.inference.parallel.MPIServices; import dr.math.MathUtils; import mpi.MPI; import java.io.File; /** * @author Marc Suchard */ public class BeastRemote extends BeastMain { public BeastRemote(File inputFile, BeastConsoleApp consoleApp, boolean verbose, boolean parserWarning) { super(inputFile, consoleApp, 0, verbose, parserWarning, true, null, false, null, 0); } public static void terminateSlaves() { int size = MPI.COMM_WORLD.Size(); for (int i = 1; i < size; i++) { System.err.println("Sending kill to process " + i); MPIServices.requestTermination(i); } } public static void main(String[] oldArgs) throws java.io.IOException { // First populate args from MPI.WORLD // String[] args = null; MPI.Init(oldArgs); System.err.println(oldArgs[0]); System.err.println(oldArgs[1]); System.err.println(oldArgs[2]); int rank = MPI.COMM_WORLD.Rank(); int argLength = oldArgs.length - 3; String[] args = new String[argLength]; for (int i = 0; i < argLength; i++) { args[i] = oldArgs[i + 3]; System.err.println(i + " : " + args[i]); if (args[i].contains(".xml")) { // append rank args[i] = args[i].replace(".xml", Integer.toString(rank) + ".xml"); System.err.println("Attempting to load: " + args[i]); } } /* for (String str : args) System.err.println(str);*/ //System.exit(1); Arguments arguments = new Arguments( new Arguments.Option[]{ new Arguments.Option("verbose", "verbose XML parsing messages"), new Arguments.Option("warnings", "Show warning messages about BEAST XML file"), new Arguments.Option("window", "provide a console window"), new Arguments.Option("working", "change working directory to input file's directory"), new Arguments.LongOption("seed", "specify a random number generator seed"), new Arguments.Option("help", "option to print this message") }); try { arguments.parseArguments(args); } catch (Arguments.ArgumentException ae) { System.out.println(); System.out.println(ae.getMessage()); System.out.println(); printTitle(); printUsage(arguments); MPI.Finalize(); System.exit(1); } if (arguments.hasOption("help")) { printTitle(); printUsage(arguments); MPI.Finalize(); System.exit(0); } boolean verbose = arguments.hasOption("verbose"); boolean parserWarning = arguments.hasOption("pwarning"); // if dev, then auto turn on, otherwise default to turn off // boolean window = arguments.hasOption("window"); boolean working = arguments.hasOption("working"); long seed = MathUtils.getSeed(); if (arguments.hasOption("seed")) { seed = arguments.getLongOption("seed"); MathUtils.setSeed(seed); } // if (System.getProperty("dr.app.beast.main.window", "false").toLowerCase().equals("true")) { // window = true; // } BeastConsoleApp consoleApp = null; /* if (window) { System.setProperty("com.apple.macos.useScreenMenuBar", "true"); System.setProperty("apple.laf.useScreenMenuBar", "true"); System.setProperty("apple.awt.showGrowBox", "true"); javax.swing.Icon icon = IconUtils.getIcon(BeastMain.class, "images/beast.png"); String nameString = "BEAST " + version.getVersionString(); String aboutString = "<html><center><p>Bayesian Evolutionary Analysis Sampling Trees<br>" + "Version " + version.getVersionString() + ", 2002-2006</p>" + "<p>by<br>" + "Alexei J. Drummond and Andrew Rambaut</p>" + "<p>Department of Computer Science, University of Auckland<br>" + "<a href=\"mailto:alexei@cs.auckland.ac.nz\">alexei@cs.auckland.ac.nz</a></p>" + "<p>Institute of Evolutionary Biology, University of Edinburgh<br>" + "<a href=\"mailto:a.rambaut@ed.ac.uk\">a.rambaut@ed.ac.uk</a></p>" + "<p><a href=\"http://evolve.zoo.ox.ac.uk/beast/\">http://evolve.zoo.ox.ac.uk/beast/</a></p>" + "<p>Source code distributed under the GNU LGPL:<br>" + "<a href=\"http://github.com/beast-dev/beast-mcmc/\">http://github.com/beast-dev/beast-mcmc/</a></p>" + "<p>Additional programming by:<br>" + "Roald Forsberg, Gerton Lunter, Sidney Markowitz, Oliver Pybus</p>" + "<p>Thanks to Korbinian Strimmer for use of his code</p>" + "</center></html>"; consoleApp = new BeastConsoleApp(nameString, aboutString, icon); }*/ // Remote can never be interactive String inputFileName; String[] args2 = arguments.getLeftoverArguments(); if (args2.length > 1) { System.err.println("Unknown option: " + args2[1]); System.err.println(); printTitle(); printUsage(arguments); MPI.Finalize(); System.exit(1); } File inputFile = null; if (args2.length > 0) { inputFileName = args2[0]; inputFile = new File(inputFileName); } /* if (inputFileName == null) { // No input file name was given so throw up a dialog box... inputFile = Utils.getLoadFile("BEAST " + version.getVersionString() + " - Select XML input file"); }*/ if (inputFile != null && working) { System.setProperty("user.dir", inputFile.getParent()); } printTitle(); System.out.println(); System.out.println("Random number seed: " + seed); System.out.println(); new BeastRemote(inputFile, consoleApp, verbose, parserWarning); //System.err.println("Did I get here"); if (rank == 0) terminateSlaves(); MPI.Finalize(); } }