diff --git a/app_config.py b/app_config.py index b68e231..1cbca7a 100644 --- a/app_config.py +++ b/app_config.py @@ -63,68 +63,28 @@ class AppCfg(QSettings): self.setValue(AppCfg.GEO_BEAM_POS, [23.4, -54.2]) # beam position relativ to optical center in mm if AppCfg.GEO_PIX2POS not in keys: - _log.warning(f'{AppCfg.GEO_OPT_CTR} not defined. calc default') - import geometry - geo=geometry.geometry() - pix2pos_measure={ - 1:[(-3.0, -7.6, 116.99110193046, 632.5463827525), - (-2.0, -7.6, 934.07501517856, 600.7926167715), - (-2.0, -7.1, 916.54131238102, 191.0366615002), - (-3.0, -7.1, 103.74668003329, 226.2150231456)], - 200:[(-3.1, -7.3, 113.66321353086, 824.9041423107), - (-2.3, -7.3, 1065.97386092697, 792.2851118419), - (-2.3, -6.7, 1033.68452410347, 74.0336610693), - (-3.1, -6.7, 84.62681572700, 116.6832971512)], - 400:[(-3.4, -6.7, 155.00053674203, 601.3838942136), - (-3.0, -6.7, 957.95919656052, 573.0827012272), - (-3.2, -6.5, 541.08684037200, 187.9171307943), - (-3.2, -6.8, 564.32152887203, 789.1146957326)], - 600:[(-3.3, -6.8, 328.27244399903, 509.5061192017), - (-3.1, -6.8, 992.78996735279, 488.0323963092), - (-3.2, -6.9, 672.03111567934, 832.4122409755), - (-3.2, -6.7, 645.70960116180, 164.2534779331)], - 800:[(-3.2, -6.7, 639.52253576449, 53.4455632943), - (-3.2, -6.85, 671.47023245203, 882.6335091391), - (-3.3, -6.75, 105.12470026379, 361.3051859197), - (-3.1, -6.75, 1195.96864609255, 313.1068618673)], - 1000:[(-3.25, -6.75, 195.05641095116, 353.3492286375), - (-3.15, -6.75, 1117.27204644084, 314.9636405871), - (-3.2, -6.8, 675.10991143017, 790.3040145281), - (-3.2, -6.72, 638.98580653116, 59.3803912957)]} - geo.update_pix2pos(pix2pos_measure) - self.setValue(AppCfg.GEO_PIX2POS, geo._lut_pix2pos) + _log.warning(f'{AppCfg.GEO_OPT_CTR} not defined. use default') + import numpy as np + lut_pix2pos=(np.array([1., 200., 400., 600., 800., 1000.]), + np.array([[[ 2.42827273e-03, -9.22117396e-05], + [-1.10489804e-04, -2.42592492e-03]], + [[ 1.64346103e-03, -7.52341417e-05], + [-6.60711165e-05, -1.64190224e-03]], + [[ 9.91307639e-04, -4.02008751e-05], + [-4.23878232e-05, -9.91563507e-04]], + [[ 5.98443038e-04, -2.54046255e-05], + [-2.76831563e-05, -6.02738142e-04]], + [[ 3.64418977e-04, -1.41389267e-05], + [-1.55708176e-05, -3.66233567e-04]], + [[ 2.16526433e-04, -8.23070130e-06], + [-9.29894004e-06, -2.16842976e-04]]])) + self.setValue(AppCfg.GEO_PIX2POS, lut_pix2pos) if AppCfg.GEO_OPT_CTR not in keys: - _log.warning(f'{AppCfg.GEO_OPT_CTR} not defined. calc default') - import geometry - geo=geometry.geometry() - opt_ctr_meas={ # x,y = 0.02, -4.89 - 1000:[(1057.4251530483375, 116.10122290395591), - (117.84916300310408, 190.27827474963223), - (184.2181041281829, 963.2812360887852), - (1092.5616512910262, 899.514998537239)], - 800:[(888.2494207687248, 203.2917926172947), - (329.96950424600305, 248.83910515411347), - (372.9141132092893, 708.2162858826), - (906.4683457834523, 675.6824912134438)], - 600:[(781.5385742538922, 251.44180872764602), - (447.09116505496564, 264.4553265953085), - (471.81684900352445, 554.6567750441825), - (798.4561474818535, 535.1364982426887)], - 400:[(722.9777438494109, 286.5783069703348), - (525.1722722609408, 295.68776947769857), - (535.5830865550707, 462.26079818377866), - (729.4845027832422, 450.5486321028824)], - 200:[(689.1425973934884, 308.70128734536104), - (565.5141776506945, 307.39993555859473), - (574.6236401580583, 406.30267135282986), - (693.0466527537872, 399.79591241899857)], - 1:[(673.5263759522934, 307.39993555859473), - (591.5412133860195, 308.70128734536104), - (595.4452687463182, 376.3715802572061), - (672.2250241655271, 373.7688766836736)]} - geo.update_optical_center(opt_ctr_meas) - self.setValue(AppCfg.GEO_OPT_CTR, geo._opt_ctr) + _log.warning(f'{AppCfg.GEO_OPT_CTR} not defined. use default') + import numpy as np + opt_ctr=np.array([603.28688025, 520.01112846]) + self.setValue(AppCfg.GEO_OPT_CTR, opt_ctr) #if AppCfg.ACTIVATE_PULSE_PICKER not in keys: # self.setValue(AppCfg.ACTIVATE_PULSE_PICKER, False) diff --git a/geometry.py b/geometry.py index 295dd7f..498edb9 100755 --- a/geometry.py +++ b/geometry.py @@ -48,7 +48,7 @@ class geometry: ax.invert_yaxis() ax.grid() ax.axis('equal') - for k, v in opt_ctr_meas.items(): + for k, v in meas.items(): v=np.array(v) # ax.plot(v[:, 0], v[:, 1]) ax.fill(v[:, 0], v[:, 1], fill=False) @@ -318,6 +318,32 @@ if __name__=="__main__": (-3.15, -6.75, 1117.27204644084, 314.9636405871), (-3.2, -6.8, 675.10991143017, 790.3040145281), (-3.2, -6.72, 638.98580653116, 59.3803912957)]} + measure=\ +{1: [(6.4190000000000005, 6.907, 696.2976073449591, 227.76776138682274), + (5.719, 6.807, 410.67447894055806, 284.44919082240665), + (5.719, 5.207, 434.78681995014756, 938.5631353309454), + (6.619, 5.207, 808.7345059175318, 927.4590367789931)], + 200: [(6.619, 6.607, 940.264899030901, 187.39774454408854), + (5.519, 6.607, 272.1925062601967, 219.8977706369289), + (5.519, 5.407, 298.31361407848783, 941.97432810785), + (6.619, 5.407, 969.4645435773624, 920.3295993015843)], + 400: [(6.719, 6.707, 1099.5956451604673, 46.46696479882394), + (5.719, 6.707, 91.88845211350781, 99.00912182475837), + (5.719, 5.807, 122.49326406274122, 998.8073593766618), + (6.719, 5.807, 1137.5074440945523, 963.4302060882611)], + 600: [(6.619, 6.807, 1068.8592966662907, 106.9592377596037), + (6.019, 6.807, 75.47928488084321, 151.1144445833613), + (6.019, 6.307, 103.13064811335389, 977.5525209662414), + (6.619, 6.307, 1104.9406638931132, 939.9675773457886)], + 800: [(6.619, 6.307, 1160.5691045813528, 202.93697492698996), + (6.219, 6.307, 65.05964829488164, 253.28864950246646), + (6.219, 6.107, 88.00366601279788, 797.1538427010806), + (6.619, 6.107, 1180.6517090746024, 753.0303703110591)], + 1000: [(6.519, 6.267, 1087.8134573150567, 183.90222416155348), + (6.319, 6.267, 160.59872007696185, 229.55456266733404), + (6.319, 6.107, 190.50887289109403, 963.1404158981525), + (6.519, 6.107, 1116.3595117455784, 925.6445737503763)]} + obj.update_pix2pos(measure) obj.interp_zoom(1) @@ -353,6 +379,33 @@ if __name__=="__main__": (591.5412133860195, 308.70128734536104), (595.4452687463182, 376.3715802572061), (672.2250241655271, 373.7688766836736)]} + opt_ctr_meas=\ +{1000: [(943.5814614822486, 271.79551650350834), + (310.28543090843203, 317.87448013362246), + (357.2157641345181, 945.3504169712918), + (982.8856744171983, 907.5691713113356)], +# 800: [(804.3925790602868, 377.45059798190084), +# (428.94991325159833, 401.78484483987137), +# (456.760481089279, 776.3584304036324), +# (829.595906163185, 752.0241835456618)], +# 600: [(725.3062767718826, 435.6789743920446), +# (497.52754628726467, 448.43934430925407), +# (514.6798917766387, 674.3986678435945), +# (740.7483129345815, 659.5001702939031)], + 400: [(676.5616510826158, 467.6400729767663), + (539.6440684653923, 477.20915075936176), + (550.068542225442, 612.9457099265683), + (686.4200153677604, 603.8457508612842)], +# 200: [(647.9882475277134, 488.31261219978296), +# (564.236743827639, 494.4770028644908), +# (571.9870755133423, 577.6833939808159), +# (654.4623032630916, 571.5416217015793)], +# 1: [(633.8759316189822, 496.84436992197425), +# (578.3851177374523, 500.9472972316709), +# (582.6205681144841, 559.3272486023482), +# (638.3177769017573, 554.8006203263507)] + } + obj.update_optical_center(opt_ctr_meas, True) diff --git a/swissmx.py b/swissmx.py index b4944ef..f738d55 100755 --- a/swissmx.py +++ b/swissmx.py @@ -300,7 +300,7 @@ class Main(QMainWindow, Ui_MainWindow): self.create_helical_widgets() #ZAC: orig. code self.center_piece_update(0) # start camera updater - curzoom = app._zoom.get() + curzoom = app._zoom.get_sp() _log.debug(f"starting app with zoom at {curzoom}") self.zoom_changed_cb(curzoom) self._tabs_daq_methods.currentChanged.connect(self.switch_task) @@ -442,7 +442,7 @@ class Main(QMainWindow, Ui_MainWindow): QtCore.QTimer.singleShot(delay, self.new_frame_sim_cb) def new_frame_pv_cb(self, **kwargs): - _log.debug('new_frame_pv_cb count {}'.format(kwargs['count'])) + #_log.debug('new_frame_pv_cb count {}'.format(kwargs['count'])) app=QApplication.instance() sz=app._camera._sz if kwargs['count']==sz[0]*sz[1]: @@ -1022,7 +1022,9 @@ class Main(QMainWindow, Ui_MainWindow): print(s) res=QMessageBox.question(self, "calibration", f"use calibration\n{s} ? ") if res==QMessageBox.Yes: - app._geometry.update_pix2pos(app._raw_pix2pos) + geo=app._geometry + geo.update_pix2pos(app._raw_pix2pos) + app._cfg.setValue(AppCfg.GEO_PIX2POS, geo._lut_pix2pos) del app._raw_pix2pos def update_opt_ctr(self, calib): @@ -1035,7 +1037,12 @@ class Main(QMainWindow, Ui_MainWindow): print(s) res=QMessageBox.question(self, "calibration", f"use calibration\n{s} ? ") if res==QMessageBox.Yes: - app._geometry.update_optical_center(app._raw_opt_ctr) + 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) del app._raw_opt_ctr return @@ -1067,8 +1074,10 @@ class Main(QMainWindow, Ui_MainWindow): # state = (zoom, fx, fy) (created at first call of self.track_objects() ) app=QApplication.instance() geo=app._geometry - zoom = app._zoom.get() + zoom = app._zoom.get_sp() fast_x=self.tweakers["fast_x"];fast_y=self.tweakers["fast_y"] + # TODO: get_position() is delayed as it is the RBV. do same as for the zoom + # TODO: and return the last set_point fx=fast_x.get_position() fy=fast_y.get_position() try: @@ -1109,7 +1118,7 @@ class Main(QMainWindow, Ui_MainWindow): if fx_old!=fx or fy_old!=fy: p1=geo.pos2pix((fx_old,fy_old)) p2=geo.pos2pix((fx,fy)) - d=p2-p1 + d=p1-p2 for o in tracked['objLst']: pos=o.pos() @@ -1167,7 +1176,7 @@ class Main(QMainWindow, Ui_MainWindow): self._mouse_pos = pos task = self.active_task() xy = self._goImg.mapFromScene(pos) - z = app._zoom.get() + z = app._zoom.get_sp() #_log.debug('mouse_pos:{} scene_pos:{} zoom:{}'.format(pos,xy,z)) #TODO: implement mouse handling # if self._ppm_toolbox._force_ppm > 0: @@ -1277,8 +1286,8 @@ class Main(QMainWindow, Ui_MainWindow): #dy=-(y-by)/ppm #fx+=dx #fy+=dy - fx_motor.move_relative(mm[0]) - fy_motor.move_relative(mm[1]) + fx_motor.move_relative(-mm[0]) + fy_motor.move_relative(-mm[1]) #self.fast_dx_position.emit(dx) #self.fast_dy_position.emit(dy) pass @@ -3436,9 +3445,9 @@ def main(): hostname=socket.gethostname() if hostname=='ganymede': #use EPICS locally - os.environ['EPICS_CA_ADDR_LIST']='localhost' + #os.environ['EPICS_CA_ADDR_LIST']='localhost' #use EPICS if connected to ESC network - # os.environ['EPICS_CA_ADDR_LIST'] ='129.129.244.255 sf-saresc-cagw.psi.ch:5062 sf-saresc-cagw.psi.ch:5066' + os.environ['EPICS_CA_ADDR_LIST'] ='129.129.244.255 sf-saresc-cagw.psi.ch:5062 sf-saresc-cagw.psi.ch:5066' diff --git a/zoom.py b/zoom.py index c853f3e..b7d5d87 100755 --- a/zoom.py +++ b/zoom.py @@ -68,7 +68,9 @@ class Zoom(QGroupBox, Ui_Zoom): # pv.callbacks ... = self.zoom_update_cb # check also: pv.clear_auto_monitor() # disconnect PV monitor callback -> program exit faster. buttons=((1, "1"), (200, "200"), (400, "400"), (600, "600"), (800, "800"), (1000, "1000"),) - current_zoom_value = self.get_zoom() + + zoom=QApplication.instance()._zoom + current_zoom_value = zoom.get_rb() # zoom widgets layout = QVBoxLayout() @@ -269,11 +271,11 @@ class Zoom(QGroupBox, Ui_Zoom): self._zoom_spinner.blockSignals(False) self.zoomChanged.emit(float(value)) - def get_zoom(self) -> int: - zoom=QApplication.instance()._zoom - pos = zoom.get() - _log.debug("get_zoom(epics) => {}".format(pos)) - return pos +# def get_zoom(self) -> int: +# zoom=QApplication.instance()._zoom +# pos = zoom.get() +# _log.debug("get_zoom(epics) => {}".format(pos)) +# return pos # def zoom_update_cb(self, pvname, value, char_value, **kwargs): # self._zoom_spinner.blockSignals(True) @@ -304,24 +306,33 @@ class QopticZoom(object): self._pv[name]=pv return pv - def get(self) -> int: + def get_rb(self) -> int: + # get_rb somtimes lags. therefore get_sp will get the last set_point without usage of pvs try: - pv = self.getPv('POS_RB') + pv = self.getPv('POS_RB') #default do not get the RBV, because this might be delayed except AttributeError: val=self._val; _log.debug('simulated mode:{}'.format(val)) return val else: - pv=self.getPv('POS_RB') - return pv.get() + return pv.get() + + def get_sp(self) -> int: + try: + val=self._val + except AttributeError: + pv=self.getPv('POS_RB') # default do not get the RBV, because this might be delayed + self._val=val=pv.get() + return val + def set(self, val: int): try: pv=self.getPv('POS_SP') except AttributeError: _log.debug('simulated mode:{}'.format(val)) - self._val=val #simulated mode else: pv.put(val) + self._val=val if __name__ == "__main__":