|
|
- """
- Functions to create artificial nd2 data for testing purposes
- """
- import six
- import numpy as np
- import struct
-
-
- class ArtificialND2(object):
- """
- Artificial ND2 class (for testing purposes)
- """
-
- def __init__(self, file):
- self._fh = open(file, 'wb')
- self.write_version()
-
- def __enter__(self):
- return self
-
- def __exit__(self, exc_type, exc_value, traceback):
- self.close()
-
- @property
- def file_handle(self):
- """
- The file handle to the binary file
- Returns:
- file: the file handle
- """
- return self._fh
-
- def close(self):
- """
- Correctly close the file handle
- """
- if self._fh is not None:
- self._fh.close()
-
- def write_version(self):
- """
- Write file header
- """
- # write 16 empty bytes
- self._fh.write(bytearray(16))
-
- # write version info
- version_info = six.b('ND2 FILE SIGNATURE CHUNK NAME01!Ver3.0')
- self._fh.write(version_info)
-
- @staticmethod
- def create_label_map_bytes():
- """
- Construct a binary label map
- Returns:
- tuple: (binary data, dictionary data)
- """
- raw_text = six.b('')
- labels = {
- 'image_attributes': "ImageAttributesLV!",
- 'image_text_info': "ImageTextInfoLV!",
- 'image_metadata': "ImageMetadataLV!",
- 'image_metadata_sequence': "ImageMetadataSeqLV|0!",
- 'image_calibration': "ImageCalibrationLV|0!",
- 'x_data': "CustomData|X!",
- 'y_data': "CustomData|Y!",
- 'z_data': "CustomData|Z!",
- 'roi_metadata': "CustomData|RoiMetadata_v1!",
- 'pfs_status': "CustomData|PFS_STATUS!",
- 'pfs_offset': "CustomData|PFS_OFFSET!",
- 'guid': "CustomData|GUIDStore!",
- 'description': "CustomData|CustomDescriptionV1_0!",
- 'camera_exposure_time': "CustomData|Camera_ExposureTime1!",
- 'camera_temp': "CustomData|CameraTemp1!",
- 'acquisition_times': "CustomData|AcqTimesCache!",
- 'acquisition_times_2': "CustomData|AcqTimes2Cache!",
- 'acquisition_frames': "CustomData|AcqFramesCache!",
- 'lut_data': "CustomDataVar|LUTDataV1_0!",
- 'grabber_settings': "CustomDataVar|GrabberCameraSettingsV1_0!",
- 'custom_data': "CustomDataVar|CustomDataV2_0!",
- 'app_info': "CustomDataVar|AppInfo_V1_0!"
- }
- data = {}
-
- # generate random positions and lengths
- lengths = np.random.random_integers(1, 999, len(labels))
- positions = np.subtract(np.cumsum(lengths), lengths[0])
-
- for length, pos, label in zip(lengths, positions, labels):
- raw_text += six.b(labels[label])
- raw_text += struct.pack('QQ', pos, length)
- data[label] = (pos, length)
-
- return raw_text, data
|