This commit is contained in:
2022-07-18 09:11:46 +02:00
parent 079c9dbc4c
commit a4217ef1c8
3 changed files with 366 additions and 35 deletions

View File

@@ -77,7 +77,7 @@ TASK_HELICAL = "helical"
TASK_EMBL = "embl"
#import PrelocatedCoordinatesModel #ZAC: orig. code
import PrelocatedCoordinatesModel
#from EmblModule import EmblWidget #ZAC: orig. code
#from HelicalTable import HelicalTableWidget #ZAC: orig. code
#from Wigis import Spinner, Checkbox #ZAC: orig. code
@@ -105,12 +105,15 @@ from CustomROI import BeamMark
#from epics_widgets import zoom #ZAC: orig. code
from epics_widgets.MotorTweak import MotorTweak
from epics_widgets.SmaractMotorTweak import SmaractMotorTweak
from epics_widgets.SimMotorTweak import SimMotorTweak
from matplotlib import pyplot
import numpy as np
import pyqtgraph as pg
import pyqtgraph.exporters
pg.setConfigOption("antialias", True)
# use antialias for draw lines, interpret image data as row-major instead of col-major
pg.setConfigOptions(antialias=True,imageAxisOrder='row-major')
import app_utils
from app_config import settings, appsconf, option, toggle_option, simulated
@@ -222,6 +225,8 @@ class Main(QMainWindow, Ui_MainWindow):
super(Main, self).__init__()
self.setupUi(self)
app=QApplication.instance()
if os.getenv("DEVELOPMENT_VERSION"):
title = "[DEVELOPMENT] SwissMX - Solid support scanning for FEL sources"
else:
@@ -251,13 +256,13 @@ class Main(QMainWindow, Ui_MainWindow):
self.microscope_page.layout().addWidget(self.glw)
self.glw.show()
self.vb = self.glw.addViewBox(enableMenu=False)
self.vb = self.glw.addViewBox(invertY=True)#,enableMenu=False)
self.img = pg.ImageItem()
self.img._swissmx_name = "microscope_image_item"
# self.graphicsView.setCentralItem(self.vb)
self.glw.scene().sigMouseMoved.connect(self.mouse_move_event)
self.glw.scene().sigMouseClicked.connect(self.mouse_click_event)
self.vb.setAspectLocked()
self.vb.setAspectLocked(True)
self.vb.setBackgroundColor((120, 90, 90))
self.vb.addItem(self.img)
@@ -330,9 +335,9 @@ class Main(QMainWindow, Ui_MainWindow):
#self.create_helical_widgets() #ZAC: orig. code
self.center_piece_update(0) # start camera updater
#curzoom = qoptic_zoom.get_position(cached=False) #ZAC: orig. code
#_log.debug(f"starting app with zoom at {curzoom}")
#self.zoom_changed_cb(curzoom)
curzoom = app._zoom.get()
_log.debug(f"starting app with zoom at {curzoom}")
self.zoom_changed_cb(curzoom)
self._tabs_daq_methods.currentChanged.connect(self.switch_task)
self.switch_task()
@@ -806,7 +811,7 @@ class Main(QMainWindow, Ui_MainWindow):
exp_tab.layout().addStretch()
# DAQ Methods Tabs
#self.build_daq_methods_prelocated_tab() #ZAC: orig. code
self.build_daq_methods_prelocated_tab() #ZAC: orig. code
self.build_daq_methods_grid_tab()
self.build_sample_selection_tab()
@@ -1037,17 +1042,20 @@ class Main(QMainWindow, Ui_MainWindow):
self._lb_coords.setText("")
def mouse_move_event(self, pos):
app = QApplication.instance()
self._mouse_pos = pos
task = self.active_task()
xy = self.img.mapFromScene(pos)
z = qoptic_zoom.get_position()
z = app._zoom.get()
_log.debug('mouse_pos:{} scene_pos:{} zoom:{}'.format(pos,xy,z))
#TODO: implement mouse handling
# if self._ppm_toolbox._force_ppm > 0:
# ppm = self._ppm_toolbox._force_ppm
# else:
try:
ppm = self.ppm_fitter(z)
except:
ppm = 0 # do not move if we don't know ppm
ppm = 1
x, y = xy.x(), xy.y()
try:
bx, by = self.get_beam_mark_on_camera_xy()
@@ -1055,12 +1063,13 @@ class Main(QMainWindow, Ui_MainWindow):
bx, by = 500, 500
dx = (x - bx) / ppm
dy = -(y - by) / ppm
fx = self.tweakers["fast_x"].motor.get_position()
fy = self.tweakers["fast_y"].motor.get_position()
fx += dx
fy += dy
try:
fx = self.tweakers["fast_x"].motor.get_position()
fy = self.tweakers["fast_y"].motor.get_position()
fx += dx
fy += dy
except:
fx=fy=0
self._lb_coords.setText(
"\u23FA{:>}:{:>6.0f} {:<.0f}"
@@ -1073,10 +1082,11 @@ class Main(QMainWindow, Ui_MainWindow):
"PPM", ppm,
"Distance to beam", 1000 * dx, 1000 * dy,
"Stage", fx, fy,
)
)
)
def mouse_click_event(self, event):
app=QApplication.instance()
fx_motor, fy_motor, bx_motor, bz_motor, omega_motor = self.get_gonio_tweakers()
_log.debug("{}".format(event))
_log.debug(" pos {}".format(event.pos()))
@@ -1090,13 +1100,13 @@ class Main(QMainWindow, Ui_MainWindow):
event.ignore()
return
pos = event.scenePos()
zoom_level = qoptic_zoom.get_position()
zoom_level = app._zoom.get()
_log.debug(" zoom {}".format(zoom_level))
try:
ppm = self.ppm_fitter(zoom_level)
except:
ppm = 0 # do not move if we don't know ppm
ppm = 1 # 0: do not move if we don't know ppm
dblclick = event.double()
shft = Qt.ShiftModifier & event.modifiers()
ctrl = Qt.ControlModifier & event.modifiers()
@@ -1110,11 +1120,11 @@ class Main(QMainWindow, Ui_MainWindow):
pixel_dist = np.linalg.norm(a - b)
_log.debug("distance to beam: {:.1f} pixels".format(pixel_dist))
omega = omega_motor.motor.get_position()
omega = omega_motor.get_position()
_log.debug("omega at {:.03f} degrees".format(omega))
fx = fx_motor.motor.get_position()
fy = fy_motor.motor.get_position()
fx = fx_motor.get_position()
fy = fy_motor.get_position()
dx = (x - bx) / ppm
dy = -(y - by) / ppm
fx += dx
@@ -1210,7 +1220,8 @@ class Main(QMainWindow, Ui_MainWindow):
pass
def get_beam_mark_on_camera_xy(self):
z = qoptic_zoom.get_position()
app=QApplication.instance()
z = app._zoom.get()
try:
bx = self.beamx_fitter(z)
by = self.beamy_fitter(z)
@@ -1250,6 +1261,7 @@ class Main(QMainWindow, Ui_MainWindow):
self._escape_current_state = "ManualSampleExchange"
def escape_goToSampleAlignment(self):
app=QApplication.instance()
self._escape_current_state = "busy"
steps = [
@@ -1258,7 +1270,7 @@ class Main(QMainWindow, Ui_MainWindow):
]
if option(CRYOJET_MOTION_ENABLED):
steps.extend([lambda: self.move_cryojet_nozzle("in")])
steps.extend([lambda: self.move_post_tube("out"), lambda: backlight.move("in")])
steps.extend([lambda: self.move_post_tube("out"), lambda: app._backlight.move("in")])
self.escape_run_steps(steps, "Transitioning to Sample Alignment")
self._escape_current_state = "SampleAlignment"
@@ -1435,6 +1447,9 @@ class Main(QMainWindow, Ui_MainWindow):
dx = settings.value("collimator/dx", 1e10, type=float)
dy = settings.value("collimator/dy", 1e10, type=float)
_log.info('Skip Zac''s orig. code')
return
# ZAC: orig. code
if 1e9 < x_pos + y_pos + dx + dy:
raise IncompleteConfiguration("COLLIMATOR configuration is incomplete!")
@@ -1704,6 +1719,9 @@ class Main(QMainWindow, Ui_MainWindow):
)
def move_post_tube(self, dir):
_log.info('Skip Zac''s orig. code')
return
# ZAC: orig. code
try:
tandem_twv = float(self._post_tandem_tweak_val.text())
except:
@@ -1809,11 +1827,19 @@ class Main(QMainWindow, Ui_MainWindow):
dsy.move_relative(-tandem_twv)
def get_tweaker(self, pv, alias=None, label=None, mtype="epics_motor", layout=None, **kwargs):
app = QApplication.instance()
sim=app._args.sim
if mtype == "epics_motor":
m = MotorTweak()
if sim&0x10:
m=SimMotorTweak()
else:
m = MotorTweak()
else:
m = SmaractMotorTweak()
#m.connect_motor(pv, label, **kwargs) #ZAC: orig. code
if sim&0x20:
m=SimMotorTweak()
else:
m = SmaractMotorTweak()
m.connect_motor(pv, label, **kwargs)
self.tweakers[alias] = m
return m
@@ -1825,7 +1851,7 @@ class Main(QMainWindow, Ui_MainWindow):
else:
m = SmaractMotorTweak()
layout.addWidget(m)
#m.connect_motor(pv, label)#ZAC: orig. code
m.connect_motor(pv, label)
self.tweakers[alias] = m
def done_sliding(self):
@@ -3217,6 +3243,7 @@ def main():
# set app icon
app = QApplication(sys.argv)
app._args=args
if args.sim&0x01:
app._backlight = backlight.Backlight(None)
@@ -3232,7 +3259,7 @@ def main():
app._zoom = zoom.QopticZoom()
if args.sim&0x08:
app._camera = camera.epics_cam(None)
app._camera.sim_gen(mode=0)
app._camera.sim_gen(mode=1)
app._camera.run()
else:
app._camera = camera.epics_cam()