]> git.donarmstrong.com Git - mothur.git/blobdiff - rarefact.cpp
added parse.fastaq command, added permute option to venn command, fixed bug with...
[mothur.git] / rarefact.cpp
index e776393b47318e8a7f9b79016433f75a8ba049d9..691d01708bab5b5bef4118ab38662819280b56de 100644 (file)
@@ -8,17 +8,22 @@
  */
 
 #include "rarefact.h"
-#include "ordervector.hpp"
+//#include "ordervector.hpp"
 
 /***********************************************************************/
 
-void Rarefact::getCurve(int increment = 1, int nIters = 1000){
+int Rarefact::getCurve(float percentFreq = 0.01, int nIters = 1000){
        try {
                RarefactionCurveData* rcd = new RarefactionCurveData();
                for(int i=0;i<displays.size();i++){
                        rcd->registerDisplay(displays[i]);
                }
-       
+               
+               //convert freq percentage to number
+               int increment = 1;
+               if (percentFreq < 1.0) {  increment = numSeqs * percentFreq;  }
+               else { increment = percentFreq;  }      
+                       
                for(int iter=0;iter<nIters;iter++){
                
                        for(int i=0;i<displays.size();i++){
@@ -31,6 +36,8 @@ void Rarefact::getCurve(int increment = 1, int nIters = 1000){
                
                        for(int i=0;i<numSeqs;i++){
                        
+                               if (m->control_pressed) { delete lookup; delete rank; delete rcd; return 0;  }
+                       
                                int binNumber = order->get(i);
                                int abundance = lookup->get(binNumber);
                        
@@ -52,95 +59,95 @@ void Rarefact::getCurve(int increment = 1, int nIters = 1000){
                        for(int i=0;i<displays.size();i++){
                                displays[i]->reset();
                        }
+                       
+                       delete lookup;
+                       delete rank;
                }
 
                for(int i=0;i<displays.size();i++){
                        displays[i]->close();
                }
+               delete rcd;
+               return 0;
        }
        catch(exception& e) {
-               cout << "Standard Error: " << e.what() << " has occurred in the Rarefact class Function getCurve. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
-               exit(1);
-       }
-       catch(...) {
-               cout << "An unknown error has occurred in the Rarefact class function getCurve. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+               m->errorOut(e, "Rarefact", "getCurve");
                exit(1);
        }
 }
 
 /***********************************************************************/
 
-void Rarefact::getSharedCurve(int increment = 1, int nIters = 1000){
+int Rarefact::getSharedCurve(float percentFreq = 0.01, int nIters = 1000){
 try {
-               globaldata = GlobalData::getInstance();
                SharedRarefactionCurveData* rcd = new SharedRarefactionCurveData();
                
+               label = lookup[0]->getLabel();
+               
                //register the displays
                for(int i=0;i<displays.size();i++){
                        rcd->registerDisplay(displays[i]);
                }
-
+               
+               //if jumble is false all iters will be the same
+               if (globaldata->jumble == false)  {  nIters = 1;  }
+               
+               //convert freq percentage to number
+               int increment = 1;
+               if (percentFreq < 1.0) {  increment = numSeqs * percentFreq;  }
+               else { increment = percentFreq;  }
+               
                for(int iter=0;iter<nIters;iter++){
-                       //clear out old values for new iter
-                       lookup.clear();
                
-                       //create and initialize vector of sharedvectors, one for each group
-                       for (int i = 0; i < globaldata->gGroupmap->getNumGroups(); i++) { 
-                               SharedRAbundVector* temp = new SharedRAbundVector(sharedorder->getNumBins());
-                               temp->setLabel(sharedorder->getLabel());
-                               temp->setGroup(globaldata->gGroupmap->namesOfGroups[i]);
-                               lookup.push_back(temp);
-                       }
-                       
                        for(int i=0;i<displays.size();i++){
                                displays[i]->init(label);                 
                        }
-               
-                       //sample all the members
-                       for(int i=0;i<numSeqs;i++){
-                               //get first sample
-                               individual chosen = sharedorder->get(i);
-                               int abundance; 
-                                       
-                               //set info for sharedvector in chosens group
-                               for (int j = 0; j < lookup.size(); j++) { 
-                                       if (chosen.group == lookup[j]->getGroup()) {
-                                               abundance = lookup[j]->getAbundance(chosen.bin);
-                                               lookup[j]->set(chosen.bin, (abundance + 1), chosen.group);
-                                               break;
-                                       }
-                               }
+                       
+                       if (globaldata->jumble == true)  {
+                               //randomize the groups
+                               random_shuffle(lookup.begin(), lookup.end());
                        }
                        
-                       //randomize the groups
-                       random_shuffle(lookup.begin(), lookup.end());
-               
+                       //make merge the size of lookup[0]
+                       SharedRAbundVector* merge = new SharedRAbundVector(lookup[0]->size());
+                       
+                       //make copy of lookup zero
+                       for(int i = 0; i<lookup[0]->size(); i++) {
+                               merge->set(i, lookup[0]->getAbundance(i), "merge");
+                       }
+                       
+                       vector<SharedRAbundVector*> subset;
                        //send each group one at a time
                        for (int k = 0; k < lookup.size(); k++) { 
-                               rcd->updateSharedData(lookup[0], lookup[k], k+1, numGroupComb);
-                               mergeVectors(lookup[0], lookup[k]);
+                               if (m->control_pressed) {  delete merge; delete rcd; return 0;  }
+                               
+                               subset.clear(); //clears out old pair of sharedrabunds
+                               //add in new pair of sharedrabunds
+                               subset.push_back(merge); subset.push_back(lookup[k]);
+                               
+                               rcd->updateSharedData(subset, k+1, numGroupComb);
+                               mergeVectors(merge, lookup[k]);
                        }
 
                        //resets output files
                        for(int i=0;i<displays.size();i++){
                                displays[i]->reset();
                        }
+                       
+                       delete merge;
                }
                
                for(int i=0;i<displays.size();i++){
                        displays[i]->close();
                }
-
+               
+               delete rcd;
+               return 0;
        }
        catch(exception& e) {
-               cout << "Standard Error: " << e.what() << " has occurred in the Rarefact class Function getSharedCurve. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
-               exit(1);
-       }
-       catch(...) {
-               cout << "An unknown error has occurred in the Rarefact class function getSharedCurve. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+               m->errorOut(e, "Rarefact", "getSharedCurve");
                exit(1);
        }
-
 }
 
 /**************************************************************************************/
@@ -148,18 +155,12 @@ void Rarefact::mergeVectors(SharedRAbundVector* shared1, SharedRAbundVector* sha
        try{
                for (int k = 0; k < shared1->size(); k++) {
                        //merge new species into shared1
-                       if ((shared1->getAbundance(k) == 0) && (shared2->getAbundance(k) != 0)) {
-                               shared1->set(k, shared2->getAbundance(k), "combo");  //set to 'combo' since this vector now contains multiple groups
-                       }
+                       shared1->set(k, (shared1->getAbundance(k) + shared2->getAbundance(k)), "combo");  //set to 'combo' since this vector now contains multiple groups
                }
        }
        catch(exception& e) {
-               cout << "Standard Error: " << e.what() << " has occurred in the Rarefact class Function mergeVectors. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+               m->errorOut(e, "Rarefact", "mergeVectors");
                exit(1);
        }
-       catch(...) {
-               cout << "An unknown error has occurred in the Rarefact class function mergeVectors. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
-               exit(1);
-       }       
 }