]> git.donarmstrong.com Git - mothur.git/blobdiff - sharedrabundvector.cpp
added shared file type to get.groups and remove.groups
[mothur.git] / sharedrabundvector.cpp
index b41c5fafa40255b1535526f79c2ce1c5dc637a43..7952859bccb3048bd796bdb05f74d2d920ed9c05 100644 (file)
@@ -68,8 +68,38 @@ SharedRAbundVector::SharedRAbundVector(ifstream& f) : DataVector(), maxRank(0),
                
                for (int i = 0; i < lookup.size(); i++) {  delete lookup[i]; lookup[i] = NULL; }  lookup.clear();
                
-               if (m->saveNextLabel == "") {  f >> label;  }
-               else { label = m->saveNextLabel; }
+               //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 >> groupN >> num;
@@ -90,8 +120,7 @@ SharedRAbundVector::SharedRAbundVector(ifstream& f) : DataVector(), maxRank(0),
                        
                        lookup[0]->push_back(inputData, groupN); //abundance, bin, group
                        push_back(inputData, groupN);
-                       //numSeqs += inputData;
-                       //numBins++;
+                       
                        if (inputData > maxRank) { maxRank = inputData; }
                }
                
@@ -115,6 +144,7 @@ SharedRAbundVector::SharedRAbundVector(ifstream& f) : DataVector(), maxRank(0),
                        //fill vector.  
                        for(int i=0;i<num;i++){
                                f >> inputData;
+                               
                                lookup[count]->push_back(inputData, groupN); //abundance, bin, group
                        }
                        
@@ -300,8 +330,42 @@ int SharedRAbundVector::size(){
        return data.size();
 }
 
+
+/***********************************************************************/
+void SharedRAbundVector::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 mybinLabel = "Otu" + toString(i+1);
+                               if (i < m->currentBinLabels.size()) {  mybinLabel = m->currentBinLabels[i]; }
+                               
+                               output << mybinLabel << '\t'; 
+                       }
+                       
+                       output << endl;
+               }
+               m->printedHeaders = true;
+       }
+       catch(exception& e) {
+               m->errorOut(e, "SharedRAbundVector", "printHeaders");
+               exit(1);
+       }
+}
 /***********************************************************************/
-void SharedRAbundVector::print(ostream& output){
+void SharedRAbundVector::print(ostream& output) {
        try {
                output << numBins << '\t';
        
@@ -391,6 +455,7 @@ int SharedRAbundVector::eliminateZeroOTUS(vector<SharedRAbundVector*>& thislooku
                        }
                        
                        //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; }
                                
@@ -405,12 +470,19 @@ int SharedRAbundVector::eliminateZeroOTUS(vector<SharedRAbundVector*>& thislooku
                                        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;