diff --git a/src/calng/base_correction.py b/src/calng/base_correction.py index 875b5c74d10fa1c2c01a8c49de7153286487b747..459ef83f37da4c27d289b9d0b71ff53f47252204 100644 --- a/src/calng/base_correction.py +++ b/src/calng/base_correction.py @@ -523,10 +523,6 @@ class BaseCorrection(PythonDevice): f"preview:{spec.name}" for spec in self._preview_outputs ] - geom_utils.subscribe_to_geometry_bound( - self, self.get("geometryDevice"), warn_fun=self.log_status_warn - ) - self._buffered_status_update = Hash() self._processing_time_tracker = trackers.ExponentialMovingAverage( alpha=0.3 @@ -573,6 +569,18 @@ class BaseCorrection(PythonDevice): # update device schema in one fell swoop self.updateSchema(schema_override) + self._geometry = None + def _on_geometry(geometry): + self._geometry = geometry + for addon in self._enabled_addons: + addon.on_new_geometry(self._geometry) + geom_utils.subscribe_to_geometry_bound( + self, + self.get("geometryDevice"), + on_geometry=_on_geometry, + warn_fun=self.log_status_warn, + ) + self.updateState(State.ON) def __del__(self): diff --git a/src/calng/correction_addons/base_addon.py b/src/calng/correction_addons/base_addon.py index 8e6d8690b8e2c04ae49c13566cdba7b84cc02e95..b5578c1e5166948d5bbfbad8cf5075c28c477dd7 100644 --- a/src/calng/correction_addons/base_addon.py +++ b/src/calng/correction_addons/base_addon.py @@ -19,12 +19,6 @@ class BaseCorrectionAddon: """Will be given the node from extend_device_schema, no prefix needed here""" pass - @property - def geometry(self): - """Helper to get current geometry (host device should be monitoring a geometry - device)""" - return self._device._geometry - def post_correction( self, train_id, processed_data, cell_table, pulse_table, output_hash ): @@ -43,3 +37,16 @@ class BaseCorrectionAddon: for an example of caching and reinstanting complex kernels using many parameters when any change.""" pass + + @property + def geometry(self): + """Helper to get current geometry from host device. If addon will do expensive + precomputation only when geometry changes, use the on_new_geometry hook to + trigger this.""" + return self._device._geometry + + def on_new_geometry(self, geometry): + """Hook which is called whenever the host device receives a new geometry from + the geometry device. Useful to know when geometry changes in case you plan to + do expensive precomputation based on it (ex. azimuthal integration).""" + pass