#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 + 1.0;
+ aboveCutoff = cutoff + 10000.0;
m = MothurOut::getInstance();
- globaldata = GlobalData::getInstance();
}
catch(exception& e) {
m->errorOut(e, "ClusterClassic", "ClusterClassic");
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; }
- }
+ //}
index++;
reading->update(index);
}
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]);
//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);
}
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 (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]);
rabund = new RAbundVector(list->getRAbundVector());
fileHandle.close();
+
+ return 0;
}
catch(exception& e) {
m->errorOut(e, "ClusterClassic", "readPhylipFile");
//sets smallCol and smallRow, returns distance
double ClusterClassic::getSmallCell() {
try {
-
+
smallDist = aboveCutoff;
smallRow = 1;
smallCol = 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;
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;
/***********************************************************************/
void ClusterClassic::update(double& cutOFF){
try {
-//cout << "before update " << endl;
//print();
getSmallCell();
int r, c;
r = smallRow; c = smallCol;
- //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 = aboveCutoff; rowSmallDists[r].row = 0; rowSmallDists[r].col = 0;
- //rowSmallDists[c].dist = aboveCutoff; rowSmallDists[c].row = 0; rowSmallDists[c].col = 0;
-
- //if your rows smallest distance is from smallRow or smallCol, reset
- //for(int i=0;i<nseqs;i++){
- //if ((rowSmallDists[i].row == r) || (rowSmallDists[i].row == c) || (rowSmallDists[i].col == r) || (rowSmallDists[i].col == c)) {
- // rowSmallDists[i].dist = aboveCutoff; rowSmallDists[i].row = 0; rowSmallDists[i].col = 0;
- //}
- //}
-
+
for(int i=0;i<nseqs;i++){
if(i != r && i != c){
double distRow, distCol, newDist;
if (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(method == "furthest"){
newDist = max(distRow, distCol);
}
else if (method == "average"){
- if ((distRow == aboveCutoff) && (distCol == aboveCutoff)) { //you are merging with a value above cutoff
- newDist = aboveCutoff; //eliminate value
- }else if ((distRow == aboveCutoff) && (distCol != aboveCutoff)) { //you are merging with a value above cutoff
- newDist = aboveCutoff; //eliminate value
- if (cutOFF > distCol) { cutOFF = distCol; }
- }else if ((distRow != aboveCutoff) && (distCol == aboveCutoff)) { //you are merging with a value above cutoff
- newDist = aboveCutoff; //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 == aboveCutoff) && (distCol == aboveCutoff)) { //you are merging with a value above cutoff
- newDist = aboveCutoff; //eliminate value
- }else if ((distRow == aboveCutoff) && (distCol != aboveCutoff)) { //you are merging with a value above cutoff
- newDist = aboveCutoff; //eliminate value
- if (cutOFF > distCol) { cutOFF = distCol; }
- }else if ((distRow != aboveCutoff) && (distCol == aboveCutoff)) { //you are merging with a value above cutoff
- newDist = aboveCutoff; //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;i<nseqs;i++){
+ for(int j=c+1;j<dMatrix[i].size();j++){
+ dMatrix[i][j-1]=dMatrix[i][j];
+ }
+ }
- //cout << "after update " << endl;
- //print();
+ //resize each col
+ for(int i=c+1;i<nseqs;i++){
+ for(int j=0;j < dMatrix[i-1].size();j++){
+ dMatrix[i-1][j]=dMatrix[i][j];
+ }
+ }
+
+ nseqs--;
+ dMatrix.pop_back();*/
+
}
catch(exception& e) {
m->errorOut(e, "ClusterClassic", "update");