X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=fullmatrix.cpp;h=f4acd78c1132022b9bc22a6c878febe5a4df8c1c;hb=39a9b207d1046f3409781c45e38b7a871133d224;hp=6ea2318d740003f8cf46ec7e63815c175e1893ca;hpb=28b6634fd8f44d28b957b9ace79703c0ac79741c;p=mothur.git diff --git a/fullmatrix.cpp b/fullmatrix.cpp index 6ea2318..f4acd78 100644 --- a/fullmatrix.cpp +++ b/fullmatrix.cpp @@ -39,6 +39,7 @@ FullMatrix::FullMatrix(ifstream& filehandle) { if(isalnum(d)){ square = true; filehandle.putback(d); + for(int i=0;i> matrix[0][i]; } @@ -74,10 +75,10 @@ void FullMatrix::readSquareMatrix(ifstream& filehandle) { try { Progress* reading; - reading = new Progress("Reading matrix: ", numSeqs * numSeqs); + reading = new Progress("Reading matrix: ", numSeqs * numSeqs); int count = 0; - float distance; + string group, name; for(int i=1;i> distance; - - matrix[i][j] = distance; + filehandle >> matrix[i][j]; + count++; reading->update(count); } @@ -114,10 +114,11 @@ void FullMatrix::readSquareMatrix(ifstream& filehandle) { void FullMatrix::readLTMatrix(ifstream& filehandle) { try { Progress* reading; - reading = new Progress("Reading matrix: ", numSeqs * (numSeqs - 1) / 2); + reading = new Progress("Reading matrix: ", numSeqs * (numSeqs - 1) / 2); int count = 0; float distance; + string group, name; for(int i=1;iupdate(count); } + } reading->finish(); delete reading; @@ -157,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 */ @@ -246,5 +248,322 @@ void FullMatrix::printMatrix(ostream& out) { } } + +/**************************************************************************/ +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 + /*************************************************/ + bounds.resize(numGroups); + + bounds[0] = 0; + 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-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 vector for the box the user wants + /************************************************************/ + 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]; + + 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 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 getMins. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; + exit(1); + } +} +/**************************************************************************/ +void FullMatrix::getBounds(int& higher, string group) { + try{ + bool gotLower = false; + + //for each group find bounds of subgroup/comparison + for (it = index.begin(); it != index.end(); it++) { + if (it->second.groupname == group) { + gotLower = true; + }else if ((gotLower == true) && (it->second.groupname != group)) { higher = it->first; break; } + } + + } + catch(exception& e) { + cout << "Standard Error: " << e.what() << " has occurred in the FullMatrix class Function getBounds. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; + exit(1); + } + catch(...) { + cout << "An unknown error has occurred in the FullMatrix class function getBounds. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; + exit(1); + } + +} + +/**************************************************************************/ +//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(string groupA, string groupB){ + try{ + vector rows2Swap; + vector shuffled; + float y = 0; + string name = ""; + + + /********************************/ + //save rows you want to randomize + /********************************/ + //go through the matrix map to find the rows from groups you want to randomize + for (it = index.begin(); it != index.end(); it++) { + //is this row from group A or B? + if ((it->second.groupname == groupA) || (it->second.groupname == groupB)) { + rows2Swap.push_back(it->first); + shuffled.push_back(it->first); + } + } + + //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); + } +}