enhance calibration + minor fixes

This commit is contained in:
2022-09-14 09:36:20 +02:00
parent e215f3abea
commit 14260851cf
4 changed files with 233 additions and 185 deletions

View File

@@ -403,8 +403,8 @@ class WndSwissMx(QMainWindow, Ui_MainWindow):
self.vb.addItem(grp)
#--- beam marker ---
size_eu=cfg.value(AppCfg.GEO_BEAM_SZ)
pos_eu=cfg.value(AppCfg.GEO_BEAM_POS)
size_eu=cfg.value(AppCfg.GEO_BEAM_SZ)/1000 # convert from um to mm
pos_eu=cfg.value(AppCfg.GEO_BEAM_POS)/1000 # convert from um to mm
self._goBeamMarker=obj=UsrGO.Marker(pos_eu-size_eu/2,size_eu,mode=0)
obj.sigRegionChangeFinished.connect(self.cb_marker_moved)
#bm.setTransform(tr) # assign transform
@@ -639,7 +639,7 @@ class WndSwissMx(QMainWindow, Ui_MainWindow):
param=cam.get_param()
paramSv=cfg.value(AppCfg.GEO_CAM_PARAM)
if paramSv is None:
if not paramSv:
cfg.setValue(AppCfg.GEO_CAM_PARAM, param)
else:
for k,v in param.items():
@@ -747,15 +747,17 @@ class WndSwissMx(QMainWindow, Ui_MainWindow):
if obj==self._goOptCtr:
oc_pos=obj.pos()
oc_sz=obj.size()
geo._opt_ctr=opt_ctr=np.array(-oc_pos-oc_sz/2)
_log.debug(f'{obj}->{opt_ctr} !!! NOT SAVED IN CONFIG !!!')
#cfg.setValue(AppCfg.GEO_OPT_CTR,bm_pos)
geo._opt_ctr=opt_ctr=np.array(oc_pos+oc_sz/2)
if (QMessageBox.question(self, "save config", f"save optical center position {opt_ctr} permanently?",
QMessageBox.Yes|QMessageBox.No, QMessageBox.No, )==QMessageBox.Yes):
cfg.setValue(AppCfg.GEO_OPT_CTR,opt_ctr)
elif obj==self._goBeamMarker:
bm_pos=obj.pos()
bm_sz=obj.size()
obj._pos_eu=bm_pos=-geo.pix2pos(bm_pos+opt_ctr+bm_sz/2)
_log.debug(f'{obj}->{bm_pos} !!! NOT SAVED IN CONFIG !!!')
#cfg.setValue(AppCfg.GEO_BEAM_POS,bm_pos)
pos=np.array(bm_pos+bm_sz/2)*1000 # convert from mm to um
if (QMessageBox.question(self, "save config", f"save beam marker position {pos} permanently?",
QMessageBox.Yes|QMessageBox.No, QMessageBox.No, )==QMessageBox.Yes):
cfg.setValue(AppCfg.GEO_BEAM_POS,pos)
self.track_objects()
def cb_zoom_changed(self, value):
@@ -1022,6 +1024,7 @@ class WndSwissMx(QMainWindow, Ui_MainWindow):
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))
self._wd_calib_tree.setData(app._raw_pix2pos)
elif self._btn_opt_ctr.isChecked():
try:
raw=app._raw_opt_ctr[zoom]
@@ -1031,9 +1034,11 @@ class WndSwissMx(QMainWindow, Ui_MainWindow):
x=imgPos.x();y=imgPos.y()
_log.debug('append calib: zoom:{} cam_pix_x_y:{}/{}'.format(zoom, x, y))
raw.append(( x, y))
self._wd_calib_tree.setData(app._raw_opt_ctr)
else:
QMessageBox.warning(self, "calibration", "no calibration started yet.\nPress 'pix2pos' or 'opt_ctr' button first")
def cb_mouse_click(self, event):
#_log.debug("{}".format(event))
#_log.debug("screen pos {}".format(event.screenPos())) #pixel position on the whole screen
@@ -1298,17 +1303,39 @@ class WndSwissMx(QMainWindow, Ui_MainWindow):
def add_camera_trace(self):
# add up to tracelen image when moveing motors to new positions
tracelen=4
img=pg.ImageItem(self._goImg.image)
try:
tracelen=self._goTrace._tracelen
except AttributeError:
app=QApplication.instance()
cfg=app._cfg
tracelen=self._goTrace._tracelen=cfg.value(AppCfg.GBL_MISC)['img_trace_len']
if tracelen==0:
return
trImg=self._goImgGrp.transform()
trTrk=self._goTracked.transform()
tr=trImg*trTrk.inverted()[0] # TODO: check if oder correct !!!
img=pg.ImageItem(self._goImg.image)
img.setTransform(tr)
self._goTrace.addItem(img)
cld=self._goTrace.childItems()
if len(cld) > tracelen:
self.vb.removeItem(cld[0])
self._goTrace.addItem(img) # automatically added to self.vb
cldLst=self._goTrace.childItems()
if len(cldLst)>tracelen: #check if one image needs to be removed
r1=self.vb.itemBoundingRect(img)
for c in cldLst[:-1]:
#check overlap with newest image, and remove previous if it is more than 30%
r2=self.vb.itemBoundingRect(c)
r3=r1.intersected(r2)
s3=r3.size()
s1=r1.size()
if s3.width()/s1.width()>0.3 and s3.height()/s1.height()>0.3:
self.vb.removeItem(c)
return
self.vb.removeItem(cldLst[0]) #if no one was removes, remove oldest
def cb_modify_app_param(self):
wnd=WndParameter(self)
@@ -1601,6 +1628,8 @@ Author Thierry Zamofing (thierry.zamofing@psi.ch)
pass
def prepare_wd_tabs_left(self):
tabs = self._wd_tabs_left
tabs.currentChanged.connect(self.cb_switch_task)
@@ -1617,118 +1646,15 @@ Author Thierry Zamofing (thierry.zamofing@psi.ch)
setup_tab.layout().addWidget(tbox)
# Jungfrau parameters
block = QWidget()
block.setAccessibleName(TASK_JUNGFRAU_SETTINGS)
block.setContentsMargins(0, 0, 0, 0)
block.setLayout(QVBoxLayout())
#self.jungfrau = jungfrau_widget.JungfrauWidget() #ZAC: orig. code
#block.layout().addWidget(self.jungfrau) #ZAC: orig. code
block.layout().addStretch()
tbox.addItem(block, "Jungfrau Parameters")
# -------- DAQ Methods Tabs --------
self.build_tab_module_fix_target()
self._OLD_build_daq_methods_grid_tab()
self._OLD_build_daq_methods_prelocated_tab() #ZAC: orig. code
self._OLD_create_helical_widgets() #ZAC: orig. code
self._OLD_build_daq_methods_embl_tab()
#self._OLD_build_sample_selection_tab()
# # group beam box
# block = QWidget()
# block.setAccessibleName(TASK_SETUP_BEAM_CENTER)
# block.setContentsMargins(0, 0, 0, 0)
# block.setLayout(QVBoxLayout())
# grp = QWidget()
# block.layout().addWidget(grp)
# block.layout().addStretch()
# grp.setLayout(QGridLayout())
# tbox.addItem(block, "Beam Box")
# # setup_tab.layout().addWidget(grp)
#
# row = grp.layout().rowCount
#
# if self._pv_shutter is not None:
# but = QPushButton("open/close shutter")
# but.setCheckable(True)
# but.setChecked(1 == self._pv_shutter.get())
# but.clicked.connect(self.toggle_shutter)
# self._button_shutter = but
# grp.layout().addWidget(but, 0, 0, 1, 2)
# self._pv_shutter.add_callback(self.update_shutter_label)
# #else: #ZAC: orig. code
# # self._picker = bernina_pulse_picker.PickerWidget()
# # grp.layout().addWidget(self._picker, 0, 0, 1, 2)
# but = QPushButton("clear beam markers")
# but.clicked.connect(self.remove_beam_markers)
# grp.layout().addWidget(but, 1, 1)
# help = QTextBrowser()
# grp.layout().addWidget(help, 2, 0, 5, 2)
# help.setHtml(
# """<body>
# <h1>Updating Beam Mark</h1>
# <ol>
# <li>clear beam markers</li>
# <li>for each zoom level, CTRL-Click (left mouse button) the center of the beam</li>
# </ol>
# </body>
# """
# )
# # group regions
# block = QWidget()
# block.setAccessibleName(TASK_SETUP_ROI)
# block.setContentsMargins(0, 0, 0, 0)
# block.setLayout(QVBoxLayout())
# grp = QWidget()
# block.layout().addWidget(grp)
# block.layout().addStretch()
# grp.setLayout(QGridLayout())
# tbox.addItem(block, "Regions of Interest")
# but = QPushButton("add RECT roi")
# but.clicked.connect(self.roi_add_rect)
# grp.layout().addWidget(but, 0, 0)
# but = QPushButton("add LINE roi")
# but.clicked.connect(self.roi_add_line)
# grp.layout().addWidget(but, 0, 1)
#
# # group camera settings
# block = QWidget()
# block.setAccessibleName(TASK_SETUP_CAMERA)
# block.setContentsMargins(0, 0, 0, 0)
# block.setLayout(QVBoxLayout())
# grp = QWidget()
# block.layout().addWidget(grp)
# block.layout().addStretch()
# grp.setLayout(QGridLayout())
# tbox.addItem(block, "Camera Settings")
# but = QPushButton("remove transformations")
# but.clicked.connect(lambda bogus: self.modify_camera_transform("remove_all"))
# grp.layout().addWidget(but, 0, 0)
# but = QPushButton("remove last")
# but.clicked.connect(lambda bogus: self.modify_camera_transform("undo_last"))
# grp.layout().addWidget(but, 0, 1)
# but = QPushButton("Turn 90 CCW")
# #but.clicked.connect(
# # lambda bogus, n=camera.Transforms.ROTATE_90: self.modify_camera_transform(n)
# #) #ZAC: orig. code
# grp.layout().addWidget(but, 1, 0)
# but = QPushButton("Turn 90 CW")
# #but.clicked.connect(lambda bogus, n=camera.Transforms.ROTATE_270: self.modify_camera_transform(n)) #ZAC: orig. code
# grp.layout().addWidget(but)
# but = QPushButton("Turn 180 CCW")
# #but.clicked.connect(lambda bogus, n=camera.Transforms.ROTATE_180: self.modify_camera_transform(n)) #ZAC: orig. code
# grp.layout().addWidget(but)
# but = QPushButton("Transpose")
# #but.clicked.connect(lambda bogus, n=camera.Transforms.TRANSPOSE: self.modify_camera_transform(n)) #ZAC: orig. code
# grp.layout().addWidget(but)
# but = QPushButton("Flip L/R")
# #but.clicked.connect(lambda bogus, n=camera.Transforms.FLIP_LR: self.modify_camera_transform(n)) #ZAC: orig. code
# grp.layout().addWidget(but)
# but = QPushButton("Flip U/D")
# #but.clicked.connect(lambda bogus, n=camera.Transforms.FLIP_UD: self.modify_camera_transform(n)) #ZAC: orig. code
# grp.layout().addWidget(but)
# row = grp.layout().rowCount()
# self._label_transforms = QLabel()
# self._label_transforms.setWordWrap(True)
# self.modify_camera_transform(None)
#
# grp.layout().addWidget(self._label_transforms, row, 0, 1, 2)
# group geometry calibration
# -------- group geometry calibration --------
block = QWidget()
block.setAccessibleName(TASK_SETUP_GEOMETRY_CALIB)
block.setContentsMargins(0, 0, 0, 0)
@@ -1745,45 +1671,17 @@ Author Thierry Zamofing (thierry.zamofing@psi.ch)
#self._ppm_feature_size_spinbox.setDecimals(0)
#self._ppm_feature_size_spinbox.setSuffix(" µM")
#grp.layout().addWidget(self._ppm_feature_size_spinbox, 0, 1)
self._btn_pix2pos = but = QPushButton("pix2pos")
self._btn_pix2pos = but = QPushButton("Pixel to position calibration")
but.setCheckable(True)
but.clicked.connect(self.cb_update_pix2pos)
grp.layout().addWidget(but, 0, 0)
self._btn_opt_ctr = but = QPushButton("opt_ctr")
self._btn_opt_ctr = but = QPushButton("Optical center calibration")
but.setCheckable(True)
but.clicked.connect(self.cb_update_opt_ctr)
grp.layout().addWidget(but, 1, 0)
help = QTextBrowser()
grp.layout().addWidget(help, 2, 0)
help.setHtml(
"""<body>
<h2>Pixel to position calibration</h2>
<ol>
<li>press: <b>pix2pos</b></li>
<li>for each zoom level:
<li>choose a good fiducial mark
<li>move the stage x/y at min. 3 different locations
<li>Click (left mouse button) on the fiducial mark
<li>un-click: <b>pix2pos</b></li>
</ol>
<h2>optical center calibration</h2>
<ol>
<li>press: <b>opt_ctr</b></li>
<li>choose at least 3 fiducial mark visible at various zoom levels
<li>for at least two zoom level:
<li>Click (left mouse button) on the fiducial marks
<li>un-click: <b>opt_ctr</b></li>
</ol>
</body>
"""
)
# grp = PpmToolBox(viewbox=self.vb, camera=sample_camera, signals=self)
# grp.setAccessibleName(TASK_SETUP_PPM_CALIBRATION_TBOX)
# grp.pixelPerMillimeterCalibrationChanged.connect(self.update_ppm_fitters)
# tbox.addItem(grp, "PPM ToolBox")
# self._ppm_toolbox = grp
self._wd_calib_tree=tree=pg.DataTreeWidget(data=None)
grp.layout().addWidget(tree, 2, 0)
tbox.currentChanged.connect(self.cb_switch_task)
@@ -1791,13 +1689,116 @@ Author Thierry Zamofing (thierry.zamofing@psi.ch)
# setup_tab.layout().addStretch()
exp_tab.layout().addStretch()
# DAQ Methods Tabs
self.build_tab_module_fix_target()
self._OLD_build_daq_methods_grid_tab()
self._OLD_build_daq_methods_prelocated_tab() #ZAC: orig. code
self._OLD_create_helical_widgets() #ZAC: orig. code
self._OLD_build_daq_methods_embl_tab()
#self._OLD_build_sample_selection_tab()
# Jungfrau parameters
block=QWidget()
block.setAccessibleName(TASK_JUNGFRAU_SETTINGS)
block.setContentsMargins(0, 0, 0, 0)
block.setLayout(QVBoxLayout())
# self.jungfrau = jungfrau_widget.JungfrauWidget() #ZAC: orig. code
# block.layout().addWidget(self.jungfrau) #ZAC: orig. code
block.layout().addStretch()
tbox.addItem(block, "Jungfrau Parameters")
# # -------- group beam box --------
# block = QWidget()
# block.setAccessibleName(TASK_SETUP_BEAM_CENTER)
# block.setContentsMargins(0, 0, 0, 0)
# block.setLayout(QVBoxLayout())
# grp = QWidget()
# block.layout().addWidget(grp)
# block.layout().addStretch()
# grp.setLayout(QGridLayout())
# tbox.addItem(block, "Beam Box")
# # setup_tab.layout().addWidget(grp)
#
# row = grp.layout().rowCount
#
# if self._pv_shutter is not None:
# but = QPushButton("open/close shutter")
# but.setCheckable(True)
# but.setChecked(1 == self._pv_shutter.get())
# but.clicked.connect(self.toggle_shutter)
# self._button_shutter = but
# grp.layout().addWidget(but, 0, 0, 1, 2)
# self._pv_shutter.add_callback(self.update_shutter_label)
# #else: #ZAC: orig. code
# # self._picker = bernina_pulse_picker.PickerWidget()
# # grp.layout().addWidget(self._picker, 0, 0, 1, 2)
# but = QPushButton("clear beam markers")
# but.clicked.connect(self.remove_beam_markers)
# grp.layout().addWidget(but, 1, 1)
# help = QTextBrowser()
# grp.layout().addWidget(help, 2, 0, 5, 2)
# help.setHtml(
# """<body>
# <h1>Updating Beam Mark</h1>
# <ol>
# <li>clear beam markers</li>
# <li>for each zoom level, CTRL-Click (left mouse button) the center of the beam</li>
# </ol>
# </body>
# """
# )
# # -------- group regions --------
# block = QWidget()
# block.setAccessibleName(TASK_SETUP_ROI)
# block.setContentsMargins(0, 0, 0, 0)
# block.setLayout(QVBoxLayout())
# grp = QWidget()
# block.layout().addWidget(grp)
# block.layout().addStretch()
# grp.setLayout(QGridLayout())
# tbox.addItem(block, "Regions of Interest")
# but = QPushButton("add RECT roi")
# but.clicked.connect(self.roi_add_rect)
# grp.layout().addWidget(but, 0, 0)
# but = QPushButton("add LINE roi")
# but.clicked.connect(self.roi_add_line)
# grp.layout().addWidget(but, 0, 1)
#
# # -------- group camera settings --------
# block = QWidget()
# block.setAccessibleName(TASK_SETUP_CAMERA)
# block.setContentsMargins(0, 0, 0, 0)
# block.setLayout(QVBoxLayout())
# grp = QWidget()
# block.layout().addWidget(grp)
# block.layout().addStretch()
# grp.setLayout(QGridLayout())
# tbox.addItem(block, "Camera Settings")
# but = QPushButton("remove transformations")
# but.clicked.connect(lambda bogus: self.modify_camera_transform("remove_all"))
# grp.layout().addWidget(but, 0, 0)
# but = QPushButton("remove last")
# but.clicked.connect(lambda bogus: self.modify_camera_transform("undo_last"))
# grp.layout().addWidget(but, 0, 1)
# but = QPushButton("Turn 90 CCW")
# #but.clicked.connect(
# # lambda bogus, n=camera.Transforms.ROTATE_90: self.modify_camera_transform(n)
# #) #ZAC: orig. code
# grp.layout().addWidget(but, 1, 0)
# but = QPushButton("Turn 90 CW")
# #but.clicked.connect(lambda bogus, n=camera.Transforms.ROTATE_270: self.modify_camera_transform(n)) #ZAC: orig. code
# grp.layout().addWidget(but)
# but = QPushButton("Turn 180 CCW")
# #but.clicked.connect(lambda bogus, n=camera.Transforms.ROTATE_180: self.modify_camera_transform(n)) #ZAC: orig. code
# grp.layout().addWidget(but)
# but = QPushButton("Transpose")
# #but.clicked.connect(lambda bogus, n=camera.Transforms.TRANSPOSE: self.modify_camera_transform(n)) #ZAC: orig. code
# grp.layout().addWidget(but)
# but = QPushButton("Flip L/R")
# #but.clicked.connect(lambda bogus, n=camera.Transforms.FLIP_LR: self.modify_camera_transform(n)) #ZAC: orig. code
# grp.layout().addWidget(but)
# but = QPushButton("Flip U/D")
# #but.clicked.connect(lambda bogus, n=camera.Transforms.FLIP_UD: self.modify_camera_transform(n)) #ZAC: orig. code
# grp.layout().addWidget(but)
# row = grp.layout().rowCount()
# self._label_transforms = QLabel()
# self._label_transforms.setWordWrap(True)
# self.modify_camera_transform(None)
#
# grp.layout().addWidget(self._label_transforms, row, 0, 1, 2)
def build_tab_module_fix_target(self):
#tab = self._tab_daq_method_prelocated
@@ -1856,6 +1857,13 @@ Author Thierry Zamofing (thierry.zamofing@psi.ch)
app=QApplication.instance()
if calib:
_log.info("received new pix2pos calibration")
QMessageBox.information(self,'Pixel to position calibration','''\
- for each zoom level:
- choose a good fiducial mark
- move the stage x/y at min. 3 different locations
- click (left mouse button) on that fiducial mark
- un-click button "Pixel to position calibration"
''')
app._raw_pix2pos=dict()
else:
s=str(app._raw_pix2pos).replace('),','),\n ').replace('],','],\n')
@@ -1870,21 +1878,38 @@ Author Thierry Zamofing (thierry.zamofing@psi.ch)
def cb_update_opt_ctr(self, calib):
app=QApplication.instance()
if calib:
_log.info("received new pix2pos calibration")
_log.info("received new opt_ctr calibration")
QMessageBox.information(self,'Optical center calibration','''\
- choose the biggest zoom level to start
- choose at least 3 fiducial marks
- for at least two zoom level:
- Click (left mouse button) on the fiducial marks (always in the same order)
- un-click button "Optical center calibration"
''')
app._raw_opt_ctr=dict()
else:
s=str(app._raw_opt_ctr).replace('),','),\n ').replace('],','],\n')
print(s)
res=QMessageBox.question(self, "calibration", f"use calibration\n{s} ? ")
if res==QMessageBox.Yes:
geo=app._geometry
geo.update_optical_center(app._raw_opt_ctr)
app._cfg.setValue(AppCfg.GEO_OPT_CTR, geo._opt_ctr)
go=self._goOptCtr
oc_sz=go.size()
go.setPos(-geo._opt_ctr-oc_sz/2)
geo=app._geometry
ocOld=geo._opt_ctr
try:
geo.update_optical_center(app._raw_opt_ctr,True)
except BaseException as e:
_log.warning(e)
QMessageBox.warning(self, "calibration", f"rejected\n{e}")
del app._raw_opt_ctr
return
del app._raw_opt_ctr
return
go=self._goOptCtr
oc_sz=go.size()
go.blockSignals(True) # avoid to call cb_marker_moved
go.setPos(geo._opt_ctr-oc_sz/2)
res=QMessageBox.question(self, "calibration", f"keep new optical center\n{geo._opt_ctr} ? ")
if res==QMessageBox.Yes:
app._cfg.setValue(AppCfg.GEO_OPT_CTR, geo._opt_ctr)
else:
geo._opt_ctr=ocOld
go.setPos(geo._opt_ctr-oc_sz/2)
go.blockSignals(False) # allow to call cb_marker_moved
def module_fix_target_add_obj(self,*args,**kwargs):
mft=self._moduleFixTarget