]> git.donarmstrong.com Git - mothur.git/blobdiff - sharedrabundvector.cpp
fixes while testing 1.33.0
[mothur.git] / sharedrabundvector.cpp
index 56b7d094b1444a2afada95807a36b52e235c70e8..0f2e48e8ac7bbdc18b10f15f1b764aed7ee58890 100644 (file)
@@ -55,7 +55,7 @@ SharedRAbundVector::SharedRAbundVector(string id, vector<individual> rav) : Data
 }
 
 
-/***********************************************************************/
+***********************************************************************/
 //reads a shared file
 SharedRAbundVector::SharedRAbundVector(ifstream& f) : DataVector(), maxRank(0), numBins(0), numSeqs(0) {
        try {
@@ -72,7 +72,7 @@ SharedRAbundVector::SharedRAbundVector(ifstream& f) : DataVector(), maxRank(0),
                //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"
@@ -86,25 +86,47 @@ SharedRAbundVector::SharedRAbundVector(ifstream& f) : DataVector(), maxRank(0),
                                
                                //parse labels to save
                                istringstream iStringStream(label);
-                               m->binLabelsInFile.clear();
+                               m->sharedBinLabelsInFile.clear();
                                while(!iStringStream.eof()){
                                        if (m->control_pressed) { break; }
                                        string temp;
                                        iStringStream >> temp;  m->gobble(iStringStream);
                
-                                       m->binLabelsInFile.push_back(temp);
+                                       m->sharedBinLabelsInFile.push_back(temp);
                                }
                                
-                               f >> label;
-                       }
-               }else { label = m->saveNextLabel; }
+                               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->sharedBinLabelsInFile.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->sharedBinLabelsInFile.push_back(binLabel);
+                }
+            }
+               }else { 
+            label = m->saveNextLabel; 
+            
+            //read in first row since you know there is at least 1 group.
+            f >> groupN >> num;
+            
+            if (m->debug) { m->mothurOut("[DEBUG]: "+ groupN + '\t' + toString(num)); }
+        }
                
                //reset labels, currentLabels may have gotten changed as otus were eliminated because of group choices or sampling
-               m->currentBinLabels = m->binLabelsInFile;
+               m->currentSharedBinLabels = m->sharedBinLabelsInFile;
                
-               //read in first row since you know there is at least 1 group.
-               f >> groupN >> num;
-
                holdLabel = label;
                
                //add new vector to lookup
@@ -118,6 +140,7 @@ SharedRAbundVector::SharedRAbundVector(ifstream& f) : DataVector(), maxRank(0),
                //fill vector.  data = first sharedrabund in file
                for(int i=0;i<num;i++){
                        f >> inputData;
+            if (m->debug) { m->mothurOut("[DEBUG]: OTU" + toString(i+1)+ '\t' +toString(inputData)); }
                        
                        lookup[0]->push_back(inputData, groupN); //abundance, bin, group
                        push_back(inputData, groupN);
@@ -132,6 +155,7 @@ SharedRAbundVector::SharedRAbundVector(ifstream& f) : DataVector(), maxRank(0),
                //read the rest of the groups info in
                while ((nextLabel == holdLabel) && (f.eof() != true)) {
                        f >> groupN >> num;
+            if (m->debug) { m->mothurOut("[DEBUG]: "+ groupN + '\t' + toString(num)); }
                        count++;
                        
                        allGroups.push_back(groupN);
@@ -145,6 +169,7 @@ SharedRAbundVector::SharedRAbundVector(ifstream& f) : DataVector(), maxRank(0),
                        //fill vector.  
                        for(int i=0;i<num;i++){
                                f >> inputData;
+                if (m->debug) { m->mothurOut("[DEBUG]: OTU" + toString(i+1)+ '\t' +toString(inputData)); }
                                
                                lookup[count]->push_back(inputData, groupN); //abundance, bin, group
                        }
@@ -155,7 +180,6 @@ SharedRAbundVector::SharedRAbundVector(ifstream& f) : DataVector(), maxRank(0),
                }
                m->saveNextLabel = nextLabel;
                m->setAllGroups(allGroups);
-               
        }
        catch(exception& e) {
                m->errorOut(e, "SharedRAbundVector", "SharedRAbundVector");
@@ -192,6 +216,18 @@ int SharedRAbundVector::getAbundance(int index){
        return data[index].abundance;
        
 }
+/***********************************************************************/
+//returns vector of abundances 
+vector<int> SharedRAbundVector::getAbundances(){
+    vector<int> abunds;
+    for (int i = 0; i < data.size(); i++) {
+        abunds.push_back(data[i].abundance);
+    }
+    
+       return abunds;
+}
+
+
 /***********************************************************************/
 
 int SharedRAbundVector::numNZ(){
@@ -336,14 +372,20 @@ int SharedRAbundVector::size(){
 /***********************************************************************/
 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" + toString(i+1);
-                               if (i < m->currentBinLabels.size()) {  binLabel = m->currentBinLabels[i]; }
+                               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->currentSharedBinLabels.size()) {  binLabel = m->currentSharedBinLabels[i]; }
                                
                                output << binLabel << '\t'; 
                        }
@@ -351,15 +393,21 @@ void SharedRAbundVector::printHeaders(ostream& output){
                }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]; }
+                               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->currentSharedBinLabels.size()) {  binLabel = m->currentSharedBinLabels[i]; }
                                
-                               output << mybinLabel << '\t'; 
+                               output << binLabel << '\t'; 
                        }
                        
                        output << endl;
                }
-               m->printedHeaders = true;
+               m->printedSharedHeaders = true;
        }
        catch(exception& e) {
                m->errorOut(e, "SharedRAbundVector", "printHeaders");
@@ -395,7 +443,7 @@ int SharedRAbundVector::getGroupIndex()  { return index; }
 void SharedRAbundVector::setGroupIndex(int vIndex)     { index = vIndex; }
 /***********************************************************************/
 int SharedRAbundVector::getNumBins(){
-       return numBins;
+               return numBins;
 }
 
 /***********************************************************************/
@@ -423,6 +471,7 @@ vector<SharedRAbundVector*> SharedRAbundVector::getSharedRAbundVectors(){
                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++) {
@@ -460,6 +509,7 @@ int SharedRAbundVector::eliminateZeroOTUS(vector<SharedRAbundVector*>& thislooku
                        
                        //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; }
                                
@@ -476,8 +526,14 @@ int SharedRAbundVector::eliminateZeroOTUS(vector<SharedRAbundVector*>& thislooku
                                        }
                                        
                                        //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]; }
+                                       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->currentSharedBinLabels.size()) {  binLabel = m->currentSharedBinLabels[i]; }
                                        
                                        newBinLabels.push_back(binLabel);
                                }
@@ -486,7 +542,7 @@ int SharedRAbundVector::eliminateZeroOTUS(vector<SharedRAbundVector*>& thislooku
                        for (int j = 0; j < thislookup.size(); j++) {  delete thislookup[j];  }
                        
                        thislookup = newLookup;
-                       m->currentBinLabels = newBinLabels;
+                       m->currentSharedBinLabels = newBinLabels;
                        
                        return 0;