Passed
Push — master ( ca4890...b1b6b6 )
by Fernando
01:19
created

torchio.datasets.visible_human.VisibleHuman.url()   A

Complexity

Conditions 1

Size

Total Lines 3
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 3
dl 0
loc 3
rs 10
c 0
b 0
f 0
cc 1
nop 1
1
import abc
2
import tempfile
3
4
from .. import Subject, ScalarImage
5
from ..utils import get_torchio_cache_dir
6
from ..download import download_and_extract_archive
7
8
9
class VisibleHuman(abc.ABC, Subject):
10
11
    URL = 'https://mri.radiology.uiowa.edu/website_documents/visible_human_tar_files/{}{}.tar.gz'  # noqa: E501, FS003
12
13
    def __init__(self, part: str):
14
        self.part = self._parse_part(part)
15
        if not self.cache_part_dir.is_dir():
16
            tempdir = tempfile.gettempdir()
17
            filename = f'{self.__class__.__name__}-{self.part}.tar.gz'
18
            download_and_extract_archive(
19
                self.url,
20
                tempdir,
21
                filename=filename,
22
                extract_root=self.cache_class_dir,
23
                remove_finished=True,
24
            )
25
        super().__init__({self.part.lower(): ScalarImage(self.cache_part_dir)})
26
27
    @property
28
    def cache_class_dir(self):
29
        return get_torchio_cache_dir() / self.__class__.__name__
30
31
    @property
32
    def cache_part_dir(self):
33
        return self.cache_class_dir / self.part
34
35
    @property
36
    def url(self):
37
        return self.URL.format(self.PREFIX, self.part)
38
39
    def _parse_part(self, part: str) -> None:
40
        part_capital = part.capitalize()
41
        if part_capital not in self.PARTS:
42
            message = f'Part "{part}" not in available parts: {self.PARTS}'
43
            raise ValueError(message)
44
        return part_capital
45
46
47
class VisibleMale(VisibleHuman):
48
    """Visible Male CT Datasets.
49
50
    Args:
51
        part: Can be ``'Head'``, ``'Hip'``, ``'Pelvis'`` or ``'Shoulder'``.
52
    """
53
54
    PREFIX = 'VHMCT1mm_'
55
    PARTS = (
56
        'Head',
57
        'Hip',
58
        'Pelvis',
59
        'Shoulder',
60
    )
61
62
63
class VisibleFemale(VisibleHuman):
64
    """Visible Female CT Datasets.
65
66
    Args:
67
        part: Can be ``'Ankle'``, ``'Head'``, ``'Hip'``, ``'Knee'``,
68
            ``'Pelvis'`` or ``'Shoulder'``.
69
    """
70
71
    PREFIX = 'VHF-'
72
    PARTS = VisibleMale.PARTS + (
73
        'Ankle',
74
        'Knee',
75
    )
76