Source code for phenotypic.schema._symmetric_zones
"""Mask-based radial expansion measurements for colonies on solid media."""
from ._measurement_info import Entry, MeasurementInfo
[docs]
class SYMMETRIC_ZONES(MeasurementInfo):
"""Mask-based radial expansion measurements for colonies on solid media.
Summarises each colony's radial growth through four scalars derived
directly from the binary object mask: the inoculum core radius (shared
with :class:`RADIAL_EXPANSION`), the radius at which growth stops being
angularly symmetric, and mean / maximum radial extent beyond the core.
Unlike :class:`RADIAL_EXPANSION`, no skeletonization, branch tracing, or
runner-outlier statistics are involved — all values are computed from
per-annulus mask geometry and a circular-statistics angular resultant
length. Intended for users who care about colony-level expansion and the
symmetry of that expansion, not individual hyphae.
"""
[docs]
@classmethod
def category(cls) -> str:
return "SymZones"
CORE_RADIUS = Entry(
"CoreRadius",
"Radius of the dense inoculum core, determined by PELT changepoint "
"detection on the radial mask-density profile centered on the "
"inoculum. Growth measurements are reported relative to this boundary.",
)
SYMMETRIC_RADIUS = Entry(
"SymmetricRadius",
"Radial distance from the inoculum centroid at which colony growth "
"ceases to be angularly uniform. Computed as the first radius past "
"the core where the smoothed per-annulus circular mean resultant "
"length of mask-boundary pixels exceeds the symmetry threshold. "
"Equals the colony outer envelope when growth remains symmetric "
"throughout.",
)
MEAN_EXPANSION = Entry(
"MeanExpansion",
"Mean distance of mask-boundary pixels from the inoculum centroid, "
"measured from the core boundary outward. Captures the typical "
"radial extent of growth past the inoculum, averaged over all "
"angular directions.",
)
MAX_EXPANSION = Entry(
"MaxExpansion",
"Maximum distance of any mask pixel from the inoculum centroid, "
"measured from the core boundary outward. Captures the farthest "
"extent of growth past the inoculum.",
)
CORE_END_RADIUS = Entry(
"CoreEndRadius",
"Mean radius of the inoculum core boundary derived from the per-angle "
"bright/background ratio walk. Each of 360 1° angular sectors finds the "
"outer edge of the contiguous core run (bright fraction >= tau_core); the "
"reported value is the mean across sectors. Compare with CoreRadius (the "
"global PELT changepoint) — close agreement indicates a well-formed core.",
)
DENSE_END_RADIUS = Entry(
"DenseEndRadius",
"Mean outer radius of the dense branching zone, where mask-bright pixels "
"dominate (bright fraction >= tau_sparse). Per-angle radii are capped at "
"the SymmetricRadius and angularly median-smoothed before averaging.",
)
SPARSE_END_RADIUS = Entry(
"SparseEndRadius",
"Mean outer radius of the sparse branching zone (= colony envelope inside "
"the symmetric growth front). Equals min(objmask outer envelope, "
"SymmetricRadius) per angle, averaged across 360 sectors.",
)
CORE_AREA = Entry(
"CoreArea",
"Pixel^2 area of the inoculum core zone, integrated across the 360-sector "
"polar polygon defined by the per-angle core radii.",
)
DENSE_AREA = Entry(
"DenseArea",
"Pixel^2 area of the dense branching zone, the annular region between the "
"per-angle core boundary and dense-branching boundary.",
)
SPARSE_AREA = Entry(
"SparseArea",
"Pixel^2 area of the sparse branching zone, the annular region between the "
"per-angle dense boundary and the symmetric-envelope outer boundary.",
)