package checks; import gui.InteractiveTableModel; import java.io.FileReader; import java.io.IOException; import java.text.ParseException; import java.util.HashSet; import java.util.Set; import jebl.evolution.graphs.Node; import jebl.evolution.io.ImportException; import jebl.evolution.io.NexusImporter; import jebl.evolution.trees.RootedTree; import utils.Utils; public class DiscreteSanityCheck { private boolean notNull = false; public boolean check(String treeFilename, String stateAttName, InteractiveTableModel table) throws IOException, ImportException, ParseException { NexusImporter importer = new NexusImporter(new FileReader(treeFilename)); RootedTree tree = (RootedTree) importer.importNextTree(); String uniqueState; double nodeCount = Utils.getNodeCount(tree); double unannotatedNodeCount = 0; Set<String> uniqueTreeStates = new HashSet<String>(); for (Node node : tree.getNodes()) { if (!tree.isRoot(node)) { uniqueState = (String) node.getAttribute(stateAttName); uniqueTreeStates.add(uniqueState); if (uniqueState == null) { unannotatedNodeCount++; }// unannotated internal nodes check }// END: root check }// END: node loop if (unannotatedNodeCount == nodeCount) { notNull = false; throw new RuntimeException("Attribute, " + stateAttName + ", missing from node"); } else if (unannotatedNodeCount == 0) { notNull = true; } else if (unannotatedNodeCount < nodeCount) { notNull = true; System.out.println("Spread detected unannotated branches " + "and will continue by skipping them. Consider " + "annotating all of the branches of your tree."); } else { notNull = false; throw new RuntimeException("Bad juju"); } fitLocations(table, uniqueTreeStates); return notNull; }// END: check() private void fitLocations(InteractiveTableModel table, Set<String> uniqueTreeStates) { Object[] uniqueTreeStatesArray = uniqueTreeStates.toArray(); for (int i = 0; i < table.getRowCount(); i++) { String state = null; for (int j = 0; j < uniqueTreeStatesArray.length; j++) { String name = String.valueOf(table.getValueAt(i, 0)); if (name.toLowerCase().equals( ((String) uniqueTreeStatesArray[j]).toLowerCase())) { state = name; }// END: if location and discrete states match }// END: unique discrete states loop if (state == null) { // if none matches System.out.println("Location " + String.valueOf(table.getValueAt(i, 0)) + " does not fit any of the discrete states"); } }// END: locations loop }// END: fitLocations() }// END: class