]> git.donarmstrong.com Git - mothur.git/blobdiff - sharedrabundvector.cpp
moved utilities out of mothur.h and into mothurOut class.
[mothur.git] / sharedrabundvector.cpp
index 846f9cdb705c7a801097feaeca59272d4001d361..c15dfac5a1cde0b8fb08173702c44b227e06c2c0 100644 (file)
@@ -7,23 +7,26 @@
  *
  */
 
-
-using namespace std;
-
 #include "sharedrabundvector.h" 
-#include "utilities.hpp"
 #include "sabundvector.hpp"
 #include "ordervector.hpp"
-#include <algorithm>
+#include "sharedutilities.h"
 
 
 /***********************************************************************/
 
-SharedRAbundVector::SharedRAbundVector() : DataVector(), maxRank(0), numBins(0), numSeqs(0) {};
+SharedRAbundVector::SharedRAbundVector() : DataVector(), maxRank(0), numBins(0), numSeqs(0) {globaldata = GlobalData::getInstance();}
+/***********************************************************************/
+
+SharedRAbundVector::~SharedRAbundVector() {
+       //for (int i = 0; i < lookup.size(); i++) {  delete lookup[i];  }
+
+}
 
 /***********************************************************************/
 
 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++) {
@@ -31,7 +34,7 @@ SharedRAbundVector::SharedRAbundVector(int n) : DataVector(), maxRank(0), numBin
                        newGuy.abundance = 0;
                        data.push_back(newGuy);
                }
-};
+}
 
 /***********************************************************************
 
@@ -48,59 +51,102 @@ 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 {
-               int i, num;
-               string holdLabel, group
-               individual newGuy;
+               globaldata = GlobalData::getInstance();
                
-               f >> label >> group >> num;
+               if (globaldata->gGroupmap == NULL) {  groupmap = new GroupMap(); }
                
-               //initialize data
-               for (i=0; i<hold; i++) {
-                       newGuy = new individual;
-                       newGuy.abundance = 0;
-                       newGuy.bin = i;
-                       data.push_back(newGuy);
+               int num, inputData, count;
+               count = 0;  
+               string holdLabel, nextLabel, groupN;
+               individual newguy;
+               
+               for (int i = 0; i < lookup.size(); i++) {  delete lookup[i]; lookup[i] = NULL; }
+               lookup.clear();
+               
+               //read in first row since you know there is at least 1 group.
+               f >> label >> groupN >> num;
+               holdLabel = label;
+               
+               //add new vector to lookup
+               SharedRAbundVector* temp = new SharedRAbundVector();
+               lookup.push_back(temp);
+               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;
                }
-               int inputData;
-       
-               for(int i=0;i<hold;i++){
+               
+               //fill vector.  data = first sharedrabund in file
+               for(int i=0;i<num;i++){
                        f >> inputData;
-                       set(i, inputData);
+                       
+                       lookup[0]->push_back(inputData, groupN); //abundance, bin, group
+                       push_back(inputData, groupN);
+                       //numSeqs += inputData;
+                       //numBins++;
+                       if (inputData > maxRank) { maxRank = inputData; }
+                       
+               }
+               
+               m->gobble(f);
+               
+               if (f.eof() != true) { 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;
+                       }
+                       
+                       //add new vector to lookup
+                       temp = new SharedRAbundVector();
+                       lookup.push_back(temp);
+                       lookup[count]->setLabel(label);
+                       lookup[count]->setGroup(groupN);
+
+                       //fill vector.  
+                       for(int i=0;i<num;i++){
+                               f >> inputData;
+                               lookup[count]->push_back(inputData, groupN); //abundance, bin, group
+                       }
+                       
+                       m->gobble(f);
+                               
+                       if (f.eof() != true) { f >> nextLabel; }
                }
+               
+               //put file pointer back since you are now at a new distance label
+               for (int i = 0; i < nextLabel.length(); i++) { f.unget();  }
+       
+               if (globaldata->gGroupmap == NULL) { globaldata->gGroupmap = groupmap;  }
+               
        }
        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);
        }
 }
 
 /***********************************************************************/
 
