use of dr.evomodel.tree.TreeParameterModel in project beast-mcmc by beast-dev.
the class BeastCheckpointer method readStateFromFile.
private long readStateFromFile(File file, MarkovChain markovChain, double[] lnL) {
OperatorSchedule operatorSchedule = markovChain.getSchedule();
long state = -1;
ArrayList<TreeParameterModel> traitModels = new ArrayList<TreeParameterModel>();
try {
FileReader fileIn = new FileReader(file);
BufferedReader in = new BufferedReader(fileIn);
int[] rngState = null;
String line = in.readLine();
String[] fields = line.split("\t");
if (fields[0].equals("rng")) {
// if there is a random number generator state present then load it...
try {
rngState = new int[fields.length - 1];
for (int i = 0; i < rngState.length; i++) {
rngState[i] = Integer.parseInt(fields[i + 1]);
}
} catch (NumberFormatException nfe) {
throw new RuntimeException("Unable to read state number from state file");
}
line = in.readLine();
fields = line.split("\t");
}
try {
if (!fields[0].equals("state")) {
throw new RuntimeException("Unable to read state number from state file");
}
state = Long.parseLong(fields[1]);
} catch (NumberFormatException nfe) {
throw new RuntimeException("Unable to read state number from state file");
}
line = in.readLine();
fields = line.split("\t");
try {
if (!fields[0].equals("lnL")) {
throw new RuntimeException("Unable to read lnL from state file");
}
if (lnL != null) {
lnL[0] = Double.parseDouble(fields[1]);
}
} catch (NumberFormatException nfe) {
throw new RuntimeException("Unable to read lnL from state file");
}
for (Parameter parameter : Parameter.CONNECTED_PARAMETER_SET) {
line = in.readLine();
fields = line.split("\t");
//if (!fields[0].equals(parameter.getParameterName())) {
// System.err.println("Unable to match state parameter: " + fields[0] + ", expecting " + parameter.getParameterName());
//}
int dimension = Integer.parseInt(fields[2]);
if (dimension != parameter.getDimension()) {
System.err.println("Unable to match state parameter dimension: " + dimension + ", expecting " + parameter.getDimension() + " for parameter: " + parameter.getParameterName());
System.err.print("Read from file: ");
for (int i = 0; i < fields.length; i++) {
System.err.print(fields[i] + "\t");
}
System.err.println();
}
if (fields[1].equals("branchRates.categories.rootNodeNumber")) {
// System.out.println("eek");
double value = Double.parseDouble(fields[3]);
parameter.setParameterValue(0, value);
if (DEBUG) {
System.out.println("restoring " + fields[1] + " with value " + value);
}
} else {
if (DEBUG) {
System.out.print("restoring " + fields[1] + " with values ");
}
for (int dim = 0; dim < parameter.getDimension(); dim++) {
parameter.setParameterValue(dim, Double.parseDouble(fields[dim + 3]));
if (DEBUG) {
System.out.print(Double.parseDouble(fields[dim + 3]) + " ");
}
}
if (DEBUG) {
System.out.println();
}
}
}
for (int i = 0; i < operatorSchedule.getOperatorCount(); i++) {
MCMCOperator operator = operatorSchedule.getOperator(i);
line = in.readLine();
fields = line.split("\t");
if (!fields[1].equals(operator.getOperatorName())) {
throw new RuntimeException("Unable to match operator: " + fields[1]);
}
if (fields.length < 4) {
throw new RuntimeException("Operator missing values: " + fields[1]);
}
operator.setAcceptCount(Integer.parseInt(fields[2]));
operator.setRejectCount(Integer.parseInt(fields[3]));
if (operator instanceof CoercableMCMCOperator) {
if (fields.length != 5) {
throw new RuntimeException("Coercable operator missing parameter: " + fields[1]);
}
((CoercableMCMCOperator) operator).setCoercableParameter(Double.parseDouble(fields[4]));
}
}
// load the tree models last as we get the node heights from the tree (not the parameters which
// which may not be associated with the right node
Set<String> expectedTreeModelNames = new HashSet<String>();
for (Model model : Model.CONNECTED_MODEL_SET) {
if (model instanceof TreeModel) {
if (DEBUG) {
System.out.println("model " + model.getModelName());
}
expectedTreeModelNames.add(model.getModelName());
if (DEBUG) {
for (String s : expectedTreeModelNames) {
System.out.println(s);
}
}
}
if (model instanceof TreeParameterModel) {
traitModels.add((TreeParameterModel) model);
}
}
line = in.readLine();
fields = line.split("\t");
// Read in all (possibly more than one) trees
while (fields[0].equals("tree")) {
if (DEBUG) {
System.out.println("tree: " + fields[1]);
}
for (Model model : Model.CONNECTED_MODEL_SET) {
if (model instanceof TreeModel && fields[1].equals(model.getModelName())) {
line = in.readLine();
line = in.readLine();
fields = line.split("\t");
//read number of nodes
int nodeCount = Integer.parseInt(fields[0]);
double[] nodeHeights = new double[nodeCount];
for (int i = 0; i < nodeCount; i++) {
line = in.readLine();
fields = line.split("\t");
nodeHeights[i] = Double.parseDouble(fields[1]);
}
//on to reading edge information
line = in.readLine();
line = in.readLine();
line = in.readLine();
fields = line.split("\t");
int edgeCount = Integer.parseInt(fields[0]);
//create data matrix of doubles to store information from list of TreeParameterModels
double[][] traitValues = new double[traitModels.size()][edgeCount];
//create array to store whether a node is left or right child of its parent
//can be important for certain tree transition kernels
int[] childOrder = new int[edgeCount];
for (int i = 0; i < childOrder.length; i++) {
childOrder[i] = -1;
}
int[] parents = new int[edgeCount];
for (int i = 0; i < edgeCount; i++) {
parents[i] = -1;
}
for (int i = 0; i < edgeCount; i++) {
line = in.readLine();
if (line != null) {
fields = line.split("\t");
parents[Integer.parseInt(fields[0])] = Integer.parseInt(fields[1]);
childOrder[i] = Integer.parseInt(fields[2]);
for (int j = 0; j < traitModels.size(); j++) {
traitValues[j][i] = Double.parseDouble(fields[3 + j]);
}
}
}
//perform magic with the acquired information
if (DEBUG) {
System.out.println("adopting tree structure");
}
//adopt the loaded tree structure; this does not yet copy the traits on the branches
((TreeModel) model).beginTreeEdit();
((TreeModel) model).adoptTreeStructure(parents, nodeHeights, childOrder);
((TreeModel) model).endTreeEdit();
expectedTreeModelNames.remove(model.getModelName());
}
}
line = in.readLine();
if (line != null) {
fields = line.split("\t");
}
}
if (expectedTreeModelNames.size() > 0) {
StringBuilder sb = new StringBuilder();
for (String notFoundName : expectedTreeModelNames) {
sb.append("Expecting, but unable to match state parameter:" + notFoundName + "\n");
}
throw new RuntimeException(sb.toString());
}
if (DEBUG) {
System.out.println("\nDouble checking:");
for (Parameter parameter : Parameter.CONNECTED_PARAMETER_SET) {
if (parameter.getParameterName().equals("branchRates.categories.rootNodeNumber")) {
System.out.println(parameter.getParameterName() + ": " + parameter.getParameterValue(0));
}
}
}
if (rngState != null) {
MathUtils.setRandomState(rngState);
}
in.close();
fileIn.close();
// This shouldn't be necessary and if it is then it might be hiding a bug...
// for (Likelihood likelihood : Likelihood.CONNECTED_LIKELIHOOD_SET) {
// likelihood.makeDirty();
// }
} catch (IOException ioe) {
throw new RuntimeException("Unable to read file: " + ioe.getMessage());
}
return state;
}
use of dr.evomodel.tree.TreeParameterModel in project beast-mcmc by beast-dev.
the class BeastCheckpointer method writeStateToFile.
private boolean writeStateToFile(File file, long state, double lnL, MarkovChain markovChain) {
OperatorSchedule operatorSchedule = markovChain.getSchedule();
OutputStream fileOut = null;
try {
fileOut = new FileOutputStream(file);
PrintStream out = new PrintStream(fileOut);
ArrayList<TreeParameterModel> traitModels = new ArrayList<TreeParameterModel>();
int[] rngState = MathUtils.getRandomState();
out.print("rng");
for (int i = 0; i < rngState.length; i++) {
out.print("\t");
out.print(rngState[i]);
}
out.println();
out.print("state\t");
out.println(state);
out.print("lnL\t");
out.println(lnL);
for (Parameter parameter : Parameter.CONNECTED_PARAMETER_SET) {
out.print("parameter");
out.print("\t");
out.print(parameter.getParameterName());
out.print("\t");
out.print(parameter.getDimension());
for (int dim = 0; dim < parameter.getDimension(); dim++) {
out.print("\t");
out.print(parameter.getParameterValue(dim));
}
out.println();
}
for (int i = 0; i < operatorSchedule.getOperatorCount(); i++) {
MCMCOperator operator = operatorSchedule.getOperator(i);
out.print("operator");
out.print("\t");
out.print(operator.getOperatorName());
out.print("\t");
out.print(operator.getAcceptCount());
out.print("\t");
out.print(operator.getRejectCount());
if (operator instanceof CoercableMCMCOperator) {
out.print("\t");
out.print(((CoercableMCMCOperator) operator).getCoercableParameter());
}
out.println();
}
//check up front if there are any TreeParameterModel objects
for (Model model : Model.CONNECTED_MODEL_SET) {
if (model instanceof TreeParameterModel) {
//System.out.println("\nDetected TreeParameterModel: " + ((TreeParameterModel) model).toString());
traitModels.add((TreeParameterModel) model);
}
}
for (Model model : Model.CONNECTED_MODEL_SET) {
if (model instanceof TreeModel) {
out.print("tree");
out.print("\t");
out.println(model.getModelName());
//replace Newick format by printing general graph structure
//out.println(((TreeModel) model).getNewick());
out.println("#node height taxon");
int nodeCount = ((TreeModel) model).getNodeCount();
out.println(nodeCount);
for (int i = 0; i < nodeCount; i++) {
out.print(((TreeModel) model).getNode(i).getNumber());
out.print("\t");
out.print(((TreeModel) model).getNodeHeight(((TreeModel) model).getNode(i)));
if (((TreeModel) model).isExternal(((TreeModel) model).getNode(i))) {
out.print("\t");
out.print(((TreeModel) model).getNodeTaxon(((TreeModel) model).getNode(i)).getId());
}
out.println();
}
out.println("#edges");
out.println("#child-node parent-node L/R-child traits");
out.println(nodeCount);
for (int i = 0; i < nodeCount; i++) {
NodeRef parent = ((TreeModel) model).getParent(((TreeModel) model).getNode(i));
if (parent != null) {
out.print(((TreeModel) model).getNode(i).getNumber());
out.print("\t");
out.print(((TreeModel) model).getParent(((TreeModel) model).getNode(i)).getNumber());
out.print("\t");
if ((((TreeModel) model).getChild(parent, 0) == ((TreeModel) model).getNode(i))) {
//left child
out.print(0);
} else if ((((TreeModel) model).getChild(parent, 1) == ((TreeModel) model).getNode(i))) {
//right child
out.print(1);
} else {
throw new RuntimeException("Operation currently only supported for nodes with 2 children.");
}
for (TreeParameterModel tpm : traitModels) {
out.print("\t");
out.print(tpm.getNodeValue((TreeModel) model, ((TreeModel) model).getNode(i)));
}
out.println();
}
}
}
}
out.close();
fileOut.close();
} catch (IOException ioe) {
System.err.println("Unable to write file: " + ioe.getMessage());
return false;
}
if (DEBUG) {
for (Likelihood likelihood : Likelihood.CONNECTED_LIKELIHOOD_SET) {
System.err.println(likelihood.getId() + ": " + likelihood.getLogLikelihood());
}
}
return true;
}
use of dr.evomodel.tree.TreeParameterModel in project beast-mcmc by beast-dev.
the class CheckPointModifier method readStateFromFile.
private long readStateFromFile(File file, MarkovChain markovChain, double[] lnL) {
OperatorSchedule operatorSchedule = markovChain.getSchedule();
long state = -1;
this.traitModels = new ArrayList<TreeParameterModel>();
try {
FileReader fileIn = new FileReader(file);
BufferedReader in = new BufferedReader(fileIn);
int[] rngState = null;
String line = in.readLine();
String[] fields = line.split("\t");
if (fields[0].equals("rng")) {
// if there is a random number generator state present then load it...
try {
rngState = new int[fields.length - 1];
for (int i = 0; i < rngState.length; i++) {
rngState[i] = Integer.parseInt(fields[i + 1]);
}
} catch (NumberFormatException nfe) {
throw new RuntimeException("Unable to read state number from state file");
}
line = in.readLine();
fields = line.split("\t");
}
try {
if (!fields[0].equals("state")) {
throw new RuntimeException("Unable to read state number from state file");
}
state = Long.parseLong(fields[1]);
} catch (NumberFormatException nfe) {
throw new RuntimeException("Unable to read state number from state file");
}
line = in.readLine();
fields = line.split("\t");
try {
if (!fields[0].equals("lnL")) {
throw new RuntimeException("Unable to read lnL from state file");
}
if (lnL != null) {
lnL[0] = Double.parseDouble(fields[1]);
}
} catch (NumberFormatException nfe) {
throw new RuntimeException("Unable to read lnL from state file");
}
line = in.readLine();
//System.out.println(line);
fields = line.split("\t");
//Tree nodes have numbers as parameter ids
for (Parameter parameter : Parameter.CONNECTED_PARAMETER_SET) {
//numbers should be positive but can include zero
if (isTreeNode(parameter.getId()) && isTreeNode(fields[1]) || parameter.getId().equals(fields[1])) {
int dimension = Integer.parseInt(fields[2]);
if (dimension != parameter.getDimension() && !fields[1].equals("branchRates.categories")) {
System.err.println("Unable to match state parameter dimension: " + dimension + ", expecting " + parameter.getDimension() + " for parameter: " + parameter.getParameterName());
System.err.print("Read from file: ");
for (int i = 0; i < fields.length; i++) {
System.err.print(fields[i] + "\t");
}
System.err.println();
}
if (fields[1].equals("branchRates.categories.rootNodeNumber")) {
// System.out.println("eek");
double value = Double.parseDouble(fields[3]);
parameter.setParameterValue(0, value);
if (DEBUG) {
System.out.println("restoring " + fields[1] + " with value " + value);
}
} else {
if (DEBUG) {
System.out.print("restoring " + fields[1] + " with values ");
}
if (fields[1].equals("branchRates.categories")) {
for (int dim = 0; dim < (fields.length - 3); dim++) {
//System.out.println("dim " + dim);
parameter.setParameterValue(dim, Double.parseDouble(fields[dim + 3]));
if (DEBUG) {
System.out.print(Double.parseDouble(fields[dim + 3]) + " ");
}
}
} else {
for (int dim = 0; dim < parameter.getDimension(); dim++) {
parameter.setParameterValue(dim, Double.parseDouble(fields[dim + 3]));
if (DEBUG) {
System.out.print(Double.parseDouble(fields[dim + 3]) + " ");
}
}
}
if (DEBUG) {
System.out.println();
}
}
line = in.readLine();
//System.out.println(line);
fields = line.split("\t");
} else {
//there will be more parameters in the connected set than there are lines in the checkpoint file
//do nothing and just keep iterating over the parameters in the connected set
}
}
//No changes needed for loading in operators
for (int i = 0; i < operatorSchedule.getOperatorCount(); i++) {
MCMCOperator operator = operatorSchedule.getOperator(i);
if (!fields[1].equals(operator.getOperatorName())) {
throw new RuntimeException("Unable to match operator: " + fields[1]);
}
if (fields.length < 4) {
throw new RuntimeException("Operator missing values: " + fields[1]);
}
operator.setAcceptCount(Integer.parseInt(fields[2]));
operator.setRejectCount(Integer.parseInt(fields[3]));
if (operator instanceof CoercableMCMCOperator) {
if (fields.length != 5) {
throw new RuntimeException("Coercable operator missing parameter: " + fields[1]);
}
((CoercableMCMCOperator) operator).setCoercableParameter(Double.parseDouble(fields[4]));
}
line = in.readLine();
fields = line.split("\t");
}
// load the tree models last as we get the node heights from the tree (not the parameters which
// which may not be associated with the right node
Set<String> expectedTreeModelNames = new HashSet<String>();
for (Model model : Model.CONNECTED_MODEL_SET) {
if (model instanceof TreeModel) {
expectedTreeModelNames.add(model.getModelName());
}
if (model instanceof TreeParameterModel) {
this.traitModels.add((TreeParameterModel) model);
}
if (model instanceof BranchRates) {
this.rateModel = (BranchRates) model;
}
}
while (fields[0].equals("tree")) {
for (Model model : Model.CONNECTED_MODEL_SET) {
if (model instanceof TreeModel && fields[1].equals(model.getModelName())) {
//AR: Can we not just add them to a Flexible tree and then make a new TreeModel
//taking that in the constructor?
//internally, we have a tree with all the taxa
//externally, i.e. in the checkpoint file, we have a tree representation comprising
//a subset of the full taxa set
//write method that adjusts the internal representation, i.e. the one in the connected
//set, according to the checkpoint file and a distance-based approach to position
//the additional taxa
//first read in all the data from the checkpoint file
line = in.readLine();
line = in.readLine();
fields = line.split("\t");
//read number of nodes
int nodeCount = Integer.parseInt(fields[0]);
double[] nodeHeights = new double[nodeCount];
String[] taxaNames = new String[(nodeCount + 1) / 2];
for (int i = 0; i < nodeCount; i++) {
line = in.readLine();
fields = line.split("\t");
nodeHeights[i] = Double.parseDouble(fields[1]);
if (i < taxaNames.length) {
taxaNames[i] = fields[2];
}
}
//on to reading edge information
line = in.readLine();
line = in.readLine();
line = in.readLine();
fields = line.split("\t");
int edgeCount = Integer.parseInt(fields[0]);
//create data matrix of doubles to store information from list of TreeParameterModels
double[][] traitValues = new double[traitModels.size()][edgeCount];
//create array to store whether a node is left or right child of its parent
//can be important for certain tree transition kernels
int[] childOrder = new int[edgeCount];
for (int i = 0; i < childOrder.length; i++) {
childOrder[i] = -1;
}
int[] parents = new int[edgeCount];
for (int i = 0; i < edgeCount; i++) {
parents[i] = -1;
}
for (int i = 0; i < edgeCount; i++) {
line = in.readLine();
if (line != null) {
fields = line.split("\t");
parents[Integer.parseInt(fields[0])] = Integer.parseInt(fields[1]);
childOrder[i] = Integer.parseInt(fields[2]);
for (int j = 0; j < traitModels.size(); j++) {
traitValues[j][i] = Double.parseDouble(fields[3 + j]);
}
}
}
//perform magic with the acquired information
//CheckPointTreeModifier modifyTree = new CheckPointTreeModifier((TreeModel) model);
this.modifyTree = new CheckPointTreeModifier((TreeModel) model);
modifyTree.adoptTreeStructure(parents, nodeHeights, childOrder, taxaNames);
if (traitModels.size() > 0) {
modifyTree.adoptTraitData(parents, this.traitModels, traitValues);
}
//adopt the loaded tree structure; this does not yet copy the traits on the branches
//((TreeModel) model).beginTreeEdit();
//((TreeModel) model).adoptTreeStructure(parents, nodeHeights, childOrder);
//((TreeModel) model).endTreeEdit();
expectedTreeModelNames.remove(model.getModelName());
}
}
line = in.readLine();
if (line != null) {
fields = line.split("\t");
}
}
if (expectedTreeModelNames.size() > 0) {
StringBuilder sb = new StringBuilder();
for (String notFoundName : expectedTreeModelNames) {
sb.append("Expecting, but unable to match state parameter:" + notFoundName + "\n");
}
throw new RuntimeException(sb.toString());
}
in.close();
fileIn.close();
} catch (IOException ioe) {
throw new RuntimeException("Unable to read file: " + ioe.getMessage());
}
return state;
}
use of dr.evomodel.tree.TreeParameterModel in project beast-mcmc by beast-dev.
the class CheckPointTreeModifier method interpolateTraitValues.
/**
* The newly added taxa still need to be provided with trait values if there are any.
* @param traitModels List of the trait models for which trait values need to be imputed / interpolated.
*/
public void interpolateTraitValues(ArrayList<TreeParameterModel> traitModels) {
System.out.println();
for (TreeParameterModel tpm : traitModels) {
int numberOfInterpolations = 0;
for (int i = 0; i < treeModel.getNodeCount(); i++) {
if (tpm.getNodeValue(treeModel, treeModel.getNode(i)) == -1.0) {
System.out.println("Current trait = -1.0 for node: " + treeModel.getNode(i));
numberOfInterpolations++;
double newValue = -1.0;
//get trait value from sibling
NodeRef parent = treeModel.getParent(treeModel.getNode(i));
for (int j = 0; j < treeModel.getChildCount(parent); j++) {
NodeRef child = treeModel.getChild(parent, j);
if (tpm.getNodeValue(treeModel, child) != -1.0) {
tpm.setNodeValue(treeModel, treeModel.getNode(i), tpm.getNodeValue(treeModel, child) + 1.0);
System.out.println("Checking sibling trait.");
System.out.println("Setting node trait for node " + treeModel.getNode(i) + " to " + tpm.getNodeValue(treeModel, treeModel.getNode(i)));
break;
}
}
//if not successful, get trait from its parent
if (tpm.getNodeValue(treeModel, treeModel.getNode(i)) == -1.0) {
NodeRef currentNode = treeModel.getNode(i);
//TODO Check for situations where no proper trait can be found
while (currentNode != treeModel.getRoot() && tpm.getNodeValue(treeModel, currentNode) == -1.0) {
currentNode = treeModel.getParent(currentNode);
}
tpm.setNodeValue(treeModel, treeModel.getNode(i), tpm.getNodeValue(treeModel, currentNode) + 1.0);
System.out.println("Checking parent trait.");
System.out.println("Setting node trait for node " + treeModel.getNode(i) + " to " + tpm.getNodeValue(treeModel, currentNode));
}
//adjust the other trait values after a trait has been imputed
for (int j = 0; j < treeModel.getNodeCount(); j++) {
if (treeModel.getNode(j) != treeModel.getNode(i)) {
if (tpm.getNodeValue(treeModel, treeModel.getNode(j)) >= tpm.getNodeValue(treeModel, treeModel.getNode(i))) {
System.out.print("Updating trait from " + tpm.getNodeValue(treeModel, treeModel.getNode(j)));
tpm.setNodeValue(treeModel, treeModel.getNode(j), tpm.getNodeValue(treeModel, treeModel.getNode(j)) + 1.0);
System.out.println(" to " + tpm.getNodeValue(treeModel, treeModel.getNode(j)));
}
}
}
}
/*if (tpm.getNodeValue(treeModel, treeModel.getNode(i)) == -1.0) {
for (int j = 0; j < treeModel.getNodeCount(); j++) {
if (treeModel.getNode(j) != treeModel.getNode(i)) {
if (tpm.getNodeValue(treeModel, treeModel.getNode(j)) >= tpm.getNodeValue(treeModel, treeModel.getNode(i))) {
System.out.print("Updating trait from " + tpm.getNodeValue(treeModel, treeModel.getNode(j)));
tpm.setNodeValue(treeModel, treeModel.getNode(j), tpm.getNodeValue(treeModel, treeModel.getNode(j)) + 1.0);
System.out.println(" to " + tpm.getNodeValue(treeModel, treeModel.getNode(j)));
}
}
}
}*/
}
System.out.println("Number of interpolations: " + numberOfInterpolations);
}
System.out.println("Done.\n");
}
use of dr.evomodel.tree.TreeParameterModel in project beast-mcmc by beast-dev.
the class CheckPointTreeModifier method adoptTraitData.
/**
* Imports trait information from a file
* @param edges Edges are provided as index: child number; parent: array entry
* @param traitModels List of TreeParameterModel object that contain trait information
* @param traitValues Values to be copied into the List of TreeParameterModel objects
*/
//TODO Small difference in reconstructed log likelihood, probably due to increased number of rate categories
public void adoptTraitData(int[] edges, ArrayList<TreeParameterModel> traitModels, double[][] traitValues) {
int index = 0;
for (TreeParameterModel tpm : traitModels) {
int k = 0;
for (int i = 0; i < edges.length; i++) {
System.out.println(i + " " + edges[i]);
if (edges[i] != -1) {
//TODO Seems like I messed up here
if (i < (treeModel.getExternalNodeCount() - additionalTaxa)) {
tpm.setNodeValue(this.treeModel, this.treeModel.getExternalNode(nodeMap[i]), traitValues[index][k]);
System.out.println("Setting external node " + this.treeModel.getExternalNode(nodeMap[i]) + " to " + traitValues[index][k]);
} else {
tpm.setNodeValue(this.treeModel, this.treeModel.getNode(i + additionalTaxa), traitValues[index][k]);
System.out.println("Setting internal node " + this.treeModel.getNode(i + additionalTaxa) + " to " + traitValues[index][k]);
}
} else {
k--;
}
k++;
}
//set trait of remaining internal nodes to -1.0
for (int i = 0; i < additionalTaxa; i++) {
tpm.setNodeValue(this.treeModel, treeModel.getNode(treeModel.getNodeCount() - 1 - i), -1.0);
}
//set trait of newly added external taxa to -1.0
int shift = 0;
for (int i = 0; i < (treeModel.getExternalNodeCount() - additionalTaxa); i++) {
System.out.println("i = " + i + " ; nodeMap[i] = " + nodeMap[i]);
}
System.out.println();
for (String name : newTaxaNames) {
System.out.println("new taxon: " + name);
}
int externalMissing = 0;
for (String name : newTaxaNames) {
for (int i = 0; i < treeModel.getExternalNodeCount(); i++) {
if (treeModel.getNodeTaxon(treeModel.getExternalNode(i)).getId().equals(name)) {
externalMissing++;
tpm.setNodeValue(this.treeModel, this.treeModel.getExternalNode(i), -1.0);
}
}
}
System.out.println("External nodes with trait set to -1.0 = " + externalMissing + "\n");
/*for (int i = 0; i < (treeModel.getExternalNodeCount()-additionalTaxa); i++) {
System.out.println("i = " + i + " ; nodeMap[i] = " + nodeMap[i]);
if (i != (nodeMap[i]-shift)) {
int difference = nodeMap[i] - i;
shift = difference;
tpm.setNodeValue(this.treeModel, this.treeModel.getExternalNode(nodeMap[i]-1), -1.0);
System.out.println("Setting external node: " + (nodeMap[i]-1));
externalMissing++;
}
}
System.out.println("External node with trait set to -1.0 = " + externalMissing);
index++;*/
}
}
Aggregations