]> git.donarmstrong.com Git - mothur.git/blob - mempearson.cpp
working on pam
[mothur.git] / mempearson.cpp
1 /*
2  *  mempearson.cpp
3  *  Mothur
4  *
5  *  Created by westcott on 12/17/10.
6  *  Copyright 2010 Schloss Lab. All rights reserved.
7  *
8  */
9
10 #include "mempearson.h"
11
12 /***********************************************************************/
13 EstOutput MemPearson::getValues(vector<SharedRAbundVector*> shared) {
14         try {
15                 data.resize(1,0);
16                 
17                 int nonZeroA = 0;
18                 int nonZeroB = 0;
19                 int numOTUS = shared[0]->getNumBins();
20                 
21                 //for each otu
22                 for (int i = 0; i < shared[0]->getNumBins(); i++) {
23                         if (shared[0]->getAbundance(i) != 0) { nonZeroA++; }
24                         if (shared[1]->getAbundance(i) != 0) { nonZeroB++; }
25                 }
26                 
27                 double numTerm = 0.0;
28                 double denomTerm1 = 0.0;
29                 double denomTerm2 = 0.0;
30                 double averageA = nonZeroA / (float) numOTUS;
31                 double averageB = nonZeroB / (float) numOTUS;
32                 
33                 for (int i = 0; i < shared[0]->getNumBins(); i++) { 
34                         int Aij =  shared[0]->getAbundance(i);
35                         int Bij =  shared[1]->getAbundance(i);
36                         
37                         if (Aij > 0) { Aij = 1; }
38                         if (Bij > 0) { Bij = 1; }
39                         
40                         numTerm += ((Aij - averageA) * (Bij - averageB));
41                         denomTerm1 += ((Aij - averageA) * (Aij - averageA));
42                         denomTerm2 += ((Bij - averageB) * (Bij - averageB));
43                 }
44                 
45                 denomTerm1 = sqrt(denomTerm1);
46                 denomTerm2 = sqrt(denomTerm2);
47                 
48                 double denom = denomTerm1 * denomTerm2;
49
50                 if (denom != 0) { 
51                         data[0] = (numTerm / denom);
52                 }else {
53                         data[0] = 1.0;
54                 }
55                 
56                 if (isnan(data[0]) || isinf(data[0])) { data[0] = 0; }
57                 
58                 return data;
59         }
60         catch(exception& e) {
61                 m->errorOut(e, "MemPearson", "getValues");
62                 exit(1);
63         }
64 }
65 /***********************************************************************/
66