"""
PhenoTypic Constants
This module contains constant values and enumerations used throughout the PhenoTypic library.
Constants are organized by module and functionality.
Note: Class names are defined in ALL_CAPS to avoid namespace conflicts with actual classes
in the codebase (e.g., GRID_DEP vs an actual Grid class). When importing, use the format:
from PhenoTypic.tools.constants import IMAGE_MODE, OBJECT
"""
from phenotypic._shared_modules._measurement_info import MeasurementInfo
import phenotypic
from enum import Enum
from packaging.version import Version
from pathlib import Path
DEFAULT_MPL_IMAGE_FIGSIZE = (8, 6)
VALIDATE_OPS = True
[docs]
class MPL:
"""Holds defaults for matplotlib parameters"""
FIGSIZE = (8, 6)
# Image format constants
[docs]
class IMAGE_MODE(Enum):
"""Constants for supported image formats."""
NONE = None
GRAYSCALE = "GRAYSCALE"
GRAYSCALE_SINGLE_CHANNEL = "Grayscale (single channel)"
HSV = "HSV"
RGB_OR_BGR = "RGB/BGR (ambiguous)"
RGBA_OR_BGRA = "RGBA/BGRA (ambiguous)"
RGB = "RGB"
LINEAR_RGB = "LINEAR RGB"
RGBA = "RGBA"
BGR = "BGR"
BGRA = "BGRA"
SUPPORTED_FORMATS = (RGB, RGBA, GRAYSCALE, BGR, BGRA)
MATRIX_FORMATS = (GRAYSCALE, GRAYSCALE_SINGLE_CHANNEL)
AMBIGUOUS_FORMATS = (RGB_OR_BGR, RGBA_OR_BGRA)
[docs]
def is_matrix(self):
return self in {IMAGE_MODE.GRAYSCALE, IMAGE_MODE.GRAYSCALE_SINGLE_CHANNEL}
[docs]
def is_array(self):
return self in {
IMAGE_MODE.RGB,
IMAGE_MODE.RGBA,
IMAGE_MODE.BGR,
IMAGE_MODE.BGRA,
IMAGE_MODE.LINEAR_RGB,
}
[docs]
def is_ambiguous(self):
return self in {IMAGE_MODE.RGB_OR_BGR, IMAGE_MODE.RGBA_OR_BGRA}
[docs]
def is_none(self):
return self is IMAGE_MODE.NONE
CHANNELS_DEFAULT = 3
DEFAULT_SCHEMA = RGB
# Object information constants
[docs]
class OBJECT:
"""Constants for object information properties."""
LABEL = "ObjectLabel"
[docs]
class BBOX(MeasurementInfo):
[docs]
@classmethod
def category(cls) -> str:
return "Bbox"
CENTER_RR = "CenterRR", "The row coordinate of the center of the bounding box."
MIN_RR = "MinRR", "The smallest row coordinate of the bounding box."
MAX_RR = "MaxRR", "The largest row coordinate of the bounding box."
CENTER_CC = "CenterCC", " The column coordinate of the center of the bounding box."
MIN_CC = "MinCC", " The smallest column coordinate of the bounding box."
MAX_CC = "MaxCC", " The largest column coordinate of the bounding box."
[docs]
class IO:
RAW_FILE_EXTENSIONS = (".cr3", ".CR3")
PNG_FILE_EXTENSIONS = (".png", ".PNG")
JPEG_FILE_EXTENSIONS = (".jpeg", ".JPEG", ".jpg")
TIFF_EXTENSIONS = (".tif", ".tiff")
ACCEPTED_FILE_EXTENSIONS = (
PNG_FILE_EXTENSIONS + JPEG_FILE_EXTENSIONS + TIFF_EXTENSIONS
)
# Key used for PhenoTypic metadata container in image files
PHENOTYPIC_METADATA_KEY = "phenotypic"
if Version(phenotypic.__version__) < Version("0.7.1"):
SINGLE_IMAGE_HDF5_PARENT_GROUP = Path(f"phenotypic/")
else:
SINGLE_IMAGE_HDF5_PARENT_GROUP = f"/phenotypic/images/"
IMAGE_SET_HDF5_PARENT_GROUP = f"/phenotypic/image_sets/"
IMAGE_MEASUREMENT_IMAGE_SUBGROUP_KEY = "measurements"
IMAGE_STATUS_SUBGROUP_KEY = "status"
[docs]
class PIPE_STATUS(MeasurementInfo):
"""Constants for image set status."""
[docs]
@classmethod
def category(cls) -> str:
return "Status"
PROCESSED = "Processed", "Whether the image has been processed successfully."
MEASURED = "Measured", "Whether the image has been measured successfully."
# ERROR = 'Error', "Whether the image has encountered an error during processing."
# INVALID_ANALYSIS = (
# 'AnalysisInvalid',
# 'Whether the image measurements are considered invalid. '
# 'This can be set during measurement extraction or post-processing.'
# )
# INVALID_SEGMENTATION = 'SegmentationInvalid', "Whether the image segmentation is considered valid."
[docs]
class GRID(MeasurementInfo):
"""Constants for grid structure in the PhenoTypic module."""
[docs]
@classmethod
def category(cls) -> str:
return "Grid"
ROW_NUM = "RowNum", "The row idx of the object"
ROW_INTERVAL_START = (
"RowIntervalStart",
"The start of the row interval of the object",
)
ROW_INTERVAL_END = "RowIntervalEnd", "The end of the row interval of the object"
COL_NUM = "ColNum", "The column idx of the object"
COL_INTERVAL_START = (
"ColIntervalStart",
"The start of the column interval of the object",
)
COL_INTERVAL_END = "ColIntervalEnd", "The end of the column interval of the object"
SECTION_NUM = (
"SectionNum",
"The section number of the object. Ordered left to right, top to bottom",
)
# Feature extraction constants
# TODO: Fix this constant access pattern
# Metadata constants
[docs]
class IMAGE_TYPES(Enum):
"""The string labels for different types of images generated when accessing subimages of a parent image."""
BASE = "Image"
CROP = "Crop"
OBJECT = "Object"
GRID = "GridImage"
GRID_SECTION = "GridSection"
def __str__(self):
return self.value