diff --git a/Readme.md b/Readme.md
index 2558926..60f4f3c 100644
--- a/Readme.md
+++ b/Readme.md
@@ -83,10 +83,10 @@ DST=/sf/cristallina/applications/mx/zamofing_t/
# /sf/cristallina/applications/mx
ssh saresc-cons-02 mkdir /tmp/zamofing_t/
-rsync -vai ~/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/epics_ioc_modules/ESB_MX 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.8/latest/bin/pip install qtawesome --user
diff --git a/app_config.py b/app_config.py
index a205358..6b843b0 100644
--- a/app_config.py
+++ b/app_config.py
@@ -187,11 +187,11 @@ class AppCfg(QSettings):
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}
elif key==AppCfg.GBL_MISC:
- val={'img_trace':4}
+ val={'img_trace_len':4}
else:
val={}
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):
val=np.array(tuple(map(float, val)))
return val
@@ -227,7 +227,7 @@ class WndParameter(QMainWindow):
#GEO_CAM_PARAM
gbl_misc = cfg.value(AppCfg.GBL_MISC)
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_col = cfg.value(AppCfg.DFT_POS_COL)
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':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':AppCfg.GEO_CAM_TRF, 'value':cfg.value(AppCfg.GEO_CAM_TRF), 'type':'str'},
@@ -394,7 +394,10 @@ verbose bits:
except AttributeError as e:
_log.warning('can not set beam size to application window')
else:
+ v=v/1000 # convert from um to mm
+ bm.blockSignals(True) # avoid to call cb_marker_moved
bm.setSize(v)
+ bm.blockSignals(False)
elif par_nm==AppCfg.GEO_CAM_PARAM:
d=dict(map(lambda x:(x.name(),x.value()), parent.children()))
try:
@@ -441,6 +444,18 @@ verbose bits:
elif par_nm in (AppCfg.GBL_MISC,AppCfg.DT_MISC):
d=dict(map(lambda x:(x.name(),x.value()), parent.children()))
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:
_log.warning(f'can\'t save parameter:{childName} change:{change} data:{str(data)}')
raise
diff --git a/epics_widgets/SmaractMotorTweak.py b/epics_widgets/SmaractMotorTweak.py
index 7dd25bf..ede574a 100644
--- a/epics_widgets/SmaractMotorTweak.py
+++ b/epics_widgets/SmaractMotorTweak.py
@@ -130,6 +130,14 @@ class SmaractMotorTweak(QWidget, Ui_MotorTweak):
def get_rbv(self):
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):
pend_event()
return 1 == self._pv_is_homed.get(use_monitor=False)
diff --git a/swissmx.py b/swissmx.py
index c3bd302..c79bb28 100755
--- a/swissmx.py
+++ b/swissmx.py
@@ -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(
- # """
- # Updating Beam Mark
- #
- # - clear beam markers
- # - for each zoom level, CTRL-Click (left mouse button) the center of the beam
- #
- #
- # """
- # )
-
- # # 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(
- """
- Pixel to position calibration
-
- - press: pix2pos
- - for each zoom level:
-
- choose a good fiducial mark
-
- move the stage x/y at min. 3 different locations
-
- Click (left mouse button) on the fiducial mark
-
- un-click: pix2pos
-
- optical center calibration
-
- - press: opt_ctr
- - choose at least 3 fiducial mark visible at various zoom levels
-
- for at least two zoom level:
-
- Click (left mouse button) on the fiducial marks
-
- un-click: opt_ctr
-
-
- """
- )
-
- # 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(
+ # """
+ # Updating Beam Mark
+ #
+ # - clear beam markers
+ # - for each zoom level, CTRL-Click (left mouse button) the center of the beam
+ #
+ #
+ # """
+ # )
+
+ # # -------- 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