]> git.donarmstrong.com Git - mothur.git/blob - structpearson.cpp
added odum, canberra, structchi2, structchord, structeuclidean, gower, hellinger...
[mothur.git] / structpearson.cpp
1 /*
2  *  structpearson.cpp
3  *  Mothur
4  *
5  *  Created by westcott on 12/15/10.
6  *  Copyright 2010 Schloss Lab. All rights reserved.
7  *
8  */
9
10 #include "structpearson.h"
11
12 /***********************************************************************/
13 EstOutput StructPearson::getValues(vector<SharedRAbundVector*> shared) {
14         try {
15                 data.resize(1,0);
16                 
17                 double sumA = 0.0;
18                 double sumB = 0.0;
19                 int numOTUS = shared[0]->getNumBins();
20                 
21                 for (int i = 0; i < shared[0]->getNumBins(); i++) { 
22                         sumA += shared[0]->getAbundance(i);
23                         sumB += shared[1]->getAbundance(i);
24                 }
25                 
26                 double numTerm1 = 0.0;
27                 double numTerm2 = 0.0;
28                 double denomTerm1 = 0.0;
29                 double denomTerm2 = 0.0;
30                 
31                 for (int i = 0; i < shared[0]->getNumBins(); i++) { 
32                         int Aij =  shared[0]->getAbundance(i);
33                         int Bij =  shared[1]->getAbundance(i);
34                         
35                         numTerm1 += (Aij - (sumA / (float) numOTUS));
36                         numTerm2 += (Bij - (sumB / (float) numOTUS));
37                         
38                         denomTerm1 += ((Aij - (sumA / (float) numOTUS)) * (Aij - (sumA / (float) numOTUS)));
39                         denomTerm2 += ((Bij - (sumB / (float) numOTUS)) * (Bij - (sumB / (float) numOTUS)));
40                 }
41                 
42                 denomTerm1 = sqrt(denomTerm1);
43                 denomTerm2 = sqrt(denomTerm2);
44                 
45                 double denom = denomTerm1 * denomTerm2;
46                 double numerator = numTerm1 * numTerm2;
47                 
48                 data[0] = 1.0 - (numerator / denom);
49                 
50                 if (isnan(data[0]) || isinf(data[0])) { data[0] = 0; }
51                 
52                 return data;
53         }
54         catch(exception& e) {
55                 m->errorOut(e, "StructPearson", "getValues");
56                 exit(1);
57         }
58 }
59 /***********************************************************************/