]> git.donarmstrong.com Git - mothur.git/blobdiff - sharedrabundvector.cpp
sffinfo bug with flow grams right index when clipQualRight=0
[mothur.git] / sharedrabundvector.cpp
index 74fb1c51ebb37d10185dced775be0af3829a7c41..3901650cef965dc7a3c0126ecb54a8fb425e434d 100644 (file)
@@ -55,12 +55,13 @@ SharedRAbundVector::SharedRAbundVector(string id, vector<individual> rav) : Data
 }
 
 
-/***********************************************************************/
+***********************************************************************/
 //reads a shared file
 SharedRAbundVector::SharedRAbundVector(ifstream& f) : DataVector(), maxRank(0), numBins(0), numSeqs(0) {
        try {
-               m->namesOfGroups.clear();
-                               
+               m->clearAllGroups();
+               vector<string> allGroups;
+               
                int num, inputData, count;
                count = 0;  
                string holdLabel, nextLabel, groupN;
@@ -71,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"
@@ -94,16 +95,36 @@ SharedRAbundVector::SharedRAbundVector(ifstream& f) : DataVector(), maxRank(0),
                                        m->binLabelsInFile.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->binLabelsInFile.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->binLabelsInFile.push_back(binLabel);
+                }
+            }
+               }else { 
+            label = m->saveNextLabel; 
+            
+            //read in first row since you know there is at least 1 group.
+            f >> groupN >> num;
+        }
                
                //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;
-
                holdLabel = label;
                
                //add new vector to lookup
@@ -112,7 +133,7 @@ SharedRAbundVector::SharedRAbundVector(ifstream& f) : DataVector(), maxRank(0),
                lookup[0]->setLabel(label);
                lookup[0]->setGroup(groupN);
                
-               m->namesOfGroups.push_back(groupN);
+               allGroups.push_back(groupN);
                
                //fill vector.  data = first sharedrabund in file
                for(int i=0;i<num;i++){
@@ -133,7 +154,7 @@ SharedRAbundVector::SharedRAbundVector(ifstream& f) : DataVector(), maxRank(0),
                        f >> groupN >> num;
                        count++;
                        
-                       m->namesOfGroups.push_back(groupN);
+                       allGroups.push_back(groupN);
                        
                        //add new vector to lookup
                        temp = new SharedRAbundVector();
@@ -152,8 +173,8 @@ SharedRAbundVector::SharedRAbundVector(ifstream& f) : DataVector(), maxRank(0),
                                
                        if (f.eof() != true) { f >> nextLabel; }
                }
-                       m->saveNextLabel = nextLabel;
-               
+               m->saveNextLabel = nextLabel;
+               m->setAllGroups(allGroups);
        }
        catch(exception& e) {
                m->errorOut(e, "SharedRAbundVector", "SharedRAbundVector");
@@ -334,13 +355,19 @@ 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);
+                               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->currentBinLabels.size()) {  binLabel = m->currentBinLabels[i]; }
                                
                                output << binLabel << '\t'; 
@@ -349,10 +376,16 @@ 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->currentBinLabels.size()) {  binLabel = m->currentBinLabels[i]; }
                                
-                               output << mybinLabel << '\t'; 
+                               output << binLabel << '\t'; 
                        }
                        
                        output << endl;
@@ -393,7 +426,7 @@ int SharedRAbundVector::getGroupIndex()  { return index; }
 void SharedRAbundVector::setGroupIndex(int vIndex)     { index = vIndex; }
 /***********************************************************************/
 int SharedRAbundVector::getNumBins(){
-       return numBins;
+               return numBins;
 }
 
 /***********************************************************************/
@@ -418,12 +451,15 @@ vector<SharedRAbundVector*> SharedRAbundVector::getSharedRAbundVectors(){
                SharedUtil* util;
                util = new SharedUtil();
                
-               util->setGroups(m->Groups, m->namesOfGroups);
+               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++) {
                        //if this sharedrabund is not from a group the user wants then delete it.
-                       if (util->isValidGroup(lookup[i]->getGroup(), m->Groups) == false) { 
+                       if (util->isValidGroup(lookup[i]->getGroup(), m->getGroups()) == false) { 
                                remove = true;
                                delete lookup[i]; lookup[i] = NULL;
                                lookup.erase(lookup.begin()+i); 
@@ -456,6 +492,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; }
                                
@@ -472,7 +509,13 @@ int SharedRAbundVector::eliminateZeroOTUS(vector<SharedRAbundVector*>& thislooku
                                        }
                                        
                                        //if there is a bin label use it otherwise make one
-                                       string binLabel = "Otu" + (i+1);
+                                       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->currentBinLabels.size()) {  binLabel = m->currentBinLabels[i]; }
                                        
                                        newBinLabels.push_back(binLabel);