Source code for CodeEntropy.levels.nodes.detect_levels
"""Detect hierarchy levels present for each molecule in the reduced universe.
This module defines a static DAG node responsible for determining which
hierarchical levels (united_atom, residue, polymer) apply to each molecule.
"""
from __future__ import annotations
from typing import Any
from CodeEntropy.levels.hierarchy import HierarchyBuilder
SharedData = dict[str, Any]
Levels = list[list[str]]
[docs]
class DetectLevelsNode:
"""Static node that determines hierarchy levels per molecule.
Produces:
shared_data["levels"]
shared_data["number_molecules"]
"""
def __init__(self) -> None:
"""Initialize the node with a HierarchyBuilder helper."""
self._hierarchy = HierarchyBuilder()
[docs]
def run(self, shared_data: SharedData) -> dict[str, Any]:
"""Detect levels and store results in shared_data.
Args:
shared_data: Shared data dictionary. Requires:
- "reduced_universe"
Returns:
Dict containing:
- "levels": List of levels per molecule.
- "number_molecules": Total molecule count.
Raises:
KeyError: If required keys are missing.
"""
universe = shared_data["reduced_universe"]
number_molecules, levels = self._detect_levels(universe)
shared_data["levels"] = levels
shared_data["number_molecules"] = number_molecules
return {
"levels": levels,
"number_molecules": number_molecules,
}
def _detect_levels(self, universe: Any) -> tuple[int, Levels]:
"""Delegate level detection to HierarchyBuilder.
Args:
universe: Reduced MDAnalysis universe.
Returns:
Tuple of molecule count and levels list.
"""
return self._hierarchy.select_levels(universe)