Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 8 additions & 11 deletions nionswift_plugin/nion_experimental_tools/SequenceSplitJoin.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ def sequence_join(api: Facade.API_1, window: Facade.DocumentWindow, display_item
# For line plots with multiple display layers we want to copy the display properties so that the joined item
# look like the original display items. We copy the display properties of the first display item, but only
# if the number of display layers is the same for all input display items.
display_layers = None
display_layers_list = None
legend_position = None
display_type = None
copy_display_properties = False
Expand All @@ -69,18 +69,18 @@ def sequence_join(api: Facade.API_1, window: Facade.DocumentWindow, display_item
data_item_xdata = data_item.xdata
if (data_item_xdata is not None and len(display_item.data_items) == 1 and len(data_item_xdata.data_shape) > 1 and
(data_item_xdata.datum_dimension_count == 1 or display_item.display_type == 'line_plot')):
if i== 0:
display_layers = copy.deepcopy(display_item._display_item.display_layers)
if i == 0:
display_layers_list = display_item._display_item.display_layers_list
legend_position = display_item._display_item.get_display_property('legend_position')
display_type = display_item._display_item.display_type
copy_display_properties = True
elif display_layers is not None:
copy_display_properties &= len(display_layers) == len(display_item._display_item.display_layers)
elif display_layers_list is not None:
copy_display_properties &= len(display_layers_list) == len(display_item._display_item.display_layers)

if not data_items:
return None

result_data_item = api.library.create_data_item_from_data(numpy.zeros((1, 1, 1)))
result_data_item = api.library.create_data_item()
api.library.create_computation("nion.join_sequence",
inputs={"src_list": data_items},
outputs={"target": result_data_item})
Expand All @@ -89,11 +89,8 @@ def sequence_join(api: Facade.API_1, window: Facade.DocumentWindow, display_item
window._document_controller.show_display_item(result_display_item)

if copy_display_properties:
if display_layers is not None:
while result_display_item.display_layers:
result_display_item.remove_display_layer(0)
for display_layer in display_layers:
result_display_item.append_display_layer(display_layer)
if display_layers_list:
result_display_item.display_layers_list = display_layers_list
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would this need to be a deepcopy?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nope. display_layers_list is a convenience function for copying display layer properties and doesn't store the new value directly.

if legend_position is not None:
result_display_item.set_display_property('legend_position', legend_position)
if display_type is not None:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -478,7 +478,7 @@ def test_align_image_sequence_computation(self) -> None:
self.assertIn("Align/Integrate - Integrated Sequence", result_data_item.title)
self.assertIn("Align/Integrate - Shifts", shifts.title)

def test_sequence_join_computation(self) -> None:
def test_sequence_join_computation_2d(self) -> None:
with create_memory_profile_context() as test_context:
document_controller = test_context.create_document_controller_with_application()
document_model = document_controller.document_model
Expand All @@ -503,6 +503,31 @@ def test_sequence_join_computation(self) -> None:
self.assertFalse(any(computation.error_text for computation in document_model.computations))
self.assertIn("(Join Sequence)", result_data_item.title)

def test_sequence_join_computation_1d(self) -> None:
with create_memory_profile_context() as test_context:
document_controller = test_context.create_document_controller_with_application()
document_model = document_controller.document_model
api = Facade.get_api("~1.0", "~1.0")
# setup
xdata1 = DataAndMetadata.new_data_and_metadata(numpy.random.randn(8,8), data_descriptor=DataAndMetadata.DataDescriptor(True, 0, 1))
data_item1 = DataItem.new_data_item(xdata1)
data_item1.title = "A"
document_model.append_data_item(data_item1)
display_item1 = document_model.get_display_item_for_data_item(data_item1)
xdata2 = DataAndMetadata.new_data_and_metadata(numpy.random.randn(8,8), data_descriptor=DataAndMetadata.DataDescriptor(True, 0, 1))
data_item2 = DataItem.new_data_item(xdata2)
data_item2.title = "A"
document_model.append_data_item(data_item2)
display_item2 = document_model.get_display_item_for_data_item(data_item2)
# make computation and execute
result_data_item = SequenceSplitJoin.sequence_join(api, Facade.DocumentWindow(document_controller), [Facade.Display(display_item1), Facade.Display(display_item2)])
document_model.recompute_all()
document_controller.periodic()
# check results
self.assertEqual(3, len(document_model.data_items))
self.assertFalse(any(computation.error_text for computation in document_model.computations))
self.assertIn("(Join Sequence)", result_data_item.title)

def test_sequence_split_computation(self) -> None:
with create_memory_profile_context() as test_context:
document_controller = test_context.create_document_controller_with_application()
Expand Down
Loading