X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=clusterclassic.cpp;h=0048dc6053d0bab06130eeaa6ab5d10b576aeb48;hb=8dd3c225255d7084e3aff8740aa4f1f1cabb367a;hp=7a701aa27e0374083d274386bb89509a4816b40d;hpb=6cf9539162b0fb0b5c0b99673e999df3cd717c55;p=mothur.git diff --git a/clusterclassic.cpp b/clusterclassic.cpp index 7a701aa..0048dc6 100644 --- a/clusterclassic.cpp +++ b/clusterclassic.cpp @@ -11,14 +11,14 @@ #include "progress.hpp" /***********************************************************************/ -ClusterClassic::ClusterClassic(float c, string f) : method(f), smallDist(1e6), nseqs(0) { +ClusterClassic::ClusterClassic(float c, string f, bool s) : method(f), smallDist(1e6), nseqs(0), sim(s) { try { mapWanted = false; //set to true by mgcluster to speed up overlap merge //save so you can modify as it changes in average neighbor cutoff = c; + aboveCutoff = cutoff + 10000.0; m = MothurOut::getInstance(); - globaldata = GlobalData::getInstance(); } catch(exception& e) { m->errorOut(e, "ClusterClassic", "ClusterClassic"); @@ -51,10 +51,10 @@ int ClusterClassic::readPhylipFile(string filename, NameAssignment* nameMap) { //initialize distance matrix to cutoff dMatrix.resize(nseqs); - colDist temp(0, 0, cutoff); - rowSmallDists.resize(nseqs, temp); + //colDist temp(0, 0, aboveCutoff); + //rowSmallDists.resize(nseqs, temp); for (int i = 1; i < nseqs; i++) { - dMatrix[i].resize(i, cutoff); + dMatrix[i].resize(i, aboveCutoff); } @@ -101,14 +101,14 @@ int ClusterClassic::readPhylipFile(string filename, NameAssignment* nameMap) { fileHandle >> distance; if (distance == -1) { distance = 1000000; } - else if (globaldata->sim) { distance = 1.0 - distance; } //user has entered a sim matrix that we need to convert. + else if (sim) { distance = 1.0 - distance; } //user has entered a sim matrix that we need to convert. - if(distance < cutoff){ + //if(distance < cutoff){ dMatrix[i][j] = distance; if (distance < smallDist) { smallDist = distance; } - if (rowSmallDists[i].dist > distance) { rowSmallDists[i].dist = distance; rowSmallDists[i].col = j; rowSmallDists[i].row = i; } - if (rowSmallDists[j].dist > distance) { rowSmallDists[j].dist = distance; rowSmallDists[j].col = i; rowSmallDists[j].row = j; } - } + //if (rowSmallDists[i].dist > distance) { rowSmallDists[i].dist = distance; rowSmallDists[i].col = j; rowSmallDists[i].row = i; } + //if (rowSmallDists[j].dist > distance) { rowSmallDists[j].dist = distance; rowSmallDists[j].col = i; rowSmallDists[j].row = j; } + //} index++; reading->update(index); } @@ -123,9 +123,9 @@ int ClusterClassic::readPhylipFile(string filename, NameAssignment* nameMap) { if (m->control_pressed) { delete reading; fileHandle.close(); return 0; } if (distance == -1) { distance = 1000000; } - else if (globaldata->sim) { distance = 1.0 - distance; } //user has entered a sim matrix that we need to convert. + else if (sim) { distance = 1.0 - distance; } //user has entered a sim matrix that we need to convert. - if(distance < cutoff){ + //if(distance < cutoff){ if (distance < smallDist) { smallDist = distance; } int row = nameMap->get(matrixNames[i]); @@ -134,9 +134,9 @@ int ClusterClassic::readPhylipFile(string filename, NameAssignment* nameMap) { if (row < col) { dMatrix[col][row] = distance; } else { dMatrix[row][col] = distance; } - if (rowSmallDists[row].dist > distance) { rowSmallDists[row].dist = distance; rowSmallDists[row].col = col; rowSmallDists[row].row = row; } - if (rowSmallDists[col].dist > distance) { rowSmallDists[col].dist = distance; rowSmallDists[col].col = row; rowSmallDists[col].row = col; } - } + //if (rowSmallDists[row].dist > distance) { rowSmallDists[row].dist = distance; rowSmallDists[row].col = col; rowSmallDists[row].row = row; } + //if (rowSmallDists[col].dist > distance) { rowSmallDists[col].dist = distance; rowSmallDists[col].col = row; rowSmallDists[col].row = col; } + //} index++; reading->update(index); } @@ -161,14 +161,14 @@ int ClusterClassic::readPhylipFile(string filename, NameAssignment* nameMap) { if (m->control_pressed) { fileHandle.close(); delete reading; return 0; } if (distance == -1) { distance = 1000000; } - else if (globaldata->sim) { distance = 1.0 - distance; } //user has entered a sim matrix that we need to convert. + else if (sim) { distance = 1.0 - distance; } //user has entered a sim matrix that we need to convert. - if(distance < cutoff && j < i){ + if(j < i){ if (distance < smallDist) { smallDist = distance; } dMatrix[i][j] = distance; - if (rowSmallDists[i].dist > distance) { rowSmallDists[i].dist = distance; rowSmallDists[i].col = j; rowSmallDists[i].row = i; } - if (rowSmallDists[j].dist > distance) { rowSmallDists[j].dist = distance; rowSmallDists[j].col = i; rowSmallDists[j].row = j; } + //if (rowSmallDists[i].dist > distance) { rowSmallDists[i].dist = distance; rowSmallDists[i].col = j; rowSmallDists[i].row = i; } + //if (rowSmallDists[j].dist > distance) { rowSmallDists[j].dist = distance; rowSmallDists[j].col = i; rowSmallDists[j].row = j; } } index++; reading->update(index); @@ -184,9 +184,9 @@ int ClusterClassic::readPhylipFile(string filename, NameAssignment* nameMap) { if (m->control_pressed) { fileHandle.close(); delete reading; return 0; } if (distance == -1) { distance = 1000000; } - else if (globaldata->sim) { distance = 1.0 - distance; } //user has entered a sim matrix that we need to convert. + else if (sim) { distance = 1.0 - distance; } //user has entered a sim matrix that we need to convert. - if(distance < cutoff && j < i){ + if(j < i){ if (distance < smallDist) { smallDist = distance; } int row = nameMap->get(matrixNames[i]); @@ -195,8 +195,8 @@ int ClusterClassic::readPhylipFile(string filename, NameAssignment* nameMap) { if (row < col) { dMatrix[col][row] = distance; } else { dMatrix[row][col] = distance; } - if (rowSmallDists[row].dist > distance) { rowSmallDists[row].dist = distance; rowSmallDists[row].col = col; rowSmallDists[row].row = row; } - if (rowSmallDists[col].dist > distance) { rowSmallDists[col].dist = distance; rowSmallDists[col].col = row; rowSmallDists[col].row = col; } + //if (rowSmallDists[row].dist > distance) { rowSmallDists[row].dist = distance; rowSmallDists[row].col = col; rowSmallDists[row].row = row; } + //if (rowSmallDists[col].dist > distance) { rowSmallDists[col].dist = distance; rowSmallDists[col].col = row; rowSmallDists[col].row = col; } } index++; reading->update(index); @@ -214,6 +214,8 @@ int ClusterClassic::readPhylipFile(string filename, NameAssignment* nameMap) { rabund = new RAbundVector(list->getRAbundVector()); fileHandle.close(); + + return 0; } catch(exception& e) { m->errorOut(e, "ClusterClassic", "readPhylipFile"); @@ -225,21 +227,25 @@ int ClusterClassic::readPhylipFile(string filename, NameAssignment* nameMap) { //sets smallCol and smallRow, returns distance double ClusterClassic::getSmallCell() { try { - - smallDist = cutoff; + + smallDist = aboveCutoff; smallRow = 1; smallCol = 0; vector mins; - for(int i=0;iget(smallRow) << '\t' << rabund->get(smallCol); - rabund->set(smallCol, rabund->get(smallRow)+rabund->get(smallCol)); - rabund->set(smallRow, 0); + rabund->set(smallRow, rabund->get(smallRow)+rabund->get(smallCol)); + rabund->set(smallCol, 0); + /*for (int i = smallCol+1; i < rabund->size(); i++) { + rabund->set((i-1), rabund->get(i)); + } + rabund->resize((rabund->size()-1));*/ rabund->setLabel(toString(smallDist)); // cout << '\t' << rabund->get(smallRow) << '\t' << rabund->get(smallCol) << endl; @@ -289,8 +299,12 @@ void ClusterClassic::clusterNames(){ // cout << smallCol << '\t' << smallRow << '\t' << smallDist << '\t' << list->get(smallRow) << '\t' << list->get(smallCol); if (mapWanted) { updateMap(); } - list->set(smallCol, list->get(smallRow)+','+list->get(smallCol)); - list->set(smallRow, ""); + list->set(smallRow, list->get(smallRow)+','+list->get(smallCol)); + list->set(smallCol, ""); + /*for (int i = smallCol+1; i < list->size(); i++) { + list->set((i-1), list->get(i)); + } + list->resize((list->size()-1));*/ list->setLabel(toString(smallDist)); // cout << '\t' << list->get(smallRow) << '\t' << list->get(smallCol) << endl; @@ -303,102 +317,62 @@ void ClusterClassic::clusterNames(){ /***********************************************************************/ void ClusterClassic::update(double& cutOFF){ try { -//cout << "before update " << endl; //print(); getSmallCell(); int r, c; - //because we only store lt, we need to make sure we grab the right location - if (smallRow < smallCol) { c = smallRow; r = smallCol; } //smallRow is really our column value - else { r = smallRow; c = smallCol; } //smallRow is the row value - - //reset rows smallest distance - rowSmallDists[r].dist = cutoff; rowSmallDists[r].row = 0; rowSmallDists[r].col = 0; - rowSmallDists[c].dist = cutoff; rowSmallDists[c].row = 0; rowSmallDists[c].col = 0; - - //if your rows smallest distance is from smallRow or smallCol, reset - for(int i=0;i r) { distRow = dMatrix[i][r]; } else { distRow = dMatrix[r][i]; } + + if (i > c) { distCol = dMatrix[i][c]; dMatrix[i][c] = aboveCutoff; } //like removeCell + else { distCol = dMatrix[c][i]; dMatrix[c][i] = aboveCutoff; } - if (i > c) { distCol = dMatrix[i][c]; dMatrix[i][c] = cutoff; } //like removeCell - else { distCol = dMatrix[c][i]; dMatrix[c][i] = cutoff; } - if(method == "furthest"){ newDist = max(distRow, distCol); } else if (method == "average"){ - if ((distRow == cutoff) && (distCol == cutoff)) { //you are merging with a value above cutoff - newDist = cutoff; //eliminate value - }else if ((distRow == cutoff) && (distCol != cutoff)) { //you are merging with a value above cutoff - newDist = cutoff; //eliminate value - if (cutOFF > distCol) { cutOFF = distCol; } - }else if ((distRow != cutoff) && (distCol == cutoff)) { //you are merging with a value above cutoff - newDist = cutoff; //eliminate value - if (cutOFF > distRow) { cutOFF = distRow; } - }else { - int rowBin = rabund->get(r); - int colBin = rabund->get(c); - newDist = (colBin * distCol + rowBin * distRow) / (rowBin + colBin); - } + int rowBin = rabund->get(r); + int colBin = rabund->get(c); + newDist = (colBin * distCol + rowBin * distRow) / (rowBin + colBin); } else if (method == "weighted"){ - if ((distRow == cutoff) && (distCol == cutoff)) { //you are merging with a value above cutoff - newDist = cutoff; //eliminate value - }else if ((distRow == cutoff) && (distCol != cutoff)) { //you are merging with a value above cutoff - newDist = cutoff; //eliminate value - if (cutOFF > distCol) { cutOFF = distCol; } - }else if ((distRow != cutoff) && (distCol == cutoff)) { //you are merging with a value above cutoff - newDist = cutoff; //eliminate value - if (cutOFF > distRow) { cutOFF = distRow; } - }else { - newDist = (distCol + distRow) / 2.0; - } + newDist = (distCol + distRow) / 2.0; } else if (method == "nearest"){ newDist = min(distRow, distCol); } - + //cout << "newDist = " << newDist << endl; if (i > r) { dMatrix[i][r] = newDist; } else { dMatrix[r][i] = newDist; } - if (newDist < rowSmallDists[i].dist) { rowSmallDists[i].dist = newDist; rowSmallDists[i].col = r; rowSmallDists[i].row = i; } } - //cout << "rowsmall = " << i << '\t' << rowSmallDists[i].dist << endl; } clusterBins(); clusterNames(); - - //find new small for 2 rows we just merged - colDist temp(0,0,100.0); - rowSmallDists[r] = temp; - - for (int i = 0; i < dMatrix[r].size(); i++) { - if (dMatrix[r][i] < rowSmallDists[r].dist) { rowSmallDists[r].dist = dMatrix[r][i]; rowSmallDists[r].col = r; rowSmallDists[r].row = i; } - } - for (int i = dMatrix[r].size()+1; i < dMatrix.size(); i++) { - if (dMatrix[i][dMatrix[r].size()] < rowSmallDists[r].dist) { rowSmallDists[r].dist = dMatrix[i][dMatrix[r].size()]; rowSmallDists[r].col = r; rowSmallDists[r].row = i; } - } - rowSmallDists[c] = temp; - for (int i = 0; i < dMatrix[c].size(); i++) { - if (dMatrix[c][i] < rowSmallDists[c].dist) { rowSmallDists[c].dist = dMatrix[c][i]; rowSmallDists[c].col = c; rowSmallDists[c].row = i; } - } - for (int i = dMatrix[c].size()+1; i < dMatrix.size(); i++) { - if (dMatrix[i][dMatrix[c].size()] < rowSmallDists[c].dist) { rowSmallDists[c].dist = dMatrix[i][dMatrix[c].size()]; rowSmallDists[c].col = c; rowSmallDists[c].row = i; } - } + //resize each row + /*for(int i=0;ierrorOut(e, "ClusterClassic", "update");