Source code for alphadia.workflow.managers.base
"""Base class for Managers.
In AlphaDIA, a "manager" is a stateful object, and can be saved/loaded from disk. Additionally, it may offer functionality to change its state.
"""
import logging
import os
import pickle
import traceback
import alphadia
from alphadia.reporting import reporting
logger = logging.getLogger()
[docs]
class BaseManager:
[docs]
def __init__(
self,
path: None | str = None,
load_from_file: bool = True,
figure_path: None | str = None,
reporter: None | reporting.Pipeline | reporting.Backend = None,
):
"""Base class for all managers which handle parts of the workflow.
Parameters
----------
path : str, optional
Path to the manager pickle on disk.
load_from_file : bool, optional
If True, the manager will be loaded from file if it exists.
"""
self._path = path
self.is_loaded_from_file = False
self.figure_path = figure_path
self._version = alphadia.__version__
self.reporter = reporting.LogBackend() if reporter is None else reporter
if load_from_file:
# Note: be careful not to overwrite loaded values by initializing them in child classes after calling super().__init__()
self.load()
@property
def path(self):
"""Path to the manager pickle on disk."""
return self._path
@property
def is_loaded_from_file(self):
"""Check if the calibration manager was loaded from file."""
return self._is_loaded_from_file
@is_loaded_from_file.setter
def is_loaded_from_file(self, value):
self._is_loaded_from_file = value
[docs]
def save(self):
"""Save the state to pickle file."""
if self.path is None:
return
try:
with open(self.path, "wb") as f:
pickle.dump(self, f)
except Exception as e:
self.reporter.log_string(
f"Failed to save {self.__class__.__name__} to {self.path}: {str(e)}",
verbosity="error",
)
self.reporter.log_string(
f"Traceback: {traceback.format_exc()}", verbosity="error"
)
[docs]
def load(self):
"""Load the state from pickle file."""
if self.path is None:
self.reporter.log_string(
f"{self.__class__.__name__}: loading saved state not requested, will be initialized.",
)
return
elif not os.path.exists(self.path):
self.reporter.log_string(
f"{self.__class__.__name__}: not found at {self.path}, will be initialized.",
verbosity="warning",
)
return
try:
with open(self.path, "rb") as f:
loaded_state = pickle.load(f)
if loaded_state._version == self._version:
self.__dict__.update(loaded_state.__dict__)
self.is_loaded_from_file = True
self.reporter.log_string(
f"Loaded {self.__class__.__name__} from {self.path}"
)
else:
self.reporter.log_string(
f"Version mismatch while loading {self.__class__}: {loaded_state._version} != {self._version}. Will not load.",
verbosity="warning",
)
except Exception:
self.reporter.log_string(
f"Failed to load {self.__class__.__name__} from {self.path}",
verbosity="error",
)