]> git.donarmstrong.com Git - mothur.git/blobdiff - sharedrabundfloatvector.cpp
pca command
[mothur.git] / sharedrabundfloatvector.cpp
index f7405aefab95989d77bf3efec0ead7a44197b752..d65cc204cc97bd43941928bad593b515522625e6 100644 (file)
@@ -45,8 +45,12 @@ SharedRAbundFloatVector::SharedRAbundFloatVector(ifstream& f) : DataVector(), ma
                for (int i = 0; i < lookup.size(); i++) {  delete lookup[i]; lookup[i] = NULL; }
                lookup.clear();
                
+               if (globaldata->saveNextLabel == "") {  f >> label;  }
+               else { label = globaldata->saveNextLabel; }
+               
                //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
@@ -103,8 +107,7 @@ 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();  }
+               globaldata->saveNextLabel = nextLabel;
        
                if (globaldata->gGroupmap == NULL) { globaldata->gGroupmap = groupmap;  }
                
@@ -128,11 +131,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;   
@@ -276,17 +288,21 @@ vector<SharedRAbundFloatVector*> SharedRAbundFloatVector::getSharedRAbundFloatVe
                util = new SharedUtil();
                
                util->setGroups(globaldata->Groups, globaldata->gGroupmap->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) { 
                                delete lookup[i]; lookup[i] = NULL;
                                lookup.erase(lookup.begin()+i); 
                                i--; 
+                               remove = true;
                        }
                }
                
                delete util;
+               
+               if (remove) { eliminateZeroOTUS(lookup); }
        
                return lookup;
        }
@@ -397,6 +413,47 @@ 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
+               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());
+                               }
+                       }
+               }
+               
+               for (int j = 0; j < thislookup.size(); j++) {  delete thislookup[j];  }
+               
+               thislookup = newLookup;
+               
+               return 0;
+               
+       }
+       catch(exception& e) {
+               m->errorOut(e, "SharedRAbundFloatVector", "eliminateZeroOTUS");
+               exit(1);
+       }
+}
 /***********************************************************************/