Source code for ezmsg.sigproc.util.message
"""Message (AxisArray) utilities.
Also re-exports sample-message symbols from ezmsg.baseproc.util.message for
backwards compatibility; new code should import those directly from
ezmsg.baseproc instead.
"""
import typing
from ezmsg.baseproc.util.message import (
SampleMessage,
SampleTriggerMessage,
is_sample_message,
)
from ezmsg.util.messages.axisarray import AxisArray
__all__ = [
"SampleMessage",
"SampleTriggerMessage",
"has_samples_along",
"is_empty_along",
"is_sample_message",
]
[docs]
def is_empty_along(message: AxisArray, dims: typing.Iterable[str]) -> bool:
"""True iff any of the named dims is present in ``message`` with zero length.
Publish gates use this instead of ``data.size == 0`` so a message that is
empty only along *other* axes — e.g. an upstream selection removed every
channel while time samples remain — still flows downstream, preserving the
stream's cadence for consumers that align or merge multiple sources.
Dims not present in the message are ignored.
"""
return any(d in message.dims and message.data.shape[message.get_axis_idx(d)] == 0 for d in dims)
[docs]
def has_samples_along(message: AxisArray, dim: str) -> bool:
"""True iff ``dim`` is present in ``message`` with nonzero length.
Stricter than ``not is_empty_along(...)``: the dim must exist. Drain loops
use this to decide whether a chunk is real output, so that a placeholder
lacking the axis entirely (e.g. ResampleProcessor's pre-init null template,
``dims=[""]``) counts as "nothing ready" rather than a publishable chunk.
"""
return dim in message.dims and message.data.shape[message.get_axis_idx(dim)] > 0