Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
60c2b5d
2D detector image can zoom in/out
yannachen Aug 27, 2024
05939c8
Update robot GUI
yannachen Aug 28, 2024
7b781d6
Add functions to estimate data_noise
yannachen Aug 30, 2024
2b1af70
Set limits for PyDMSlider
yannachen Sep 5, 2024
b2340fc
Update exposure time and gain and overlay line width.
yannachen Jan 21, 2025
dc9463e
Merge branch 'spc-group:main' into det_display
yannachen Jan 21, 2025
273f7d8
Merge branch 'det_display' of github.com:yannachen/haven into det_dis…
yannachen Jan 21, 2025
0a848c7
Name the ui objects
yannachen Jan 21, 2025
7cd53b8
Add slot for checkbox and pushbutton
yannachen Jan 22, 2025
50548da
Add tests for CheckBox and PushButton.
yannachen Jan 22, 2025
e35eeca
Merge branch 'spc-group:main' into det_display
yannachen Jan 22, 2025
8e915f7
Update the checkbox and push button test
yannachen Jan 22, 2025
a6fca52
Pass pytest.
yannachen Jan 22, 2025
f384ae1
Add shape width in overlays
yannachen Jan 23, 2025
271f3de
Update overlay ui.
yannachen Jan 24, 2025
dff4db7
Update robot ui
yannachen Jan 24, 2025
7ab5cae
Delete unknow folder
yannachen Jan 24, 2025
a134fe6
Remove change in yml file
yannachen Jan 24, 2025
f3c6d8f
Use black and isort
yannachen Jan 24, 2025
57759c1
Merge branch 'main' into det_display
yannachen Jan 24, 2025
b247268
Update line_scan
yannachen Jan 24, 2025
1f2e71b
Merge branch 'det_display' of github.com:yannachen/haven into det_dis…
yannachen Jan 24, 2025
8df0fdf
update enviroment file
yannachen Jan 24, 2025
0b82434
Git remove trash files
yannachen Jan 24, 2025
1d2fa21
Git remove again
yannachen Jan 24, 2025
59955c2
Update following ophyd-async v090a2
yannachen Jan 29, 2025
b05498d
Change _drv to driver
yannachen Jan 29, 2025
4967b00
Merge branch 'main' into det_display
yannachen Jan 30, 2025
cb98e0e
black
yannachen Jan 30, 2025
316fe92
Merge branch 'det_display' of github.com:yannachen/haven into det_dis…
yannachen Jan 30, 2025
addbaa4
Update test files for AD
yannachen Jan 30, 2025
7b18927
change 'hdf' to 'fileio'
yannachen Jan 30, 2025
3d4f00e
Update test file from 'hdf' to 'fileio'
yannachen Jan 30, 2025
1e50681
update sim_detector
yannachen Jan 30, 2025
e8ce44f
black
yannachen Jan 30, 2025
d12742d
update environment for qt designer
yannachen Jan 30, 2025
6e11498
Add dask
yannachen Jan 31, 2025
ace388d
pytest xspress failed for test_trigger
yannachen Jan 31, 2025
2b9cf41
black and isort
yannachen Jan 31, 2025
bc0fc82
flake
yannachen Jan 31, 2025
d2e1431
Remove arm() disarm() wait_for_idle()
yannachen Feb 12, 2025
f49aa9e
black and isort
yannachen Feb 12, 2025
b86eed3
Merge branch 'main' into det_display
yannachen Feb 12, 2025
4f8b3ed
isort again
yannachen Feb 12, 2025
4a650d3
Merge branch 'det_display' of github.com:yannachen/haven into det_dis…
yannachen Feb 12, 2025
3de9c21
isort mannually
yannachen Feb 12, 2025
5a2a0a1
import package
yannachen Feb 12, 2025
f72eec1
isort
yannachen Feb 12, 2025
5cb5f45
Merge remote-tracking branch 'origin/main' into ad_signals
canismarko Feb 17, 2025
25632c2
Added an overlay plugin for area detectors.
canismarko Feb 17, 2025
f0d1d4b
Added a PVA plugin to the sim detector.
canismarko Feb 18, 2025
25483a1
Added auto gain signal to Aravis detectors.
canismarko Feb 21, 2025
4d04416
Fixed signals on aravis detector.
canismarko Feb 21, 2025
b1d8879
Merge pull request #1 from yannachen/ad_signals
yannachen Feb 25, 2025
7db47b9
update area detector ui files
yannachen Feb 25, 2025
99ff031
Add period
yannachen Feb 27, 2025
63e65e2
update overlay channel
yannachen Feb 28, 2025
cd03d2e
Merge branch 'main' into det_display
canismarko Feb 28, 2025
89a2d8d
check PV connection
yannachen Mar 4, 2025
3be988a
Merge branch 'det_display' of github.com:yannachen/haven into det_dis…
yannachen Mar 4, 2025
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
1 change: 1 addition & 0 deletions environment-designer.yml
Original file line number Diff line number Diff line change
Expand Up @@ -81,3 +81,4 @@ dependencies:
# --- Extra Qt UI packages
- qtawesome
- qasync
- dask >= 2022
91 changes: 83 additions & 8 deletions src/firefly/area_detector_overlay.ui
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>263</width>
<height>181</height>
<width>250</width>
<height>192</height>
</rect>
</property>
<property name="windowTitle">
Expand Down Expand Up @@ -44,7 +44,7 @@
<string/>
</property>
<property name="channel" stdset="0">
<string>haven://${AD}.overlays.overlay_${OV}.use</string>
<string>haven://${AD}-overlay-overlays-${OV}.use</string>
</property>
</widget>
</item>
Expand All @@ -61,8 +61,28 @@
<string/>
</property>
<property name="channel" stdset="0">
<string>haven://${AD}.overlays.overlay_${OV}.shape</string>
<string>haven://${AD}-overlay-overlays-${OV}.shape</string>
</property>
<item>
<property name="text">
<string>CROSS</string>
</property>
</item>
<item>
<property name="text">
<string>RECTANGLE</string>
</property>
</item>
<item>
<property name="text">
<string>ELLIPSE</string>
</property>
</item>
<item>
<property name="text">
<string>TEXT</string>
</property>
</item>
</widget>
</item>
</layout>
Expand All @@ -75,7 +95,7 @@
<string/>
</property>
<property name="channel" stdset="0">
<string>haven://${AD}.overlays.overlay_${OV}.position_y</string>
<string>haven://${AD}-overlay-overlays-${OV}.center_y</string>
</property>
<property name="orientation" stdset="0">
<enum>Qt::Vertical</enum>
Expand All @@ -100,7 +120,7 @@
<string/>
</property>
<property name="channel" stdset="0">
<string>haven://${AD}.overlays.overlay_${OV}.position_x</string>
<string>haven://${AD}-overlay-overlays-${OV}.center_x</string>
</property>
<property name="step_size" stdset="0">
<number>0</number>
Expand Down Expand Up @@ -132,7 +152,7 @@
<string/>
</property>
<property name="channel" stdset="0">
<string>haven://${AD}.overlays.overlay_${OV}.size_y</string>
<string>haven://${AD}-overlay-overlays-${OV}.size_y</string>
</property>
<property name="orientation" stdset="0">
<enum>Qt::Vertical</enum>
Expand All @@ -157,7 +177,7 @@
<string/>
</property>
<property name="channel" stdset="0">
<string>haven://${AD}.overlays.overlay_${OV}.size_x</string>
<string>haven://${AD}-overlay-overlays-${OV}.size_x</string>
</property>
</widget>
</item>
Expand All @@ -178,6 +198,60 @@
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_10">
<item>
<widget class="PyDMSlider" name="PyDMSlider_9">
<property name="toolTip">
<string/>
</property>
<property name="channel" stdset="0">
<string>haven://${AD}-overlay-overlays-${OV}.width_y</string>
</property>
<property name="orientation" stdset="0">
<enum>Qt::Vertical</enum>
</property>
</widget>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_7">
<item>
<widget class="QLabel" name="label_8">
<property name="text">
<string>Width</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<widget class="PyDMSlider" name="PyDMSlider_10">
<property name="toolTip">
<string/>
</property>
<property name="channel" stdset="0">
<string>haven://${AD}-overlay-overlays-${OV}.width_x</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="horizontalSpacer_7">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</widget>
<customwidgets>
Expand All @@ -195,6 +269,7 @@
<class>PyDMSlider</class>
<extends>QFrame</extends>
<header>pydm.widgets.slider</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources/>
Expand Down
53 changes: 45 additions & 8 deletions src/firefly/area_detector_roi.ui
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,16 @@
<string>haven://${AD}.roi${R}.min_xyz.min_y</string>
</property>
<property name="orientation" stdset="0">
<enum>Qt::Vertical</enum>
<number>2</number>
</property>
<property name="userMaximum" stdset="0">
<double>3000.000000000000000</double>
</property>
<property name="userMinimum" stdset="0">
<double>0.000000000000000</double>
</property>
<property name="userDefinedLimits" stdset="0">
<bool>true</bool>
</property>
</widget>
</item>
Expand All @@ -174,6 +183,15 @@
<property name="step_size" stdset="0">
<number>0</number>
</property>
<property name="userMaximum" stdset="0">
<double>3000.000000000000000</double>
</property>
<property name="userMinimum" stdset="0">
<double>0.000000000000000</double>
</property>
<property name="userDefinedLimits" stdset="0">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
Expand Down Expand Up @@ -204,7 +222,16 @@
<string>haven://${AD}.roi${R}.size.y</string>
</property>
<property name="orientation" stdset="0">
<enum>Qt::Vertical</enum>
<number>2</number>
</property>
<property name="userMaximum" stdset="0">
<double>3000.000000000000000</double>
</property>
<property name="userMinimum" stdset="0">
<double>0.000000000000000</double>
</property>
<property name="userDefinedLimits" stdset="0">
<bool>true</bool>
</property>
</widget>
</item>
Expand All @@ -228,6 +255,15 @@
<property name="channel" stdset="0">
<string>haven://${AD}.roi${R}.size.x</string>
</property>
<property name="userMaximum" stdset="0">
<double>3000.000000000000000</double>
</property>
<property name="userMinimum" stdset="0">
<double>0.000000000000000</double>
</property>
<property name="userDefinedLimits" stdset="0">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
Expand All @@ -250,11 +286,6 @@
</layout>
</widget>
<customwidgets>
<customwidget>
<class>PyDMLabel</class>
<extends>QLabel</extends>
<header>pydm.widgets.label</header>
</customwidget>
<customwidget>
<class>PyDMCheckbox</class>
<extends>QCheckBox</extends>
Expand All @@ -263,7 +294,13 @@
<customwidget>
<class>PyDMSlider</class>
<extends>QFrame</extends>
<header>pydm.widgets.slider</header>
<header location="global">pydm.widgets.slider</header>
<container>1</container>
</customwidget>
<customwidget>
<class>PyDMLabel</class>
<extends>QLabel</extends>
<header>pydm.widgets.label</header>
</customwidget>
</customwidgets>
<resources/>
Expand Down
79 changes: 77 additions & 2 deletions src/firefly/area_detector_viewer.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
import numpy as np
import pydm
import pyqtgraph
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtWidgets import QCheckBox, QPushButton, PyDMLineEdit

