]> git.donarmstrong.com Git - mothur.git/blobdiff - sharedthetayc.cpp
pat's changes to trim.seqs
[mothur.git] / sharedthetayc.cpp
index 1357cb611b407319de5c093ca2d0e99e14be7ead..6f3f25001a73208caa74dc438a0b9c7652f70531 100644 (file)
 #include "sharedthetayc.h"
 
 /***********************************************************************/
-EstOutput ThetaYC::getValues(SharedRAbundVector* shared1, SharedRAbundVector* shared2) {
+EstOutput ThetaYC::getValues(vector<SharedRAbundVector*> shared) {
        try {   
-               data.resize(1,0);
+               data.resize(3,0.0000);
                
-               int Atotal, Btotal, tempA, tempB;
-               Atotal = 0; Btotal = 0; 
-               float thetaYC, sumSharedA, sumSharedB, a, b, d;
-               thetaYC = 0.0; sumSharedA = 0.0; sumSharedB = 0.0; a = 0.0; b = 0.0; d = 0.0;
+               float Atotal = 0;
+               float Btotal = 0;
+               float thetaYC = 0;
+               float pi = 0;
+               float qi = 0;
+               float a = 0;
+               float b = 0;
+               float d = 0;
+               
+               float sumPcubed = 0;
+               float sumQcubed = 0;
+               float sumPQsq = 0;
+               float sumPsqQ = 0;
                
                //get the total values we need to calculate the theta denominator sums
-               for (int i = 0; i < shared1->size(); i++) {
+               for (int i = 0; i < shared[0]->size(); i++) {
                        //store in temps to avoid multiple repetitive function calls
-                       Atotal += shared1->getAbundance(i);
-                       Btotal += shared2->getAbundance(i);
+                       Atotal += (float)shared[0]->getAbundance(i);
+                       Btotal += (float)shared[1]->getAbundance(i);
                }
                
                //calculate the theta denominator sums
-               for (int j = 0; j < shared1->size(); j++) {
+               for (int j = 0; j < shared[0]->size(); j++) {
                        //store in temps to avoid multiple repetitive function calls
-                       tempA = shared1->getAbundance(j);
-                       tempB = shared2->getAbundance(j);
-                       
-                       //they are shared
-                       if ((tempA != 0) && (tempB != 0)) {
-                               if (Atotal != 0)        { sumSharedA = (tempA / (float)Atotal); }
-                               if (Btotal != 0)        { sumSharedB = (tempB / (float)Btotal); }
+                       pi = shared[0]->getAbundance(j) / Atotal;
+                       qi = shared[1]->getAbundance(j) / Btotal;
+                                       
+                       a += pi * pi;
+                       b += qi * qi;
+                       d += pi * qi;
                        
-                               a += sumSharedA * sumSharedA;
-                               b += sumSharedB * sumSharedB;
-                               d += sumSharedA * sumSharedB;
-                       }
+                       sumPcubed += pi * pi * pi;
+                       sumQcubed += qi * qi * qi;
+                       sumPQsq += pi * qi * qi;
+                       sumPsqQ += pi * pi * qi;
                }
 
-               thetaYC = d / (float) (a + b - d);
+               thetaYC = d / (a + b - d);
                
                if (isnan(thetaYC) || isinf(thetaYC)) { thetaYC = 0; }
                
+               float varA = 4 / Atotal * (sumPcubed - a * a);
+               float varB = 4 / Btotal * (sumQcubed - b * b);
+               float varD = sumPQsq / Atotal + sumPsqQ / Btotal - d * d * (1/Atotal + 1/Btotal);
+               float covAD = 2 / Atotal * (sumPsqQ - a * d);
+               float covBD = 2 / Btotal * (sumPQsq - b* d);
+               
+               float varT = d * d * (varA + varB) / pow(a + b - d, (float)4.0) + pow(a+b, (float)2.0) * varD / pow(a+b-d, (float)4.0)
+                                               - 2.0 * (a + b) * d / pow(a + b - d, (float)4.0) * (covAD + covBD);
+               
+               float ci = 1.95 * sqrt(varT);
+               
                data[0] = thetaYC;
+               data[1] = thetaYC - ci;
+               data[2] = thetaYC + ci;
                
                return data;
        }
        catch(exception& e) {
-               cout << "Standard Error: " << e.what() << " has occurred in the ThetaYC class Function getValues. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+               m->errorOut(e, "ThetaYC", "getValues");
                exit(1);
        }
-       catch(...) {
-               cout << "An unknown error has occurred in the ThetaYC class Function getValues. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
-               exit(1);
-       }       
 }
 
 /***********************************************************************/