package templates; import gui.InteractiveTableModel; import java.util.ArrayList; import processing.core.PApplet; import processing.core.PFont; import readers.LogFileReader; import utils.Holder; import utils.Utils; import utils.Utils.PoissonPriorEnum; @SuppressWarnings("serial") public class RateIndicatorBFToProcessing extends PApplet { private InteractiveTableModel table; private LogFileReader indicators; private double bfCutoff; private MapBackground mapBackground; private ArrayList<Double> bayesFactors; private ArrayList<Double> posteriorProbabilities; private ArrayList<String> combin; private BayesFactorTest bfTest; // private int numberOfIntervals; 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); // min/max longitude private float minX, maxX; // min/max latitude private float minY, maxY; private PoissonPriorEnum poissonPriorOffsetSwitcher; private PoissonPriorEnum meanPoissonPriorSwitcher; public RateIndicatorBFToProcessing() { }// END: RateIndicatorBFToProcessing() // public void setNumberOfIntervals(int number) { // numberOfIntervals = number; // } 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 setBfCutoff(double cutoff) { bfCutoff = cutoff; } public void setTable(InteractiveTableModel tableModel) { table = tableModel; } public void setLogFilePath(String path, double burnIn, String indicatorName) { indicators = new LogFileReader(path, burnIn, indicatorName); } 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 setup() { minX = -180; maxX = 180; minY = -90; maxY = 90; // will improve font rendering speed with default renderer hint(ENABLE_NATIVE_FONTS); PFont plotFont = createFont("Monaco", 12); textFont(plotFont); mapBackground = new MapBackground(this); }// END: setup public void draw() { noLoop(); smooth(); computeBFTest(); mapBackground.drawMapBackground(); DrawPlaces(); DrawRates(); // DrawRateSlices(); DrawPlacesLabels(); }// END:draw // ////////////// // ---PLACES---// // ////////////// private void DrawPlaces() { float radius = 7; // White fill(255, 255, 255); noStroke(); for (int row = 0; row < table.getRowCount(); row++) { Float longitude = Float.valueOf(String.valueOf(table.getValueAt( row, 2))); Float latitude = Float.valueOf(String.valueOf(table.getValueAt(row, 1))); // Equirectangular projection: float X = map(longitude, minX, maxX, 0, width); float Y = map(latitude, maxY, minY, 0, height); ellipse(X, Y, radius, radius); } }// END DrawPlaces private void DrawPlacesLabels() { textSize(7); // Black labels fill(0, 0, 0); for (int row = 0; row < table.getRowCount(); row++) { String name = String.valueOf(table.getValueAt(row, 0)); Float longitude = Float.valueOf(String.valueOf(table.getValueAt( row, 2))); Float latitude = Float.valueOf(String.valueOf(table.getValueAt(row, 1))); float X = map(longitude, minX, maxX, 0, width); float Y = map(latitude, maxY, minY, 0, height); text(name, X, Y); } }// END: DrawPlacesLabels private void DrawRates() { System.out.println("BF cutoff = " + bfCutoff); System.out.println("mean Poisson Prior = " + meanPoissonPrior.value); System.out.println("Poisson Prior offset = " + poissonPriorOffset.value); strokeWeight((float) branchWidth); Integer[] sortOrder = bfTest.getSortOrder(); float bfMax = (float) Math.log(Utils.getListMax(bayesFactors)); int index = 0; for (int i = 0; i < combin.size(); i++) { if (bayesFactors.get(sortOrder[i]) > bfCutoff) { /** * Color mapping * */ float bf = (float) 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); stroke(red, green, blue, alpha); 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); float x0 = map(parentLongitude, minX, maxX, 0, width); float y0 = map(parentLatitude, maxY, minY, 0, height); float x1 = map(longitude, minX, maxX, 0, width); float y1 = map(latitude, maxY, minY, 0, height); line(x0, y0, x1, y1); 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: ArrayList loop }// END: DrawRates // @SuppressWarnings("unused") // private void DrawRateSlices() { // // System.out.println("BF cutoff = " + bfCutoff); // System.out.println("mean Poisson Prior = " + meanPoissonPrior.value); // System.out.println("Poisson Prior offset = " + poissonPriorOffset.value); // // strokeWeight((float) branchWidth); // // Integer[] sortOrder = bfTest.getSortOrder(); // float bfMax = (float) Math.log(Utils.getListMax(bayesFactors)); // int index = 0; // // for (int i = 0; i < combin.size(); i++) { // // if (bayesFactors.get(sortOrder[i]) > bfCutoff) { // // /** // * Color mapping // * */ // float bf = (float) 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); // // stroke(red, green, blue, alpha); // // 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); // // GeoIntermediate rhumbIntermediate = new GeoIntermediate( // parentLongitude, parentLatitude, longitude, latitude, // 100); // double[][] coords = rhumbIntermediate.getCoords(); // // for (int row = 0; row < coords.length - 1; row++) { // // float x0 = map((float) coords[row][0], minX, maxX, 0, width); // float y0 = map((float) coords[row][1], maxY, minY, 0, // height); // // float x1 = map((float) coords[row + 1][0], minX, maxX, 0, // width); // float y1 = map((float) coords[row + 1][1], maxY, minY, 0, // height); // // line(x0, y0, x1, y1); // // }// END: numberOfIntervals loop // // System.out.println(index + "\t" + "I=" + posteriorProbabilities.get(sortOrder[i]) + // " BF=" + bayesFactors.get(sortOrder[i]) + " : between " // + parentState + " (long: " + parentLongitude // + "; lat: " + parentLatitude + ") and " + state // + " (long: " + longitude + "; lat: " + latitude + ")"); // // index++; // // }// END: cutoff check // }// END: ArrayList loop // }// END: DrawRatesSlices private void computeBFTest() { 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(); }// END: computeBFTest }// END: RateIndicatorBFToProcessing class