towards new pix2pos calibration part 1
This commit is contained in:
98
swissmx.py
98
swissmx.py
@@ -97,7 +97,7 @@ from PyQt5.QtWidgets import (
|
||||
QSplashScreen, QTextBrowser, QToolBox, QVBoxLayout, QWidget,)
|
||||
from PyQt5.uic import loadUiType
|
||||
|
||||
from CustomROI import BeamMark
|
||||
import CustomROI as CstROI
|
||||
#from CustomROI import BeamMark, Grid, CrystalCircle #ZAC: orig. code
|
||||
#from GenericDialog import GenericDialog #ZAC: orig. code
|
||||
#from dialogs.PreferencesDialog import PreferencesDialog #ZAC: orig. code
|
||||
@@ -119,7 +119,7 @@ from app_config import settings, appsconf, option, toggle_option, simulated
|
||||
|
||||
import epics
|
||||
from epics.ca import pend_event
|
||||
import camera,backlight,zoom,illumination
|
||||
import camera,backlight,zoom,illumination,geometry
|
||||
|
||||
|
||||
#_URL = "http://PC12288:8080"
|
||||
@@ -388,7 +388,7 @@ class Main(QMainWindow, Ui_MainWindow):
|
||||
|
||||
def add_beam_marker(self):
|
||||
w, h = settings.value(BEAM_SIZE)
|
||||
self._beammark = BeamMark([100, 100], (int(w), int(h)), parent=self)
|
||||
self._beammark = CstROI.BeamMark([100, 100], (int(w), int(h)), parent=self)
|
||||
self.vb.addItem(self._beammark)
|
||||
|
||||
def camera_pause_toggle(self):
|
||||
@@ -416,7 +416,7 @@ class Main(QMainWindow, Ui_MainWindow):
|
||||
else:
|
||||
sz=self.update_size()
|
||||
pic=kwargs['value'].reshape(sz[::-1])
|
||||
_log.debug('new_frame_pv_cb count {}'.format(kwargs['count']))
|
||||
#_log.debug('new_frame_pv_cb count {}'.format(kwargs['count']))
|
||||
if pic.dtype==np.int16:
|
||||
pic.dtype=np.uint16
|
||||
camera.epics_cam.set_fiducial(pic, 255)
|
||||
@@ -798,7 +798,8 @@ class Main(QMainWindow, Ui_MainWindow):
|
||||
grp.layout().addWidget(self._ppm_feature_size_spinbox, 0, 1)
|
||||
self._ppm_calibration = but = QPushButton("Start calibration")
|
||||
but.setCheckable(True)
|
||||
but.clicked.connect(lambda x: self.update_ppm_fitters())
|
||||
#but.clicked.connect(lambda x: self.update_ppm_fitters())
|
||||
but.clicked.connect(self.update_ppm_fitters)
|
||||
grp.layout().addWidget(but, 1, 0, 1, 2)
|
||||
help = QTextBrowser()
|
||||
grp.layout().addWidget(help, 2, 0, 5, 2)
|
||||
@@ -806,9 +807,11 @@ class Main(QMainWindow, Ui_MainWindow):
|
||||
"""<body>
|
||||
<h1>Pixel/MM Setup</h1>
|
||||
<ol>
|
||||
<li>choose: <b>feature size</b></li>
|
||||
<li>press: <b>Start calibration</b></li>
|
||||
<li>for each zoom level, CTRL-Click (left mouse button) <b>2</b> locations which are <b>feature-size</b> apart</li>
|
||||
<li>for each zoom level:
|
||||
<li>choose a good fiducial mark
|
||||
<li>move the stage x/y at min. 3 different locations
|
||||
<li>CTRL-Click (left mouse button) on the fiducial mark
|
||||
<li>un-click: <b>Start calibration</b></li>
|
||||
</ol>
|
||||
</body>
|
||||
@@ -960,7 +963,18 @@ class Main(QMainWindow, Ui_MainWindow):
|
||||
self.beamx_fitter = np.poly1d(bx_coefs)
|
||||
self.beamy_fitter = np.poly1d(by_coefs)
|
||||
|
||||
def update_ppm_fitters(self, calib=None):
|
||||
def update_ppm_fitters(self, calib):
|
||||
app=QApplication.instance()
|
||||
if calib:
|
||||
_log.info("received new pix2pos calibration")
|
||||
app._ppmRaw=dict()
|
||||
else:
|
||||
app._geometry.update_pix2pos(app._ppmRaw)
|
||||
del app._ppmRaw
|
||||
return
|
||||
|
||||
|
||||
|
||||
if calib is not None:
|
||||
_log.info("received new calibration for PPM")
|
||||
self._zoom_to_ppm = calib
|
||||
@@ -1010,17 +1024,17 @@ class Main(QMainWindow, Ui_MainWindow):
|
||||
self.pixelsPerMillimeter.emit(ppm)
|
||||
self.update_beam_marker(value)
|
||||
|
||||
def getZoom(self):
|
||||
return qoptic_zoom.get_position()
|
||||
# def getZoom(self):
|
||||
# return qoptic_zoom.get_position()
|
||||
|
||||
def getPpm(self):
|
||||
ppm_fitter = None
|
||||
try:
|
||||
ppm_fitter = self.ppm_fitter(self.getZoom())
|
||||
except Exception as e:
|
||||
_log.error("garbage in getPpm()")
|
||||
traceback.print_exc()
|
||||
return ppm_fitter
|
||||
# def getPpm(self):
|
||||
# ppm_fitter = None
|
||||
# try:
|
||||
# ppm_fitter = self.ppm_fitter(self.getZoom())
|
||||
# except Exception as e:
|
||||
# _log.error("garbage in getPpm()")
|
||||
# traceback.print_exc()
|
||||
# return ppm_fitter
|
||||
|
||||
def append_to_beam_markers(self, x, y, zoom):
|
||||
self._beam_markers[zoom] = (x, y)
|
||||
@@ -1073,7 +1087,7 @@ class Main(QMainWindow, Ui_MainWindow):
|
||||
try:
|
||||
ppm = self.ppm_fitter(z)
|
||||
except:
|
||||
ppm = 1
|
||||
ppm = 1E3
|
||||
x, y = xy.x(), xy.y()
|
||||
try:
|
||||
bx, by = self.get_beam_mark_on_camera_xy()
|
||||
@@ -1103,15 +1117,48 @@ class Main(QMainWindow, Ui_MainWindow):
|
||||
)
|
||||
)
|
||||
|
||||
def mouse_click_event(self, event):
|
||||
def mouse_click_event_ppm(self, event):
|
||||
app=QApplication.instance()
|
||||
fx_motor, fy_motor, bx_motor, bz_motor, omega_motor = self.get_gonio_tweakers()
|
||||
zoom = app._zoom.get()
|
||||
fast_x=self.tweakers["fast_x"];fast_y=self.tweakers["fast_y"]
|
||||
try:
|
||||
raw=app._ppmRaw[zoom]
|
||||
except (AttributeError,KeyError) as e:
|
||||
if type(e) is AttributeError:
|
||||
_log.info("")
|
||||
msg="SwissMX *POST-SAMPLE-TUBE* configuration is incomplete!!!"
|
||||
QMessageBox.warning(self, "pix2pos calibration", "Press 'Start calibration' button first")
|
||||
return
|
||||
app._ppmRaw=dict()
|
||||
raw=app._ppmRaw[zoom]=list()
|
||||
#event.screenPos() #position in pixel on the screen
|
||||
#event.pos() #position in pixel on the widget
|
||||
#event.scenePos() # position in user coordinates of the widget
|
||||
#img.mapFromScene(scenePos) #pixel position of the image at scenePos user coordinates
|
||||
#mousePos=event.pos() #position in pixel on the widget
|
||||
#scenePos=event.scenePos()
|
||||
#imgPos = self.img.mapFromScene(scenePos)
|
||||
#_log.debug('mouse_pos:{} scene_pos:{} imgPos:{}'.format(tuple(mousePos),tuple(scenePos),(imgPos.x(),imgPos.y())))
|
||||
#_log.debug('fast stage:{} {}'.format(fast_x.get_position(),fast_y.get_position()))
|
||||
imgPos = self.img.mapFromScene(event.scenePos())
|
||||
fx=fast_x.get_position();fy=fast_y.get_position()
|
||||
x=imgPos.x();y=imgPos.y()
|
||||
_log.debug('append calib: zoom:{} stage_x_y:{}/{} cam_pix_x_y:{}/{}'.format(zoom,fx,fy,x,y))
|
||||
raw.append((fx,fy,x,y))
|
||||
|
||||
def mouse_click_event(self, event):
|
||||
_log.debug("{}".format(event))
|
||||
_log.debug(" pos {}".format(event.pos()))
|
||||
_log.debug("screen pos {}".format(event.screenPos()))
|
||||
_log.debug("scene pos {}".format(event.scenePos()))
|
||||
|
||||
task = self.active_task()
|
||||
if task==TASK_SETUP_PPM_CALIBRATION:
|
||||
self.mouse_click_event_ppm(event)
|
||||
return
|
||||
|
||||
app=QApplication.instance()
|
||||
fx_motor, fy_motor, bx_motor, bz_motor, omega_motor = self.get_gonio_tweakers()
|
||||
|
||||
if event.button() == Qt.RightButton:
|
||||
print_transform(self.vb.childTransform())
|
||||
@@ -1124,7 +1171,7 @@ class Main(QMainWindow, Ui_MainWindow):
|
||||
try:
|
||||
ppm = self.ppm_fitter(zoom_level)
|
||||
except:
|
||||
ppm = 1 # 0: do not move if we don't know ppm
|
||||
ppm = 1E3
|
||||
dblclick = event.double()
|
||||
shft = Qt.ShiftModifier & event.modifiers()
|
||||
ctrl = Qt.ControlModifier & event.modifiers()
|
||||
@@ -1925,7 +1972,7 @@ class Main(QMainWindow, Ui_MainWindow):
|
||||
ystep = self._sb_grid_y_step.value()
|
||||
xoffset = self._sb_grid_x_offset.value()
|
||||
yoffset = self._sb_grid_y_offset.value()
|
||||
grid = Grid( x_step=xstep, y_step=ystep, x_offset=xoffset, y_offset=yoffset, gonio_xy=(gx, gy), grid_index=grid_index, parent=self,)
|
||||
grid = CstROI.Grid( x_step=xstep, y_step=ystep, x_offset=xoffset, y_offset=yoffset, gonio_xy=(gx, gy), grid_index=grid_index, parent=self,)
|
||||
self._grids.append(grid)
|
||||
grid.calculate_gonio_xy()
|
||||
grid.sigRemoveRequested.connect(lambda g=grid: self.remove_grid(g))
|
||||
@@ -2754,7 +2801,7 @@ class Main(QMainWindow, Ui_MainWindow):
|
||||
if not (add_xtals and draw_xtals):
|
||||
continue
|
||||
_log.debug(f"adding {'fiducial' if is_fiducial else 'xtal'} mark #{n}: {is_fiducial} {gx:.3f}, {gy:.3f}, {cx:.1f}, {cy:.1f}")
|
||||
m = CrystalCircle(
|
||||
m = CstROI.CrystalCircle(
|
||||
gonio_xy=(gx, gy),
|
||||
parent=self,
|
||||
model_row_index=n,
|
||||
@@ -3277,6 +3324,9 @@ def main():
|
||||
else:
|
||||
app._camera = camera.epics_cam()
|
||||
#app._camera.run() is called in center_piece_update
|
||||
app._geometry=geometry.geometry()
|
||||
|
||||
|
||||
|
||||
app_icon = QtGui.QIcon()
|
||||
app_icon.addFile("artwork/logo/16x16.png", QtCore.QSize(16, 16))
|
||||
|
||||
Reference in New Issue
Block a user