X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=fullmatrix.cpp;fp=fullmatrix.cpp;h=6c09639fcbb4c48497ba2b17a61851ba2435c6af;hb=2d2fbc80f9359b19873ba3e63970b58f4f8f49f3;hp=6151a65202901fa24ec6ff91166017a682483c62;hpb=9ca2caadbeac83bb84b3330d9204b1b659d62941;p=mothur.git diff --git a/fullmatrix.cpp b/fullmatrix.cpp index 6151a65..6c09639 100644 --- a/fullmatrix.cpp +++ b/fullmatrix.cpp @@ -78,7 +78,6 @@ void FullMatrix::readSquareMatrix(ifstream& filehandle) { reading = new Progress("Reading matrix: ", numSeqs * numSeqs); int count = 0; - float distance; string group, name; @@ -92,9 +91,8 @@ void FullMatrix::readSquareMatrix(ifstream& filehandle) { if(group == "not found") { cout << "Error: Sequence '" << name << "' was not found in the group file, please correct." << endl; exit(1); } for(int j=0;j> distance; - - matrix[i][j] = distance; + filehandle >> matrix[i][j]; + count++; reading->update(count); } @@ -161,7 +159,7 @@ void FullMatrix::sortGroups(int low, int high){ int i = low; int j = high; - int y = 0; + float y = 0; string name; /* compare value */ @@ -235,7 +233,7 @@ void FullMatrix::printMatrix(ostream& out) { for (int i = 0; i < numSeqs; i++) { out << "row " << i << " group = " << index[i].groupname << " name = " << index[i].seqName << endl; for (int j = 0; j < numSeqs; j++) { - out << matrix[i][j] << " "; + //out << matrix[i][j] << " "; } out << endl; } @@ -252,57 +250,105 @@ void FullMatrix::printMatrix(ostream& out) { } /**************************************************************************/ -void FullMatrix::getMinsForRowsVectors(){ +void FullMatrix::setBounds(){ try{ numGroups = globaldata->gGroupmap->namesOfGroups.size(); //sort globaldata->gGroupmap.namesOfGroups so that it will match the matrix sort(globaldata->gGroupmap->namesOfGroups.begin(), globaldata->gGroupmap->namesOfGroups.end()); + //one for each comparision + //minsForRows.resize(numGroups*numGroups); + /*************************************************/ //find where in matrix each group starts and stops /*************************************************/ - vector bounds; //bounds[1] = starting row in matrix from group B, bounds[2] = starting row in matrix from group C, bounds[3] = no need to find upper bound of C because its numSeqs. bounds.resize(numGroups); bounds[0] = 0; - bounds[numGroups] = numSeqs-1; + bounds[numGroups] = numSeqs; + //for each group find bounds of subgroup/comparison for (int i = 1; i < numGroups; i++) { - getBounds(bounds[i], globaldata->gGroupmap->namesOfGroups[i]); + getBounds(bounds[i], globaldata->gGroupmap->namesOfGroups[i-1]); } + } + catch(exception& e) { + cout << "Standard Error: " << e.what() << " has occurred in the FullMatrix class Function getMinsForRowsVectors. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; + exit(1); + } + catch(...) { + cout << "An unknown error has occurred in the FullMatrix class function getMinsForRowsVectors. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; + exit(1); + } + +} +/**************************************************************************/ +vector FullMatrix::getMins(int x) { + try{ + //clear out old data + minsForRows.clear(); + /************************************************************/ - //fill the minsForRows vectors for each group the user wants + //fill the minsForRows vector for the box the user wants /************************************************************/ - int countx = bounds[1]; //where second group starts - int county = bounds[1]; + int count = 0; + int lowBoundx = bounds[0]; //where first group starts + int lowBoundy = bounds[0]; + int highBoundx = bounds[1]; //where second group starts + int highBoundy = bounds[1]; - //go through the entire matrix - for (int x = 0; x < numSeqs; x++) { - for (int y = 0; y < numSeqs; y++) { - //if have not changed groups - if ((x < countx) && (y < county)) { - - } + int countx = 1; //index in bound + int county = 1; //index in bound + + //find the bounds for the box the user wants + for (int i = 0; i < (numGroups * numGroups); i++) { + + //are you at the box? + if (count == x) { break; } + else { count++; } + + //move to next box + if (county < numGroups) { + county++; + highBoundy = bounds[county]; + lowBoundy = bounds[county-1]; + }else{ //you are moving to a new row of "boxes" + county = 1; + countx++; + highBoundx = bounds[countx]; + lowBoundx = bounds[countx-1]; + highBoundy = bounds[county]; + lowBoundy = bounds[county-1]; } } - + //each row in the box + for (int x = lowBoundx; x < highBoundx; x++) { + float min4Row = 100000.0; + //each entry in that row + for (int y = lowBoundy; y < highBoundy; y++) { + //if you are not on the diagonal and you are less than previous minimum + if ((x != y) && (matrix[x][y] < min4Row)) { + min4Row = matrix[x][y]; + } + } + //save minimum value for that row in minsForRows vector of vectors + minsForRows.push_back(min4Row); + } - + return minsForRows; } catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the FullMatrix class Function getMinsForRowsVectors. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; + cout << "Standard Error: " << e.what() << " has occurred in the FullMatrix class Function getMins. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; exit(1); } catch(...) { - cout << "An unknown error has occurred in the FullMatrix class function getMinsForRowsVectors. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; + cout << "An unknown error has occurred in the FullMatrix class function getMins. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; exit(1); } - } - /**************************************************************************/ void FullMatrix::getBounds(int& higher, string group) { try{ @@ -311,7 +357,7 @@ void FullMatrix::getBounds(int& higher, string group) { //for each group find bounds of subgroup/comparison for (it = index.begin(); it != index.end(); it++) { if (it->second.groupname == group) { - if (gotLower != true) { gotLower = true; } + gotLower = true; }else if ((gotLower == true) && (it->second.groupname != group)) { higher = it->first; break; } } @@ -327,3 +373,215 @@ void FullMatrix::getBounds(int& higher, string group) { } +/**************************************************************************/ +//print out matrix +void FullMatrix::printMinsForRows(ostream& out) { + try{ + for (int j = 0; j < minsForRows.size(); j++) { + out << minsForRows[j] << " "; + } + out << endl; + + } + catch(exception& e) { + cout << "Standard Error: " << e.what() << " has occurred in the FullMatrix class Function printMatrix. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; + exit(1); + } + catch(...) { + cout << "An unknown error has occurred in the FullMatrix class function printMatrix. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; + exit(1); + } + +} +/**************************************************************************/ +//shuffles the sequences in the 2 groups passed in. +void FullMatrix::shuffle(int box){ + try{ + vector rows2Swap; + vector shuffled; + float y = 0; + string name = ""; + + /****************************/ + //find the box the user wants + /****************************/ + int count = 0; + int lowBoundy = bounds[0]; //where first group starts + int highBoundy = bounds[1]; //where second group starts + int county = 1; //index in bound + + //find the bounds for the box the user wants + for (int i = 0; i < (numGroups * numGroups); i++) { + + //are you at the box? + if (count == box) { break; } + else { count++; } + + //move to next box + if (county < numGroups) { + county++; + highBoundy = bounds[county]; + lowBoundy = bounds[county-1]; + }else{ //you are moving to a new row of "boxes" + county = 1; + highBoundy = bounds[county]; + lowBoundy = bounds[county-1]; + } + } + + /************************/ + //save its rows locations + /************************/ + //go through the matrix map to find the rows from groups you want to randomize + for (int y = lowBoundy; y < highBoundy; y++) { + rows2Swap.push_back(y); + shuffled.push_back(y); + } + + //randomize rows to shuffle in shuffled + random_shuffle(shuffled.begin(), shuffled.end()); + + /***************************************/ + //swap rows and columns to randomize box + /***************************************/ + for (int i = 0; i < shuffled.size(); i++) { + //record the swaps you are making so you can undo them in restore function + restoreIndex[i].a = shuffled[i]; + restoreIndex[i].b = rows2Swap[i]; + + /* swap rows*/ + for (int h = 0; h < numSeqs; h++) { + y = matrix[shuffled[i]][h]; + matrix[shuffled[i]][h] = matrix[rows2Swap[i]][h]; + matrix[rows2Swap[i]][h] = y; + } + + /* swap columns */ + for (int b = 0; b < numSeqs; b++) { + y = matrix[b][shuffled[i]]; + matrix[b][shuffled[i]] = matrix[b][rows2Swap[i]]; + matrix[b][rows2Swap[i]] = y; + } + + //swap map elements + name = index[shuffled[i]].seqName; + index[shuffled[i]].seqName = index[rows2Swap[i]].seqName; + index[rows2Swap[i]].seqName = name; + } + } + catch(exception& e) { + cout << "Standard Error: " << e.what() << " has occurred in the FullMatrix class Function shuffle. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; + exit(1); + } + catch(...) { + cout << "An unknown error has occurred in the FullMatrix class function shuffle. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; + exit(1); + } +} +/**************************************************************************/ +//unshuffles the matrix. +void FullMatrix::restore(){ + try{ + float y = 0; + string name = ""; + + //reverse iterate through swaps and undo them to restore original matrix and index map. + for(it2 = restoreIndex.rbegin(); it2 != restoreIndex.rend(); it2++) { + /* swap rows */ + for (int h = 0; h < numSeqs; h++) { + y = matrix[it2->second.a][h]; + matrix[it2->second.a][h] = matrix[it2->second.b][h]; + matrix[it2->second.b][h] = y; + } + + /* swap columns */ + for (int b = 0; b < numSeqs; b++) { + y = matrix[b][it2->second.a]; + matrix[b][it2->second.a] = matrix[b][it2->second.b]; + matrix[b][it2->second.b] = y; + } + + + //swap map elements + name = index[it2->second.a].seqName; + index[it2->second.a].seqName = index[it2->second.b].seqName; + index[it2->second.b].seqName = name; + } + + //clear restore for next shuffle + restoreIndex.clear(); + } + catch(exception& e) { + cout << "Standard Error: " << e.what() << " has occurred in the FullMatrix class Function restore. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; + exit(1); + } + catch(...) { + cout << "An unknown error has occurred in the FullMatrix class function restore. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; + exit(1); + } +} +/**************************************************************************/ +void FullMatrix::getDist(vector& distances) { + try{ + map dist; //holds the distances for the integral form + map::iterator it; + + /************************************************************/ + //fill the minsForRows vectors for each group the user wants + /************************************************************/ + int lowBoundx = bounds[0]; //where first group starts + int lowBoundy = bounds[0]; + int highBoundx = bounds[1]; //where second group starts + int highBoundy = bounds[1]; + + int countx = 1; //index in bound + int county = 1; //index in bound + + //go through each "box" in the matrix + for (int i = 0; i < (numGroups * numGroups); i++) { + //each row in the box + for (int x = lowBoundx; x < highBoundx; x++) { + float min4Row = 100000.0; + //each entry in that row + for (int y = lowBoundy; y < highBoundy; y++) { + //if you are not on the diagonal and you are less than previous minimum + if ((x != y) && (matrix[x][y] < min4Row)){ + min4Row = matrix[x][y]; + } + } + //save minimum value + dist[min4Row] = min4Row; + } + + //****** reset bounds to process next "box" ******** + //if you still have more "boxes" in that row + if (county < numGroups) { + county++; + highBoundy = bounds[county]; + lowBoundy = bounds[county-1]; + }else{ //you are moving to a new row of "boxes" + county = 1; + countx++; + highBoundx = bounds[countx]; + lowBoundx = bounds[countx-1]; + highBoundy = bounds[county]; + lowBoundy = bounds[county-1]; + } + } + + //store distances in users vector + for (it = dist.begin(); it != dist.end(); it++) { + distances.push_back(it->first); + } + + } + catch(exception& e) { + cout << "Standard Error: " << e.what() << " has occurred in the FullMatrix class Function restore. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; + exit(1); + } + catch(...) { + cout << "An unknown error has occurred in the FullMatrix class function restore. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; + exit(1); + } +} +