package templates; import generator.KMLGenerator; import gui.InteractiveTableModel; import java.awt.Color; import java.io.FileNotFoundException; import java.io.IOException; import java.io.PrintWriter; import java.text.ParseException; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import jebl.evolution.io.ImportException; import readers.LogFileReader; import structure.Coordinates; import structure.Layer; import structure.Line; import structure.Place; import structure.Style; import structure.TimeLine; import utils.Holder; import utils.Utils; import utils.Utils.PoissonPriorEnum; public class RateIndicatorBFToKML { public static long time; private InteractiveTableModel table; private LogFileReader indicators; private List<Layer> layers; private PrintWriter writer; private int numberOfIntervals; private double maxAltMapping; private double bfCutoff; private ArrayList<Double> bayesFactors; private ArrayList<Double> posteriorProbabilities; private ArrayList<String> combin; private BayesFactorTest bfTest; private double minBranchRedMapping; private double minBranchGreenMapping; private double minBranchBlueMapping; private double minBranchOpacityMapping; private double maxBranchRedMapping; private double maxBranchGreenMapping; private double maxBranchBlueMapping; private double maxBranchOpacityMapping; private double branchWidth; private Holder meanPoissonPrior = new Holder(0.0); private Holder poissonPriorOffset = new Holder(0.0); private PoissonPriorEnum poissonPriorOffsetSwitcher; private PoissonPriorEnum meanPoissonPriorSwitcher; public RateIndicatorBFToKML() { }// END: RateIndicatorBF() public void setDefaultPoissonPriorOffset() { poissonPriorOffsetSwitcher = PoissonPriorEnum.DEFAULT; } public void setUserPoissonPriorOffset(double offset) { poissonPriorOffsetSwitcher = PoissonPriorEnum.USER; poissonPriorOffset.value = offset; } public void setDefaultMeanPoissonPrior() { meanPoissonPriorSwitcher = PoissonPriorEnum.DEFAULT; } public void setUserMeanPoissonPrior(double mean) { meanPoissonPriorSwitcher = PoissonPriorEnum.USER; meanPoissonPrior.value = mean; } public void setNumberOfIntervals(int number) { numberOfIntervals = number; } public void setMaxAltitudeMapping(double max) { maxAltMapping = max; } public void setBfCutoff(double cutoff) { bfCutoff = cutoff; } public void setTable(InteractiveTableModel tableModel) { table = tableModel; } public void setLogFileParser(String path, double burnIn, String indicatorName) { indicators = new LogFileReader(path, burnIn, indicatorName); } public void setKmlWriterPath(String kmlpath) throws FileNotFoundException { writer = new PrintWriter(kmlpath); } public void setMinBranchRedMapping(double min) { minBranchRedMapping = min; } public void setMinBranchGreenMapping(double min) { minBranchGreenMapping = min; } public void setMinBranchBlueMapping(double min) { minBranchBlueMapping = min; } public void setMinBranchOpacityMapping(double min) { minBranchOpacityMapping = min; } public void setMaxBranchRedMapping(double max) { maxBranchRedMapping = max; } public void setMaxBranchGreenMapping(double max) { maxBranchGreenMapping = max; } public void setMaxBranchBlueMapping(double max) { maxBranchBlueMapping = max; } public void setMaxBranchOpacityMapping(double max) { maxBranchOpacityMapping = max; } public void setBranchWidth(double width) { branchWidth = width; } public void GenerateKML() throws IOException, ImportException, ParseException, RuntimeException { // start timing time = -System.currentTimeMillis(); combin = new ArrayList<String>(); bayesFactors = new ArrayList<Double>(); posteriorProbabilities = new ArrayList<Double>(); bfTest = new BayesFactorTest(table, meanPoissonPriorSwitcher, meanPoissonPrior, poissonPriorOffsetSwitcher, poissonPriorOffset, indicators, combin, bayesFactors, posteriorProbabilities); bfTest.ComputeBFTest(); // this is to generate kml output KMLGenerator kmloutput = new KMLGenerator(); layers = new ArrayList<Layer>(); // Execute threads final int NTHREDS = Runtime.getRuntime().availableProcessors(); ExecutorService executor = Executors.newFixedThreadPool(NTHREDS); executor.submit(new Places()); executor.submit(new Rates()); executor.shutdown(); // Wait until all threads are finished while (!executor.isTerminated()) { } // generate kml TimeLine timeLine = new TimeLine(Double.NaN, Double.NaN, numberOfIntervals); kmloutput.generate(writer, timeLine, layers); // stop timing time += System.currentTimeMillis(); }// END: GenerateKML // ////////////// // ---PLACES---// // ////////////// private class Places implements Runnable { public void run() { // this is for Places folder: String placesDescription = null; Layer placesLayer = new Layer("Places", placesDescription); for (int i = 0; i < table.getRowCount(); i++) { String name = String.valueOf(table.getValueAt(i, 0)); Double longitude = Double.valueOf(String.valueOf(table .getValueAt(i, 2))); Double latitude = Double.valueOf(String.valueOf(table .getValueAt(i, 1))); placesLayer.addItem(new Place(name, null, new Coordinates( longitude, latitude), 0, 0)); } layers.add(placesLayer); } }// END: Places // ///////////// // ---RATES---// // ///////////// private class Rates implements Runnable { public void run() { try { System.out.println("BF cutoff = " + bfCutoff); System.out.println("mean Poisson Prior = " + meanPoissonPrior.value); System.out.println("Poisson Prior offset = " + poissonPriorOffset.value); // this is for Branches folder: String ratesDescription = null; Layer ratesLayer = new Layer("Discrete rates", ratesDescription); double bfMax = Math.log(Utils.getListMax(bayesFactors)); Integer[] sortOrder = bfTest.getSortOrder(); int branchStyleId = 1; int index = 0; for (int i = 0; i < combin.size(); i++) { if (bayesFactors.get(sortOrder[i]) > bfCutoff) { /** * Color mapping * */ double bf = Math.log(bayesFactors.get(sortOrder[i])); int red = (int) Utils.map(bf, 0, bfMax, minBranchRedMapping, maxBranchRedMapping); int green = (int) Utils.map(bf, 0, bfMax, minBranchGreenMapping, maxBranchGreenMapping); int blue = (int) Utils.map(bf, 0, bfMax, minBranchBlueMapping, maxBranchBlueMapping); int alpha = (int) Utils.map(bf, 0, bfMax, maxBranchOpacityMapping, minBranchOpacityMapping); Style linesStyle = new Style(new Color(red, green, blue, alpha), branchWidth); linesStyle.setId("branch_style" + branchStyleId); /** * altitude mapping * */ double maxAltitude = (int) Utils.map(bf, 0, bfMax, 0, maxAltMapping); String state = combin.get(sortOrder[i]).split(":")[1]; String parentState = combin.get(sortOrder[i]).split(":")[0]; float longitude = Utils.matchStateCoordinate(table, state, 2); float latitude = Utils.matchStateCoordinate(table, state, 1); float parentLongitude = Utils.matchStateCoordinate( table, parentState, 2); float parentLatitude = Utils.matchStateCoordinate( table, parentState, 1); ratesLayer.addItem(new Line(combin.get(sortOrder[i]) + ", BF=" + bayesFactors.get(sortOrder[i]), // name new Coordinates(parentLongitude, parentLatitude), Double.NaN, // startime linesStyle, // style startstyle new Coordinates(longitude, latitude), // endCoords Double.NaN, // double endtime linesStyle, // style endstyle maxAltitude, // double maxAltitude Double.NaN) // double duration ); branchStyleId++; System.out.println(index + "\t" + "pk=" + posteriorProbabilities.get(sortOrder[i]) + "\t" + "BF=" + bayesFactors.get(sortOrder[i]) + "\t" + "between " + parentState + " (long: " + parentLongitude + "; lat: " + parentLatitude + ") and " + state + " (long: " + longitude + "; lat: " + latitude + ")"); index++; }// END: cutoff check }// END: i loop layers.add(ratesLayer); } catch (Exception e) { e.printStackTrace(); } }// END: run }// END: Rates }// END: RateIndicatorBF