From f0caf84de5c5c45e110da3dda415531fde52cf11 Mon Sep 17 00:00:00 2001 From: Chris Meyer <34664+cmeyer@users.noreply.github.com> Date: Sun, 28 Dec 2025 09:37:15 -0800 Subject: [PATCH] Clean up access to data item (only xdata, data_metadata). --- .../BackgroundSubtraction.py | 12 +++---- .../ElementalMappingController.py | 34 ++++++++++++------- .../nion_eels_analysis/Thermometry.py | 22 ++++++------ 3 files changed, 39 insertions(+), 29 deletions(-) diff --git a/nionswift_plugin/nion_eels_analysis/BackgroundSubtraction.py b/nionswift_plugin/nion_eels_analysis/BackgroundSubtraction.py index 515dc14..c385a54 100644 --- a/nionswift_plugin/nion_eels_analysis/BackgroundSubtraction.py +++ b/nionswift_plugin/nion_eels_analysis/BackgroundSubtraction.py @@ -229,9 +229,9 @@ def subtract_background(api: Facade.API_1, window: Facade.DocumentWindow) -> Non background_model = api._new_api_object(background_model) source_data_items = api.library._document_model.get_source_data_items(eels_spectrum_data_item._data_item) if len(source_data_items) == 1: - source_xdata = source_data_items[0].xdata - assert source_xdata - if source_xdata.is_navigable and source_data_items[0].datum_dimension_count == 1: + source_data_metadata = source_data_items[0].data_metadata + assert source_data_metadata + if source_data_metadata.is_navigable and source_data_metadata.datum_dimension_count == 1: spectrum_image = api._new_api_object(source_data_items[0]) subtracted = api.library.create_data_item_from_data(numpy.zeros(spectrum_image._data_item.xdata.navigation_dimension_shape)) api.library.create_computation( @@ -266,9 +266,9 @@ def use_signal_for_map(api: Facade.API_1, window: Facade.DocumentWindow) -> None background_model = api._new_api_object(background_model) source_data_items = api.library._document_model.get_source_data_items(eels_spectrum_data_item._data_item) if len(source_data_items) == 1: - source_xdata = source_data_items[0].xdata - assert source_xdata - if source_xdata.is_navigable and source_data_items[0].datum_dimension_count == 1: + source_data_metadata = source_data_items[0].data_metadata + assert source_data_metadata + if source_data_metadata.is_navigable and source_data_metadata.datum_dimension_count == 1: spectrum_image = api._new_api_object(source_data_items[0]) map = api.library.create_data_item_from_data(numpy.zeros(spectrum_image._data_item.xdata.navigation_dimension_shape)) signal_interval_graphic = target_interval diff --git a/nionswift_plugin/nion_eels_analysis/ElementalMappingController.py b/nionswift_plugin/nion_eels_analysis/ElementalMappingController.py index 4c4c7e3..0abf4b4 100644 --- a/nionswift_plugin/nion_eels_analysis/ElementalMappingController.py +++ b/nionswift_plugin/nion_eels_analysis/ElementalMappingController.py @@ -73,8 +73,11 @@ async def pick_new_edge(document_controller: DocumentController.DocumentControll model_display_item = document_model.get_display_item_for_data_item(model_data_item) assert model_display_item + model_data_metadata = model_data_item.data_metadata + assert model_data_metadata + pick_region = Graphics.RectangleGraphic() - pick_region.size = Geometry.FloatSize(min(1 / 16, 16 / model_data_item.dimensional_shape[0]), min(1 / 16, 16 / model_data_item.dimensional_shape[1])) + pick_region.size = Geometry.FloatSize(min(1 / 16, 16 / model_data_metadata.dimensional_shape[0]), min(1 / 16, 16 / model_data_metadata.dimensional_shape[1])) pick_region.label = "{} {}".format(_("Pick"), str(edge.electron_shell)) model_display_item.add_graphic(pick_region) @@ -482,12 +485,14 @@ def explorer_interval(self) -> typing.Optional[typing.Tuple[float, float]]: def __is_model(self, data_item: typing.Optional[DataItem.DataItem]) -> bool: if isinstance(data_item, DataItem.DataItem): - return data_item.is_data_3d + data_metadata = data_item.data_metadata + return data_metadata is not None and data_metadata.is_data_3d return False def __is_explorer(self, document_model: DocumentModel.DocumentModel, data_item: typing.Optional[DataItem.DataItem]) -> bool: if isinstance(data_item, DataItem.DataItem): - if data_item.is_data_1d: + data_metadata = data_item.data_metadata + if data_metadata and data_metadata.is_data_1d: for display_item in document_model.get_display_items_for_data_item(data_item): for graphic in display_item.graphics: if isinstance(graphic, Graphics.IntervalGraphic) and graphic.graphic_id == "explore": @@ -496,8 +501,9 @@ def __is_explorer(self, document_model: DocumentModel.DocumentModel, data_item: def __is_calibrated_map(self, data_item: DataItem.DataItem) -> bool: if isinstance(data_item, DataItem.DataItem): - if data_item.is_data_2d and data_item.intensity_calibration: - return data_item.title.startswith("Map") and data_item.intensity_calibration.units.startswith("~") + data_metadata = data_item.data_metadata + if data_metadata and data_metadata.is_data_2d and data_metadata.intensity_calibration: + return data_item.title.startswith("Map") and data_metadata.intensity_calibration.units.startswith("~") return False async def explore_edges(self, document_controller: DocumentController.DocumentController) -> None: @@ -507,8 +513,10 @@ async def explore_edges(self, document_controller: DocumentController.DocumentCo model_display_item = document_model.get_display_item_for_data_item(model_data_item) assert model_display_item assert model_display_item.data_item + model_data_metadata = model_data_item.data_metadata + assert model_data_metadata pick_region = Graphics.RectangleGraphic() - pick_region.size = Geometry.FloatSize(min(1 / 16, 16 / model_data_item.dimensional_shape[0]), min(1 / 16, 16 / model_data_item.dimensional_shape[1])) + pick_region.size = Geometry.FloatSize(min(1 / 16, 16 / model_data_metadata.dimensional_shape[0]), min(1 / 16, 16 / model_data_metadata.dimensional_shape[1])) pick_region.label = _("Explore") model_display_item.add_graphic(pick_region) pick_data_item = document_model.get_pick_region_new(model_display_item, model_display_item.data_item, pick_region=pick_region) @@ -553,12 +561,13 @@ def normalized_interval(interval: tuple[float, float]) -> tuple[float, float]: self.__explorer_interval_changed(data_item, (s, e)) def __connect_explorer_interval(self, document_model: DocumentModel.DocumentModel, data_item: DataItem.DataItem) -> None: - if data_item.is_data_1d: + data_metadata = data_item.data_metadata + if data_metadata and data_metadata.is_data_1d: for display_item in document_model.get_display_items_for_data_item(data_item): for graphic in display_item.graphics: if isinstance(graphic, Graphics.IntervalGraphic) and graphic.graphic_id == "explore": - dimensional_shape = data_item.dimensional_shape - dimensional_calibrations = data_item.dimensional_calibrations + dimensional_shape = data_metadata.dimensional_shape + dimensional_calibrations = data_metadata.dimensional_calibrations self.__explorer_property_changed_listeners[data_item.uuid] = graphic.property_changed_event.listen(functools.partial(self.graphic_property_changed, graphic, data_item, dimensional_shape, dimensional_calibrations)) self.graphic_property_changed(graphic, data_item, dimensional_shape, dimensional_calibrations, "interval") @@ -570,12 +579,13 @@ def __disconnect_explorer_interval(self, data_item: DataItem.DataItem) -> None: def add_edge(self, electron_shell: PeriodicTable.ElectronShell) -> typing.Optional[ElementalMappingEdge]: model_data_item = self.__model_data_item - if model_data_item: + model_data_metadata = model_data_item.data_metadata if model_data_item else None + if model_data_item and model_data_metadata: binding_energy_eV = PeriodicTable.PeriodicTable().nominal_binding_energy_ev(electron_shell) signal_interval_eV = binding_energy_eV, binding_energy_eV * 1.10 fit_interval_eV = binding_energy_eV * 0.93, binding_energy_eV * 0.98 - dimensional_shape = model_data_item.dimensional_shape - dimensional_calibrations = model_data_item.dimensional_calibrations + dimensional_shape = model_data_metadata.dimensional_shape + dimensional_calibrations = model_data_metadata.dimensional_calibrations if dimensional_shape is not None and dimensional_calibrations is not None and len(dimensional_calibrations) > 0: calibration = dimensional_calibrations[-1] if calibration.units == "eV": diff --git a/nionswift_plugin/nion_eels_analysis/Thermometry.py b/nionswift_plugin/nion_eels_analysis/Thermometry.py index a2297ab..ee5dd8c 100755 --- a/nionswift_plugin/nion_eels_analysis/Thermometry.py +++ b/nionswift_plugin/nion_eels_analysis/Thermometry.py @@ -43,14 +43,14 @@ def __init__(self, computation: Facade.Computation, **kwargs: typing.Any) -> Non self.__fit: typing.Optional[DataArrayType] = None def execute(self, near_data_item: DataItem.DataItem, far_data_item: DataItem.DataItem, fit_interval_graphic: Graphics.IntervalGraphic, **kwargs: typing.Any) -> None: - assert near_data_item.xdata - assert near_data_item.xdata.is_data_1d - assert far_data_item.xdata - assert far_data_item.xdata.is_data_1d - # Only allow data of same shape for now. A future version could crop to the smaller size of the two. - assert near_data_item.data is not None and far_data_item.data is not None and len(near_data_item.data) == len(far_data_item.data) near_xdata = near_data_item.xdata far_xdata = far_data_item.xdata + assert near_xdata + assert near_xdata.is_data_1d + assert far_xdata + assert far_xdata.is_data_1d + # Only allow data of same shape for now. A future version could crop to the smaller size of the two. + assert len(near_xdata.data) == len(far_xdata.data) # For now only allow near and far having the same calibration. A future version could allow different # offsets and shift the data accordingly assert near_xdata.dimensional_calibrations == far_xdata.dimensional_calibrations @@ -111,13 +111,13 @@ def measure_temperature(api: Facade.API_1, window: Facade.DocumentWindow, *, dis assert selected_display_items[1][0] is not None, error_msg assert selected_display_items[0][0].data_item is not None, error_msg assert selected_display_items[1][0].data_item is not None, error_msg - assert selected_display_items[0][0].data_item.data is not None, error_msg - assert selected_display_items[1][0].data_item.data is not None, error_msg - assert selected_display_items[0][0].data_item.is_data_1d, error_msg - assert selected_display_items[1][0].data_item.is_data_1d, error_msg + assert selected_display_items[0][0].data_item.xdata, error_msg + assert selected_display_items[1][0].data_item.xdata, error_msg + assert selected_display_items[0][0].data_item.xdata.is_data_1d, error_msg + assert selected_display_items[1][0].data_item.xdata.is_data_1d, error_msg # First find out which data item is near and which is far. Far should have the higher maximum. - if np.amax(selected_display_items[0][0].data_item.data) > np.amax(selected_display_items[1][0].data_item.data): + if np.amax(selected_display_items[0][0].data_item.xdata.data) > np.amax(selected_display_items[1][0].data_item.xdata.data): far_data_item = selected_display_items[0][0].data_item near_data_item = selected_display_items[1][0].data_item else: