示例#1
0
 def test_dimension_used_for_scale_marker_on_4d_diffraction_image_is_correct(
         self):
     document_model = DocumentModel.DocumentModel()
     document_controller = DocumentController.DocumentController(
         self.app.ui, document_model, workspace_id="library")
     with contextlib.closing(document_controller):
         display_panel = document_controller.selected_display_panel
         calibrations = [
             Calibration.Calibration(units="y"),
             Calibration.Calibration(units="x"),
             Calibration.Calibration(units="a"),
             Calibration.Calibration(units="b")
         ]
         data_and_metadata = DataAndMetadata.new_data_and_metadata(
             numpy.ones((10, 10, 50, 50)),
             dimensional_calibrations=calibrations,
             data_descriptor=DataAndMetadata.DataDescriptor(False, 2, 2))
         data_item = DataItem.new_data_item(data_and_metadata)
         document_model.append_data_item(data_item)
         display_item = document_model.get_display_item_for_data_item(
             data_item)
         display_panel.set_display_panel_display_item(display_item)
         header_height = display_panel.header_canvas_item.header_height
         display_panel.root_container.layout_immediate(
             (1000 + header_height, 1000))
         # run test
         self.assertEqual(
             display_panel.display_canvas_item.
             _info_overlay_canvas_item_for_test.
             _dimension_calibration_for_test.units, "b")
示例#2
0
 def test_data_timestamp_write_read_round_trip(self):
     for version in (3, 4):
         s = io.BytesIO()
         data_in = numpy.ones((6, 4), numpy.float32)
         data_descriptor_in = DataAndMetadata.DataDescriptor(False, 0, 2)
         dimensional_calibrations_in = [
             Calibration.Calibration(1.1, 2.1, "nm"),
             Calibration.Calibration(2, 3, u"µm")
         ]
         intensity_calibration_in = Calibration.Calibration(4.4, 5.5, "six")
         metadata_in = dict()
         timestamp_in = datetime.datetime(2013, 11, 18, 14, 5, 4, 0)
         timezone_in = "America/Los_Angeles"
         timezone_offset_in = "-0700"
         xdata_in = DataAndMetadata.new_data_and_metadata(
             data_in,
             data_descriptor=data_descriptor_in,
             dimensional_calibrations=dimensional_calibrations_in,
             intensity_calibration=intensity_calibration_in,
             metadata=metadata_in,
             timestamp=timestamp_in,
             timezone=timezone_in,
             timezone_offset=timezone_offset_in)
         dm3_image_utils.save_image(xdata_in, s, version)
         s.seek(0)
         xdata = dm3_image_utils.load_image(s)
         self.assertEqual(timestamp_in, xdata.timestamp)
         self.assertEqual(timezone_in, xdata.timezone)
         self.assertEqual(timezone_offset_in, xdata.timezone_offset)
示例#3
0
 def test_build_table_with_two_display_layers_of_same_calibrated_1d_data(
         self):
     with TestContext.create_memory_context() as test_context:
         calibration = Calibration.Calibration(1.0, 2.0, "nm")
         document_model = test_context.create_document_model()
         data_item = DataItem.DataItem(numpy.array([1.1, 1.2, 1.3, 1.4]))
         data_item.set_dimensional_calibration(0, calibration)
         data_item.set_intensity_calibration(
             Calibration.Calibration(0, 1, "e"))
         data_item2 = DataItem.DataItem(numpy.array([2.1, 2.2, 2.3, 2.4]))
         data_item2.set_dimensional_calibration(0, calibration)
         data_item2.set_intensity_calibration(
             Calibration.Calibration(0, 1, "e"))
         document_model.append_data_item(data_item)
         document_model.append_data_item(data_item2)
         display_item = document_model.get_display_item_for_data_item(
             data_item)
         display_item.append_display_data_channel_for_data_item(data_item2)
         display_item._set_display_layer_property(0, "label", "W")
         display_item._set_display_layer_property(1, "label", "T")
         headers, data = ImportExportManager.build_table(display_item)
         self.assertEqual(3, len(headers))
         self.assertEqual(3, len(data))
         self.assertEqual("X (nm)", headers[0])
         self.assertEqual("W (e)", headers[1])
         self.assertEqual("T (e)", headers[2])
         self.assertTrue(
             numpy.array_equal(
                 calibration.convert_to_calibrated_value(
                     numpy.arange(0, data_item.data.shape[0])), data[0]))
         self.assertTrue(numpy.array_equal(data_item.data, data[1]))
         self.assertTrue(numpy.array_equal(data_item2.data, data[2]))
