/***********************************************************************/
+SharedRAbundVector::SharedRAbundVector() : DataVector(), maxRank(0), numBins(0), numSeqs(0) {}
+/***********************************************************************/
+
+SharedRAbundVector::~SharedRAbundVector() {
+ //for (int i = 0; i < lookup.size(); i++) { delete lookup[i]; }
-SharedRAbundVector::SharedRAbundVector() : DataVector(), maxRank(0), numBins(0), numSeqs(0) {globaldata = GlobalData::getInstance();}
+}
/***********************************************************************/
SharedRAbundVector::SharedRAbundVector(int n) : DataVector(), maxRank(0), numBins(n), numSeqs(0) {
- globaldata = GlobalData::getInstance();
individual newGuy;
//initialize data
for (int i=0; i< n; i++) {
}
}
catch(exception& e) {
- cout << "Standard Error: " << e.what() << " has occurred in the SharedRAbundVector class Function SharedRAbundVector. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
- exit(1);
- }
- catch(...) {
- cout << "An unknown error has occurred in the SharedRAbundVector class function SharedRAbundVector. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+ m->errorOut(e, "SharedRAbundVector", "SharedRAbundVector");
exit(1);
}
}
-/***********************************************************************/
+***********************************************************************/
//reads a shared file
SharedRAbundVector::SharedRAbundVector(ifstream& f) : DataVector(), maxRank(0), numBins(0), numSeqs(0) {
try {
- globaldata = GlobalData::getInstance();
-
- if (globaldata->gGroupmap == NULL) { groupmap = new GroupMap(); }
+ m->clearAllGroups();
+ vector<string> allGroups;
- int num, inputData, pos, count;
+ int num, inputData, count;
count = 0;
string holdLabel, nextLabel, groupN;
individual newguy;
- for (int i = 0; i < lookup.size(); i++) { delete lookup[i]; }
- lookup.clear();
+ for (int i = 0; i < lookup.size(); i++) { delete lookup[i]; lookup[i] = NULL; } lookup.clear();
+
+ //are we at the beginning of the file??
+ if (m->saveNextLabel == "") {
+ f >> label;
+
+ //is this a shared file that has headers
+ if (label == "label") {
+ //gets "group"
+ f >> label; m->gobble(f);
+
+ //gets "numOtus"
+ f >> label; m->gobble(f);
+
+ //eat rest of line
+ label = m->getline(f); m->gobble(f);
+
+ //parse labels to save
+ istringstream iStringStream(label);
+ m->binLabelsInFile.clear();
+ while(!iStringStream.eof()){
+ if (m->control_pressed) { break; }
+ string temp;
+ iStringStream >> temp; m->gobble(iStringStream);
+
+ m->binLabelsInFile.push_back(temp);
+ }
+
+ f >> label >> groupN >> num;
+ }else {
+ //read in first row since you know there is at least 1 group.
+ f >> groupN >> num;
+
+ //make binlabels because we don't have any
+ string snumBins = toString(num);
+ m->binLabelsInFile.clear();
+ for (int i = 0; i < num; i++) {
+ //if there is a bin label use it otherwise make one
+ string binLabel = "Otu";
+ string sbinNumber = toString(i+1);
+ if (sbinNumber.length() < snumBins.length()) {
+ int diff = snumBins.length() - sbinNumber.length();
+ for (int h = 0; h < diff; h++) { binLabel += "0"; }
+ }
+ binLabel += sbinNumber;
+ m->binLabelsInFile.push_back(binLabel);
+ }
+ }
+ }else {
+ label = m->saveNextLabel;
+
+ //read in first row since you know there is at least 1 group.
+ f >> groupN >> num;
+
+ if (m->debug) { m->mothurOut("[DEBUG]: "+ groupN + '\t' + toString(num)); }
+ }
+
+ //reset labels, currentLabels may have gotten changed as otus were eliminated because of group choices or sampling
+ m->currentBinLabels = m->binLabelsInFile;
- //read in first row since you know there is at least 1 group.
- f >> label >> groupN >> num;
holdLabel = label;
//add new vector to lookup
lookup[0]->setLabel(label);
lookup[0]->setGroup(groupN);
- if (globaldata->gGroupmap == NULL) {
- //save group in groupmap
- groupmap->namesOfGroups.push_back(groupN);
- groupmap->groupIndex[groupN] = 0;
- }
+ allGroups.push_back(groupN);
//fill vector. data = first sharedrabund in file
for(int i=0;i<num;i++){
f >> inputData;
+ if (m->debug) { m->mothurOut("[DEBUG]: OTU" + toString(i+1)+ '\t' +toString(inputData)); }
- lookup[0]->push_back(inputData, i, groupN); //abundance, bin, group
- push_back(inputData, i, groupN);
- numSeqs += inputData;
- numBins++;
- if (inputData > maxRank) { maxRank = inputData; }
+ lookup[0]->push_back(inputData, groupN); //abundance, bin, group
+ push_back(inputData, groupN);
+ if (inputData > maxRank) { maxRank = inputData; }
}
- //save position in file in case next line is a new label.
- pos = f.tellg();
-
- if (f.eof() != true) { f >> nextLabel; }
+ m->gobble(f);
+ if (!(f.eof())) { f >> nextLabel; }
+
//read the rest of the groups info in
while ((nextLabel == holdLabel) && (f.eof() != true)) {
f >> groupN >> num;
+ if (m->debug) { m->mothurOut("[DEBUG]: "+ groupN + '\t' + toString(num)); }
count++;
- if (globaldata->gGroupmap == NULL) {
- //save group in groupmap
- groupmap->namesOfGroups.push_back(groupN);
- groupmap->groupIndex[groupN] = count;
- }
+ allGroups.push_back(groupN);
//add new vector to lookup
temp = new SharedRAbundVector();
//fill vector.
for(int i=0;i<num;i++){
f >> inputData;
- lookup[count]->push_back(inputData, i, groupN); //abundance, bin, group
+ if (m->debug) { m->mothurOut("[DEBUG]: OTU" + toString(i+1)+ '\t' +toString(inputData)); }
+
+ lookup[count]->push_back(inputData, groupN); //abundance, bin, group
}
- //save position in file in case next line is a new label.
- pos = f.tellg();
-
+ m->gobble(f);
+
if (f.eof() != true) { f >> nextLabel; }
}
-
- //put file pointer back since you are now at a new distance label
- f.seekg(pos, ios::beg);
-
- if (globaldata->gGroupmap == NULL) { globaldata->gGroupmap = groupmap; }
-
+ m->saveNextLabel = nextLabel;
+ m->setAllGroups(allGroups);
}
catch(exception& e) {
- cout << "Standard Error: " << e.what() << " has occurred in the SharedRAbundVector class Function SharedRAbundVector. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
- exit(1);
- }
- catch(...) {
- cout << "An unknown error has occurred in the SharedRAbundVector class function SharedRAbundVector. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+ m->errorOut(e, "SharedRAbundVector", "SharedRAbundVector");
exit(1);
}
}
numSeqs += (newBinSize - oldBinSize);
}
catch(exception& e) {
- cout << "Standard Error: " << e.what() << " has occurred in the SharedRAbundVector class Function set. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
- exit(1);
- }
- catch(...) {
- cout << "An unknown error has occurred in the SharedRAbundVector class function set. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+ m->errorOut(e, "SharedRAbundVector", "set");
exit(1);
}
}
return data[index].abundance;
}
+/***********************************************************************/
+//returns vector of abundances
+vector<int> SharedRAbundVector::getAbundances(){
+ vector<int> abunds;
+ for (int i = 0; i < data.size(); i++) {
+ abunds.push_back(data[i].abundance);
+ }
+
+ return abunds;
+}
+
+
/***********************************************************************/
int SharedRAbundVector::numNZ(){
}
/***********************************************************************/
-void SharedRAbundVector::push_back(int binSize, int otu, string groupName){
+void SharedRAbundVector::clear(){
+ numBins = 0;
+ maxRank = 0;
+ numSeqs = 0;
+ data.clear();
+ for (int i = 0; i < lookup.size(); i++) { delete lookup[i]; lookup[i] = NULL; }
+ lookup.clear();
+}
+/***********************************************************************/
+
+void SharedRAbundVector::push_back(int binSize, string groupName){
try {
individual newGuy;
newGuy.abundance = binSize;
newGuy.group = groupName;
- newGuy.bin = otu;
+ newGuy.bin = data.size();
data.push_back(newGuy);
numBins++;
numSeqs += binSize;
}
catch(exception& e) {
- cout << "Standard Error: " << e.what() << " has occurred in the SharedRAbundVector class Function push_back. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
- exit(1);
- }
- catch(...) {
- cout << "An unknown error has occurred in the SharedRAbundVector class function push_back. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+ m->errorOut(e, "SharedRAbundVector", "push_back");
exit(1);
}
}
numSeqs += binSize;
}
catch(exception& e) {
- cout << "Standard Error: " << e.what() << " has occurred in the SharedRAbundVector class Function insert. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
- exit(1);
- }
- catch(...) {
- cout << "An unknown error has occurred in the SharedRAbundVector class function insert. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+ m->errorOut(e, "SharedRAbundVector", "insert");
exit(1);
}
}
numSeqs += binSize;
}
catch(exception& e) {
- cout << "Standard Error: " << e.what() << " has occurred in the SharedRAbundVector class Function push_front. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
- exit(1);
- }
- catch(...) {
- cout << "An unknown error has occurred in the SharedRAbundVector class function push_front. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+ m->errorOut(e, "SharedRAbundVector", "push_front");
exit(1);
}
}
return data.size();
}
+
/***********************************************************************/
-void SharedRAbundVector::print(ostream& output){
+void SharedRAbundVector::printHeaders(ostream& output){
+ try {
+ string snumBins = toString(numBins);
+ output << "label\tGroup\tnumOtus\t";
+ if (m->sharedHeaderMode == "tax") {
+ for (int i = 0; i < numBins; i++) {
+
+ //if there is a bin label use it otherwise make one
+ string binLabel = "PhyloType";
+ string sbinNumber = toString(i+1);
+ if (sbinNumber.length() < snumBins.length()) {
+ int diff = snumBins.length() - sbinNumber.length();
+ for (int h = 0; h < diff; h++) { binLabel += "0"; }
+ }
+ binLabel += sbinNumber;
+ if (i < m->currentBinLabels.size()) { binLabel = m->currentBinLabels[i]; }
+
+ output << binLabel << '\t';
+ }
+ output << endl;
+ }else {
+ for (int i = 0; i < numBins; i++) {
+ //if there is a bin label use it otherwise make one
+ string binLabel = "Otu";
+ string sbinNumber = toString(i+1);
+ if (sbinNumber.length() < snumBins.length()) {
+ int diff = snumBins.length() - sbinNumber.length();
+ for (int h = 0; h < diff; h++) { binLabel += "0"; }
+ }
+ binLabel += sbinNumber;
+ if (i < m->currentBinLabels.size()) { binLabel = m->currentBinLabels[i]; }
+
+ output << binLabel << '\t';
+ }
+
+ output << endl;
+ }
+ m->printedHeaders = true;
+ }
+ catch(exception& e) {
+ m->errorOut(e, "SharedRAbundVector", "printHeaders");
+ exit(1);
+ }
+}
+/***********************************************************************/
+void SharedRAbundVector::print(ostream& output) {
try {
output << numBins << '\t';
output << endl;
}
catch(exception& e) {
- cout << "Standard Error: " << e.what() << " has occurred in the SharedRAbundVector class Function print. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
- exit(1);
- }
- catch(...) {
- cout << "An unknown error has occurred in the SharedRAbundVector class function print. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+ m->errorOut(e, "SharedRAbundVector", "print");
exit(1);
}
}
void SharedRAbundVector::setGroupIndex(int vIndex) { index = vIndex; }
/***********************************************************************/
int SharedRAbundVector::getNumBins(){
- return numBins;
+ return numBins;
}
/***********************************************************************/
SharedUtil* util;
util = new SharedUtil();
- util->setGroups(globaldata->Groups, globaldata->gGroupmap->namesOfGroups);
-
+ vector<string> Groups = m->getGroups();
+ vector<string> allGroups = m->getAllGroups();
+ util->setGroups(Groups, allGroups);
+ m->setGroups(Groups);
+
+ bool remove = false;
for (int i = 0; i < lookup.size(); i++) {
//if this sharedrabund is not from a group the user wants then delete it.
- if (util->isValidGroup(lookup[i]->getGroup(), globaldata->Groups) == false) {
- delete lookup[i];
+ if (util->isValidGroup(lookup[i]->getGroup(), m->getGroups()) == false) {
+ remove = true;
+ delete lookup[i]; lookup[i] = NULL;
lookup.erase(lookup.begin()+i);
i--;
}
}
-
+
+ delete util;
+
+ if (remove) { eliminateZeroOTUS(lookup); }
+
return lookup;
}
catch(exception& e) {
- cout << "Standard Error: " << e.what() << " has occurred in the SharedRAbundVector class Function getSharedRAbundVectors. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+ m->errorOut(e, "SharedRAbundVector", "getSharedRAbundVectors");
exit(1);
}
- catch(...) {
- cout << "An unknown error has occurred in the SharedRAbundVector class function getSharedRAbundVectors. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+}
+//**********************************************************************************************************************
+int SharedRAbundVector::eliminateZeroOTUS(vector<SharedRAbundVector*>& thislookup) {
+ try {
+
+ vector<SharedRAbundVector*> newLookup;
+ for (int i = 0; i < thislookup.size(); i++) {
+ SharedRAbundVector* temp = new SharedRAbundVector();
+ temp->setLabel(thislookup[i]->getLabel());
+ temp->setGroup(thislookup[i]->getGroup());
+ newLookup.push_back(temp);
+ }
+
+ //for each bin
+ vector<string> newBinLabels;
+ string snumBins = toString(thislookup[0]->getNumBins());
+ for (int i = 0; i < thislookup[0]->getNumBins(); i++) {
+ if (m->control_pressed) { for (int j = 0; j < newLookup.size(); j++) { delete newLookup[j]; } return 0; }
+
+ //look at each sharedRabund and make sure they are not all zero
+ bool allZero = true;
+ for (int j = 0; j < thislookup.size(); j++) {
+ if (thislookup[j]->getAbundance(i) != 0) { allZero = false; break; }
+ }
+
+ //if they are not all zero add this bin
+ if (!allZero) {
+ for (int j = 0; j < thislookup.size(); j++) {
+ newLookup[j]->push_back(thislookup[j]->getAbundance(i), thislookup[j]->getGroup());
+ }
+
+ //if there is a bin label use it otherwise make one
+ string binLabel = "Otu";
+ string sbinNumber = toString(i+1);
+ if (sbinNumber.length() < snumBins.length()) {
+ int diff = snumBins.length() - sbinNumber.length();
+ for (int h = 0; h < diff; h++) { binLabel += "0"; }
+ }
+ binLabel += sbinNumber;
+ if (i < m->currentBinLabels.size()) { binLabel = m->currentBinLabels[i]; }
+
+ newBinLabels.push_back(binLabel);
+ }
+ }
+
+ for (int j = 0; j < thislookup.size(); j++) { delete thislookup[j]; }
+
+ thislookup = newLookup;
+ m->currentBinLabels = newBinLabels;
+
+ return 0;
+
+ }
+ catch(exception& e) {
+ m->errorOut(e, "SharedRAbundVector", "eliminateZeroOTUS");
+ exit(1);
+ }
+ }
+
+/***********************************************************************/
+vector<SharedRAbundFloatVector*> SharedRAbundVector::getSharedRAbundFloatVectors(vector<SharedRAbundVector*> thislookup){
+ try {
+ vector<SharedRAbundFloatVector*> newLookupFloat;
+ for (int i = 0; i < lookup.size(); i++) {
+ SharedRAbundFloatVector* temp = new SharedRAbundFloatVector();
+ temp->setLabel(thislookup[i]->getLabel());
+ temp->setGroup(thislookup[i]->getGroup());
+ newLookupFloat.push_back(temp);
+ }
+
+ for (int i = 0; i < thislookup.size(); i++) {
+
+ for (int j = 0; j < thislookup[i]->getNumBins(); j++) {
+
+ if (m->control_pressed) { return newLookupFloat; }
+
+ int abund = thislookup[i]->getAbundance(j);
+
+ float relabund = abund / (float) thislookup[i]->getNumSeqs();
+
+ newLookupFloat[i]->push_back(relabund, thislookup[i]->getGroup());
+ }
+ }
+
+ return newLookupFloat;
+ }
+ catch(exception& e) {
+ m->errorOut(e, "SharedRAbundVector", "getSharedRAbundVectors");
exit(1);
}
}
RAbundVector SharedRAbundVector::getRAbundVector() {
try {
- RAbundVector rav(data.size());
+ RAbundVector rav;
for (int i = 0; i < data.size(); i++) {
- rav.set(i, data[i].abundance);
+ if(data[i].abundance != 0) {
+ rav.push_back(data[i].abundance);
+ }
}
-
+
+ rav.setLabel(label);
return rav;
}
catch(exception& e) {
- cout << "Standard Error: " << e.what() << " has occurred in the SharedRAbundVector class Function getRAbundVector. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
- exit(1);
- }
- catch(...) {
- cout << "An unknown error has occurred in the SharedRAbundVector class function getRAbundVector. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+ m->errorOut(e, "SharedRAbundVector", "getRAbundVector");
exit(1);
}
}
return rav;
}
catch(exception& e) {
- cout << "Standard Error: " << e.what() << " has occurred in the SharedRAbundVector class Function getRAbundVector. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
- exit(1);
- }
- catch(...) {
- cout << "An unknown error has occurred in the SharedRAbundVector class function getRAbundVector. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+ m->errorOut(e, "SharedRAbundVector", "getRAbundVector2");
exit(1);
}
}
return sav;
}
catch(exception& e) {
- cout << "Standard Error: " << e.what() << " has occurred in the SharedRAbundVector class Function getSharedSAbundVector. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
- exit(1);
- }
- catch(...) {
- cout << "An unknown error has occurred in the SharedRAbundVector class function getSharedSAbundVector. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+ m->errorOut(e, "SharedRAbundVector", "getSharedSAbundVector");
exit(1);
}
}
return sav;
}
catch(exception& e) {
- cout << "Standard Error: " << e.what() << " has occurred in the SharedRAbundVector class Function getSAbundVector. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
- exit(1);
- }
- catch(...) {
- cout << "An unknown error has occurred in the SharedRAbundVector class function getSAbundVector. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+ m->errorOut(e, "SharedRAbundVector", "getSAbundVector");
exit(1);
}
}
return ov;
}
catch(exception& e) {
- cout << "Standard Error: " << e.what() << " has occurred in the SharedRAbundVector class Function getOrderVector. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
- exit(1);
- }
- catch(...) {
- cout << "An unknown error has occurred in the SharedRAbundVector class function getOrderVector. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+ m->errorOut(e, "SharedRAbundVector", "getSharedOrderVector");
exit(1);
}
}
OrderVector SharedRAbundVector::getOrderVector(map<string,int>* nameMap = NULL) {
try {
OrderVector ov;
-
- for(int i=0;i<data.size();i++){
+ for(int i=0;i<numBins;i++){
for(int j=0;j<data[i].abundance;j++){
ov.push_back(i);
}
}
random_shuffle(ov.begin(), ov.end());
-
+
ov.setLabel(label);
+
return ov;
}
catch(exception& e) {
- cout << "Standard Error: " << e.what() << " has occurred in the SharedRAbundVector class Function getOrderVector. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
- exit(1);
- }
- catch(...) {
- cout << "An unknown error has occurred in the SharedRAbundVector class function getOrderVector. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+ m->errorOut(e, "SharedRAbundVector", "getOrderVector");
exit(1);
}
}