from firefly import display
from haven import beamline
Expand All @@ -23,11 +25,35 @@ class AreaDetectorViewerDisplay(display.FireflyDisplay):
)
image_is_new: bool = True

def __init__(self, parent=None, args=None, macros=None):
super().__init__(parent=parent, args=args, macros=macros)

# Access Exposure widgets
self.exposure_checkbox = self.findChild(QCheckBox, "ExposureCheckBox")
self.exposure_push_button = self.findChild(QPushButton, "ExposurePushButton")

# Connect Exposure signals to slots
self.exposure_checkbox.stateChanged.connect(
self.handle_exposure_checkbox_change
)
self.exposure_push_button.clicked.connect(
self.handle_exposure_push_button_click
)

# Access Gain widgets
self.gain_line_edit = self.findChild(PyDMLineEdit, "GainLineEdit")
self.gain_checkbox = self.findChild(QCheckBox, "GainCheckBox")
self.gain_push_button = self.findChild(QPushButton, "GainPushButton")

# Connect Gain signals to slots
self.gain_checkbox.stateChanged.connect(self.handle_gain_checkbox_change)
self.gain_push_button.clicked.connect(self.handle_gain_push_button_click)

def customize_device(self):
device_name = name = self.macros()["AD"]
device = beamline.devices[device_name]
self.device = device
img_pv = device.pva.pv_name.get(as_string=True)
img_pv = device.pva._name #.get(as_string=True)
addr = f"pva://{img_pv}"
self.image_channel = pydm.PyDMChannel(
address=addr, value_slot=self.update_image
Expand All @@ -42,7 +68,8 @@ def customize_ui(self):
# Set some text about the camera
use_name = getattr(self.device, "description", None) in [self.device.name, None]
if use_name:
lbl_text = self.device.cam.name
print(f"Available attributes in self.device:{dir(self.device.driver)}")
lbl_text = self.device.driver.name
else:
lbl_text = f"{self.device.description} ({self.device.cam.prefix})"
self.ui.camera_description_label.setText(lbl_text)
Expand Down Expand Up @@ -74,6 +101,54 @@ def launch_caqtdm(self):
log.info(f"Launching caQtDM: {cmd}")
self._open_caqtdm_subprocess(cmd)

@pyqtSlot(int)
def handle_exposure_checkbox_change(self, state):
"""
Handle the exposure checkbox state change.
Disable the push button when the checkbox is checked.
"""
if state == 2: # Checked
self.exposure_push_button.setEnabled(False)
else: # Checkbox is unchecked
self.exposure_push_button.setEnabled(True)

@pyqtSlot()
def handle_exposure_push_button_click(self):
"""
Handle the exposure push button click.
Disable the checkbox when the button is clicked.
"""
self.exposure_checkbox.setChecked(False)

@pyqtSlot(int)
def handle_gain_checkbox_change(self, state):
"""
Handle the gain checkbox state change.
Disable the push button when the checkbox is checked.
"""
if state == 2: # Checked
self.gain_push_button.setEnabled(False)
else: # Checkbox is unchecked
self.gain_push_button.setEnabled(True)

@pyqtSlot()
def handle_gain_push_button_click(self):
"""
Handle the gain push button click.
Disable the checkbox when the button is clicked.
"""
self.gain_checkbox.setChecked(False)

@pyqtSlot(bool)
def update_widget_states(self, connected):
"""
Enable or disable widgets based on PV connection state
"""
self.exposure_push_button.setEnabled(not connected)
self.exposure_check_box.setEnabled(not connected)
self.gain_line_edit.setEnabled(not connected)
self.gain_push_button.setEnabled(not connected)
self.gain_check_box.setEnabled(not connected)

# -----------------------------------------------------------------------------
# :author: Mark Wolfman
Expand Down
Loading