示例#4
0
 def test_metadata_write_read_round_trip(self):
     s = io.BytesIO()
     data_in = numpy.ones((6, 4), numpy.float32)
     data_descriptor_in = DataAndMetadata.DataDescriptor(False, 0, 2)
     dimensional_calibrations_in = [
         Calibration.Calibration(1, 2, "nm"),
         Calibration.Calibration(2, 3, u"µm")
     ]
     intensity_calibration_in = Calibration.Calibration(4, 5, "six")
     metadata_in = {
         "abc": 1,
         "def": "abc",
         "efg": {
             "one": 1,
             "two": "TWO",
             "three": [3, 4, 5]
         }
     }
     xdata_in = DataAndMetadata.new_data_and_metadata(
         data_in,
         data_descriptor=data_descriptor_in,
         dimensional_calibrations=dimensional_calibrations_in,
         intensity_calibration=intensity_calibration_in,
         metadata=metadata_in)
     dm3_image_utils.save_image(xdata_in, s)
     s.seek(0)
     xdata = dm3_image_utils.load_image(s)
     self.assertEqual(metadata_in, xdata.metadata)
示例#5
0
 def test_rgb_data_write_read_round_trip(self):
     for version in (3, 4):
         s = io.BytesIO()
         data_in = (numpy.random.randn(6, 4, 3) * 255).astype(numpy.uint8)
         data_descriptor_in = DataAndMetadata.DataDescriptor(False, 0, 2)
         dimensional_calibrations_in = [
             Calibration.Calibration(1, 2, "nm"),
             Calibration.Calibration(2, 3, u"µm")
         ]
         intensity_calibration_in = Calibration.Calibration(4, 5, "six")
         metadata_in = {
             "abc": None,
             "": "",
             "one": [],
             "two": {},
             "three": [1, None, 2]
         }
         xdata_in = DataAndMetadata.new_data_and_metadata(
             data_in,
             data_descriptor=data_descriptor_in,
             dimensional_calibrations=dimensional_calibrations_in,
             intensity_calibration=intensity_calibration_in,
             metadata=metadata_in)
         dm3_image_utils.save_image(xdata_in, s, version)
         s.seek(0)
         xdata = dm3_image_utils.load_image(s)
         self.assertTrue(numpy.array_equal(data_in, xdata.data))
         self.assertEqual(data_descriptor_in, xdata.data_descriptor)
 def test_dimension_used_for_scale_marker_on_2d_data_stack_is_correct(self):
     with TestContext.create_memory_context() as test_context:
         document_controller = test_context.create_document_controller()
         document_model = document_controller.document_model
         display_panel = document_controller.selected_display_panel
         calibrations = [
             Calibration.Calibration(units="s"),
             Calibration.Calibration(units="y"),
             Calibration.Calibration(units="x")
         ]
         data_and_metadata = DataAndMetadata.new_data_and_metadata(
             numpy.ones((50, 10, 10)),
             dimensional_calibrations=calibrations,
             data_descriptor=DataAndMetadata.DataDescriptor(True, 0, 2))
         data_item = DataItem.new_data_item(data_and_metadata)
         document_model.append_data_item(data_item)
         display_item = document_model.get_display_item_for_data_item(
             data_item)
         display_panel.set_display_panel_display_item(display_item)
         header_height = display_panel.header_canvas_item.header_height
         display_panel.root_container.layout_immediate(
             (1000 + header_height, 1000))
         # run test
         self.assertEqual(
             display_panel.display_canvas_item.
             _info_overlay_canvas_item_for_test.
             _dimension_calibration_for_test.units, "x")
