]> git.donarmstrong.com Git - mothur.git/blobdiff - logsd.cpp
sffinfo bug with flow grams right index when clipQualRight=0
[mothur.git] / logsd.cpp
index 14d2e442fa2bea0a6e153dc310b59d687b51b642..6a795415d832f265325138422f48d77afe3315be 100644 (file)
--- a/logsd.cpp
+++ b/logsd.cpp
@@ -14,6 +14,7 @@
 double LogSD::logS(double x){
        return -(1-x)*log(1-x)/x;
 }
+/***********************************************************************/
 EstOutput LogSD::getValues(SAbundVector* rank){
        try {
                
@@ -29,14 +30,13 @@ EstOutput LogSD::getValues(SAbundVector* rank){
                SAbundVector *rank = &rankw;*/
                
                data.resize(3,0);
-               int numInd = rank->getNumSeqs();
-               int numSpec = rank->getNumBins();
+               double numInd = rank->getNumSeqs();
+               double numSpec = rank->getNumBins();
                double snRatio = (double)numSpec/numInd;
                double x = .5;
                double step = .4999999999;
                
-               while(fabs(snRatio - logS(x)) > .00001) //This uses a binary search to find the value of x.
-               {
+               while(fabs(snRatio - logS(x)) > .00001) { //This uses a binary search to find the value of x.
                        if(logS(x) > snRatio)
                                x += step;
                        else
@@ -45,21 +45,18 @@ EstOutput LogSD::getValues(SAbundVector* rank){
                }
                double alpha = numInd*(1-x)/x;
 
-               int oct = 1;
+               double oct = 1;
                double octSumObs = 0;
                double sumObs = 0;
                double octSumExp = 0;
                double sumExp = 0;
                double maxDiff = 0;
-               for(int y = 1; y < rank->size(); y++)
-               {
-                       if(y - .5 < pow(2.0, oct))
-                       {
+               for(int y = 1; y < rank->size(); y++) {
+                       if(y - .5 < pow(2.0, oct)) {
                                octSumObs += rank->get(y);
                                octSumExp += alpha*pow(x,y)/(y);
                        }       
-                       else
-                       {
+                       else {
                                sumObs += octSumObs;
                                octSumObs = rank->get(y);
 
@@ -68,8 +65,7 @@ EstOutput LogSD::getValues(SAbundVector* rank){
                                oct++;
                        }
        
-                       if(y == rank->size()-1)
-                       {
+                       if(y == rank->size()-1) {
                                sumObs += octSumObs;
                                sumExp += octSumExp;
                        }
@@ -78,27 +74,21 @@ EstOutput LogSD::getValues(SAbundVector* rank){
                        if(diff > maxDiff)
                                maxDiff = diff;
                }
+
+               data[0] = (maxDiff + .5)/numSpec;
+               data[1] = 0.886/sqrt(numSpec);
+               data[2] = 1.031/sqrt(numSpec);
                
-               double DStatistic = (maxDiff + .5)/numSpec;
-               /*cout << "LogSD:\n";
-               cout << "D Test Statistic = " << DStatistic << "\n";
-               cout << ".05 confidence value = " << .89196/sqrt(numSpec) << "\n";
-               cout << "If D Test Statistic is greater than the critical value then the data fits the Log Series Distribution model w/ 95% confidence.\n\n";*/
-               
-               data[0] = DStatistic;
-               data[1] = .89196/sqrt(numSpec);
                if (isnan(data[0]) || isinf(data[0])) { data[0] = 0; }
                if (isnan(data[1]) || isinf(data[1])) { data[1] = 0; }
+               if (isnan(data[2]) || isinf(data[2])) { data[2] = 0; }
+               
                return data;
        }
        catch(exception& e) {
-               cout << "Standard Error: " << e.what() << " has occurred in the NPShannon class Function getValues. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+               m->errorOut(e, "LogSD", "getValues");
                exit(1);
        }
-       catch(...) {
-               cout << "An unknown error has occurred in the NPShannon class function getValues. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
-               exit(1);
-       }       
 }
 
 /***********************************************************************/