X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=tree.cpp;h=44ecadd534b60d60b602d9e052259ac69709f9d3;hb=72e0be6b9c80009d4dbee24e8d690ad9514dc6fb;hp=7c9671bf9a91e02b23cfd40b44804c38e3e4354d;hpb=f55cf350ca6643f8eb070d8336e1957699a3f109;p=mothur.git diff --git a/tree.cpp b/tree.cpp index 7c9671b..44ecadd 100644 --- a/tree.cpp +++ b/tree.cpp @@ -92,7 +92,6 @@ Tree::Tree(TreeMap* t, vector< vector >& sims) : tmap(t) { m = MothurOut::getInstance(); if (m->runParse == true) { parseTreeFile(); m->runParse = false; } - //for(int i = 0; i < globaldata->Treenames.size(); i++) { cout << i << '\t' << globaldata->Treenames[i] << endl; } numLeaves = m->Treenames.size(); numNodes = 2*numLeaves - 1; @@ -134,12 +133,11 @@ Tree::Tree(TreeMap* t, vector< vector >& sims) : tmap(t) { //build tree from matrix //initialize indexes map indexes; //maps row in simMatrix to vector index in the tree - int numGroups = (tmap->getNamesOfGroups()).size(); - for (int g = 0; g < numGroups; g++) { indexes[g] = g; } + for (int g = 0; g < numLeaves; g++) { indexes[g] = g; } //do merges and create tree structure by setting parents and children //there are numGroups - 1 merges to do - for (int i = 0; i < (numGroups - 1); i++) { + for (int i = 0; i < (numLeaves - 1); i++) { float largest = -1000.0; if (m->control_pressed) { break; } @@ -154,11 +152,11 @@ Tree::Tree(TreeMap* t, vector< vector >& sims) : tmap(t) { //set non-leaf node info and update leaves to know their parents //non-leaf - tree[numGroups + i].setChildren(indexes[row], indexes[column]); + tree[numLeaves + i].setChildren(indexes[row], indexes[column]); //parents - tree[indexes[row]].setParent(numGroups + i); - tree[indexes[column]].setParent(numGroups + i); + tree[indexes[row]].setParent(numLeaves + i); + tree[indexes[column]].setParent(numLeaves + i); //blength = distance / 2; float blength = ((1.0 - largest) / 2); @@ -168,12 +166,12 @@ Tree::Tree(TreeMap* t, vector< vector >& sims) : tmap(t) { tree[indexes[column]].setBranchLength(blength - tree[indexes[column]].getLengthToLeaves()); //set your length to leaves to your childs length plus branchlength - tree[numGroups + i].setLengthToLeaves(tree[indexes[row]].getLengthToLeaves() + tree[indexes[row]].getBranchLength()); + tree[numLeaves + i].setLengthToLeaves(tree[indexes[row]].getLengthToLeaves() + tree[indexes[row]].getBranchLength()); //update index - indexes[row] = numGroups+i; - indexes[column] = numGroups+i; + indexes[row] = numLeaves+i; + indexes[column] = numLeaves+i; //remove highest value that caused the merge. sims[row][column] = -1000.0; @@ -590,6 +588,37 @@ int Tree::populateNewTree(vector& oldtree, int node, int& index) { } } /*****************************************************************/ +void Tree::getCopy(Tree* copy, map nameMap) { + try { + + //for each node in the tree copy its info + for (int i = 0; i < numNodes; i++) { + //copy branch length + tree[i].setBranchLength(copy->tree[i].getBranchLength()); + + //copy parent + tree[i].setParent(copy->tree[i].getParent()); + + //copy children + tree[i].setChildren(copy->tree[i].getLChild(), copy->tree[i].getRChild()); + } + + if (nameMap.size() != 0) { addNamesToCounts(nameMap); } + + //build the pGroups in non leaf nodes to be used in the parsimony calcs. + for (int i = numLeaves; i < numNodes; i++) { + if (m->control_pressed) { break; } + + tree[i].pGroups = (mergeGroups(i)); + tree[i].pcount = (mergeGcounts(i)); + } + } + catch(exception& e) { + m->errorOut(e, "Tree", "getCopy"); + exit(1); + } +} +/*****************************************************************/ void Tree::getCopy(Tree* copy) { try {