示例#7
0
 def test_data_item_metadata_methods(self):
     with create_memory_profile_context() as profile_context:
         document_model = DocumentModel.DocumentModel(profile=profile_context.create_profile())
         document_controller = self.app.create_document_controller(document_model, "library")
         with contextlib.closing(document_controller):
             data0 = numpy.arange(64).reshape(8, 8)
             data_item = DataItem.DataItem(data0)
             data_item.set_intensity_calibration(Calibration.Calibration(0.1, 0.2, "dogs"))
             data_item.set_dimensional_calibrations([Calibration.Calibration(0.3, 0.4, "cats"), Calibration.Calibration(0.5, 0.6, "cats")])
             metadata = {"title": "Dogs eat cats."}
             data_item.metadata = metadata
             document_model.append_data_item(data_item)
             api = Facade.get_api("~1.0", "~1.0")
             library = api.library
             data_item_ref = library.data_items[0]
             self.assertEqual(data_item_ref.intensity_calibration.units, "dogs")
             self.assertEqual(data_item_ref.dimensional_calibrations[1].units, "cats")
             self.assertEqual(data_item_ref.metadata, metadata)
             data_item_ref.set_intensity_calibration(api.create_calibration(0.11, 0.22, "cats"))
             data_item_ref.set_dimensional_calibrations([api.create_calibration(0.33, 0.44, "mice"), api.create_calibration(0.44, 0.66, "mice")])
             metadata2 = {"title": "Cats eat mice."}
             data_item_ref.set_metadata(metadata2)
             self.assertAlmostEqual(data_item.intensity_calibration.offset, 0.11)
             self.assertAlmostEqual(data_item.dimensional_calibrations[0].offset, 0.33)
             self.assertEqual(data_item.metadata, metadata2)
 def test_csv1_exporter_handles_multi_layer_display_item_with_different_calibration(self):
     with TestContext.create_memory_context() as test_context:
         document_model = test_context.create_document_model()
         data_item = DataItem.DataItem(numpy.full((50, ), 0, dtype=numpy.uint32))
         data_item.dimensional_calibrations = [Calibration.Calibration(offset=0, scale=1, units="eV")]
         data_item.intensity_calibration = Calibration.Calibration(offset=10, scale=2)
         data_item2 = DataItem.DataItem(numpy.full((100, ), 1, dtype=numpy.uint32))
         data_item2.dimensional_calibrations = [Calibration.Calibration(offset=-10, scale=2, units="eV")]
         data_item2.intensity_calibration = Calibration.Calibration(offset=5, scale=2)
         document_model.append_data_item(data_item)
         document_model.append_data_item(data_item2, False)
         display_item = document_model.get_display_item_for_data_item(data_item)
         display_item.display_type = "line_plot"
         display_item.append_display_data_channel_for_data_item(data_item2)
         current_working_directory = os.getcwd()
         file_path = os.path.join(current_working_directory, "__file.csv")
         handler = ImportExportManager.CSV1ImportExportHandler("csv1-io-handler", "CSV 1D", ["csv"])
         handler.write_display_item(None, display_item, file_path, "csv")
         self.assertTrue(os.path.exists(file_path))
         try:
             saved_data = numpy.genfromtxt(file_path, delimiter=", ")
             self.assertSequenceEqual(saved_data.shape, (max(data_item.xdata.data_shape[0], data_item2.xdata.data_shape[0]), 4))
             self.assertTrue(numpy.allclose(saved_data[:50, 0], numpy.linspace(0, 49, 50)))
             self.assertTrue(numpy.allclose(saved_data[:50, 1], 10))
             self.assertTrue(numpy.allclose(saved_data[:, 2], numpy.linspace(-10, 188, 100)))
             self.assertTrue(numpy.allclose(saved_data[:, 3], 7))
         finally:
             os.remove(file_path)
示例#9
0
 def test_display_data_of_3d_data_set_has_correct_shape_and_calibrations(
         self):
     with TestContext.create_memory_context() as test_context:
         document_model = test_context.create_document_model()
         intensity_calibration = Calibration.Calibration(units="I")
         dim0_calibration = Calibration.Calibration(units="A")
         dim1_calibration = Calibration.Calibration(units="B")
         dim2_calibration = Calibration.Calibration(units="C")
         data_item = DataItem.DataItem(
             numpy.zeros((16, 16, 64), numpy.float64))
         data_item.set_intensity_calibration(intensity_calibration)
         data_item.set_dimensional_calibrations(
             [dim0_calibration, dim1_calibration, dim2_calibration])
         document_model.append_data_item(data_item)
         display_item = document_model.get_display_item_for_data_item(
             data_item)
         display_data_and_metadata = display_item.display_data_channels[
             0].get_calculated_display_values(
                 True).display_data_and_metadata
         self.assertEqual(display_data_and_metadata.dimensional_shape,
                          (16, 16))
         self.assertEqual(display_data_and_metadata.intensity_calibration,
                          intensity_calibration)
         self.assertEqual(
             display_data_and_metadata.dimensional_calibrations[0],
             dim0_calibration)
         self.assertEqual(
             display_data_and_metadata.dimensional_calibrations[1],
             dim1_calibration)
示例#10
0
 def test_data_slice_of_sequence_handles_calibrations(self):
     data = numpy.zeros((10, 100, 100), dtype=numpy.float32)
     intensity_calibration = Calibration.Calibration(0.1, 0.2, "I")
     dimensional_calibrations = [
         Calibration.Calibration(0.11, 0.22, "S"),
         Calibration.Calibration(0.11, 0.22, "A"),
         Calibration.Calibration(0.111, 0.222, "B")
     ]
     xdata = DataAndMetadata.new_data_and_metadata(
         data,
         intensity_calibration=intensity_calibration,
         dimensional_calibrations=dimensional_calibrations,
         data_descriptor=DataAndMetadata.DataDescriptor(True, 0, 2))
     self.assertFalse(xdata[3].is_sequence)
     self.assertTrue(xdata[3:4].is_sequence)
     self.assertAlmostEqual(xdata[3].intensity_calibration.offset,
                            xdata.intensity_calibration.offset)
     self.assertAlmostEqual(xdata[3].intensity_calibration.scale,
                            xdata.intensity_calibration.scale)
     self.assertEqual(xdata[3].intensity_calibration.units,
                      xdata.intensity_calibration.units)
     self.assertAlmostEqual(xdata[3].dimensional_calibrations[0].offset,
                            xdata.dimensional_calibrations[1].offset)
     self.assertAlmostEqual(xdata[3].dimensional_calibrations[0].scale,
                            xdata.dimensional_calibrations[1].scale)
     self.assertEqual(xdata[3].dimensional_calibrations[0].units,
                      xdata.dimensional_calibrations[1].units)
     self.assertAlmostEqual(xdata[3].dimensional_calibrations[1].offset,
                            xdata.dimensional_calibrations[2].offset)
     self.assertAlmostEqual(xdata[3].dimensional_calibrations[1].scale,
                            xdata.dimensional_calibrations[2].scale)
     self.assertEqual(xdata[3].dimensional_calibrations[1].units,
                      xdata.dimensional_calibrations[2].units)
