]> git.donarmstrong.com Git - mothur.git/blobdiff - sharedchao1.cpp
fixed some bugs and added scriptengine
[mothur.git] / sharedchao1.cpp
index 0df0eabf8c2829ce6f6184276871687da66d4120..8dff314b2b7ab3d913d73d4437cd3b82cefd863c 100644 (file)
@@ -12,8 +12,7 @@
 /***********************************************************************/
 EstOutput SharedChao1::getValues(vector<SharedRAbundVector*> shared){
        try {
-               data.resize(1,0);
-               
+               data.resize(1,0);               
                vector<int> temp; 
                int numGroups = shared.size();
                float Chao = 0.0; float leftvalue, rightvalue;
@@ -42,7 +41,6 @@ EstOutput SharedChao1::getValues(vector<SharedRAbundVector*> shared){
                        
                        //they are shared
                        if (sharedByAll == true) { 
-                                
                                // cout << "temp = ";
                                // for (int h = 0; h < temp.size(); h++) { cout << temp[h] << " "; } cout << endl;
                                //find f1 and f2values
@@ -53,29 +51,40 @@ EstOutput SharedChao1::getValues(vector<SharedRAbundVector*> shared){
                        
                //cout << "Entering " << endl;
                //calculate chao1, (numleaves-1) because numleaves contains the ++ values.
-               for (int i = 0; i < numLeaves; i++) {
-                       //divide by zero error
-                       if (f2leaves[i]->lvalue == 0) { f2leaves[i]->lvalue++; }
-                       if (f2leaves[i]->rvalue == 0) { f2leaves[i]->rvalue++; }
-                       
-                       //cout << "f2 leaves ";
-                       //cout << f2leaves[i]->lvalue << f2leaves[i]->rvalue << endl;
-                       
-               //      cout << "f2 leaf coef ";
-                       //cout << f2leaves[i]->lcoef << '\t' << f2leaves[i]->rcoef << endl;
-                       
-               //      cout << "f1 leaves ";
-               //      cout << f1leaves[i]->lvalue << f1leaves[i]->rvalue << endl;
-                       
+               bool bias;
+               for(int i=0;i<numLeaves;i++){
+                       if (f2leaves[i]->lvalue == 0) { bias = true;}// break;}
+               }
+
+               if(bias){
+                       for (int i = 0; i < numLeaves; i++) {
+                               
+                               leftvalue = (float)(f1leaves[i]->lvalue * (f1leaves[i]->lvalue - 1)) / (float)((pow(2, (float)f2leaves[i]->lcoef)) * (f2leaves[i]->lvalue + 1));
+                               if (i != (numLeaves-1)) {
+                                       rightvalue = (float)(f1leaves[i]->rvalue * (f1leaves[i]->rvalue - 1)) / (float)((pow(2, (float)f2leaves[i]->rcoef)) * (f2leaves[i]->rvalue + 1));
+                               }else{
+                                       rightvalue = (float)(f1leaves[i]->rvalue);
+                               }
+                               Chao += leftvalue + rightvalue;
+                       }
+               }
+               else{
                        
-                       leftvalue = (float)(f1leaves[i]->lvalue * f1leaves[i]->lvalue) / (float)((pow(2, (float)f2leaves[i]->lcoef)) * f2leaves[i]->lvalue);
-                       if (i != (numLeaves-1)) {
-                               rightvalue = (float)(f1leaves[i]->rvalue * f1leaves[i]->rvalue) / (float)((pow(2, (float)f2leaves[i]->rcoef)) * f2leaves[i]->rvalue);
-                       }else{
-                               rightvalue = (float)(f1leaves[i]->rvalue);
+                       for (int i = 0; i < numLeaves; i++) {
+                               
+                               leftvalue = (float)(f1leaves[i]->lvalue * f1leaves[i]->lvalue) / (float)((pow(2, (float)f2leaves[i]->lcoef)) * f2leaves[i]->lvalue);
+                               if (i != (numLeaves-1)) {
+                                       rightvalue = (float)(f1leaves[i]->rvalue * f1leaves[i]->rvalue) / (float)((pow(2, (float)f2leaves[i]->rcoef)) * f2leaves[i]->rvalue);
+                               }else{
+                                       rightvalue = (float)(f1leaves[i]->rvalue);
+                               }
+                               Chao += leftvalue + rightvalue;
                        }
-                       //cout << "left = " << leftvalue << " right = " << rightvalue << endl;
-                       Chao += leftvalue + rightvalue;
+               }
+               
+               for (int i = 0; i < numNodes; i++) {
+                       delete f1leaves[i];
+                       delete f2leaves[i];
                }
                
        //      cout << "exiting " << endl;