-SharedRAbundVector::~SharedRAbundVector() {
-
-}
-
-/***********************************************************************/
-
 void SharedRAbundVector::set(int binNumber, int newBinSize, string groupname){
        try {
                int oldBinSize = data[binNumber].abundance;
@@ -112,11 +158,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);
        }
 }
@@ -160,12 +202,12 @@ vector <individual> SharedRAbundVector::getData(){
 }
 /***********************************************************************/
 
-void SharedRAbundVector::push_back(int binSize, int otu, string groupName){
+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++;
@@ -177,19 +219,63 @@ 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";
+               m->errorOut(e, "SharedRAbundVector", "push_back");
                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";
+}
+
+/***********************************************************************/
+
+void SharedRAbundVector::insert(int binSize, int otu, string groupName){
+       try {
+               individual newGuy;
+               newGuy.abundance = binSize;
+               newGuy.group = groupName;
+               newGuy.bin = otu;
+               
+               data.insert(data.begin()+otu, newGuy);
+               numBins++;
+       
+               if(binSize > maxRank){
+                       maxRank = binSize;
+               }
+       
+               numSeqs += binSize;
+       }
+       catch(exception& e) {
+               m->errorOut(e, "SharedRAbundVector", "insert");
                exit(1);
        }
 }
 
 /***********************************************************************/
 
-void SharedRAbundVector::pop_back(){
+void SharedRAbundVector::push_front(int binSize, int otu, string groupName){
+       try {
+               individual newGuy;
+               newGuy.abundance = binSize;
+               newGuy.group = groupName;
+               newGuy.bin = otu;
+               
+               data.insert(data.begin(), newGuy);
+               numBins++;
+       
+               if(binSize > maxRank){
+                       maxRank = binSize;
+               }
+       
+               numSeqs += binSize;
+       }
+       catch(exception& e) {
+               m->errorOut(e, "SharedRAbundVector", "push_front");
+               exit(1);
+       }
+}
 
+/***********************************************************************/
+void SharedRAbundVector::pop_back(){
+       numSeqs -= data[data.size()-1].abundance;
+       numBins--;
        return data.pop_back();
 }
 
@@ -223,15 +309,11 @@ void SharedRAbundVector::print(ostream& output){
        try {
                output << numBins << '\t';
        
-               for(int i=0;i<numBins;i++){             output << data[i].abundance << '\t';            }
+               for(int i=0;i<data.size();i++){         output << data[i].abundance << '\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);
        }
 }
@@ -271,23 +353,48 @@ SharedRAbundVector SharedRAbundVector::getSharedRAbundVector(){
        return *this;                   
 }
 /***********************************************************************/
+vector<SharedRAbundVector*> SharedRAbundVector::getSharedRAbundVectors(){
+       try {
+               SharedUtil* util;
+               util = new SharedUtil();
+               
+               util->setGroups(globaldata->Groups, globaldata->gGroupmap->namesOfGroups);
+
+               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]; lookup[i] = NULL;
+                               lookup.erase(lookup.begin()+i); 
+                               i--; 
+                       }
+               }
+               
+               delete util;
+       
+               return lookup;
+       }
+       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);
        }
 }
@@ -302,11 +409,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);
        }
 }
@@ -328,11 +431,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);
        }
 }
@@ -351,11 +450,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);
        }
 }
@@ -374,14 +469,12 @@ SharedOrderVector SharedRAbundVector::getSharedOrderVector() {
                random_shuffle(ov.begin(), ov.end());
 
                ov.setLabel(label);     
+               ov.updateStats();
+               
                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);
        }
 }
@@ -402,11 +495,7 @@ OrderVector SharedRAbundVector::getOrderVector(map<string,int>* nameMap = NULL)
                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);
        }
 }