示例#11
0
 def test_signal_type_round_trip(self):
     for version in (3, 4):
         s = io.BytesIO()
         data_in = numpy.ones((12, ), numpy.float32)
         data_descriptor_in = DataAndMetadata.DataDescriptor(False, 0, 1)
         dimensional_calibrations_in = [Calibration.Calibration(1, 2, "eV")]
         intensity_calibration_in = Calibration.Calibration(4, 5, "e")
         metadata_in = {"hardware_source": {"signal_type": "EELS"}}
         xdata_in = DataAndMetadata.new_data_and_metadata(
             data_in,
             data_descriptor=data_descriptor_in,
             dimensional_calibrations=dimensional_calibrations_in,
             intensity_calibration=intensity_calibration_in,
             metadata=metadata_in)
         dm3_image_utils.save_image(xdata_in, s, version)
         s.seek(0)
         xdata = dm3_image_utils.load_image(s)
         metadata_expected = {
             'hardware_source': {
                 'signal_type': 'EELS'
             },
             'Meta Data': {
                 'Format': 'Spectrum',
                 'Signal': 'EELS'
             }
         }
         self.assertEqual(metadata_expected, xdata.metadata)
示例#12
0
 def test_metadata_difficult_types_write_read_round_trip(self):
     for version in (3, 4):
         s = io.BytesIO()
         data_in = numpy.ones((6, 4), numpy.float32)
         data_descriptor_in = DataAndMetadata.DataDescriptor(False, 0, 2)
         dimensional_calibrations_in = [
             Calibration.Calibration(1, 2, "nm"),
             Calibration.Calibration(2, 3, u"µm")
         ]
         intensity_calibration_in = Calibration.Calibration(4, 5, "six")
         metadata_in = {
             "abc": None,
             "": "",
             "one": [],
             "two": {},
             "three": [1, None, 2]
         }
         xdata_in = DataAndMetadata.new_data_and_metadata(
             data_in,
             data_descriptor=data_descriptor_in,
             dimensional_calibrations=dimensional_calibrations_in,
             intensity_calibration=intensity_calibration_in,
             metadata=metadata_in)
         dm3_image_utils.save_image(xdata_in, s, version)
         s.seek(0)
         xdata = dm3_image_utils.load_image(s)
         metadata_expected = {"one": [], "two": {}, "three": [1, 2]}
         self.assertEqual(metadata_expected, xdata.metadata)
 def get_dimensional_calibrations(self, readout_area: Geometry.IntRect, binning_shape: Geometry.IntSize):
     energy_offset_eV = self.instrument.energy_offset_eV
     # energy_offset_eV += random.uniform(-1, 1) * self.__energy_per_channel_eV * 5
     dimensional_calibrations = [
         Calibration.Calibration(),
         Calibration.Calibration(offset=energy_offset_eV, scale=self.instrument.energy_per_channel_eV, units="eV")
     ]
     return dimensional_calibrations
示例#14
0
 def get_dimensional_calibrations(
     self, readout_area: typing.Optional[Geometry.IntRect],
     binning_shape: typing.Optional[Geometry.IntSize]
 ) -> typing.Sequence[Calibration.Calibration]:
     """
     Subclasses should override this method
     """
     return [Calibration.Calibration(), Calibration.Calibration()]
