]> git.donarmstrong.com Git - mothur.git/blobdiff - sharedordervector.cpp
adding labels to list file.
[mothur.git] / sharedordervector.cpp
index 2092706d8cf5a5c429fb937820663ff0a5738be1..80b8fb9bd45a8596e91afe30fdec3984b2411de6 100644 (file)
@@ -7,12 +7,8 @@
  *
  */
 
-using namespace std;
-
-
 #include "sharedordervector.h"
-#include "utilities.hpp"
-
+#include "sharedutilities.h"
 
 /***********************************************************************/
 
@@ -30,103 +26,130 @@ SharedOrderVector::SharedOrderVector(string id, vector<individual>  ov) :
 //This function is used to read a .shared file for the collect.shared, rarefaction.shared and summary.shared commands
 //if you don't use a list and groupfile.  
 
-SharedOrderVector::SharedOrderVector(ifstream& f) : DataVector() {
+SharedOrderVector::SharedOrderVector(ifstream& f) : DataVector() {  //reads in a shared file
        try {
-               globaldata = GlobalData::getInstance();
                maxRank = 0; numBins = 0; numSeqs = 0;
+                               
+               groupmap = new GroupMap(); 
                
-               if (globaldata->gGroupmap == NULL) {  groupmap = new GroupMap(); }
-               
-               int num, inputData, pos, count;
+               int num, inputData, count;
                count = 0;  numSeqs = 0;
                string holdLabel, nextLabel, groupN;
                individual newguy;
                
                //read in first row since you know there is at least 1 group.
-               f >> label >> groupN >> num;
+               //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->sharedBinLabelsInFile.clear();
+                               while(!iStringStream.eof()){
+                                       if (m->control_pressed) { break; }
+                                       string temp;
+                                       iStringStream >> temp;  m->gobble(iStringStream);
+                                       
+                                       m->sharedBinLabelsInFile.push_back(temp);
+                               }
+                               
+                               f >> label;
+                       }
+               }else { label = m->saveNextLabel; }
+               
+               //reset labels, currentLabels may have gotten changed as otus were eliminated because of group choices or sampling
+               m->currentSharedBinLabels = m->sharedBinLabelsInFile;
+               
+               //read in first row since you know there is at least 1 group.
+               f >> groupN >> num;
+               
                holdLabel = label;
                
-               if (globaldata->gGroupmap == NULL) { 
-                       //save group in groupmap
-                       groupmap->namesOfGroups.push_back(groupN);
-                       groupmap->groupIndex[groupN] = 0;
-               }
+               
+               vector<string> allGroups;
+               //save group in groupmap
+               allGroups.push_back(groupN);
+               groupmap->groupIndex[groupN] = 0;
+               
                
                for(int i=0;i<num;i++){
                        f >> inputData;
                        
                        for (int j = 0; j < inputData; j++) {
-                               push_back(i+1, i+1, groupN);
+                               push_back(i, i, groupN);
                                numSeqs++;
                        }
                }
                
-               //save position in file in case next line is a new label.
-               pos = f.tellg();
+               m->gobble(f); 
                
-               if (f.eof() != true) { f >> nextLabel; }
+               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;
-                       }
+                       
+                       //save group in groupmap
+                       allGroups.push_back(groupN);
+                       groupmap->groupIndex[groupN] = count;
+                       
                        
                        for(int i=0;i<num;i++){
                                f >> inputData;
                                
                                for (int j = 0; j < inputData; j++) {
-                                       push_back(i+1, i+1, groupN);
+                                       push_back(i, i, groupN);
                                        numSeqs++;
                                }
                        }
                        
-                       //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;
+                       
+               groupmap->setNamesOfGroups(allGroups);
+               m->setAllGroups(allGroups);
+               
                updateStats();
+               
        }
        catch(exception& e) {
-               cout << "Standard Error: " << e.what() << " has occurred in the SharedOrderVector class Function SharedOrderVector. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
-               exit(1);
-       }
-       catch(...) {
-               cout << "An unknown error has occurred in the SharedOrderVector class function SharedOrderVector. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+               m->errorOut(e, "SharedOrderVector", "SharedOrderVector");
                exit(1);
        }
 }
 /***********************************************************************/
 
 int SharedOrderVector::getNumBins(){
-       if(needToUpdate == 1){  updateStats();  }
        return numBins;
 }
 
 /***********************************************************************/
 
 int SharedOrderVector::getNumSeqs(){
-       if(needToUpdate == 1){  updateStats();  }
        return numSeqs;
 }
 
 /***********************************************************************/
 
 int SharedOrderVector::getMaxRank(){
-       if(needToUpdate == 1){  updateStats();  }
        return maxRank;
 }
 
@@ -140,8 +163,8 @@ void SharedOrderVector::set(int index, int binNumber, int abund, string groupNam
        data[index].group = groupName;
        data[index].bin = binNumber;
        data[index].abundance = abund;
-       needToUpdate = 1;
-       
+       //if (abund > maxRank) { maxRank = abund; }
+       updateStats();
 }
 
 /***********************************************************************/
@@ -152,15 +175,18 @@ individual SharedOrderVector::get(int index){
 
 
 /***********************************************************************/
-
+//commented updateStats out to improve speed, but whoever calls this must remember to update when they are done with all the pushbacks they are doing 
 void SharedOrderVector::push_back(int binNumber, int abund, string groupName){
        individual newGuy;
        newGuy.group = groupName;
        newGuy.abundance = abund;
        newGuy.bin = binNumber;
        data.push_back(newGuy);
-       needToUpdate = 1;
+       //numSeqs++;
+       //numBins++;
+       //if (abund > maxRank) { maxRank = abund; }
        
+       //updateStats();
 }
 
 /***********************************************************************/
@@ -175,20 +201,23 @@ void SharedOrderVector::print(ostream& output){
                output << endl;
        }
        catch(exception& e) {
-               cout << "Standard Error: " << e.what() << " has occurred in the SharedOrderVector class Function print. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
-               exit(1);
-       }
-       catch(...) {
-               cout << "An unknown error has occurred in the SharedOrderVector class function print. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+               m->errorOut(e, "SharedOrderVector", "print");
                exit(1);
        }
 }
 
