Skip to content

Commit 2bb377f

Browse files
author
Carole Sudre
committed
Adding test based on S10
1 parent f7bd33c commit 2bb377f

1 file changed

Lines changed: 174 additions & 1 deletion

File tree

test/test_metrics/test_pairwise_measures.py

Lines changed: 174 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,32 @@
1313

1414
from MetricsReloaded.metrics.prob_pairwise_measures import ProbabilityPairwiseMeasures
1515

16-
#Data for figure SN 2.9 of Pitfalls p
16+
#Data for figure SN 2.9 of Pitfalls p49
1717
pred29_1 = np.concatenate([np.ones([45]),np.zeros([5]),np.ones([10]),np.zeros([40])])
1818
ref29_1 = np.concatenate([np.ones([50]),np.zeros([50])])
1919
pred29_2 = np.concatenate([np.ones([81]),np.zeros([9]),np.ones([2]),np.zeros([8])])
2020
ref29_2 = np.concatenate([np.ones([90]),np.zeros([10])])
2121
ppm29_1 = PM(pred29_1, ref29_1)
2222
ppm29_2 = PM(pred29_2, ref29_2)
2323

24+
#Data for figure SN 2.17 of pitfalls p59
25+
pred217_1 = np.concatenate([np.ones([6]), np.zeros([94])])
26+
pred217_2 = np.zeros([100])
27+
ref217 = np.concatenate([np.ones([3]),np.zeros([97])])
28+
ppm217_1 = PM(pred217_1, ref217)
29+
ppm217_2 = PM(pred217_2, ref217)
30+
31+
#Data for figure SN 2.10 of pitfalls p50
32+
ref210 = np.zeros([14,14])
33+
ref210[5:9,5:9] = 1
34+
pred210_1 = np.zeros([14,14])
35+
pred210_1[6:8,6:8] = 1
36+
pred210_2 = np.zeros([14,14])
37+
pred210_2[4:10,4:10]=1
38+
ppm210_1 = PM(pred210_1, ref210)
39+
ppm210_2 = PM(pred210_2, ref210)
40+
41+
2442
### Small size of structures relative to pixel/voxel size (DSC)
2543
## Larger structure
2644
p_large_ref = np.zeros((11, 11))
@@ -252,6 +270,102 @@
252270
f59_pred2 = np.zeros([15, 15])
253271
f59_pred2[4:8, 5:9] = 1
254272

273+
def test_fn_map():
274+
"""
275+
Using SN2.10 as basis of illustration for FP TP FN TN calculation
276+
"""
277+
fn1 = ppm210_1.fn()
278+
fn2 = ppm210_2.fn()
279+
expected_fn1 = 12
280+
expected_fn2 = 0
281+
# fn_map_1 = ppm210_1.__fn_map()
282+
# expected_fn_map1 = np.zeros([14,14])
283+
# expected_fn_map1[5:6,5:9] = 1
284+
# expected_fn_map1[8:9,5:9] = 1
285+
# expected_fn_map1[5:9,5:6] = 1
286+
# expected_fn_map1[5:9,8:9] = 1
287+
# fn_map_2 = ppm210_2.__fn_map()
288+
# expected_fn_map2 = np.zeros([14,14])
289+
# assert_array_equal(fn_map_1, expected_fn_map1)
290+
# assert_array_equal(fn_map_2, expected_fn_map2)
291+
assert fn1 == 12
292+
assert fn2 == 0
293+
294+
def test_fp():
295+
"""
296+
Using SN2.10 as illustrative example for calculation of TP TN FP FN
297+
298+
"""
299+
fp1 = ppm210_1.fp()
300+
fp2 = ppm210_2.fp()
301+
expected_fp1 = 0
302+
expected_fp2 = 20
303+
assert fp1 == expected_fp1
304+
assert fp2 == expected_fp2
305+
306+
def test_tp():
307+
"""
308+
Using SN2.10 as illustrative example p50 pitfalls
309+
"""
310+
311+
tp1 = ppm210_1.tp()
312+
tp2 = ppm210_2.tp()
313+
expected_tp1 = 4
314+
expected_tp2 = 16
315+
assert tp1 == expected_tp1
316+
assert tp2 == expected_tp2
317+
318+
def test_tn():
319+
"""
320+
Using SN2.10 as illustrative example p50 Pitfalls paper
321+
"""
322+
323+
tn1 = ppm210_1.tn()
324+
tn2 = ppm210_2.tn()
325+
expected_tn1 = 180
326+
expected_tn2 = 160
327+
assert tn1 == expected_tn1
328+
assert tn2 == expected_tn2
329+
330+
def test_n_pos_ref():
331+
expected_n_pos_ref = 16
332+
n_pos_ref = ppm210_1.n_pos_ref()
333+
assert expected_n_pos_ref == n_pos_ref
334+
335+
def test_n_union():
336+
expected_n_union1 = 16
337+
expected_n_union2 = 36
338+
n_union1 = ppm210_1.n_union()
339+
n_union2 = ppm210_2.n_union()
340+
assert expected_n_union1 == n_union1
341+
assert expected_n_union2 == n_union2
342+
343+
def test_n_intersection():
344+
expected_n_intersection1 = 4
345+
expected_n_intersection2 = 16
346+
n_intersection1 = ppm210_1.n_intersection()
347+
n_intersection2 = ppm210_2.n_intersection()
348+
assert expected_n_intersection1 == n_intersection1
349+
assert expected_n_intersection2 == n_intersection2
350+
351+
def test_n_neg_ref():
352+
expected_n_neg_ref = 180
353+
n_neg_ref = ppm210_1.n_neg_ref()
354+
assert expected_n_neg_ref == n_neg_ref
355+
356+
def test_n_pos_pred():
357+
expected_n_pos_pred1 = 4
358+
expected_n_pos_pred2 = 36
359+
n_pos_pred1 = ppm210_1.n_pos_pred()
360+
n_pos_pred2 = ppm210_2.n_pos_pred()
361+
assert expected_n_pos_pred2 == n_pos_pred2
362+
assert expected_n_pos_pred1 == n_pos_pred1
363+
364+
def test_n_neg_pred():
365+
expected_n_neg_pred1 = 192
366+
expected_n_neg_pred2 = 160
367+
n_neg_pred1 = ppm210_1.n_neg_pred()
368+
n_neg_pred2 = ppm210_2.n_neg_pred()
255369