示例#15
0
    def test_reference_images_load_properly(self):
        shape_data_descriptors = (
            ((3, ), DataAndMetadata.DataDescriptor(False, 0, 1)),  # spectrum
            ((3, 2),
             DataAndMetadata.DataDescriptor(False, 1,
                                            1)),  # 1d collection of spectra
            ((3, 4, 5),
             DataAndMetadata.DataDescriptor(False, 2,
                                            1)),  # 2d collection of spectra
            ((3, 2), DataAndMetadata.DataDescriptor(True, 0,
                                                    1)),  # sequence of spectra
            ((3, 2), DataAndMetadata.DataDescriptor(False, 0, 2)),  # image
            ((4, 3, 2),
             DataAndMetadata.DataDescriptor(False, 1,
                                            2)),  # 1d collection of images
            ((3, 4, 5),
             DataAndMetadata.DataDescriptor(True, 0, 2)),  # sequence of images
        )
        for (shape, data_descriptor), version in itertools.product(
                shape_data_descriptors, (3, 4)):
            dimensional_calibrations = list()
            for index, dimension in enumerate(shape):
                dimensional_calibrations.append(
                    Calibration.Calibration(1.0 + 0.1 * index,
                                            2.0 + 0.2 * index,
                                            "µ" + "n" * index))
            intensity_calibration = Calibration.Calibration(4, 5, "six")
            data = numpy.arange(numpy.product(shape),
                                dtype=numpy.float32).reshape(shape)

            name = f"ref_{'T' if data_descriptor.is_sequence else 'F'}_{data_descriptor.collection_dimension_count}_{data_descriptor.datum_dimension_count}.dm{version}"

            # import pathlib
            # xdata = DataAndMetadata.new_data_and_metadata(data, dimensional_calibrations=dimensional_calibrations, intensity_calibration=intensity_calibration, data_descriptor=data_descriptor)
            # file_path = pathlib.Path(__file__).parent / "resources" / name
            # with file_path.open('wb') as f:
            #     dm3_image_utils.save_image(xdata, f, version)

            try:
                s = io.BytesIO(pkgutil.get_data(__name__, f"resources/{name}"))
                xdata = dm3_image_utils.load_image(s)
                self.assertAlmostEqual(intensity_calibration.scale,
                                       xdata.intensity_calibration.scale, 6)
                self.assertAlmostEqual(intensity_calibration.offset,
                                       xdata.intensity_calibration.offset, 6)
                self.assertEqual(intensity_calibration.units,
                                 xdata.intensity_calibration.units)
                for c1, c2 in zip(dimensional_calibrations,
                                  xdata.dimensional_calibrations):
                    self.assertAlmostEqual(c1.scale, c2.scale, 6)
                    self.assertAlmostEqual(c1.offset, c2.offset, 6)
                    self.assertEqual(c1.units, c2.units)
                self.assertEqual(data_descriptor, xdata.data_descriptor)
                self.assertTrue(numpy.array_equal(data, xdata.data))
                # print(f"{name} {data_descriptor} PASS")
            except Exception as e:
                print(f"{name} {data_descriptor} FAIL")
                raise
示例#16
0
 def test_calibration_equality(self):
     calibration1 = Calibration.Calibration(1.0, 2.0, "c")
     calibration2 = Calibration.Calibration(1.0, 2.0, "c")
     self.assertEqual(calibration1, calibration2)
     calibration1 = Calibration.Calibration(1.0, 2.1, "c")
     calibration2 = Calibration.Calibration(1.0, 2.0, "c")
     self.assertNotEqual(calibration1, calibration2)
     self.assertNotEqual(calibration1, None)
     self.assertTrue(calibration1 != None)
     self.assertFalse(calibration1 == None)
示例#17
0
 def test_metadata_write_read_round_trip(self):
     s = io.BytesIO()
     data_in = numpy.ones((6, 4), numpy.float32)
     dimensional_calibrations_in = [Calibration.Calibration(1, 2, "nm"), Calibration.Calibration(2, 3, u"µm")]
     intensity_calibration_in = Calibration.Calibration(4, 5, "six")
     metadata_in = {"abc": 1, "def": "abc", "efg": { "one": 1, "two": "TWO", "three": [3, 4, 5] }}
     dm3_image_utils.save_image(data_in, dimensional_calibrations_in, intensity_calibration_in, metadata_in, s)
     s.seek(0)
     data_out, dimensional_calibrations_out, intensity_calibration_out, title_out, metadata_out = dm3_image_utils.load_image(s)
     self.assertEqual(metadata_in, metadata_out)
示例#18
0
 def test_rgb_data_write_read_round_trip(self):
     s = io.BytesIO()
     data_in = (numpy.random.randn(6, 4, 3) * 255).astype(numpy.uint8)
     dimensional_calibrations_in = [Calibration.Calibration(1, 2, "nm"), Calibration.Calibration(2, 3, u"µm")]
     intensity_calibration_in = Calibration.Calibration(4, 5, "six")
     metadata_in = {"abc": None, "": "", "one": [], "two": {}, "three": [1, None, 2]}
     dm3_image_utils.save_image(data_in, dimensional_calibrations_in, intensity_calibration_in, metadata_in, s)
     s.seek(0)
     data_out, dimensional_calibrations_out, intensity_calibration_out, title_out, metadata_out = dm3_image_utils.load_image(s)
     self.assertTrue(numpy.array_equal(data_in, data_out))
示例#19
0
 def test_metadata_difficult_types_write_read_round_trip(self):
     s = io.BytesIO()
     data_in = numpy.ones((6, 4), numpy.float32)
     dimensional_calibrations_in = [Calibration.Calibration(1, 2, "nm"), Calibration.Calibration(2, 3, u"µm")]
     intensity_calibration_in = Calibration.Calibration(4, 5, "six")
     metadata_in = {"abc": None, "": "", "one": [], "two": {}, "three": [1, None, 2]}
     dm3_image_utils.save_image(data_in, dimensional_calibrations_in, intensity_calibration_in, metadata_in, s)
     s.seek(0)
     data_out, dimensional_calibrations_out, intensity_calibration_out, title_out, metadata_out = dm3_image_utils.load_image(s)
     metadata_expected = {"one": [], "two": {}, "three": [1, 2]}
     self.assertEqual(metadata_out, metadata_expected)
