Completed
Push — master ( 17d4df...a2657b )
by Fernando
01:54 queued 41s
created

TestSubject.test_input_dict()   A

Complexity

Conditions 2

Size

Total Lines 5
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 5
nop 1
dl 0
loc 5
rs 10
c 0
b 0
f 0
1
import copy
2
import tempfile
3
import pytest
4
import torch
5
import numpy as np
6
import torchio as tio
7
from ..utils import TorchioTestCase
8
9
10
class TestSubject(TorchioTestCase):
11
    """Tests for `Subject`."""
12
    def test_positional_args(self):
13
        with self.assertRaises(ValueError):
14
            with tempfile.NamedTemporaryFile() as f:
15
                tio.Subject(tio.ScalarImage(f.name))
16
17
    def test_input_dict(self):
18
        with tempfile.NamedTemporaryFile() as f:
19
            input_dict = {'image': tio.ScalarImage(f.name)}
20
            tio.Subject(input_dict)
21
            tio.Subject(**input_dict)
22
23
    def test_no_sample(self):
24
        with tempfile.NamedTemporaryFile() as f:
25
            input_dict = {'image': tio.ScalarImage(f.name)}
26
            subject = tio.Subject(input_dict)
27
            with self.assertRaises(RuntimeError):
28
                tio.RandomFlip()(subject)
29
30
    def test_history(self):
31
        transformed = tio.RandomFlip()(self.sample_subject)
32
        self.assertIs(len(transformed.history), 1)
33
34
    def test_inconsistent_shape(self):
35
        subject = tio.Subject(
36
            a=tio.ScalarImage(tensor=torch.rand(1, 2, 3, 4)),
37
            b=tio.ScalarImage(tensor=torch.rand(2, 2, 3, 4)),
38
        )
39
        subject.spatial_shape
40
        with self.assertRaises(RuntimeError):
41
            subject.shape
42
43
    def test_inconsistent_spatial_shape(self):
44
        subject = tio.Subject(
45
            a=tio.ScalarImage(tensor=torch.rand(1, 3, 3, 4)),
46
            b=tio.ScalarImage(tensor=torch.rand(2, 2, 3, 4)),
47
        )
48
        with self.assertRaises(RuntimeError):
49
            subject.spatial_shape
50
51
    def test_plot(self):
52
        self.sample_subject.plot(
53
            show=False,
54
            output_path=self.dir / 'figure.png',
55
            cmap_dict=dict(
56
                t2='viridis',
57
                label={0: 'yellow', 1: 'blue'},
58
            ),
59
        )
60
61
    def test_plot_one_image(self):
62
        subject = tio.Subject(t1=tio.ScalarImage(self.get_image_path('t1_plot')))
63
        subject.plot(show=False)
64
65
    # flake8: noqa: E203, E241
66
    def test_same_space(self):
67
        # https://github.com/fepegar/torchio/issues/381
68
        affine1 = np.array([
69
            [ 4.27109375e-14, -8.71264808e-03,  9.99876633e-01, -3.39850907e+01],
70
            [-5.54687500e-01, -2.71630469e-12,  8.75148028e-17, 1.62282930e+02],
71
            [ 2.71575000e-12, -5.54619070e-01, -1.57073092e-02, 2.28515784e+02],
72
            [ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00, 1.00000000e+00],
73
        ])
74
        affine2 = np.array([
75
            [ 3.67499773e-08, -8.71257665e-03,  9.99876635e-01, -3.39850922e+01],
76
            [-5.54687500e-01,  3.67499771e-08,  6.73024385e-08, 1.62282928e+02],
77
            [-3.73318194e-08, -5.54619071e-01, -1.57071802e-02, 2.28515778e+02],
78
            [ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00, 1.00000000e+00],
79
        ])
80
        t = torch.rand(1, 2, 3, 4)
81
        subject = tio.Subject(
82
            im1=tio.ScalarImage(tensor=t, affine=affine1),
83
            im2=tio.ScalarImage(tensor=t, affine=affine2),
84
        )
85
        subject.check_consistent_space()
86
87
    def test_delete_image(self):
88
        subject = copy.deepcopy(self.sample_subject)
89
        subject.remove_image('t1')
90
        with self.assertRaises(KeyError):
91
            subject['t1']
92
        with self.assertRaises(AttributeError):
93
            subject.t1
94
95
    def test_2d(self):
96
        subject = self.make_2d(self.sample_subject)
97
        assert subject.is_2d()
98