List saved object calibrations immediately
This commit is contained in:
@@ -49,11 +49,11 @@ class ObjectCalibrationController(QObject):
|
|||||||
"""Own one modeless editor, acquisition job and cancellable calculation."""
|
"""Own one modeless editor, acquisition job and cancellable calculation."""
|
||||||
|
|
||||||
def __init__(self, parent: QWidget, store: NpzStore, build_config: Callable[[], RunConfigModel],
|
def __init__(self, parent: QWidget, store: NpzStore, build_config: Callable[[], RunConfigModel],
|
||||||
capture: Callable[[ObjectCalibrationDialog], ObjectSweepCapture], select_saved: Callable[[str], None],
|
capture: Callable[[ObjectCalibrationDialog], ObjectSweepCapture], saved: Callable[[str, bool], None],
|
||||||
error: Callable[[str, Exception], None]) -> None:
|
error: Callable[[str, Exception], None]) -> None:
|
||||||
super().__init__(parent)
|
super().__init__(parent)
|
||||||
self._parent, self._store, self._build_config = parent, store, build_config
|
self._parent, self._store, self._build_config = parent, store, build_config
|
||||||
self._start_capture, self._select_saved, self._error = capture, select_saved, error
|
self._start_capture, self._saved, self._error = capture, saved, error
|
||||||
self.dialog: ObjectCalibrationDialog | None = None
|
self.dialog: ObjectCalibrationDialog | None = None
|
||||||
self.capture: ObjectSweepCapture | None = None
|
self.capture: ObjectSweepCapture | None = None
|
||||||
self._closed = False
|
self._closed = False
|
||||||
@@ -157,8 +157,9 @@ class ObjectCalibrationController(QObject):
|
|||||||
validate_object_set(collection, metadata, current.to_dict(), current_key, through)
|
validate_object_set(collection, metadata, current.to_dict(), current_key, through)
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
status += f" Not selected for the current configuration: {exc}"
|
status += f" Not selected for the current configuration: {exc}"
|
||||||
|
self._saved(self._save_name, False)
|
||||||
else:
|
else:
|
||||||
self._select_saved(self._save_name)
|
self._saved(self._save_name, True)
|
||||||
status += " Applies on the next Start."
|
status += " Applies on the next Start."
|
||||||
self.dialog.set_status(status)
|
self.dialog.set_status(status)
|
||||||
logger.info("%s", status)
|
logger.info("%s", status)
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ class PreprocessController:
|
|||||||
self._capture_pause: PipelinePause | None = None
|
self._capture_pause: PipelinePause | None = None
|
||||||
self._radar_variants: list[RadarConfigVariant] = []
|
self._radar_variants: list[RadarConfigVariant] = []
|
||||||
self.object_calibration = ObjectCalibrationController(
|
self.object_calibration = ObjectCalibrationController(
|
||||||
parent, store, build_config, self._capture_object, self._select_object, error,
|
parent, store, build_config, self._capture_object, self._object_saved, error,
|
||||||
)
|
)
|
||||||
|
|
||||||
def bind_actions(self, primary: PrimaryView, data: DataView) -> None:
|
def bind_actions(self, primary: PrimaryView, data: DataView) -> None:
|
||||||
@@ -529,12 +529,13 @@ class PreprocessController:
|
|||||||
provenance = capture_provenance(config.to_dict(), radar_key, through)
|
provenance = capture_provenance(config.to_dict(), radar_key, through)
|
||||||
return ObjectSweepCapture(self._pipeline, dialog, config, self.settings().median_sweep_count, provenance)
|
return ObjectSweepCapture(self._pipeline, dialog, config, self.settings().median_sweep_count, provenance)
|
||||||
|
|
||||||
def _select_object(self, name: str) -> None:
|
def _object_saved(self, name: str, applicable: bool) -> None:
|
||||||
self.selected_sets["s21_object_calibration"] = name
|
"""List a new object calibration at once; select it only when it fits the current setup."""
|
||||||
self.ensure_dialog().set_set_name(name)
|
if applicable:
|
||||||
self._summary(self.selected_sets)
|
self.selected_sets["s21_object_calibration"] = name
|
||||||
|
self.ensure_dialog().set_set_name(name)
|
||||||
|
logger.info("Selected object calibration: %s", name)
|
||||||
self._refresh_requested()
|
self._refresh_requested()
|
||||||
logger.info("Selected object calibration: %s", name)
|
|
||||||
|
|
||||||
def invalidate_object_calibration_after_geometry_change(self) -> None:
|
def invalidate_object_calibration_after_geometry_change(self) -> None:
|
||||||
selected = self.selected_sets.get("s21_object_calibration", "")
|
selected = self.selected_sets.get("s21_object_calibration", "")
|
||||||
|
|||||||
@@ -258,12 +258,14 @@ class ObjectCaptureLifecycleTest(unittest.TestCase):
|
|||||||
metadata = {"provenance": provenance, "targets": [], "diagnostics": [],
|
metadata = {"provenance": provenance, "targets": [], "diagnostics": [],
|
||||||
"tx_output_pos": [1, 3], "rx_input_pos": [0, 2]}
|
"tx_output_pos": [1, 3], "rx_input_pos": [0, 2]}
|
||||||
self.dialog.add_capture([_through()], captured.to_dict(), provenance)
|
self.dialog.add_capture([_through()], captured.to_dict(), provenance)
|
||||||
for name, error in (("matching", None), ("changed", None),
|
for name, error in (("matching", None), ("changed", None), ("unvalidated", None),
|
||||||
("cancelled", InterruptedError("cancelled")), ("failed", ValueError("bad input"))):
|
("cancelled", InterruptedError("cancelled")), ("failed", ValueError("bad input"))):
|
||||||
with self.subTest(outcome=name):
|
with self.subTest(outcome=name):
|
||||||
self.config = captured.clone()
|
self.config = captured.clone()
|
||||||
if name == "changed":
|
if name == "changed":
|
||||||
self.config.radar.sweep.points += 1
|
self.config.radar.sweep.points += 1
|
||||||
|
if name == "unvalidated": # Same radar key, but the selected through set is gone.
|
||||||
|
self.config.preprocess.s21.calibration.set_name = "absent"
|
||||||
self.dialog._set_name_input.setText(name)
|
self.dialog._set_name_input.setText(name)
|
||||||
with mock.patch.object(self.dialog, "calculation_inputs", return_value=([], captured.to_dict(), {}, provenance)), \
|
with mock.patch.object(self.dialog, "calculation_inputs", return_value=([], captured.to_dict(), {}, provenance)), \
|
||||||
mock.patch("python_app.workflows.mimo_calibration.compute_from_collections",
|
mock.patch("python_app.workflows.mimo_calibration.compute_from_collections",
|
||||||
@@ -284,6 +286,9 @@ class ObjectCaptureLifecycleTest(unittest.TestCase):
|
|||||||
self.assertEqual(saved_meta["provenance"], provenance)
|
self.assertEqual(saved_meta["provenance"], provenance)
|
||||||
self.assertEqual(len(saved.traces), 4)
|
self.assertEqual(len(saved.traces), 4)
|
||||||
expected = {"matching": "Applies on the next Start", "changed": "Not selected",
|
expected = {"matching": "Applies on the next Start", "changed": "Not selected",
|
||||||
"cancelled": "cancelled", "failed": "failed"}
|
"unvalidated": "Not selected", "cancelled": "cancelled", "failed": "failed"}
|
||||||
self.assertIn(expected[name], self.dialog._status_label.text())
|
self.assertIn(expected[name], self.dialog._status_label.text())
|
||||||
|
if name in ("matching", "unvalidated"): # Listed at once, without reopening the dialog.
|
||||||
|
combo = self.preprocess.ensure_dialog()._set_combos["s21_object_calibration"]
|
||||||
|
self.assertGreaterEqual(combo.findData(name), 0)
|
||||||
self.error.assert_called_once()
|
self.error.assert_called_once()
|
||||||
|
|||||||
Reference in New Issue
Block a user