示例#20
0
 def get_dimensional_calibrations(self, readout_area: Geometry.IntRect, binning_shape: Geometry.IntSize):
     height = readout_area.height if readout_area else self._sensor_dimensions[0]
     width = readout_area.width if readout_area else self._sensor_dimensions[1]
     scale_y = self.__tv_pixel_angle
     scale_x = self.__tv_pixel_angle
     offset_y = -scale_y * height * 0.5
     offset_x = -scale_x * width * 0.5
     dimensional_calibrations = [
         Calibration.Calibration(offset=offset_y, scale=scale_y, units="rad"),
         Calibration.Calibration(offset=offset_x, scale=scale_x, units="rad")
     ]
     return dimensional_calibrations
示例#21
0
 def test_calibrations_write_read_round_trip(self):
     s = io.BytesIO()
     data_in = numpy.ones((6, 4), numpy.float32)
     dimensional_calibrations_in = [Calibration.Calibration(1.1, 2.1, "nm"), Calibration.Calibration(2, 3, u"µm")]
     intensity_calibration_in = Calibration.Calibration(4.4, 5.5, "six")
     metadata_in = dict()
     dm3_image_utils.save_image(data_in, dimensional_calibrations_in, intensity_calibration_in, metadata_in, s)
     s.seek(0)
     data_out, dimensional_calibrations_out, intensity_calibration_out, title_out, metadata_out = dm3_image_utils.load_image(s)
     dimensional_calibrations_out = [Calibration.Calibration(*d) for d in dimensional_calibrations_out]
     self.assertEqual(dimensional_calibrations_in, dimensional_calibrations_out)
     intensity_calibration_out = Calibration.Calibration(*intensity_calibration_out)
     self.assertEqual(intensity_calibration_in, intensity_calibration_out)
示例#22
0
 def get_dimensional_calibrations(
     self, readout_area: typing.Optional[Geometry.IntRect],
     binning_shape: typing.Optional[Geometry.IntSize]
 ) -> typing.Sequence[Calibration.Calibration]:
     energy_offset_ev = self.instrument.energy_offset_eV
     # energy_offset_ev += random.uniform(-1, 1) * self.__energy_per_channel_eV * 5
     dimensional_calibrations = [
         Calibration.Calibration(),
         Calibration.Calibration(
             offset=energy_offset_ev,
             scale=self.instrument.energy_per_channel_eV,
             units="eV")
     ]
     return dimensional_calibrations
