diff --git a/modules/base/pymod/table.py b/modules/base/pymod/table.py index 6541cf721579f77ce232d17442bed36193efdcae..284c0419ff0aadc8cc86cf64828698811829cc9b 100644 --- a/modules/base/pymod/table.py +++ b/modules/base/pymod/table.py @@ -1678,7 +1678,21 @@ class Table(object): else: fp += 1 - mcc = ((tp*tn)-(fp*fn)) / math.sqrt((tp+fn)*(tp+fp)*(tn+fn)*(tn+fp)) + mcc = None + msg = None + if (tp+fn)==0: + msg = 'factor (tp + fn) is zero' + elif (tp+fp)==0: + msg = 'factor (tp + fp) is zero' + elif (tn+fn)==0: + msg = 'factor (tn + fn) is zero' + elif (tn+fp)==0: + msg = 'factor (tn + fp) is zero' + + if msg: + LogWarning("Could not compute MCC: MCC is not defined since %s"%msg) + else: + mcc = ((tp*tn)-(fp*fn)) / math.sqrt((tp+fn)*(tp+fp)*(tn+fn)*(tn+fp)) return mcc diff --git a/modules/base/tests/test_table.py b/modules/base/tests/test_table.py index 265a661861be6887560507de95c0675c19c77023..3edf226be0acae3acf79ce89e909cad4bbbeaaab 100644 --- a/modules/base/tests/test_table.py +++ b/modules/base/tests/test_table.py @@ -1143,11 +1143,12 @@ class TestTable(unittest.TestCase): self.assertAlmostEquals(auc, auc_ref) def testCalcMCC(self): - tab = Table(['score', 'rmsd', 'class_rmsd', 'class_score'], 'ffbb', + tab = Table(['score', 'rmsd', 'class_rmsd', 'class_score', 'class_wrong'], 'ffbbb', score= [2.64, 1.11, 2.17, 0.45,0.15,0.85, 1.13, 2.90, 0.50, 1.03, 1.46, 2.83, 1.15, 2.04, 0.67, 1.27, 2.22, 1.90, 0.68, 0.36,1.04, 2.46, 0.91,0.60], rmsd=[9.58,1.61,7.48,0.29,1.68,3.52,3.34,8.17,4.31,2.85,6.28,8.78,0.41,6.29,4.89,7.30,4.26,3.51,3.38,0.04,2.21,0.24,7.58,8.40], class_rmsd= [False,True, False,True,True,False,False,False,False,False,False,False,True, False,False,False,False,False,False,True,False,True,False,False], - class_score=[False,False,False,True,True,True, False,False,True, False,False,False,False,False,True, False,False,False,True, True,False,False,True,True]) + class_score=[False,False,False,True,True,True, False,False,True, False,False,False,False,False,True, False,False,False,True, True,False,False,True,True], + class_wrong=[False,False,False,False,False,False, False,False,False, False,False,False,False,False,False, False,False,False,False, False,False,False,False,False]) mcc = tab.ComputeMCC(score_col='score', score_dir='-', class_col='rmsd', class_dir='-', score_cutoff=1.0, class_cutoff=2.0) self.assertAlmostEquals(mcc, 0.1490711984) @@ -1159,6 +1160,9 @@ class TestTable(unittest.TestCase): self.assertAlmostEquals(mcc, -0.1490711984) mcc = tab.ComputeMCC(score_col='score', score_dir='+', class_col='rmsd', class_dir='-', score_cutoff=1.0, class_cutoff=2.0) self.assertAlmostEquals(mcc, -0.1490711984) + mcc = tab.ComputeMCC(score_col='class_wrong', class_col='class_rmsd') + self.assertEquals(mcc,None) + def testCalcMCCPreclassified(self): tab = Table(['reference', 'prediction1', 'prediction2'],'bbb',