+/***********************************************************************/
 
+void SharedOrderVector::clear(){
+       numBins = 0;
+       maxRank = 0;
+       numSeqs = 0;
+       data.clear();
+}
 /***********************************************************************/
 
 void SharedOrderVector::resize(int){
-       cout << "resize() did nothing in class SharedOrderVector";
+       m->mothurOut("resize() did nothing in class SharedOrderVector");
 }
 
 /***********************************************************************/
@@ -231,13 +260,9 @@ RAbundVector SharedOrderVector::getRAbundVector(){
                return rav;
        }
        catch(exception& e) {
-               cout << "Standard Error: " << e.what() << " has occurred in the SharedOrderVector class Function getRAbundVector. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+               m->errorOut(e, "SharedOrderVector", "getRAbundVector");
                exit(1);
        }
-       catch(...) {
-               cout << "An unknown error has occurred in the SharedOrderVector class function getRAbundVector. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
-               exit(1);
-       }       
 }
 /***********************************************************************/
 
@@ -255,11 +280,7 @@ OrderVector SharedOrderVector::getOrderVector(map<string,int>* nameMap = NULL) {
                return ov;
        }
        catch(exception& e) {
-               cout << "Standard Error: " << e.what() << " has occurred in the SharedOrderVector class Function getOrderVector. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
-               exit(1);
-       }
-       catch(...) {
-               cout << "An unknown error has occurred in the SharedOrderVector class function getOrderVector. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+               m->errorOut(e, "SharedOrderVector", "getOrderVector");
                exit(1);
        }
 }
@@ -289,14 +310,30 @@ SharedRAbundVector SharedOrderVector::getSharedRAbundVector(string group) {
                return sharedRav;
        }
        catch(exception& e) {
-               cout << "Standard Error: " << e.what() << " has occurred in the SharedOrderVector class Function getSharedRAbundVector. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+               m->errorOut(e, "SharedOrderVector", "getSharedRAbundVector");
                exit(1);
        }
-       catch(...) {
-               cout << "An unknown error has occurred in the SharedOrderVector class function getSharedRAbundVector. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+}
+/***********************************************************************/
+vector<SharedRAbundVector*> SharedOrderVector::getSharedRAbundVector() {
+       try {
+               SharedUtil* util;
+               util = new SharedUtil();
+               vector<SharedRAbundVector*> lookup;
+               
+               vector<string> Groups = m->getGroups();
+               vector<string> allGroups = m->getAllGroups();
+               util->setGroups(Groups, allGroups);
+               util->getSharedVectors(Groups, lookup, this);
+               m->setGroups(Groups);
+               m->setAllGroups(allGroups);
+               
+               return lookup;
+       }
+       catch(exception& e) {
+               m->errorOut(e, "SharedOrderVector", "getSharedRAbundVector");
                exit(1);
        }
-       
 }
 /***********************************************************************/
 SharedSAbundVector SharedOrderVector::getSharedSAbundVector(string group) {
@@ -307,19 +344,15 @@ SharedSAbundVector SharedOrderVector::getSharedSAbundVector(string group) {
                                
        }
        catch(exception& e) {
-               cout << "Standard Error: " << e.what() << " has occurred in the SharedOrderVector class Function getSharedRAbundVector. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
-               exit(1);
-       }
-       catch(...) {
-               cout << "An unknown error has occurred in the SharedOrderVector class function getSharedRAbundVector. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+               m->errorOut(e, "SharedOrderVector", "getSharedSAbundVector");
                exit(1);
        }
-       
 }
 
 /***********************************************************************/
 
 SharedOrderVector SharedOrderVector::getSharedOrderVector(){
+       random_shuffle(data.begin(), data.end());
        return *this;                   
 }
 
@@ -332,34 +365,23 @@ void SharedOrderVector::updateStats(){
                numBins = 0;
                maxRank = 0;
        
-               for(int i=0;i<data.size();i++){
-                       if(data[i].bin != -1){
-                               numSeqs++;
-                       }
-               }
-       
-               vector<individual> hold(numSeqs);
-       
+               numSeqs = data.size();
+                               
+               vector<int> hold(numSeqs, 0);
                for(int i=0;i<numSeqs;i++){
-                       if(data[i].bin != -1){
-                               hold[data[i].bin].bin = hold[data[i].bin].bin+1;
-                       }
+                       hold[data[i].bin] = hold[data[i].bin]+1;
                }       
-
+               
                for(int i=0;i<numSeqs;i++){
-                       if(data[i].bin > numBins) { numBins = data[i].bin;      } 
-                       if(data[i].abundance > maxRank) {       maxRank = data[i].abundance;    }
+                       if(hold[i] > 0)                         {       numBins++;                              }
+                       if(hold[i] > maxRank)           {       maxRank = hold[i];              }
                }
-               numBins++; //if you have 10 bins largest .bin is 9 since we start at 0.
+               
        }
        catch(exception& e) {
-               cout << "Standard Error: " << e.what() << " has occurred in the SharedOrderVector class Function updateStats. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+               m->errorOut(e, "SharedOrderVector", "updateStats");
                exit(1);
        }
-       catch(...) {
-               cout << "An unknown error has occurred in the SharedOrderVector class function updateStats. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
-               exit(1);
-       }       
 }
 
 /***********************************************************************/