示例#23
0
    def update(self, data_and_metadata: DataAndMetadata.DataAndMetadata, state: str, scan_shape: Geometry.IntSize, dest_sub_area: Geometry.IntRect, sub_area: Geometry.IntRect, view_id) -> None:
        # there are a few techniques for getting data into a data item. this method prefers directly calling the
        # document model method update_data_item_partial, which is thread safe. if that method is not available, it
        # falls back to the data item method set_data_and_metadata, which must be called from the main thread.
        # the hardware source also supplies a data channel which is thread safe and ends up calling set_data_and_metadata
        # but we skip that so that the updates fit into this class instead.
        frames = self.__multi_acquire_parameters[self.__current_parameters_index]['frames']
        sum_frames = self.__multi_acquire_settings['sum_frames']
        collection_rank = len(tuple(scan_shape))
        data_shape_and_dtype = (tuple(scan_shape) + data_and_metadata.data_shape[collection_rank:], data_and_metadata.data_dtype)
        data_descriptor = DataAndMetadata.DataDescriptor(frames > 1 and not sum_frames, collection_rank, len(data_and_metadata.data_shape) - collection_rank)
        dimensional_calibrations = data_and_metadata.dimensional_calibrations
        if frames > 1 and not sum_frames:
            dimensional_calibrations = (Calibration.Calibration(),) + tuple(dimensional_calibrations)
            data_shape = data_shape_and_dtype[0]
            data_shape = (frames,) + data_shape
            data_shape_and_dtype = (data_shape, data_shape_and_dtype[1])

        intensity_calibration = data_and_metadata.intensity_calibration
        if self.__multi_acquire_settings['use_multi_eels_calibration']:
            metadata = data_and_metadata.metadata.get('hardware_source', {})
            counts_per_electron = metadata.get('counts_per_electron', 1)
            exposure_s = metadata.get('exposure', self.__multi_acquire_parameters[self.__current_parameters_index]['exposure_ms']*0.001)
            _number_frames = 1 if not sum_frames else frames
            intensity_scale = (data_and_metadata.intensity_calibration.scale / counts_per_electron /
                               data_and_metadata.dimensional_calibrations[-1].scale / exposure_s / _number_frames)
            intensity_calibration = Calibration.Calibration(scale=intensity_scale)

        metadata = data_and_metadata.metadata
        metadata["MultiAcquire.settings"] = copy.deepcopy(self.__multi_acquire_settings)
        metadata["MultiAcquire.parameters"] = copy.deepcopy(self.__multi_acquire_parameters[self.__current_parameters_index])
        data_metadata = DataAndMetadata.DataMetadata(data_shape_and_dtype,
                                                     intensity_calibration,
                                                     dimensional_calibrations,
                                                     metadata=data_and_metadata.metadata,
                                                     data_descriptor=data_descriptor)
        src_slice = sub_area.slice + (Ellipsis,)
        dst_slice = dest_sub_area.slice + (Ellipsis,)
        if frames > 1:
            if sum_frames:
                existing_data = self.__data_item.data
                if existing_data is not None:
                    existing_data[dst_slice] += data_and_metadata.data[src_slice]
            else:
                dst_slice = (self.current_frames_index,) + dst_slice # type: ignore

        self.__document_model.update_data_item_partial(self.__data_item, data_metadata, data_and_metadata, src_slice, dst_slice)
        self.update_progress(dest_sub_area.bottom)
 def test_line_plot_calculates_calibrated_vs_uncalibrated_display_y_values(
         self):
     with TestContext.create_memory_context() as test_context:
         document_controller = test_context.create_document_controller()
         document_model = document_controller.document_model
         data_item = DataItem.new_data_item(
             DataAndMetadata.new_data_and_metadata(
                 numpy.ones((8, )),
                 intensity_calibration=Calibration.Calibration(offset=0,
                                                               scale=10,
                                                               units="nm")))
         document_model.append_data_item(data_item)
         display_item = document_model.get_display_item_for_data_item(
             data_item)
         display_item.display_type = "line_plot"
         display_panel = document_controller.selected_display_panel
         display_panel.set_display_panel_display_item(display_item)
         display_panel.display_canvas_item.layout_immediate((640, 480))
         self.assertTrue(
             numpy.array_equal(
                 display_panel.display_canvas_item.line_graph_canvas_item.
                 calibrated_xdata.data, numpy.full((8, ), 10)))
         display_item.calibration_style_id = "pixels-top-left"
         display_panel.display_canvas_item.layout_immediate((640, 480))
         self.assertTrue(
             numpy.array_equal(
                 display_panel.display_canvas_item.line_graph_canvas_item.
                 calibrated_xdata.data, numpy.ones((8, ))))
 def test_line_plot_handles_calibrated_vs_uncalibrated_display(self):
     with TestContext.create_memory_context() as test_context:
         document_controller = test_context.create_document_controller()
         document_model = document_controller.document_model
         data_item = DataItem.new_data_item(
             DataAndMetadata.new_data_and_metadata(
                 numpy.ones((8, )),
                 dimensional_calibrations=[
                     Calibration.Calibration(offset=0, scale=10, units="nm")
                 ]))
         document_model.append_data_item(data_item)
         display_item = document_model.get_display_item_for_data_item(
             data_item)
         display_item.display_type = "line_plot"
         display_panel = document_controller.selected_display_panel
         display_panel.set_display_panel_display_item(display_item)
         display_panel.display_canvas_item.layout_immediate((640, 480))
         self.assertEqual(
             display_panel.display_canvas_item.line_graph_canvas_item.
             calibrated_xdata.dimensional_calibrations[-1].units, "nm")
         display_item.calibration_style_id = "pixels-top-left"
         display_panel.display_canvas_item.layout_immediate((640, 480))
         self.assertFalse(
             display_panel.display_canvas_item.line_graph_canvas_item.
             calibrated_xdata.dimensional_calibrations[-1].units)
 def test_line_plot_handle_calibrated_x_axis_with_negative_scale(self):
     with TestContext.create_memory_context() as test_context:
         document_controller = test_context.create_document_controller()
         document_model = document_controller.document_model
         display_panel = document_controller.selected_display_panel
         data = numpy.random.randn(100)
         data_item = DataItem.DataItem(data)
         data_item.set_xdata(
             DataAndMetadata.new_data_and_metadata(
                 data,
                 dimensional_calibrations=[
                     Calibration.Calibration(0, -1.0, "e")
                 ]))
         document_model.append_data_item(data_item)
         display_item = document_model.get_display_item_for_data_item(
             data_item)
         display_panel.set_display_panel_display_item(display_item)
         display_panel.display_canvas_item.layout_immediate((640, 480))
         axes = display_panel.display_canvas_item._axes
         drawing_context = DrawingContext.DrawingContext()
         calibrated_data_min = axes.calibrated_data_min
         calibrated_data_max = axes.calibrated_data_max
         calibrated_data_range = calibrated_data_max - calibrated_data_min
         LineGraphCanvasItem.draw_line_graph(
             drawing_context, 480, 640, 0, 0, data_item.xdata,
             calibrated_data_min, calibrated_data_range,
             axes.calibrated_left_channel, axes.calibrated_right_channel,
             axes.x_calibration, "black", "black", None, axes.data_style)
         # ensure that the drawing commands are sufficiently populated to have drawn the graph
         self.assertGreater(len(drawing_context.commands), 100)
