try {
data.resize(3,0.0000);
- float Atotal = 0;
- float Btotal = 0;
- float thetaYC = 0;
- float pi = 0;
- float qi = 0;
- float a = 0;
- float b = 0;
- float d = 0;
+ double Atotal = 0;
+ double Btotal = 0;
+ double thetaYC = 0;
+ double pi = 0;
+ double qi = 0;
+ double a = 0;
+ double b = 0;
+ double d = 0;
- float sumPcubed = 0;
- float sumQcubed = 0;
- float sumPQsq = 0;
- float sumPsqQ = 0;
+ double sumPcubed = 0;
+ double sumQcubed = 0;
+ double sumPQsq = 0;
+ double sumPsqQ = 0;
//get the total values we need to calculate the theta denominator sums
for (int i = 0; i < shared[0]->size(); i++) {
//store in temps to avoid multiple repetitive function calls
- Atotal += (float)shared[0]->getAbundance(i);
- Btotal += (float)shared[1]->getAbundance(i);
+ Atotal += (double)shared[0]->getAbundance(i);
+ Btotal += (double)shared[1]->getAbundance(i);
}
//calculate the theta denominator sums
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);
+ double varA = 4 / Atotal * (sumPcubed - a * a);
+ double varB = 4 / Btotal * (sumQcubed - b * b);
+ double varD = sumPQsq / Atotal + sumPsqQ / Btotal - d * d * (1/Atotal + 1/Btotal);
+ double covAD = 2 / Atotal * (sumPsqQ - a * d);
+ double 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);
+ double varT = d * d * (varA + varB) / pow(a + b - d, (double)4.0) + pow(a+b, (double)2.0) * varD / pow(a+b-d, (double)4.0)
+ - 2.0 * (a + b) * d / pow(a + b - d, (double)4.0) * (covAD + covBD);
- float ci = 1.95 * sqrt(varT);
+ double ci = 1.95 * sqrt(varT);
data[0] = thetaYC;
data[1] = thetaYC - ci;
if (isnan(data[1]) || isinf(data[1])) { data[1] = 0; }
if (isnan(data[2]) || isinf(data[2])) { data[2] = 0; }
+ data[0] = 1.0 - data[0];
return data;
}
catch(exception& e) {