package templates;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import readers.SliceHeightsReader;
import jebl.evolution.io.ImportException;
import jebl.evolution.io.NexusImporter;
import jebl.evolution.io.TreeImporter;
import jebl.evolution.trees.RootedTree;
import utils.Utils;
public class SpatialStatsToTerminal {
public long time;
private int analysisType;
public final static int FIRST_ANALYSIS = 1;
public final static int SECOND_ANALYSIS = 2;
private RootedTree tree;
private double treeRootHeight;
private double[] sliceHeights;
private int numberOfIntervals;
private TreeImporter treeImporter;
private TreeImporter treesImporter;
private RootedTree currentTree;
private int burnIn;
private boolean useTrueNoise;
private String coordinatesName;
private String rateString;
private String precisionString;
public SpatialStatsToTerminal() {
}// END: Constructor
public void setAnalysisType(int analysisType) {
this.analysisType = analysisType;
}
public void setNumberOfIntervals(int numberOfIntervals) {
this.numberOfIntervals = numberOfIntervals;
}
public void setTreePath(String path) throws FileNotFoundException {
treeImporter = new NexusImporter(new FileReader(path));
}
public void setTreesPath(String path) throws FileNotFoundException {
treesImporter = new NexusImporter(new FileReader(path));
}
public void setBurnIn(int burnIn) {
this.burnIn = burnIn;
}
public void setLocationAttributeName(String name) {
coordinatesName = name;
}
public void setRateAttributeName(String name) {
rateString = name;
}
public void setPrecisionAttName(String name) {
precisionString = name;
}
public void setUseTrueNoise(boolean useTrueNoise) {
this.useTrueNoise = useTrueNoise;
}
public void setCustomSliceHeightsPath(String path) {
sliceHeights = new SliceHeightsReader(path).getSliceHeights();
}
public void calculate() {
try {
// start timing
time = -System.currentTimeMillis();
switch (analysisType) {
case FIRST_ANALYSIS:
tree = (RootedTree) treeImporter.importNextTree();
treeRootHeight = Utils.getNodeHeight(tree, tree.getRootNode());
sliceHeights = Utils.generateTreeSliceHeights(treeRootHeight,
numberOfIntervals);
break;
case SECOND_ANALYSIS:
break;
}// END: switch on analysisType
// sort them in ascending numerical order
Arrays.sort(sliceHeights);
System.out.println("Using as slice times: ");
Utils.printArray(sliceHeights);
System.out.println();
// Executor for threads
int NTHREDS = Runtime.getRuntime().availableProcessors();
ExecutorService executor = Executors.newFixedThreadPool(NTHREDS * 2);
int treesAssumed = 10000;
int treesRead = 0;
System.out.println("Analyzing trees (bar assumes 10,000 trees)");
System.out.println("0 25 50 75 100");
System.out.println("|---------------------|---------------------|---------------------|---------------------|");
// System.out.println("0 25 50 75 100");
// System.out.println("|--------------|--------------|--------------|--------------|");
int stepSize = treesAssumed / 60;
if (stepSize < 1) {
stepSize = 1;
}
int totalTrees = 0;
List<Double> treesRatesList = new ArrayList<Double>();
while (treesImporter.hasTree()) {
currentTree = (RootedTree) treesImporter.importNextTree();
if (totalTrees >= burnIn) {
CalculateTreeSpatialStats calculateTreeSpatialStats = new CalculateTreeSpatialStats(currentTree,//
coordinatesName, //
rateString, //
precisionString,//
sliceHeights, //
useTrueNoise //
);
calculateTreeSpatialStats.run();
// executor.submit(calculateTreeSpatialStats);
treesRatesList.add(calculateTreeSpatialStats.getTreeRate());
treesRead += 1;
}// END: if burn-in
if (totalTrees > 0 && totalTrees % stepSize == 0) {
System.out.print("*");
System.out.flush();
}
totalTrees++;
}// END: while has trees
// Wait until all threads are finished
executor.shutdown();
while (!executor.isTerminated()) {
}
if ((totalTrees - burnIn) <= 0.0) {
throw new RuntimeException("Burnt too many trees!");
} else {
System.out.println("\nAnalyzed " + treesRead
+ " trees with burn-in of " + burnIn
+ " for the total of " + totalTrees + " trees");
}
// System.out.println("rate statistic: ");
// stop timing
time += System.currentTimeMillis();
} catch (IOException e) {
e.printStackTrace();
} catch (ImportException e) {
e.printStackTrace();
}// END: try-catch block
}// END: calculate
}// END: class