-//void SensSpecCommand::processColumn(map<string, int> seqMap){
-//
-// truePositives = 0;
-// falsePositives = 0;
-// trueNegatives = numDists;
-// falseNegatives = 0;
-//
-// ifstream columnFile;
-// openInputFile(distFile, columnFile);
-//
-// string seqNameA, seqNameB, oldSeqNameA;
-// int otuA, otuB, oldOTUA;
-// double distance;
-//
-// while(columnFile){
-// columnFile >> seqNameA >> seqNameB >> distance;
-//
-// if(seqNameA == oldSeqNameA) { otuA = oldOTUA; }
-// else { otuA = seqMap[seqNameA]; oldOTUA = otuA; }
-//
-// otuB = seqMap[seqNameB];
-//
-// if(distance <= cutoff){
-// if(otuA == otuB){
-// truePositives++;
-// }
-// else{
-// falseNegatives++;
-// }
-// trueNegatives--;
-// }
-// else{
-// if(otuA == otuB){
-// falsePositives++;
-// trueNegatives--;
-// }
-// }
-//
-// gobble(columnFile);
-// }
-// columnFile.close();
-//
-// cout << "truePositives:\t" << truePositives << endl;
-// cout << "trueNegatives:\t" << trueNegatives << endl;
-// cout << "falsePositives:\t" << falsePositives << endl;
-// cout << "falseNegatives:\t" << falseNegatives << endl;
-//}
+void SensSpecCommand::outputStatistics(string label, string cutoff){
+ try{
+ double tp = (double) truePositives;
+ double fp = (double) falsePositives;
+ double tn = (double) trueNegatives;
+ double fn = (double) falseNegatives;
+
+ double p = tp + fn;
+ double n = fp + tn;
+ double pPrime = tp + fp;
+ double nPrime = tn + fn;
+
+ double sensitivity = tp / p;
+ double specificity = tn / n;
+ double positivePredictiveValue = tp / pPrime;
+ double negativePredictiveValue = tn / nPrime;
+ double falseDiscoveryRate = fp / pPrime;
+
+ double accuracy = (tp + tn) / (p + n);
+ double matthewsCorrCoef = (tp * tn - fp * fn) / sqrt(p * n * pPrime * nPrime); if(p == 0 || n == 0){ matthewsCorrCoef = 0; }
+ double f1Score = 2.0 * tp / (p + pPrime);
+
+
+ if(p == 0) { sensitivity = 0; matthewsCorrCoef = 0; }
+ if(n == 0) { specificity = 0; matthewsCorrCoef = 0; }
+ if(p + n == 0) { accuracy = 0; }
+ if(p + pPrime == 0) { f1Score = 0; }
+ if(pPrime == 0) { positivePredictiveValue = 0; falseDiscoveryRate = 0; matthewsCorrCoef = 0; }
+ if(nPrime == 0) { negativePredictiveValue = 0; matthewsCorrCoef = 0; }
+
+ ofstream sensSpecFile;
+ openOutputFileAppend(sensSpecFileName, sensSpecFile);
+
+ sensSpecFile << label << '\t' << cutoff << '\t';
+ sensSpecFile << truePositives << '\t' << trueNegatives << '\t' << falsePositives << '\t' << falseNegatives << '\t';
+ sensSpecFile << setprecision(4);
+ sensSpecFile << sensitivity << '\t' << specificity << '\t' << positivePredictiveValue << '\t' << negativePredictiveValue << '\t';
+ sensSpecFile << falseDiscoveryRate << '\t' << accuracy << '\t' << matthewsCorrCoef << '\t' << f1Score << endl;
+
+ sensSpecFile.close();
+ }
+ catch(exception& e) {
+ m->errorOut(e, "SensSpecCommand", "outputStatistics");
+ exit(1);
+ }
+}