]> git.donarmstrong.com Git - mothur.git/blobdiff - sharedrabundfloatvector.cpp
added shared file type to get.groups and remove.groups
[mothur.git] / sharedrabundfloatvector.cpp
index f7405aefab95989d77bf3efec0ead7a44197b752..a5e17c2454d615be3a1c75f8b57fbe54ef85acd8 100644 (file)
 
 /***********************************************************************/
 
-SharedRAbundFloatVector::SharedRAbundFloatVector() : DataVector(), maxRank(0.0), numBins(0), numSeqs(0.0) {globaldata = GlobalData::getInstance();}
+SharedRAbundFloatVector::SharedRAbundFloatVector() : DataVector(), maxRank(0.0), numBins(0), numSeqs(0.0) {}
 /***********************************************************************/
 
 SharedRAbundFloatVector::~SharedRAbundFloatVector() {}
 
 /***********************************************************************/
 SharedRAbundFloatVector::SharedRAbundFloatVector(int n) : DataVector(), maxRank(0.0), numBins(n), numSeqs(0.0) {
-               globaldata = GlobalData::getInstance();
+               
                individualFloat newGuy;
                //initialize data
                for (int i=0; i< n; i++) {
@@ -32,9 +32,8 @@ SharedRAbundFloatVector::SharedRAbundFloatVector(int n) : DataVector(), maxRank(
 //reads a shared file
 SharedRAbundFloatVector::SharedRAbundFloatVector(ifstream& f) : DataVector(), maxRank(0.0), numBins(0), numSeqs(0.0) {
        try {
-               globaldata = GlobalData::getInstance();
                
-               if (globaldata->gGroupmap == NULL) {  groupmap = new GroupMap(); }
+               m->namesOfGroups.clear();
                
                int num, count;
                float inputData;
@@ -45,8 +44,42 @@ SharedRAbundFloatVector::SharedRAbundFloatVector(ifstream& f) : DataVector(), ma
                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;
+                       }
+               }else { label = m->saveNextLabel; }
+               
+               //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;
+               f >> groupN >> num;
+
                holdLabel = label;
                
                //add new vector to lookup
@@ -55,11 +88,7 @@ SharedRAbundFloatVector::SharedRAbundFloatVector(ifstream& f) : DataVector(), ma
                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;
-               }
+               m->namesOfGroups.push_back(groupN);
                
                //fill vector.  data = first sharedrabund in file
                for(int i=0;i<num;i++){
@@ -80,11 +109,7 @@ SharedRAbundFloatVector::SharedRAbundFloatVector(ifstream& f) : DataVector(), ma
                        f >> groupN >> num;
                        count++;
                        
-                       if (globaldata->gGroupmap == NULL) { 
-                               //save group in groupmap
-                               groupmap->namesOfGroups.push_back(groupN);
-                               groupmap->groupIndex[groupN] = count;
-                       }
+                       m->namesOfGroups.push_back(groupN);
                        
                        //add new vector to lookup
                        temp = new SharedRAbundFloatVector();
@@ -103,11 +128,8 @@ SharedRAbundFloatVector::SharedRAbundFloatVector(ifstream& f) : DataVector(), ma
                        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();  }
+               m->saveNextLabel = nextLabel;
        
-               if (globaldata->gGroupmap == NULL) { globaldata->gGroupmap = groupmap;  }
-               
        }
        catch(exception& e) {
                m->errorOut(e, "SharedRAbundFloatVector", "SharedRAbundFloatVector");
@@ -128,11 +150,20 @@ void SharedRAbundFloatVector::set(int binNumber, float newBinSize, string groupn
                numSeqs += (newBinSize - oldBinSize);
        }
        catch(exception& e) {
-               m->errorOut(e, "SharedRAbundVector", "set");
+               m->errorOut(e, "SharedRAbundFloatVector", "set");
                exit(1);
        }
 }
+/***********************************************************************/
 
+void SharedRAbundFloatVector::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();
+}
 /***********************************************************************/
 float SharedRAbundFloatVector::getAbundance(int index){
        return data[index].abundance;   
@@ -217,6 +248,39 @@ int SharedRAbundFloatVector::size(){
        return data.size();
 }
 /***********************************************************************/
+void SharedRAbundFloatVector::printHeaders(ostream& output){
+       try {
+               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" + toString(i+1);
+                               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" + toString(i+1);
+                               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 SharedRAbundFloatVector::print(ostream& output){
        try {
                output << numBins << '\t';
@@ -275,18 +339,22 @@ vector<SharedRAbundFloatVector*> SharedRAbundFloatVector::getSharedRAbundFloatVe
                SharedUtil* util;
                util = new SharedUtil();
                
-               util->setGroups(globaldata->Groups, globaldata->gGroupmap->namesOfGroups);
-
+               util->setGroups(m->Groups, m->namesOfGroups);
+               
+               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) { 
+                       if (util->isValidGroup(lookup[i]->getGroup(), m->Groups) == false) { 
                                delete lookup[i]; lookup[i] = NULL;
                                lookup.erase(lookup.begin()+i); 
                                i--; 
+                               remove = true;
                        }
                }
                
                delete util;
+               
+               if (remove) { eliminateZeroOTUS(lookup); }
        
                return lookup;
        }
@@ -397,6 +465,54 @@ OrderVector SharedRAbundFloatVector::getOrderVector(map<string,int>* nameMap = N
                exit(1);
        }
 }
-
+//**********************************************************************************************************************
+int SharedRAbundFloatVector::eliminateZeroOTUS(vector<SharedRAbundFloatVector*>& thislookup) {
+       try {
+               
+               vector<SharedRAbundFloatVector*> newLookup;
+               for (int i = 0; i < thislookup.size(); i++) {
+                       SharedRAbundFloatVector* temp = new SharedRAbundFloatVector();
+                       temp->setLabel(thislookup[i]->getLabel());
+                       temp->setGroup(thislookup[i]->getGroup());
+                       newLookup.push_back(temp);
+               }
+               
+               //for each bin
+               vector<string> newBinLabels;
+               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" + toString(i+1);
+                               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, "SharedRAbundFloatVector", "eliminateZeroOTUS");
+               exit(1);
+       }
+}
 /***********************************************************************/