]> git.donarmstrong.com Git - mothur.git/blobdiff - sharedrabundvector.cpp
sffinfo bug with flow grams right index when clipQualRight=0
[mothur.git] / sharedrabundvector.cpp
index 94a65191eabe4a286481c3829f31a1ba0ed02c00..3901650cef965dc7a3c0126ecb54a8fb425e434d 100644 (file)
 
 
 /***********************************************************************/
+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) {}
+}
 
 /***********************************************************************/
 
@@ -44,34 +49,82 @@ SharedRAbundVector::SharedRAbundVector(string id, vector<individual> rav) : Data
                }
        }
        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;
+        }
+               
+               //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
@@ -80,39 +133,28 @@ SharedRAbundVector::SharedRAbundVector(ifstream& f) : DataVector(), maxRank(0),
                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;
                        
-                       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;
                        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();
@@ -123,27 +165,19 @@ SharedRAbundVector::SharedRAbundVector(ifstream& f) : DataVector(), maxRank(0),
                        //fill vector.  
                        for(int i=0;i<num;i++){
                                f >> inputData;
-                               lookup[count]->push_back(inputData, i, groupN); //abundance, bin, group
+                               
+                               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);
        }
 }
@@ -161,11 +195,7 @@ void SharedRAbundVector::set(int binNumber, int newBinSize, string groupname){
                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);
        }
 }
@@ -209,12 +239,22 @@ vector <individual> SharedRAbundVector::getData(){
 }
 /***********************************************************************/
 
-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++;
@@ -226,11 +266,7 @@ void SharedRAbundVector::push_back(int binSize, int otu, string groupName){
                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);
        }
 }
@@ -254,11 +290,7 @@ void SharedRAbundVector::insert(int binSize, int otu, string groupName){
                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);
        }
 }
@@ -282,11 +314,7 @@ void SharedRAbundVector::push_front(int binSize, int otu, string groupName){
                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);
        }
 }
@@ -323,8 +351,54 @@ int SharedRAbundVector::size(){
        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';
        
@@ -332,11 +406,7 @@ void SharedRAbundVector::print(ostream& output){
                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);
        }
 }
@@ -356,7 +426,7 @@ int SharedRAbundVector::getGroupIndex()  { return index; }
 void SharedRAbundVector::setGroupIndex(int vIndex)     { index = vIndex; }
 /***********************************************************************/
 int SharedRAbundVector::getNumBins(){
-       return numBins;
+               return numBins;
 }
 
 /***********************************************************************/
@@ -381,25 +451,120 @@ vector<SharedRAbundVector*> SharedRAbundVector::getSharedRAbundVectors(){
                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);
        }
 }
@@ -407,20 +572,19 @@ vector<SharedRAbundVector*> SharedRAbundVector::getSharedRAbundVectors(){
 
 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);
        }
 }
@@ -435,11 +599,7 @@ RAbundVector SharedRAbundVector::getRAbundVector2() {
                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);
        }
 }
@@ -461,11 +621,7 @@ SharedSAbundVector SharedRAbundVector::getSharedSAbundVector(){
                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);
        }
 }
@@ -484,11 +640,7 @@ SAbundVector SharedRAbundVector::getSAbundVector() {
                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);
        }
 }
@@ -512,11 +664,7 @@ SharedOrderVector SharedRAbundVector::getSharedOrderVector() {
                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);
        }
 }
@@ -525,23 +673,19 @@ SharedOrderVector SharedRAbundVector::getSharedOrderVector() {
 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);
        }
 }