enhance calibration + minor fixes
This commit is contained in:
@@ -83,10 +83,10 @@ DST=/sf/cristallina/applications/mx/zamofing_t/
|
|||||||
# /sf/cristallina/applications/mx
|
# /sf/cristallina/applications/mx
|
||||||
|
|
||||||
ssh saresc-cons-02 mkdir /tmp/zamofing_t/
|
ssh saresc-cons-02 mkdir /tmp/zamofing_t/
|
||||||
rsync -vai ~/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX saresc-cons-03:$DST
|
rsync -vai --delete ~/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX saresc-cons-03:$DST
|
||||||
rsync -vai ~/Documents/prj/SwissFEL/PBTools saresc-cons-03:$DST
|
rsync -vai --delete ~/Documents/prj/SwissFEL/PBTools saresc-cons-03:$DST
|
||||||
|
|
||||||
cd /tmp/zamofing_t/ESB_MX/python/SwissMX/
|
cd /sf/cristallina/applications/mx/zamofing_t/ESB_MX/python/SwissMX/
|
||||||
/opt/gfa/python-3.7/latest/bin/python swissmx.py
|
/opt/gfa/python-3.7/latest/bin/python swissmx.py
|
||||||
|
|
||||||
/opt/gfa/python-3.8/latest/bin/pip install qtawesome --user
|
/opt/gfa/python-3.8/latest/bin/pip install qtawesome --user
|
||||||
|
|||||||
@@ -187,11 +187,11 @@ class AppCfg(QSettings):
|
|||||||
if key==AppCfg.DT_MISC:
|
if key==AppCfg.DT_MISC:
|
||||||
val={'show_plots': True, 'vel_scl': 1.0, 'pt2pt_time': 10.0,'sync_mode':1,'sync_flag':3,'verbose':0xff}
|
val={'show_plots': True, 'vel_scl': 1.0, 'pt2pt_time': 10.0,'sync_mode':1,'sync_flag':3,'verbose':0xff}
|
||||||
elif key==AppCfg.GBL_MISC:
|
elif key==AppCfg.GBL_MISC:
|
||||||
val={'img_trace':4}
|
val={'img_trace_len':4}
|
||||||
else:
|
else:
|
||||||
val={}
|
val={}
|
||||||
elif key in (AppCfg.GEO_BEAM_SZ,AppCfg.GEO_BEAM_POS,):
|
elif key in (AppCfg.GEO_BEAM_SZ,AppCfg.GEO_BEAM_POS,):
|
||||||
val=np.array(tuple(map(float, val)))/1000
|
val=np.array(tuple(map(float, val)))
|
||||||
elif key in (AppCfg.GEO_OPT_CTR):
|
elif key in (AppCfg.GEO_OPT_CTR):
|
||||||
val=np.array(tuple(map(float, val)))
|
val=np.array(tuple(map(float, val)))
|
||||||
return val
|
return val
|
||||||
@@ -227,7 +227,7 @@ class WndParameter(QMainWindow):
|
|||||||
#GEO_CAM_PARAM
|
#GEO_CAM_PARAM
|
||||||
gbl_misc = cfg.value(AppCfg.GBL_MISC)
|
gbl_misc = cfg.value(AppCfg.GBL_MISC)
|
||||||
gbl_dev_prefix = cfg.value(AppCfg.GBL_DEV_PREFIX)
|
gbl_dev_prefix = cfg.value(AppCfg.GBL_DEV_PREFIX)
|
||||||
geo_beam_sz = cfg.value(AppCfg.GEO_BEAM_SZ)*1000
|
geo_beam_sz = cfg.value(AppCfg.GEO_BEAM_SZ)
|
||||||
dft_pos_pst = cfg.value(AppCfg.DFT_POS_PST)
|
dft_pos_pst = cfg.value(AppCfg.DFT_POS_PST)
|
||||||
dft_pos_col = cfg.value(AppCfg.DFT_POS_COL)
|
dft_pos_col = cfg.value(AppCfg.DFT_POS_COL)
|
||||||
dft_pos_bklgt = cfg.value(AppCfg.DFT_POS_BKLGT)
|
dft_pos_bklgt = cfg.value(AppCfg.DFT_POS_BKLGT)
|
||||||
@@ -276,7 +276,7 @@ verbose bits:
|
|||||||
{'name':'smaract motors', 'value':gbl_dev_prefix[1], 'type':'str'},
|
{'name':'smaract motors', 'value':gbl_dev_prefix[1], 'type':'str'},
|
||||||
]},
|
]},
|
||||||
{'name':AppCfg.GBL_MISC, 'title':'miscellaneous', 'type':'group', 'children':[
|
{'name':AppCfg.GBL_MISC, 'title':'miscellaneous', 'type':'group', 'children':[
|
||||||
{'name':'img_trace', 'value':gbl_misc['img_trace'], 'type':'int', 'tip':tip_sync_flag},
|
{'name':'img_trace_len', 'value':gbl_misc['img_trace_len'], 'type':'int', 'tip':tip_sync_flag},
|
||||||
#{'name':'verbose', 'value':gbl_misc['verbose'], 'type':'int', 'tip':tip_verbose},
|
#{'name':'verbose', 'value':gbl_misc['verbose'], 'type':'int', 'tip':tip_verbose},
|
||||||
]},
|
]},
|
||||||
# {'name':AppCfg.GEO_CAM_TRF, 'value':cfg.value(AppCfg.GEO_CAM_TRF), 'type':'str'},
|
# {'name':AppCfg.GEO_CAM_TRF, 'value':cfg.value(AppCfg.GEO_CAM_TRF), 'type':'str'},
|
||||||
@@ -394,7 +394,10 @@ verbose bits:
|
|||||||
except AttributeError as e:
|
except AttributeError as e:
|
||||||
_log.warning('can not set beam size to application window')
|
_log.warning('can not set beam size to application window')
|
||||||
else:
|
else:
|
||||||
|
v=v/1000 # convert from um to mm
|
||||||
|
bm.blockSignals(True) # avoid to call cb_marker_moved
|
||||||
bm.setSize(v)
|
bm.setSize(v)
|
||||||
|
bm.blockSignals(False)
|
||||||
elif par_nm==AppCfg.GEO_CAM_PARAM:
|
elif par_nm==AppCfg.GEO_CAM_PARAM:
|
||||||
d=dict(map(lambda x:(x.name(),x.value()), parent.children()))
|
d=dict(map(lambda x:(x.name(),x.value()), parent.children()))
|
||||||
try:
|
try:
|
||||||
@@ -441,6 +444,18 @@ verbose bits:
|
|||||||
elif par_nm in (AppCfg.GBL_MISC,AppCfg.DT_MISC):
|
elif par_nm in (AppCfg.GBL_MISC,AppCfg.DT_MISC):
|
||||||
d=dict(map(lambda x:(x.name(),x.value()), parent.children()))
|
d=dict(map(lambda x:(x.name(),x.value()), parent.children()))
|
||||||
cfg.setValue(par_nm, d)
|
cfg.setValue(par_nm, d)
|
||||||
|
if par_nm in (AppCfg.GBL_MISC):
|
||||||
|
try:
|
||||||
|
grp=self.parent()._goTrace
|
||||||
|
vb=self.parent().vb
|
||||||
|
except AttributeError as e:
|
||||||
|
_log.warning('can not access the application window')
|
||||||
|
else:
|
||||||
|
grp._tracelen=tl=d['img_trace_len']
|
||||||
|
cld=grp.childItems()
|
||||||
|
while len(cld)>tl:
|
||||||
|
vb.removeItem(cld[0])
|
||||||
|
cld=grp.childItems()
|
||||||
else:
|
else:
|
||||||
_log.warning(f'can\'t save parameter:{childName} change:{change} data:{str(data)}')
|
_log.warning(f'can\'t save parameter:{childName} change:{change} data:{str(data)}')
|
||||||
raise
|
raise
|
||||||
|
|||||||
@@ -130,6 +130,14 @@ class SmaractMotorTweak(QWidget, Ui_MotorTweak):
|
|||||||
def get_rbv(self):
|
def get_rbv(self):
|
||||||
return self._pv_readback.get(use_monitor=False)
|
return self._pv_readback.get(use_monitor=False)
|
||||||
|
|
||||||
|
def get_val(self):
|
||||||
|
# return self._motor.get('VAL')
|
||||||
|
try:
|
||||||
|
v=self._val
|
||||||
|
except AttributeError:
|
||||||
|
self._val=v=self._pv_drive.get()
|
||||||
|
return v
|
||||||
|
|
||||||
def is_homed(self):
|
def is_homed(self):
|
||||||
pend_event()
|
pend_event()
|
||||||
return 1 == self._pv_is_homed.get(use_monitor=False)
|
return 1 == self._pv_is_homed.get(use_monitor=False)
|
||||||
|
|||||||
231
swissmx.py
231
swissmx.py
@@ -403,8 +403,8 @@ class WndSwissMx(QMainWindow, Ui_MainWindow):
|
|||||||
self.vb.addItem(grp)
|
self.vb.addItem(grp)
|
||||||
|
|
||||||
#--- beam marker ---
|
#--- beam marker ---
|
||||||
size_eu=cfg.value(AppCfg.GEO_BEAM_SZ)
|
size_eu=cfg.value(AppCfg.GEO_BEAM_SZ)/1000 # convert from um to mm
|
||||||
pos_eu=cfg.value(AppCfg.GEO_BEAM_POS)
|
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)
|
self._goBeamMarker=obj=UsrGO.Marker(pos_eu-size_eu/2,size_eu,mode=0)
|
||||||
obj.sigRegionChangeFinished.connect(self.cb_marker_moved)
|
obj.sigRegionChangeFinished.connect(self.cb_marker_moved)
|
||||||
#bm.setTransform(tr) # assign transform
|
#bm.setTransform(tr) # assign transform
|
||||||
@@ -639,7 +639,7 @@ class WndSwissMx(QMainWindow, Ui_MainWindow):
|
|||||||
param=cam.get_param()
|
param=cam.get_param()
|
||||||
|
|
||||||
paramSv=cfg.value(AppCfg.GEO_CAM_PARAM)
|
paramSv=cfg.value(AppCfg.GEO_CAM_PARAM)
|
||||||
if paramSv is None:
|
if not paramSv:
|
||||||
cfg.setValue(AppCfg.GEO_CAM_PARAM, param)
|
cfg.setValue(AppCfg.GEO_CAM_PARAM, param)
|
||||||
else:
|
else:
|
||||||
for k,v in param.items():
|
for k,v in param.items():
|
||||||
@@ -747,15 +747,17 @@ class WndSwissMx(QMainWindow, Ui_MainWindow):
|
|||||||
if obj==self._goOptCtr:
|
if obj==self._goOptCtr:
|
||||||
oc_pos=obj.pos()
|
oc_pos=obj.pos()
|
||||||
oc_sz=obj.size()
|
oc_sz=obj.size()
|
||||||
geo._opt_ctr=opt_ctr=np.array(-oc_pos-oc_sz/2)
|
geo._opt_ctr=opt_ctr=np.array(oc_pos+oc_sz/2)
|
||||||
_log.debug(f'{obj}->{opt_ctr} !!! NOT SAVED IN CONFIG !!!')
|
if (QMessageBox.question(self, "save config", f"save optical center position {opt_ctr} permanently?",
|
||||||
#cfg.setValue(AppCfg.GEO_OPT_CTR,bm_pos)
|
QMessageBox.Yes|QMessageBox.No, QMessageBox.No, )==QMessageBox.Yes):
|
||||||
|
cfg.setValue(AppCfg.GEO_OPT_CTR,opt_ctr)
|
||||||
elif obj==self._goBeamMarker:
|
elif obj==self._goBeamMarker:
|
||||||
bm_pos=obj.pos()
|
bm_pos=obj.pos()
|
||||||
bm_sz=obj.size()
|
bm_sz=obj.size()
|
||||||
obj._pos_eu=bm_pos=-geo.pix2pos(bm_pos+opt_ctr+bm_sz/2)
|
pos=np.array(bm_pos+bm_sz/2)*1000 # convert from mm to um
|
||||||
_log.debug(f'{obj}->{bm_pos} !!! NOT SAVED IN CONFIG !!!')
|
if (QMessageBox.question(self, "save config", f"save beam marker position {pos} permanently?",
|
||||||
#cfg.setValue(AppCfg.GEO_BEAM_POS,bm_pos)
|
QMessageBox.Yes|QMessageBox.No, QMessageBox.No, )==QMessageBox.Yes):
|
||||||
|
cfg.setValue(AppCfg.GEO_BEAM_POS,pos)
|
||||||
self.track_objects()
|
self.track_objects()
|
||||||
|
|
||||||
def cb_zoom_changed(self, value):
|
def cb_zoom_changed(self, value):
|
||||||
@@ -1022,6 +1024,7 @@ class WndSwissMx(QMainWindow, Ui_MainWindow):
|
|||||||
x=imgPos.x();y=imgPos.y()
|
x=imgPos.x();y=imgPos.y()
|
||||||
_log.debug('append calib: zoom:{} stage_x_y:{}/{} cam_pix_x_y:{}/{}'.format(zoom, fx, fy, x, 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))
|
raw.append((fx, fy, x, y))
|
||||||
|
self._wd_calib_tree.setData(app._raw_pix2pos)
|
||||||
elif self._btn_opt_ctr.isChecked():
|
elif self._btn_opt_ctr.isChecked():
|
||||||
try:
|
try:
|
||||||
raw=app._raw_opt_ctr[zoom]
|
raw=app._raw_opt_ctr[zoom]
|
||||||
@@ -1031,9 +1034,11 @@ class WndSwissMx(QMainWindow, Ui_MainWindow):
|
|||||||
x=imgPos.x();y=imgPos.y()
|
x=imgPos.x();y=imgPos.y()
|
||||||
_log.debug('append calib: zoom:{} cam_pix_x_y:{}/{}'.format(zoom, x, y))
|
_log.debug('append calib: zoom:{} cam_pix_x_y:{}/{}'.format(zoom, x, y))
|
||||||
raw.append(( x, y))
|
raw.append(( x, y))
|
||||||
|
self._wd_calib_tree.setData(app._raw_opt_ctr)
|
||||||
else:
|
else:
|
||||||
QMessageBox.warning(self, "calibration", "no calibration started yet.\nPress 'pix2pos' or 'opt_ctr' button first")
|
QMessageBox.warning(self, "calibration", "no calibration started yet.\nPress 'pix2pos' or 'opt_ctr' button first")
|
||||||
|
|
||||||
|
|
||||||
def cb_mouse_click(self, event):
|
def cb_mouse_click(self, event):
|
||||||
#_log.debug("{}".format(event))
|
#_log.debug("{}".format(event))
|
||||||
#_log.debug("screen pos {}".format(event.screenPos())) #pixel position on the whole screen
|
#_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):
|
def add_camera_trace(self):
|
||||||
# add up to tracelen image when moveing motors to new positions
|
# add up to tracelen image when moveing motors to new positions
|
||||||
tracelen=4
|
try:
|
||||||
img=pg.ImageItem(self._goImg.image)
|
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()
|
trImg=self._goImgGrp.transform()
|
||||||
trTrk=self._goTracked.transform()
|
trTrk=self._goTracked.transform()
|
||||||
|
|
||||||
tr=trImg*trTrk.inverted()[0] # TODO: check if oder correct !!!
|
tr=trImg*trTrk.inverted()[0] # TODO: check if oder correct !!!
|
||||||
|
img=pg.ImageItem(self._goImg.image)
|
||||||
img.setTransform(tr)
|
img.setTransform(tr)
|
||||||
self._goTrace.addItem(img)
|
self._goTrace.addItem(img) # automatically added to self.vb
|
||||||
cld=self._goTrace.childItems()
|
|
||||||
if len(cld) > tracelen:
|
|
||||||
self.vb.removeItem(cld[0])
|
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):
|
def cb_modify_app_param(self):
|
||||||
wnd=WndParameter(self)
|
wnd=WndParameter(self)
|
||||||
@@ -1601,6 +1628,8 @@ Author Thierry Zamofing (thierry.zamofing@psi.ch)
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
def prepare_wd_tabs_left(self):
|
def prepare_wd_tabs_left(self):
|
||||||
|
|
||||||
|
|
||||||
tabs = self._wd_tabs_left
|
tabs = self._wd_tabs_left
|
||||||
tabs.currentChanged.connect(self.cb_switch_task)
|
tabs.currentChanged.connect(self.cb_switch_task)
|
||||||
|
|
||||||
@@ -1617,17 +1646,60 @@ Author Thierry Zamofing (thierry.zamofing@psi.ch)
|
|||||||
|
|
||||||
setup_tab.layout().addWidget(tbox)
|
setup_tab.layout().addWidget(tbox)
|
||||||
|
|
||||||
# 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 geometry calibration --------
|
||||||
block = QWidget()
|
block = QWidget()
|
||||||
|
block.setAccessibleName(TASK_SETUP_GEOMETRY_CALIB)
|
||||||
|
block.setContentsMargins(0, 0, 0, 0)
|
||||||
|
block.setLayout(QVBoxLayout())
|
||||||
|
grp = QWidget()
|
||||||
|
block.layout().addWidget(grp)
|
||||||
|
block.layout().addStretch()
|
||||||
|
grp.setLayout(QGridLayout())
|
||||||
|
tbox.addItem(block, "geometry calibration")
|
||||||
|
#grp.layout().addWidget(QLabel("feature size (µM)"), 0, 0)
|
||||||
|
#self._ppm_feature_size_spinbox = QDoubleSpinBox()
|
||||||
|
#self._ppm_feature_size_spinbox.setRange(5, 10000)
|
||||||
|
#self._ppm_feature_size_spinbox.setValue(50)
|
||||||
|
#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("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("Optical center calibration")
|
||||||
|
but.setCheckable(True)
|
||||||
|
but.clicked.connect(self.cb_update_opt_ctr)
|
||||||
|
grp.layout().addWidget(but, 1, 0)
|
||||||
|
|
||||||
|
self._wd_calib_tree=tree=pg.DataTreeWidget(data=None)
|
||||||
|
grp.layout().addWidget(tree, 2, 0)
|
||||||
|
|
||||||
|
tbox.currentChanged.connect(self.cb_switch_task)
|
||||||
|
|
||||||
|
# final stretch
|
||||||
|
# setup_tab.layout().addStretch()
|
||||||
|
exp_tab.layout().addStretch()
|
||||||
|
|
||||||
|
# Jungfrau parameters
|
||||||
|
block=QWidget()
|
||||||
block.setAccessibleName(TASK_JUNGFRAU_SETTINGS)
|
block.setAccessibleName(TASK_JUNGFRAU_SETTINGS)
|
||||||
block.setContentsMargins(0, 0, 0, 0)
|
block.setContentsMargins(0, 0, 0, 0)
|
||||||
block.setLayout(QVBoxLayout())
|
block.setLayout(QVBoxLayout())
|
||||||
#self.jungfrau = jungfrau_widget.JungfrauWidget() #ZAC: orig. code
|
# self.jungfrau = jungfrau_widget.JungfrauWidget() #ZAC: orig. code
|
||||||
#block.layout().addWidget(self.jungfrau) #ZAC: orig. code
|
# block.layout().addWidget(self.jungfrau) #ZAC: orig. code
|
||||||
block.layout().addStretch()
|
block.layout().addStretch()
|
||||||
tbox.addItem(block, "Jungfrau Parameters")
|
tbox.addItem(block, "Jungfrau Parameters")
|
||||||
|
|
||||||
# # group beam box
|
# # -------- group beam box --------
|
||||||
# block = QWidget()
|
# block = QWidget()
|
||||||
# block.setAccessibleName(TASK_SETUP_BEAM_CENTER)
|
# block.setAccessibleName(TASK_SETUP_BEAM_CENTER)
|
||||||
# block.setContentsMargins(0, 0, 0, 0)
|
# block.setContentsMargins(0, 0, 0, 0)
|
||||||
@@ -1668,7 +1740,7 @@ Author Thierry Zamofing (thierry.zamofing@psi.ch)
|
|||||||
# """
|
# """
|
||||||
# )
|
# )
|
||||||
|
|
||||||
# # group regions
|
# # -------- group regions --------
|
||||||
# block = QWidget()
|
# block = QWidget()
|
||||||
# block.setAccessibleName(TASK_SETUP_ROI)
|
# block.setAccessibleName(TASK_SETUP_ROI)
|
||||||
# block.setContentsMargins(0, 0, 0, 0)
|
# block.setContentsMargins(0, 0, 0, 0)
|
||||||
@@ -1685,7 +1757,7 @@ Author Thierry Zamofing (thierry.zamofing@psi.ch)
|
|||||||
# but.clicked.connect(self.roi_add_line)
|
# but.clicked.connect(self.roi_add_line)
|
||||||
# grp.layout().addWidget(but, 0, 1)
|
# grp.layout().addWidget(but, 0, 1)
|
||||||
#
|
#
|
||||||
# # group camera settings
|
# # -------- group camera settings --------
|
||||||
# block = QWidget()
|
# block = QWidget()
|
||||||
# block.setAccessibleName(TASK_SETUP_CAMERA)
|
# block.setAccessibleName(TASK_SETUP_CAMERA)
|
||||||
# block.setContentsMargins(0, 0, 0, 0)
|
# block.setContentsMargins(0, 0, 0, 0)
|
||||||
@@ -1728,77 +1800,6 @@ Author Thierry Zamofing (thierry.zamofing@psi.ch)
|
|||||||
#
|
#
|
||||||
# grp.layout().addWidget(self._label_transforms, row, 0, 1, 2)
|
# grp.layout().addWidget(self._label_transforms, row, 0, 1, 2)
|
||||||
|
|
||||||
# group geometry calibration
|
|
||||||
block = QWidget()
|
|
||||||
block.setAccessibleName(TASK_SETUP_GEOMETRY_CALIB)
|
|
||||||
block.setContentsMargins(0, 0, 0, 0)
|
|
||||||
block.setLayout(QVBoxLayout())
|
|
||||||
grp = QWidget()
|
|
||||||
block.layout().addWidget(grp)
|
|
||||||
block.layout().addStretch()
|
|
||||||
grp.setLayout(QGridLayout())
|
|
||||||
tbox.addItem(block, "geometry calibration")
|
|
||||||
#grp.layout().addWidget(QLabel("feature size (µM)"), 0, 0)
|
|
||||||
#self._ppm_feature_size_spinbox = QDoubleSpinBox()
|
|
||||||
#self._ppm_feature_size_spinbox.setRange(5, 10000)
|
|
||||||
#self._ppm_feature_size_spinbox.setValue(50)
|
|
||||||
#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")
|
|
||||||
but.setCheckable(True)
|
|
||||||
but.clicked.connect(self.cb_update_pix2pos)
|
|
||||||
grp.layout().addWidget(but, 0, 0)
|
|
||||||
self._btn_opt_ctr = but = QPushButton("opt_ctr")
|
|
||||||
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
|
|
||||||
|
|
||||||
tbox.currentChanged.connect(self.cb_switch_task)
|
|
||||||
|
|
||||||
# final stretch
|
|
||||||
# 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()
|
|
||||||
|
|
||||||
def build_tab_module_fix_target(self):
|
def build_tab_module_fix_target(self):
|
||||||
#tab = self._tab_daq_method_prelocated
|
#tab = self._tab_daq_method_prelocated
|
||||||
try:
|
try:
|
||||||
@@ -1856,6 +1857,13 @@ Author Thierry Zamofing (thierry.zamofing@psi.ch)
|
|||||||
app=QApplication.instance()
|
app=QApplication.instance()
|
||||||
if calib:
|
if calib:
|
||||||
_log.info("received new pix2pos calibration")
|
_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()
|
app._raw_pix2pos=dict()
|
||||||
else:
|
else:
|
||||||
s=str(app._raw_pix2pos).replace('),','),\n ').replace('],','],\n')
|
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):
|
def cb_update_opt_ctr(self, calib):
|
||||||
app=QApplication.instance()
|
app=QApplication.instance()
|
||||||
if calib:
|
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()
|
app._raw_opt_ctr=dict()
|
||||||
else:
|
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=app._geometry
|
||||||
geo.update_optical_center(app._raw_opt_ctr)
|
ocOld=geo._opt_ctr
|
||||||
app._cfg.setValue(AppCfg.GEO_OPT_CTR, geo._opt_ctr)
|
try:
|
||||||
go=self._goOptCtr
|
geo.update_optical_center(app._raw_opt_ctr,True)
|
||||||
oc_sz=go.size()
|
except BaseException as e:
|
||||||
go.setPos(-geo._opt_ctr-oc_sz/2)
|
_log.warning(e)
|
||||||
|
QMessageBox.warning(self, "calibration", f"rejected\n{e}")
|
||||||
del app._raw_opt_ctr
|
del app._raw_opt_ctr
|
||||||
return
|
return
|
||||||
|
del app._raw_opt_ctr
|
||||||
|
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):
|
def module_fix_target_add_obj(self,*args,**kwargs):
|
||||||
mft=self._moduleFixTarget
|
mft=self._moduleFixTarget
|
||||||
|
|||||||
Reference in New Issue
Block a user