Source code for pyradise.data.annotator
from re import sub
from typing import Optional
__all__ = ["Annotator"]
[docs]class Annotator:
"""A class for identifying the annotator who segmented a certain organ. Because the name of the annotator takes
every value, the annotator can either be a human expert or an auto-segmentation algorithm.
Args:
name (str): The name of the annotator.
abbreviation (Optional[str]): The abbreviation of the annotator (default: None).
"""
default_annotator_name = "NA"
default_annotator_abbreviation = "NA"
def __init__(self, name: str, abbreviation: Optional[str] = None) -> None:
super().__init__()
name_ = self._remove_illegal_characters(name)
if not name_:
raise ValueError(f"The annotator's consists exclusively of illegal characters!")
self.name: str = name_
self.abbreviation: Optional[str] = abbreviation
[docs] def get_name(self) -> str:
"""Get the name of the :class:`Annotator`.
Returns:
str: The name of the :class:`Annotator`.
"""
return self.name
[docs] def get_abbreviation(self) -> Optional[str]:
"""Get the abbreviation of the :class:`Annotator`.
Returns:
Optional[str]: The abbreviation of the :class:`Annotator` if contained, otherwise :data:`None`.
"""
return self.abbreviation
[docs] @classmethod
def get_default(cls) -> "Annotator":
"""Get the default :class:`Annotator`.
The default :class:`Annotator` name is 'NA' and its abbreviation is also 'NA'.
Returns:
Annotator: The default :class:`Annotator`.
"""
return Annotator(Annotator.default_annotator_name, Annotator.default_annotator_abbreviation)
[docs] def is_default(self) -> bool:
"""Check if the :class:`Annotator` is the default :class:`Annotator`.
Returns:
bool: True if the :class:`Annotator` is the default :class:`Annotator`, otherwise False.
"""
return self.name == Annotator.default_annotator_name and self.abbreviation == Annotator.default_annotator_name
@staticmethod
def _remove_illegal_characters(text: str) -> str:
"""Remove a set of illegal characters from a string.
Args:
text (str): The string to remove illegal characters from.
Returns:
str: The string without illegal characters.
"""
illegal_characters = '[<>:/\\|?*"]|[\0-\31]'
return sub(illegal_characters, "", text)
def __str__(self) -> str:
if self.abbreviation:
return f"{self.name} ({self.abbreviation})"
return self.name
def __eq__(self, other: object) -> bool:
if not isinstance(other, Annotator):
return False
return self.name == other.name and self.abbreviation == other.abbreviation