|
2 | 2 | # SPDX - License - Identifier: GPL-3.0-or-later
|
3 | 3 |
|
4 | 4 | import unittest
|
| 5 | +from unittest.mock import Mock, patch |
5 | 6 |
|
6 | 7 | import numpy.testing as npt
|
7 | 8 |
|
8 | 9 | from mantidimaging.core.utility.data_containers import ScalarCoR, ReconstructionParameters
|
9 | 10 | from mantidimaging.gui.dialogs.cor_inspection import CORInspectionDialogModel
|
| 11 | +from mantidimaging.gui.dialogs.cor_inspection.model import INIT_ITERS_CENTRE_VALUE, INIT_ITERS_STEP |
10 | 12 | from mantidimaging.gui.dialogs.cor_inspection.types import ImageType
|
11 | 13 | from mantidimaging.test_helpers.unit_test_helper import generate_images
|
12 | 14 |
|
13 | 15 |
|
14 | 16 | class CORInspectionDialogModelTest(unittest.TestCase):
|
15 | 17 | def test_construct(self):
|
16 | 18 | images = generate_images()
|
17 |
| - m = CORInspectionDialogModel(images, 5, ScalarCoR(20), ReconstructionParameters('FBP_CUDA', 'ram-lak')) |
| 19 | + m = CORInspectionDialogModel(images, 5, ScalarCoR(20), ReconstructionParameters('FBP_CUDA', 'ram-lak'), False) |
18 | 20 | npt.assert_equal(m.sino, images.sino(5))
|
19 | 21 | self.assertEqual(m.cor_extents, (0, 9))
|
20 | 22 | self.assertEqual(m.proj_angles.value.shape, (10, ))
|
21 | 23 |
|
22 | 24 | def test_start_cor_step(self):
|
23 | 25 | images = generate_images()
|
24 |
| - m = CORInspectionDialogModel(images, 5, ScalarCoR(20), ReconstructionParameters('FBP_CUDA', 'ram-lak')) |
25 |
| - self.assertEqual(images.width * 0.05, m.cor_step) |
| 26 | + m = CORInspectionDialogModel(images, 5, ScalarCoR(20), ReconstructionParameters('FBP_CUDA', 'ram-lak'), False) |
| 27 | + self.assertEqual(images.width * 0.05, m.step) |
26 | 28 |
|
27 | 29 | def test_current_cor(self):
|
28 | 30 | images = generate_images()
|
29 |
| - m = CORInspectionDialogModel(images, 5, ScalarCoR(20), ReconstructionParameters('FBP_CUDA', 'ram-lak')) |
30 |
| - m.centre_cor = 5 |
31 |
| - m.cor_step = 1 |
| 31 | + m = CORInspectionDialogModel(images, 5, ScalarCoR(20), ReconstructionParameters('FBP_CUDA', 'ram-lak'), False) |
| 32 | + m.centre_value = 5 |
| 33 | + m.step = 1 |
32 | 34 | self.assertEqual(m.cor(ImageType.LESS), 4)
|
33 | 35 | self.assertEqual(m.cor(ImageType.CURRENT), 5)
|
34 | 36 | self.assertEqual(m.cor(ImageType.MORE), 6)
|
35 | 37 |
|
36 | 38 | def test_adjust_cor(self):
|
37 | 39 | images = generate_images()
|
38 |
| - m = CORInspectionDialogModel(images, 5, ScalarCoR(20), ReconstructionParameters('FBP_CUDA', 'ram-lak')) |
39 |
| - m.centre_cor = 5 |
40 |
| - m.cor_step = 1 |
| 40 | + m = CORInspectionDialogModel(images, 5, ScalarCoR(20), ReconstructionParameters('FBP_CUDA', 'ram-lak'), False) |
| 41 | + m.centre_value = 5 |
| 42 | + m.step = 1 |
41 | 43 |
|
42 |
| - m.adjust_cor(ImageType.CURRENT) |
43 |
| - self.assertEqual(m.centre_cor, 5) |
44 |
| - self.assertEqual(m.cor_step, 0.5) |
| 44 | + m.adjust(ImageType.CURRENT) |
| 45 | + self.assertEqual(m.centre_value, 5) |
| 46 | + self.assertEqual(m.step, 0.5) |
45 | 47 |
|
46 |
| - m.adjust_cor(ImageType.LESS) |
47 |
| - self.assertEqual(m.centre_cor, 4.5) |
48 |
| - self.assertEqual(m.cor_step, 0.5) |
| 48 | + m.adjust(ImageType.LESS) |
| 49 | + self.assertEqual(m.centre_value, 4.5) |
| 50 | + self.assertEqual(m.step, 0.5) |
49 | 51 |
|
50 |
| - m.adjust_cor(ImageType.CURRENT) |
51 |
| - self.assertEqual(m.centre_cor, 4.5) |
52 |
| - self.assertEqual(m.cor_step, 0.25) |
| 52 | + m.adjust(ImageType.CURRENT) |
| 53 | + self.assertEqual(m.centre_value, 4.5) |
| 54 | + self.assertEqual(m.step, 0.25) |
53 | 55 |
|
54 |
| - m.adjust_cor(ImageType.MORE) |
55 |
| - self.assertEqual(m.centre_cor, 4.75) |
56 |
| - self.assertEqual(m.cor_step, 0.25) |
| 56 | + m.adjust(ImageType.MORE) |
| 57 | + self.assertEqual(m.centre_value, 4.75) |
| 58 | + self.assertEqual(m.step, 0.25) |
57 | 59 |
|
58 |
| - m.adjust_cor(ImageType.CURRENT) |
59 |
| - self.assertEqual(m.centre_cor, 4.75) |
60 |
| - self.assertEqual(m.cor_step, 0.125) |
| 60 | + m.adjust(ImageType.CURRENT) |
| 61 | + self.assertEqual(m.centre_value, 4.75) |
| 62 | + self.assertEqual(m.step, 0.125) |
| 63 | + |
| 64 | + def test_iters_mode_init(self): |
| 65 | + images = generate_images() |
| 66 | + m = CORInspectionDialogModel(images, 5, ScalarCoR(20), ReconstructionParameters('FBP_CUDA', 'ram-lak'), True) |
| 67 | + |
| 68 | + self.assertEqual(m.centre_value, INIT_ITERS_CENTRE_VALUE) |
| 69 | + self.assertEqual(m.step, INIT_ITERS_STEP) |
| 70 | + self.assertEqual(m._recon_preview, m._recon_iters_preview) |
| 71 | + self.assertEqual(m._divide_step, m._divide_iters_step) |
| 72 | + |
| 73 | + def test_cor_mode_init(self): |
| 74 | + images = generate_images() |
| 75 | + initial_cor = ScalarCoR(20) |
| 76 | + m = CORInspectionDialogModel(images, 5, initial_cor, ReconstructionParameters('FBP_CUDA', 'ram-lak'), False) |
| 77 | + |
| 78 | + self.assertEqual(m.centre_value, initial_cor.value) |
| 79 | + self.assertEqual(m.step, images.width * 0.05) |
| 80 | + self.assertEqual(m._recon_preview, m._recon_cor_preview) |
| 81 | + self.assertEqual(m._divide_step, m._divide_cor_step) |
| 82 | + |
| 83 | + def test_divide_iters_step(self): |
| 84 | + images = generate_images() |
| 85 | + m = CORInspectionDialogModel(images, 5, ScalarCoR(20), ReconstructionParameters('FBP_CUDA', 'ram-lak'), True) |
| 86 | + m.step = 11 |
| 87 | + |
| 88 | + m._divide_step() |
| 89 | + self.assertEqual(m.step, 5) |
| 90 | + |
| 91 | + def test_iterations(self): |
| 92 | + images = generate_images() |
| 93 | + m = CORInspectionDialogModel(images, 5, ScalarCoR(20), ReconstructionParameters('FBP_CUDA', 'ram-lak'), True) |
| 94 | + |
| 95 | + m.adjust(ImageType.LESS) |
| 96 | + self.assertEqual(m.centre_value, 50) |
| 97 | + self.assertEqual(m.step, 50) |
| 98 | + |
| 99 | + m.adjust(ImageType.CURRENT) |
| 100 | + self.assertEqual(m.centre_value, 50) |
| 101 | + self.assertEqual(m.step, 25) |
| 102 | + |
| 103 | + m.adjust(ImageType.MORE) |
| 104 | + self.assertEqual(m.centre_value, 75) |
| 105 | + self.assertEqual(m.step, 25) |
| 106 | + |
| 107 | + @patch('mantidimaging.gui.dialogs.cor_inspection.model.replace') |
| 108 | + def test_recon_iters_preview(self, replace_mock): |
| 109 | + images = generate_images() |
| 110 | + m = CORInspectionDialogModel(images, 5, ScalarCoR(20), ReconstructionParameters('FBP_CUDA', 'ram-lak'), True) |
| 111 | + |
| 112 | + m.reconstructor = Mock() |
| 113 | + m.recon_preview(ImageType.CURRENT) |
| 114 | + replace_mock.assert_called_once_with(m.recon_params, num_iter=100) |
| 115 | + m.reconstructor.single_sino.assert_called_once_with(m.sino, m.initial_cor, m.proj_angles, |
| 116 | + replace_mock.return_value) |
0 commit comments