]> git.donarmstrong.com Git - mothur.git/blobdiff - simpson.cpp
Initial revision
[mothur.git] / simpson.cpp
diff --git a/simpson.cpp b/simpson.cpp
new file mode 100644 (file)
index 0000000..758c4a3
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+ *  simpson.cpp
+ *  Dotur
+ *
+ *  Created by Sarah Westcott on 1/7/09.
+ *  Copyright 2009 Schloss Lab UMASS Amherst. All rights reserved.
+ *
+ */
+
+#include "simpson.h"
+
+/***********************************************************************/
+
+EstOutput Simpson::getValues(SAbundVector* rank){
+       try {
+               //vector<double> simpsonData(3,0);
+               data.resize(3,0);
+               double simpson = 0.0000;
+               double ci = 0;
+       
+               double maxRank = (double)rank->getMaxRank();
+               int sampled = rank->getNumSeqs();
+               int sobs = rank->getNumBins();
+       
+               double firstTerm = 0;
+               double secondTerm = 0;
+       
+               if(sobs != 0){
+                       double simnum=0.0000;
+               
+                       for(int i=1;i<=maxRank;i++){
+                               simnum += (double)(rank->get(i)*i*(i-1));
+                       }
+               
+                       simpson = simnum / (double)(sampled*(sampled-1));
+               
+                       for(int i=1;i<=maxRank;i++){
+                               double piI = (double) i / (double)sampled;
+                               firstTerm += rank->get(i) * pow(piI, 3);
+                               secondTerm += rank->get(i) * pow(piI, 2);
+                       }
+               
+                       double var = (4.0 / (double)sampled) * (firstTerm - secondTerm*secondTerm);
+                       ci = 1.95 * pow(var, 0.5);
+               }
+       
+               double simpsonlci = simpson - ci;
+               double simpsonhci = simpson + ci;
+               
+               data[0] = simpson;
+               data[1] = simpsonlci;
+               data[2] = simpsonhci;
+               
+               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 Simpson class Function getValues. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+               exit(1);
+       }
+       catch(...) {
+               cout << "An unknown error has occurred in the Simpson class function getValues. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+               exit(1);
+       }       
+}
+
+/***********************************************************************/