Skip to content

Commit 561b3ed

Browse files
Merge pull request #1069 from annie-xd-wang/ximea-camera
add Ximea camera class file
2 parents 1b758e9 + 83cee4b commit 561b3ed

File tree

7 files changed

+609
-29
lines changed

7 files changed

+609
-29
lines changed

src/navigate/controller/sub_controllers/camera_settings.py

+12-3
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,6 @@ def initialize(self):
153153
self.update_camera_device_related_setting()
154154

155155
# Camera Mode
156-
self.mode_widgets["Sensor"].widget["values"] = ["Normal", "Light-Sheet"]
157156
self.mode_widgets["Sensor"].widget["state"] = "readonly"
158157
self.mode_widgets["Sensor"].widget.selection_clear()
159158

@@ -219,8 +218,7 @@ def populate_experiment_values(self):
219218
][microscope_name]
220219

221220
# Readout Settings
222-
self.mode_widgets["Sensor"].set(self.camera_setting_dict["sensor_mode"])
223-
self.update_sensor_mode()
221+
self.update_sensor_mode(self.camera_setting_dict["sensor_mode"])
224222

225223
# ROI Settings
226224
if self.camera_setting_dict.get("is_centered", True):
@@ -337,6 +335,11 @@ def update_experiment_values(self, *args):
337335
]
338336
img_width = x_pixels // binning[0]
339337
img_height = y_pixels // binning[1]
338+
img_width = img_width - img_width % self.step_width
339+
img_height = img_height - img_height % self.step_height
340+
341+
x_pixels = img_width * binning[0]
342+
y_pixels = img_height * binning[1]
340343

341344
self.camera_setting_dict["x_pixels"] = x_pixels
342345
self.camera_setting_dict["y_pixels"] = y_pixels
@@ -372,6 +375,8 @@ def update_sensor_mode(self, *args):
372375
# Camera Mode
373376
if len(args) > 0 and type(args[0]) is str:
374377
sensor_value = args[0]
378+
if sensor_value not in self.mode_widgets["Sensor"].widget["values"]:
379+
sensor_value = self.mode_widgets["Sensor"].widget["values"][0]
375380
self.mode_widgets["Sensor"].widget.set(sensor_value)
376381
else:
377382
sensor_value = self.mode_widgets["Sensor"].widget.get()
@@ -706,6 +711,10 @@ def update_camera_device_related_setting(self):
706711
"CameraParameters"
707712
][microscope_name]
708713

714+
self.mode_widgets["Sensor"].widget["values"] = camera_config_dict.get("supported_sensor_modes", ["Normal"])
715+
if self.mode_widgets["Sensor"].get() not in self.mode_widgets["Sensor"].widget["values"]:
716+
self.update_sensor_mode(self.mode_widgets["Sensor"].widget["values"][0])
717+
709718
def update_camera_parameters_silent(self, value):
710719
"""Update GUI camera parameters
711720

src/navigate/model/devices/camera/base.py

+33
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ def __init__(
130130
self.camera_parameters["trigger_active"] = 1.0
131131
self.camera_parameters["trigger_mode"] = 1.0
132132
self.camera_parameters["trigger_polarity"] = 2.0
133+
self.camera_parameters["supported_sensor_modes"] = ["Normal", "Light-Sheet"]
133134
self.camera_parameters["supported_readout_directions"] = [
134135
"Top-to-Bottom",
135136
"Bottom-to-Top",
@@ -258,3 +259,35 @@ def get_line_interval(self) -> float:
258259
line interval duration (s).
259260
"""
260261
return self.camera_parameters.get("line_interval", None)
262+
263+
264+
def set_ROI_and_binning(self, roi_width=2048, roi_height=2048, center_x=1024, center_y=1024, binning='1x1') -> bool:
265+
"""Change the size of the active region on the camera and set the binning mode.
266+
267+
Parameters
268+
----------
269+
roi_width : int
270+
Width of active camera region.
271+
roi_height : int
272+
Height of active camera region.
273+
center_x : int
274+
X position of the center of view
275+
center_y : int
276+
Y position of the center of view
277+
binning : str
278+
Desired binning properties (e.g., '1x1', '2x2', '4x4', '8x8', '16x16',
279+
'1x2', '2x4')
280+
281+
Returns
282+
-------
283+
result: bool
284+
True if successful, False otherwise.
285+
"""
286+
# Set ROI
287+
result = self.set_ROI(roi_width, roi_height, center_x, center_y)
288+
if not result:
289+
return False
290+
291+
# Set Binning
292+
result = self.set_binning(binning)
293+
return result

src/navigate/model/devices/camera/synthetic.py

+29-3
Original file line numberDiff line numberDiff line change
@@ -234,18 +234,38 @@ def set_line_interval(self, line_interval_time: float) -> None:
234234
"""
235235
pass
236236

237-
def set_binning(self, binning_string: str) -> None:
237+
def set_binning(self, binning_string: str) -> bool:
238238
"""Set SyntheticCamera binning mode.
239239
240240
Parameters
241241
----------
242242
binning_string : str
243-
Desired binning properties (e.g., '2x2', '4x4', '8x8'
243+
Desired binning properties (e.g., '2x2', '4x4', '8x8')
244+
245+
Returns
246+
-------
247+
bool
248+
True if successful, False otherwise.
244249
"""
250+
binning_dict = {
251+
"1x1": 1,
252+
"2x2": 2,
253+
"4x4": 4,
254+
# '8x8': 8,
255+
# '16x16': 16,
256+
# '1x2': 102,
257+
# '2x4': 204
258+
}
259+
if binning_string not in binning_dict.keys():
260+
logger.debug(f"can't set binning to {binning_string}")
261+
print(f"can't set binning to {binning_string}")
262+
return False
263+
245264
self.x_binning = int(binning_string[0])
246265
self.y_binning = int(binning_string[2])
247266
self.x_pixels = int(self.x_pixels / self.x_binning)
248267
self.y_pixels = int(self.y_pixels / self.y_binning)
268+
return True
249269

250270
def initialize_image_series(
251271
self,
@@ -362,7 +382,7 @@ def set_ROI(
362382
roi_height: int = 2048,
363383
center_x: int = 1024,
364384
center_y: int = 1024,
365-
) -> None:
385+
) -> bool:
366386
"""Change the size of the active region on the camera.
367387
368388
Parameters
@@ -375,11 +395,17 @@ def set_ROI(
375395
X position of the center of view
376396
center_y : int
377397
Y position of the center of view
398+
399+
Returns
400+
-------
401+
bool
402+
True if successful, False otherwise.
378403
"""
379404
self.x_pixels = roi_width
380405
self.y_pixels = roi_height
381406
self.center_x = center_x
382407
self.center_y = center_y
408+
return True
383409

384410
@staticmethod
385411
def calculate_readout_time() -> float:

0 commit comments

Comments
 (0)