示例#27
0
 def create_data_item():
     nonlocal new_data_item, scan_xdata
     if number_frames > 1 and not scan_data_dict['settings'][
             'sum_frames']:
         data = scan_xdata.data[numpy.newaxis, ...]
         dimensional_calibrations = [
             Calibration.Calibration()
         ] + list(scan_xdata.dimensional_calibrations)
         data_descriptor = DataAndMetadata.DataDescriptor(
             True, scan_xdata.data_descriptor.
             collection_dimension_count,
             scan_xdata.data_descriptor.datum_dimension_count)
         scan_xdata = DataAndMetadata.new_data_and_metadata(
             data,
             intensity_calibration=scan_xdata.
             intensity_calibration,
             dimensional_calibrations=dimensional_calibrations,
             metadata=scan_xdata.metadata,
             timestamp=scan_xdata.timestamp,
             data_descriptor=data_descriptor,
             timezone=scan_xdata.timezone,
             timezone_offset=scan_xdata.timezone_offset)
     new_data_item = self.__api.library.create_data_item_from_data_and_metadata(
         scan_xdata, title=title)
     data_item_ready_event.set()
    def test_display_limits_are_reasonable_when_using_calibrated_log_scale(
            self):

        test_ranges = (((-0.1, 11.0), (0.97, 20.0)), ((1000.0, 1100.0),
                                                      (1992.70, 2238.7)),
                       ((1.0, 2.0), (0.09, 20.0)), ((3.0, 4.0), (0.99, 3.0)),
                       ((2.0, 2.1), (0.09, 20.0)), ((0.0, 5.0), (0.98, 10.0)))

        for data_in, data_out in test_ranges:
            with self.subTest(data_in=data_in, data_out=data_out):
                data = numpy.linspace(data_in[0],
                                      data_in[1],
                                      100,
                                      endpoint=False)
                intensity_calibration = Calibration.Calibration(-5, 2)
                data_style = "log"
                calibrated_data_min, calibrated_data_max, y_ticker = LineGraphCanvasItem.calculate_y_axis(
                    [data], None, None, intensity_calibration, data_style)
                axes = LineGraphCanvasItem.LineGraphAxes(
                    1.0, calibrated_data_min, calibrated_data_max, 0, 100,
                    None, None, data_style, y_ticker)
                self.assertAlmostEqual(axes.uncalibrated_data_min,
                                       data_out[0],
                                       places=1)
                self.assertAlmostEqual(axes.uncalibrated_data_max,
                                       data_out[1],
                                       places=1)
                calibrated_data = axes.calculate_calibrated_xdata(
                    DataAndMetadata.new_data_and_metadata(data)).data
                assert calibrated_data is not None
                data[data <= 0] = numpy.nan
                self.assertAlmostEqual(numpy.nanmin(calibrated_data),
                                       math.log10(numpy.nanmin(data)))
                self.assertAlmostEqual(numpy.nanmax(calibrated_data),
                                       math.log10(numpy.nanmax(data)))
 def __create_spectrum(self) -> DataItem.DataItem:
     data = numpy.random.uniform(10, 1000, 1024).astype(numpy.float32)
     intensity_calibration = Calibration.Calibration(units="~")
     dimensional_calibrations = [
         Calibration.Calibration(scale=2.0, units="eV")
     ]
     data_descriptor = DataAndMetadata.DataDescriptor(
         is_sequence=False,
         collection_dimension_count=0,
         datum_dimension_count=1)
     xdata = DataAndMetadata.new_data_and_metadata(
         data,
         intensity_calibration=intensity_calibration,
         dimensional_calibrations=dimensional_calibrations,
         data_descriptor=data_descriptor)
     return DataItem.new_data_item(xdata)
示例#30
0
 def test_norm(self):
     offset_eV = 100
     onset_eV = 30
     data1 = numpy.zeros((1000, ))
     EELSCameraSimulator.plot_norm(data1, 1.0E6, Calibration.Calibration(),
                                   offset_eV, onset_eV)
     data2 = numpy.zeros((1000, ))
     EELSCameraSimulator.plot_norm(data2, 1.0E6,
                                   Calibration.Calibration(offset=10),
                                   offset_eV, onset_eV)
     data3 = numpy.zeros((1000, ))
     EELSCameraSimulator.plot_norm(data3, 1.0E6,
                                   Calibration.Calibration(offset=100),
                                   offset_eV, onset_eV)
     self.assertEqual(int(data1[500]), int(data2[500 - 10]))
     self.assertEqual(int(data1[500]), int(data3[500 - 100]))