256370
def test_balanced_accuracy():
257371
list_values = [0, 1, 2, 3]
@@ -276,6 +390,18 @@ def test_voldiff():
276390
expected_vdiff = 0
277391
assert_allclose(value_test, expected_vdiff)
278392

393+
def test_specificity():
394+
"""
395+
Using figure 2.17 p59 as example test
396+
"""
397+
value_test1 = ppm217_1.specificity()
398+
value_test2 = ppm217_2.specificity()
399+
expected_spec1 = 0.97
400+
expected_spec2 = 1.00
401+
assert_allclose(value_test1, expected_spec1, atol=0.01)
402+
assert_allclose(value_test2, expected_spec2, atol=0.01)
403+
404+
279405
def test_matthews_correlation_coefficient_29():
280406
"""
281407
Taking SN 3.9 as figure illustration for MCC p49 Pitfalls
@@ -545,6 +671,29 @@ def test_fbeta():
545671
assert_allclose(value_test, expected_fbeta, atol=0.001)
546672
assert_allclose(value_test2, expected_fbeta, atol=0.001)
547673

674+
def test_sensitivity():
675+
"""
676+
Using figure 2.17 p59 as example for test
677+
"""
678+
679+
value_test1 = ppm217_1.sensitivity()
680+
value_test2 = ppm217_2.sensitivity()
681+
expected_sens1 = 1.00
682+
expected_sens2 = 0.00
683+
assert_allclose(value_test1, expected_sens1, atol=0.01)
684+
assert_allclose(value_test2, expected_sens2, atol=0.01)
685+
686+
def test_recall():
687+
"""
688+
Using figure 2.17 p59 as example for test
689+
"""
690+
691+
value_test1 = ppm217_1.recall()
692+
value_test2 = ppm217_2.recall()
693+
expected_rec1 = 1.00
694+
expected_rec2 = 0.00
695+
assert_allclose(value_test1, expected_rec1, atol=0.01)
696+
assert_allclose(value_test2, expected_rec2, atol=0.01)
548697

549698
def test_sens():
550699
pm = PM(f27_pred1, f27_ref1)
@@ -580,6 +729,30 @@ def test_positive_likelihood_ratio():
580729
assert_allclose(value_test1, expected_plr1, atol=0.01)
581730
assert_allclose(value_test2, expected_plr2, atol=0.01)
582731

732+
def test_hausdorff_distances_s210():
733+
"""
734+
Using Figure 2.10 as illustrative example
735+
"""
736+
hausdorff_1 = ppm210_1.measured_hausdorff_distance()
737+
hausdorff_2 = ppm210_2.measured_hausdorff_distance()
738+
expected_hd1 = 1.41
739+
expected_hd2 = 1.41
740+
assert_allclose(hausdorff_1,expected_hd1,atol=0.01)
741+
assert_allclose(hausdorff_2,expected_hd2,atol=0.01)
742+
743+
def test_masd_s210():
744+
"""
745+
Using Figure 2.10 as illustrative example
746+
"""
747+
masd_1 = ppm210_1.measured_masd()
748+
masd_2 = ppm210_2.measured_masd()
749+
expected_masd1 = 1.07
750+
expected_masd2 = 1.04
751+
assert_allclose(masd_1,expected_masd1,atol=0.01)
752+
assert_allclose(masd_2,expected_masd2,atol=0.01)
753+
754+
755+
583756
def test_hd():
584757
f20_ref = np.zeros([14, 14])
585758
f20_ref[1, 1] = 1

0 commit comments

Comments
 (0)